summaryrefslogtreecommitdiffstats
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
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.
-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
-rw-r--r--logic/lists/MojangAccountList.cpp37
-rw-r--r--logic/lists/MojangAccountList.h29
7 files changed, 148 insertions, 103 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>
diff --git a/logic/lists/MojangAccountList.cpp b/logic/lists/MojangAccountList.cpp
index 442ef3af..1d67c70f 100644
--- a/logic/lists/MojangAccountList.cpp
+++ b/logic/lists/MojangAccountList.cpp
@@ -33,7 +33,7 @@ MojangAccountList::MojangAccountList(QObject *parent) : QAbstractListModel(paren
{
}
-MojangAccountPtr MojangAccountList::findAccount(const QString &username)
+MojangAccountPtr MojangAccountList::findAccount(const QString &username) const
{
for (int i = 0; i < count(); i++)
{
@@ -41,7 +41,7 @@ MojangAccountPtr MojangAccountList::findAccount(const QString &username)
if (account->username() == username)
return account;
}
- return MojangAccountPtr();
+ return nullptr;
}
@@ -82,6 +82,25 @@ void MojangAccountList::removeAccount(QModelIndex index)
}
+MojangAccountPtr MojangAccountList::activeAccount() const
+{
+ if (m_activeAccount.isEmpty())
+ return nullptr;
+ else
+ return findAccount(m_activeAccount);
+}
+
+void MojangAccountList::setActiveAccount(const QString& username)
+{
+ beginResetModel();
+ for (MojangAccountPtr account : m_accounts)
+ if (account->username() == username)
+ m_activeAccount = username;
+ endResetModel();
+ onListChanged();
+}
+
+
void MojangAccountList::onListChanged()
{
if (m_autosave)
@@ -112,6 +131,9 @@ QVariant MojangAccountList::data(const QModelIndex &index, int role) const
case Qt::DisplayRole:
switch (index.column())
{
+ case ActiveColumn:
+ return account->username() == m_activeAccount;
+
case NameColumn:
return account->username();
@@ -137,6 +159,9 @@ QVariant MojangAccountList::headerData(int section, Qt::Orientation orientation,
case Qt::DisplayRole:
switch (section)
{
+ case ActiveColumn:
+ return "Active?";
+
case NameColumn:
return "Name";
@@ -167,7 +192,7 @@ int MojangAccountList::rowCount(const QModelIndex &parent) const
int MojangAccountList::columnCount(const QModelIndex &parent) const
{
- return 1;
+ return 2;
}
void MojangAccountList::updateListData(QList<MojangAccountPtr> versions)
@@ -251,6 +276,9 @@ bool MojangAccountList::loadList(const QString& filePath)
}
}
endResetModel();
+
+ // Load the active account.
+ m_activeAccount = root.value("activeAccount").toString("");
return true;
}
@@ -285,6 +313,9 @@ bool MojangAccountList::saveList(const QString& filePath)
// Insert the account list into the root object.
root.insert("accounts", accounts);
+ // Save the active account.
+ root.insert("activeAccount", m_activeAccount);
+
// Create a JSON document object to convert our JSON to bytes.
QJsonDocument doc(root);
diff --git a/logic/lists/MojangAccountList.h b/logic/lists/MojangAccountList.h
index bccc2f9a..71f472f7 100644
--- a/logic/lists/MojangAccountList.h
+++ b/logic/lists/MojangAccountList.h
@@ -44,8 +44,12 @@ public:
enum VListColumns
{
// TODO: Add icon column.
- // First column - Name
- NameColumn = 0,
+
+ // First column - Active?
+ ActiveColumn = 0,
+
+ // Second column - Name
+ NameColumn,
};
explicit MojangAccountList(QObject *parent = 0);
@@ -83,7 +87,7 @@ public:
* \return A const pointer to the account with the given username. NULL if
* one doesn't exist.
*/
- virtual MojangAccountPtr findAccount(const QString &username);
+ virtual MojangAccountPtr findAccount(const QString &username) const;
/*!
* Sets the default path to save the list file to.
@@ -108,6 +112,19 @@ public:
*/
virtual bool saveList(const QString& file="");
+ /*!
+ * \brief Gets a pointer to the account that the user has selected as their "active" account.
+ * Which account is active can be overridden on a per-instance basis, but this will return the one that
+ * is set as active globally.
+ * \return The currently active MojangAccount. If there isn't an active account, returns a null pointer.
+ */
+ virtual MojangAccountPtr activeAccount() const;
+
+ /*!
+ * Sets the given account as the current active account.
+ */
+ virtual void setActiveAccount(const QString& username);
+
signals:
/*!
* Signal emitted to indicate that the account list has changed.
@@ -124,6 +141,12 @@ protected:
QList<MojangAccountPtr> m_accounts;
+ /*!
+ * Username of the account that is currently active.
+ * Empty string if no account is active.
+ */
+ QString m_activeAccount;
+
//! Path to the account list file. Empty string if there isn't one.
QString m_listFilePath;