Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into download_threads
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
		| @@ -72,7 +72,7 @@ class Mod : public Resource { | ||||
|     auto metaurl() const -> QString; | ||||
|  | ||||
|     /** Get the intneral path to the mod's icon file*/ | ||||
|     QString iconPath() const { return m_local_details.icon_file; }; | ||||
|     QString iconPath() const { return m_local_details.icon_file; } | ||||
|     /** Gets the icon of the mod, converted to a QPixmap for drawing, and scaled to size. */ | ||||
|     [[nodiscard]] QPixmap icon(QSize size, Qt::AspectRatioMode mode = Qt::AspectRatioMode::IgnoreAspectRatio) const; | ||||
|     /** Thread-safe. */ | ||||
|   | ||||
| @@ -60,17 +60,17 @@ struct ModLicense { | ||||
|  | ||||
|     ModLicense(const QString license) | ||||
|     { | ||||
|         // FIXME: come up with a better license parseing. | ||||
|         // FIXME: come up with a better license parsing. | ||||
|         // handle SPDX identifiers? https://spdx.org/licenses/ | ||||
|         auto parts = license.split(' '); | ||||
|         QStringList notNameParts = {}; | ||||
|         for (auto part : parts) { | ||||
|             auto url = QUrl(part); | ||||
|             auto _url = QUrl(part); | ||||
|             if (part.startsWith("(") && part.endsWith(")")) | ||||
|                 url = QUrl(part.mid(1, part.size() - 2)); | ||||
|                 _url = QUrl(part.mid(1, part.size() - 2)); | ||||
|  | ||||
|             if (url.isValid() && !url.scheme().isEmpty() && !url.host().isEmpty()) { | ||||
|                 this->url = url.toString(); | ||||
|             if (_url.isValid() && !_url.scheme().isEmpty() && !_url.host().isEmpty()) { | ||||
|                 this->url = _url.toString(); | ||||
|                 notNameParts.append(part); | ||||
|                 continue; | ||||
|             } | ||||
| @@ -89,13 +89,9 @@ struct ModLicense { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     ModLicense(const QString name, const QString id, const QString url, const QString description) | ||||
|     { | ||||
|         this->name = name; | ||||
|         this->id = id; | ||||
|         this->url = url; | ||||
|         this->description = description; | ||||
|     } | ||||
|     ModLicense(const QString& name_, const QString& id_, const QString& url_, const QString& description_) | ||||
|         : name(name_), id(id_), url(url_), description(description_) | ||||
|     {} | ||||
|  | ||||
|     ModLicense(const ModLicense& other) : name(other.name), id(other.id), url(other.url), description(other.description) {} | ||||
|  | ||||
|   | ||||
| @@ -62,6 +62,7 @@ ModFolderModel::ModFolderModel(const QString& dir, BaseInstance* instance, bool | ||||
|     m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::VERSION, SortType::DATE, SortType::PROVIDER }; | ||||
|     m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive,      QHeaderView::Stretch, | ||||
|                               QHeaderView::ResizeToContents, QHeaderView::ResizeToContents, QHeaderView::ResizeToContents }; | ||||
|     m_columnsHideable = { false, true, false, true, true, true }; | ||||
| } | ||||
|  | ||||
| QVariant ModFolderModel::data(const QModelIndex& index, int role) const | ||||
| @@ -137,7 +138,7 @@ QVariant ModFolderModel::data(const QModelIndex& index, int role) const | ||||
|     } | ||||
| } | ||||
|  | ||||
| QVariant ModFolderModel::headerData(int section, Qt::Orientation orientation, int role) const | ||||
| QVariant ModFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientation orientation, int role) const | ||||
| { | ||||
|     switch (role) { | ||||
|         case Qt::DisplayRole: | ||||
|   | ||||
| @@ -451,7 +451,7 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool ResourceFolderModel::setData(const QModelIndex& index, const QVariant& value, int role) | ||||
| bool ResourceFolderModel::setData(const QModelIndex& index, [[maybe_unused]] const QVariant& value, int role) | ||||
| { | ||||
|     int row = index.row(); | ||||
|     if (row < 0 || row >= rowCount(index.parent()) || !index.isValid()) | ||||
| @@ -475,7 +475,7 @@ bool ResourceFolderModel::setData(const QModelIndex& index, const QVariant& valu | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| QVariant ResourceFolderModel::headerData(int section, Qt::Orientation orientation, int role) const | ||||
| QVariant ResourceFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientation orientation, int role) const | ||||
| { | ||||
|     switch (role) { | ||||
|         case Qt::DisplayRole: | ||||
| @@ -555,6 +555,9 @@ QMenu* ResourceFolderModel::createHeaderContextMenu(QTreeView* tree) | ||||
|     menu->addSeparator()->setText(tr("Show / Hide Columns")); | ||||
|  | ||||
|     for (int col = 0; col < columnCount(); ++col) { | ||||
|         // Skip creating actions for columns that should not be hidden | ||||
|         if (!m_columnsHideable.at(col)) | ||||
|             continue; | ||||
|         auto act = new QAction(menu); | ||||
|         setupHeaderAction(act, col); | ||||
|  | ||||
| @@ -588,7 +591,8 @@ SortType ResourceFolderModel::columnToSortKey(size_t column) const | ||||
| } | ||||
|  | ||||
| /* Standard Proxy Model for createFilterProxyModel */ | ||||
| [[nodiscard]] bool ResourceFolderModel::ProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const | ||||
| [[nodiscard]] bool ResourceFolderModel::ProxyModel::filterAcceptsRow(int source_row, | ||||
|                                                                      [[maybe_unused]] const QModelIndex& source_parent) const | ||||
| { | ||||
|     auto* model = qobject_cast<ResourceFolderModel*>(sourceModel()); | ||||
|     if (!model) | ||||
|   | ||||
| @@ -49,8 +49,8 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|     bool stopWatching(const QStringList paths); | ||||
|  | ||||
|     /* Helper methods for subclasses, using a predetermined list of paths. */ | ||||
|     virtual bool startWatching() { return startWatching({ m_dir.absolutePath() }); }; | ||||
|     virtual bool stopWatching() { return stopWatching({ m_dir.absolutePath() }); }; | ||||
|     virtual bool startWatching() { return startWatching({ m_dir.absolutePath() }); } | ||||
|     virtual bool stopWatching() { return stopWatching({ m_dir.absolutePath() }); } | ||||
|  | ||||
|     /** Given a path in the system, install that resource, moving it to its place in the | ||||
|      *  instance file hierarchy. | ||||
| @@ -78,7 +78,7 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|     /** Creates a new parse task, if needed, for 'res' and start it.*/ | ||||
|     virtual void resolveResource(Resource* res); | ||||
|  | ||||
|     [[nodiscard]] size_t size() const { return m_resources.size(); }; | ||||
|     [[nodiscard]] qsizetype size() const { return m_resources.size(); } | ||||
|     [[nodiscard]] bool empty() const { return size() == 0; } | ||||
|     [[nodiscard]] Resource& at(int index) { return *m_resources.at(index); } | ||||
|     [[nodiscard]] Resource const& at(int index) const { return *m_resources.at(index); } | ||||
| @@ -97,10 +97,10 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|  | ||||
|     /* Basic columns */ | ||||
|     enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, NUM_COLUMNS }; | ||||
|     QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; }; | ||||
|     QStringList columnNames(bool translated = true) const { return translated ? m_column_names_translated : m_column_names; } | ||||
|  | ||||
|     [[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : static_cast<int>(size()); } | ||||
|     [[nodiscard]] int columnCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : NUM_COLUMNS; }; | ||||
|     [[nodiscard]] int columnCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : NUM_COLUMNS; } | ||||
|  | ||||
|     [[nodiscard]] Qt::DropActions supportedDropActions() const override; | ||||
|  | ||||
| @@ -159,7 +159,7 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|      *  This task should load and parse all heavy info needed by a resource, such as parsing a manifest. It gets executed | ||||
|      *  in the background, so it slowly updates the UI as tasks get done. | ||||
|      */ | ||||
|     [[nodiscard]] virtual Task* createParseTask(Resource&) { return nullptr; }; | ||||
|     [[nodiscard]] virtual Task* createParseTask(Resource&) { return nullptr; } | ||||
|  | ||||
|     /** Standard implementation of the model update logic. | ||||
|      * | ||||
| @@ -203,6 +203,7 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|     QStringList m_column_names_translated = { tr("Enable"), tr("Name"), tr("Last Modified") }; | ||||
|     QList<QHeaderView::ResizeMode> m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Stretch, | ||||
|                                                              QHeaderView::ResizeToContents }; | ||||
|     QList<bool> m_columnsHideable = { false, false, true }; | ||||
|  | ||||
|     QDir m_dir; | ||||
|     BaseInstance* m_instance; | ||||
| @@ -224,15 +225,15 @@ class ResourceFolderModel : public QAbstractListModel { | ||||
|  | ||||
| /* A macro to define useful functions to handle Resource* -> T* more easily on derived classes */ | ||||
| #define RESOURCE_HELPERS(T)                                                                       \ | ||||
|     [[nodiscard]] T* operator[](size_t index)                                                     \ | ||||
|     [[nodiscard]] T* operator[](int index)                                                        \ | ||||
|     {                                                                                             \ | ||||
|         return static_cast<T*>(m_resources[index].get());                                         \ | ||||
|     }                                                                                             \ | ||||
|     [[nodiscard]] T* at(size_t index)                                                             \ | ||||
|     [[nodiscard]] T* at(int index)                                                                \ | ||||
|     {                                                                                             \ | ||||
|         return static_cast<T*>(m_resources[index].get());                                         \ | ||||
|     }                                                                                             \ | ||||
|     [[nodiscard]] const T* at(size_t index) const                                                 \ | ||||
|     [[nodiscard]] const T* at(int index) const                                                    \ | ||||
|     {                                                                                             \ | ||||
|         return static_cast<const T*>(m_resources.at(index).get());                                \ | ||||
|     }                                                                                             \ | ||||
|   | ||||
| @@ -54,6 +54,7 @@ ResourcePackFolderModel::ResourcePackFolderModel(const QString& dir, BaseInstanc | ||||
|     m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::PACK_FORMAT, SortType::DATE }; | ||||
|     m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch, QHeaderView::ResizeToContents, | ||||
|                               QHeaderView::ResizeToContents }; | ||||
|     m_columnsHideable = { false, true, false, true, true }; | ||||
| } | ||||
|  | ||||
| QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const | ||||
| @@ -128,7 +129,7 @@ QVariant ResourcePackFolderModel::data(const QModelIndex& index, int role) const | ||||
|     } | ||||
| } | ||||
|  | ||||
| QVariant ResourcePackFolderModel::headerData(int section, Qt::Orientation orientation, int role) const | ||||
| QVariant ResourcePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientation orientation, int role) const | ||||
| { | ||||
|     switch (role) { | ||||
|         case Qt::DisplayRole: | ||||
| @@ -165,7 +166,6 @@ QVariant ResourcePackFolderModel::headerData(int section, Qt::Orientation orient | ||||
|         default: | ||||
|             return {}; | ||||
|     } | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| int ResourcePackFolderModel::columnCount(const QModelIndex& parent) const | ||||
|   | ||||
| @@ -49,6 +49,7 @@ TexturePackFolderModel::TexturePackFolderModel(const QString& dir, BaseInstance* | ||||
|     m_column_sort_keys = { SortType::ENABLED, SortType::NAME, SortType::NAME, SortType::DATE }; | ||||
|     m_column_resize_modes = { QHeaderView::ResizeToContents, QHeaderView::Interactive, QHeaderView::Stretch, | ||||
|                               QHeaderView::ResizeToContents }; | ||||
|     m_columnsHideable = { false, true, false, true }; | ||||
| } | ||||
|  | ||||
| Task* TexturePackFolderModel::createUpdateTask() | ||||
| @@ -113,7 +114,7 @@ QVariant TexturePackFolderModel::data(const QModelIndex& index, int role) const | ||||
|     } | ||||
| } | ||||
|  | ||||
| QVariant TexturePackFolderModel::headerData(int section, Qt::Orientation orientation, int role) const | ||||
| QVariant TexturePackFolderModel::headerData(int section, [[maybe_unused]] Qt::Orientation orientation, int role) const | ||||
| { | ||||
|     switch (role) { | ||||
|         case Qt::DisplayRole: | ||||
|   | ||||
| @@ -61,7 +61,7 @@ GetModDependenciesTask::GetModDependenciesTask(QObject* parent, | ||||
|         if (auto meta = mod->metadata(); meta) | ||||
|             m_mods.append(meta); | ||||
|     prepare(); | ||||
| }; | ||||
| } | ||||
|  | ||||
| void GetModDependenciesTask::prepare() | ||||
| { | ||||
| @@ -130,7 +130,7 @@ QList<ModPlatform::Dependency> GetModDependenciesTask::getDependenciesForVersion | ||||
|         c_dependencies.append(getOverride(ver_dep, providerName)); | ||||
|     } | ||||
|     return c_dependencies; | ||||
| }; | ||||
| } | ||||
|  | ||||
| Task::Ptr GetModDependenciesTask::getProjectInfoTask(std::shared_ptr<PackDependency> pDep) | ||||
| { | ||||
| @@ -181,7 +181,7 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen | ||||
|     ResourceAPI::DependencySearchArgs args = { dep, m_version, m_loaderType }; | ||||
|     ResourceAPI::DependencySearchCallbacks callbacks; | ||||
|  | ||||
|     callbacks.on_succeed = [dep, provider, pDep, level, this](auto& doc, auto& pack) { | ||||
|     callbacks.on_succeed = [dep, provider, pDep, level, this](auto& doc, [[maybe_unused]] auto& pack) { | ||||
|         try { | ||||
|             QJsonArray arr; | ||||
|             if (dep.version.length() != 0 && doc.isObject()) { | ||||
| @@ -215,27 +215,27 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen | ||||
|             return; | ||||
|         } | ||||
|         if (level == 0) { | ||||
|             qWarning() << "Dependency cycle exeeded"; | ||||
|             qWarning() << "Dependency cycle exceeded"; | ||||
|             return; | ||||
|         } | ||||
|         if (dep.addonId.toString().isEmpty() && !pDep->version.addonId.toString().isEmpty()) { | ||||
|             pDep->pack->addonId = pDep->version.addonId; | ||||
|             auto dep = getOverride({ pDep->version.addonId, pDep->dependency.type }, provider.name); | ||||
|             if (dep.addonId != pDep->version.addonId) { | ||||
|             auto dep_ = getOverride({ pDep->version.addonId, pDep->dependency.type }, provider.name); | ||||
|             if (dep_.addonId != pDep->version.addonId) { | ||||
|                 removePack(pDep->version.addonId); | ||||
|                 addTask(prepareDependencyTask(dep, provider.name, level)); | ||||
|                 addTask(prepareDependencyTask(dep_, provider.name, level)); | ||||
|             } else | ||||
|                 addTask(getProjectInfoTask(pDep)); | ||||
|         } | ||||
|         for (auto dep : getDependenciesForVersion(pDep->version, provider.name)) { | ||||
|             addTask(prepareDependencyTask(dep, provider.name, level - 1)); | ||||
|         for (auto dep_ : getDependenciesForVersion(pDep->version, provider.name)) { | ||||
|             addTask(prepareDependencyTask(dep_, provider.name, level - 1)); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     auto version = provider.api->getDependencyVersion(std::move(args), std::move(callbacks)); | ||||
|     tasks->addTask(version); | ||||
|     return tasks; | ||||
| }; | ||||
| } | ||||
|  | ||||
| void GetModDependenciesTask::removePack(const QVariant addonId) | ||||
| { | ||||
|   | ||||
| @@ -104,14 +104,15 @@ ModDetails ReadMCModTOML(QByteArray contents) | ||||
| #if TOML_EXCEPTIONS | ||||
|     try { | ||||
|         tomlData = toml::parse(contents.toStdString()); | ||||
|     } catch (const toml::parse_error& err) { | ||||
|     } catch ([[maybe_unused]] const toml::parse_error& err) { | ||||
|         return {}; | ||||
|     } | ||||
| #else | ||||
|     tomlData = toml::parse(contents.toStdString()); | ||||
|     if (!tomlData) { | ||||
|     toml::parse_result result = toml::parse(contents.toStdString()); | ||||
|     if (!result) { | ||||
|         return {}; | ||||
|     } | ||||
|     tomlData = result.table(); | ||||
| #endif | ||||
|  | ||||
|     // array defined by [[mods]] | ||||
| @@ -151,8 +152,8 @@ ModDetails ReadMCModTOML(QByteArray contents) | ||||
|     QString authors = ""; | ||||
|     if (auto authorsDatum = tomlData["authors"].as_string()) { | ||||
|         authors = QString::fromStdString(authorsDatum->get()); | ||||
|     } else if (auto authorsDatum = (*modsTable)["authors"].as_string()) { | ||||
|         authors = QString::fromStdString(authorsDatum->get()); | ||||
|     } else if (auto authorsDatumMods = (*modsTable)["authors"].as_string()) { | ||||
|         authors = QString::fromStdString(authorsDatumMods->get()); | ||||
|     } | ||||
|     if (!authors.isEmpty()) { | ||||
|         details.authors.append(authors); | ||||
| @@ -161,8 +162,8 @@ ModDetails ReadMCModTOML(QByteArray contents) | ||||
|     QString homeurl = ""; | ||||
|     if (auto homeurlDatum = tomlData["displayURL"].as_string()) { | ||||
|         homeurl = QString::fromStdString(homeurlDatum->get()); | ||||
|     } else if (auto homeurlDatum = (*modsTable)["displayURL"].as_string()) { | ||||
|         homeurl = QString::fromStdString(homeurlDatum->get()); | ||||
|     } else if (auto homeurlDatumMods = (*modsTable)["displayURL"].as_string()) { | ||||
|         homeurl = QString::fromStdString(homeurlDatumMods->get()); | ||||
|     } | ||||
|     // fix up url. | ||||
|     if (!homeurl.isEmpty() && !homeurl.startsWith("http://") && !homeurl.startsWith("https://") && !homeurl.startsWith("ftp://")) { | ||||
| @@ -173,16 +174,16 @@ ModDetails ReadMCModTOML(QByteArray contents) | ||||
|     QString issueTrackerURL = ""; | ||||
|     if (auto issueTrackerURLDatum = tomlData["issueTrackerURL"].as_string()) { | ||||
|         issueTrackerURL = QString::fromStdString(issueTrackerURLDatum->get()); | ||||
|     } else if (auto issueTrackerURLDatum = (*modsTable)["issueTrackerURL"].as_string()) { | ||||
|         issueTrackerURL = QString::fromStdString(issueTrackerURLDatum->get()); | ||||
|     } else if (auto issueTrackerURLDatumMods = (*modsTable)["issueTrackerURL"].as_string()) { | ||||
|         issueTrackerURL = QString::fromStdString(issueTrackerURLDatumMods->get()); | ||||
|     } | ||||
|     details.issue_tracker = issueTrackerURL; | ||||
|  | ||||
|     QString license = ""; | ||||
|     if (auto licenseDatum = tomlData["license"].as_string()) { | ||||
|         license = QString::fromStdString(licenseDatum->get()); | ||||
|     } else if (auto licenseDatum = (*modsTable)["license"].as_string()) { | ||||
|         license = QString::fromStdString(licenseDatum->get()); | ||||
|     } else if (auto licenseDatumMods = (*modsTable)["license"].as_string()) { | ||||
|         license = QString::fromStdString(licenseDatumMods->get()); | ||||
|     } | ||||
|     if (!license.isEmpty()) | ||||
|         details.licenses.append(ModLicense(license)); | ||||
| @@ -190,8 +191,8 @@ ModDetails ReadMCModTOML(QByteArray contents) | ||||
|     QString logoFile = ""; | ||||
|     if (auto logoFileDatum = tomlData["logoFile"].as_string()) { | ||||
|         logoFile = QString::fromStdString(logoFileDatum->get()); | ||||
|     } else if (auto logoFileDatum = (*modsTable)["logoFile"].as_string()) { | ||||
|         logoFile = QString::fromStdString(logoFileDatum->get()); | ||||
|     } else if (auto logoFileDatumMods = (*modsTable)["logoFile"].as_string()) { | ||||
|         logoFile = QString::fromStdString(logoFileDatumMods->get()); | ||||
|     } | ||||
|     details.icon_file = logoFile; | ||||
|  | ||||
| @@ -458,7 +459,7 @@ bool process(Mod& mod, ProcessingLevel level) | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool processZIP(Mod& mod, ProcessingLevel level) | ||||
| bool processZIP(Mod& mod, [[maybe_unused]] ProcessingLevel level) | ||||
| { | ||||
|     ModDetails details; | ||||
|  | ||||
| @@ -591,7 +592,7 @@ bool processZIP(Mod& mod, ProcessingLevel level) | ||||
|     return false;  // no valid mod found in archive | ||||
| } | ||||
|  | ||||
| bool processFolder(Mod& mod, ProcessingLevel level) | ||||
| bool processFolder(Mod& mod, [[maybe_unused]] ProcessingLevel level) | ||||
| { | ||||
|     ModDetails details; | ||||
|  | ||||
| @@ -612,7 +613,7 @@ bool processFolder(Mod& mod, ProcessingLevel level) | ||||
|     return false;  // no valid mcmod.info file found | ||||
| } | ||||
|  | ||||
| bool processLitemod(Mod& mod, ProcessingLevel level) | ||||
| bool processLitemod(Mod& mod, [[maybe_unused]] ProcessingLevel level) | ||||
| { | ||||
|     ModDetails details; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Trial97
					Trial97