From 8e44ab2338f4ca63d58de4b3329c384df9d6c053 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Mon, 19 Mar 2018 02:36:12 +0100 Subject: NOISSUE redo new instance dialog --- api/logic/CMakeLists.txt | 20 +- api/logic/Filter.cpp | 31 ++ api/logic/Filter.h | 44 ++ api/logic/FolderInstanceProvider.cpp | 43 +- api/logic/FolderInstanceProvider.h | 7 +- api/logic/InstanceCopyTask.cpp | 7 +- api/logic/InstanceCopyTask.h | 14 +- api/logic/InstanceCreationTask.cpp | 8 +- api/logic/InstanceCreationTask.h | 12 +- api/logic/InstanceImportTask.cpp | 8 +- api/logic/InstanceImportTask.h | 12 +- api/logic/InstanceTask.cpp | 9 + api/logic/InstanceTask.h | 55 ++ api/logic/minecraft/legacy/LegacyUpgradeTask.cpp | 7 +- api/logic/minecraft/legacy/LegacyUpgradeTask.h | 12 +- api/logic/modplatform/ftb/FtbPackDownloader.cpp | 84 +-- api/logic/modplatform/ftb/FtbPackDownloader.h | 49 +- api/logic/modplatform/ftb/FtbPackFetchTask.cpp | 2 + api/logic/modplatform/ftb/FtbPackFetchTask.h | 2 +- api/logic/modplatform/ftb/FtbPackInstallTask.cpp | 96 ++-- api/logic/modplatform/ftb/FtbPackInstallTask.h | 42 +- api/logic/modplatform/ftb/PackHelpers.h | 4 +- application/CMakeLists.txt | 85 +-- application/FtbListModel.cpp | 2 + application/InstancePageProvider.h | 22 +- application/InstanceWindow.cpp | 2 +- application/MainWindow.cpp | 44 +- application/MainWindow.h | 5 +- application/MultiMC.cpp | 2 + application/SettingsUI.h | 2 +- application/VersionProxyModel.cpp | 71 +-- application/VersionProxyModel.h | 19 +- application/dialogs/ChooseFtbPackDialog.cpp | 88 ---- application/dialogs/ChooseFtbPackDialog.h | 34 -- application/dialogs/ChooseFtbPackDialog.ui | 119 ----- application/dialogs/NewInstanceDialog.cpp | 263 +++------- application/dialogs/NewInstanceDialog.h | 43 +- application/dialogs/NewInstanceDialog.ui | 346 +------------ application/dialogs/VersionSelectDialog.cpp | 4 +- application/pagedialog/PageDialog.cpp | 11 +- application/pagedialog/PageDialog.h | 3 +- application/pages/BasePage.h | 15 +- application/pages/BasePageProvider.h | 4 +- application/pages/InstanceSettingsPage.cpp | 251 --------- application/pages/InstanceSettingsPage.h | 74 --- application/pages/InstanceSettingsPage.ui | 393 -------------- application/pages/LegacyUpgradePage.cpp | 45 -- application/pages/LegacyUpgradePage.h | 64 --- application/pages/LegacyUpgradePage.ui | 47 -- application/pages/LogPage.cpp | 312 ----------- application/pages/LogPage.h | 86 ---- application/pages/LogPage.ui | 182 ------- application/pages/ModFolderPage.cpp | 210 -------- application/pages/ModFolderPage.h | 108 ---- application/pages/ModFolderPage.ui | 180 ------- application/pages/NotesPage.cpp | 21 - application/pages/NotesPage.h | 60 --- application/pages/NotesPage.ui | 57 --- application/pages/OtherLogsPage.cpp | 313 ----------- application/pages/OtherLogsPage.h | 81 --- application/pages/OtherLogsPage.ui | 150 ------ application/pages/ResourcePackPage.h | 21 - application/pages/ScreenshotsPage.cpp | 372 -------------- application/pages/ScreenshotsPage.h | 84 --- application/pages/ScreenshotsPage.ui | 106 ---- application/pages/TexturePackPage.h | 19 - application/pages/VersionPage.cpp | 570 --------------------- application/pages/VersionPage.h | 95 ---- application/pages/VersionPage.ui | 318 ------------ application/pages/WorldListPage.cpp | 330 ------------ application/pages/WorldListPage.h | 96 ---- application/pages/WorldListPage.ui | 168 ------ application/pages/global/PackagesPage.cpp | 2 +- application/pages/global/PackagesPage.h | 2 +- .../pages/instance/InstanceSettingsPage.cpp | 251 +++++++++ application/pages/instance/InstanceSettingsPage.h | 74 +++ application/pages/instance/InstanceSettingsPage.ui | 393 ++++++++++++++ application/pages/instance/LegacyUpgradePage.cpp | 50 ++ application/pages/instance/LegacyUpgradePage.h | 64 +++ application/pages/instance/LegacyUpgradePage.ui | 47 ++ application/pages/instance/LogPage.cpp | 312 +++++++++++ application/pages/instance/LogPage.h | 86 ++++ application/pages/instance/LogPage.ui | 182 +++++++ application/pages/instance/ModFolderPage.cpp | 210 ++++++++ application/pages/instance/ModFolderPage.h | 108 ++++ application/pages/instance/ModFolderPage.ui | 180 +++++++ application/pages/instance/NotesPage.cpp | 21 + application/pages/instance/NotesPage.h | 60 +++ application/pages/instance/NotesPage.ui | 57 +++ application/pages/instance/OtherLogsPage.cpp | 313 +++++++++++ application/pages/instance/OtherLogsPage.h | 81 +++ application/pages/instance/OtherLogsPage.ui | 150 ++++++ application/pages/instance/ResourcePackPage.h | 21 + application/pages/instance/ScreenshotsPage.cpp | 372 ++++++++++++++ application/pages/instance/ScreenshotsPage.h | 84 +++ application/pages/instance/ScreenshotsPage.ui | 106 ++++ application/pages/instance/TexturePackPage.h | 19 + application/pages/instance/VersionPage.cpp | 570 +++++++++++++++++++++ application/pages/instance/VersionPage.h | 95 ++++ application/pages/instance/VersionPage.ui | 318 ++++++++++++ application/pages/instance/WorldListPage.cpp | 330 ++++++++++++ application/pages/instance/WorldListPage.h | 96 ++++ application/pages/instance/WorldListPage.ui | 168 ++++++ application/pages/modplatform/FTBPage.cpp | 152 ++++++ application/pages/modplatform/FTBPage.h | 86 ++++ application/pages/modplatform/FTBPage.ui | 61 +++ application/pages/modplatform/ImportPage.cpp | 125 +++++ application/pages/modplatform/ImportPage.h | 70 +++ application/pages/modplatform/ImportPage.ui | 52 ++ application/pages/modplatform/TechnicPage.cpp | 29 ++ application/pages/modplatform/TechnicPage.h | 61 +++ application/pages/modplatform/TechnicPage.ui | 48 ++ application/pages/modplatform/TwitchPage.cpp | 29 ++ application/pages/modplatform/TwitchPage.h | 61 +++ application/pages/modplatform/TwitchPage.ui | 48 ++ application/pages/modplatform/VanillaPage.cpp | 114 +++++ application/pages/modplatform/VanillaPage.h | 75 +++ application/pages/modplatform/VanillaPage.ui | 149 ++++++ application/resources/multimc/multimc.qrc | 6 + application/resources/multimc/scalable/technic.svg | 1 + application/resources/multimc/scalable/twitch.svg | 63 +++ application/widgets/InstanceCardWidget.ui | 61 +++ application/widgets/JavaSettingsWidget.cpp | 4 +- application/widgets/PageContainer.cpp | 3 +- application/widgets/PageContainer.h | 10 +- application/widgets/VersionSelectWidget.cpp | 23 +- application/widgets/VersionSelectWidget.h | 6 +- 127 files changed, 6693 insertions(+), 6031 deletions(-) create mode 100644 api/logic/Filter.cpp create mode 100644 api/logic/Filter.h create mode 100644 api/logic/InstanceTask.cpp create mode 100644 api/logic/InstanceTask.h delete mode 100644 application/dialogs/ChooseFtbPackDialog.cpp delete mode 100644 application/dialogs/ChooseFtbPackDialog.h delete mode 100644 application/dialogs/ChooseFtbPackDialog.ui delete mode 100644 application/pages/InstanceSettingsPage.cpp delete mode 100644 application/pages/InstanceSettingsPage.h delete mode 100644 application/pages/InstanceSettingsPage.ui delete mode 100644 application/pages/LegacyUpgradePage.cpp delete mode 100644 application/pages/LegacyUpgradePage.h delete mode 100644 application/pages/LegacyUpgradePage.ui delete mode 100644 application/pages/LogPage.cpp delete mode 100644 application/pages/LogPage.h delete mode 100644 application/pages/LogPage.ui delete mode 100644 application/pages/ModFolderPage.cpp delete mode 100644 application/pages/ModFolderPage.h delete mode 100644 application/pages/ModFolderPage.ui delete mode 100644 application/pages/NotesPage.cpp delete mode 100644 application/pages/NotesPage.h delete mode 100644 application/pages/NotesPage.ui delete mode 100644 application/pages/OtherLogsPage.cpp delete mode 100644 application/pages/OtherLogsPage.h delete mode 100644 application/pages/OtherLogsPage.ui delete mode 100644 application/pages/ResourcePackPage.h delete mode 100644 application/pages/ScreenshotsPage.cpp delete mode 100644 application/pages/ScreenshotsPage.h delete mode 100644 application/pages/ScreenshotsPage.ui delete mode 100644 application/pages/TexturePackPage.h delete mode 100644 application/pages/VersionPage.cpp delete mode 100644 application/pages/VersionPage.h delete mode 100644 application/pages/VersionPage.ui delete mode 100644 application/pages/WorldListPage.cpp delete mode 100644 application/pages/WorldListPage.h delete mode 100644 application/pages/WorldListPage.ui create mode 100644 application/pages/instance/InstanceSettingsPage.cpp create mode 100644 application/pages/instance/InstanceSettingsPage.h create mode 100644 application/pages/instance/InstanceSettingsPage.ui create mode 100644 application/pages/instance/LegacyUpgradePage.cpp create mode 100644 application/pages/instance/LegacyUpgradePage.h create mode 100644 application/pages/instance/LegacyUpgradePage.ui create mode 100644 application/pages/instance/LogPage.cpp create mode 100644 application/pages/instance/LogPage.h create mode 100644 application/pages/instance/LogPage.ui create mode 100644 application/pages/instance/ModFolderPage.cpp create mode 100644 application/pages/instance/ModFolderPage.h create mode 100644 application/pages/instance/ModFolderPage.ui create mode 100644 application/pages/instance/NotesPage.cpp create mode 100644 application/pages/instance/NotesPage.h create mode 100644 application/pages/instance/NotesPage.ui create mode 100644 application/pages/instance/OtherLogsPage.cpp create mode 100644 application/pages/instance/OtherLogsPage.h create mode 100644 application/pages/instance/OtherLogsPage.ui create mode 100644 application/pages/instance/ResourcePackPage.h create mode 100644 application/pages/instance/ScreenshotsPage.cpp create mode 100644 application/pages/instance/ScreenshotsPage.h create mode 100644 application/pages/instance/ScreenshotsPage.ui create mode 100644 application/pages/instance/TexturePackPage.h create mode 100644 application/pages/instance/VersionPage.cpp create mode 100644 application/pages/instance/VersionPage.h create mode 100644 application/pages/instance/VersionPage.ui create mode 100644 application/pages/instance/WorldListPage.cpp create mode 100644 application/pages/instance/WorldListPage.h create mode 100644 application/pages/instance/WorldListPage.ui create mode 100644 application/pages/modplatform/FTBPage.cpp create mode 100644 application/pages/modplatform/FTBPage.h create mode 100644 application/pages/modplatform/FTBPage.ui create mode 100644 application/pages/modplatform/ImportPage.cpp create mode 100644 application/pages/modplatform/ImportPage.h create mode 100644 application/pages/modplatform/ImportPage.ui create mode 100644 application/pages/modplatform/TechnicPage.cpp create mode 100644 application/pages/modplatform/TechnicPage.h create mode 100644 application/pages/modplatform/TechnicPage.ui create mode 100644 application/pages/modplatform/TwitchPage.cpp create mode 100644 application/pages/modplatform/TwitchPage.h create mode 100644 application/pages/modplatform/TwitchPage.ui create mode 100644 application/pages/modplatform/VanillaPage.cpp create mode 100644 application/pages/modplatform/VanillaPage.h create mode 100644 application/pages/modplatform/VanillaPage.ui create mode 100644 application/resources/multimc/scalable/technic.svg create mode 100644 application/resources/multimc/scalable/twitch.svg create mode 100644 application/widgets/InstanceCardWidget.ui diff --git a/api/logic/CMakeLists.txt b/api/logic/CMakeLists.txt index e40f188e..c6daef6f 100644 --- a/api/logic/CMakeLists.txt +++ b/api/logic/CMakeLists.txt @@ -8,14 +8,10 @@ set(CORE_SOURCES BaseInstaller.cpp BaseVersionList.h BaseVersionList.cpp - InstanceCreationTask.h - InstanceCreationTask.cpp - InstanceCopyTask.h - InstanceCopyTask.cpp - InstanceImportTask.h - InstanceImportTask.cpp InstanceList.h InstanceList.cpp + InstanceTask.h + InstanceTask.cpp LoggedProcess.h LoggedProcess.cpp MessageLevel.cpp @@ -32,6 +28,14 @@ set(CORE_SOURCES MMCStrings.h MMCStrings.cpp + # Basic instance manipulation tasks (derived from InstanceTask) + InstanceCreationTask.h + InstanceCreationTask.cpp + InstanceCopyTask.h + InstanceCopyTask.cpp + InstanceImportTask.h + InstanceImportTask.cpp + # Use tracking separate from memory management Usable.h @@ -42,6 +46,10 @@ set(CORE_SOURCES Env.h Env.cpp + # String filters + Filter.h + Filter.cpp + # JSON parsing helpers Json.h Json.cpp diff --git a/api/logic/Filter.cpp b/api/logic/Filter.cpp new file mode 100644 index 00000000..7f6667ae --- /dev/null +++ b/api/logic/Filter.cpp @@ -0,0 +1,31 @@ +#include "Filter.h" + +Filter::~Filter(){} + +ContainsFilter::ContainsFilter(const QString& pattern) : pattern(pattern){} +ContainsFilter::~ContainsFilter(){} +bool ContainsFilter::accepts(const QString& value) +{ + return value.contains(pattern); +} + +ExactFilter::ExactFilter(const QString& pattern) : pattern(pattern){} +ExactFilter::~ExactFilter(){} +bool ExactFilter::accepts(const QString& value) +{ + return value.contains(pattern); +} + +RegexpFilter::RegexpFilter(const QString& regexp, bool invert) + :invert(invert) +{ + pattern.setPattern(regexp); + pattern.optimize(); +} +RegexpFilter::~RegexpFilter(){} +bool RegexpFilter::accepts(const QString& value) +{ + auto match = pattern.match(value); + bool matched = match.hasMatch(); + return invert ? (!matched) : (matched); +} diff --git a/api/logic/Filter.h b/api/logic/Filter.h new file mode 100644 index 00000000..8de7d8f9 --- /dev/null +++ b/api/logic/Filter.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include + +#include "multimc_logic_export.h" + +class MULTIMC_LOGIC_EXPORT Filter +{ +public: + virtual ~Filter(); + virtual bool accepts(const QString & value) = 0; +}; + +class MULTIMC_LOGIC_EXPORT ContainsFilter: public Filter +{ +public: + ContainsFilter(const QString &pattern); + virtual ~ContainsFilter(); + bool accepts(const QString & value) override; +private: + QString pattern; +}; + +class MULTIMC_LOGIC_EXPORT ExactFilter: public Filter +{ +public: + ExactFilter(const QString &pattern); + virtual ~ExactFilter(); + bool accepts(const QString & value) override; +private: + QString pattern; +}; + +class MULTIMC_LOGIC_EXPORT RegexpFilter: public Filter +{ +public: + RegexpFilter(const QString ®exp, bool invert); + virtual ~RegexpFilter(); + bool accepts(const QString & value) override; +private: + QRegularExpression pattern; + bool invert = false; +}; diff --git a/api/logic/FolderInstanceProvider.cpp b/api/logic/FolderInstanceProvider.cpp index 52e23254..69ba6c82 100644 --- a/api/logic/FolderInstanceProvider.cpp +++ b/api/logic/FolderInstanceProvider.cpp @@ -412,46 +412,13 @@ private: QTimer m_backoffTimer; }; -#include "InstanceImportTask.h" -Task * FolderInstanceProvider::zipImportTask(const QUrl sourceUrl, const QString& instName, const QString& instGroup, const QString& instIcon) +#include "InstanceTask.h" +Task * FolderInstanceProvider::wrapInstanceTask(InstanceTask * task) { auto stagingPath = getStagedInstancePath(); - auto task = new InstanceImportTask(m_globalSettings, sourceUrl, stagingPath, instName, instIcon, instGroup); - return new FolderInstanceStaging(this, task, stagingPath, instName, instGroup); -} - -#include "InstanceCreationTask.h" -Task * FolderInstanceProvider::creationTask(BaseVersionPtr version, const QString& instName, const QString& instGroup, const QString& instIcon) -{ - auto stagingPath = getStagedInstancePath(); - auto task = new InstanceCreationTask(m_globalSettings, stagingPath, version, instName, instIcon, instGroup); - return new FolderInstanceStaging(this, task, stagingPath, instName, instGroup); -} - -#include -Task * FolderInstanceProvider::ftbCreationTask(FtbPackDownloader *downloader, const QString& instName, const QString& instGroup, const QString& instIcon) -{ - auto stagingPath = getStagedInstancePath(); - auto task = new FtbPackInstallTask(downloader, m_globalSettings, stagingPath, instName, instIcon, instGroup); - return new FolderInstanceStaging(this, task, stagingPath, instName, instGroup); -} - -#include "InstanceCopyTask.h" -Task * FolderInstanceProvider::copyTask(const InstancePtr& oldInstance, const QString& instName, const QString& instGroup, const QString& instIcon, bool copySaves) -{ - auto stagingPath = getStagedInstancePath(); - auto task = new InstanceCopyTask(m_globalSettings, stagingPath, oldInstance, instName, instIcon, instGroup, copySaves); - return new FolderInstanceStaging(this, task, stagingPath, instName, instGroup); -} - -// FIXME: find a better place for this -#include "minecraft/legacy/LegacyUpgradeTask.h" -Task * FolderInstanceProvider::legacyUpgradeTask(const InstancePtr& oldInstance) -{ - auto stagingPath = getStagedInstancePath(); - QString newName = tr("%1 (Migrated)").arg(oldInstance->name()); - auto task = new LegacyUpgradeTask(m_globalSettings, stagingPath, oldInstance, newName); - return new FolderInstanceStaging(this, task, stagingPath, newName, oldInstance->group()); + task->setStagingPath(stagingPath); + task->setParentSettings(m_globalSettings); + return new FolderInstanceStaging(this, task, stagingPath, task->name(), task->group()); } QString FolderInstanceProvider::getStagedInstancePath() diff --git a/api/logic/FolderInstanceProvider.h b/api/logic/FolderInstanceProvider.h index 2641a46b..e13dcfe9 100644 --- a/api/logic/FolderInstanceProvider.h +++ b/api/logic/FolderInstanceProvider.h @@ -2,9 +2,9 @@ #include "BaseInstanceProvider.h" #include -#include class QFileSystemWatcher; +class InstanceTask; class MULTIMC_LOGIC_EXPORT FolderInstanceProvider : public BaseInstanceProvider { @@ -20,6 +20,7 @@ public: InstancePtr loadInstance(const InstanceId& id) override; + /* // create instance in this provider Task * creationTask(BaseVersionPtr version, const QString &instName, const QString &instGroup, const QString &instIcon); @@ -34,6 +35,10 @@ public: // migrate an instance to the current format Task * legacyUpgradeTask(const InstancePtr& oldInstance); +*/ + + // Wrap an instance creation task in some more task machinery and make it ready to be used + Task * wrapInstanceTask(InstanceTask * task); /** * Create a new empty staging area for instance creation and @return a path/key top commit it later. diff --git a/api/logic/InstanceCopyTask.cpp b/api/logic/InstanceCopyTask.cpp index 9ede65f5..62c22362 100644 --- a/api/logic/InstanceCopyTask.cpp +++ b/api/logic/InstanceCopyTask.cpp @@ -6,14 +6,9 @@ #include "pathmatcher/RegexpMatcher.h" #include -InstanceCopyTask::InstanceCopyTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance, const QString& instName, const QString& instIcon, const QString& instGroup, bool copySaves) +InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, bool copySaves) { - m_globalSettings = settings; - m_stagingPath = stagingPath; m_origInstance = origInstance; - m_instName = instName; - m_instIcon = instIcon; - m_instGroup = instGroup; if(!copySaves) { diff --git a/api/logic/InstanceCopyTask.h b/api/logic/InstanceCopyTask.h index dc46bfec..a8dc9783 100644 --- a/api/logic/InstanceCopyTask.h +++ b/api/logic/InstanceCopyTask.h @@ -9,16 +9,15 @@ #include "settings/SettingsObject.h" #include "BaseVersion.h" #include "BaseInstance.h" - +#include "InstanceTask.h" class BaseInstanceProvider; -class MULTIMC_LOGIC_EXPORT InstanceCopyTask : public Task +class MULTIMC_LOGIC_EXPORT InstanceCopyTask : public InstanceTask { Q_OBJECT public: - explicit InstanceCopyTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance, const QString &instName, - const QString &instIcon, const QString &instGroup, bool copySaves); + explicit InstanceCopyTask(InstancePtr origInstance, bool copySaves); protected: //! Entry point for tasks. @@ -27,15 +26,8 @@ protected: void copyAborted(); private: /* data */ - SettingsObjectPtr m_globalSettings; InstancePtr m_origInstance; - QString m_instName; - QString m_instIcon; - QString m_instGroup; - QString m_stagingPath; QFuture m_copyFuture; QFutureWatcher m_copyFutureWatcher; std::unique_ptr m_matcher; }; - - diff --git a/api/logic/InstanceCreationTask.cpp b/api/logic/InstanceCreationTask.cpp index 8a68815a..6dc2496c 100644 --- a/api/logic/InstanceCreationTask.cpp +++ b/api/logic/InstanceCreationTask.cpp @@ -7,14 +7,8 @@ #include "minecraft/MinecraftInstance.h" #include "minecraft/ComponentList.h" -InstanceCreationTask::InstanceCreationTask(SettingsObjectPtr settings, const QString & stagingPath, BaseVersionPtr version, - const QString& instName, const QString& instIcon, const QString& instGroup) +InstanceCreationTask::InstanceCreationTask(BaseVersionPtr version) { - m_globalSettings = settings; - m_stagingPath = stagingPath; - m_instName = instName; - m_instIcon = instIcon; - m_instGroup = instGroup; m_version = version; } diff --git a/api/logic/InstanceCreationTask.h b/api/logic/InstanceCreationTask.h index 49fd4615..e06eacbb 100644 --- a/api/logic/InstanceCreationTask.h +++ b/api/logic/InstanceCreationTask.h @@ -6,24 +6,18 @@ #include #include "settings/SettingsObject.h" #include "BaseVersion.h" +#include "InstanceTask.h" -class MULTIMC_LOGIC_EXPORT InstanceCreationTask : public Task +class MULTIMC_LOGIC_EXPORT InstanceCreationTask : public InstanceTask { Q_OBJECT public: - explicit InstanceCreationTask(SettingsObjectPtr settings, const QString & stagingPath, BaseVersionPtr version, const QString &instName, - const QString &instIcon, const QString &instGroup); + explicit InstanceCreationTask(BaseVersionPtr version); protected: //! Entry point for tasks. virtual void executeTask() override; private: /* data */ - SettingsObjectPtr m_globalSettings; - QString m_stagingPath; BaseVersionPtr m_version; - QString m_instName; - QString m_instIcon; - QString m_instGroup; }; - diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 7fae97b8..b5375cbc 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -16,15 +16,9 @@ #include "modplatform/flame/PackManifest.h" #include "Json.h" -InstanceImportTask::InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, const QString & stagingPath, - const QString &instName, const QString &instIcon, const QString &instGroup) +InstanceImportTask::InstanceImportTask(const QUrl sourceUrl) { - m_globalSettings = settings; m_sourceUrl = sourceUrl; - m_stagingPath = stagingPath; - m_instName = instName; - m_instIcon = instIcon; - m_instGroup = instGroup; } void InstanceImportTask::executeTask() diff --git a/api/logic/InstanceImportTask.h b/api/logic/InstanceImportTask.h index 99397009..06778dfe 100644 --- a/api/logic/InstanceImportTask.h +++ b/api/logic/InstanceImportTask.h @@ -1,6 +1,6 @@ #pragma once -#include "tasks/Task.h" +#include "InstanceTask.h" #include "multimc_logic_export.h" #include "net/NetJob.h" #include @@ -16,12 +16,11 @@ namespace Flame class FileResolvingTask; } -class MULTIMC_LOGIC_EXPORT InstanceImportTask : public Task +class MULTIMC_LOGIC_EXPORT InstanceImportTask : public InstanceTask { Q_OBJECT public: - explicit InstanceImportTask(SettingsObjectPtr settings, const QUrl sourceUrl, const QString & stagingPath, const QString &instName, - const QString &instIcon, const QString &instGroup); + explicit InstanceImportTask(const QUrl sourceUrl); protected: //! Entry point for tasks. @@ -40,16 +39,11 @@ private slots: void extractAborted(); private: /* data */ - SettingsObjectPtr m_globalSettings; NetJobPtr m_filesNetJob; shared_qobject_ptr m_modIdResolver; QUrl m_sourceUrl; QString m_archivePath; bool m_downloadRequired = false; - QString m_instName; - QString m_instIcon; - QString m_instGroup; - QString m_stagingPath; std::unique_ptr m_packZip; QFuture m_extractFuture; QFutureWatcher m_extractFutureWatcher; diff --git a/api/logic/InstanceTask.cpp b/api/logic/InstanceTask.cpp new file mode 100644 index 00000000..dd132877 --- /dev/null +++ b/api/logic/InstanceTask.cpp @@ -0,0 +1,9 @@ +#include "InstanceTask.h" + +InstanceTask::InstanceTask() +{ +} + +InstanceTask::~InstanceTask() +{ +} diff --git a/api/logic/InstanceTask.h b/api/logic/InstanceTask.h new file mode 100644 index 00000000..8fc98eb7 --- /dev/null +++ b/api/logic/InstanceTask.h @@ -0,0 +1,55 @@ +#pragma once + +#include "tasks/Task.h" +#include "multimc_logic_export.h" +#include "settings/SettingsObject.h" + +class BaseInstanceProvider; + +class MULTIMC_LOGIC_EXPORT InstanceTask : public Task +{ + Q_OBJECT +public: + explicit InstanceTask(); + virtual ~InstanceTask(); + + void setParentSettings(SettingsObjectPtr settings) + { + m_globalSettings = settings; + } + + void setStagingPath(const QString &stagingPath) + { + m_stagingPath = stagingPath; + } + + void setName(const QString &name) + { + m_instName = name; + } + QString name() const + { + return m_instName; + } + + void setIcon(const QString &icon) + { + m_instIcon = icon; + } + + void setGroup(const QString &group) + { + m_instGroup = group; + } + QString group() const + { + return m_instGroup; + } + +protected: /* data */ + SettingsObjectPtr m_globalSettings; + QString m_instName; + QString m_instIcon; + QString m_instGroup; + QString m_stagingPath; +}; diff --git a/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp b/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp index 9fc6d92b..5cc3b5d9 100644 --- a/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp +++ b/api/logic/minecraft/legacy/LegacyUpgradeTask.cpp @@ -10,12 +10,9 @@ #include "minecraft/ComponentList.h" #include "classparser.h" -LegacyUpgradeTask::LegacyUpgradeTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance, const QString & newName) +LegacyUpgradeTask::LegacyUpgradeTask(InstancePtr origInstance) { - m_globalSettings = settings; - m_stagingPath = stagingPath; m_origInstance = origInstance; - m_newName = newName; } void LegacyUpgradeTask::executeTask() @@ -70,7 +67,7 @@ void LegacyUpgradeTask::copyFinished() // NOTE: this scope ensures the instance is fully saved before we emitSucceeded { MinecraftInstance inst(m_globalSettings, instanceSettings, m_stagingPath); - inst.setName(m_newName); + inst.setName(m_instName); inst.init(); QString preferredVersionNumber = decideVersion(legacyInst->currentVersionId(), legacyInst->intendedVersionId()); diff --git a/api/logic/minecraft/legacy/LegacyUpgradeTask.h b/api/logic/minecraft/legacy/LegacyUpgradeTask.h index 56896385..a93dd0d9 100644 --- a/api/logic/minecraft/legacy/LegacyUpgradeTask.h +++ b/api/logic/minecraft/legacy/LegacyUpgradeTask.h @@ -1,6 +1,6 @@ #pragma once -#include "tasks/Task.h" +#include "InstanceTask.h" #include "multimc_logic_export.h" #include "net/NetJob.h" #include @@ -13,11 +13,11 @@ class BaseInstanceProvider; -class MULTIMC_LOGIC_EXPORT LegacyUpgradeTask : public Task +class MULTIMC_LOGIC_EXPORT LegacyUpgradeTask : public InstanceTask { Q_OBJECT public: - explicit LegacyUpgradeTask(SettingsObjectPtr settings, const QString & stagingPath, InstancePtr origInstance, const QString & newName); + explicit LegacyUpgradeTask(InstancePtr origInstance); protected: //! Entry point for tasks. @@ -26,13 +26,7 @@ protected: void copyAborted(); private: /* data */ - SettingsObjectPtr m_globalSettings; InstancePtr m_origInstance; - QString m_stagingPath; - QString m_newName; QFuture m_copyFuture; QFutureWatcher m_copyFutureWatcher; }; - - - diff --git a/api/logic/modplatform/ftb/FtbPackDownloader.cpp b/api/logic/modplatform/ftb/FtbPackDownloader.cpp index caadd4ae..3e274c9e 100644 --- a/api/logic/modplatform/ftb/FtbPackDownloader.cpp +++ b/api/logic/modplatform/ftb/FtbPackDownloader.cpp @@ -3,36 +3,25 @@ #include "FtbPackFetchTask.h" #include "Env.h" -FtbPackDownloader::FtbPackDownloader() { +FtbPackDownloader::FtbPackDownloader() +{ done = false; fetching = false; } -FtbPackDownloader::~FtbPackDownloader(){ -} - -bool FtbPackDownloader::isValidPackSelected(){ - FtbModpack dummy; - dummy.name = "__INVALID__"; - - FtbModpack other = fetchedPacks.value(selected.name, dummy); - if(other.name == "__INVALID__") { - return false; - } - - return other.oldVersions.contains(selectedVersion) && !other.broken; -} - -QString FtbPackDownloader::getSuggestedInstanceName() { - return selected.name; +FtbPackDownloader::~FtbPackDownloader() +{ } -FtbModpackList FtbPackDownloader::getModpacks() { +FtbModpackList FtbPackDownloader::getModpacks() +{ return static_cast(fetchedPacks.values()); } -void FtbPackDownloader::fetchModpacks(bool force = false){ - if(fetching || (!force && done)) { +void FtbPackDownloader::fetchModpacks(bool force = false) +{ + if(fetching || (!force && done)) + { qDebug() << "Skipping modpack refetch because done or already fetching [done =>" << done << "| fetching =>" << fetching << "]"; return; } @@ -46,8 +35,10 @@ void FtbPackDownloader::fetchModpacks(bool force = false){ } -void FtbPackDownloader::fetchSuccess(FtbModpackList modpacks) { - for(int i = 0; i < modpacks.size(); i++) { +void FtbPackDownloader::fetchSuccess(FtbModpackList modpacks) +{ + for(int i = 0; i < modpacks.size(); i++) + { fetchedPacks.insert(modpacks.at(i).name, modpacks.at(i)); } @@ -57,53 +48,10 @@ void FtbPackDownloader::fetchSuccess(FtbModpackList modpacks) { fetchTask->deleteLater(); } -void FtbPackDownloader::fetchFailed(QString reason) { +void FtbPackDownloader::fetchFailed(QString reason) +{ qWarning() << "Failed to fetch FtbData" << reason; fetching = false; emit packFetchFailed(); fetchTask->deleteLater(); } - -void FtbPackDownloader::selectPack(FtbModpack modpack, QString version) { - selected = modpack; - selectedVersion = version; -} - -FtbModpack FtbPackDownloader::getSelectedPack() { - return selected; -} - -void FtbPackDownloader::downloadSelected(MetaEntryPtr cache) { - NetJob *job = new NetJob("Downlad FTB Pack"); - - cache->setStale(true); - QString url = QString("http://ftb.cursecdn.com/FTB2/modpacks/%1/%2/%3").arg(selected.dir, selectedVersion.replace(".", "_"), selected.file); - job->addNetAction(Net::Download::makeCached(url, cache)); - downloadPath = cache->getFullPath(); - - netJobContainer.reset(job); - - connect(job, &NetJob::succeeded, this, &FtbPackDownloader::_downloadSucceeded); - connect(job, &NetJob::failed, this, &FtbPackDownloader::_downloadFailed); - connect(job, &NetJob::progress, this, &FtbPackDownloader::_downloadProgress); - job->start(); -} - -void FtbPackDownloader::_downloadSucceeded() { - netJobContainer.reset(); - emit downloadSucceded(downloadPath); -} - -void FtbPackDownloader::_downloadProgress(qint64 current, qint64 total) { - emit downloadProgress(current, total); -} - -void FtbPackDownloader::_downloadFailed(QString reason) { - netJobContainer.reset(); - emit downloadFailed(reason); -} - -NetJobPtr FtbPackDownloader::getNetJob() -{ - return netJobContainer; -} diff --git a/api/logic/modplatform/ftb/FtbPackDownloader.h b/api/logic/modplatform/ftb/FtbPackDownloader.h index c5cc9bd2..cf7eb567 100644 --- a/api/logic/modplatform/ftb/FtbPackDownloader.h +++ b/api/logic/modplatform/ftb/FtbPackDownloader.h @@ -11,54 +11,29 @@ #pragma once -class FtbPackDownloader; -class MULTIMC_LOGIC_EXPORT FtbPackDownloader : public QObject { - +class MULTIMC_LOGIC_EXPORT FtbPackDownloader : public QObject +{ Q_OBJECT -private: - QMap fetchedPacks; - bool fetching = false; - bool done = false; - - FtbModpack selected; - QString selectedVersion; - QString downloadPath; - - FtbPackFetchTask *fetchTask = 0; - NetJobPtr netJobContainer; - - void _downloadSucceeded(); - void _downloadFailed(QString reason); - void _downloadProgress(qint64 current, qint64 total); - -private slots: - void fetchSuccess(FtbModpackList modlist); - void fetchFailed(QString reason); - public: FtbPackDownloader(); - ~FtbPackDownloader(); - - bool isValidPackSelected(); - void selectPack(FtbModpack modpack, QString version); - - FtbModpack getSelectedPack(); + virtual ~FtbPackDownloader(); void fetchModpacks(bool force); - void downloadSelected(MetaEntryPtr cache); - - QString getSuggestedInstanceName(); - FtbModpackList getModpacks(); - NetJobPtr getNetJob(); signals: void ready(); void packFetchFailed(); - void downloadSucceded(QString archivePath); - void downloadFailed(QString reason); - void downloadProgress(qint64 current, qint64 total); +private slots: + void fetchSuccess(FtbModpackList modlist); + void fetchFailed(QString reason); +private: + QMap fetchedPacks; + bool fetching = false; + bool done = false; + + FtbPackFetchTask *fetchTask = 0; }; diff --git a/api/logic/modplatform/ftb/FtbPackFetchTask.cpp b/api/logic/modplatform/ftb/FtbPackFetchTask.cpp index 9e151186..30253bb9 100644 --- a/api/logic/modplatform/ftb/FtbPackFetchTask.cpp +++ b/api/logic/modplatform/ftb/FtbPackFetchTask.cpp @@ -58,6 +58,8 @@ void FtbPackFetchTask::fileDownloadFinished(){ modpack.mods = element.attribute("mods"); modpack.image = element.attribute("image"); modpack.oldVersions = element.attribute("oldVersions").split(";"); + modpack.broken = false; + modpack.bugged = false; //remove empty if the xml is bugged for(QString curr : modpack.oldVersions) { diff --git a/api/logic/modplatform/ftb/FtbPackFetchTask.h b/api/logic/modplatform/ftb/FtbPackFetchTask.h index 3cfac4ed..a2e4b5ab 100644 --- a/api/logic/modplatform/ftb/FtbPackFetchTask.h +++ b/api/logic/modplatform/ftb/FtbPackFetchTask.h @@ -12,7 +12,7 @@ class MULTIMC_LOGIC_EXPORT FtbPackFetchTask : public QObject { public: FtbPackFetchTask(); - ~FtbPackFetchTask(); + virtual ~FtbPackFetchTask(); void fetch(); diff --git a/api/logic/modplatform/ftb/FtbPackInstallTask.cpp b/api/logic/modplatform/ftb/FtbPackInstallTask.cpp index 530f72ca..e3bb2340 100644 --- a/api/logic/modplatform/ftb/FtbPackInstallTask.cpp +++ b/api/logic/modplatform/ftb/FtbPackInstallTask.cpp @@ -9,52 +9,65 @@ #include "minecraft/ComponentList.h" #include "minecraft/GradleSpecifier.h" -FtbPackInstallTask::FtbPackInstallTask(FtbPackDownloader *downloader, SettingsObjectPtr settings, - const QString &stagingPath, const QString &instName, const QString &instIcon, const QString &instGroup) : - m_globalSettings(settings), m_stagingPath(stagingPath), m_instName(instName), m_instIcon(instIcon), m_instGroup(instGroup) +FtbPackInstallTask::FtbPackInstallTask(FtbModpack pack, QString version) { - m_downloader = downloader; + m_pack = pack; + m_version = version; } -void FtbPackInstallTask::executeTask() { +void FtbPackInstallTask::executeTask() +{ downloadPack(); } -void FtbPackInstallTask::downloadPack(){ - FtbModpack toInstall = m_downloader->getSelectedPack(); - setStatus(tr("Downloading zip for %1").arg(toInstall.name)); +void FtbPackInstallTask::downloadPack() +{ + setStatus(tr("Downloading zip for %1").arg(m_pack.name)); + + auto entry = ENV.metacache()->resolveEntry("general", "FTBPacks/" + m_pack.name); + NetJob *job = new NetJob("Downlad FTB Pack"); + + entry->setStale(true); + QString url = QString("http://ftb.cursecdn.com/FTB2/modpacks/%1/%2/%3").arg(m_pack.dir, m_version.replace(".", "_"), m_pack.file); + job->addNetAction(Net::Download::makeCached(url, entry)); + archivePath = entry->getFullPath(); - auto entry = ENV.metacache()->resolveEntry("general", "FTBPacks/" + toInstall.name); - m_downloader->downloadSelected(entry); + netJobContainer.reset(job); + connect(job, &NetJob::succeeded, this, &FtbPackInstallTask::onDownloadSucceeded); + connect(job, &NetJob::failed, this, &FtbPackInstallTask::onDownloadFailed); + connect(job, &NetJob::progress, this, &FtbPackInstallTask::onDownloadProgress); + job->start(); - connect(m_downloader, &FtbPackDownloader::downloadSucceded, this, &FtbPackInstallTask::onDownloadSucceeded); - connect(m_downloader, &FtbPackDownloader::downloadProgress, this, &FtbPackInstallTask::onDownloadProgress); - connect(m_downloader, &FtbPackDownloader::downloadFailed, this,&FtbPackInstallTask::onDownloadFailed); progress(1, 4); } -void FtbPackInstallTask::onDownloadSucceeded(QString archivePath){ +void FtbPackInstallTask::onDownloadSucceeded() +{ abortable = false; - unzip(archivePath); + unzip(); } -void FtbPackInstallTask::onDownloadFailed(QString reason) { +void FtbPackInstallTask::onDownloadFailed(QString reason) +{ emitFailed(reason); } -void FtbPackInstallTask::onDownloadProgress(qint64 current, qint64 total){ +void FtbPackInstallTask::onDownloadProgress(qint64 current, qint64 total) +{ abortable = true; progress(current, total * 4); - setStatus(tr("Downloading zip for %1 (%2\%)").arg(m_downloader->getSelectedPack().name).arg(current / 10)); + setStatus(tr("Downloading zip for %1 (%2\%)").arg(m_pack.name).arg(current / 10)); } -void FtbPackInstallTask::unzip(QString archivePath) { +void FtbPackInstallTask::unzip() +{ progress(2, 4); setStatus(tr("Extracting modpack")); QDir extractDir(m_stagingPath); m_packZip.reset(new QuaZip(archivePath)); - if(!m_packZip->open(QuaZip::mdUnzip)) { + if(!m_packZip->open(QuaZip::mdUnzip)) + { emitFailed(tr("Failed to open modpack file %1!").arg(archivePath)); return; } @@ -65,22 +78,26 @@ void FtbPackInstallTask::unzip(QString archivePath) { m_extractFutureWatcher.setFuture(m_extractFuture); } -void FtbPackInstallTask::onUnzipFinished() { +void FtbPackInstallTask::onUnzipFinished() +{ install(); } -void FtbPackInstallTask::onUnzipCanceled() { +void FtbPackInstallTask::onUnzipCanceled() +{ emitAborted(); } -void FtbPackInstallTask::install() { +void FtbPackInstallTask::install() +{ progress(3, 4); - FtbModpack toInstall = m_downloader->getSelectedPack(); setStatus(tr("Installing modpack")); QDir unzipMcDir(m_stagingPath + "/unzip/minecraft"); - if(unzipMcDir.exists()) { + if(unzipMcDir.exists()) + { //ok, found minecraft dir, move contents to instance dir - if(!QDir().rename(m_stagingPath + "/unzip/minecraft", m_stagingPath + "/.minecraft")) { + if(!QDir().rename(m_stagingPath + "/unzip/minecraft", m_stagingPath + "/.minecraft")) + { emitFailed(tr("Failed to move unzipped minecraft!")); return; } @@ -94,14 +111,15 @@ void FtbPackInstallTask::install() { MinecraftInstance instance(m_globalSettings, instanceSettings, m_stagingPath); auto components = instance.getComponentList(); components->buildingFromScratch(); - components->setComponentVersion("net.minecraft", toInstall.mcVersion, true); + components->setComponentVersion("net.minecraft", m_pack.mcVersion, true); bool fallback = true; //handle different versions QFile packJson(m_stagingPath + "/.minecraft/pack.json"); QDir jarmodDir = QDir(m_stagingPath + "/unzip/instMods"); - if(packJson.exists()) { + if(packJson.exists()) + { packJson.open(QIODevice::ReadOnly | QIODevice::Text); QJsonDocument doc = QJsonDocument::fromJson(packJson.readAll()); packJson.close(); @@ -109,15 +127,17 @@ void FtbPackInstallTask::install() { //we only care about the libs QJsonArray libs = doc.object().value("libraries").toArray(); - foreach (const QJsonValue &value, libs) { + foreach (const QJsonValue &value, libs) + { QString nameValue = value.toObject().value("name").toString(); - if(!nameValue.startsWith("net.minecraftforge")) { + if(!nameValue.startsWith("net.minecraftforge")) + { continue; } GradleSpecifier forgeVersion(nameValue); - components->setComponentVersion("net.minecraftforge", forgeVersion.version().replace(toInstall.mcVersion, "").replace("-", "")); + components->setComponentVersion("net.minecraftforge", forgeVersion.version().replace(m_pack.mcVersion, "").replace("-", "")); packJson.remove(); fallback = false; break; @@ -125,7 +145,8 @@ void FtbPackInstallTask::install() { } - if(jarmodDir.exists()) { + if(jarmodDir.exists()) + { qDebug() << "Found jarmods, installing..."; QStringList jarmods; @@ -142,7 +163,8 @@ void FtbPackInstallTask::install() { //just nuke unzip directory, it s not needed anymore FS::deletePath(m_stagingPath + "/unzip"); - if(fallback) { + if(fallback) + { //TODO: Some fallback mechanism... or just keep failing! emitFailed(tr("No installation method found!")); return; @@ -154,7 +176,8 @@ void FtbPackInstallTask::install() { instance.init(); instance.setName(m_instName); - if(m_instIcon == "default") { + if(m_instIcon == "default") + { m_instIcon = "ftb_logo"; } instance.setIconKey(m_instIcon); @@ -166,8 +189,9 @@ void FtbPackInstallTask::install() { bool FtbPackInstallTask::abort() { - if(abortable) { - return m_downloader->getNetJob()->abort(); + if(abortable) + { + return netJobContainer->abort(); } return false; } diff --git a/api/logic/modplatform/ftb/FtbPackInstallTask.h b/api/logic/modplatform/ftb/FtbPackInstallTask.h index 7d6e5276..64f4809d 100644 --- a/api/logic/modplatform/ftb/FtbPackInstallTask.h +++ b/api/logic/modplatform/ftb/FtbPackInstallTask.h @@ -1,5 +1,5 @@ #pragma once -#include "tasks/Task.h" +#include "InstanceTask.h" #include "modplatform/ftb/FtbPackDownloader.h" #include "BaseInstanceProvider.h" #include "net/NetJob.h" @@ -9,47 +9,41 @@ #include "meta/Version.h" #include "meta/VersionList.h" -class MULTIMC_LOGIC_EXPORT FtbPackInstallTask : public Task { +class MULTIMC_LOGIC_EXPORT FtbPackInstallTask : public InstanceTask { Q_OBJECT public: - explicit FtbPackInstallTask(FtbPackDownloader *downloader, SettingsObjectPtr settings, const QString &stagingPath, const QString &instName, - const QString &instIcon, const QString &instGroup); + explicit FtbPackInstallTask(FtbModpack pack, QString version); + virtual ~FtbPackInstallTask(){} + bool abort() override; protected: //! Entry point for tasks. virtual void executeTask() override; -private: /* data */ - SettingsObjectPtr m_globalSettings; - QString m_stagingPath; - QString m_instName; - QString m_instIcon; - QString m_instGroup; - NetJobPtr m_netJobPtr; - - FtbPackDownloader *m_downloader; - - std::unique_ptr m_packZip; - QFuture m_extractFuture; - QFutureWatcher m_extractFutureWatcher; - +private: void downloadPack(); - void unzip(QString archivePath); + void unzip(); void install(); - bool moveRecursively(QString source, QString dest); - - bool abortable = false; - private slots: - void onDownloadSucceeded(QString archivePath); + void onDownloadSucceeded(); void onDownloadFailed(QString reason); void onDownloadProgress(qint64 current, qint64 total); void onUnzipFinished(); void onUnzipCanceled(); +private: /* data */ + bool abortable = false; + std::unique_ptr m_packZip; + QFuture m_extractFuture; + QFutureWatcher m_extractFutureWatcher; + NetJobPtr netJobContainer; + QString archivePath; + + FtbModpack m_pack; + QString m_version; }; diff --git a/api/logic/modplatform/ftb/PackHelpers.h b/api/logic/modplatform/ftb/PackHelpers.h index f761ed6b..b184ed33 100644 --- a/api/logic/modplatform/ftb/PackHelpers.h +++ b/api/logic/modplatform/ftb/PackHelpers.h @@ -17,8 +17,8 @@ struct FtbModpack { QString dir; QString file; //<- Url in the xml, but doesn't make much sense - bool bugged = false; - bool broken = false; + bool bugged = true; + bool broken = true; }; //We need it for the proxy model Q_DECLARE_METATYPE(FtbModpack) diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index 48c1a359..5eeca240 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -80,29 +80,32 @@ SET(MULTIMC_SOURCES JavaCommon.h JavaCommon.cpp - # GUI - page dialog pages + # GUI - paged dialog base pages/BasePage.h pages/BasePageContainer.h - pages/VersionPage.cpp - pages/VersionPage.h - pages/TexturePackPage.h - pages/ResourcePackPage.h - pages/ModFolderPage.cpp - pages/ModFolderPage.h - pages/NotesPage.cpp - pages/NotesPage.h - pages/LogPage.cpp - pages/LogPage.h - pages/InstanceSettingsPage.cpp - pages/InstanceSettingsPage.h - pages/ScreenshotsPage.cpp - pages/ScreenshotsPage.h - pages/OtherLogsPage.cpp - pages/OtherLogsPage.h - pages/LegacyUpgradePage.cpp - pages/LegacyUpgradePage.h - pages/WorldListPage.cpp - pages/WorldListPage.h + pages/BasePageProvider.h + + # GUI - instance pages + pages/instance/VersionPage.cpp + pages/instance/VersionPage.h + pages/instance/TexturePackPage.h + pages/instance/ResourcePackPage.h + pages/instance/ModFolderPage.cpp + pages/instance/ModFolderPage.h + pages/instance/NotesPage.cpp + pages/instance/NotesPage.h + pages/instance/LogPage.cpp + pages/instance/LogPage.h + pages/instance/InstanceSettingsPage.cpp + pages/instance/InstanceSettingsPage.h + pages/instance/ScreenshotsPage.cpp + pages/instance/ScreenshotsPage.h + pages/instance/OtherLogsPage.cpp + pages/instance/OtherLogsPage.h + pages/instance/LegacyUpgradePage.cpp + pages/instance/LegacyUpgradePage.h + pages/instance/WorldListPage.cpp + pages/instance/WorldListPage.h # GUI - global settings pages pages/global/AccountListPage.cpp @@ -124,6 +127,18 @@ SET(MULTIMC_SOURCES pages/global/PackagesPage.cpp pages/global/PackagesPage.h + # GUI - platform pages + pages/modplatform/VanillaPage.cpp + pages/modplatform/VanillaPage.h + pages/modplatform/FTBPage.cpp + pages/modplatform/FTBPage.h + pages/modplatform/TwitchPage.cpp + pages/modplatform/TwitchPage.h + pages/modplatform/TechnicPage.cpp + pages/modplatform/TechnicPage.h + pages/modplatform/ImportPage.cpp + pages/modplatform/ImportPage.h + # GUI - dialogs dialogs/AboutDialog.cpp dialogs/AboutDialog.h @@ -159,8 +174,6 @@ SET(MULTIMC_SOURCES dialogs/VersionSelectDialog.h dialogs/SkinUploadDialog.cpp dialogs/SkinUploadDialog.h - dialogs/ChooseFtbPackDialog.cpp - dialogs/ChooseFtbPackDialog.h # GUI - widgets @@ -210,15 +223,15 @@ SET(MULTIMC_SOURCES ######## UIs ######## SET(MULTIMC_UIS # Instance pages - pages/VersionPage.ui - pages/ModFolderPage.ui - pages/LogPage.ui - pages/InstanceSettingsPage.ui - pages/NotesPage.ui - pages/ScreenshotsPage.ui - pages/OtherLogsPage.ui - pages/LegacyUpgradePage.ui - pages/WorldListPage.ui + pages/instance/VersionPage.ui + pages/instance/ModFolderPage.ui + pages/instance/LogPage.ui + pages/instance/InstanceSettingsPage.ui + pages/instance/NotesPage.ui + pages/instance/ScreenshotsPage.ui + pages/instance/OtherLogsPage.ui + pages/instance/LegacyUpgradePage.ui + pages/instance/WorldListPage.ui # Global settings pages pages/global/AccountListPage.ui @@ -230,6 +243,13 @@ SET(MULTIMC_UIS pages/global/PasteEEPage.ui pages/global/PackagesPage.ui + # Platform pages + pages/modplatform/VanillaPage.ui + pages/modplatform/FTBPage.ui + pages/modplatform/TwitchPage.ui + pages/modplatform/TechnicPage.ui + pages/modplatform/ImportPage.ui + # Dialogs dialogs/CopyInstanceDialog.ui dialogs/NewComponentDialog.ui @@ -244,7 +264,6 @@ SET(MULTIMC_UIS dialogs/UpdateDialog.ui dialogs/NotificationDialog.ui dialogs/SkinUploadDialog.ui - dialogs/ChooseFtbPackDialog.ui # Widgets/other widgets/CustomCommands.ui diff --git a/application/FtbListModel.cpp b/application/FtbListModel.cpp index 68a68794..d79bcac0 100644 --- a/application/FtbListModel.cpp +++ b/application/FtbListModel.cpp @@ -108,7 +108,9 @@ QVariant FtbListModel::data(const QModelIndex &index, int role) const void FtbListModel::fill(FtbModpackList modpacks) { + beginResetModel(); this->modpacks = modpacks; + endResetModel(); } FtbModpack FtbListModel::at(int row) diff --git a/application/InstancePageProvider.h b/application/InstancePageProvider.h index b13ce93d..9dda7859 100644 --- a/application/InstancePageProvider.h +++ b/application/InstancePageProvider.h @@ -3,18 +3,18 @@ #include "minecraft/legacy/LegacyInstance.h" #include #include "pages/BasePage.h" -#include "pages/LogPage.h" -#include "pages/VersionPage.h" -#include "pages/ModFolderPage.h" -#include "pages/ResourcePackPage.h" -#include "pages/TexturePackPage.h" -#include "pages/NotesPage.h" -#include "pages/ScreenshotsPage.h" -#include "pages/InstanceSettingsPage.h" -#include "pages/OtherLogsPage.h" #include "pages/BasePageProvider.h" -#include "pages/LegacyUpgradePage.h" -#include "pages/WorldListPage.h" +#include "pages/instance/LogPage.h" +#include "pages/instance/VersionPage.h" +#include "pages/instance/ModFolderPage.h" +#include "pages/instance/ResourcePackPage.h" +#include "pages/instance/TexturePackPage.h" +#include "pages/instance/NotesPage.h" +#include "pages/instance/ScreenshotsPage.h" +#include "pages/instance/InstanceSettingsPage.h" +#include "pages/instance/OtherLogsPage.h" +#include "pages/instance/LegacyUpgradePage.h" +#include "pages/instance/WorldListPage.h" class InstancePageProvider : public QObject, public BasePageProvider diff --git a/application/InstanceWindow.cpp b/application/InstanceWindow.cpp index 2e876fea..5895ca3a 100644 --- a/application/InstanceWindow.cpp +++ b/application/InstanceWindow.cpp @@ -47,7 +47,7 @@ InstanceWindow::InstanceWindow(InstancePtr instance, QWidget *parent) // Add page container { auto provider = std::make_shared(m_instance); - m_container = new PageContainer(provider, "console", this); + m_container = new PageContainer(provider.get(), "console", this); m_container->setParentContainer(this); setCentralWidget(m_container); } diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 542d1da6..60742412 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -90,6 +90,7 @@ #include #include "UpdateController.h" #include "KonamiCode.h" +#include // WHY: to hold the pre-translation strings together with the T pointer, so it can be retranslated without a lot of ugly code template @@ -1267,26 +1268,9 @@ void MainWindow::runModalTask(Task *task) loadDialog.execWithTask(task); } -void MainWindow::instanceFromZipPack(QString instName, QString instGroup, QString instIcon, QUrl url) +void MainWindow::instanceFromInstanceTask(InstanceTask *rawTask) { - std::unique_ptr task(MMC->folderProvider()->zipImportTask(url, instName, instGroup, instIcon)); - runModalTask(task.get()); - - // FIXME: handle instance selection after creation - // finalizeInstance(newInstance); -} - -void MainWindow::instanceFromVersion(QString instName, QString instGroup, QString instIcon, BaseVersionPtr version) -{ - std::unique_ptr task(MMC->folderProvider()->creationTask(version, instName, instGroup, instIcon)); - runModalTask(task.get()); - - // FIXME: handle instance selection after creation - // finalizeInstance(newInstance); -} - -void MainWindow::instanceFromFtbPack(FtbPackDownloader *downloader, QString instName, QString instGroup, QString instIcon) { - std::unique_ptr task(MMC->folderProvider()->ftbCreationTask(downloader, instName, instGroup, instIcon)); + std::unique_ptr task(MMC->folderProvider()->wrapInstanceTask(rawTask)); runModalTask(task.get()); // FIXME: handle instance selection after creation @@ -1302,8 +1286,11 @@ void MainWindow::on_actionCopyInstance_triggered() if (!copyInstDlg.exec()) return; - std::unique_ptr task(MMC->folderProvider()->copyTask(m_selectedInstance, copyInstDlg.instName(), copyInstDlg.instGroup(), - copyInstDlg.iconKey(), copyInstDlg.shouldCopySaves())); + auto copyTask = new InstanceCopyTask(m_selectedInstance, copyInstDlg.shouldCopySaves()); + copyTask->setName(copyInstDlg.instName()); + copyTask->setGroup(copyInstDlg.instGroup()); + copyTask->setIcon(copyInstDlg.iconKey()); + std::unique_ptr task(MMC->folderProvider()->wrapInstanceTask(copyTask)); runModalTask(task.get()); // FIXME: handle instance selection after creation @@ -1366,19 +1353,10 @@ void MainWindow::addInstance(QString url) MMC->settings()->set("LastUsedGroupForNewInstance", newInstDlg.instGroup()); - const QUrl modpackUrl = newInstDlg.modpackUrl(); - - if(newInstDlg.isFtbModpackRequested()) - { - instanceFromFtbPack(newInstDlg.getFtbPackDownloader(), newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey()); - } - else if (modpackUrl.isValid()) - { - instanceFromZipPack(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), modpackUrl); - } - else + InstanceTask * creationTask = newInstDlg.extractTask(); + if(creationTask) { - instanceFromVersion(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), newInstDlg.selectedVersion()); + instanceFromInstanceTask(creationTask); } } diff --git a/application/MainWindow.h b/application/MainWindow.h index e9897606..609df4ca 100644 --- a/application/MainWindow.h +++ b/application/MainWindow.h @@ -39,6 +39,7 @@ class BaseProfilerFactory; class GroupView; class ServerStatus; class KonamiCode; +class InstanceTask; class MainWindow : public QMainWindow { @@ -187,9 +188,7 @@ private: void setSelectedInstanceById(const QString &id); void runModalTask(Task *task); - void instanceFromVersion(QString instName, QString instGroup, QString instIcon, BaseVersionPtr version); - void instanceFromZipPack(QString instName, QString instGroup, QString instIcon, QUrl url); - void instanceFromFtbPack(FtbPackDownloader *downloader, QString instName, QString instGroup, QString instIcon); + void instanceFromInstanceTask(InstanceTask *task); void finalizeInstance(InstancePtr inst); private: diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 230d757f..4236fbcf 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -497,6 +497,8 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) m_settings->registerSetting("PagedGeometry", ""); + m_settings->registerSetting("NewInstanceGeometry", ""); + m_settings->registerSetting("UpdateDialogGeometry", ""); // paste.ee API key diff --git a/application/SettingsUI.h b/application/SettingsUI.h index 5b8badf2..0d14fbee 100644 --- a/application/SettingsUI.h +++ b/application/SettingsUI.h @@ -19,7 +19,7 @@ void ShowPageDialog(T raw_provider, QWidget * parent, QString open_page = QStrin return; { SettingsObject::Lock lock(MMC->settings()); - PageDialog dlg(provider, open_page, parent); + PageDialog dlg(provider.get(), open_page, parent); dlg.exec(); } } diff --git a/application/VersionProxyModel.cpp b/application/VersionProxyModel.cpp index 0dbc4ef6..c180adf2 100644 --- a/application/VersionProxyModel.cpp +++ b/application/VersionProxyModel.cpp @@ -20,34 +20,21 @@ public: const auto &filters = m_parent->filters(); for (auto it = filters.begin(); it != filters.end(); ++it) { - auto role = it.key(); auto idx = sourceModel()->index(source_row, 0, source_parent); - auto data = sourceModel()->data(idx, role); - - switch(role) + auto data = sourceModel()->data(idx, it.key()); + auto match = data.toString(); + if(!it.value()->accepts(match)) { - case BaseVersionList::ParentVersionRole: - case BaseVersionList::VersionIdRole: - // TODO: work with metadata here. Previous implementation based on the Version class is not sufficient - default: - { - auto match = data.toString(); - if(it.value().exact) - { - if (match != it.value().string) - { - return false; - } - } - else if (match.contains(it.value().string)) - { - return false; - } - } + return false; } } return true; } + + void filterChanged() + { + invalidateFilter(); + } private: VersionProxyModel *m_parent; }; @@ -56,12 +43,12 @@ VersionProxyModel::VersionProxyModel(QObject *parent) : QAbstractProxyModel(pare { filterModel = new VersionFilterModel(this); connect(filterModel, &QAbstractItemModel::dataChanged, this, &VersionProxyModel::sourceDataChanged); + connect(filterModel, &QAbstractItemModel::rowsAboutToBeInserted, this, &VersionProxyModel::sourceRowsAboutToBeInserted); + connect(filterModel, &QAbstractItemModel::rowsInserted, this, &VersionProxyModel::sourceRowsInserted); + connect(filterModel, &QAbstractItemModel::rowsAboutToBeRemoved, this, &VersionProxyModel::sourceRowsAboutToBeRemoved); + connect(filterModel, &QAbstractItemModel::rowsRemoved, this, &VersionProxyModel::sourceRowsRemoved); // FIXME: implement when needed /* - connect(replacing, &QAbstractItemModel::rowsAboutToBeInserted, this, &VersionProxyModel::sourceRowsAboutToBeInserted); - connect(replacing, &QAbstractItemModel::rowsInserted, this, &VersionProxyModel::sourceRowsInserted); - connect(replacing, &QAbstractItemModel::rowsAboutToBeRemoved, this, &VersionProxyModel::sourceRowsAboutToBeRemoved); - connect(replacing, &QAbstractItemModel::rowsRemoved, this, &VersionProxyModel::sourceRowsRemoved); connect(replacing, &QAbstractItemModel::rowsAboutToBeMoved, this, &VersionProxyModel::sourceRowsAboutToBeMoved); connect(replacing, &QAbstractItemModel::rowsMoved, this, &VersionProxyModel::sourceRowsMoved); connect(replacing, &QAbstractItemModel::layoutAboutToBeChanged, this, &VersionProxyModel::sourceLayoutAboutToBeChanged); @@ -390,16 +377,13 @@ QModelIndex VersionProxyModel::getVersion(const QString& version) const void VersionProxyModel::clearFilters() { m_filters.clear(); - filterModel->invalidate(); + filterModel->filterChanged(); } -void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, const QString &filter, const bool exact) +void VersionProxyModel::setFilter(const BaseVersionList::ModelRoles column, Filter * f) { - Filter f; - f.string = filter; - f.exact = exact; - m_filters[column] = f; - filterModel->invalidate(); + m_filters[column].reset(f); + filterModel->filterChanged(); } const VersionProxyModel::FilterMap &VersionProxyModel::filters() const @@ -417,4 +401,25 @@ void VersionProxyModel::sourceReset() endResetModel(); } +void VersionProxyModel::sourceRowsAboutToBeInserted(const QModelIndex& parent, int first, int last) +{ + beginInsertRows(parent, first, last); +} + +void VersionProxyModel::sourceRowsInserted(const QModelIndex& parent, int first, int last) +{ + endInsertRows(); +} + +void VersionProxyModel::sourceRowsAboutToBeRemoved(const QModelIndex& parent, int first, int last) +{ + beginRemoveRows(parent, first, last); +} + +void VersionProxyModel::sourceRowsRemoved(const QModelIndex& parent, int first, int last) +{ + endRemoveRows(); +} + + #include "VersionProxyModel.moc" diff --git a/application/VersionProxyModel.h b/application/VersionProxyModel.h index 4441ea6b..33a0d1ea 100644 --- a/application/VersionProxyModel.h +++ b/application/VersionProxyModel.h @@ -2,17 +2,15 @@ #include #include "BaseVersionList.h" +#include + class VersionFilterModel; class VersionProxyModel: public QAbstractProxyModel { Q_OBJECT public: - struct Filter - { - QString string; - bool exact = false; - }; + enum Column { Name, @@ -22,7 +20,7 @@ public: Architecture, Path }; - typedef QHash FilterMap; + typedef QHash> FilterMap; public: VersionProxyModel ( QObject* parent = 0 ); @@ -39,16 +37,23 @@ public: virtual void setSourceModel(QAbstractItemModel *sourceModel) override; const FilterMap &filters() const; - void setFilter(const BaseVersionList::ModelRoles column, const QString &filter, const bool exact); + void setFilter(const BaseVersionList::ModelRoles column, Filter * filter); void clearFilters(); QModelIndex getRecommended() const; QModelIndex getVersion(const QString & version) const; private slots: void sourceDataChanged(const QModelIndex &source_top_left,const QModelIndex &source_bottom_right); + void sourceAboutToBeReset(); void sourceReset(); + void sourceRowsAboutToBeInserted(const QModelIndex &parent, int first, int last); + void sourceRowsInserted(const QModelIndex &parent, int first, int last); + + void sourceRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last); + void sourceRowsRemoved(const QModelIndex &parent, int first, int last); + private: QList m_columns; FilterMap m_filters; diff --git a/application/dialogs/ChooseFtbPackDialog.cpp b/application/dialogs/ChooseFtbPackDialog.cpp deleted file mode 100644 index b1deae6e..00000000 --- a/application/dialogs/ChooseFtbPackDialog.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "ChooseFtbPackDialog.h" -#include - -ChooseFtbPackDialog::ChooseFtbPackDialog(FtbModpackList modpacks) : ui(new Ui::ChooseFtbPackDialog) -{ - ui->setupUi(this); - - filterModel = new FtbFilterModel(this); - listModel = new FtbListModel(this); - filterModel->setSourceModel(listModel); - listModel->fill(modpacks); - - ui->packList->setModel(filterModel); - ui->packList->setSortingEnabled(true); - ui->packList->header()->hide(); - ui->packList->setIndentation(0); - - filterModel->setSorting(FtbFilterModel::Sorting::ByName); - - for(int i = 0; i < filterModel->getAvailableSortings().size(); i++){ - ui->sortByBox->addItem(filterModel->getAvailableSortings().keys().at(i)); - } - - ui->sortByBox->setCurrentText(filterModel->getAvailableSortings().key(filterModel->getCurrentSorting())); - - connect(ui->sortByBox, &QComboBox::currentTextChanged, this, &ChooseFtbPackDialog::onSortingSelectionChanged); - connect(ui->packVersionSelection, &QComboBox::currentTextChanged, this, &ChooseFtbPackDialog::onVersionSelectionItemChanged); - connect(ui->packList->selectionModel(), &QItemSelectionModel::currentChanged, this, &ChooseFtbPackDialog::onPackSelectionChanged); - - ui->modpackInfo->setOpenExternalLinks(true); - - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); -} - -ChooseFtbPackDialog::~ChooseFtbPackDialog() -{ - delete ui; -} - -void ChooseFtbPackDialog::onPackSelectionChanged(QModelIndex now, QModelIndex prev) -{ - ui->packVersionSelection->clear(); - FtbModpack selectedPack = filterModel->data(now, Qt::UserRole).value(); - - ui->modpackInfo->setHtml("Pack by " + selectedPack.author + "" + "
Minecraft " + selectedPack.mcVersion + "
" - "
" + selectedPack.description + "
  • " + selectedPack.mods.replace(";", "
  • ") + "
"); - - bool currentAdded = false; - - for(int i = 0; i < selectedPack.oldVersions.size(); i++) { - if(selectedPack.currentVersion == selectedPack.oldVersions.at(i)) { - currentAdded = true; - } - ui->packVersionSelection->addItem(selectedPack.oldVersions.at(i)); - } - - if(!currentAdded) { - ui->packVersionSelection->addItem(selectedPack.currentVersion); - } - - selected = selectedPack; - ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!selected.broken); -} - -void ChooseFtbPackDialog::onVersionSelectionItemChanged(QString data) -{ - if(data.isNull() || data.isEmpty()) { - selectedVersion = ""; - return; - } - - selectedVersion = data; -} - -FtbModpack ChooseFtb