Add 'pause all' tray menu entry #3829
authorChristian Kamm <mail@ckamm.de>
Tue, 1 Mar 2016 15:07:11 +0000 (16:07 +0100)
committerChristian Kamm <mail@ckamm.de>
Tue, 1 Mar 2016 15:07:11 +0000 (16:07 +0100)
src/gui/accountstate.cpp
src/gui/accountstate.h
src/gui/folder.cpp
src/gui/folder.h
src/gui/folderman.cpp
src/gui/folderstatusmodel.cpp
src/gui/owncloudgui.cpp
src/gui/owncloudgui.h

index 7a14b2d5d09f05a03d98a92cf46cddc012d018de..0d562db4c4939c87756146ca4028eab90eff9b25 100644 (file)
@@ -139,6 +139,11 @@ bool AccountState::isConnectedOrTemporarilyUnavailable() const
     return isConnected() || _state == ServiceUnavailable;
 }
 
+bool AccountState::canSync() const
+{
+    return isConnected();
+}
+
 void AccountState::tagLastSuccessfullETagRequest()
 {
     _timeSinceLastETagCheck.restart();
index 936a6e01be97e19372a79aeb94b4db75df7deb6e..61a8dc1fb1aa3906983f2cdb644687f0bbab2dba 100644 (file)
@@ -88,6 +88,9 @@ public:
     bool isConnected() const;
     bool isConnectedOrTemporarilyUnavailable() const;
 
+    /// Returns whether sync actions are allowed to run.
+    bool canSync() const;
+
     /// Triggers a ping to the server to update state and
     /// connection status and errors.
     void checkConnectivity();
index 0110394313ee003ad430287959f138ef7fe6413f..ce9ab60d608fe959757c9830e9d032ba8e3706a1 100644 (file)
@@ -260,7 +260,7 @@ bool Folder::syncPaused() const
 
 bool Folder::canSync() const
 {
-    return !syncPaused() && accountState()->isConnected();
+    return !syncPaused() && accountState()->canSync();
 }
 
 void Folder::setSyncPaused( bool paused )
@@ -272,12 +272,14 @@ void Folder::setSyncPaused( bool paused )
 
     if( !paused ) {
         // qDebug() << "Syncing enabled on folder " << name();
+        setSyncState(SyncResult::NotYetStarted);
     } else {
         // do not stop or start the watcher here, that is done internally by
         // folder class. Even if the watcher fires, the folder does not
         // schedule itself because it checks the var. _enabled before.
         setSyncState(SyncResult::Paused);
     }
+    emit syncStateChange();
 }
 
 void Folder::setSyncState(SyncResult::Status state)
@@ -312,7 +314,7 @@ void Folder::slotRunEtagJob()
         return;
     }
 
-    if (_definition.paused || !_accountState->isConnected()) {
+    if (!canSync()) {
         qDebug() << "Not syncing.  :"  << remoteUrl().toString() << _definition.paused << AccountState::stateString(_accountState->state());
         return;
     }
index b450e899402071e4da75c87a5cabaab0dfadf400..510fd0f2095c3eb9ce6b20c7e3aa23e3bcf9b2f5 100644 (file)
@@ -143,7 +143,7 @@ public:
     /**
      * Returns true when the folder may sync.
      *
-     * !syncPaused() && accountState->isConnected().
+     * !syncPaused() && accountState->canSync().
      */
     bool canSync() const;
 
index 8f812f20b7554a293a6b4c74a890e24e31289f1f..37e0b1be22817276c723d4030556349872eedbb0 100644 (file)
@@ -554,7 +554,7 @@ void FolderMan::slotAccountStateChanged()
     }
     QString accountName = accountState->account()->displayName();
 
