From aa70ed2244700dbcc93c1fadb22edc1c1caede37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 1 Feb 2015 11:44:47 +0100 Subject: [PATCH] SCRATCH move icons over to Env, instance proxy model to gui --- CMakeLists.txt | 2 ++ MultiMC.cpp | 29 ++++++++++++++--------------- MultiMC.h | 6 ++---- gui/ConsoleWindow.cpp | 2 +- gui/InstanceProxyModel.cpp | 23 +++++++++++++++++++++++ gui/InstanceProxyModel.h | 13 +++++++++++++ gui/MainWindow.cpp | 9 +++++---- gui/MainWindow.h | 2 +- gui/dialogs/CopyInstanceDialog.cpp | 6 +++--- gui/dialogs/IconPickerDialog.cpp | 8 ++++---- gui/dialogs/NewInstanceDialog.cpp | 4 ++-- gui/pages/VersionPage.cpp | 2 +- logic/BaseInstance.cpp | 3 +-- logic/Env.cpp | 6 ++++++ logic/Env.h | 4 ++++ logic/InstanceList.cpp | 22 +--------------------- logic/InstanceList.h | 9 --------- logic/LegacyInstance.cpp | 2 +- logic/OneSixInstance.cpp | 2 +- logic/ftb/FTBPlugin.cpp | 2 +- logic/icons/IconList.cpp | 7 ++++--- logic/icons/IconList.h | 3 ++- 22 files changed, 92 insertions(+), 74 deletions(-) create mode 100644 gui/InstanceProxyModel.cpp create mode 100644 gui/InstanceProxyModel.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 40bb61fd..3fc3240b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -283,6 +283,8 @@ SET(MULTIMC_SOURCES gui/GuiUtil.cpp gui/ColumnResizer.h gui/ColumnResizer.cpp + gui/InstanceProxyModel.h + gui/InstanceProxyModel.cpp # GUI - windows gui/MainWindow.h diff --git a/MultiMC.cpp b/MultiMC.cpp index 0b34d606..80a4593c 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -194,6 +194,9 @@ MultiMC::MultiMC(int &argc, char **argv, bool test_mode) : QApplication(argc, ar m_translationChecker.reset(new TranslationDownloader()); + // load icons + initIcons(); + // and instances auto InstDirSetting = m_settings->getSetting("InstanceDir"); // instance path: check for problems with '!' in instance path and warn the user in the log @@ -307,6 +310,17 @@ void MultiMC::initTranslations() } } +void MultiMC::initIcons() +{ + auto setting = MMC->settings()->getSetting("IconsDir"); + ENV.m_icons.reset(new IconList(QString(":/icons/instances/"), setting->get().toString())); + connect(setting.get(), &Setting::SettingChanged,[&](const Setting &, QVariant value) + { + ENV.m_icons->directoryChanged(value.toString()); + }); +} + + void moveFile(const QString &oldName, const QString &newName) { QFile::remove(newName); @@ -448,21 +462,6 @@ void MultiMC::initGlobalSettings(bool test_mode) m_settings->registerSetting("PagedGeometry", ""); } -std::shared_ptr MultiMC::icons() -{ - if (!m_icons) - { - - auto setting = MMC->settings()->getSetting("IconsDir"); - m_icons.reset(new IconList(setting->get().toString())); - connect(setting.get(), &Setting::SettingChanged,[&](const Setting &, QVariant value) - { - m_icons->directoryChanged(value.toString()); - }); - } - return m_icons; -} - std::shared_ptr MultiMC::lwjgllist() { if (!m_lwjgllist) diff --git a/MultiMC.h b/MultiMC.h index ccf950d1..ba8563e7 100644 --- a/MultiMC.h +++ b/MultiMC.h @@ -64,9 +64,6 @@ public: // InstanceList, OneSixUpdate, MinecraftInstance, OneSixProfileStrategy std::shared_ptr minecraftlist(); - // LegacyInstance, BaseInstance, OneSixInstance, InstanceList - std::shared_ptr icons(); - QIcon getThemedIcon(const QString& name); void setIconTheme(const QString& name); @@ -152,6 +149,8 @@ private slots: private: void initLogger(); + void initIcons(); + void initGlobalSettings(bool test_mode); void initTranslations(); @@ -166,7 +165,6 @@ private: std::shared_ptr m_instances; std::shared_ptr m_updateChecker; std::shared_ptr m_accounts; - std::shared_ptr m_icons; std::shared_ptr m_lwjgllist; std::shared_ptr m_forgelist; std::shared_ptr m_liteloaderlist; diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index ad3c2636..1f7c63cf 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -59,7 +59,7 @@ ConsoleWindow::ConsoleWindow(BaseProcess *process, QWidget *parent) setAttribute(Qt::WA_DeleteOnClose); auto instance = m_proc->instance(); - auto icon = MMC->icons()->getIcon(instance->iconKey()); + auto icon = ENV.icons()->getIcon(instance->iconKey()); QString windowTitle = tr("Console window for ") + instance->name(); // Set window properties diff --git a/gui/InstanceProxyModel.cpp b/gui/InstanceProxyModel.cpp new file mode 100644 index 00000000..09d6fd85 --- /dev/null +++ b/gui/InstanceProxyModel.cpp @@ -0,0 +1,23 @@ +#include "InstanceProxyModel.h" +#include "MultiMC.h" +#include + +InstanceProxyModel::InstanceProxyModel(QObject *parent) : GroupedProxyModel(parent) +{ +} + +bool InstanceProxyModel::subSortLessThan(const QModelIndex &left, + const QModelIndex &right) const +{ + BaseInstance *pdataLeft = static_cast(left.internalPointer()); + BaseInstance *pdataRight = static_cast(right.internalPointer()); + QString sortMode = MMC->settings()->get("InstSortMode").toString(); + if (sortMode == "LastLaunch") + { + return pdataLeft->lastLaunch() > pdataRight->lastLaunch(); + } + else + { + return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0; + } +} diff --git a/gui/InstanceProxyModel.h b/gui/InstanceProxyModel.h new file mode 100644 index 00000000..e558efc4 --- /dev/null +++ b/gui/InstanceProxyModel.h @@ -0,0 +1,13 @@ +#include "groupview/GroupedProxyModel.h" + +/** + * A proxy model that is responsible for sorting instances into groups + */ +class InstanceProxyModel : public GroupedProxyModel +{ +public: + explicit InstanceProxyModel(QObject *parent = 0); + +protected: + virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const; +}; diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 8aa2e635..fb3bfd6f 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -331,6 +331,7 @@ namespace Ui { #include "gui/groupview/GroupView.h" #include "gui/groupview/InstanceDelegate.h" +#include "gui/InstanceProxyModel.h" #include "gui/Platform.h" @@ -503,7 +504,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi SLOT(instanceChanged(const QModelIndex &, const QModelIndex &))); // track icon changes and update the toolbar! - connect(MMC->icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString))); + connect(ENV.icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString))); // model reset -> selection is invalid. All the instance pointers are wrong. // FIXME: stop using POINTERS everywhere @@ -1277,7 +1278,7 @@ void MainWindow::on_actionChangeInstIcon_triggered() if (dlg.result() == QDialog::Accepted) { m_selectedInstance->setIconKey(dlg.selectedIconKey); - auto ico = MMC->icons()->getBigIcon(dlg.selectedIconKey); + auto ico = ENV.icons()->getBigIcon(dlg.selectedIconKey); ui->actionChangeInstIcon->setIcon(ico); } } @@ -1286,14 +1287,14 @@ void MainWindow::iconUpdated(QString icon) { if (icon == m_currentInstIcon) { - ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); + ui->actionChangeInstIcon->setIcon(ENV.icons()->getBigIcon(m_currentInstIcon)); } } void MainWindow::updateInstanceToolIcon(QString new_icon) { m_currentInstIcon = new_icon; - ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); + ui->actionChangeInstIcon->setIcon(ENV.icons()->getBigIcon(m_currentInstIcon)); } void MainWindow::setSelectedInstanceById(const QString &id) diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 875c2f86..cccd9f9c 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -19,7 +19,6 @@ #include #include -#include "logic/InstanceList.h" #include "logic/BaseInstance.h" #include "logic/auth/MojangAccount.h" #include "logic/net/NetJob.h" @@ -27,6 +26,7 @@ class NewsChecker; class NotificationChecker; class QToolButton; +class InstanceProxyModel; class LabeledToolButton; class QLabel; class MinecraftProcess; diff --git a/gui/dialogs/CopyInstanceDialog.cpp b/gui/dialogs/CopyInstanceDialog.cpp index 80418e14..038fb896 100644 --- a/gui/dialogs/CopyInstanceDialog.cpp +++ b/gui/dialogs/CopyInstanceDialog.cpp @@ -29,7 +29,7 @@ #include "logic/icons/IconList.h" #include "logic/tasks/Task.h" #include "logic/BaseInstance.h" -#include +#include "logic/InstanceList.h" CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) :QDialog(parent), ui(new Ui::CopyInstanceDialog), m_original(original) @@ -40,7 +40,7 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) layout()->setSizeConstraint(QLayout::SetFixedSize); InstIconKey = original->iconKey(); - ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey)); ui->instNameTextBox->setText(original->name()); ui->instNameTextBox->setFocus(); auto groups = MMC->instances()->getGroups().toSet(); @@ -91,7 +91,7 @@ void CopyInstanceDialog::on_iconButton_clicked() if (dlg.result() == QDialog::Accepted) { InstIconKey = dlg.selectedIconKey; - ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey)); } } diff --git a/gui/dialogs/IconPickerDialog.cpp b/gui/dialogs/IconPickerDialog.cpp index 2fb50165..90bf2ef4 100644 --- a/gui/dialogs/IconPickerDialog.cpp +++ b/gui/dialogs/IconPickerDialog.cpp @@ -59,7 +59,7 @@ IconPickerDialog::IconPickerDialog(QWidget *parent) contentsWidget->installEventFilter(this); - contentsWidget->setModel(MMC->icons().get()); + contentsWidget->setModel(ENV.icons().get()); auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole); auto buttonRemove = @@ -104,12 +104,12 @@ void IconPickerDialog::addNewIcon() //: The type of icon files QStringList fileNames = QFileDialog::getOpenFileNames(this, selectIcons, QString(), tr("Icons") + "(*.png *.jpg *.jpeg *.ico)"); - MMC->icons()->installIcons(fileNames); + ENV.icons()->installIcons(fileNames); } void IconPickerDialog::removeSelectedIcon() { - MMC->icons()->deleteIcon(selectedIconKey); + ENV.icons()->deleteIcon(selectedIconKey); } void IconPickerDialog::activated(QModelIndex index) @@ -130,7 +130,7 @@ void IconPickerDialog::selectionChanged(QItemSelection selected, QItemSelection int IconPickerDialog::exec(QString selection) { - auto list = MMC->icons(); + auto list = ENV.icons(); auto contentsWidget = ui->iconView; selectedIconKey = selection; diff --git a/gui/dialogs/NewInstanceDialog.cpp b/gui/dialogs/NewInstanceDialog.cpp index bba1f785..86ffc5b8 100644 --- a/gui/dialogs/NewInstanceDialog.cpp +++ b/gui/dialogs/NewInstanceDialog.cpp @@ -66,7 +66,7 @@ NewInstanceDialog::NewInstanceDialog(QWidget *parent) setSelectedVersion(MMC->minecraftlist()->getLatestStable(), true); InstIconKey = "infinity"; - ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey)); ui->modpackEdit->setValidator(new UrlValidator(ui->modpackEdit)); connect(ui->modpackEdit, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState); @@ -181,7 +181,7 @@ void NewInstanceDialog::on_iconButton_clicked() if (dlg.result() == QDialog::Accepted) { InstIconKey = dlg.selectedIconKey; - ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey)); } } diff --git a/gui/pages/VersionPage.cpp b/gui/pages/VersionPage.cpp index 61253c1b..7df0b5c1 100644 --- a/gui/pages/VersionPage.cpp +++ b/gui/pages/VersionPage.cpp @@ -51,7 +51,7 @@ QIcon VersionPage::icon() const { - return MMC->icons()->getIcon(m_inst->iconKey()); + return ENV.icons()->getIcon(m_inst->iconKey()); } bool VersionPage::shouldDisplay() const { diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index ce81b90e..a5fb5f81 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -18,7 +18,6 @@ #include #include -#include "MultiMC.h" #include "logic/settings/INISettingsObject.h" #include "logic/settings/Setting.h" @@ -37,7 +36,7 @@ BaseInstance::BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr s m_settings->registerSetting("name", "Unnamed Instance"); m_settings->registerSetting("iconKey", "default"); - connect(MMC->icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString))); + connect(ENV.icons().get(), SIGNAL(iconUpdated(QString)), SLOT(iconUpdated(QString))); m_settings->registerSetting("notes", ""); m_settings->registerSetting("lastLaunchTime", 0); diff --git a/logic/Env.cpp b/logic/Env.cpp index daf17d65..f10f1951 100644 --- a/logic/Env.cpp +++ b/logic/Env.cpp @@ -1,5 +1,6 @@ #include "Env.h" #include "logic/net/HttpMetaCache.h" +#include "icons/IconList.h" #include #include #include @@ -35,6 +36,11 @@ std::shared_ptr< QNetworkAccessManager > Env::qnam() return m_qnam; } +std::shared_ptr Env::icons() +{ + Q_ASSERT(m_icons != nullptr); + return m_icons; +} void Env::initHttpMetaCache(QString rootPath, QString staticDataPath) { diff --git a/logic/Env.h b/logic/Env.h index 3d560a29..ba2ea869 100644 --- a/logic/Env.h +++ b/logic/Env.h @@ -3,6 +3,7 @@ #include #include +class IconList; class QNetworkAccessManager; class HttpMetaCache; @@ -26,6 +27,8 @@ public: std::shared_ptr metacache(); + std::shared_ptr icons(); + /// init the cache. FIXME: possible future hook point void initHttpMetaCache(QString rootPath, QString staticDataPath); @@ -35,4 +38,5 @@ public: protected: std::shared_ptr m_qnam; std::shared_ptr m_metacache; + std::shared_ptr m_icons; }; diff --git a/logic/InstanceList.cpp b/logic/InstanceList.cpp index db85bcfc..b6ac38a8 100644 --- a/logic/InstanceList.cpp +++ b/logic/InstanceList.cpp @@ -97,7 +97,7 @@ QVariant InstanceList::data(const QModelIndex &index, int role) const case Qt::DecorationRole: { QString key = pdata->iconKey(); - return MMC->icons()->getIcon(key); + return ENV.icons()->getIcon(key); } // for now. case GroupViewRoles::GroupRole: @@ -547,23 +547,3 @@ void InstanceList::propertiesChanged(BaseInstance *inst) emit dataChanged(index(i), index(i)); } } - -InstanceProxyModel::InstanceProxyModel(QObject *parent) : GroupedProxyModel(parent) -{ -} - -bool InstanceProxyModel::subSortLessThan(const QModelIndex &left, - const QModelIndex &right) const -{ - BaseInstance *pdataLeft = static_cast(left.internalPointer()); - BaseInstance *pdataRight = static_cast(right.internalPointer()); - QString sortMode = MMC->settings()->get("InstSortMode").toString(); - if (sortMode == "LastLaunch") - { - return pdataLeft->lastLaunch() > pdataRight->lastLaunch(); - } - else - { - return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0; - } -} diff --git a/logic/InstanceList.h b/logic/InstanceList.h index 1d52663e..ac3dc848 100644 --- a/logic/InstanceList.h +++ b/logic/InstanceList.h @@ -181,12 +181,3 @@ protected: QSet m_groups; SettingsObjectPtr m_globalSettings; }; - -class InstanceProxyModel : public GroupedProxyModel -{ -public: - explicit InstanceProxyModel(QObject *parent = 0); - -protected: - virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const; -}; diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index 96aeff69..ff1eed44 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -127,7 +127,7 @@ std::shared_ptr LegacyInstance::doUpdate() BaseProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account) { QString launchScript; - QIcon icon = MMC->icons()->getIcon(iconKey()); + QIcon icon = ENV.icons()->getIcon(iconKey()); auto pixmap = icon.pixmap(128, 128); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index 95701e80..20fb65bb 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -158,7 +158,7 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) BaseProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session) { QString launchScript; - QIcon icon = MMC->icons()->getIcon(iconKey()); + QIcon icon = ENV.icons()->getIcon(iconKey()); auto pixmap = icon.pixmap(128, 128); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); diff --git a/logic/ftb/FTBPlugin.cpp b/logic/ftb/FTBPlugin.cpp index d524e3fd..1e9d9123 100644 --- a/logic/ftb/FTBPlugin.cpp +++ b/logic/ftb/FTBPlugin.cpp @@ -212,7 +212,7 @@ void FTBPlugin::loadInstances(QMap &groupMap, QListicons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo), + ENV.icons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo), MMCIcon::Transient); if (!QFileInfo(PathCombine(record.instanceDir, "instance.cfg")).exists()) diff --git a/logic/icons/IconList.cpp b/logic/icons/IconList.cpp index 6db8b035..964d61e9 100644 --- a/logic/icons/IconList.cpp +++ b/logic/icons/IconList.cpp @@ -20,14 +20,15 @@ #include #include #include -#include +#include +#include #define MAX_SIZE 1024 -IconList::IconList(QString path, QObject *parent) : QAbstractListModel(parent) +IconList::IconList(QString builtinPath, QString path, QObject *parent) : QAbstractListModel(parent) { // add builtin icons - QDir instance_icons(":/icons/instances/"); + QDir instance_icons(builtinPath); auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); for (auto file_info : file_info_list) { diff --git a/logic/icons/IconList.h b/logic/icons/IconList.h index 8687eba6..124ecf27 100644 --- a/logic/icons/IconList.h +++ b/logic/icons/IconList.h @@ -23,6 +23,7 @@ #include #include "MMCIcon.h" #include "logic/settings/Setting.h" +#include "logic/Env.h" // there is a global icon list inside Env. class QFileSystemWatcher; @@ -30,7 +31,7 @@ class IconList : public QAbstractListModel { Q_OBJECT public: - explicit IconList(QString path, QObject *parent = 0); + explicit IconList(QString builtinPath, QString path, QObject *parent = 0); virtual ~IconList() {}; QIcon getIcon(QString key);