[Pkg-owncloud-commits] [owncloud-client] 245/498: TrayMenu: Show submenus per account.
Sandro Knauß
hefee-guest at moszumanska.debian.org
Tue Aug 11 14:48:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit 1a58e6606cf429639f9c17c6b331c5220aa097b3
Author: Christian Kamm <kamm at incasoftware.de>
Date: Fri Jul 3 10:59:44 2015 +0200
TrayMenu: Show submenus per account.
This addresses the inability to sign out from one account while
keeping the other active. See #3399, #3400, #3379
---
src/gui/application.cpp | 32 ---------
src/gui/application.h | 2 -
src/gui/owncloudgui.cpp | 170 +++++++++++++++++++++++++++++++++++-------------
src/gui/owncloudgui.h | 6 ++
4 files changed, 129 insertions(+), 81 deletions(-)
diff --git a/src/gui/application.cpp b/src/gui/application.cpp
index bdb6405..8ee257a 100644
--- a/src/gui/application.cpp
+++ b/src/gui/application.cpp
@@ -183,38 +183,6 @@ Application::~Application()
AccountManager::instance()->shutdown();
}
-void Application::slotLogin()
-{
- auto list = AccountManager::instance()->accounts();
- if (!list.isEmpty()) {
- FolderMan::instance()->setupFolders();
- }
-
- foreach (const auto &a, list) {
- a->setSignedOut(false);
- }
-}
-
-void Application::slotLogout()
-{
- auto list = AccountManager::instance()->accounts();
-
- foreach (const auto &ai, list) {
- AccountPtr a = ai->account();
- // invalidate & forget token/password
- a->credentials()->invalidateToken();
- // terminate all syncs and unload folders
- FolderMan *folderMan = FolderMan::instance();
- folderMan->terminateSyncProcess();
- ai->setSignedOut(true);
- // show result
- _gui->slotComputeOverallSyncStatus();
- }
- if (!list.isEmpty()) {
- FolderMan::instance()->setupFolders();
- }
-}
-
void Application::slotAccountStateRemoved(AccountState *accountState)
{
if (_gui) {
diff --git a/src/gui/application.h b/src/gui/application.h
index dddedff..57697f2 100644
--- a/src/gui/application.h
+++ b/src/gui/application.h
@@ -80,8 +80,6 @@ protected slots:
void slotCheckConnection();
void slotStartUpdateDetector();
void slotUseMonoIconsChanged( bool );
- void slotLogin();
- void slotLogout();
void slotCleanup();
void slotAccountStateAdded(AccountState *accountState);
void slotAccountStateRemoved(AccountState *accountState);
diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp
index f7bf91c..f4de43b 100644
--- a/src/gui/owncloudgui.cpp
+++ b/src/gui/owncloudgui.cpp
@@ -282,17 +282,70 @@ void ownCloudGui::slotComputeOverallSyncStatus()
}
}
-void ownCloudGui::setupContextMenu()
+void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *menu, bool separateMenu)
{
+ // Only show the name in the action if it's not part of an
+ // account sub menu.
+ QString browserOpen = tr("Open in browser");
+ if (!separateMenu) {
+ browserOpen = tr("Open %1 in browser").arg(Theme::instance()->appNameGUI());
+ }
+ auto actionOpenoC = menu->addAction(browserOpen);
+ actionOpenoC->setProperty(propertyAccountC, QVariant::fromValue(accountState->account()));
+ QObject::connect(actionOpenoC, SIGNAL(triggered(bool)), SLOT(slotOpenOwnCloud()));
+
+ if (separateMenu) {
+ if (accountState->isConnected()) {
+ QAction* signout = menu->addAction(tr("Sign out"));
+ signout->setProperty(propertyAccountC, QVariant::fromValue(accountState));
+ connect(signout, SIGNAL(triggered()), this, SLOT(slotLogout()));
+ } else {
+ QAction* signin = menu->addAction(tr("Sign in..."));
+ signin->setProperty(propertyAccountC, QVariant::fromValue(accountState));
+ connect(signin, SIGNAL(triggered()), this, SLOT(slotLogin()));
+ }
+ }
+
FolderMan *folderMan = FolderMan::instance();
+ bool firstFolder = true;
+ bool singleSyncFolder = folderMan->map().size() == 1 && Theme::instance()->singleSyncFolder();
+ foreach (Folder* folder, folderMan->map()) {
+ if (folder->accountState() != accountState) {
+ continue;
+ }
+
+ if (firstFolder && !singleSyncFolder) {
+ firstFolder = false;
+ menu->addSeparator();
+ menu->addAction(tr("Managed Folders:"))->setDisabled(true);
+ }
+ // If there can only be a single sync folder, showing the alias is
+ // unnecessary.
+ QString folderName = folder->alias();
+ if (singleSyncFolder) {
+ folderName = Theme::instance()->appNameGUI();
+ }
+
+ QAction *action = new QAction( tr("Open folder '%1'").arg(folder->alias()), this );
+ connect(action, SIGNAL(triggered()),_folderOpenActionMapper, SLOT(map()));
+ _folderOpenActionMapper->setMapping( action, folder->alias() );
+ menu->addAction(action);
+ }
+}
+
+void ownCloudGui::setupContextMenu()
+{
auto accountList = AccountManager::instance()->accounts();
bool isConfigured = (!accountList.isEmpty());
- bool isConnected = false;
+ bool atLeastOneConnected = false;
+ bool atLeastOneDisconnected = false;
foreach (auto a, accountList) {
if (a->isConnected()) {
- isConnected = true;
+ atLeastOneConnected = true;
+ } else {
+ atLeastOneDisconnected = true;
}
}
@@ -311,51 +364,23 @@ void ownCloudGui::setupContextMenu()
}
_contextMenu->setTitle(Theme::instance()->appNameGUI() );
+ qDeleteAll(_accountMenus);
+ _accountMenus.clear();
+ if (accountList.count() > 1) {
+ foreach (AccountStatePtr account, accountList) {
+ QMenu* accountMenu = new QMenu(account->account()->displayName(), _contextMenu.data());
+ _accountMenus.append(accountMenu);
+ _contextMenu->addMenu(accountMenu);
- if (accountList.count() == 1) {
- auto actionOpenoC = _contextMenu->addAction(tr("Open %1 in browser").arg(Theme::instance()->appNameGUI()));
- actionOpenoC->setProperty(propertyAccountC, QVariant::fromValue(accountList.first()->account()));
- QObject::connect(actionOpenoC, SIGNAL(triggered(bool)), SLOT(slotOpenOwnCloud()));
- actionOpenoC->setEnabled(isConfigured);
- } else foreach(auto account, accountList) {
- auto actionOpenoC = _contextMenu->addAction(tr("Open %1 in browser").arg(account->account()->displayName()));
- actionOpenoC->setProperty(propertyAccountC, QVariant::fromValue(account->account()));
- QObject::connect(actionOpenoC, SIGNAL(triggered(bool)), SLOT(slotOpenOwnCloud()));
- }
-
- int folderCnt = folderMan->map().size();
- // add open actions for all sync folders to the tray menu
- if( Theme::instance()->singleSyncFolder() ) {
- // there should be exactly one folder. No sync-folder add action will be shown.
- QStringList li = folderMan->map().keys();
- if( li.size() == 1 ) {
- Folder *folder = folderMan->map().value(li.first());
- if( folder ) {
- // if there is singleFolder mode, a generic open action is displayed.
- QAction *action = new QAction( tr("Open %1 folder").arg(Theme::instance()->appNameGUI()), this);
- connect( action, SIGNAL(triggered()),_folderOpenActionMapper,SLOT(map()));
- _folderOpenActionMapper->setMapping( action, folder->alias() );
-
- _contextMenu->addAction(action);
- }
- }
- } else {
- // show a grouping with more than one folder.
- if ( folderCnt > 1) {
- _contextMenu->addAction(tr("Managed Folders:"))->setDisabled(true);
- }
-
- foreach (auto folder, folderMan->map()) {
- QAction *action = new QAction( tr("Open folder '%1'").arg(folder->alias()), this );
- connect( action, SIGNAL(triggered()),_folderOpenActionMapper,SLOT(map()));
- _folderOpenActionMapper->setMapping( action, folder->alias() );
-
- _contextMenu->addAction(action);
+ addAccountContextMenu(account, accountMenu, true);
}
+ } else if (accountList.count() == 1) {
+ addAccountContextMenu(accountList.first(), _contextMenu.data(), false);
}
+
_contextMenu->addSeparator();
- if (isConfigured && isConnected) {
+ if (isConfigured && atLeastOneConnected) {
_contextMenu->addAction(_actionStatus);
_contextMenu->addMenu(_recentActionsMenu);
_contextMenu->addSeparator();
@@ -370,9 +395,20 @@ void ownCloudGui::setupContextMenu()
}
_contextMenu->addSeparator();
- if (isConfigured && isConnected) {
+ if (atLeastOneConnected) {
+ if (accountList.count() > 1) {
+ _actionLogout->setText(tr("Sign out everywhere"));
+ } else {
+ _actionLogout->setText(tr("Sign out"));
+ }
_contextMenu->addAction(_actionLogout);
- } else {
+ }
+ if (atLeastOneDisconnected) {
+ if (accountList.count() > 1) {
+ _actionLogin->setText(tr("Sign in everywhere..."));
+ } else {
+ _actionLogin->setText(tr("Sign in..."));
+ }
_contextMenu->addAction(_actionLogin);
}
_contextMenu->addAction(_actionQuit);
@@ -435,9 +471,9 @@ void ownCloudGui::setupActions()
QObject::connect(_actionQuit, SIGNAL(triggered(bool)), _app, SLOT(quit()));
_actionLogin = new QAction(tr("Sign in..."), this);
- connect(_actionLogin, SIGNAL(triggered()), _app, SLOT(slotLogin()));
+ connect(_actionLogin, SIGNAL(triggered()), this, SLOT(slotLogin()));
_actionLogout = new QAction(tr("Sign out"), this);
- connect(_actionLogout, SIGNAL(triggered()), _app, SLOT(slotLogout()));
+ connect(_actionLogout, SIGNAL(triggered()), this, SLOT(slotLogout()));
if(_app->debugMode()) {
_actionCrash = new QAction(tr("Crash now", "Only shows in debug mode to allow testing the crash handler"), this);
@@ -530,6 +566,46 @@ void ownCloudGui::slotDisplayIdle()
_actionStatus->setText(tr("Up to date"));
}
+void ownCloudGui::slotLogin()
+{
+ auto list = AccountManager::instance()->accounts();
+ if (!list.isEmpty()) {
+ FolderMan::instance()->setupFolders();
+ }
+
+ if (auto account = qvariant_cast<AccountStatePtr>(sender()->property(propertyAccountC))) {
+ account->setSignedOut(false);
+ } else {
+ foreach (const auto &a, list) {
+ a->setSignedOut(false);
+ }
+ }
+}
+
+void ownCloudGui::slotLogout()
+{
+ auto list = AccountManager::instance()->accounts();
+ if (auto account = qvariant_cast<AccountStatePtr>(sender()->property(propertyAccountC))) {
+ list.clear();
+ list.append(account);
+ }
+
+ foreach (const auto &ai, list) {
+ AccountPtr a = ai->account();
+ // invalidate & forget token/password
+ a->credentials()->invalidateToken();
+ // terminate all syncs and unload folders
+ FolderMan *folderMan = FolderMan::instance();
+ folderMan->terminateSyncProcess();
+ ai->setSignedOut(true);
+ // show result
+ slotComputeOverallSyncStatus();
+ }
+ if (!list.isEmpty()) {
+ FolderMan::instance()->setupFolders();
+ }
+}
+
void ownCloudGui::slotShowGuiMessage(const QString &title, const QString &message)
{
QMessageBox *msgBox = new QMessageBox;
diff --git a/src/gui/owncloudgui.h b/src/gui/owncloudgui.h
index 0408f94..7654c40 100644
--- a/src/gui/owncloudgui.h
+++ b/src/gui/owncloudgui.h
@@ -32,6 +32,8 @@ class SettingsDialog;
class SettingsDialogMac;
class Application;
class LogBrowser;
+class AccountState;
+typedef QSharedPointer<AccountState> AccountStatePtr;
/**
* @brief The ownCloudGui class
@@ -76,9 +78,12 @@ public slots:
private slots:
void slotDisplayIdle();
+ void slotLogin();
+ void slotLogout();
private:
void setupActions();
+ void addAccountContextMenu(AccountStatePtr accountState, QMenu* menu, bool separateMenu);
QPointer<Systray> _tray;
#if defined(Q_OS_MAC)
@@ -90,6 +95,7 @@ private:
// tray's menu
QScopedPointer<QMenu> _contextMenu;
QMenu *_recentActionsMenu;
+ QVector<QMenu*> _accountMenus;
QAction *_actionLogin;
QAction *_actionLogout;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list