Allow setting no default account
This allows the user to select an account to use every time they launch an instance.
This commit is contained in:
		| @@ -219,6 +219,8 @@ gui/dialogs/CustomMessageBox.h | ||||
| gui/dialogs/CustomMessageBox.cpp | ||||
| gui/dialogs/AccountListDialog.h | ||||
| gui/dialogs/AccountListDialog.cpp | ||||
| gui/dialogs/AccountSelectDialog.h | ||||
| gui/dialogs/AccountSelectDialog.cpp | ||||
|  | ||||
| # GUI - widgets | ||||
| gui/widgets/InstanceDelegate.h | ||||
| @@ -374,6 +376,7 @@ gui/dialogs/LegacyModEditDialog.ui | ||||
| gui/dialogs/OneSixModEditDialog.ui | ||||
| gui/dialogs/EditNotesDialog.ui | ||||
| gui/dialogs/AccountListDialog.ui | ||||
| gui/dialogs/AccountSelectDialog.ui | ||||
|  | ||||
| # Widgets/other | ||||
| gui/widgets/MCModInfoFrame.ui | ||||
|   | ||||
| @@ -58,6 +58,7 @@ | ||||
| #include "gui/dialogs/EditNotesDialog.h" | ||||
| #include "gui/dialogs/CopyInstanceDialog.h" | ||||
| #include "gui/dialogs/AccountListDialog.h" | ||||
| #include "gui/dialogs/AccountSelectDialog.h" | ||||
|  | ||||
| #include "gui/ConsoleWindow.h" | ||||
|  | ||||
| @@ -627,19 +628,21 @@ void MainWindow::doLogin(const QString &errorMsg) | ||||
| 	} | ||||
| 	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 no default account is set, ask the user which one to use. | ||||
| 		AccountSelectDialog selectDialog(tr("Which account would you like to use?"), | ||||
| 				AccountSelectDialog::GlobalDefaultCheckbox, this); | ||||
|  | ||||
| 		if (reply == QMessageBox::Yes) | ||||
| 		{ | ||||
| 			// Open the account manager. | ||||
| 			on_actionManageAccounts_triggered(); | ||||
| 		} | ||||
| 		selectDialog.exec(); | ||||
|  | ||||
| 		// Launch the instance with the selected account. | ||||
| 		account = selectDialog.selectedAccount(); | ||||
|  | ||||
| 		// If the user said to use the account as default, do that. | ||||
| 		if (selectDialog.useAsGlobalDefault() && account.get() != nullptr) | ||||
| 			accounts->setActiveAccount(account->username()); | ||||
| 	} | ||||
| 	else | ||||
|  | ||||
| 	if (account.get() != nullptr) | ||||
| 	{ | ||||
| 		// We'll need to validate the access token to make sure the account is still logged in. | ||||
| 		// TODO: Do that ^ | ||||
|   | ||||
| @@ -25,6 +25,7 @@ | ||||
|  | ||||
| #include <gui/dialogs/LoginDialog.h> | ||||
| #include <gui/dialogs/ProgressDialog.h> | ||||
| #include <gui/dialogs/AccountSelectDialog.h> | ||||
|  | ||||
| #include <MultiMC.h> | ||||
|  | ||||
| @@ -37,6 +38,14 @@ AccountListDialog::AccountListDialog(QWidget *parent) : | ||||
| 	m_accounts = MMC->accounts(); | ||||
| 	// TODO: Make the "Active?" column show checkboxes or radio buttons. | ||||
| 	ui->listView->setModel(m_accounts.get()); | ||||
|  | ||||
| 	QItemSelectionModel* selectionModel = ui->listView->selectionModel(); | ||||
| 	connect(selectionModel, &QItemSelectionModel::selectionChanged,  | ||||
| 			[this] (const QItemSelection& sel, const QItemSelection& dsel) { updateButtonStates(); }); | ||||
| 	connect(m_accounts.get(), &MojangAccountList::listChanged, | ||||
| 			[this] () { updateButtonStates(); }); | ||||
|  | ||||
| 	updateButtonStates(); | ||||
| } | ||||
|  | ||||
| AccountListDialog::~AccountListDialog() | ||||
| @@ -67,7 +76,7 @@ void AccountListDialog::on_editAccountBtn_clicked() | ||||
| 	// TODO | ||||
| } | ||||
|  | ||||
| void AccountListDialog::on_setActiveBtn_clicked() | ||||
| void AccountListDialog::on_setDefaultBtn_clicked() | ||||
| { | ||||
| 	QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); | ||||
| 	if (selection.size() > 0) | ||||
| @@ -80,11 +89,28 @@ void AccountListDialog::on_setActiveBtn_clicked() | ||||
| 	}	 | ||||
| } | ||||
|  | ||||
| void AccountListDialog::on_noDefaultBtn_clicked() | ||||
| { | ||||
| 	m_accounts->setActiveAccount(""); | ||||
| } | ||||
|  | ||||
| void AccountListDialog::on_closeBtnBox_rejected() | ||||
| { | ||||
| 	close(); | ||||
| } | ||||
|  | ||||
| void AccountListDialog::updateButtonStates() | ||||
| { | ||||
| 	// If there is no selection, disable buttons that require something selected. | ||||
| 	QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); | ||||
|  | ||||
| 	ui->rmAccountBtn->setEnabled(selection.size() > 0); | ||||
| 	ui->editAccountBtn->setEnabled(selection.size() > 0); | ||||
| 	ui->setDefaultBtn->setEnabled(selection.size() > 0); | ||||
| 	 | ||||
| 	ui->noDefaultBtn->setDown(m_accounts->activeAccount().get() == nullptr); | ||||
| } | ||||
|  | ||||
| void AccountListDialog::doLogin(const QString& errMsg) | ||||
| { | ||||
| 	// TODO: We can use the login dialog for this for now, but we'll have to make something better for it eventually. | ||||
|   | ||||
| @@ -42,11 +42,16 @@ slots: | ||||
|  | ||||
| 	void on_editAccountBtn_clicked(); | ||||
|  | ||||
| 	void on_setActiveBtn_clicked(); | ||||
| 	void on_setDefaultBtn_clicked(); | ||||
|  | ||||
| 	void on_noDefaultBtn_clicked(); | ||||
|  | ||||
| 	// This will be sent when the "close" button is clicked. | ||||
| 	void on_closeBtnBox_rejected(); | ||||
|  | ||||
| 	//! Updates the states of the dialog's buttons. | ||||
| 	void updateButtonStates(); | ||||
|  | ||||
| signals: | ||||
| 	void activeAccountChanged(); | ||||
|  | ||||
|   | ||||
| @@ -66,12 +66,22 @@ | ||||
|         </spacer> | ||||
|        </item> | ||||
|        <item> | ||||
|         <widget class="QPushButton" name="setActiveBtn"> | ||||
|         <widget class="QPushButton" name="setDefaultBtn"> | ||||
|          <property name="toolTip"> | ||||
|           <string><html><head/><body><p>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).</p></body></html></string> | ||||
|          </property> | ||||
|          <property name="text"> | ||||
|           <string>&Set Active</string> | ||||
|           <string>&Set Default</string> | ||||
|          </property> | ||||
|         </widget> | ||||
|        </item> | ||||
|        <item> | ||||
|         <widget class="QPushButton" name="noDefaultBtn"> | ||||
|          <property name="toolTip"> | ||||
|           <string>Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set.</string> | ||||
|          </property> | ||||
|          <property name="text"> | ||||
|           <string>&No Default</string> | ||||
|          </property> | ||||
|         </widget> | ||||
|        </item> | ||||
|   | ||||
							
								
								
									
										89
									
								
								gui/dialogs/AccountSelectDialog.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								gui/dialogs/AccountSelectDialog.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| /* Copyright 2013 MultiMC Contributors | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #include "AccountSelectDialog.h" | ||||
| #include "ui_AccountSelectDialog.h" | ||||
|  | ||||
| #include <QItemSelectionModel> | ||||
|  | ||||
| #include <logger/QsLog.h> | ||||
|  | ||||
| #include <logic/auth/AuthenticateTask.h> | ||||
|  | ||||
| #include <gui/dialogs/LoginDialog.h> | ||||
| #include <gui/dialogs/ProgressDialog.h> | ||||
|  | ||||
| #include <MultiMC.h> | ||||
|  | ||||
| AccountSelectDialog::AccountSelectDialog(const QString& message, int flags, QWidget *parent) : | ||||
| 	QDialog(parent), | ||||
| 	ui(new Ui::AccountSelectDialog) | ||||
| { | ||||
| 	ui->setupUi(this); | ||||
|  | ||||
| 	m_accounts = MMC->accounts(); | ||||
| 	ui->listView->setModel(m_accounts.get()); | ||||
| 	ui->listView->hideColumn(MojangAccountList::ActiveColumn); | ||||
|  | ||||
| 	// Set the message label. | ||||
| 	ui->msgLabel->setVisible(!message.isEmpty()); | ||||
| 	ui->msgLabel->setText(message); | ||||
|  | ||||
| 	// Flags... | ||||
| 	ui->globalDefaultCheck->setVisible(flags & GlobalDefaultCheckbox); | ||||
| 	ui->instDefaultCheck->setVisible(flags & InstanceDefaultCheckbox); | ||||
| 	QLOG_DEBUG() << flags; | ||||
|  | ||||
| 	// Select the first entry in the list. | ||||
| 	ui->listView->setCurrentIndex(ui->listView->model()->index(0, 0)); | ||||
| } | ||||
|  | ||||
| AccountSelectDialog::~AccountSelectDialog() | ||||
| { | ||||
| 	delete ui; | ||||
| } | ||||
|  | ||||
| MojangAccountPtr AccountSelectDialog::selectedAccount() const | ||||
| { | ||||
| 	return m_selected; | ||||
| } | ||||
|  | ||||
| bool AccountSelectDialog::useAsGlobalDefault() const | ||||
| { | ||||
| 	return ui->globalDefaultCheck->isChecked(); | ||||
| } | ||||
|  | ||||
| bool AccountSelectDialog::useAsInstDefaullt() const | ||||
| { | ||||
| 	return ui->instDefaultCheck->isChecked(); | ||||
| } | ||||
|  | ||||
| void AccountSelectDialog::on_buttonBox_accepted() | ||||
| { | ||||
| 	QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); | ||||
| 	if (selection.size() > 0) | ||||
| 	{ | ||||
| 		QModelIndex selected = selection.first(); | ||||
| 		MojangAccountPtr account = selected.data(MojangAccountList::PointerRole).value<MojangAccountPtr>(); | ||||
| 		m_selected = account; | ||||
| 	} | ||||
| 	close(); | ||||
| } | ||||
|  | ||||
| void AccountSelectDialog::on_buttonBox_rejected() | ||||
| { | ||||
| 	close(); | ||||
| } | ||||
|  | ||||
							
								
								
									
										90
									
								
								gui/dialogs/AccountSelectDialog.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								gui/dialogs/AccountSelectDialog.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| /* Copyright 2013 MultiMC Contributors | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *     http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <QDialog> | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "logic/lists/MojangAccountList.h" | ||||
|  | ||||
| namespace Ui { | ||||
| class AccountSelectDialog; | ||||
| } | ||||
|  | ||||
| class AccountSelectDialog : public QDialog | ||||
| { | ||||
| Q_OBJECT | ||||
| public: | ||||
| 	enum Flags | ||||
| 	{ | ||||
| 		NoFlags=0, | ||||
|  | ||||
| 		/*! | ||||
| 		 * Shows a check box on the dialog that allows the user to specify that the account | ||||
| 		 * they've selected should be used as the global default for all instances. | ||||
| 		 */ | ||||
| 		GlobalDefaultCheckbox, | ||||
|  | ||||
| 		/*! | ||||
| 		 * Shows a check box on the dialog that allows the user to specify that the account | ||||
| 		 * they've selected should be used as the default for the instance they are currently launching. | ||||
| 		 * This is not currently implemented. | ||||
| 		 */ | ||||
| 		InstanceDefaultCheckbox, | ||||
| 	}; | ||||
|  | ||||
| 	/*! | ||||
| 	 * Constructs a new account select dialog with the given parent and message. | ||||
| 	 * The message will be shown at the top of the dialog. It is an empty string by default. | ||||
| 	 */ | ||||
| 	explicit AccountSelectDialog(const QString& message="", int flags=0, QWidget *parent = 0); | ||||
| 	~AccountSelectDialog(); | ||||
|  | ||||
| 	/*! | ||||
| 	 * Gets a pointer to the account that the user selected. | ||||
| 	 * This is null if the user clicked cancel or hasn't clicked OK yet. | ||||
| 	 */ | ||||
| 	MojangAccountPtr selectedAccount() const; | ||||
|  | ||||
| 	/*! | ||||
| 	 * Returns true if the user checked the "use as global default" checkbox. | ||||
| 	 * If the checkbox wasn't shown, this function returns false. | ||||
| 	 */ | ||||
| 	bool useAsGlobalDefault() const; | ||||
|  | ||||
| 	/*! | ||||
| 	 * Returns true if the user checked the "use as instance default" checkbox. | ||||
| 	 * If the checkbox wasn't shown, this function returns false. | ||||
| 	 */ | ||||
| 	bool useAsInstDefaullt() const; | ||||
|  | ||||
| public | ||||
| slots: | ||||
| 	void on_buttonBox_accepted(); | ||||
| 	 | ||||
| 	void on_buttonBox_rejected(); | ||||
|  | ||||
| protected: | ||||
| 	std::shared_ptr<MojangAccountList> m_accounts; | ||||
|  | ||||
| 	//! The account that was selected when the user clicked OK. | ||||
| 	MojangAccountPtr m_selected; | ||||
|  | ||||
| private: | ||||
| 	Ui::AccountSelectDialog *ui; | ||||
| }; | ||||
|  | ||||
							
								
								
									
										56
									
								
								gui/dialogs/AccountSelectDialog.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								gui/dialogs/AccountSelectDialog.ui
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>AccountSelectDialog</class> | ||||
|  <widget class="QDialog" name="AccountSelectDialog"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>413</width> | ||||
|     <height>300</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Select an Account</string> | ||||
|   </property> | ||||
|   <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|    <item> | ||||
|     <widget class="QLabel" name="msgLabel"> | ||||
|      <property name="text"> | ||||
|       <string>Select an account.</string> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QTreeView" name="listView"/> | ||||
|    </item> | ||||
|    <item> | ||||
|     <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="globalDefaultCheck"> | ||||
|        <property name="text"> | ||||
|         <string>Use as default?</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QCheckBox" name="instDefaultCheck"> | ||||
|        <property name="text"> | ||||
|         <string>Use as default for this instance only?</string> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QDialogButtonBox" name="buttonBox"> | ||||
|      <property name="standardButtons"> | ||||
|       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | ||||
|      </property> | ||||
|     </widget> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
| @@ -93,9 +93,16 @@ MojangAccountPtr MojangAccountList::activeAccount() const | ||||
| void MojangAccountList::setActiveAccount(const QString& username) | ||||
| { | ||||
| 	beginResetModel(); | ||||
| 	for (MojangAccountPtr account : m_accounts) | ||||
| 		if (account->username() == username) | ||||
| 			m_activeAccount = username; | ||||
| 	if (username.isEmpty()) | ||||
| 	{ | ||||
| 		m_activeAccount = ""; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		for (MojangAccountPtr account : m_accounts) | ||||
| 			if (account->username() == username) | ||||
| 				m_activeAccount = username; | ||||
| 	} | ||||
| 	endResetModel(); | ||||
| 	onListChanged(); | ||||
| } | ||||
|   | ||||
| @@ -122,6 +122,7 @@ public: | ||||
|  | ||||
| 	/*! | ||||
| 	 * Sets the given account as the current active account. | ||||
| 	 * If the username given is an empty string, sets the active account to nothing. | ||||
| 	 */ | ||||
| 	virtual void setActiveAccount(const QString& username); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user