feat: cache extra mod info (like links and body)
Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
		@@ -85,6 +85,17 @@ auto ListModel::data(const QModelIndex& index, int role) const -> QVariant
 | 
			
		||||
    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)
 | 
			
		||||
{
 | 
			
		||||
    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() });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ListModel::requestModInfo(ModPlatform::IndexedPack& current)
 | 
			
		||||
void ListModel::requestModInfo(ModPlatform::IndexedPack& current, QModelIndex index)
 | 
			
		||||
{
 | 
			
		||||
    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()
 | 
			
		||||
@@ -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";
 | 
			
		||||
 | 
			
		||||
@@ -268,6 +279,16 @@ void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack
 | 
			
		||||
        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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ class ListModel : public QAbstractListModel {
 | 
			
		||||
 | 
			
		||||
    /* Retrieve information from the model at a given index with the given role */
 | 
			
		||||
    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 NetJob* activeJob() { return jobPtr.get(); }
 | 
			
		||||
@@ -36,7 +37,7 @@ class ListModel : public QAbstractListModel {
 | 
			
		||||
    void fetchMore(const QModelIndex& parent) override;
 | 
			
		||||
    void refresh();
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    virtual void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0;
 | 
			
		||||
@@ -51,7 +52,7 @@ class ListModel : public QAbstractListModel {
 | 
			
		||||
    void searchRequestFinished(QJsonDocument& doc);
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -169,13 +169,13 @@ void ModPage::setSearchTerm(QString term)
 | 
			
		||||
    ui->searchEdit->setText(term);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModPage::onSelectionChanged(QModelIndex first, QModelIndex second)
 | 
			
		||||
void ModPage::onSelectionChanged(QModelIndex curr, QModelIndex prev)
 | 
			
		||||
{
 | 
			
		||||
    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) {
 | 
			
		||||
        qDebug() << QString("Loading %1 mod versions").arg(debugName());
 | 
			
		||||
@@ -195,7 +195,8 @@ void ModPage::onSelectionChanged(QModelIndex first, QModelIndex second)
 | 
			
		||||
 | 
			
		||||
    if(!current.extraDataLoaded){
 | 
			
		||||
        qDebug() << QString("Loading %1 mod info").arg(debugName());
 | 
			
		||||
        listModel->requestModInfo(current);
 | 
			
		||||
 | 
			
		||||
        listModel->requestModInfo(current, curr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    updateUi();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user