diff --git a/CMakeLists.txt b/CMakeLists.txt index 539f457..a92f788 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ add_executable(cutefish-filemanager desktop/desktop.cpp desktop/desktopview.cpp desktop/desktopsettings.cpp + desktop/dockdbusinterface.cpp helper/datehelper.cpp helper/pathhistory.cpp diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index 073dc22..403d00b 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -26,31 +26,7 @@ Desktop::Desktop(QObject *parent) : QObject(parent) - , m_dockInterface("com.cutefish.Dock", - "/Dock", - "com.cutefish.Dock", QDBusConnection::sessionBus()) - , m_leftMargin(0) - , m_rightMargin(0) - , m_bottomMargin(0) { - if (m_dockInterface.isValid()) { - updateMargins(); - connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins())); - connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins())); - connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins())); - } else { - QDBusServiceWatcher *watcher = new QDBusServiceWatcher("com.cutefish.Dock", - QDBusConnection::sessionBus(), - QDBusServiceWatcher::WatchForUnregistration, - this); - connect(watcher, &QDBusServiceWatcher::serviceUnregistered, this, [=] { - updateMargins(); - connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins())); - connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins())); - connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins())); - }); - } - for (QScreen *screen : QGuiApplication::screens()) { screenAdded(screen); } @@ -59,26 +35,10 @@ Desktop::Desktop(QObject *parent) connect(qApp, &QGuiApplication::screenRemoved, this, &Desktop::screenRemoved); } -int Desktop::leftMargin() const -{ - return m_leftMargin; -} - -int Desktop::rightMargin() const -{ - return m_rightMargin; -} - -int Desktop::bottomMargin() const -{ - return m_bottomMargin; -} - void Desktop::screenAdded(QScreen *screen) { if (!m_list.contains(screen)) { DesktopView *view = new DesktopView(screen); - view->engine()->rootContext()->setContextProperty("Desktop", this); view->show(); m_list.insert(screen, view); } @@ -93,30 +53,3 @@ void Desktop::screenRemoved(QScreen *screen) m_list.remove(screen); } } - -void Desktop::updateMargins() -{ - QRect dockGeometry = m_dockInterface.property("primaryGeometry").toRect(); - int dockDirection = m_dockInterface.property("direction").toInt(); - int visibility = m_dockInterface.property("visibility").toInt(); - - m_leftMargin = 0; - m_rightMargin = 0; - m_bottomMargin = 0; - - // AlwaysHide - if (visibility == 1) { - emit marginsChanged(); - return; - } - - if (dockDirection == 0) { - m_leftMargin = dockGeometry.width(); - } else if (dockDirection == 1) { - m_bottomMargin = dockGeometry.height(); - } else if (dockDirection == 2) { - m_rightMargin = dockGeometry.width(); - } - - emit marginsChanged(); -} diff --git a/desktop/desktop.h b/desktop/desktop.h index 996fdcf..87e4f19 100644 --- a/desktop/desktop.h +++ b/desktop/desktop.h @@ -29,32 +29,16 @@ class Desktop : public QObject { Q_OBJECT - Q_PROPERTY(int leftMargin READ leftMargin NOTIFY marginsChanged) - Q_PROPERTY(int rightMargin READ rightMargin NOTIFY marginsChanged) - Q_PROPERTY(int bottomMargin READ bottomMargin NOTIFY marginsChanged) public: explicit Desktop(QObject *parent = nullptr); - int leftMargin() const; - int rightMargin() const; - int bottomMargin() const; - -signals: - void marginsChanged(); - private slots: void screenAdded(QScreen *qscreen); void screenRemoved(QScreen *qscreen); - void updateMargins(); private: QMap m_list; - QDBusInterface m_dockInterface; - - int m_leftMargin; - int m_rightMargin; - int m_bottomMargin; }; #endif // DESKTOP_H diff --git a/desktop/desktopview.cpp b/desktop/desktopview.cpp index 67b3bd9..8150549 100644 --- a/desktop/desktopview.cpp +++ b/desktop/desktopview.cpp @@ -18,6 +18,7 @@ */ #include "desktopview.h" +#include "dockdbusinterface.h" #include "thumbnailer/thumbnailprovider.h" #include @@ -39,6 +40,7 @@ DesktopView::DesktopView(QScreen *screen, QQuickView *parent) KWindowSystem::setState(winId(), NET::KeepBelow); engine()->rootContext()->setContextProperty("desktopView", this); + engine()->rootContext()->setContextProperty("Dock", DockDBusInterface::self()); engine()->addImageProvider("thumbnailer", new ThumbnailProvider()); setTitle(tr("Desktop")); diff --git a/desktop/dockdbusinterface.cpp b/desktop/dockdbusinterface.cpp new file mode 100644 index 0000000..10a0a13 --- /dev/null +++ b/desktop/dockdbusinterface.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2021 CutefishOS Team. + * + * Author: Reion Wong + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "dockdbusinterface.h" +#include +#include + +static DockDBusInterface *DOCKDBUS_SELF = nullptr; + +DockDBusInterface *DockDBusInterface::self() +{ + if (!DOCKDBUS_SELF) + DOCKDBUS_SELF = new DockDBusInterface; + + return DOCKDBUS_SELF; +} + +DockDBusInterface::DockDBusInterface(QObject *parent) + : QObject(parent) + , m_dockInterface("com.cutefish.Dock", + "/Dock", + "com.cutefish.Dock", QDBusConnection::sessionBus()) + , m_leftMargin(0) + , m_rightMargin(0) + , m_bottomMargin(0) +{ + if (m_dockInterface.isValid()) { + updateMargins(); + connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins())); + connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins())); + connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins())); + } else { + QDBusServiceWatcher *watcher = new QDBusServiceWatcher("com.cutefish.Dock", + QDBusConnection::sessionBus(), + QDBusServiceWatcher::WatchForUnregistration, + this); + connect(watcher, &QDBusServiceWatcher::serviceUnregistered, this, [=] { + updateMargins(); + connect(&m_dockInterface, SIGNAL(primaryGeometryChanged()), this, SLOT(updateMargins())); + connect(&m_dockInterface, SIGNAL(directionChanged()), this, SLOT(updateMargins())); + connect(&m_dockInterface, SIGNAL(visibilityChanged()), this, SLOT(updateMargins())); + }); + } +} + +int DockDBusInterface::leftMargin() const +{ + return m_leftMargin; +} + +int DockDBusInterface::rightMargin() const +{ + return m_rightMargin; +} + +int DockDBusInterface::bottomMargin() const +{ + return m_bottomMargin; +} + +void DockDBusInterface::updateMargins() +{ + QRect dockGeometry = m_dockInterface.property("primaryGeometry").toRect(); + int dockDirection = m_dockInterface.property("direction").toInt(); + int visibility = m_dockInterface.property("visibility").toInt(); + + m_leftMargin = 0; + m_rightMargin = 0; + m_bottomMargin = 0; + + // AlwaysHide + if (visibility == 1) { + emit marginsChanged(); + return; + } + + if (dockDirection == 0) { + m_leftMargin = dockGeometry.width(); + } else if (dockDirection == 1) { + m_bottomMargin = dockGeometry.height(); + } else if (dockDirection == 2) { + m_rightMargin = dockGeometry.width(); + } + + emit marginsChanged(); +} diff --git a/desktop/dockdbusinterface.h b/desktop/dockdbusinterface.h new file mode 100644 index 0000000..515998c --- /dev/null +++ b/desktop/dockdbusinterface.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 CutefishOS Team. + * + * Author: Reion Wong + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DOCKDBUSINTERFACE_H +#define DOCKDBUSINTERFACE_H + +#include +#include + +class DockDBusInterface : public QObject +{ + Q_OBJECT + Q_PROPERTY(int leftMargin READ leftMargin NOTIFY marginsChanged) + Q_PROPERTY(int rightMargin READ rightMargin NOTIFY marginsChanged) + Q_PROPERTY(int bottomMargin READ bottomMargin NOTIFY marginsChanged) + +public: + static DockDBusInterface *self(); + explicit DockDBusInterface(QObject *parent = nullptr); + + int leftMargin() const; + int rightMargin() const; + int bottomMargin() const; + +signals: + void marginsChanged(); + +private slots: + void updateMargins(); + +private: + QDBusInterface m_dockInterface; + + int m_leftMargin; + int m_rightMargin; + int m_bottomMargin; +}; + +#endif // DOCKDBUSINTERFACE_H diff --git a/model/foldermodel.cpp b/model/foldermodel.cpp index 718d2b8..77a35e2 100644 --- a/model/foldermodel.cpp +++ b/model/foldermodel.cpp @@ -293,16 +293,17 @@ void FolderModel::setUrl(const QString &url) if (url.isEmpty()) return; + bool isTrash = url.startsWith("trash:/"); QUrl resolvedNewUrl = resolve(url); QFileInfo info(resolvedNewUrl.toLocalFile()); - if (!QFile::exists(resolvedNewUrl.toLocalFile()) && !url.startsWith("trash:/")) { + if (!QFile::exists(resolvedNewUrl.toLocalFile()) && !isTrash) { emit notification(tr("The file or folder %1 does not exist.").arg(url)); return; } // TODO: selected ? - if (info.isFile() && !url.startsWith("trash:///")) { + if (info.isFile() && !isTrash) { resolvedNewUrl = QUrl::fromLocalFile(info.dir().path()); } diff --git a/qml/Desktop/Main.qml b/qml/Desktop/Main.qml index 25b4b95..50b894d 100644 --- a/qml/Desktop/Main.qml +++ b/qml/Desktop/Main.qml @@ -79,9 +79,9 @@ Item { topMargin: 28 // From dock - leftMargin: Desktop.leftMargin - rightMargin: Desktop.rightMargin - bottomMargin: Desktop.bottomMargin + leftMargin: Dock.leftMargin + rightMargin: Dock.rightMargin + bottomMargin: Dock.bottomMargin flow: GridView.FlowTopToBottom