SCRATCH move icons over to Env, instance proxy model to gui

This commit is contained in:
Petr Mrázek 2015-02-01 11:44:47 +01:00
parent 154d19bb74
commit aa70ed2244
22 changed files with 92 additions and 74 deletions

View File

@ -283,6 +283,8 @@ SET(MULTIMC_SOURCES
gui/GuiUtil.cpp gui/GuiUtil.cpp
gui/ColumnResizer.h gui/ColumnResizer.h
gui/ColumnResizer.cpp gui/ColumnResizer.cpp
gui/InstanceProxyModel.h
gui/InstanceProxyModel.cpp
# GUI - windows # GUI - windows
gui/MainWindow.h gui/MainWindow.h

View File

@ -194,6 +194,9 @@ MultiMC::MultiMC(int &argc, char **argv, bool test_mode) : QApplication(argc, ar
m_translationChecker.reset(new TranslationDownloader()); m_translationChecker.reset(new TranslationDownloader());
// load icons
initIcons();
// and instances // and instances
auto InstDirSetting = m_settings->getSetting("InstanceDir"); auto InstDirSetting = m_settings->getSetting("InstanceDir");
// instance path: check for problems with '!' in instance path and warn the user in the log // 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) void moveFile(const QString &oldName, const QString &newName)
{ {
QFile::remove(newName); QFile::remove(newName);
@ -448,21 +462,6 @@ void MultiMC::initGlobalSettings(bool test_mode)
m_settings->registerSetting("PagedGeometry", ""); m_settings->registerSetting("PagedGeometry", "");
} }
std::shared_ptr<IconList> 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<LWJGLVersionList> MultiMC::lwjgllist() std::shared_ptr<LWJGLVersionList> MultiMC::lwjgllist()
{ {
if (!m_lwjgllist) if (!m_lwjgllist)

View File

@ -64,9 +64,6 @@ public:
// InstanceList, OneSixUpdate, MinecraftInstance, OneSixProfileStrategy // InstanceList, OneSixUpdate, MinecraftInstance, OneSixProfileStrategy
std::shared_ptr<MinecraftVersionList> minecraftlist(); std::shared_ptr<MinecraftVersionList> minecraftlist();
// LegacyInstance, BaseInstance, OneSixInstance, InstanceList
std::shared_ptr<IconList> icons();
QIcon getThemedIcon(const QString& name); QIcon getThemedIcon(const QString& name);
void setIconTheme(const QString& name); void setIconTheme(const QString& name);
@ -152,6 +149,8 @@ private slots:
private: private:
void initLogger(); void initLogger();
void initIcons();
void initGlobalSettings(bool test_mode); void initGlobalSettings(bool test_mode);
void initTranslations(); void initTranslations();
@ -166,7 +165,6 @@ private:
std::shared_ptr<InstanceList> m_instances; std::shared_ptr<InstanceList> m_instances;
std::shared_ptr<UpdateChecker> m_updateChecker; std::shared_ptr<UpdateChecker> m_updateChecker;
std::shared_ptr<MojangAccountList> m_accounts; std::shared_ptr<MojangAccountList> m_accounts;
std::shared_ptr<IconList> m_icons;
std::shared_ptr<LWJGLVersionList> m_lwjgllist; std::shared_ptr<LWJGLVersionList> m_lwjgllist;
std::shared_ptr<ForgeVersionList> m_forgelist; std::shared_ptr<ForgeVersionList> m_forgelist;
std::shared_ptr<LiteLoaderVersionList> m_liteloaderlist; std::shared_ptr<LiteLoaderVersionList> m_liteloaderlist;

View File

@ -59,7 +59,7 @@ ConsoleWindow::ConsoleWindow(BaseProcess *process, QWidget *parent)
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
auto instance = m_proc->instance(); 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(); QString windowTitle = tr("Console window for ") + instance->name();
// Set window properties // Set window properties

View File

@ -0,0 +1,23 @@
#include "InstanceProxyModel.h"
#include "MultiMC.h"
#include <logic/BaseInstance.h>
InstanceProxyModel::InstanceProxyModel(QObject *parent) : GroupedProxyModel(parent)
{
}
bool InstanceProxyModel::subSortLessThan(const QModelIndex &left,
const QModelIndex &right) const
{
BaseInstance *pdataLeft = static_cast<BaseInstance *>(left.internalPointer());
BaseInstance *pdataRight = static_cast<BaseInstance *>(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;
}
}

13
gui/InstanceProxyModel.h Normal file
View File

@ -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;
};

View File

@ -331,6 +331,7 @@ namespace Ui {
#include "gui/groupview/GroupView.h" #include "gui/groupview/GroupView.h"
#include "gui/groupview/InstanceDelegate.h" #include "gui/groupview/InstanceDelegate.h"
#include "gui/InstanceProxyModel.h"
#include "gui/Platform.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 &))); SLOT(instanceChanged(const QModelIndex &, const QModelIndex &)));
// track icon changes and update the toolbar! // 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. // model reset -> selection is invalid. All the instance pointers are wrong.
// FIXME: stop using POINTERS everywhere // FIXME: stop using POINTERS everywhere
@ -1277,7 +1278,7 @@ void MainWindow::on_actionChangeInstIcon_triggered()
if (dlg.result() == QDialog::Accepted) if (dlg.result() == QDialog::Accepted)
{ {
m_selectedInstance->setIconKey(dlg.selectedIconKey); m_selectedInstance->setIconKey(dlg.selectedIconKey);
auto ico = MMC->icons()->getBigIcon(dlg.selectedIconKey); auto ico = ENV.icons()->getBigIcon(dlg.selectedIconKey);
ui->actionChangeInstIcon->setIcon(ico); ui->actionChangeInstIcon->setIcon(ico);
} }
} }
@ -1286,14 +1287,14 @@ void MainWindow::iconUpdated(QString icon)
{ {
if (icon == m_currentInstIcon) 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) void MainWindow::updateInstanceToolIcon(QString new_icon)
{ {
m_currentInstIcon = 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) void MainWindow::setSelectedInstanceById(const QString &id)

View File

@ -19,7 +19,6 @@
#include <QProcess> #include <QProcess>
#include <QTimer> #include <QTimer>
#include "logic/InstanceList.h"
#include "logic/BaseInstance.h" #include "logic/BaseInstance.h"
#include "logic/auth/MojangAccount.h" #include "logic/auth/MojangAccount.h"
#include "logic/net/NetJob.h" #include "logic/net/NetJob.h"
@ -27,6 +26,7 @@
class NewsChecker; class NewsChecker;
class NotificationChecker; class NotificationChecker;
class QToolButton; class QToolButton;
class InstanceProxyModel;
class LabeledToolButton; class LabeledToolButton;
class QLabel; class QLabel;
class MinecraftProcess; class MinecraftProcess;

View File

@ -29,7 +29,7 @@
#include "logic/icons/IconList.h" #include "logic/icons/IconList.h"
#include "logic/tasks/Task.h" #include "logic/tasks/Task.h"
#include "logic/BaseInstance.h" #include "logic/BaseInstance.h"
#include <logic/InstanceList.h> #include "logic/InstanceList.h"
CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent)
:QDialog(parent), ui(new Ui::CopyInstanceDialog), m_original(original) :QDialog(parent), ui(new Ui::CopyInstanceDialog), m_original(original)
@ -40,7 +40,7 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent)
layout()->setSizeConstraint(QLayout::SetFixedSize); layout()->setSizeConstraint(QLayout::SetFixedSize);
InstIconKey = original->iconKey(); InstIconKey = original->iconKey();
ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
ui->instNameTextBox->setText(original->name()); ui->instNameTextBox->setText(original->name());
ui->instNameTextBox->setFocus(); ui->instNameTextBox->setFocus();
auto groups = MMC->instances()->getGroups().toSet(); auto groups = MMC->instances()->getGroups().toSet();
@ -91,7 +91,7 @@ void CopyInstanceDialog::on_iconButton_clicked()
if (dlg.result() == QDialog::Accepted) if (dlg.result() == QDialog::Accepted)
{ {
InstIconKey = dlg.selectedIconKey; InstIconKey = dlg.selectedIconKey;
ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
} }
} }

