From 563fe8d51529bc4c769f5a08bc037fc40cbfe852 Mon Sep 17 00:00:00 2001 From: flow Date: Tue, 20 Dec 2022 17:14:17 -0300 Subject: [PATCH] fix(RD): separate search and versions/info tasks This allows us to check whether a search request is already on-going, in which case we don't need to make another one (and shouldn't). Signed-off-by: flow --- launcher/ui/pages/modplatform/ModPage.cpp | 2 +- .../ui/pages/modplatform/ResourceModel.cpp | 45 +++++++++++++++---- launcher/ui/pages/modplatform/ResourceModel.h | 13 ++++-- .../ui/pages/modplatform/ResourcePage.cpp | 4 +- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 04cbddcb..d57e748b 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -101,7 +101,7 @@ void ModPage::triggerSearch() } static_cast(m_model)->searchWithTerm(getSearchTerm(), m_ui->sortByBox->currentData().toUInt(), changed); - m_fetch_progress.watch(&m_model->activeJob()); + m_fetch_progress.watch(m_model->activeSearchJob().get()); } QMap ModPage::urlHandlers() const diff --git a/launcher/ui/pages/modplatform/ResourceModel.cpp b/launcher/ui/pages/modplatform/ResourceModel.cpp index eedc5202..5bbd39d3 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.cpp +++ b/launcher/ui/pages/modplatform/ResourceModel.cpp @@ -123,8 +123,8 @@ void ResourceModel::fetchMore(const QModelIndex& parent) void ResourceModel::search() { - if (!m_current_job.isRunning()) - m_current_job.clear(); + if (hasActiveSearchJob()) + return; auto args{ createSearchArguments() }; @@ -146,22 +146,22 @@ void ResourceModel::search() }; if (auto job = m_api->searchProjects(std::move(args), std::move(callbacks)); job) - addActiveJob(job); + runSearchJob(job); } void ResourceModel::loadEntry(QModelIndex& entry) { auto const& pack = m_packs[entry.row()]; - if (!m_current_job.isRunning()) - m_current_job.clear(); + if (!hasActiveInfoJob()) + m_current_info_job.clear(); if (!pack.versionsLoaded) { auto args{ createVersionsArguments(entry) }; auto callbacks{ createVersionsCallbacks(entry) }; if (auto job = m_api->getProjectVersions(std::move(args), std::move(callbacks)); job) - addActiveJob(job); + runInfoJob(job); } if (!pack.extraDataLoaded) { @@ -169,14 +169,25 @@ void ResourceModel::loadEntry(QModelIndex& entry) auto callbacks{ createInfoCallbacks(entry) }; if (auto job = m_api->getProjectInfo(std::move(args), std::move(callbacks)); job) - addActiveJob(job); + runInfoJob(job); } } void ResourceModel::refresh() { - if (m_current_job.isRunning()) { - m_current_job.abort(); + bool reset_requested = false; + + if (hasActiveInfoJob()) { + m_current_info_job.abort(); + reset_requested = true; + } + + if (hasActiveSearchJob()) { + m_current_search_job->abort(); + reset_requested = true; + } + + if (reset_requested) { m_search_state = SearchState::ResetRequested; return; } @@ -195,6 +206,22 @@ void ResourceModel::clearData() endResetModel(); } +void ResourceModel::runSearchJob(NetJob::Ptr ptr) +{ + m_current_search_job = ptr; + m_current_search_job->start(); +} +void ResourceModel::runInfoJob(Task::Ptr ptr) +{ + if (!m_current_info_job.isRunning()) + m_current_info_job.clear(); + + m_current_info_job.addTask(ptr); + + if (!m_current_info_job.isRunning()) + m_current_info_job.run(); +} + std::optional ResourceModel::getIcon(QModelIndex& index, const QUrl& url) { QPixmap pixmap; diff --git a/launcher/ui/pages/modplatform/ResourceModel.h b/launcher/ui/pages/modplatform/ResourceModel.h index facff91d..5f9ce36d 100644 --- a/launcher/ui/pages/modplatform/ResourceModel.h +++ b/launcher/ui/pages/modplatform/ResourceModel.h @@ -40,8 +40,9 @@ class ResourceModel : public QAbstractListModel { [[nodiscard]] inline int columnCount(const QModelIndex& parent) const override { return parent.isValid() ? 0 : 1; } [[nodiscard]] inline auto flags(const QModelIndex& index) const -> Qt::ItemFlags override { return QAbstractListModel::flags(index); } - inline void addActiveJob(Task::Ptr ptr) { m_current_job.addTask(ptr); if (!m_current_job.isRunning()) m_current_job.start(); } - inline Task const& activeJob() { return m_current_job; } + [[nodiscard]] bool hasActiveSearchJob() const { return m_current_search_job && m_current_search_job->isRunning(); } + [[nodiscard]] bool hasActiveInfoJob() const { return m_current_info_job.isRunning(); } + [[nodiscard]] Task::Ptr activeSearchJob() { return hasActiveSearchJob() ? m_current_search_job : nullptr; } [[nodiscard]] auto getSortingMethods() const { return m_api->getSortingMethods(); } @@ -80,6 +81,9 @@ class ResourceModel : public QAbstractListModel { /** Resets the model's data. */ void clearData(); + void runSearchJob(NetJob::Ptr); + void runInfoJob(Task::Ptr); + protected: const BaseInstance& m_base_instance; @@ -91,7 +95,10 @@ class ResourceModel : public QAbstractListModel { std::unique_ptr m_api; - ConcurrentTask m_current_job; + // Job for searching for new entries + shared_qobject_ptr m_current_search_job; + // Job for fetching versions and extra info on existing entries + ConcurrentTask m_current_info_job; shared_qobject_ptr m_current_icon_job; QSet m_currently_running_icon_actions; diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp index 43b77207..200943da 100644 --- a/launcher/ui/pages/modplatform/ResourcePage.cpp +++ b/launcher/ui/pages/modplatform/ResourcePage.cpp @@ -353,8 +353,8 @@ void ResourcePage::openUrl(const QUrl& url) searchEdit->setText(slug); newPage->triggerSearch(); - if (model->activeJob().isRunning()) - connect(&model->activeJob(), &Task::finished, jump); + if (model->hasActiveSearchJob()) + connect(model->activeSearchJob().get(), &Task::finished, jump); else jump();