diff options
-rw-r--r-- | MultiMC.cpp | 4 | ||||
-rw-r--r-- | gui/dialogs/SettingsDialog.cpp | 90 | ||||
-rw-r--r-- | gui/dialogs/SettingsDialog.h | 18 | ||||
-rw-r--r-- | gui/dialogs/SettingsDialog.ui | 38 | ||||
-rw-r--r-- | logic/updater/UpdateChecker.cpp | 7 | ||||
-rw-r--r-- | logic/updater/UpdateChecker.h | 2 |
6 files changed, 126 insertions, 33 deletions
diff --git a/MultiMC.cpp b/MultiMC.cpp index b105fd66..9807a0c2 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -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 diff --git a/gui/dialogs/SettingsDialog.cpp b/gui/dialogs/SettingsDialog.cpp index 9362075e..549b11b0 100644 --- a/gui/dialogs/SettingsDialog.cpp +++ b/gui/dialogs/SettingsDialog.cpp @@ -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 - - // Warn about dev builds. - if (!ui->devBuildsCheckBox->isChecked()) + // 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))); + + 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.")); } } + diff --git a/gui/dialogs/SettingsDialog.h b/gui/dialogs/SettingsDialog.h index 11fdb696..df67d492 100644 --- a/gui/dialogs/SettingsDialog.h +++ b/gui/dialogs/SettingsDialog.h @@ -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; }; diff --git a/gui/dialogs/SettingsDialog.ui b/gui/dialogs/SettingsDialog.ui index dbc8ca88..12db55a4 100644 --- a/gui/dialogs/SettingsDialog.ui +++ b/gui/dialogs/SettingsDialog.ui @@ -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> diff --git a/logic/updater/UpdateChecker.cpp b/logic/updater/UpdateChecker.cpp index d0795c0d..acf74f40 100644 --- a/logic/updater/UpdateChecker.cpp +++ b/logic/updater/UpdateChecker.cpp @@ -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. diff --git a/logic/updater/UpdateChecker.h b/logic/updater/UpdateChecker.h index a47e8903..7840cedc 100644 --- a/logic/updater/UpdateChecker.h +++ b/logic/updater/UpdateChecker.h @@ -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; |