diff options
author | Petr Mrázek <peterix@gmail.com> | 2013-11-28 21:28:32 +0100 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2013-11-28 21:28:32 +0100 |
commit | 61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52 (patch) | |
tree | f57e44d507ba26cd699bf26bfc0eced26ac5e380 /gui/MainWindow.cpp | |
parent | fec8c054c3967d9ed4bbf288b9c4993b8aaeac1d (diff) | |
parent | 191e850cf14666302c3338d69073d1f417925a45 (diff) | |
download | MultiMC-61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52.tar MultiMC-61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52.tar.gz MultiMC-61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52.tar.lz MultiMC-61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52.tar.xz MultiMC-61f1dd6e2ba2d863cf24a0bb4f189fa180a0ee52.zip |
Merge https://github.com/Drayshak/MultiMC5 into develop
Diffstat (limited to 'gui/MainWindow.cpp')
-rw-r--r-- | gui/MainWindow.cpp | 161 |
1 files changed, 136 insertions, 25 deletions
diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index e817d50d..f8904267 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -32,6 +32,7 @@ #include <QFileInfo> #include <QLabel> #include <QToolButton> +#include <QWidgetAction> #include "osutils.h" #include "userutils.h" @@ -172,34 +173,49 @@ 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())); - MojangAccountPtr account = MMC->accounts()->activeAccount(); - if(account != nullptr) - { - auto job = new NetJob("Startup player skins: " + account->username()); + 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); + + std::shared_ptr<MojangAccountList> accounts = MMC->accounts(); - for(AccountProfile profile : account->profiles()) + // TODO: Nicer way to iterate? + for(int i = 0; i < accounts->count(); i++) + { + MojangAccountPtr account = accounts->at(i); + if(account != nullptr) { - auto meta = MMC->metacache()->resolveEntry("skins", profile.name() + ".png"); - auto action = CacheDownload::make( - QUrl("http://skins.minecraft.net/MinecraftSkins/" + profile.name() + ".png"), - meta); - job->addNetAction(action); - meta->stale = true; - } + auto job = new NetJob("Startup player skins: " + account->username()); - connect(job, SIGNAL(succeeded()), SLOT(activeAccountChanged())); - job->start(); - } + for(AccountProfile profile : account->profiles()) + { + auto meta = MMC->metacache()->resolveEntry("skins", profile.name() + ".png"); + auto action = CacheDownload::make( + QUrl("http://skins.minecraft.net/MinecraftSkins/" + profile.name() + ".png"), + meta); + job->addNetAction(action); + meta->stale = true; + } - connect(actionManageAccounts, SIGNAL(clicked()), this, SLOT(on_actionManageAccounts_triggered())); - ui->mainToolBar->addWidget(actionManageAccounts); + connect(job, SIGNAL(succeeded()), SLOT(activeAccountChanged())); + job->start(); + } + } // run the things that load and download other things... FIXME: this is NOT the place // FIXME: invisible actions in the background = NOPE. @@ -233,18 +249,113 @@ MainWindow::~MainWindow() delete assets_downloader; } + +void MainWindow::repopulateAccountsMenu() +{ + accountMenu->clear(); + + std::shared_ptr<MojangAccountList> accounts = MMC->accounts(); + MojangAccountPtr active_account = accounts->activeAccount(); + + QString active_username = ""; + if(active_account != 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); + } + + action->setIcon(SkinUtils::getFaceFromCache(profile.name())); + accountMenu->addAction(action); + connect(action, SIGNAL(triggered(bool)), SLOT(changeActiveAccount())); + } + + accountMenu->addSeparator(); + } + } + + QAction *action = new QAction(tr("No default"), this); + action->setCheckable(true); + action->setData(""); + if(active_username.isEmpty()) + { + 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; + + QVariant data = sAction->data(); + QString id = ""; + if(!data.isNull()) + { + id = data.toString(); + } + + MMC->accounts()->setActiveAccount(id); + + activeAccountChanged(); +} + void MainWindow::activeAccountChanged() { + repopulateAccountsMenu(); + MojangAccountPtr account = MMC->accounts()->activeAccount(); - if(account != nullptr) + if(account != nullptr && account->username() != "") { 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) |