summaryrefslogtreecommitdiffstats
path: root/gui
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
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')
-rw-r--r--gui/MainWindow.cpp147
-rw-r--r--gui/MainWindow.h12
-rw-r--r--gui/dialogs/AccountListDialog.cpp12
-rw-r--r--gui/dialogs/AccountListDialog.h2
-rw-r--r--gui/dialogs/AccountListDialog.ui12
5 files changed, 88 insertions, 97 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)
diff --git a/gui/MainWindow.h b/gui/MainWindow.h
index c0fcc385..f88905bf 100644
--- a/gui/MainWindow.h
+++ b/gui/MainWindow.h
@@ -113,9 +113,11 @@ slots:
*/
void launchInstance(BaseInstance* instance, MojangAccountPtr account);
- void onLoginComplete();
+ /*!
+ * Prepares the given instance for launch with the given account.
+ */
+ void prepareLaunch(BaseInstance* instance, MojangAccountPtr account);
- void onGameUpdateComplete();
void onGameUpdateError(QString error);
void taskStart();
@@ -160,12 +162,6 @@ private:
BaseInstance *m_selectedInstance;
- // A pointer to the instance we are actively doing stuff with.
- // This is set when the user launches an instance and is used to refer to that
- // instance throughout the launching process.
- BaseInstance *m_activeInst;
- LoginResponse m_activeLogin;
-
Task *m_versionLoadTask;
QLabel *m_statusLeft;
diff --git a/gui/dialogs/AccountListDialog.cpp b/gui/dialogs/AccountListDialog.cpp
index 838bef7f..c685c164 100644
--- a/gui/dialogs/AccountListDialog.cpp
+++ b/gui/dialogs/AccountListDialog.cpp
@@ -34,6 +34,7 @@ AccountListDialog::AccountListDialog(QWidget *parent) :
ui->setupUi(this);
m_accounts = MMC->accounts();
+ // TODO: Make the "Active?" column show checkboxes or radio buttons.
ui->listView->setModel(m_accounts.get());
}
@@ -63,6 +64,17 @@ void AccountListDialog::on_editAccountBtn_clicked()
// TODO
}
+void AccountListDialog::on_setActiveBtn_clicked()
+{
+ QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();
+ if (selection.size() > 0)
+ {
+ QModelIndex selected = selection.first();
+ MojangAccountPtr account = selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>();
+ m_accounts->setActiveAccount(account->username());
+ }
+}
+
void AccountListDialog::on_closeBtnBox_rejected()
{
close();
diff --git a/gui/dialogs/AccountListDialog.h b/gui/dialogs/AccountListDialog.h
index 99dee639..17a50bec 100644
--- a/gui/dialogs/AccountListDialog.h
+++ b/gui/dialogs/AccountListDialog.h
@@ -42,6 +42,8 @@ slots:
void on_editAccountBtn_clicked();
+ void on_setActiveBtn_clicked();
+
// This will be sent when the "close" button is clicked.
void on_closeBtnBox_rejected();
diff --git a/gui/dialogs/AccountListDialog.ui b/gui/dialogs/AccountListDialog.ui
index 034985a9..2872b368 100644
--- a/gui/dialogs/AccountListDialog.ui
+++ b/gui/dialogs/AccountListDialog.ui
@@ -27,7 +27,7 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QListView" name="listView"/>
+ <widget class="QTreeView" name="listView"/>
</item>
<item>
<layout class="QVBoxLayout" name="manageAcctsBtnBox">
@@ -65,6 +65,16 @@
</property>
</spacer>
</item>
+ <item>
+ <widget class="QPushButton" name="setActiveBtn">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the currently selected account as the active account. The active account is the account that is used to log in (unless it is overridden in an instance-specific setting).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>&amp;Set Active</string>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
</layout>