summaryrefslogtreecommitdiffstats
path: root/gui/MainWindow.cpp
diff options
context:
space:
mode:
authorAndrew <forkk@forkk.net>2013-11-22 12:47:39 -0600
committerAndrew <forkk@forkk.net>2013-11-22 12:47:39 -0600
commit75e7932607bdd84d2867765eb6f07dcec95ee193 (patch)
tree9ee711dac0a07f6797eedf3ee61d277bb3b63c2c /gui/MainWindow.cpp
parent23bc195b3c8558cb997789ca8772342612716993 (diff)
downloadMultiMC-75e7932607bdd84d2867765eb6f07dcec95ee193.tar
MultiMC-75e7932607bdd84d2867765eb6f07dcec95ee193.tar.gz
MultiMC-75e7932607bdd84d2867765eb6f07dcec95ee193.tar.lz
MultiMC-75e7932607bdd84d2867765eb6f07dcec95ee193.tar.xz
MultiMC-75e7932607bdd84d2867765eb6f07dcec95ee193.zip
Properly implement launching and downloading
Also added a system to select an active account to log in with.
Diffstat (limited to 'gui/MainWindow.cpp')
-rw-r--r--gui/MainWindow.cpp147
1 files changed, 59 insertions, 88 deletions
diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp
index 9824d52f..7ea67764 100644
--- a/gui/MainWindow.cpp
+++ b/gui/MainWindow.cpp
@@ -85,11 +85,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
ui->setupUi(this);
setWindowTitle(QString("MultiMC %1").arg(MMC->version().toString()));
- // Set the selected instance to null
- m_selectedInstance = nullptr;
- // Set active instance to null.
- m_activeInst = nullptr;
-
// OSX magic.
setUnifiedTitleAndToolBarOnMac(true);
@@ -563,7 +558,7 @@ void MainWindow::doLogin(const QString &errorMsg)
// Find an account to use.
std::shared_ptr<MojangAccountList> accounts = MMC->accounts();
- MojangAccountPtr account;
+ MojangAccountPtr account = accounts->activeAccount();
if (accounts->count() <= 0)
{
// Tell the user they need to log in at least one account in order to play.
@@ -577,107 +572,53 @@ void MainWindow::doLogin(const QString &errorMsg)
// Open the account manager.
on_actionManageAccounts_triggered();
}
- return;
}
- else
+ else if (account.get() == nullptr)
{
- // TODO: Allow user to select different accounts.
- // For now, we'll just use the first one in the list until I get arround to implementing that.
- account = accounts->at(0);
- }
-
- // We'll need to validate the access token to make sure the account is still logged in.
- // TODO: Do that ^
-
- launchInstance(m_selectedInstance, account);
-
- /*
- LoginDialog *loginDlg = new LoginDialog(this, errorMsg);
- if (!m_selectedInstance->lastLaunch())
- loginDlg->forceOnline();
+ // Tell the user they need to log in at least one account in order to play.
+ auto reply = CustomMessageBox::selectable(this, tr("No Account Selected"),
+ tr("You don't have an account selected as an active account."
+ "Would you like to open the account manager to select one now?"),
+ QMessageBox::Information, QMessageBox::Yes | QMessageBox::No)->exec();
- loginDlg->exec();
- if (loginDlg->result() == QDialog::Accepted)
- {
- if (loginDlg->isOnline())
- {
- m_activeInst = m_selectedInstance;
- doLogin(loginDlg->getUsername(), loginDlg->getPassword());
- }
- else
+ if (reply == QMessageBox::Yes)
{
- QString user = loginDlg->getUsername();
- if (user.length() == 0)
- user = QString("Player");
- m_activeLogin = {user, QString("Offline"), user, QString()};
- m_activeInst = m_selectedInstance;
- launchInstance(m_activeInst, m_activeLogin);
+ // Open the account manager.
+ on_actionManageAccounts_triggered();
}
}
- */
-}
-
-void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account)
-{
- Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
- Q_ASSERT_X(account.get() != nullptr, "launchInstance", "account is NULL");
-
- proc = instance->prepareForLaunch(account);
- if (!proc)
- return;
-
- // Prepare GUI: If it shall stay open disable the required parts
- if (MMC->settings()->get("NoHide").toBool())
- {
- ui->actionLaunchInstance->setEnabled(false);
- }
else
{
- this->hide();
+ // We'll need to validate the access token to make sure the account is still logged in.
+ // TODO: Do that ^
+
+ prepareLaunch(m_selectedInstance, account);
}
-
- console = new ConsoleWindow(proc);
-
- connect(proc, SIGNAL(log(QString, MessageLevel::Enum)), console,
- SLOT(write(QString, MessageLevel::Enum)));
- connect(proc, SIGNAL(ended(BaseInstance *)), this, SLOT(instanceEnded(BaseInstance *)));
-
- if (instance->settings().get("ShowConsole").toBool())
- {
- console->show();
- }
-
- // I think this will work...
- proc->setLogin(account->username(), account->accessToken());
- proc->launch();
}
-void MainWindow::onLoginComplete()
+void MainWindow::prepareLaunch(BaseInstance* instance, MojangAccountPtr account)
{
- if (!m_activeInst)
- return;
- LoginTask *task = (LoginTask *)QObject::sender();
- m_activeLogin = task->getResult();
-
- BaseUpdate *updateTask = m_activeInst->doUpdate();
+ BaseUpdate *updateTask = instance->doUpdate();
if (!updateTask)
{
- //launchInstance(m_activeInst, m_activeLogin);
+ launchInstance(instance, account);
}
else
{
ProgressDialog tDialog(this);
- connect(updateTask, SIGNAL(succeeded()), SLOT(onGameUpdateComplete()));
+ connect(updateTask, &BaseUpdate::succeeded, [this, instance, account] { launchInstance(instance, account); });
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog.exec(updateTask);
delete updateTask;
}
- auto job = new NetJob("Player skin: " + m_activeLogin.player_name);
+ QString playerName = account->currentProfile()->name();
+
+ auto job = new NetJob("Player skin: " + playerName);
- auto meta = MMC->metacache()->resolveEntry("skins", m_activeLogin.player_name + ".png");
+ auto meta = MMC->metacache()->resolveEntry("skins", playerName + ".png");
auto action = CacheDownload::make(
- QUrl("http://skins.minecraft.net/MinecraftSkins/" + m_activeLogin.player_name + ".png"),
+ QUrl("http://skins.minecraft.net/MinecraftSkins/" + playerName + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
@@ -702,12 +643,12 @@ void MainWindow::onLoginComplete()
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
QJsonObject root = jsonDoc.object();
QJsonObject mappings = root.value("mappings").toObject();
- QJsonArray usernames = mappings.value(m_activeLogin.username).toArray();
+ QJsonArray usernames = mappings.value(account->username()).toArray();
- if (!usernames.contains(m_activeLogin.player_name))
+ if (!usernames.contains(playerName))
{
- usernames.prepend(m_activeLogin.player_name);
- mappings[m_activeLogin.username] = usernames;
+ usernames.prepend(playerName);
+ mappings[account->username()] = usernames;
root["mappings"] = mappings;
jsonDoc.setObject(root);
@@ -717,9 +658,39 @@ void MainWindow::onLoginComplete()
}
}
-void MainWindow::onGameUpdateComplete()
+void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account)
{
- //launchInstance(m_activeInst, m_activeLogin);
+ Q_ASSERT_X(instance != NULL, "launchInstance", "instance is NULL");
+ Q_ASSERT_X(account.get() != nullptr, "launchInstance", "account is NULL");
+
+ proc = instance->prepareForLaunch(account);
+ if (!proc)
+ return;
+
+ // Prepare GUI: If it shall stay open disable the required parts
+ if (MMC->settings()->get("NoHide").toBool())
+ {
+ ui->actionLaunchInstance->setEnabled(false);
+ }
+ else
+ {
+ this->hide();
+ }
+
+ console = new ConsoleWindow(proc);
+
+ connect(proc, SIGNAL(log(QString, MessageLevel::Enum)), console,
+ SLOT(write(QString, MessageLevel::Enum)));
+ connect(proc, SIGNAL(ended(BaseInstance *)), this, SLOT(instanceEnded(BaseInstance *)));
+
+ if (instance->settings().get("ShowConsole").toBool())
+ {
+ console->show();
+ }
+
+ // I think this will work...
+ proc->setLogin(account->username(), account->accessToken());
+ proc->launch();
}
void MainWindow::onGameUpdateError(QString error)