Refactor tray window opening code for clarity and efficiency
authorClaudio Cambra <claudio.cambra@gmail.com>
Thu, 30 Jun 2022 15:42:39 +0000 (17:42 +0200)
committerClaudio Cambra <claudio.cambra@gmail.com>
Tue, 12 Jul 2022 20:54:00 +0000 (22:54 +0200)
Signed-off-by: Claudio Cambra <claudio.cambra@gmail.com>
src/gui/owncloudgui.cpp
src/gui/systray.cpp
src/gui/systray.h
src/gui/tray/Window.qml

index aa5066d608e76e9ae5b7489f064748e55caff857..97a26afa4892ec14b043af4dc1f66bacaafceae7 100644 (file)
@@ -82,9 +82,6 @@ ownCloudGui::ownCloudGui(Application *parent)
     connect(_tray.data(), &Systray::openAccountWizard,
         this, &ownCloudGui::slotNewAccountWizard);
 
-    connect(_tray.data(), &Systray::openMainDialog,
-        this, &ownCloudGui::slotOpenMainDialog);
-
     connect(_tray.data(), &Systray::openSettings,
         this, &ownCloudGui::slotShowSettings);
 
@@ -157,9 +154,7 @@ void ownCloudGui::slotOpenSettingsDialog()
 
 void ownCloudGui::slotOpenMainDialog()
 {
-    if (!_tray->isOpen()) {
-        _tray->showWindow();
-    }
+    _tray->showWindow();
 }
 
 void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
index 9db7ef835c58876066a8eba1d45eaa561a9dd223..8ec5f3374cfb8ca159df4a4b5aee8e78851ffb0d 100644 (file)
@@ -120,7 +120,7 @@ Systray::Systray()
 
 #if defined(Q_OS_MACOS) || defined(Q_OS_WIN)
     connect(AccountManager::instance(), &AccountManager::accountAdded,
-        this, [this]{ emit showWindow(); });
+        this, [this]{ showWindow(); });
 #else
     // Since the positioning of the QSystemTrayIcon is borked on non-Windows and non-macOS desktop environments,
     // we hardcode the position of the tray to be in the center when we add a new account from somewhere like
@@ -128,7 +128,7 @@ Systray::Systray()
     // is placed
 
     connect(AccountManager::instance(), &AccountManager::accountAdded,
-        this, [this]{ emit showWindow(WindowPosition::Center); });
+        this, [this]{ showWindow(WindowPosition::Center); });
 #endif
 }
 
@@ -138,7 +138,9 @@ void Systray::create()
         if (!AccountManager::instance()->accounts().isEmpty()) {
             _trayEngine->rootContext()->setContextProperty("activityModel", UserModel::instance()->currentActivityModel());
         }
-        _trayEngine->load(QStringLiteral("qrc:/qml/src/gui/tray/Window.qml"));
+
+        QQmlComponent trayWindowComponent(_trayEngine, QStringLiteral("qrc:/qml/src/gui/tray/Window.qml"));
+        _trayWindow.reset(qobject_cast<QQuickWindow*>(trayWindowComponent.create()));
     }
     hideWindow();
     emit activated(QSystemTrayIcon::ActivationReason::Unknown);
@@ -152,6 +154,36 @@ void Systray::create()
     }
 }
 
