Properly implement launching and downloading

Also added a system to select an active account to log in with.
This commit is contained in:
Andrew
2013-11-22 12:47:39 -06:00
parent 23bc195b3c
commit 75e7932607
7 changed files with 167 additions and 122 deletions

View File

@ -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,44 +572,90 @@ void MainWindow::doLogin(const QString &errorMsg)
// Open the account manager.
on_actionManageAccounts_triggered();
}
return;
}
else if (account.get() == nullptr)
{
// 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();
if (reply == QMessageBox::Yes)
{
// Open the account manager.
on_actionManageAccounts_triggered();
}
}
else
{
// 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 ^
prepareLaunch(m_selectedInstance, account);
}
}
// 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();
loginDlg->exec();
if (loginDlg->result() == QDialog::Accepted)
void MainWindow::prepareLaunch(BaseInstance* instance, MojangAccountPtr account)
{
BaseUpdate *updateTask = instance->doUpdate();
if (!updateTask)
{
if (loginDlg->isOnline())
{
m_activeInst = m_selectedInstance;
doLogin(loginDlg->getUsername(), loginDlg->getPassword());
}
else
{
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);
}
launchInstance(instance, account);
}
else
{
ProgressDialog tDialog(this);
connect(updateTask, &BaseUpdate::succeeded, [this, instance, account] { launchInstance(instance, account); });
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog.exec(updateTask);
delete updateTask;
}
QString playerName = account->currentProfile()->name();
auto job = new NetJob("Player skin: " + playerName);
auto meta = MMC->metacache()->resolveEntry("skins", playerName + ".png");
auto action = CacheDownload::make(
QUrl("http://skins.minecraft.net/MinecraftSkins/" + playerName + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
job->start();
auto filename = MMC->metacache()->resolveEntry("skins", "skins.json")->getFullPath();
QFile listFile(filename);
// Add skin mapping
QByteArray data;
{
if (!listFile.open(QIODevice::ReadWrite))
{
QLOG_ERROR() << "Failed to open/make skins list JSON";
return;
}
data = listFile.readAll();
}
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
QJsonObject root = jsonDoc.object();
QJsonObject mappings = root.value("mappings").toObject();
QJsonArray usernames = mappings.value(account->username()).toArray();
if (!usernames.contains(playerName))
{
usernames.prepend(playerName);
mappings[account->username()] = usernames;
root["mappings"] = mappings;
jsonDoc.setObject(root);
// QJson hack - shouldn't have to clear the file every time a save happens
listFile.resize(0);
listFile.write(jsonDoc.toJson());
}
*/
}
void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account)
@ -652,76 +693,6 @@ void MainWindow::launchInstance(BaseInstance *instance, MojangAccountPtr account
proc->launch();
}
void MainWindow::onLoginComplete()
{
if (!m_activeInst)
return;
LoginTask *task = (LoginTask *)QObject::sender();
m_activeLogin = task->getResult();
BaseUpdate *updateTask = m_activeInst->doUpdate();
if (!updateTask)
{
//launchInstance(m_activeInst, m_activeLogin);
}
else
{
ProgressDialog tDialog(this);
connect(updateTask, SIGNAL(succeeded()), SLOT(onGameUpdateComplete()));
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog.exec(updateTask);
delete updateTask;
}
auto job = new NetJob("Player skin: " + m_activeLogin.player_name);
auto meta = MMC->metacache()->resolveEntry("skins", m_activeLogin.player_name + ".png");
auto action = CacheDownload::make(
QUrl("http://skins.minecraft.net/MinecraftSkins/" + m_activeLogin.player_name + ".png"),
meta);
job->addNetAction(action);
meta->stale = true;
job->start();
auto filename = MMC->metacache()->resolveEntry("skins", "skins.json")->getFullPath();
QFile listFile(filename);
// Add skin mapping
QByteArray data;
{
if (!listFile.open(QIODevice::ReadWrite))
{
QLOG_ERROR() << "Failed to open/make skins list JSON";
return;
}
data = listFile.readAll();
}
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
QJsonObject root = jsonDoc.object();
QJsonObject mappings = root.value("mappings").toObject();
QJsonArray usernames = mappings.value(m_activeLogin.username).toArray();
if (!usernames.contains(m_activeLogin.player_name))
{
usernames.prepend(m_activeLogin.player_name);
mappings[m_activeLogin.username] = usernames;
root["mappings"] = mappings;
jsonDoc.setObject(root);
// QJson hack - shouldn't have to clear the file every time a save happens
listFile.resize(0);
listFile.write(jsonDoc.toJson());
}
}
void MainWindow::onGameUpdateComplete()
{
//launchInstance(m_activeInst, m_activeLogin);
}
void MainWindow::onGameUpdateError(QString error)
{
CustomMessageBox::selectable(this, tr("Error updating instance"), error,

View File

@ -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;

View File

@ -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();

View File

@ -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();

View File

@ -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>