Implement changing update channels
Allow the user to select which update channel they would like to download updates from.
This commit is contained in:
		| @@ -352,8 +352,10 @@ void MultiMC::initGlobalSettings() | ||||
| { | ||||
| 	m_settings.reset(new INISettingsObject("multimc.cfg", this)); | ||||
| 	// Updates | ||||
| 	m_settings->registerSetting("UseDevBuilds", false); | ||||
| 	m_settings->registerSetting("UpdateChannel", version().channel); | ||||
| 	m_settings->registerSetting("AutoUpdate", true); | ||||
| 	 | ||||
| 	// Notifications | ||||
| 	m_settings->registerSetting("ShownNotifications", QString()); | ||||
|  | ||||
| 	// FTB | ||||
|   | ||||
| @@ -27,6 +27,8 @@ | ||||
| #include "logic/lists/JavaVersionList.h" | ||||
| #include <logic/JavaChecker.h> | ||||
|  | ||||
| #include "logic/updater/UpdateChecker.h" | ||||
|  | ||||
| #include <settingsobject.h> | ||||
| #include <pathutils.h> | ||||
| #include <QFileDialog> | ||||
| @@ -48,6 +50,17 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::Se | ||||
|  | ||||
| 	loadSettings(MMC->settings().get()); | ||||
| 	updateCheckboxStuff(); | ||||
|  | ||||
| 	QObject::connect(MMC->updateChecker().get(), &UpdateChecker::channelListLoaded, this, &SettingsDialog::refreshUpdateChannelList); | ||||
|  | ||||
| 	if (MMC->updateChecker()->hasChannels()) | ||||
| 	{ | ||||
| 		refreshUpdateChannelList(); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		MMC->updateChecker()->updateChanList(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| SettingsDialog::~SettingsDialog() | ||||
| @@ -197,30 +210,72 @@ void SettingsDialog::on_buttonBox_rejected() | ||||
| 	MMC->settings()->set("SettingsGeometry", saveGeometry().toBase64()); | ||||
| } | ||||
|  | ||||
| void SettingsDialog::applySettings(SettingsObject *s) | ||||
| void SettingsDialog::refreshUpdateChannelList() | ||||
| { | ||||
| 	// Special cases | ||||
| 	// Stop listening for selection changes. It's going to change a lot while we update it and we don't need to update the | ||||
| 	// description label constantly. | ||||
| 	QObject::disconnect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateChannelSelectionChanged(int))); | ||||
|  | ||||
| 	// Warn about dev builds. | ||||
| 	if (!ui->devBuildsCheckBox->isChecked()) | ||||
| 	QList<UpdateChecker::ChannelListEntry> channelList = MMC->updateChecker()->getChannelList(); | ||||
| 	ui->updateChannelComboBox->clear(); | ||||
| 	int selection = -1; | ||||
| 	for (int i = 0; i < channelList.count(); i++) | ||||
| 	{ | ||||
| 		s->set("UseDevBuilds", false); | ||||
| 	} | ||||
| 	else if (!s->get("UseDevBuilds").toBool()) | ||||
| 	{ | ||||
| 		auto response = CustomMessageBox::selectable( | ||||
| 			this, tr("Development builds"), | ||||
| 			tr("Development builds contain experimental features " | ||||
| 			   "and may be unstable. Are you sure you want to enable them?"), | ||||
| 			QMessageBox::Question, QMessageBox::Yes | QMessageBox::No)->exec(); | ||||
| 		if (response == QMessageBox::Yes) | ||||
| 		UpdateChecker::ChannelListEntry entry = channelList.at(i); | ||||
| 		 | ||||
| 		// When it comes to selection, we'll rely on the indexes of a channel entry being the same in the | ||||
| 		// combo box as it is in the update checker's channel list. | ||||
| 		// This probably isn't very safe, but the channel list doesn't change often enough (or at all) for | ||||
| 		// this to be a big deal. Hope it doesn't break... | ||||
| 		ui->updateChannelComboBox->addItem(entry.name); | ||||
|  | ||||
| 		// If the update channel we just added was the selected one, set the current index in the combo box to it. | ||||
| 		if (entry.id == m_currentUpdateChannel) | ||||
| 		{ | ||||
| 			s->set("UseDevBuilds", true); | ||||
| 			QLOG_DEBUG() << "Selected index" << i << "channel id" << m_currentUpdateChannel; | ||||
| 			selection = i; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	ui->updateChannelComboBox->setCurrentIndex(selection); | ||||
|  | ||||
| 	// Start listening for selection changes again and update the description label. | ||||
| 	QObject::connect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateChannelSelectionChanged(int))); | ||||
| 	refreshUpdateChannelDesc(); | ||||
|  | ||||
| 	// Now that we've updated the channel list, we can enable the combo box. | ||||
| 	// It starts off disabled so that if the channel list hasn't been loaded, it will be disabled. | ||||
| 	ui->updateChannelComboBox->setEnabled(true); | ||||
| } | ||||
|  | ||||
| void SettingsDialog::updateChannelSelectionChanged(int index) | ||||
| { | ||||
| 	refreshUpdateChannelDesc(); | ||||
| } | ||||
|  | ||||
| void SettingsDialog::refreshUpdateChannelDesc() | ||||
| { | ||||
| 	// Get the channel list. | ||||
| 	QList<UpdateChecker::ChannelListEntry> channelList = MMC->updateChecker()->getChannelList(); | ||||
| 	int selectedIndex = ui->updateChannelComboBox->currentIndex(); | ||||
| 	if (selectedIndex < channelList.count()) | ||||
| 	{ | ||||
| 		// Find the channel list entry with the given index. | ||||
| 		UpdateChecker::ChannelListEntry selected = channelList.at(selectedIndex); | ||||
|  | ||||
| 		// Set the description text. | ||||
| 		ui->updateChannelDescLabel->setText(selected.description); | ||||
|  | ||||
| 		// Set the currently selected channel ID. | ||||
| 		m_currentUpdateChannel = selected.id; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void SettingsDialog::applySettings(SettingsObject *s) | ||||
| { | ||||
| 	// Updates | ||||
| 	s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked()); | ||||
| 	s->set("UpdateChannel", m_currentUpdateChannel); | ||||
|  | ||||
| 	// FTB | ||||
| 	s->set("TrackFTBInstances", ui->trackFtbBox->isChecked()); | ||||
| @@ -288,7 +343,7 @@ void SettingsDialog::loadSettings(SettingsObject *s) | ||||
| { | ||||
| 	// Updates | ||||
| 	ui->autoUpdateCheckBox->setChecked(s->get("AutoUpdate").toBool()); | ||||
| 	ui->devBuildsCheckBox->setChecked(s->get("UseDevBuilds").toBool()); | ||||
| 	m_currentUpdateChannel = s->get("UpdateChannel").toString(); | ||||
|  | ||||
| 	// FTB | ||||
| 	ui->trackFtbBox->setChecked(s->get("TrackFTBInstances").toBool()); | ||||
| @@ -392,3 +447,4 @@ void SettingsDialog::checkFinished(JavaCheckResult result) | ||||
| 			   "or set the path to the java executable.")); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -74,7 +74,25 @@ slots: | ||||
| 	void on_javaBrowseBtn_clicked(); | ||||
|  | ||||
| 	void checkFinished(JavaCheckResult result); | ||||
|  | ||||
| 	/*! | ||||
| 	 * Updates the list of update channels in the combo box. | ||||
| 	 */ | ||||
| 	void refreshUpdateChannelList(); | ||||
|  | ||||
| 	/*! | ||||
| 	 * Updates the channel description label. | ||||
| 	 */ | ||||
| 	void refreshUpdateChannelDesc(); | ||||
|  | ||||
|     void updateChannelSelectionChanged(int index); | ||||
|  | ||||
| private: | ||||
| 	Ui::SettingsDialog *ui; | ||||
| 	std::shared_ptr<JavaChecker> checker; | ||||
|  | ||||
| 	/*! | ||||
| 	 * Stores the currently selected update channel. | ||||
| 	 */ | ||||
| 	QString m_currentUpdateChannel; | ||||
| }; | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>526</width> | ||||
|     <height>628</height> | ||||
|     <height>639</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="sizePolicy"> | ||||
| @@ -77,14 +77,7 @@ | ||||
|          <property name="title"> | ||||
|           <string>Update Settings</string> | ||||
|          </property> | ||||
|          <layout class="QVBoxLayout" name="updateSettingsBoxLayout"> | ||||
|           <item> | ||||
|            <widget class="QCheckBox" name="devBuildsCheckBox"> | ||||
|             <property name="text"> | ||||
|              <string>Use development builds?</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|          <layout class="QVBoxLayout" name="verticalLayout_7"> | ||||
|           <item> | ||||
|            <widget class="QCheckBox" name="autoUpdateCheckBox"> | ||||
|             <property name="text"> | ||||
| @@ -92,6 +85,31 @@ | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item> | ||||
|            <layout class="QVBoxLayout" name="channelVerticalLayout"> | ||||
|             <item> | ||||
|              <widget class="QLabel" name="updateChannelLabel"> | ||||
|               <property name="text"> | ||||
|                <string>Update Channel:</string> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|             <item> | ||||
|              <widget class="QComboBox" name="updateChannelComboBox"> | ||||
|               <property name="enabled"> | ||||
|                <bool>false</bool> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|             <item> | ||||
|              <widget class="QLabel" name="updateChannelDescLabel"> | ||||
|               <property name="text"> | ||||
|                <string>No channel selected.</string> | ||||
|               </property> | ||||
|              </widget> | ||||
|             </item> | ||||
|            </layout> | ||||
|           </item> | ||||
|          </layout> | ||||
|         </widget> | ||||
|        </item> | ||||
| @@ -644,11 +662,9 @@ | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <tabstops> | ||||
|   <tabstop>settingsTab</tabstop> | ||||
|   <tabstop>buttonBox</tabstop> | ||||
|   <tabstop>sortLastLaunchedBtn</tabstop> | ||||
|   <tabstop>sortByNameBtn</tabstop> | ||||
|   <tabstop>devBuildsCheckBox</tabstop> | ||||
|   <tabstop>autoUpdateCheckBox</tabstop> | ||||
|   <tabstop>instDirTextBox</tabstop> | ||||
|   <tabstop>modsDirTextBox</tabstop> | ||||
|   | ||||
| @@ -24,6 +24,8 @@ | ||||
| #include <QJsonArray> | ||||
| #include <QJsonValue> | ||||
|  | ||||
| #include <settingsobject.h> | ||||
|  | ||||
| #define API_VERSION 0 | ||||
| #define CHANLIST_FORMAT 0 | ||||
|  | ||||
| @@ -70,9 +72,8 @@ void UpdateChecker::checkForUpdate(bool notifyNoUpdate) | ||||
|  | ||||
| 	m_updateChecking = true; | ||||
|  | ||||
| 	// Get the URL for the channel we're using. | ||||
| 	// TODO: Allow user to select channels. For now, we'll just use the current channel. | ||||
| 	QString updateChannel = m_currentChannel; | ||||
| 	// Get the channel we're checking. | ||||
| 	QString updateChannel = MMC->settings()->get("UpdateChannel").toString(); | ||||
|  | ||||
| 	// Find the desired channel within the channel list and get its repo URL. If if cannot be | ||||
| 	// found, error. | ||||
|   | ||||
| @@ -54,7 +54,7 @@ public: | ||||
| 	QList<ChannelListEntry> getChannelList() const; | ||||
|  | ||||
| 	/*! | ||||
| 	 * Returns true if the channel list is empty. | ||||
| 	 * Returns false if the channel list is empty. | ||||
| 	 */ | ||||
| 	bool hasChannels() const; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user