sneedmc/application/pages/modplatform/ftb/FtbListModel.h
Jamie Mansfield 8e6400e8d8
NOISSUE Fix edgecase where new searches won't be processed
This resolves an issue with the modpacks.ch search functionality, in
which a search issued while one is currently in progress won't be made
and the UI won't allow for the search to be made after.

Reproduction Steps:
1. Open the FTB pane in the Add Instance Dialog
2. Perform a search while MMC is still performing the initial search

The search won't be performed, the existing search will have been
aborted, and you are unable to try the search again (without trying a
different search in the meantime).

This was caused by 2 things:
1. A search cannot be re-attempted, and this logic doesn't consider
   failures.
2. The failure slot wasn't called when the NetJob was aborted, so
   the search would never be performed - but the term would be
   stored as if it had (trigering point 1).

I have resolved this by doing 2 things:
1. If the failure slot is called, set a searchState of Failed. Allow
   search re-attempts in this case.
2. If there is a present NetJob, abort and reset it. The immediately
   continue with the search.
2021-03-26 20:03:57 +00:00

70 lines
1.5 KiB
C++

#pragma once
#include <QAbstractListModel>
#include "modplatform/modpacksch/FTBPackManifest.h"
#include "net/NetJob.h"
#include <QIcon>
namespace Ftb {
struct Logo {
QString fullpath;
NetJobPtr downloadJob;
QIcon result;
bool failed = false;
};
typedef QMap<QString, Logo> LogoMap;
typedef std::function<void(QString)> LogoCallback;
class ListModel : public QAbstractListModel
{
Q_OBJECT
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;
void getLogo(const QString &logo, const QString &logoUrl, LogoCallback callback);
void searchWithTerm(const QString & term);
private slots:
void performSearch();
void searchRequestFinished();
void searchRequestFailed(QString reason);
void requestPack();
void packRequestFinished();
void packRequestFailed(QString reason);
void logoFailed(QString logo);
void logoLoaded(QString logo, bool stale);
private:
void requestLogo(QString file, QString url);
private:
QList<ModpacksCH::Modpack> modpacks;
LogoMap m_logoMap;
QString currentSearchTerm;
enum SearchState {
None,
CanPossiblyFetchMore,
ResetRequested,
Finished,
Failed,
} searchState = None;
NetJobPtr jobPtr;
int currentPack;
QList<int> remainingPacks;
QByteArray response;
};
}