Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow selecting a default account to use with an instance #685

Merged
merged 11 commits into from
Jan 13, 2023
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 9 additions & 1 deletion launcher/LaunchController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,15 @@ void LaunchController::decideAccount()
}
}

m_accountToUse = accounts->defaultAccount();
// Select the account to use. If the instance has a specific account set, that will be used. Otherwise, the default account will be used
auto instanceAccountId = m_instance->settings()->get("InstanceAccountId").toString();
auto instanceAccountIndex = accounts->findAccountByProfileId(instanceAccountId);
if (instanceAccountIndex == -1) {
m_accountToUse = accounts->defaultAccount();
} else {
m_accountToUse = accounts->at(instanceAccountIndex);
}

if (!m_accountToUse)
{
// If no default account is set, ask the user which one to use.
Expand Down
4 changes: 4 additions & 0 deletions launcher/minecraft/MinecraftInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,10 @@ void MinecraftInstance::loadSpecificSettings()
m_settings->registerSetting("JoinServerOnLaunch", false);
m_settings->registerSetting("JoinServerOnLaunchAddress", "");

// Use account for instance, this does not have a global override
m_settings->registerSetting("UseAccountForInstance", false);
m_settings->registerSetting("InstanceAccountId", "");

qDebug() << "Instance-type specific settings were loaded!";

setSpecificSettingsLoaded(true);
Expand Down
78 changes: 77 additions & 1 deletion launcher/ui/pages/instance/InstanceSettingsPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,23 @@

#include "JavaCommon.h"
#include "Application.h"
#include "minecraft/auth/AccountList.h"

#include "java/JavaInstallList.h"
#include "java/JavaUtils.h"
#include "FileSystem.h"


InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent)
: QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst)
{
m_settings = inst->settings();
ui->setupUi(this);

accountMenu = new QMenu(this);
// Use undocumented property... https://stackoverflow.com/questions/7121718/create-a-scrollbar-in-a-submenu-qt
accountMenu->setStyleSheet("QMenu { menu-scrollable: 1; }");
ui->instanceAccountSelector->setMenu(accountMenu);

connect(ui->openGlobalJavaSettingsButton, &QCommandLinkButton::clicked, this, &InstanceSettingsPage::globalSettingsButtonClicked);
connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::applySettings);
connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings);
Expand Down Expand Up @@ -275,6 +280,13 @@ void InstanceSettingsPage::applySettings()
m_settings->reset("JoinServerOnLaunchAddress");
}

// Use an account for this instance
bool useAccountForInstance = ui->instanceAccountGroupBox->isChecked();
m_settings->set("UseAccountForInstance", useAccountForInstance);
if (!useAccountForInstance) {
m_settings->reset("InstanceAccountId");
}

// FIXME: This should probably be called by a signal instead
m_instance->updateRuntimeContext();
}
Expand Down Expand Up @@ -372,6 +384,9 @@ void InstanceSettingsPage::loadSettings()

ui->serverJoinGroupBox->setChecked(m_settings->get("JoinServerOnLaunch").toBool());
ui->serverJoinAddress->setText(m_settings->get("JoinServerOnLaunchAddress").toString());

ui->instanceAccountGroupBox->setChecked(m_settings->get("UseAccountForInstance").toBool());
updateAccountsMenu();
}

void InstanceSettingsPage::on_javaDetectBtn_clicked()
Expand Down Expand Up @@ -437,6 +452,67 @@ void InstanceSettingsPage::on_javaTestBtn_clicked()
checker->run();
}

void InstanceSettingsPage::updateAccountsMenu()
{
accountMenu->clear();

auto accounts = APPLICATION->accounts();
int accountIndex = accounts->findAccountByProfileId(m_settings->get("InstanceAccountId").toString());
MinecraftAccountPtr defaultAccount = accounts->defaultAccount();

if (accountIndex != -1 && accounts->at(accountIndex)) {
defaultAccount = accounts->at(accountIndex);
}

if (defaultAccount) {
ui->instanceAccountSelector->setText(defaultAccount->profileName());
ui->instanceAccountSelector->setIcon(defaultAccount->getFace());
byteduck marked this conversation as resolved.
Show resolved Hide resolved
} else {
ui->instanceAccountSelector->setText(tr("No default account"));
ui->instanceAccountSelector->setIcon(APPLICATION->getThemedIcon("noaccount"));
byteduck marked this conversation as resolved.
Show resolved Hide resolved
}

for (int i = 0; i < accounts->count(); i++) {
MinecraftAccountPtr account = accounts->at(i);
QAction* action = new QAction(account->profileName(), this);
action->setData(i);
action->setCheckable(true);
if (accountIndex == i) {
action->setChecked(true);
}

auto face = account->getFace();
if (!face.isNull()) {
action->setIcon(face);
} else {
action->setIcon(APPLICATION->getThemedIcon("noaccount"));
}

accountMenu->addAction(action);
connect(action, SIGNAL(triggered(bool)), this, SLOT(changeInstanceAccount()));
}
}

void InstanceSettingsPage::changeInstanceAccount()
{
QAction* sAction = (QAction*)sender();

Q_ASSERT(sAction->data().type() == QVariant::Type::Int);

QVariant data = sAction->data();
int index = data.toInt();
auto accounts = APPLICATION->accounts();
auto account = accounts->at(index);
m_settings->set("InstanceAccountId", account->profileId());

ui->instanceAccountSelector->setText(account->profileName());
if (auto face = account->getFace(); !face.isNull()) {
ui->instanceAccountSelector->setIcon(face);
} else {
ui->instanceAccountSelector->setIcon(APPLICATION->getThemedIcon("noaccount"));
}
}

void InstanceSettingsPage::on_maxMemSpinBox_valueChanged(int i)
{
updateThresholds();
Expand Down
13 changes: 9 additions & 4 deletions launcher/ui/pages/instance/InstanceSettingsPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,13 @@

#include <QWidget>

#include "java/JavaChecker.h"
#include "BaseInstance.h"
#include <QObjectPtr.h>
#include "ui/pages/BasePage.h"
#include "JavaCommon.h"
#include <QMenu>
#include "Application.h"
#include "BaseInstance.h"
#include "JavaCommon.h"
#include "java/JavaChecker.h"
#include "ui/pages/BasePage.h"

class JavaChecker;
namespace Ui
Expand Down Expand Up @@ -92,9 +93,13 @@ private slots:

void globalSettingsButtonClicked(bool checked);

void updateAccountsMenu();
void changeInstanceAccount();

private:
Ui::InstanceSettingsPage *ui;
BaseInstance *m_instance;
SettingsObjectPtr m_settings;
unique_qobject_ptr<JavaCommon::TestCheck> checker;
QMenu *accountMenu = nullptr;
};
42 changes: 42 additions & 0 deletions launcher/ui/pages/instance/InstanceSettingsPage.ui
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,48 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="instanceAccountGroupBox">
<property name="title">
<string>Override default account</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_15">
<item>
<layout class="QGridLayout" name="instanceAccountLayout">
<item row="0" column="0">
<widget class="QLabel" name="instanceAccountNameLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Account:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QToolButton" name="instanceAccountSelector">
<property name="popupMode">
<enum>QToolButton::InstantPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacerMiscellaneous">
<property name="orientation">
Expand Down