View File

@ -59,7 +59,7 @@ IconPickerDialog::IconPickerDialog(QWidget *parent)
contentsWidget->installEventFilter(this); contentsWidget->installEventFilter(this);
contentsWidget->setModel(MMC->icons().get()); contentsWidget->setModel(ENV.icons().get());
auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole); auto buttonAdd = ui->buttonBox->addButton(tr("Add Icon"), QDialogButtonBox::ResetRole);
auto buttonRemove = auto buttonRemove =
@ -104,12 +104,12 @@ void IconPickerDialog::addNewIcon()
//: The type of icon files //: The type of icon files
QStringList fileNames = QFileDialog::getOpenFileNames(this, selectIcons, QString(), QStringList fileNames = QFileDialog::getOpenFileNames(this, selectIcons, QString(),
tr("Icons") + "(*.png *.jpg *.jpeg *.ico)"); tr("Icons") + "(*.png *.jpg *.jpeg *.ico)");
MMC->icons()->installIcons(fileNames); ENV.icons()->installIcons(fileNames);
} }
void IconPickerDialog::removeSelectedIcon() void IconPickerDialog::removeSelectedIcon()
{ {
MMC->icons()->deleteIcon(selectedIconKey); ENV.icons()->deleteIcon(selectedIconKey);
} }
void IconPickerDialog::activated(QModelIndex index) void IconPickerDialog::activated(QModelIndex index)
@ -130,7 +130,7 @@ void IconPickerDialog::selectionChanged(QItemSelection selected, QItemSelection
int IconPickerDialog::exec(QString selection) int IconPickerDialog::exec(QString selection)
{ {
auto list = MMC->icons(); auto list = ENV.icons();
auto contentsWidget = ui->iconView; auto contentsWidget = ui->iconView;
selectedIconKey = selection; selectedIconKey = selection;

View File

@ -66,7 +66,7 @@ NewInstanceDialog::NewInstanceDialog(QWidget *parent)
setSelectedVersion(MMC->minecraftlist()->getLatestStable(), true); setSelectedVersion(MMC->minecraftlist()->getLatestStable(), true);
InstIconKey = "infinity"; InstIconKey = "infinity";
ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
ui->modpackEdit->setValidator(new UrlValidator(ui->modpackEdit)); ui->modpackEdit->setValidator(new UrlValidator(ui->modpackEdit));
connect(ui->modpackEdit, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState); connect(ui->modpackEdit, &QLineEdit::textChanged, this, &NewInstanceDialog::updateDialogState);
@ -181,7 +181,7 @@ void NewInstanceDialog::on_iconButton_clicked()
if (dlg.result() == QDialog::Accepted) if (dlg.result() == QDialog::Accepted)
{ {
InstIconKey = dlg.selectedIconKey; InstIconKey = dlg.selectedIconKey;
ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); ui->iconButton->setIcon(ENV.icons()->getIcon(InstIconKey));
} }
} }