+void Systray::showWindow(WindowPosition position)
+{
+    if(isOpen() || !_trayWindow) {
+        return;
+    }
+
+    if(position == WindowPosition::Center) {
+        positionWindowAtScreenCenter(_trayWindow.data());
+    } else {
+        positionWindowAtTray(_trayWindow.data());
+    }
+    _trayWindow->show();
+    _trayWindow->raise();
+    _trayWindow->requestActivate();
+
+    setIsOpen(true);
+
+    UserModel::instance()->fetchCurrentActivityModel();
+}
+
+void Systray::hideWindow()
+{
+    if(!isOpen() || !_trayWindow) {
+        return;
+    }
+
+    _trayWindow->hide();
+    setIsOpen(false);
+}
+
 void Systray::setupContextMenu()
 {
     const auto oldContextMenu = _contextMenu.data();
@@ -169,7 +201,7 @@ void Systray::setupContextMenu()
     if (AccountManager::instance()->accounts().isEmpty()) {
         _contextMenu->addAction(tr("Add account"), this, &Systray::openAccountWizard);
     } else {
-        _contextMenu->addAction(tr("Open main dialog"), this, &Systray::openMainDialog);
+        _contextMenu->addAction(tr("Open main dialog"), this, [this]{ showWindow(); });
     }
 
     auto pauseAction = _contextMenu->addAction(tr("Pause sync"), this, &Systray::slotPauseAllFolders);
index 716f13e438653a79e10c1db24fc692b8af362778..55bce5792988daba5884bb744e34e7d4cfeb7512 100644 (file)
@@ -75,7 +75,7 @@ public:
 
     enum class TaskBarPosition { Bottom, Left, Top, Right };
     Q_ENUM(TaskBarPosition);
-    
+
     enum class NotificationPosition { Default, TopLeft, TopRight, BottomLeft, BottomRight };
     Q_ENUM(NotificationPosition);
 
@@ -98,15 +98,10 @@ public:
 signals:
     void currentUserChanged();
     void openAccountWizard();
-    void openMainDialog();
     void openSettings();
     void openHelp();
     void shutdown();
 
-    // These window signals are listened to in Window.qml
-    void hideWindow();
-    void showWindow(WindowPosition position = WindowPosition::Default);
-
     void openShareDialog(const QString &sharePath, const QString &localPath);
     void showFileActivityDialog(const QString &objectName, const int objectId);
     void sendChatMessage(const QString &token, const QString &message, const QString &replyTo);
@@ -117,15 +112,18 @@ signals:
 
 public slots:
     void slotNewUserSelected();
+
+    void forceWindowInit(QQuickWindow *window) const;
     void positionWindowAtTray(QQuickWindow *window) const;
     void positionWindowAtScreenCenter(QQuickWindow *window) const;
+    void positionNotificationWindow(QQuickWindow *window) const;
+
+    void showWindow(WindowPosition position = WindowPosition::Default);
+    void hideWindow();
 
     void setSyncIsPaused(const bool syncIsPaused);
     void setIsOpen(const bool isOpen);
 
-    void forceWindowInit(QQuickWindow *window) const;
-    void positionNotificationWindow(QQuickWindow *window) const;
-
 private slots:
     void slotUnpauseAllFolders();
     void slotPauseAllFolders();
@@ -153,6 +151,7 @@ private:
     bool _syncIsPaused = true;
     QPointer<QQmlApplicationEngine> _trayEngine;
     QPointer<QMenu> _contextMenu;
+    QSharedPointer<QQuickWindow> _trayWindow;
 
     AccessManagerFactory _accessManagerFactory;
 
index 6419e651ed9c19ab930d92082b230a0bf47151ab..1e84e1847c68691a223f3e30e4b39684cab95e93 100644 (file)
@@ -77,31 +77,11 @@ Window {
     Connections {\r
         target: Systray\r
 \r
-        function onShowWindow(position) {\r
-            if(trayWindow.visible) {\r
-                return;\r
+        function onIsOpenChanged() {\r
+            if(Systray.isOpen) {\r
+                accountMenu.close();\r
+                appsMenu.close();\r
             }\r
-\r
-            accountMenu.close();\r
-            appsMenu.close();\r
-\r
-            if(position === Systray.WindowPosition.Center) {\r
-                Systray.positionWindowAtScreenCenter(trayWindow);\r
-            } else {\r
-                Systray.positionWindowAtTray(trayWindow);\r
-            }\r
-\r
-            trayWindow.show();\r
-            trayWindow.raise();\r
-            trayWindow.requestActivate();\r
-\r
-            Systray.isOpen = true;\r
-            UserModel.fetchCurrentActivityModel();\r
-        }\r
-\r
-        function onHideWindow() {\r
-            trayWindow.hide();\r
-            Systray.isOpen = false;\r
         }\r
 \r
         function onShowFileActivityDialog(objectName, objectId) {\r