feat: cache extra mod info (like links and body)

Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
flow 2022-07-18 19:17:44 -03:00
parent 74c6c5cfbc
commit 5bc67d3f6b
No known key found for this signature in database
GPG Key ID: 8D0F221F0A59F469
3 changed files with 32 additions and 9 deletions

View File

@ -85,6 +85,17 @@ auto ListModel::data(const QModelIndex& index, int role) const -> QVariant
return {}; return {};
} }
bool ListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
int pos = index.row();
if (pos >= modpacks.size() || pos < 0 || !index.isValid())
return false;
modpacks[pos] = value.value<ModPlatform::IndexedPack>();
return true;
}
void ListModel::requestModVersions(ModPlatform::IndexedPack const& current) void ListModel::requestModVersions(ModPlatform::IndexedPack const& current)
{ {
auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile(); auto profile = (dynamic_cast<MinecraftInstance*>((dynamic_cast<ModPage*>(parent()))->m_instance))->getPackProfile();
@ -100,10 +111,10 @@ void ListModel::performPaginatedSearch()
this, { nextSearchOffset, currentSearchTerm, getSorts()[currentSort], profile->getModLoaders(), getMineVersions() }); this, { nextSearchOffset, currentSearchTerm, getSorts()[currentSort], profile->getModLoaders(), getMineVersions() });
} }
void ListModel::requestModInfo(ModPlatform::IndexedPack& current) void ListModel::requestModInfo(ModPlatform::IndexedPack& current, QModelIndex index)
{ {
m_parent->apiProvider()->getModInfo( m_parent->apiProvider()->getModInfo(
current, [this](QJsonDocument& doc, ModPlatform::IndexedPack& pack) { infoRequestFinished(doc, pack); }); current, [this, index](QJsonDocument& doc, ModPlatform::IndexedPack& pack) { infoRequestFinished(doc, pack, index); });
} }
void ListModel::refresh() void ListModel::refresh()
@ -256,7 +267,7 @@ void ListModel::searchRequestFailed(QString reason)
} }
} }
void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack) void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index)
{ {
qDebug() << "Loading mod info"; qDebug() << "Loading mod info";
@ -268,6 +279,16 @@ void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack
qWarning() << "Error while reading " << debugName() << " mod info: " << e.cause(); qWarning() << "Error while reading " << debugName() << " mod info: " << e.cause();
} }
// Check if the index is still valid for this mod or not
if (pack.addonId == data(index, Qt::UserRole).value<ModPlatform::IndexedPack>().addonId) {
// Cache info :^)
QVariant new_pack;
new_pack.setValue(pack);
if (!setData(index, new_pack, Qt::UserRole)) {
qWarning() << "Failed to cache mod info!";
}
}
m_parent->updateUi(); m_parent->updateUi();
} }

View File

@ -28,6 +28,7 @@ class ListModel : public QAbstractListModel {
/* Retrieve information from the model at a given index with the given role */ /* Retrieve information from the model at a given index with the given role */
auto data(const QModelIndex& index, int role) const -> QVariant override; auto data(const QModelIndex& index, int role) const -> QVariant override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
inline void setActiveJob(NetJob::Ptr ptr) { jobPtr = ptr; } inline void setActiveJob(NetJob::Ptr ptr) { jobPtr = ptr; }
inline NetJob* activeJob() { return jobPtr.get(); } inline NetJob* activeJob() { return jobPtr.get(); }
@ -36,7 +37,7 @@ class ListModel : public QAbstractListModel {
void fetchMore(const QModelIndex& parent) override; void fetchMore(const QModelIndex& parent) override;
void refresh(); void refresh();
void searchWithTerm(const QString& term, const int sort, const bool filter_changed); void searchWithTerm(const QString& term, const int sort, const bool filter_changed);
void requestModInfo(ModPlatform::IndexedPack& current); void requestModInfo(ModPlatform::IndexedPack& current, QModelIndex index);
void requestModVersions(const ModPlatform::IndexedPack& current); void requestModVersions(const ModPlatform::IndexedPack& current);
virtual void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0; virtual void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0;
@ -51,7 +52,7 @@ class ListModel : public QAbstractListModel {
void searchRequestFinished(QJsonDocument& doc); void searchRequestFinished(QJsonDocument& doc);
void searchRequestFailed(QString reason); void searchRequestFailed(QString reason);
void infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack); void infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index);
void versionRequestSucceeded(QJsonDocument doc, QString addonId); void versionRequestSucceeded(QJsonDocument doc, QString addonId);

View File

@ -169,13 +169,13 @@ void ModPage::setSearchTerm(QString term)
ui->searchEdit->setText(term); ui->searchEdit->setText(term);
} }
void ModPage::onSelectionChanged(QModelIndex first, QModelIndex second) void ModPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)
{ {
ui->versionSelectionBox->clear(); ui->versionSelectionBox->clear();
if (!first.isValid()) { return; } if (!curr.isValid()) { return; }
current = listModel->data(first, Qt::UserRole).value<ModPlatform::IndexedPack>(); current = listModel->data(curr, Qt::UserRole).value<ModPlatform::IndexedPack>();
if (!current.versionsLoaded) { if (!current.versionsLoaded) {
qDebug() << QString("Loading %1 mod versions").arg(debugName()); qDebug() << QString("Loading %1 mod versions").arg(debugName());
@ -195,7 +195,8 @@ void ModPage::onSelectionChanged(QModelIndex first, QModelIndex second)
if(!current.extraDataLoaded){ if(!current.extraDataLoaded){
qDebug() << QString("Loading %1 mod info").arg(debugName()); qDebug() << QString("Loading %1 mod info").arg(debugName());
listModel->requestModInfo(current);
listModel->requestModInfo(current, curr);
} }
updateUi(); updateUi();