View File

@ -51,7 +51,7 @@
QIcon VersionPage::icon() const QIcon VersionPage::icon() const
{ {
return MMC->icons()->getIcon(m_inst->iconKey()); return ENV.icons()->getIcon(m_inst->iconKey());
} }
bool VersionPage::shouldDisplay() const bool VersionPage::shouldDisplay() const
{ {

View File

@ -18,7 +18,6 @@
#include <QFileInfo> #include <QFileInfo>
#include <QDir> #include <QDir>
#include "MultiMC.h"
#include "logic/settings/INISettingsObject.h" #include "logic/settings/INISettingsObject.h"
#include "logic/settings/Setting.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("name", "Unnamed Instance");
m_settings->registerSetting("iconKey", "default"); 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("notes", "");
m_settings->registerSetting("lastLaunchTime", 0); m_settings->registerSetting("lastLaunchTime", 0);

View File

@ -1,5 +1,6 @@
#include "Env.h" #include "Env.h"
#include "logic/net/HttpMetaCache.h" #include "logic/net/HttpMetaCache.h"
#include "icons/IconList.h"
#include <QDir> #include <QDir>
#include <QNetworkProxy> #include <QNetworkProxy>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
@ -35,6 +36,11 @@ std::shared_ptr< QNetworkAccessManager > Env::qnam()
return m_qnam; return m_qnam;
} }
std::shared_ptr<IconList> Env::icons()
{
Q_ASSERT(m_icons != nullptr);
return m_icons;
}
void Env::initHttpMetaCache(QString rootPath, QString staticDataPath) void Env::initHttpMetaCache(QString rootPath, QString staticDataPath)
{ {

View File

@ -3,6 +3,7 @@
#include <memory> #include <memory>
#include <QString> #include <QString>
class IconList;
class QNetworkAccessManager; class QNetworkAccessManager;
class HttpMetaCache; class HttpMetaCache;
@ -26,6 +27,8 @@ public:
std::shared_ptr<HttpMetaCache> metacache(); std::shared_ptr<HttpMetaCache> metacache();
std::shared_ptr<IconList> icons();
/// init the cache. FIXME: possible future hook point /// init the cache. FIXME: possible future hook point
void initHttpMetaCache(QString rootPath, QString staticDataPath); void initHttpMetaCache(QString rootPath, QString staticDataPath);
@ -35,4 +38,5 @@ public:
protected: protected:
std::shared_ptr<QNetworkAccessManager> m_qnam; std::shared_ptr<QNetworkAccessManager> m_qnam;
std::shared_ptr<HttpMetaCache> m_metacache; std::shared_ptr<HttpMetaCache> m_metacache;
std::shared_ptr<IconList> m_icons;
}; };

