From 69d8ab16c58509bafb98694f9aa998ae51ff4b7f Mon Sep 17 00:00:00 2001 From: Sky Date: Wed, 27 Nov 2013 22:39:49 +0000 Subject: Dropdown for account switching --- gui/MainWindow.cpp | 110 ++++++++++++++++++++++++++++++++++---- gui/MainWindow.h | 8 ++- gui/dialogs/AccountListDialog.cpp | 3 ++ 3 files changed, 110 insertions(+), 11 deletions(-) (limited to 'gui') diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 3fdbed44..5295a8a5 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include "osutils.h" #include "userutils.h" @@ -171,12 +172,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ui->mainToolBar->addWidget(spacer); - actionManageAccounts = new QToolButton(this); - actionManageAccounts->setToolTip(tr("Manage your Mojang or Minecraft accounts.")); - actionManageAccounts->setObjectName("actionManageAccounts"); - actionManageAccounts->setText(tr("Manage accounts")); - actionManageAccounts->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - actionManageAccounts->setLayoutDirection(Qt::RightToLeft); + accountMenu = new QMenu(this); + manageAccountsAction = new QAction(tr("Manage accounts"), this); + manageAccountsAction->setCheckable(false); + connect(manageAccountsAction, SIGNAL(triggered(bool)), this, SLOT(on_actionManageAccounts_triggered())); + + repopulateAccountsMenu(); + + accountMenuButton = new QToolButton(this); + accountMenuButton->setText(tr("Accounts")); + accountMenuButton->setMenu(accountMenu); + accountMenuButton->setPopupMode(QToolButton::InstantPopup); + accountMenuButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + accountMenuButton->setLayoutDirection(Qt::RightToLeft); + + QWidgetAction *accountMenuButtonAction = new QWidgetAction(this); + accountMenuButtonAction->setDefaultWidget(accountMenuButton); + + ui->mainToolBar->addAction(accountMenuButtonAction); MojangAccountPtr account = MMC->accounts()->activeAccount(); if(account != nullptr) @@ -197,9 +210,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi job->start(); } - connect(actionManageAccounts, SIGNAL(clicked()), this, SLOT(on_actionManageAccounts_triggered())); - ui->mainToolBar->addWidget(actionManageAccounts); - // run the things that load and download other things... FIXME: this is NOT the place // FIXME: invisible actions in the background = NOPE. { @@ -232,8 +242,85 @@ MainWindow::~MainWindow() delete assets_downloader; } + +void MainWindow::repopulateAccountsMenu() +{ + accountMenu->clear(); + + std::shared_ptr accounts = MMC->accounts(); + + QString active_username; + if(accounts->activeAccount() != nullptr) + { + active_username = accounts->activeAccount()->username(); + } + + if(accounts->count() <= 0) + { + QAction *action = new QAction(tr("No accounts added!"), this); + action->setEnabled(false); + accountMenu->addAction(action); + + accountMenu->addSeparator(); + } + else + { + // TODO: Nicer way to iterate? + for(int i = 0; i < accounts->count(); i++) + { + MojangAccountPtr account = accounts->at(i); + + // Styling hack + QAction *section = new QAction(account->username(), this); + section->setEnabled(false); + accountMenu->addAction(section); + + for(AccountProfile profile : account->profiles()) + { + QAction *action = new QAction(profile.name(), this); + action->setData(account->username()); + action->setCheckable(true); + if(active_username == account->username()) + { + action->setChecked(true); + } + + accountMenu->addAction(action); + connect(action, SIGNAL(triggered(bool)), SLOT(changeActiveAccount())); + } + + accountMenu->addSeparator(); + } + } + + accountMenu->addAction(manageAccountsAction); +} + +/* + * Assumes the sender is a QAction + */ +void MainWindow::changeActiveAccount() +{ + QAction* sAction = (QAction*) sender(); + + // Profile's associated Mojang username + // Will need to change when profiles are properly implemented + if(sAction->data().type() != QVariant::Type::String) return; + + QString id = sAction->data().toString(); + + if(id != nullptr && !id.isEmpty()) + { + MMC->accounts()->setActiveAccount(id); + } + + activeAccountChanged(); +} + void MainWindow::activeAccountChanged() { + repopulateAccountsMenu(); + MojangAccountPtr account = MMC->accounts()->activeAccount(); if(account != nullptr) @@ -241,9 +328,12 @@ void MainWindow::activeAccountChanged() const AccountProfile *profile = account->currentProfile(); if(profile != nullptr) { - actionManageAccounts->setIcon(SkinUtils::getFaceFromCache(profile->name())); + accountMenuButton->setIcon(SkinUtils::getFaceFromCache(profile->name())); + return; } } + + accountMenuButton->setIcon(QIcon()); } bool MainWindow::eventFilter(QObject *obj, QEvent *ev) diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 4e20d7cb..4191e590 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -148,6 +148,10 @@ slots: void activeAccountChanged(); + void changeActiveAccount(); + + void repopulateAccountsMenu(); + protected: bool eventFilter(QObject *obj, QEvent *ev); void setCatBackground(bool enabled); @@ -170,5 +174,7 @@ private: QLabel *m_statusLeft; QLabel *m_statusRight; - QToolButton *actionManageAccounts; + QMenu *accountMenu; + QToolButton *accountMenuButton; + QAction *manageAccountsAction; }; diff --git a/gui/dialogs/AccountListDialog.cpp b/gui/dialogs/AccountListDialog.cpp index ea6861c6..0ce14638 100644 --- a/gui/dialogs/AccountListDialog.cpp +++ b/gui/dialogs/AccountListDialog.cpp @@ -112,6 +112,9 @@ void AccountListDialog::onLoginComplete() // Add the authenticated account to the accounts list. MojangAccountPtr account = m_authTask->getMojangAccount(); m_accounts->addAccount(account); + + emit activeAccountChanged(); + //ui->listView->update(); // Grab associated player skins -- cgit v1.2.3