-    if (accountState->isConnected()) {
+    if (accountState->canSync()) {
         qDebug() << "Account" << accountName << "connected, scheduling its folders";
 
         foreach (Folder *f, _folderMap.values()) {
index d7185c354480d8b536eaf548afbf10a54cb8d0d9..f36a701c03635059559880a6624f166c7f8770a7 100644 (file)
@@ -995,9 +995,7 @@ void FolderStatusModel::slotFolderSyncStateChange(Folder *f)
 void FolderStatusModel::slotFolderScheduleQueueChanged()
 {
     // Update messages on waiting folders.
-    // It's ok to only update folders currently in the queue, because folders
-    // are only removed from the queue if they are deleted.
-    foreach (Folder* f, FolderMan::instance()->scheduleQueue()) {
+    foreach (Folder* f, FolderMan::instance()->map()) {
         slotFolderSyncStateChange(f);
     }
 }
index b97a637f70b405fc8243ec886e38e6d1a514bc27..ed41fb57f951e7e18ff4243ea26a66e9d3c48662 100644 (file)
@@ -192,6 +192,7 @@ void ownCloudGui::slotTrayClicked( QSystemTrayIcon::ActivationReason reason )
 void ownCloudGui::slotSyncStateChange( Folder* folder )
 {
     slotComputeOverallSyncStatus();
+    setupContextMenu();
 
     if( !folder ) {
         return; // Valid, just a general GUI redraw was needed.
@@ -230,6 +231,7 @@ void ownCloudGui::slotAccountStateChanged()
 void ownCloudGui::slotComputeOverallSyncStatus()
 {
     bool allSignedOut = true;
+    bool allPaused = true;
     QVector<AccountStatePtr> problemAccounts;
     foreach (auto a, AccountManager::instance()->accounts()) {
         if (!a->isSignedOut()) {
@@ -239,6 +241,11 @@ void ownCloudGui::slotComputeOverallSyncStatus()
             problemAccounts.append(a);
         }
     }
+    foreach (Folder* f, FolderMan::instance()->map()) {
+        if (!f->syncPaused()) {
+            allPaused = false;
+        }
+    }
 
     if (!problemAccounts.empty()) {
         _tray->setIcon(Theme::instance()->folderOfflineIcon(true));
@@ -271,6 +278,10 @@ void ownCloudGui::slotComputeOverallSyncStatus()
         _tray->setIcon(Theme::instance()->folderOfflineIcon(true));
         _tray->setToolTip(tr("Please sign in"));
         return;
+    } else if (allPaused) {
+        _tray->setIcon(Theme::instance()->syncStateIcon(SyncResult::Paused, true));
+        _tray->setToolTip(tr("Account synchronization is disabled"));
+        return;
     }
 
     // display the info of the least successful sync (eg. do not just display the result of the latest sync)
@@ -324,11 +335,19 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
     FolderMan *folderMan = FolderMan::instance();
     bool firstFolder = true;
     bool singleSyncFolder = folderMan->map().size() == 1 && Theme::instance()->singleSyncFolder();
+    bool onePaused = false;
+    bool allPaused = true;
     foreach (Folder* folder, folderMan->map()) {
         if (folder->accountState() != accountState) {
             continue;
         }
 
+        if (folder->syncPaused()) {
+            onePaused = true;
+        } else {
+            allPaused = false;
+        }
+
         if (firstFolder && !singleSyncFolder) {
             firstFolder = false;
             menu->addSeparator();
@@ -343,6 +362,17 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
 
      menu->addSeparator();
      if (separateMenu) {
+         if (onePaused) {
+             QAction* enable = menu->addAction(tr("Unpause all folders"));
+             enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
+             connect(enable, SIGNAL(triggered(bool)), SLOT(slotUnpauseAllFolders()));
+         }
+         if (!allPaused) {
+             QAction* enable = menu->addAction(tr("Pause all folders"));
+             enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
+             connect(enable, SIGNAL(triggered(bool)), SLOT(slotPauseAllFolders()));
+         }
+
          if (accountState->isSignedOut()) {
              QAction* signin = menu->addAction(tr("Log in..."));
              signin->setProperty(propertyAccountC, QVariant::fromValue(accountState));
@@ -364,16 +394,25 @@ void ownCloudGui::setupContextMenu()
     bool atLeastOneConnected = false;
     bool atLeastOneSignedOut = false;
     bool atLeastOneSignedIn = false;
+    bool atLeastOnePaused = false;
+    bool atLeastOneNotPaused = false;
     foreach (auto a, accountList) {
         if (a->isConnected()) {
             atLeastOneConnected = true;
         }
-        if (a->isSignedOut()){
+        if (a->isSignedOut()) {
             atLeastOneSignedOut = true;
         } else {
             atLeastOneSignedIn = true;
         }
     }
+    foreach (auto f, FolderMan::instance()->map()) {
+        if (f->syncPaused()) {
+            atLeastOnePaused = true;
+        } else {
+            atLeastOneNotPaused = true;
+        }
+    }
 
     if ( _contextMenu ) {
         if (_qdbusmenuWorkaround) {
@@ -439,6 +478,26 @@ void ownCloudGui::setupContextMenu()
     }
 
     _contextMenu->addSeparator();
+    if (atLeastOnePaused) {
+        QString text;
+        if (accountList.count() > 1) {
+            text = tr("Unpause all synchronization");
+        } else {
+            text = tr("Unpause synchronization");
+        }
+        QAction* action = _contextMenu->addAction(text);
+        connect(action, SIGNAL(triggered(bool)), SLOT(slotUnpauseAllFolders()));
+    }
+    if (atLeastOneNotPaused) {
+        QString text;
+        if (accountList.count() > 1) {
+            text = tr("Pause all synchronization");
+        } else {
+            text = tr("Pause synchronization");
+        }
+        QAction* action = _contextMenu->addAction(text);
+        connect(action, SIGNAL(triggered(bool)), SLOT(slotPauseAllFolders()));
+    }
     if (atLeastOneSignedIn) {
         if (accountList.count() > 1) {
             _actionLogout->setText(tr("Log out of all accounts"));
@@ -627,10 +686,10 @@ void ownCloudGui::slotDisplayIdle()
 
 void ownCloudGui::slotLogin()
 {
-    auto list = AccountManager::instance()->accounts();
     if (auto account = qvariant_cast<AccountStatePtr>(sender()->property(propertyAccountC))) {
         account->signIn();
     } else {
+        auto list = AccountManager::instance()->accounts();
         foreach (const auto &a, list) {
             a->signIn();
         }
@@ -650,6 +709,33 @@ void ownCloudGui::slotLogout()
     }
 }
 
+void ownCloudGui::slotUnpauseAllFolders()
+{
+    setPauseOnAllFoldersHelper(false);
+}
+
+void ownCloudGui::slotPauseAllFolders()
+{
+    setPauseOnAllFoldersHelper(true);
+}
+
+void ownCloudGui::setPauseOnAllFoldersHelper(bool pause)
+{
+    QList<AccountState*> accounts;
+    if (auto account = qvariant_cast<AccountStatePtr>(sender()->property(propertyAccountC))) {
+        accounts.append(account.data());
+    } else {
+        foreach (auto a, AccountManager::instance()->accounts()) {
+            accounts.append(a.data());
+        }
+    }
+    foreach (Folder* f, FolderMan::instance()->map()) {
+        if (accounts.contains(f->accountState())) {
+            f->setSyncPaused(pause);
+        }
+    }
+}
+
 void ownCloudGui::slotShowGuiMessage(const QString &title, const QString &message)
 {
     QMessageBox *msgBox = new QMessageBox;
index 0b5395b8909b115fb578c2912033b3a72b187f6a..e5c8f20138a7b07a058709e928f324a4da1ad265 100644 (file)
@@ -84,8 +84,11 @@ private slots:
     void slotDisplayIdle();
     void slotLogin();
     void slotLogout();
+    void slotUnpauseAllFolders();
+    void slotPauseAllFolders();
 
 private:
+    void setPauseOnAllFoldersHelper(bool pause);
     void setupActions();
     void addAccountContextMenu(AccountStatePtr accountState, QMenu* menu, bool separateMenu);