View File

@ -97,7 +97,7 @@ QVariant InstanceList::data(const QModelIndex &index, int role) const
case Qt::DecorationRole: case Qt::DecorationRole:
{ {
QString key = pdata->iconKey(); QString key = pdata->iconKey();
return MMC->icons()->getIcon(key); return ENV.icons()->getIcon(key);
} }
// for now. // for now.
case GroupViewRoles::GroupRole: case GroupViewRoles::GroupRole:
@ -547,23 +547,3 @@ void InstanceList::propertiesChanged(BaseInstance *inst)
emit dataChanged(index(i), index(i)); 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<BaseInstance *>(left.internalPointer());
BaseInstance *pdataRight = static_cast<BaseInstance *>(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;
}
}

View File

@ -181,12 +181,3 @@ protected:
QSet<QString> m_groups; QSet<QString> m_groups;
SettingsObjectPtr m_globalSettings; SettingsObjectPtr m_globalSettings;
}; };
class InstanceProxyModel : public GroupedProxyModel
{
public:
explicit InstanceProxyModel(QObject *parent = 0);
protected:
virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const;
};

View File

@ -127,7 +127,7 @@ std::shared_ptr<Task> LegacyInstance::doUpdate()
BaseProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account) BaseProcess *LegacyInstance::prepareForLaunch(AuthSessionPtr account)
{ {
QString launchScript; QString launchScript;
QIcon icon = MMC->icons()->getIcon(iconKey()); QIcon icon = ENV.icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128, 128); auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");

View File

@ -158,7 +158,7 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session)
BaseProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session) BaseProcess *OneSixInstance::prepareForLaunch(AuthSessionPtr session)
{ {
QString launchScript; QString launchScript;
QIcon icon = MMC->icons()->getIcon(iconKey()); QIcon icon = ENV.icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128, 128); auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");

View File

@ -212,7 +212,7 @@ void FTBPlugin::loadInstances(QMap<QString, QString> &groupMap, QList<InstancePt
qDebug() << "Loading FTB instance from " << record.instanceDir; qDebug() << "Loading FTB instance from " << record.instanceDir;
QString iconKey = record.logo; QString iconKey = record.logo;
iconKey.remove(QRegularExpression("\\..*")); iconKey.remove(QRegularExpression("\\..*"));
MMC->icons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo), ENV.icons()->addIcon(iconKey, iconKey, PathCombine(record.templateDir, record.logo),
MMCIcon::Transient); MMCIcon::Transient);
if (!QFileInfo(PathCombine(record.instanceDir, "instance.cfg")).exists()) if (!QFileInfo(PathCombine(record.instanceDir, "instance.cfg")).exists())

View File

@ -20,14 +20,15 @@
#include <QMimeData> #include <QMimeData>
#include <QUrl> #include <QUrl>
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
#include <MultiMC.h> #include <QSet>
#include <logger/QsLog.h>
#define MAX_SIZE 1024 #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 // add builtin icons
QDir instance_icons(":/icons/instances/"); QDir instance_icons(builtinPath);
auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name); auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name);
for (auto file_info : file_info_list) for (auto file_info : file_info_list)
{ {

View File

@ -23,6 +23,7 @@
#include <memory> #include <memory>
#include "MMCIcon.h" #include "MMCIcon.h"
#include "logic/settings/Setting.h" #include "logic/settings/Setting.h"
#include "logic/Env.h" // there is a global icon list inside Env.
class QFileSystemWatcher; class QFileSystemWatcher;
@ -30,7 +31,7 @@ class IconList : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit IconList(QString path, QObject *parent = 0); explicit IconList(QString builtinPath, QString path, QObject *parent = 0);
virtual ~IconList() {}; virtual ~IconList() {};
QIcon getIcon(QString key); QIcon getIcon(QString key);