diff --git a/CMakeLists.txt b/CMakeLists.txt index df7ebc64..1a9bd32c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ SET(MultiMC_NEWS_RSS_URL "http://multimc.org/rss.xml" CACHE STRING "URL to fetch ######## Set version numbers ######## -SET(MultiMC_VERSION_MAJOR 1) +SET(MultiMC_VERSION_MAJOR 0) SET(MultiMC_VERSION_MINOR 0) # Build number @@ -148,7 +148,7 @@ SET(MultiMC_UPDATER false CACHE BOOL "Whether or not the update system is enable SET(MultiMC_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.") # Build a version string to display in the configure logs. -SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}") +SET(MultiMC_VERSION_STRING "5.${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}") IF (MultiMC_VERSION_BUILD GREATER -1) SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_STRING}.${MultiMC_VERSION_BUILD}") ENDIF () diff --git a/MultiMC.cpp b/MultiMC.cpp index 2bc77e0f..a13ad794 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -346,8 +346,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/MultiMCVersion.h b/MultiMCVersion.h index 8978516b..75e017df 100644 --- a/MultiMCVersion.h +++ b/MultiMCVersion.h @@ -28,7 +28,7 @@ struct MultiMCVersion */ QString toString() const { - QString vstr = QString("%1.%2").arg( + QString vstr = QString("5.%1.%2").arg( QString::number(major), QString::number(minor)); diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 35c4ee15..968fecb7 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -166,6 +166,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi view->setFrameShape(QFrame::NoFrame); view->setModel(proxymodel); + view->setContextMenuPolicy(Qt::CustomContextMenu); + connect(view, SIGNAL(customContextMenuRequested(const QPoint&)), + this, SLOT(showInstanceContextMenu(const QPoint&))); + ui->horizontalLayout->addWidget(view); } // The cat background @@ -315,6 +319,29 @@ MainWindow::~MainWindow() delete drawer; } +void MainWindow::showInstanceContextMenu(const QPoint& pos) +{ + if(!view->indexAt(pos).isValid()) + { + return; + } + + QList actions = ui->instanceToolBar->actions(); + + // HACK: Filthy rename button hack because the instance view is getting rewritten anyway + QAction *actionRename; + actionRename = new QAction(tr("Rename"), this); + actionRename->setToolTip(ui->actionRenameInstance->toolTip()); + + connect(actionRename, SIGNAL(triggered(bool)), SLOT(on_actionRenameInstance_triggered())); + + actions.replace(1, actionRename); + + QMenu myMenu; + myMenu.addActions(actions); + myMenu.exec(view->mapToGlobal(pos)); +} + void MainWindow::repopulateAccountsMenu() { accountMenu->clear(); diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 7089b98b..af2f1dca 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -145,6 +145,8 @@ slots: // called when an icon is changed in the icon model. void iconUpdated(QString); + void showInstanceContextMenu(const QPoint&); + public slots: void instanceActivated(QModelIndex); 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 +#include "logic/updater/UpdateChecker.h" + #include #include #include @@ -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 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 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 checker; + + /*! + * Stores the currently selected update channel. + */ + QString m_currentUpdateChannel; }; diff --git a/gui/dialogs/SettingsDialog.ui b/gui/dialogs/SettingsDialog.ui index dbc8ca88..7d2708cb 100644 --- a/gui/dialogs/SettingsDialog.ui +++ b/gui/dialogs/SettingsDialog.ui @@ -7,7 +7,7 @@ 0 0 526 - 628 + 639 @@ -77,14 +77,7 @@ Update Settings - - - - - Use development builds? - - - + @@ -92,6 +85,31 @@ + + + + + + Update Channel: + + + + + + + false + + + + + + + No channel selected. + + + + + @@ -644,18 +662,25 @@ - settingsTab buttonBox sortLastLaunchedBtn sortByNameBtn - devBuildsCheckBox autoUpdateCheckBox + trackFtbBox + ftbLauncherBox + ftbLauncherBrowseBtn + ftbBox + ftbBrowseBtn instDirTextBox - modsDirTextBox - lwjglDirTextBox instDirBrowseBtn + modsDirTextBox modsDirBrowseBtn + lwjglDirTextBox lwjglDirBrowseBtn + iconsDirTextBox + iconsDirBrowseBtn + jsonEditorTextBox + jsonEditorBrowseBtn maximizedCheckBox windowWidthSpinBox windowHeightSpinBox @@ -665,9 +690,13 @@ maxMemSpinBox permGenSpinBox javaPathTextBox + javaBrowseBtn + javaDetectBtn + javaTestBtn jvmArgsTextBox preLaunchCmdTextBox postExitCmdTextBox + settingsTabs diff --git a/logic/updater/UpdateChecker.cpp b/logic/updater/UpdateChecker.cpp index 9af11cab..489e7769 100644 --- a/logic/updater/UpdateChecker.cpp +++ b/logic/updater/UpdateChecker.cpp @@ -23,6 +23,8 @@ #include #include +#include + #define API_VERSION 0 #define CHANLIST_FORMAT 0 @@ -69,9 +71,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 getChannelList() const; /*! - * Returns true if the channel list is empty. + * Returns false if the channel list is empty. */ bool hasChannels() const;