aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui/pages
diff options
context:
space:
mode:
authorflow <flowlnlnln@gmail.com>2022-12-20 17:14:17 -0300
committerflow <flowlnlnln@gmail.com>2023-01-13 16:23:08 -0300
commit563fe8d51529bc4c769f5a08bc037fc40cbfe852 (patch)
treebb4e9b4d765e3ce1035d543b958a4dd3bfffbf35 /launcher/ui/pages
parent38e20eb1486928e10f4d3c128f3e9a6c697d872a (diff)
downloadPrismLauncher-563fe8d51529bc4c769f5a08bc037fc40cbfe852.tar.gz
PrismLauncher-563fe8d51529bc4c769f5a08bc037fc40cbfe852.tar.bz2
PrismLauncher-563fe8d51529bc4c769f5a08bc037fc40cbfe852.zip
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 <flowlnlnln@gmail.com>
Diffstat (limited to 'launcher/ui/pages')
-rw-r--r--launcher/ui/pages/modplatform/ModPage.cpp2
-rw-r--r--launcher/ui/pages/modplatform/ResourceModel.cpp45
-rw-r--r--launcher/ui/pages/modplatform/ResourceModel.h13
-rw-r--r--launcher/ui/pages/modplatform/ResourcePage.cpp4
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<ModModel*>(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<QString, QString> 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<QIcon> 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<ResourceAPI> m_api;
- ConcurrentTask m_current_job;
+ // Job for searching for new entries
+ shared_qobject_ptr<NetJob> m_current_search_job;
+ // Job for fetching versions and extra info on existing entries
+ ConcurrentTask m_current_info_job;
shared_qobject_ptr<NetJob> m_current_icon_job;
QSet<QUrl> 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();