diff options
| author | Rachel Powers <508861+Ryex@users.noreply.github.com> | 2023-06-25 12:36:27 -0700 | 
|---|---|---|
| committer | Rachel Powers <508861+Ryex@users.noreply.github.com> | 2023-06-25 12:43:48 -0700 | 
| commit | df4fd7df7f98589c5dba85e4b5cdf0179a77faf5 (patch) | |
| tree | b382b0375a12d91305849f5dad41f4e0b04de8df /launcher/ui/pages/modplatform | |
| parent | c8ff812ab89044890d88779e33f3c6f86c4b8f74 (diff) | |
| parent | 1bd778d0ae27b3e87b800f773d5bc35708060c19 (diff) | |
| download | PrismLauncher-df4fd7df7f98589c5dba85e4b5cdf0179a77faf5.tar.gz PrismLauncher-df4fd7df7f98589c5dba85e4b5cdf0179a77faf5.tar.bz2 PrismLauncher-df4fd7df7f98589c5dba85e4b5cdf0179a77faf5.zip | |
Merge remote-tracking branch 'upstream/develop' into refactor/net-split-headers-to-proxy-class
Diffstat (limited to 'launcher/ui/pages/modplatform')
24 files changed, 258 insertions, 341 deletions
| diff --git a/launcher/ui/pages/modplatform/ImportPage.h b/launcher/ui/pages/modplatform/ImportPage.h index 8d13ac10..c2acb92d 100644 --- a/launcher/ui/pages/modplatform/ImportPage.h +++ b/launcher/ui/pages/modplatform/ImportPage.h @@ -57,7 +57,7 @@ public:      virtual ~ImportPage();      virtual QString displayName() const override      { -        return tr("Import from zip"); +        return tr("Import");      }      virtual QIcon icon() const override      { diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index 805d8b9a..dd187aa8 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -32,6 +32,7 @@ class ModModel : public ResourceModel {      void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) override = 0;      void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) override = 0;      void loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) override = 0; +    virtual ModPlatform::IndexedVersion loadDependencyVersions(const ModPlatform::Dependency& m, QJsonArray& arr) = 0;      void setFilter(std::shared_ptr<ModFilterWidget::Filter> filter) { m_filter = filter; } diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 95064d16..60a43128 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -89,17 +89,13 @@ void ModPage::filterMods()  void ModPage::triggerSearch()  { -    auto changed = m_filter_widget->changed();      m_filter = m_filter_widget->getFilter(); +    m_ui->packView->clearSelection(); +    m_ui->packDescription->clear(); +    m_ui->versionSelectionBox->clear(); +    updateSelectionButton(); -    if (changed) { -        m_ui->packView->clearSelection(); -        m_ui->packDescription->clear(); -        m_ui->versionSelectionBox->clear(); -        updateSelectionButton(); -    } - -    static_cast<ModModel*>(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), changed); +    static_cast<ModModel*>(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), m_filter_widget->changed());      m_fetch_progress.watch(m_model->activeSearchJob().get());  } @@ -122,6 +118,8 @@ void ModPage::updateVersionList()      QString mcVersion = packProfile->getComponentVersion("net.minecraft");      auto current_pack = getCurrentPack(); +    if (!current_pack) +        return;      for (int i = 0; i < current_pack->versions.size(); i++) {          auto version = current_pack->versions[i];          bool valid = false; diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 1d2509d8..aab2ee89 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -174,7 +174,11 @@ ModPlatform::IndexedPack::Ptr ResourcePage::getCurrentPack() const  void ResourcePage::updateUi()  {      auto current_pack = getCurrentPack(); - +    if (!current_pack) { +        m_ui->packDescription->setHtml({}); +        m_ui->packDescription->flush(); +        return; +    }      QString text = "";      QString name = current_pack->name; @@ -240,8 +244,8 @@ void ResourcePage::updateSelectionButton()      }      m_ui->resourceSelectionButton->setEnabled(true); -    if (getCurrentPack()) { -        if (!getCurrentPack()->isVersionSelected(m_selected_version_index)) +    if (auto current_pack = getCurrentPack(); current_pack) { +        if (!current_pack->isVersionSelected(m_selected_version_index))              m_ui->resourceSelectionButton->setText(tr("Select %1 for download").arg(resourceString()));          else              m_ui->resourceSelectionButton->setText(tr("Deselect %1 for download").arg(resourceString())); @@ -258,13 +262,14 @@ void ResourcePage::updateVersionList()      m_ui->versionSelectionBox->clear();      m_ui->versionSelectionBox->blockSignals(false); -    for (int i = 0; i < current_pack->versions.size(); i++) { -        auto& version = current_pack->versions[i]; -        if (optedOut(version)) -            continue; +    if (current_pack) +        for (int i = 0; i < current_pack->versions.size(); i++) { +            auto& version = current_pack->versions[i]; +            if (optedOut(version)) +                continue; -        m_ui->versionSelectionBox->addItem(current_pack->versions[i].version, QVariant(i)); -    } +            m_ui->versionSelectionBox->addItem(current_pack->versions[i].version, QVariant(i)); +        }      if (m_ui->versionSelectionBox->count() == 0) {          m_ui->versionSelectionBox->addItem(tr("No valid version found."), QVariant(-1)); @@ -283,7 +288,7 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)      auto current_pack = getCurrentPack();      bool request_load = false; -    if (!current_pack->versionsLoaded) { +    if (!current_pack || !current_pack->versionsLoaded) {          m_ui->resourceSelectionButton->setText(tr("Loading versions..."));          m_ui->resourceSelectionButton->setEnabled(false); @@ -292,7 +297,7 @@ void ResourcePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)          updateVersionList();      } -    if (!current_pack->extraDataLoaded) +    if (current_pack && !current_pack->extraDataLoaded)          request_load = true;      if (request_load) @@ -340,7 +345,7 @@ void ResourcePage::onResourceSelected()          return;      auto current_pack = getCurrentPack(); -    if (!current_pack->versionsLoaded) +    if (!current_pack || !current_pack->versionsLoaded)          return;      auto& version = current_pack->versions[m_selected_version_index]; @@ -386,7 +391,7 @@ void ResourcePage::openUrl(const QUrl& url)          const QString slug = match.captured(1);          // ensure the user isn't opening the same mod -        if (slug != getCurrentPack()->slug) { +        if (auto current_pack = getCurrentPack(); current_pack && slug != current_pack->slug) {              m_parent_dialog->selectPage(page);              auto newPage = m_parent_dialog->getSelectedPage(); diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp index e064919e..0f18fdfb 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp @@ -16,64 +16,51 @@  #include "AtlListModel.h" -#include <BuildConfig.h>  #include <Application.h> +#include <BuildConfig.h>  #include <Json.h>  #include "net/ApiDownload.h"  namespace Atl { -ListModel::ListModel(QObject *parent) : QAbstractListModel(parent) -{ -} +ListModel::ListModel(QObject* parent) : QAbstractListModel(parent) {} -ListModel::~ListModel() -{ -} +ListModel::~ListModel() {} -int ListModel::rowCount(const QModelIndex &parent) const +int ListModel::rowCount(const QModelIndex& parent) const  {      return parent.isValid() ? 0 : modpacks.size();  } -int ListModel::columnCount(const QModelIndex &parent) const +int ListModel::columnCount(const QModelIndex& parent) const  {      return parent.isValid() ? 0 : 1;  } -QVariant ListModel::data(const QModelIndex &index, int role) const +QVariant ListModel::data(const QModelIndex& index, int role) const  {      int pos = index.row(); -    if(pos >= modpacks.size() || pos < 0 || !index.isValid()) -    { +    if (pos >= modpacks.size() || pos < 0 || !index.isValid()) {          return QString("INVALID INDEX %1").arg(pos);      }      ATLauncher::IndexedPack pack = modpacks.at(pos); -    if(role == Qt::DisplayRole) -    { +    if (role == Qt::DisplayRole) {          return pack.name; -    } -    else if (role == Qt::ToolTipRole) -    { +    } else if (role == Qt::ToolTipRole) {          return pack.name; -    } -    else if(role == Qt::DecorationRole) -    { -        if(m_logoMap.contains(pack.safeName)) -        { +    } else if (role == Qt::DecorationRole) { +        if (m_logoMap.contains(pack.safeName)) {              return (m_logoMap.value(pack.safeName));          }          auto icon = APPLICATION->getThemedIcon("atlauncher-placeholder");          auto url = QString(BuildConfig.ATL_DOWNLOAD_SERVER_URL + "launcher/images/%1.png").arg(pack.safeName.toLower()); -        ((ListModel *)this)->requestLogo(pack.safeName, url); +        ((ListModel*)this)->requestLogo(pack.safeName, url);          return icon; -    } -    else if(role == Qt::UserRole) -    { +    } else if (role == Qt::UserRole) {          QVariant v;          v.setValue(pack);          return v; @@ -90,7 +77,7 @@ void ListModel::request()      auto netJob = makeShared<NetJob>("Atl::Request", APPLICATION->network());      auto url = QString(BuildConfig.ATL_DOWNLOAD_SERVER_URL + "launcher/json/packsnew.json"); -    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), &response)); +    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), response));      jobPtr = netJob;      jobPtr->start(); @@ -103,36 +90,38 @@ void ListModel::requestFinished()      jobPtr.reset();      QJsonParseError parse_error; -    QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error); -    if(parse_error.error != QJsonParseError::NoError) { +    QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); +    if (parse_error.error != QJsonParseError::NoError) {          qWarning() << "Error while parsing JSON response from ATL at " << parse_error.offset << " reason: " << parse_error.errorString(); -        qWarning() << response; +        qWarning() << *response;          return;      }      QList<ATLauncher::IndexedPack> newList;      auto packs = doc.array(); -    for(auto packRaw : packs) { +    for (auto packRaw : packs) {          auto packObj = packRaw.toObject();          ATLauncher::IndexedPack pack;          try {              ATLauncher::loadIndexedPack(pack, packObj); -        } -        catch (const JSONValidationError &e) { -            qDebug() << QString::fromUtf8(response); +        } catch (const JSONValidationError& e) { +            qDebug() << QString::fromUtf8(*response);              qWarning() << "Error while reading pack manifest from ATLauncher: " << e.cause();              return;          }          // ignore packs without a published version -        if(pack.versions.length() == 0) continue; +        if (pack.versions.length() == 0) +            continue;          // only display public packs (for now) -        if(pack.type != ATLauncher::PackType::Public) continue; +        if (pack.type != ATLauncher::PackType::Public) +            continue;          // ignore "system" packs (Vanilla, Vanilla with Forge, etc) -        if(pack.system) continue; +        if (pack.system) +            continue;          newList.append(pack);      } @@ -147,14 +136,12 @@ void ListModel::requestFailed(QString reason)      jobPtr.reset();  } -void ListModel::getLogo(const QString &logo, const QString &logoUrl, LogoCallback callback) +void ListModel::getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback)  { -    if(m_logoMap.contains(logo)) -    { -        callback(APPLICATION->metacache()->resolveEntry("ATLauncherPacks", QString("logos/%1").arg(logo.section(".", 0, 0)))->getFullPath()); -    } -    else -    { +    if (m_logoMap.contains(logo)) { +        callback( +            APPLICATION->metacache()->resolveEntry("ATLauncherPacks", QString("logos/%1").arg(logo.section(".", 0, 0)))->getFullPath()); +    } else {          requestLogo(logo, logoUrl);      }  } @@ -170,36 +157,34 @@ void ListModel::logoLoaded(QString logo, QIcon out)      m_loadingLogos.removeAll(logo);      m_logoMap.insert(logo, out); -    for(int i = 0; i < modpacks.size(); i++) { -        if(modpacks[i].safeName == logo) { -            emit dataChanged(createIndex(i, 0), createIndex(i, 0), {Qt::DecorationRole}); +    for (int i = 0; i < modpacks.size(); i++) { +        if (modpacks[i].safeName == logo) { +            emit dataChanged(createIndex(i, 0), createIndex(i, 0), { Qt::DecorationRole });          }      }  }  void ListModel::requestLogo(QString file, QString url)  { -    if(m_loadingLogos.contains(file) || m_failedLogos.contains(file)) -    { +    if (m_loadingLogos.contains(file) || m_failedLogos.contains(file)) {          return;      }      MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("ATLauncherPacks", QString("logos/%1").arg(file.section(".", 0, 0))); -    NetJob *job = new NetJob(QString("ATLauncher Icon Download %1").arg(file), APPLICATION->network()); +    auto job = new NetJob(QString("ATLauncher Icon Download %1").arg(file), APPLICATION->network());      job->addNetAction(Net::ApiDownload::makeCached(QUrl(url), entry));      auto fullPath = entry->getFullPath(); -    QObject::connect(job, &NetJob::succeeded, this, [this, file, fullPath] -    { +    QObject::connect(job, &NetJob::succeeded, this, [this, file, fullPath, job] { +        job->deleteLater();          emit logoLoaded(file, QIcon(fullPath)); -        if(waitingCallbacks.contains(file)) -        { +        if (waitingCallbacks.contains(file)) {              waitingCallbacks.value(file)(fullPath);          }      }); -    QObject::connect(job, &NetJob::failed, this, [this, file] -    { +    QObject::connect(job, &NetJob::failed, this, [this, file, job] { +        job->deleteLater();          emit logoFailed(file);      }); @@ -208,4 +193,4 @@ void ListModel::requestLogo(QString file, QString url)      m_loadingLogos.append(file);  } -} +}  // namespace Atl diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.h b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.h index 2574c48d..ed1fdc9f 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.h @@ -18,42 +18,41 @@  #include <QAbstractListModel> -#include "net/NetJob.h" -#include <QIcon>  #include <modplatform/atlauncher/ATLPackIndex.h> +#include <QIcon> +#include "net/NetJob.h"  namespace Atl {  typedef QMap<QString, QIcon> LogoMap;  typedef std::function<void(QString)> LogoCallback; -class ListModel : public QAbstractListModel -{ +class ListModel : public QAbstractListModel {      Q_OBJECT -public: -    ListModel(QObject *parent); +   public: +    ListModel(QObject* parent);      virtual ~ListModel(); -    int rowCount(const QModelIndex &parent) const override; -    int columnCount(const QModelIndex &parent) const override; -    QVariant data(const QModelIndex &index, int role) const override; +    int rowCount(const QModelIndex& parent) const override; +    int columnCount(const QModelIndex& parent) const override; +    QVariant data(const QModelIndex& index, int role) const override;      void request(); -    void getLogo(const QString &logo, const QString &logoUrl, LogoCallback callback); +    void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); -private slots: +   private slots:      void requestFinished();      void requestFailed(QString reason);      void logoFailed(QString logo);      void logoLoaded(QString logo, QIcon out); -private: +   private:      void requestLogo(QString file, QString url); -private: +   private:      QList<ATLauncher::IndexedPack> modpacks;      QStringList m_failedLogos; @@ -62,7 +61,7 @@ private:      QMap<QString, LogoCallback> waitingCallbacks;      NetJob::Ptr jobPtr; -    QByteArray response; +    std::shared_ptr<QByteArray> response = std::make_shared<QByteArray>();  }; -} +}  // namespace Atl diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp index edc73345..267894bf 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp @@ -154,7 +154,7 @@ Qt::ItemFlags AtlOptionalModListModel::flags(const QModelIndex &index) const {  void AtlOptionalModListModel::useShareCode(const QString& code) {      m_jobPtr.reset(new NetJob("Atl::Request", APPLICATION->network()));      auto url = QString(BuildConfig.ATL_API_BASE_URL + "share-codes/" + code); -    m_jobPtr->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), &m_response)); +    m_jobPtr->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), m_response));      connect(m_jobPtr.get(), &NetJob::succeeded,              this, &AtlOptionalModListModel::shareCodeSuccess); @@ -168,10 +168,10 @@ void AtlOptionalModListModel::shareCodeSuccess() {      m_jobPtr.reset();      QJsonParseError parse_error {}; -    auto doc = QJsonDocument::fromJson(m_response, &parse_error); +    auto doc = QJsonDocument::fromJson(*m_response, &parse_error);      if (parse_error.error != QJsonParseError::NoError) {          qWarning() << "Error while parsing JSON response from ATL at " << parse_error.offset << " reason: " << parse_error.errorString(); -        qWarning() << m_response; +        qWarning() << *m_response;          return;      }      auto obj = doc.object(); @@ -181,7 +181,7 @@ void AtlOptionalModListModel::shareCodeSuccess() {          ATLauncher::loadShareCodeResponse(response, obj);      }      catch (const JSONValidationError& e) { -        qDebug() << QString::fromUtf8(m_response); +        qDebug() << QString::fromUtf8(*m_response);          qWarning() << "Error while reading response from ATLauncher: " << e.cause();          return;      } diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h index 8e02444e..639f0d48 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.h @@ -82,9 +82,9 @@ private:      void toggleMod(ATLauncher::VersionMod mod, int index);      void setMod(ATLauncher::VersionMod mod, int index, bool enable, bool shouldEmit = true); -private: +   private:      NetJob::Ptr m_jobPtr; -    QByteArray m_response; +    std::shared_ptr<QByteArray> m_response = std::make_shared<QByteArray>();      ATLauncher::PackVersion m_version;      QVector<ATLauncher::VersionMod> m_mods; diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h index 37010b3f..adeb53cb 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h @@ -42,15 +42,15 @@  class AtlUserInteractionSupportImpl : public QObject, public ATLauncher::UserInteractionSupport {      Q_OBJECT -public: +   public:      AtlUserInteractionSupportImpl(QWidget* parent); +    virtual ~AtlUserInteractionSupportImpl() = default; -private: +   private:      QString chooseVersion(Meta::VersionList::Ptr vlist, QString minecraftVersion) override;      std::optional<QVector<QString>> chooseOptionalMods(ATLauncher::PackVersion version, QVector<ATLauncher::VersionMod> mods) override;      void displayMessage(QString message) override; -private: +   private:      QWidget* m_parent; -  }; diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index 0a5fd9ce..19ae40f3 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -173,7 +173,7 @@ void ListModel::performPaginatedSearch()                           .arg(currentSearchTerm)                           .arg(currentSort + 1); -    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), &response)); +    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response));      jobPtr = netJob;      jobPtr->start();      QObject::connect(netJob.get(), &NetJob::succeeded, this, &ListModel::searchRequestFinished); @@ -206,11 +206,11 @@ void Flame::ListModel::searchRequestFinished()      jobPtr.reset();      QJsonParseError parse_error; -    QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error); +    QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);      if (parse_error.error != QJsonParseError::NoError) {          qWarning() << "Error while parsing JSON response from CurseForge at " << parse_error.offset                     << " reason: " << parse_error.errorString(); -        qWarning() << response; +        qWarning() << *response;          return;      } diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.h b/launcher/ui/pages/modplatform/flame/FlameModel.h index cab666cc..b3bc96b8 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.h +++ b/launcher/ui/pages/modplatform/flame/FlameModel.h @@ -3,46 +3,44 @@  #include <RWStorage.h>  #include <QAbstractListModel> -#include <QSortFilterProxyModel> -#include <QThreadPool>  #include <QIcon> -#include <QStyledItemDelegate>  #include <QList> +#include <QMetaType> +#include <QSortFilterProxyModel>  #include <QString>  #include <QStringList> -#include <QMetaType> +#include <QStyledItemDelegate> +#include <QThreadPool> -#include <functional>  #include <net/NetJob.h> +#include <functional>  #include <modplatform/flame/FlamePackIndex.h>  namespace Flame { -  typedef QMap<QString, QIcon> LogoMap;  typedef std::function<void(QString)> LogoCallback; -class ListModel : public QAbstractListModel -{ +class ListModel : public QAbstractListModel {      Q_OBJECT -public: -    ListModel(QObject *parent); +   public: +    ListModel(QObject* parent);      virtual ~ListModel(); -    int rowCount(const QModelIndex &parent) const override; -    int columnCount(const QModelIndex &parent) const override; -    QVariant data(const QModelIndex &index, int role) const override; -    bool setData(const QModelIndex &index, const QVariant &value, int role) override; -    Qt::ItemFlags flags(const QModelIndex &index) const override; -    bool canFetchMore(const QModelIndex & parent) const override; -    void fetchMore(const QModelIndex & parent) override; +    int rowCount(const QModelIndex& parent) const override; +    int columnCount(const QModelIndex& parent) const override; +    QVariant data(const QModelIndex& index, int role) const override; +    bool setData(const QModelIndex& index, const QVariant& value, int role) override; +    Qt::ItemFlags flags(const QModelIndex& index) const override; +    bool canFetchMore(const QModelIndex& parent) const override; +    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 getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); +    void searchWithTerm(const QString& term, const int sort); -private slots: +   private slots:      void performPaginatedSearch();      void logoFailed(QString logo); @@ -51,10 +49,10 @@ private slots:      void searchRequestFinished();      void searchRequestFailed(QString reason); -private: +   private:      void requestLogo(QString file, QString url); -private: +   private:      QList<IndexedPack> modpacks;      QStringList m_failedLogos;      QStringList m_loadingLogos; @@ -64,14 +62,9 @@ private:      QString currentSearchTerm;      int currentSort = 0;      int nextSearchOffset = 0; -    enum SearchState { -        None, -        CanPossiblyFetchMore, -        ResetRequested, -        Finished -    } searchState = None; +    enum SearchState { None, CanPossiblyFetchMore, ResetRequested, Finished } searchState = None;      NetJob::Ptr jobPtr; -    QByteArray response; +    std::shared_ptr<QByteArray> response = std::make_shared<QByteArray>();  }; -} +}  // namespace Flame diff --git a/launcher/ui/pages/modplatform/flame/FlamePage.cpp b/launcher/ui/pages/modplatform/flame/FlamePage.cpp index c98e4060..534819d7 100644 --- a/launcher/ui/pages/modplatform/flame/FlamePage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlamePage.cpp @@ -132,7 +132,7 @@ void FlamePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)      if (current.versionsLoaded == false) {          qDebug() << "Loading flame modpack versions";          auto netJob = new NetJob(QString("Flame::PackVersions(%1)").arg(current.name), APPLICATION->network()); -        auto response = new QByteArray(); +        auto response = std::make_shared<QByteArray>();          int addonId = current.addonId;          netJob->addNetAction(Net::ApiDownload::makeByteArray(QString("https://api.curseforge.com/v1/mods/%1/files").arg(addonId), response)); @@ -172,10 +172,7 @@ void FlamePage::onSelectionChanged(QModelIndex curr, QModelIndex prev)              }              suggestCurrent();          }); -        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { -            netJob->deleteLater(); -            delete response; -        }); +        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { netJob->deleteLater(); });          netJob->start();      } else {          for (auto version : current.versions) { diff --git a/launcher/ui/pages/modplatform/flame/FlameResourceModels.cpp b/launcher/ui/pages/modplatform/flame/FlameResourceModels.cpp index 667a52d0..0fb67c50 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourceModels.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameResourceModels.cpp @@ -29,6 +29,11 @@ void FlameModModel::loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonAr      FlameMod::loadIndexedPackVersions(m, arr, APPLICATION->network(), &m_base_instance);  } +auto FlameModModel::loadDependencyVersions(const ModPlatform::Dependency& m, QJsonArray& arr) -> ModPlatform::IndexedVersion +{ +    return FlameMod::loadDependencyVersions(m, arr); +}; +  auto FlameModModel::documentToArray(QJsonDocument& obj) const -> QJsonArray  {      return Json::ensureArray(obj.object(), "data"); @@ -81,7 +86,7 @@ void FlameTexturePackModel::loadIndexedPackVersions(ModPlatform::IndexedPack& m,          auto const& mc_versions = version.mcVersion;          if (std::any_of(mc_versions.constBegin(), mc_versions.constEnd(), -                        [this](auto const& mc_version){ return Version(mc_version) <= maximumTexturePackVersion(); })) +                        [this](auto const& mc_version) { return Version(mc_version) <= maximumTexturePackVersion(); }))              filtered_versions.push_back(version);      } diff --git a/launcher/ui/pages/modplatform/flame/FlameResourceModels.h b/launcher/ui/pages/modplatform/flame/FlameResourceModels.h index 221c8f7a..6cfd6a6f 100644 --- a/launcher/ui/pages/modplatform/flame/FlameResourceModels.h +++ b/launcher/ui/pages/modplatform/flame/FlameResourceModels.h @@ -24,6 +24,7 @@ class FlameModModel : public ModModel {      void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) override;      void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) override;      void loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) override; +    auto loadDependencyVersions(const ModPlatform::Dependency& m, QJsonArray& arr) -> ModPlatform::IndexedVersion override;      auto documentToArray(QJsonDocument& obj) const -> QJsonArray override;  }; diff --git a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp index c391c128..aca66e0d 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp @@ -39,11 +39,11 @@  #include "net/NetJob.h"  #include "net/ApiDownload.h" -#include "StringUtils.h"  #include <Version.h> +#include "StringUtils.h" -#include <QtMath>  #include <QLabel> +#include <QtMath>  #include <RWStorage.h> @@ -51,33 +51,33 @@  namespace LegacyFTB { -FilterModel::FilterModel(QObject *parent) : QSortFilterProxyModel(parent) +FilterModel::FilterModel(QObject* parent) : QSortFilterProxyModel(parent)  {      currentSorting = Sorting::ByGameVersion;      sortings.insert(tr("Sort by Name"), Sorting::ByName);      sortings.insert(tr("Sort by Game Version"), Sorting::ByGameVersion);  } -bool FilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +bool FilterModel::lessThan(const QModelIndex& left, const QModelIndex& right) const  {      Modpack leftPack = sourceModel()->data(left, Qt::UserRole).value<Modpack>();      Modpack rightPack = sourceModel()->data(right, Qt::UserRole).value<Modpack>(); -    if(currentSorting == Sorting::ByGameVersion) { +    if (currentSorting == Sorting::ByGameVersion) {          Version lv(leftPack.mcVersion);          Version rv(rightPack.mcVersion);          return lv < rv; -    } else if(currentSorting == Sorting::ByName) { +    } else if (currentSorting == Sorting::ByName) {          return StringUtils::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0;      } -    //UHM, some inavlid value set?! +    // UHM, some inavlid value set?!      qWarning() << "Invalid sorting set!";      return true;  } -bool FilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +bool FilterModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const  {      return true;  } @@ -103,18 +103,13 @@ FilterModel::Sorting FilterModel::getCurrentSorting()      return currentSorting;  } -ListModel::ListModel(QObject *parent) : QAbstractListModel(parent) -{ -} +ListModel::ListModel(QObject* parent) : QAbstractListModel(parent) {} -ListModel::~ListModel() -{ -} +ListModel::~ListModel() {}  QString ListModel::translatePackType(PackType type) const  { -    switch(type) -    { +    switch (type) {          case PackType::Public:              return tr("Public Modpack");          case PackType::ThirdParty: @@ -126,67 +121,51 @@ QString ListModel::translatePackType(PackType type) const      return QString();  } -int ListModel::rowCount(const QModelIndex &parent) const +int ListModel::rowCount(const QModelIndex& parent) const  {      return parent.isValid() ? 0 : modpacks.size();  } -int ListModel::columnCount(const QModelIndex &parent) const +int ListModel::columnCount(const QModelIndex& parent) const  {      return parent.isValid() ? 0 : 1;  } -QVariant ListModel::data(const QModelIndex &index, int role) const +QVariant ListModel::data(const QModelIndex& index, int role) const  {      int pos = index.row(); -    if(pos >= modpacks.size() || pos < 0 || !index.isValid()) -    { +    if (pos >= modpacks.size() || pos < 0 || !index.isValid()) {          return QString("INVALID INDEX %1").arg(pos);      }      Modpack pack = modpacks.at(pos); -    if(role == Qt::DisplayRole) -    { +    if (role == Qt::DisplayRole) {          return pack.name + "\n" + translatePackType(pack.type); -    } -    else if (role == Qt::ToolTipRole) -    { -        if(pack.description.length() > 100) -        { -            //some magic to prevent to long tooltips and replace html linebreaks +    } else if (role == Qt::ToolTipRole) { +        if (pack.description.length() > 100) { +            // some magic to prevent to long tooltips and replace html linebreaks              QString edit = pack.description.left(97);              edit = edit.left(edit.lastIndexOf("<br>")).left(edit.lastIndexOf(" ")).append("...");              return edit; -          }          return pack.description; -    } -    else if(role == Qt::DecorationRole) -    { -        if(m_logoMap.contains(pack.logo)) -        { +    } else if (role == Qt::DecorationRole) { +        if (m_logoMap.contains(pack.logo)) {              return (m_logoMap.value(pack.logo));          }          QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder"); -        ((ListModel *)this)->requestLogo(pack.logo); +        ((ListModel*)this)->requestLogo(pack.logo);          return icon; -    } -    else if(role == Qt::ForegroundRole) -    { -        if(pack.broken) -        { -            //FIXME: Hardcoded color +    } else if (role == Qt::ForegroundRole) { +        if (pack.broken) { +            // FIXME: Hardcoded color              return QColor(255, 0, 50); -        } -        else if(pack.bugged) -        { -            //FIXME: Hardcoded color -            //bugged pack, currently only indicates bugged xml +        } else if (pack.bugged) { +            // FIXME: Hardcoded color +            // bugged pack, currently only indicates bugged xml              return QColor(244, 229, 66);          } -    } -    else if(role == Qt::UserRole) -    { +    } else if (role == Qt::UserRole) {          QVariant v;          v.setValue(pack);          return v; @@ -223,8 +202,7 @@ Modpack ListModel::at(int row)  void ListModel::remove(int row)  { -    if(row < 0 || row >= modpacks.size()) -    { +    if (row < 0 || row >= modpacks.size()) {          qWarning() << "Attempt to remove FTB modpacks with invalid row" << row;          return;      } @@ -248,27 +226,25 @@ void ListModel::logoFailed(QString logo)  void ListModel::requestLogo(QString file)  { -    if(m_loadingLogos.contains(file) || m_failedLogos.contains(file)) -    { +    if (m_loadingLogos.contains(file) || m_failedLogos.contains(file)) {          return;      }      MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("FTBPacks", QString("logos/%1").arg(file.section(".", 0, 0))); -    NetJob *job = new NetJob(QString("FTB Icon Download for %1").arg(file), APPLICATION->network()); +    NetJob* job = new NetJob(QString("FTB Icon Download for %1").arg(file), APPLICATION->network());      job->addNetAction(Net::ApiDownload::makeCached(QUrl(QString(BuildConfig.LEGACY_FTB_CDN_BASE_URL + "static/%1").arg(file)), entry));      auto fullPath = entry->getFullPath(); -    QObject::connect(job, &NetJob::finished, this, [this, file, fullPath] -    { +    QObject::connect(job, &NetJob::finished, this, [this, file, fullPath, job] { +        job->deleteLater();          emit logoLoaded(file, QIcon(fullPath)); -        if(waitingCallbacks.contains(file)) -        { +        if (waitingCallbacks.contains(file)) {              waitingCallbacks.value(file)(fullPath);          }      }); -    QObject::connect(job, &NetJob::failed, this, [this, file] -    { +    QObject::connect(job, &NetJob::failed, this, [this, file, job] { +        job->deleteLater();          emit logoFailed(file);      }); @@ -277,21 +253,18 @@ void ListModel::requestLogo(QString file)      m_loadingLogos.append(file);  } -void ListModel::getLogo(const QString &logo, LogoCallback callback) +void ListModel::getLogo(const QString& logo, LogoCallback callback)  { -    if(m_logoMap.contains(logo)) -    { +    if (m_logoMap.contains(logo)) {          callback(APPLICATION->metacache()->resolveEntry("FTBPacks", QString("logos/%1").arg(logo.section(".", 0, 0)))->getFullPath()); -    } -    else -    { +    } else {          requestLogo(logo);      }  } -Qt::ItemFlags ListModel::flags(const QModelIndex &index) const +Qt::ItemFlags ListModel::flags(const QModelIndex& index) const  {      return QAbstractListModel::flags(index);  } -} +}  // namespace LegacyFTB diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp index b28845fc..1c0d523c 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.cpp @@ -133,27 +133,27 @@ void ModpackListModel::performPaginatedSearch()      // TODO: Move to standalone API      auto netJob = makeShared<NetJob>("Modrinth::SearchModpack", APPLICATION->network());      auto searchAllUrl = QString(BuildConfig.MODRINTH_PROD_URL + -                            "/search?" -                            "offset=%1&" -                            "limit=%2&" -                            "query=%3&" -                            "index=%4&" -                            "facets=[[\"project_type:modpack\"]]") +                                "/search?" +                                "offset=%1&" +                                "limit=%2&" +                                "query=%3&" +                                "index=%4&" +                                "facets=[[\"project_type:modpack\"]]")                              .arg(nextSearchOffset)                              .arg(m_modpacks_per_page)                              .arg(currentSearchTerm)                              .arg(currentSort); -    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchAllUrl), &m_all_response)); +    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchAllUrl), m_all_response));      QObject::connect(netJob.get(), &NetJob::succeeded, this, [this] {          QJsonParseError parse_error_all{}; -        QJsonDocument doc_all = QJsonDocument::fromJson(m_all_response, &parse_error_all); +        QJsonDocument doc_all = QJsonDocument::fromJson(*m_all_response, &parse_error_all);          if (parse_error_all.error != QJsonParseError::NoError) {              qWarning() << "Error while parsing JSON response from " << debugName() << " at " << parse_error_all.offset                         << " reason: " << parse_error_all.errorString(); -            qWarning() << m_all_response; +            qWarning() << *m_all_response;              return;          } diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 6e6be4b9..b9e9c3da 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -110,9 +110,9 @@ class ModpackListModel : public QAbstractListModel {      NetJob::Ptr jobPtr; -    QByteArray m_all_response; +    std::shared_ptr<QByteArray> m_all_response = std::make_shared<QByteArray>();      QByteArray m_specific_response;      int m_modpacks_per_page = 20;  }; -}  // namespace ModPlatform +}  // namespace Modrinth diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp index c450395c..e7d75dcf 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthPage.cpp @@ -125,7 +125,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)          qDebug() << "Loading modrinth modpack information";          auto netJob = new NetJob(QString("Modrinth::PackInformation(%1)").arg(current.name), APPLICATION->network()); -        auto response = new QByteArray(); +        auto response = std::make_shared<QByteArray>();          QString id = current.id; @@ -164,10 +164,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)              suggestCurrent();          }); -        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { -            netJob->deleteLater(); -            delete response; -        }); +        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { netJob->deleteLater(); });          netJob->start();      } else          updateUI(); @@ -176,7 +173,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)          qDebug() << "Loading modrinth modpack versions";          auto netJob = new NetJob(QString("Modrinth::PackVersions(%1)").arg(current.name), APPLICATION->network()); -        auto response = new QByteArray(); +        auto response = std::make_shared<QByteArray>();          QString id = current.id; @@ -219,10 +216,7 @@ void ModrinthPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)              suggestCurrent();          }); -        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { -            netJob->deleteLater(); -            delete response; -        }); +        QObject::connect(netJob, &NetJob::finished, this, [response, netJob] { netJob->deleteLater(); });          netJob->start();      } else { @@ -262,10 +256,8 @@ void ModrinthPage::updateUI()              text += donates.join(", ");          } -        if (!current.extra.issuesUrl.isEmpty() -         || !current.extra.sourceUrl.isEmpty() -         || !current.extra.wikiUrl.isEmpty() -         || !current.extra.discordUrl.isEmpty()) { +        if (!current.extra.issuesUrl.isEmpty() || !current.extra.sourceUrl.isEmpty() || !current.extra.wikiUrl.isEmpty() || +            !current.extra.discordUrl.isEmpty()) {              text += "<br><br>" + tr("External links:") + "<br>";          } diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.cpp index 7f857485..8aa64989 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.cpp @@ -42,12 +42,17 @@ void ModrinthModModel::loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJso      ::Modrinth::loadIndexedPackVersions(m, arr, APPLICATION->network(), &m_base_instance);  } +auto ModrinthModModel::loadDependencyVersions(const ModPlatform::Dependency& m, QJsonArray& arr) -> ModPlatform::IndexedVersion +{ +    return ::Modrinth::loadDependencyVersions(m, arr); +}; +  auto ModrinthModModel::documentToArray(QJsonDocument& obj) const -> QJsonArray  {      return obj.object().value("hits").toArray();  } -ModrinthResourcePackModel::ModrinthResourcePackModel(const BaseInstance& base)  : ResourcePackResourceModel(base, new ModrinthAPI){} +ModrinthResourcePackModel::ModrinthResourcePackModel(const BaseInstance& base) : ResourcePackResourceModel(base, new ModrinthAPI) {}  void ModrinthResourcePackModel::loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj)  { @@ -69,7 +74,7 @@ auto ModrinthResourcePackModel::documentToArray(QJsonDocument& obj) const -> QJs      return obj.object().value("hits").toArray();  } -ModrinthTexturePackModel::ModrinthTexturePackModel(const BaseInstance& base)  : TexturePackResourceModel(base, new ModrinthAPI){} +ModrinthTexturePackModel::ModrinthTexturePackModel(const BaseInstance& base) : TexturePackResourceModel(base, new ModrinthAPI) {}  void ModrinthTexturePackModel::loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj)  { @@ -91,7 +96,7 @@ auto ModrinthTexturePackModel::documentToArray(QJsonDocument& obj) const -> QJso      return obj.object().value("hits").toArray();  } -ModrinthShaderPackModel::ModrinthShaderPackModel(const BaseInstance& base)  : ShaderPackResourceModel(base, new ModrinthAPI){} +ModrinthShaderPackModel::ModrinthShaderPackModel(const BaseInstance& base) : ShaderPackResourceModel(base, new ModrinthAPI) {}  void ModrinthShaderPackModel::loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj)  { diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.h b/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.h index 66461807..d7c858f8 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthResourceModels.h @@ -40,6 +40,7 @@ class ModrinthModModel : public ModModel {      void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) override;      void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) override;      void loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) override; +    auto loadDependencyVersions(const ModPlatform::Dependency& m, QJsonArray& arr) -> ModPlatform::IndexedVersion override;      auto documentToArray(QJsonDocument& obj) const -> QJsonArray override;  }; diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 0790fb0b..bffe1120 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -42,39 +42,28 @@  #include <QIcon> -Technic::ListModel::ListModel(QObject *parent) : QAbstractListModel(parent) -{ -} +Technic::ListModel::ListModel(QObject* parent) : QAbstractListModel(parent) {} -Technic::ListModel::~ListModel() -{ -} +Technic::ListModel::~ListModel() {}  QVariant Technic::ListModel::data(const QModelIndex& index, int role) const  {      int pos = index.row(); -    if(pos >= modpacks.size() || pos < 0 || !index.isValid()) -    { +    if (pos >= modpacks.size() || pos < 0 || !index.isValid()) {          return QString("INVALID INDEX %1").arg(pos);      }      Modpack pack = modpacks.at(pos); -    if(role == Qt::DisplayRole) -    { +    if (role == Qt::DisplayRole) {          return pack.name; -    } -    else if(role == Qt::DecorationRole) -    { -        if(m_logoMap.contains(pack.logoName)) -        { +    } else if (role == Qt::DecorationRole) { +        if (m_logoMap.contains(pack.logoName)) {              return (m_logoMap.value(pack.logoName));          }          QIcon icon = APPLICATION->getThemedIcon("screenshot-placeholder"); -        ((ListModel *)this)->requestLogo(pack.logoName, pack.logoUrl); +        ((ListModel*)this)->requestLogo(pack.logoName, pack.logoUrl);          return icon; -    } -    else if(role == Qt::UserRole) -    { +    } else if (role == Qt::UserRole) {          QVariant v;          v.setValue(pack);          return v; @@ -94,16 +83,15 @@ int Technic::ListModel::rowCount(const QModelIndex& parent) const  void Technic::ListModel::searchWithTerm(const QString& term)  { -    if(currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull()) { +    if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull()) {          return;      }      currentSearchTerm = term; -    if(jobPtr) { +    if (jobPtr) {          jobPtr->abort();          searchState = ResetRequested;          return; -    } -    else { +    } else {          beginResetModel();          modpacks.clear();          endResetModel(); @@ -117,26 +105,20 @@ void Technic::ListModel::performSearch()      auto netJob = makeShared<NetJob>("Technic::Search", APPLICATION->network());      QString searchUrl = "";      if (currentSearchTerm.isEmpty()) { -        searchUrl = QString("%1trending?build=%2") -                .arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD); +        searchUrl = QString("%1trending?build=%2").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD);          searchMode = List; -    } -    else if (currentSearchTerm.startsWith("http://api.technicpack.net/modpack/")) { -        searchUrl = QString("https://%1?build=%2") -                .arg(currentSearchTerm.mid(7), BuildConfig.TECHNIC_API_BUILD); +    } else if (currentSearchTerm.startsWith("http://api.technicpack.net/modpack/")) { +        searchUrl = QString("https://%1?build=%2").arg(currentSearchTerm.mid(7), BuildConfig.TECHNIC_API_BUILD);          searchMode = Single; -    } -    else if (currentSearchTerm.startsWith("https://api.technicpack.net/modpack/")) { +    } else if (currentSearchTerm.startsWith("https://api.technicpack.net/modpack/")) {          searchUrl = QString("%1?build=%2").arg(currentSearchTerm, BuildConfig.TECHNIC_API_BUILD);          searchMode = Single; -    } -    else { -        searchUrl = QString( -            "%1search?build=%2&q=%3" -        ).arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm); +    } else { +        searchUrl = +            QString("%1search?build=%2&q=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, BuildConfig.TECHNIC_API_BUILD, currentSearchTerm);          searchMode = List;      } -    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), &response)); +    netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(searchUrl), response));      jobPtr = netJob;      jobPtr->start();      QObject::connect(netJob.get(), &NetJob::succeeded, this, &ListModel::searchRequestFinished); @@ -148,11 +130,11 @@ void Technic::ListModel::searchRequestFinished()      jobPtr.reset();      QJsonParseError parse_error; -    QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error); -    if(parse_error.error != QJsonParseError::NoError) -    { -        qWarning() << "Error while parsing JSON response from Technic at " << parse_error.offset << " reason: " << parse_error.errorString(); -        qWarning() << response; +    QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); +    if (parse_error.error != QJsonParseError::NoError) { +        qWarning() << "Error while parsing JSON response from Technic at " << parse_error.offset +                   << " reason: " << parse_error.errorString(); +        qWarning() << *response;          return;      } @@ -163,7 +145,7 @@ void Technic::ListModel::searchRequestFinished()          switch (searchMode) {              case List: {                  auto objs = Json::requireArray(root, "modpacks"); -                for (auto technicPack: objs) { +                for (auto technicPack : objs) {                      Modpack pack;                      auto technicPackObject = Json::requireObject(technicPack);                      pack.name = Json::requireString(technicPackObject, "name"); @@ -172,11 +154,10 @@ void Technic::ListModel::searchRequestFinished()                          continue;                      auto rawURL = Json::ensureString(technicPackObject, "iconUrl", "null"); -                    if(rawURL == "null") { +                    if (rawURL == "null") {                          pack.logoUrl = "null";                          pack.logoName = "null"; -                    } -                    else { +                    } else {                          pack.logoUrl = rawURL;                          pack.logoName = rawURL.section(QLatin1Char('/'), -1).section(QLatin1Char('.'), 0, 0);                      } @@ -201,8 +182,7 @@ void Technic::ListModel::searchRequestFinished()                      pack.logoUrl = iconUrl;                      pack.logoName = iconUrl.section(QLatin1Char('/'), -1).section(QLatin1Char('.'), 0, 0); -                } -                else { +                } else {                      pack.logoUrl = "null";                      pack.logoName = "null";                  } @@ -212,10 +192,8 @@ void Technic::ListModel::searchRequestFinished()                  break;              }          } -    } -    catch (const JSONValidationError &err) -    { -        qCritical() << "Couldn't parse technic search results:" << err.cause() ; +    } catch (const JSONValidationError& err) { +        qCritical() << "Couldn't parse technic search results:" << err.cause();          return;      }      searchState = Finished; @@ -231,12 +209,9 @@ void Technic::ListModel::searchRequestFinished()  void Technic::ListModel::getLogo(const QString& logo, const QString& logoUrl, Technic::LogoCallback callback)  { -    if(m_logoMap.contains(logo)) -    { +    if (m_logoMap.contains(logo)) {          callback(APPLICATION->metacache()->resolveEntry("TechnicPacks", QString("logos/%1").arg(logo))->getFullPath()); -    } -    else -    { +    } else {          requestLogo(logo, logoUrl);      }  } @@ -245,30 +220,24 @@ void Technic::ListModel::searchRequestFailed()  {      jobPtr.reset(); -    if(searchState == ResetRequested) -    { +    if (searchState == ResetRequested) {          beginResetModel();          modpacks.clear();          endResetModel();          performSearch(); -    } -    else -    { +    } else {          searchState = Finished;      }  } -  void Technic::ListModel::logoLoaded(QString logo, QString out)  {      m_loadingLogos.removeAll(logo);      m_logoMap.insert(logo, QIcon(out)); -    for(int i = 0; i < modpacks.size(); i++) -    { -        if(modpacks[i].logoName == logo) -        { -            emit dataChanged(createIndex(i, 0), createIndex(i, 0), {Qt::DecorationRole}); +    for (int i = 0; i < modpacks.size(); i++) { +        if (modpacks[i].logoName == logo) { +            emit dataChanged(createIndex(i, 0), createIndex(i, 0), { Qt::DecorationRole });          }      }  } @@ -281,24 +250,23 @@ void Technic::ListModel::logoFailed(QString logo)  void Technic::ListModel::requestLogo(QString logo, QString url)  { -    if(m_loadingLogos.contains(logo) || m_failedLogos.contains(logo) || logo == "null") -    { +    if (m_loadingLogos.contains(logo) || m_failedLogos.contains(logo) || logo == "null") {          return;      }      MetaEntryPtr entry = APPLICATION->metacache()->resolveEntry("TechnicPacks", QString("logos/%1").arg(logo)); -    NetJob *job = new NetJob(QString("Technic Icon Download %1").arg(logo), APPLICATION->network()); +    auto job = new NetJob(QString("Technic Icon Download %1").arg(logo), APPLICATION->network());      job->addNetAction(Net::ApiDownload::makeCached(QUrl(url), entry));      auto fullPath = entry->getFullPath(); -    QObject::connect(job, &NetJob::succeeded, this, [this, logo, fullPath] -    { +    QObject::connect(job, &NetJob::succeeded, this, [this, logo, fullPath, job] { +        job->deleteLater();          logoLoaded(logo, fullPath);      }); -    QObject::connect(job, &NetJob::failed, this, [this, logo] -    { +    QObject::connect(job, &NetJob::failed, this, [this, logo, job] { +        job->deleteLater();          logoFailed(logo);      }); diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.h b/launcher/ui/pages/modplatform/technic/TechnicModel.h index 5eea124c..0f1a814e 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.h +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.h @@ -44,33 +44,32 @@ namespace Technic {  typedef std::function<void(QString)> LogoCallback; -class ListModel : public QAbstractListModel -{ +class ListModel : public QAbstractListModel {      Q_OBJECT -public: -    ListModel(QObject *parent); +   public: +    ListModel(QObject* parent);      virtual ~ListModel();      virtual QVariant data(const QModelIndex& index, int role) const;      virtual int columnCount(const QModelIndex& parent) const;      virtual int rowCount(const QModelIndex& parent) const; -    void getLogo(const QString &logo, const QString &logoUrl, LogoCallback callback); -    void searchWithTerm(const QString & term); +    void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); +    void searchWithTerm(const QString& term); -private slots: +   private slots:      void searchRequestFinished();      void searchRequestFailed();      void logoFailed(QString logo);      void logoLoaded(QString logo, QString out); -private: +   private:      void performSearch();      void requestLogo(QString logo, QString url); -private: +   private:      QList<Modpack> modpacks;      QStringList m_failedLogos;      QStringList m_loadingLogos; @@ -78,17 +77,13 @@ private:      QMap<QString, LogoCallback> waitingCallbacks;      QString currentSearchTerm; -    enum SearchState { -        None, -        ResetRequested, -        Finished -    } searchState = None; +    enum SearchState { None, ResetRequested, Finished } searchState = None;      enum SearchMode {          List,          Single,      } searchMode = List;      NetJob::Ptr jobPtr; -    QByteArray response; +    std::shared_ptr<QByteArray> response = std::make_shared<QByteArray>();  }; -} +}  // namespace Technic diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp index 5aabcf34..7ac388a0 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.cpp @@ -145,7 +145,7 @@ void TechnicPage::suggestCurrent()      auto netJob = makeShared<NetJob>(QString("Technic::PackMeta(%1)").arg(current.name), APPLICATION->network());      QString slug = current.slug; -    netJob->addNetAction(Net::ApiDownload::makeByteArray(QString("%1modpack/%2?build=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, slug, BuildConfig.TECHNIC_API_BUILD), &response)); +    netJob->addNetAction(Net::ApiDownload::makeByteArray(QString("%1modpack/%2?build=%3").arg(BuildConfig.TECHNIC_API_BASE_URL, slug, BuildConfig.TECHNIC_API_BUILD), response));      QObject::connect(netJob.get(), &NetJob::succeeded, this, [this, slug]      {          jobPtr.reset(); @@ -156,7 +156,7 @@ void TechnicPage::suggestCurrent()          }          QJsonParseError parse_error {}; -        QJsonDocument doc = QJsonDocument::fromJson(response, &parse_error); +        QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error);          QJsonObject obj = doc.object();          if(parse_error.error != QJsonParseError::NoError)          { @@ -251,7 +251,7 @@ void TechnicPage::metadataLoaded()          auto netJob = makeShared<NetJob>(QString("Technic::SolderMeta(%1)").arg(current.name), APPLICATION->network());          auto url = QString("%1/modpack/%2").arg(current.url, current.slug); -        netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), &response)); +        netJob->addNetAction(Net::ApiDownload::makeByteArray(QUrl(url), response));          QObject::connect(netJob.get(), &NetJob::succeeded, this, &TechnicPage::onSolderLoaded); @@ -293,11 +293,11 @@ void TechnicPage::onSolderLoaded() {      current.versions.clear(); -    QJsonParseError parse_error {}; -    auto doc = QJsonDocument::fromJson(response, &parse_error); +    QJsonParseError parse_error{}; +    auto doc = QJsonDocument::fromJson(*response, &parse_error);      if (parse_error.error != QJsonParseError::NoError) {          qWarning() << "Error while parsing JSON response from Solder at " << parse_error.offset << " reason: " << parse_error.errorString(); -        qWarning() << response; +        qWarning() << *response;          fallback();          return;      } @@ -306,8 +306,7 @@ void TechnicPage::onSolderLoaded() {      TechnicSolder::Pack pack;      try {          TechnicSolder::loadPack(pack, obj); -    } -    catch (const JSONValidationError& err) { +    } catch (const JSONValidationError& err) {          qCritical() << "Couldn't parse Solder pack metadata:" << err.cause();          fallback();          return; diff --git a/launcher/ui/pages/modplatform/technic/TechnicPage.h b/launcher/ui/pages/modplatform/technic/TechnicPage.h index f4a3b61d..753261b3 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicPage.h +++ b/launcher/ui/pages/modplatform/technic/TechnicPage.h @@ -104,5 +104,5 @@ private:      QString selectedVersion;      NetJob::Ptr jobPtr; -    QByteArray response; +    std::shared_ptr<QByteArray> response = std::make_shared<QByteArray>();  }; | 
