8e6400e8d8
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.
70 lines
1.5 KiB
C++
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;
|
|
};
|
|
|
|
}
|