From c2b03d0f71d2f8277be0b0a02780dbe0fc41f425 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 31 Aug 2023 20:34:34 +0300 Subject: [PATCH 1/9] Fully reload the instance list once the folder is changed Signed-off-by: Trial97 --- launcher/InstanceList.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/InstanceList.cpp b/launcher/InstanceList.cpp index 856eee816..498869cac 100644 --- a/launcher/InstanceList.cpp +++ b/launcher/InstanceList.cpp @@ -768,6 +768,9 @@ void InstanceList::on_InstFolderChanged([[maybe_unused]] const Setting& setting, } m_instDir = newInstDir; m_groupsLoaded = false; + beginRemoveRows(QModelIndex(), 0, count()); + m_instances.erase(m_instances.begin(), m_instances.end()); + endRemoveRows(); emit instancesChanged(); } } From 9d972ccc638ee008920faeecc0ae0e6d17cca357 Mon Sep 17 00:00:00 2001 From: LocalSpook <56512186+LocalSpook@users.noreply.github.com> Date: Wed, 25 Oct 2023 21:00:45 -0700 Subject: [PATCH 2/9] Localize account type in account list Signed-off-by: LocalSpook <56512186+LocalSpook@users.noreply.github.com> --- cmake/CompilerWarnings.cmake | 8 ++++++++ launcher/LaunchController.cpp | 3 ++- launcher/minecraft/auth/AccountList.cpp | 12 +++++++++--- launcher/minecraft/auth/MinecraftAccount.cpp | 3 ++- launcher/minecraft/auth/MinecraftAccount.h | 4 +--- launcher/ui/pages/global/AccountListPage.cpp | 3 ++- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/cmake/CompilerWarnings.cmake b/cmake/CompilerWarnings.cmake index c9962c443..51d2fb13a 100644 --- a/cmake/CompilerWarnings.cmake +++ b/cmake/CompilerWarnings.cmake @@ -68,6 +68,8 @@ function( /w14906 # string literal cast to 'LPWSTR' /w14928 # illegal copy-initialization; more than one user-defined conversion has been implicitly applied /permissive- # standards conformance mode for MSVC compiler. + + /we4062 # forbid omitting a possible value of an enum in a switch statement ) endif() @@ -93,6 +95,8 @@ function( # in a lot of noise. This warning is only notifying us that clang is emulating the GCC behaviour # instead of the exact standard wording so we can safely ignore it -Wno-gnu-zero-variadic-macro-arguments + + -Werror=switch # forbid omitting a possible value of an enum in a switch statement ) endif() @@ -104,6 +108,8 @@ function( -Wduplicated-branches # warn if if / else branches have duplicated code -Wlogical-op # warn about logical operations being used where bitwise were probably wanted -Wuseless-cast # warn if you perform a cast to the same type + + -Werror=switch # forbid omitting a possible value of an enum in a switch statement ) endif() @@ -128,6 +134,8 @@ function( -Woverloaded-virtual -Wuseless-cast -Wextra-semi + + -Werror=switch # forbid omitting a possible value of an enum in a switch statement ) target_compile_options( diff --git a/launcher/LaunchController.cpp b/launcher/LaunchController.cpp index 9fb385777..d1c53ea73 100644 --- a/launcher/LaunchController.cpp +++ b/launcher/LaunchController.cpp @@ -36,6 +36,7 @@ #include "LaunchController.h" #include "Application.h" +#include "minecraft/auth/AccountData.h" #include "minecraft/auth/AccountList.h" #include "ui/InstanceWindow.h" @@ -161,7 +162,7 @@ void LaunchController::login() m_accountToUse->fillSession(m_session); // Launch immediately in true offline mode - if (m_accountToUse->isOffline()) { + if (m_accountToUse->accountType() == AccountType::Offline) { launchInstance(); return; } diff --git a/launcher/minecraft/auth/AccountList.cpp b/launcher/minecraft/auth/AccountList.cpp index b141909a9..c3c09003c 100644 --- a/launcher/minecraft/auth/AccountList.cpp +++ b/launcher/minecraft/auth/AccountList.cpp @@ -283,9 +283,15 @@ QVariant AccountList::data(const QModelIndex& index, int role) const return account->accountDisplayString(); case TypeColumn: { - auto typeStr = account->typeString(); - typeStr[0] = typeStr[0].toUpper(); - return typeStr; + switch (account->accountType()) { + case AccountType::MSA: { + return tr("MSA", "Account type"); + } + case AccountType::Offline: { + return tr("Offline", "Account type"); + } + } + return tr("Unknown", "Account type"); } case StatusColumn: { diff --git a/launcher/minecraft/auth/MinecraftAccount.cpp b/launcher/minecraft/auth/MinecraftAccount.cpp index 545d06aed..ecee93d98 100644 --- a/launcher/minecraft/auth/MinecraftAccount.cpp +++ b/launcher/minecraft/auth/MinecraftAccount.cpp @@ -52,6 +52,7 @@ #include "flows/MSA.h" #include "flows/Offline.h" +#include "minecraft/auth/AccountData.h" MinecraftAccount::MinecraftAccount(QObject* parent) : QObject(parent) { @@ -185,7 +186,7 @@ void MinecraftAccount::authFailed(QString reason) // NOTE: this doesn't do much. There was an error of some sort. } break; case AccountTaskState::STATE_FAILED_HARD: { - if (isMSA()) { + if (accountType() == AccountType::MSA) { data.msaToken.token = QString(); data.msaToken.refresh_token = QString(); data.msaToken.validity = Katabasis::Validity::None; diff --git a/launcher/minecraft/auth/MinecraftAccount.h b/launcher/minecraft/auth/MinecraftAccount.h index c4e9756a9..f773b3bc9 100644 --- a/launcher/minecraft/auth/MinecraftAccount.h +++ b/launcher/minecraft/auth/MinecraftAccount.h @@ -118,9 +118,7 @@ class MinecraftAccount : public QObject, public Usable { bool isActive() const; - bool isMSA() const { return data.type == AccountType::MSA; } - - bool isOffline() const { return data.type == AccountType::Offline; } + [[nodiscard]] AccountType accountType() const noexcept { return data.type; } bool ownsMinecraft() const { return data.minecraftEntitlement.ownsMinecraft; } diff --git a/launcher/ui/pages/global/AccountListPage.cpp b/launcher/ui/pages/global/AccountListPage.cpp index 50f3ff2b6..61e2cd49f 100644 --- a/launcher/ui/pages/global/AccountListPage.cpp +++ b/launcher/ui/pages/global/AccountListPage.cpp @@ -35,6 +35,7 @@ */ #include "AccountListPage.h" +#include "minecraft/auth/AccountData.h" #include "ui_AccountListPage.h" #include @@ -215,7 +216,7 @@ void AccountListPage::updateButtonStates() QModelIndex selected = selection.first(); MinecraftAccountPtr account = selected.data(AccountList::PointerRole).value(); accountIsReady = !account->isActive(); - accountIsOnline = !account->isOffline(); + accountIsOnline = account->accountType() != AccountType::Offline; } ui->actionRemove->setEnabled(accountIsReady); ui->actionSetDefault->setEnabled(accountIsReady); From 0de4d8902efb680bd4dbc44690465f660136c67c Mon Sep 17 00:00:00 2001 From: LocalSpook <56512186+LocalSpook@users.noreply.github.com> Date: Sat, 28 Oct 2023 21:57:56 -0700 Subject: [PATCH 3/9] Remove top-level `const` qualifiers in function declarations Signed-off-by: LocalSpook <56512186+LocalSpook@users.noreply.github.com> --- .clang-tidy | 1 + launcher/DataMigrationTask.h | 2 +- launcher/InstanceImportTask.cpp | 2 +- launcher/InstanceImportTask.h | 2 +- launcher/MMCZip.cpp | 2 +- launcher/MMCZip.h | 2 +- launcher/RecursiveFileSystemWatcher.h | 2 +- launcher/ResourceDownloadTask.h | 2 +- launcher/VersionProxyModel.h | 2 +- launcher/icons/IconList.h | 2 +- launcher/meta/Index.h | 2 +- launcher/meta/Version.h | 2 +- launcher/meta/VersionList.h | 2 +- launcher/minecraft/OneSixVersionFormat.h | 2 +- launcher/minecraft/PackProfile.cpp | 2 +- launcher/minecraft/PackProfile.h | 6 +++--- launcher/minecraft/ProfileUtils.cpp | 2 +- launcher/minecraft/ProfileUtils.h | 4 ++-- launcher/minecraft/auth/AccountList.h | 2 +- launcher/minecraft/mod/ResourceFolderModel.cpp | 4 ++-- launcher/minecraft/mod/ResourceFolderModel.h | 4 ++-- launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp | 2 +- launcher/minecraft/mod/tasks/GetModDependenciesTask.h | 8 ++++---- launcher/modplatform/modrinth/ModrinthPackExportTask.h | 2 +- launcher/modplatform/technic/TechnicPackProcessor.h | 2 +- launcher/ui/dialogs/ModUpdateDialog.h | 5 +---- launcher/ui/dialogs/ResourceDownloadDialog.h | 2 +- launcher/ui/instanceview/InstanceView.h | 2 +- launcher/ui/pages/instance/OtherLogsPage.h | 4 ++-- launcher/ui/pages/modplatform/ModPage.h | 4 +--- launcher/ui/pages/modplatform/ResourceModel.h | 2 +- launcher/ui/pages/modplatform/ResourcePage.h | 2 +- launcher/ui/pages/modplatform/ShaderPackPage.h | 4 +--- launcher/ui/pages/modplatform/flame/FlameModel.h | 2 +- launcher/ui/pages/modplatform/modrinth/ModrinthModel.h | 2 +- launcher/ui/widgets/LanguageSelectionWidget.cpp | 2 +- launcher/ui/widgets/LanguageSelectionWidget.h | 2 +- 37 files changed, 46 insertions(+), 52 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 11ddc9cfc..436dcf244 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,4 +1,5 @@ Checks: - modernize-use-using + - readability-avoid-const-params-in-decls SystemHeaders: false diff --git a/launcher/DataMigrationTask.h b/launcher/DataMigrationTask.h index 6cc23b1a8..aba9f2399 100644 --- a/launcher/DataMigrationTask.h +++ b/launcher/DataMigrationTask.h @@ -18,7 +18,7 @@ class DataMigrationTask : public Task { Q_OBJECT public: - explicit DataMigrationTask(QObject* parent, const QString& sourcePath, const QString& targetPath, const IPathMatcher::Ptr pathmatcher); + explicit DataMigrationTask(QObject* parent, const QString& sourcePath, const QString& targetPath, IPathMatcher::Ptr pathmatcher); ~DataMigrationTask() override = default; protected: diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp index bc139e4f1..9f0cf7460 100644 --- a/launcher/InstanceImportTask.cpp +++ b/launcher/InstanceImportTask.cpp @@ -59,7 +59,7 @@ #include -InstanceImportTask::InstanceImportTask(const QUrl sourceUrl, QWidget* parent, QMap&& extra_info) +InstanceImportTask::InstanceImportTask(const QUrl& sourceUrl, QWidget* parent, QMap&& extra_info) : m_sourceUrl(sourceUrl), m_extra_info(extra_info), m_parent(parent) {} diff --git a/launcher/InstanceImportTask.h b/launcher/InstanceImportTask.h index ca3d30ad6..a1cf2560b 100644 --- a/launcher/InstanceImportTask.h +++ b/launcher/InstanceImportTask.h @@ -54,7 +54,7 @@ class FileResolvingTask; class InstanceImportTask : public InstanceTask { Q_OBJECT public: - explicit InstanceImportTask(const QUrl sourceUrl, QWidget* parent = nullptr, QMap&& extra_info = {}); + explicit InstanceImportTask(const QUrl& sourceUrl, QWidget* parent = nullptr, QMap&& extra_info = {}); bool abort() override; const QVector& getBlockedFiles() const { return m_blockedMods; } diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 3bfe16ab5..ce2573329 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -50,7 +50,7 @@ namespace MMCZip { // ours -bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet& contained, const FilterFunction filter) +bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet& contained, const FilterFunction& filter) { QuaZip modZip(from.filePath()); modZip.open(QuaZip::mdUnzip); diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index 45b1df0b3..93692d0d2 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -60,7 +60,7 @@ using FilterFunction = std::function; /** * Merge two zip files, using a filter function */ -bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet& contained, const FilterFunction filter = nullptr); +bool mergeZipFiles(QuaZip* into, QFileInfo from, QSet& contained, const FilterFunction& filter = nullptr); /** * Compress directory, by providing a list of files to compress diff --git a/launcher/RecursiveFileSystemWatcher.h b/launcher/RecursiveFileSystemWatcher.h index ec3ed804e..7f96f5cd0 100644 --- a/launcher/RecursiveFileSystemWatcher.h +++ b/launcher/RecursiveFileSystemWatcher.h @@ -13,7 +13,7 @@ class RecursiveFileSystemWatcher : public QObject { QDir rootDir() const { return m_root; } // WARNING: setting this to true may be bad for performance - void setWatchFiles(const bool watchFiles); + void setWatchFiles(bool watchFiles); bool watchFiles() const { return m_watchFiles; } void setMatcher(IPathMatcher::Ptr matcher) { m_matcher = matcher; } diff --git a/launcher/ResourceDownloadTask.h b/launcher/ResourceDownloadTask.h index 2baddf8a8..f686e819a 100644 --- a/launcher/ResourceDownloadTask.h +++ b/launcher/ResourceDownloadTask.h @@ -32,7 +32,7 @@ class ResourceDownloadTask : public SequentialTask { public: explicit ResourceDownloadTask(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion version, - const std::shared_ptr packs, + std::shared_ptr packs, bool is_indexed = true, QString custom_target_folder = {}); const QString& getFilename() const { return m_pack_version.fileName; } diff --git a/launcher/VersionProxyModel.h b/launcher/VersionProxyModel.h index 57c711d58..0863a7c80 100644 --- a/launcher/VersionProxyModel.h +++ b/launcher/VersionProxyModel.h @@ -28,7 +28,7 @@ class VersionProxyModel : public QAbstractProxyModel { const FilterMap& filters() const; const QString& search() const; - void setFilter(const BaseVersionList::ModelRoles column, Filter* filter); + void setFilter(BaseVersionList::ModelRoles column, Filter* filter); void setSearch(const QString& search); void clearFilters(); QModelIndex getRecommended() const; diff --git a/launcher/icons/IconList.h b/launcher/icons/IconList.h index 8afd05574..c51826057 100644 --- a/launcher/icons/IconList.h +++ b/launcher/icons/IconList.h @@ -67,7 +67,7 @@ class IconList : public QAbstractListModel { virtual Qt::ItemFlags flags(const QModelIndex& index) const override; bool addThemeIcon(const QString& key); - bool addIcon(const QString& key, const QString& name, const QString& path, const IconType type); + bool addIcon(const QString& key, const QString& name, const QString& path, IconType type); void saveIcon(const QString& key, const QString& path, const char* format) const; bool deleteIcon(const QString& key); bool trashIcon(const QString& key); diff --git a/launcher/meta/Index.h b/launcher/meta/Index.h index 41fdfcea9..2c650ce2f 100644 --- a/launcher/meta/Index.h +++ b/launcher/meta/Index.h @@ -55,6 +55,6 @@ class Index : public QAbstractListModel, public BaseEntity { QVector m_lists; QHash m_uids; - void connectVersionList(const int row, const VersionList::Ptr& list); + void connectVersionList(int row, const VersionList::Ptr& list); }; } // namespace Meta diff --git a/launcher/meta/Version.h b/launcher/meta/Version.h index 07dcafb01..24da12d6d 100644 --- a/launcher/meta/Version.h +++ b/launcher/meta/Version.h @@ -64,7 +64,7 @@ class Version : public QObject, public BaseVersion, public BaseEntity { public: // for usage by format parsers only void setType(const QString& type); - void setTime(const qint64 time); + void setTime(qint64 time); void setRequires(const Meta::RequireSet& reqs, const Meta::RequireSet& conflicts); void setVolatile(bool volatile_); void setRecommended(bool recommended); diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index 5e587f204..2c5624701 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -79,7 +79,7 @@ class VersionList : public BaseVersionList, public BaseEntity { Version::Ptr m_recommended; - void setupAddedVersion(const int row, const Version::Ptr& version); + void setupAddedVersion(int row, const Version::Ptr& version); }; } // namespace Meta Q_DECLARE_METATYPE(Meta::VersionList::Ptr) diff --git a/launcher/minecraft/OneSixVersionFormat.h b/launcher/minecraft/OneSixVersionFormat.h index 9bdc4a4a3..9024d41e4 100644 --- a/launcher/minecraft/OneSixVersionFormat.h +++ b/launcher/minecraft/OneSixVersionFormat.h @@ -9,7 +9,7 @@ class OneSixVersionFormat { public: // version files / profile patches - static VersionFilePtr versionFileFromJson(const QJsonDocument& doc, const QString& filename, const bool requireOrder); + static VersionFilePtr versionFileFromJson(const QJsonDocument& doc, const QString& filename, bool requireOrder); static QJsonDocument versionFileToJson(const VersionFilePtr& patch); // libraries diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 9e706ae0a..180f8aa30 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -430,7 +430,7 @@ bool PackProfile::remove(const int index) return true; } -bool PackProfile::remove(const QString id) +bool PackProfile::remove(const QString& id) { int i = 0; for (auto patch : d->components) { diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index e72b6ebfe..e58e9ae9a 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -89,13 +89,13 @@ class PackProfile : public QAbstractListModel { enum MoveDirection { MoveUp, MoveDown }; /// move component file # up or down the list - void move(const int index, const MoveDirection direction); + void move(int index, MoveDirection direction); /// remove component file # - including files/records - bool remove(const int index); + bool remove(int index); /// remove component file by id - including files/records - bool remove(const QString id); + bool remove(const QString& id); bool customize(int index); diff --git a/launcher/minecraft/ProfileUtils.cpp b/launcher/minecraft/ProfileUtils.cpp index d56ed14bd..f81d6cb7f 100644 --- a/launcher/minecraft/ProfileUtils.cpp +++ b/launcher/minecraft/ProfileUtils.cpp @@ -140,7 +140,7 @@ VersionFilePtr parseJsonFile(const QFileInfo& fileInfo, const bool requireOrder) return guardedParseJson(doc, fileInfo.completeBaseName(), fileInfo.absoluteFilePath(), requireOrder); } -bool saveJsonFile(const QJsonDocument doc, const QString& filename) +bool saveJsonFile(const QJsonDocument& doc, const QString& filename) { auto data = doc.toJson(); QSaveFile jsonFile(filename); diff --git a/launcher/minecraft/ProfileUtils.h b/launcher/minecraft/ProfileUtils.h index edabe0bf0..11e44485f 100644 --- a/launcher/minecraft/ProfileUtils.h +++ b/launcher/minecraft/ProfileUtils.h @@ -47,10 +47,10 @@ bool readOverrideOrders(QString path, PatchOrder& order); bool writeOverrideOrders(QString path, const PatchOrder& order); /// Parse a version file in JSON format -VersionFilePtr parseJsonFile(const QFileInfo& fileInfo, const bool requireOrder); +VersionFilePtr parseJsonFile(const QFileInfo& fileInfo, bool requireOrder); /// Save a JSON file (in any format) -bool saveJsonFile(const QJsonDocument doc, const QString& filename); +bool saveJsonFile(const QJsonDocument& doc, const QString& filename); /// Remove LWJGL from a patch file. This is applied to all Mojang-like profile files. void removeLwjglFromPatch(VersionFilePtr patch); diff --git a/launcher/minecraft/auth/AccountList.h b/launcher/minecraft/auth/AccountList.h index 051d8f958..039730739 100644 --- a/launcher/minecraft/auth/AccountList.h +++ b/launcher/minecraft/auth/AccountList.h @@ -75,7 +75,7 @@ class AccountList : public QAbstractListModel { virtual Qt::ItemFlags flags(const QModelIndex& index) const override; virtual bool setData(const QModelIndex& index, const QVariant& value, int role) override; - void addAccount(const MinecraftAccountPtr account); + void addAccount(MinecraftAccountPtr account); void removeAccount(QModelIndex index); int findAccountByProfileId(const QString& profileId) const; MinecraftAccountPtr getAccountByProfileName(const QString& profileName) const; diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 0503b660b..0f97eb73a 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -45,7 +45,7 @@ ResourceFolderModel::~ResourceFolderModel() QCoreApplication::processEvents(); } -bool ResourceFolderModel::startWatching(const QStringList paths) +bool ResourceFolderModel::startWatching(const QStringList& paths) { if (m_is_watching) return false; @@ -64,7 +64,7 @@ bool ResourceFolderModel::startWatching(const QStringList paths) return m_is_watching; } -bool ResourceFolderModel::stopWatching(const QStringList paths) +bool ResourceFolderModel::stopWatching(const QStringList& paths) { if (!m_is_watching) return false; diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 60b8879c0..be92bf4ac 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -39,14 +39,14 @@ class ResourceFolderModel : public QAbstractListModel { * Returns whether starting to watch all the paths was successful. * If one or more fails, it returns false. */ - bool startWatching(const QStringList paths); + bool startWatching(const QStringList& paths); /** Stops watching the paths for changes. * * Returns whether stopping to watch all the paths was successful. * If one or more fails, it returns false. */ - bool stopWatching(const QStringList paths); + bool stopWatching(const QStringList& paths); /* Helper methods for subclasses, using a predetermined list of paths. */ virtual bool startWatching() { return startWatching({ m_dir.absolutePath() }); } diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp index df8c690af..661901782 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp @@ -238,7 +238,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen return tasks; } -void GetModDependenciesTask::removePack(const QVariant addonId) +void GetModDependenciesTask::removePack(const QVariant& addonId) { auto pred = [addonId](const std::shared_ptr& v) { return v->pack->addonId == addonId; }; #if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h index 2580f8077..e88204bdc 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.h +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.h @@ -65,13 +65,13 @@ class GetModDependenciesTask : public SequentialTask { QHash getRequiredBy(); protected slots: - Task::Ptr prepareDependencyTask(const ModPlatform::Dependency&, const ModPlatform::ResourceProvider, int); + Task::Ptr prepareDependencyTask(const ModPlatform::Dependency&, ModPlatform::ResourceProvider, int); QList getDependenciesForVersion(const ModPlatform::IndexedVersion&, - const ModPlatform::ResourceProvider providerName); + ModPlatform::ResourceProvider providerName); void prepare(); Task::Ptr getProjectInfoTask(std::shared_ptr pDep); - ModPlatform::Dependency getOverride(const ModPlatform::Dependency&, const ModPlatform::ResourceProvider providerName); - void removePack(const QVariant addonId); + ModPlatform::Dependency getOverride(const ModPlatform::Dependency&, ModPlatform::ResourceProvider providerName); + void removePack(const QVariant& addonId); private: QList> m_pack_dependencies; diff --git a/launcher/modplatform/modrinth/ModrinthPackExportTask.h b/launcher/modplatform/modrinth/ModrinthPackExportTask.h index 33c42e817..81c2f25bf 100644 --- a/launcher/modplatform/modrinth/ModrinthPackExportTask.h +++ b/launcher/modplatform/modrinth/ModrinthPackExportTask.h @@ -68,7 +68,7 @@ class ModrinthPackExportTask : public Task { void collectFiles(); void collectHashes(); void makeApiRequest(); - void parseApiResponse(const std::shared_ptr response); + void parseApiResponse(std::shared_ptr response); void buildZip(); QByteArray generateIndex(); diff --git a/launcher/modplatform/technic/TechnicPackProcessor.h b/launcher/modplatform/technic/TechnicPackProcessor.h index 466bce596..08e117fd8 100644 --- a/launcher/modplatform/technic/TechnicPackProcessor.h +++ b/launcher/modplatform/technic/TechnicPackProcessor.h @@ -33,6 +33,6 @@ class TechnicPackProcessor : public QObject { const QString& instIcon, const QString& stagingPath, const QString& minecraftVersion = QString(), - const bool isSolder = false); + bool isSolder = false); }; } // namespace Technic diff --git a/launcher/ui/dialogs/ModUpdateDialog.h b/launcher/ui/dialogs/ModUpdateDialog.h index b79aa4943..7737dd625 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.h +++ b/launcher/ui/dialogs/ModUpdateDialog.h @@ -16,10 +16,7 @@ class ConcurrentTask; class ModUpdateDialog final : public ReviewMessageBox { Q_OBJECT public: - explicit ModUpdateDialog(QWidget* parent, - BaseInstance* instance, - const std::shared_ptr mod_model, - QList& search_for); + explicit ModUpdateDialog(QWidget* parent, BaseInstance* instance, std::shared_ptr mod_model, QList& search_for); void checkCandidates(); diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.h b/launcher/ui/dialogs/ResourceDownloadDialog.h index e9d2cfbe6..a6efca138 100644 --- a/launcher/ui/dialogs/ResourceDownloadDialog.h +++ b/launcher/ui/dialogs/ResourceDownloadDialog.h @@ -50,7 +50,7 @@ class ResourceDownloadDialog : public QDialog, public BasePageProvider { public: using DownloadTaskPtr = shared_qobject_ptr; - ResourceDownloadDialog(QWidget* parent, const std::shared_ptr base_model); + ResourceDownloadDialog(QWidget* parent, std::shared_ptr base_model); void initializeContainer(); void connectButtons(); diff --git a/launcher/ui/instanceview/InstanceView.h b/launcher/ui/instanceview/InstanceView.h index 3d4d56208..30be411a8 100644 --- a/launcher/ui/instanceview/InstanceView.h +++ b/launcher/ui/instanceview/InstanceView.h @@ -65,7 +65,7 @@ class InstanceView : public QAbstractItemView { /// get the model index at the specified visual point virtual QModelIndex indexAt(const QPoint& point) const override; QString groupNameAt(const QPoint& point); - void setSelection(const QRect& rect, const QItemSelectionModel::SelectionFlags commands) override; + void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags commands) override; virtual int horizontalOffset() const override; virtual int verticalOffset() const override; diff --git a/launcher/ui/pages/instance/OtherLogsPage.h b/launcher/ui/pages/instance/OtherLogsPage.h index 4b3b122b0..de42f5a23 100644 --- a/launcher/ui/pages/instance/OtherLogsPage.h +++ b/launcher/ui/pages/instance/OtherLogsPage.h @@ -65,7 +65,7 @@ class OtherLogsPage : public QWidget, public BasePage { private slots: void populateSelectLogBox(); - void on_selectLogBox_currentIndexChanged(const int index); + void on_selectLogBox_currentIndexChanged(int index); void on_btnReload_clicked(); void on_btnPaste_clicked(); void on_btnCopy_clicked(); @@ -78,7 +78,7 @@ class OtherLogsPage : public QWidget, public BasePage { void findPreviousActivated(); private: - void setControlsEnabled(const bool enabled); + void setControlsEnabled(bool enabled); private: Ui::OtherLogsPage* ui; diff --git a/launcher/ui/pages/modplatform/ModPage.h b/launcher/ui/pages/modplatform/ModPage.h index 5a43e49a6..f3660dd48 100644 --- a/launcher/ui/pages/modplatform/ModPage.h +++ b/launcher/ui/pages/modplatform/ModPage.h @@ -49,9 +49,7 @@ class ModPage : public ResourcePage { [[nodiscard]] QMap urlHandlers() const override; - void addResourceToPage(ModPlatform::IndexedPack::Ptr, - ModPlatform::IndexedVersion&, - const std::shared_ptr) override; + void addResourceToPage(ModPlatform::IndexedPack::Ptr, ModPlatform::IndexedVersion&, std::shared_ptr) override; virtual auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, diff --git a/launcher/ui/pages/modplatform/ResourceModel.h b/launcher/ui/pages/modplatform/ResourceModel.h index ecf4f8f79..12db49080 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.h +++ b/launcher/ui/pages/modplatform/ResourceModel.h @@ -88,7 +88,7 @@ class ResourceModel : public QAbstractListModel { void addPack(ModPlatform::IndexedPack::Ptr pack, ModPlatform::IndexedVersion& version, - const std::shared_ptr packs, + std::shared_ptr packs, bool is_indexed = false, QString custom_target_folder = {}); void removePack(const QString& rem); diff --git a/launcher/ui/pages/modplatform/ResourcePage.h b/launcher/ui/pages/modplatform/ResourcePage.h index 7bec0a375..235b44412 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.h +++ b/launcher/ui/pages/modplatform/ResourcePage.h @@ -78,7 +78,7 @@ class ResourcePage : public QWidget, public BasePage { void addResourceToDialog(ModPlatform::IndexedPack::Ptr, ModPlatform::IndexedVersion&); void removeResourceFromDialog(const QString& pack_name); virtual void removeResourceFromPage(const QString& name); - virtual void addResourceToPage(ModPlatform::IndexedPack::Ptr, ModPlatform::IndexedVersion&, const std::shared_ptr); + virtual void addResourceToPage(ModPlatform::IndexedPack::Ptr, ModPlatform::IndexedVersion&, std::shared_ptr); QList selectedPacks() { return m_model->selectedPacks(); } bool hasSelectedPacks() { return !(m_model->selectedPacks().isEmpty()); } diff --git a/launcher/ui/pages/modplatform/ShaderPackPage.h b/launcher/ui/pages/modplatform/ShaderPackPage.h index fcf6d4a7c..c29317e15 100644 --- a/launcher/ui/pages/modplatform/ShaderPackPage.h +++ b/launcher/ui/pages/modplatform/ShaderPackPage.h @@ -38,9 +38,7 @@ class ShaderPackResourcePage : public ResourcePage { [[nodiscard]] bool supportsFiltering() const override { return false; }; - void addResourceToPage(ModPlatform::IndexedPack::Ptr, - ModPlatform::IndexedVersion&, - const std::shared_ptr) override; + void addResourceToPage(ModPlatform::IndexedPack::Ptr, ModPlatform::IndexedVersion&, std::shared_ptr) override; [[nodiscard]] QMap urlHandlers() const override; diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.h b/launcher/ui/pages/modplatform/flame/FlameModel.h index 5a07ef6bb..9b6d70fec 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.h +++ b/launcher/ui/pages/modplatform/flame/FlameModel.h @@ -38,7 +38,7 @@ class ListModel : public QAbstractListModel { void fetchMore(const QModelIndex& parent) override; void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); - void searchWithTerm(const QString& term, const int sort); + void searchWithTerm(const QString& term, int sort); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 2a9d62261..514ee4484 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -71,7 +71,7 @@ class ModpackListModel : public QAbstractListModel { /* Ask the API for more information */ void fetchMore(const QModelIndex& parent) override; void refresh(); - void searchWithTerm(const QString& term, const int sort); + void searchWithTerm(const QString& term, int sort); [[nodiscard]] bool hasActiveSearchJob() const { return jobPtr && jobPtr->isRunning(); } [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? jobPtr : nullptr; } diff --git a/launcher/ui/widgets/LanguageSelectionWidget.cpp b/launcher/ui/widgets/LanguageSelectionWidget.cpp index 37d053478..481547b5b 100644 --- a/launcher/ui/widgets/LanguageSelectionWidget.cpp +++ b/launcher/ui/widgets/LanguageSelectionWidget.cpp @@ -76,7 +76,7 @@ void LanguageSelectionWidget::languageRowChanged(const QModelIndex& current, con translations->updateLanguage(key); } -void LanguageSelectionWidget::languageSettingChanged(const Setting&, const QVariant) +void LanguageSelectionWidget::languageSettingChanged(const Setting&, const QVariant&) { auto translations = APPLICATION->translations(); auto index = translations->selectedIndex(); diff --git a/launcher/ui/widgets/LanguageSelectionWidget.h b/launcher/ui/widgets/LanguageSelectionWidget.h index 5e86a288f..f034853dd 100644 --- a/launcher/ui/widgets/LanguageSelectionWidget.h +++ b/launcher/ui/widgets/LanguageSelectionWidget.h @@ -34,7 +34,7 @@ class LanguageSelectionWidget : public QWidget { protected slots: void languageRowChanged(const QModelIndex& current, const QModelIndex& previous); - void languageSettingChanged(const Setting&, const QVariant); + void languageSettingChanged(const Setting&, const QVariant&); private: QVBoxLayout* verticalLayout = nullptr; From e4fecd1f978c77e9c4571210a2d40736e0b17d49 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 8 Nov 2023 11:55:38 +0200 Subject: [PATCH 4/9] Made sure mangoHub libs are present Signed-off-by: Trial97 --- launcher/minecraft/MinecraftInstance.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 7cb4100ea..362ecbdba 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -585,11 +585,17 @@ QProcessEnvironment MinecraftInstance::createLaunchEnvironment() auto mangoHudLibString = MangoHud::getLibraryString(); if (!mangoHudLibString.isEmpty()) { QFileInfo mangoHudLib(mangoHudLibString); + QString libPath = mangoHudLib.absolutePath(); + auto appendLib = [libPath, &preloadList](QString fileName) { + if (QFileInfo(FS::PathCombine(libPath, fileName)).exists()) + preloadList << fileName; + }; // dlsym variant is only needed for OpenGL and not included in the vulkan layer - preloadList << "libMangoHud_dlsym.so" - << "libMangoHud_opengl.so" << mangoHudLib.fileName(); - libPaths << mangoHudLib.absolutePath(); + appendLib("libMangoHud_dlsym.so"); + appendLib("libMangoHud_opengl.so"); + appendLib(mangoHudLib.fileName()); + libPaths << libPath; } env.insert("LD_PRELOAD", preloadList.join(QLatin1String(":"))); From c05c001ab20eb0b2603c64776cf3e57452a84923 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 13 Nov 2023 23:49:49 +0200 Subject: [PATCH 5/9] Remove the dep if it fails for any reason Signed-off-by: Trial97 --- launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp index df8c690af..dfc7f3e26 100644 --- a/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp +++ b/launcher/minecraft/mod/tasks/GetModDependenciesTask.cpp @@ -137,10 +137,11 @@ Task::Ptr GetModDependenciesTask::getProjectInfoTask(std::shared_ptrpack->provider == m_flame_provider.name ? m_flame_provider : m_modrinth_provider; auto responseInfo = std::make_shared(); auto info = provider.api->getProject(pDep->pack->addonId.toString(), responseInfo); - QObject::connect(info.get(), &NetJob::succeeded, [responseInfo, provider, pDep] { + QObject::connect(info.get(), &NetJob::succeeded, [this, responseInfo, provider, pDep] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*responseInfo, &parse_error); if (parse_error.error != QJsonParseError::NoError) { + removePack(pDep->pack->addonId); qWarning() << "Error while parsing JSON response for mod info at " << parse_error.offset << " reason: " << parse_error.errorString(); qDebug() << *responseInfo; @@ -151,6 +152,7 @@ Task::Ptr GetModDependenciesTask::getProjectInfoTask(std::shared_ptrloadIndexedPack(*pDep->pack, obj); } catch (const JSONValidationError& e) { + removePack(pDep->pack->addonId); qDebug() << doc; qWarning() << "Error while reading mod info: " << e.cause(); } @@ -211,11 +213,13 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen pDep->pack->versionsLoaded = true; } catch (const JSONValidationError& e) { + removePack(dep.addonId); qDebug() << doc; qWarning() << "Error while reading mod version: " << e.cause(); return; } if (level == 0) { + removePack(dep.addonId); qWarning() << "Dependency cycle exceeded"; return; } From 890965746f70881646aae49378ae86bd92455075 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 15 Nov 2023 11:07:46 +0200 Subject: [PATCH 6/9] Added warning on mods update while running Signed-off-by: Trial97 --- launcher/minecraft/mod/ResourceFolderModel.cpp | 6 +++--- launcher/ui/dialogs/ChooseProviderDialog.h | 1 - .../ui/pages/instance/ExternalResourcesPage.cpp | 12 ++++++------ launcher/ui/pages/instance/ModFolderPage.cpp | 17 ++++++++++++++--- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index 0503b660b..80524678c 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -460,9 +460,9 @@ bool ResourceFolderModel::setData(const QModelIndex& index, [[maybe_unused]] con if (role == Qt::CheckStateRole) { if (m_instance != nullptr && m_instance->isRunning()) { auto response = - CustomMessageBox::selectable(nullptr, "Confirm toggle", - "If you enable/disable this resource while the game is running it may crash your game.\n" - "Are you sure you want to do this?", + CustomMessageBox::selectable(nullptr, tr("Confirm toggle"), + tr("If you enable/disable this resource while the game is running it may crash your game.\n" + "Are you sure you want to do this?"), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ->exec(); diff --git a/launcher/ui/dialogs/ChooseProviderDialog.h b/launcher/ui/dialogs/ChooseProviderDialog.h index be9735b5c..51e7c98c6 100644 --- a/launcher/ui/dialogs/ChooseProviderDialog.h +++ b/launcher/ui/dialogs/ChooseProviderDialog.h @@ -13,7 +13,6 @@ enum class ResourceProvider; class Mod; class NetJob; -class ModUpdateDialog; class ChooseProviderDialog : public QDialog { Q_OBJECT diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index 1a8fafa9b..ae42ee048 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -252,9 +252,9 @@ void ExternalResourcesPage::removeItem() void ExternalResourcesPage::removeItems(const QItemSelection& selection) { if (m_instance != nullptr && m_instance->isRunning()) { - auto response = CustomMessageBox::selectable(this, "Confirm Delete", - "If you remove this resource while the game is running it may crash your game.\n" - "Are you sure you want to do this?", + auto response = CustomMessageBox::selectable(this, tr("Confirm Delete"), + tr("If you remove this resource while the game is running it may crash your game.\n" + "Are you sure you want to do this?"), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ->exec(); @@ -273,9 +273,9 @@ void ExternalResourcesPage::enableItem() void ExternalResourcesPage::disableItem() { if (m_instance != nullptr && m_instance->isRunning()) { - auto response = CustomMessageBox::selectable(this, "Confirm disable", - "If you disable this resource while the game is running it may crash your game.\n" - "Are you sure you want to do this?", + auto response = CustomMessageBox::selectable(this, tr("Confirm disable"), + tr("If you disable this resource while the game is running it may crash your game.\n" + "Are you sure you want to do this?"), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ->exec(); diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index f45f8b4b3..8df7c1418 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -150,9 +150,9 @@ bool ModFolderPage::onSelectionChanged(const QModelIndex& current, [[maybe_unuse void ModFolderPage::removeItems(const QItemSelection& selection) { if (m_instance != nullptr && m_instance->isRunning()) { - auto response = CustomMessageBox::selectable(this, "Confirm Delete", - "If you remove mods while the game is running it may crash your game.\n" - "Are you sure you want to do this?", + auto response = CustomMessageBox::selectable(this, tr("Confirm Delete"), + tr("If you remove mods while the game is running it may crash your game.\n" + "Are you sure you want to do this?"), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) ->exec(); @@ -218,6 +218,17 @@ void ModFolderPage::updateMods() QMessageBox::critical(this, tr("Error"), tr("Mod updates are unavailable when metadata is disabled!")); return; } + if (m_instance != nullptr && m_instance->isRunning()) { + auto response = CustomMessageBox::selectable(this, tr("Confirm Update"), + tr("If you update mods while the game is running may cause mod duplication.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response != QMessageBox::Yes) + return; + } auto selection = m_filterModel->mapSelectionToSource(ui->treeView->selectionModel()->selection()).indexes(); auto mods_list = m_model->selectedMods(selection); From 7ef2bda269e4e6fdbd025d07492c6d0c864f24dd Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 17 Nov 2023 19:49:48 +0000 Subject: [PATCH 7/9] Improve description Signed-off-by: TheKodeToad --- launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 8df7c1418..366ff6207 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -220,7 +220,7 @@ void ModFolderPage::updateMods() } if (m_instance != nullptr && m_instance->isRunning()) { auto response = CustomMessageBox::selectable(this, tr("Confirm Update"), - tr("If you update mods while the game is running may cause mod duplication.\n" + tr("If you update mods while the game is running may cause mod duplication and game crashes.\n" "The old files may not be deleted as they are in use.\n" "Are you sure you want to do this?"), QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) From a8aa214c0e9e494b228e8a313e181ed4453302f0 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Sun, 19 Nov 2023 09:01:59 +0200 Subject: [PATCH 8/9] changed prism aniversary Signed-off-by: Trial97 --- launcher/ui/themes/CatPack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/themes/CatPack.cpp b/launcher/ui/themes/CatPack.cpp index bbcb58bc8..50c10189e 100644 --- a/launcher/ui/themes/CatPack.cpp +++ b/launcher/ui/themes/CatPack.cpp @@ -43,7 +43,7 @@ QString BasicCatPack::path() { const auto now = QDate::currentDate(); - const auto birthday = QDate(now.year(), 11, 30); + const auto birthday = QDate(now.year(), 11, 1); const auto xmas = QDate(now.year(), 12, 25); const auto halloween = QDate(now.year(), 10, 31); From 6b3b54f061cfebe9f4e7a9e3402f64f8fe41516f Mon Sep 17 00:00:00 2001 From: Trial97 Date: Thu, 23 Nov 2023 10:48:11 +0200 Subject: [PATCH 9/9] format Signed-off-by: Trial97 --- launcher/ui/pages/instance/ModFolderPage.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index 512cb89ae..ce1cc3a90 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -240,12 +240,13 @@ void ModFolderPage::updateMods(bool includeDeps) return; } if (m_instance != nullptr && m_instance->isRunning()) { - auto response = CustomMessageBox::selectable(this, tr("Confirm Update"), - tr("If you update mods while the game is running may cause mod duplication and game crashes.\n" - "The old files may not be deleted as they are in use.\n" - "Are you sure you want to do this?"), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) - ->exec(); + auto response = + CustomMessageBox::selectable(this, tr("Confirm Update"), + tr("If you update mods while the game is running may cause mod duplication and game crashes.\n" + "The old files may not be deleted as they are in use.\n" + "Are you sure you want to do this?"), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); if (response != QMessageBox::Yes) return;