fix: 'All' filter working and get around CF API capabilities

This commit is contained in:
flow 2022-04-02 20:08:37 -03:00
parent 5cb0e75093
commit 76dfb7825a
9 changed files with 74 additions and 74 deletions

View File

@ -6,6 +6,8 @@ class FlameAPI : public NetworkModAPI {
private:
inline auto getModSearchURL(SearchArgs& args) const -> QString override
{
auto gameVersionStr = args.versions.size() != 0 ? QString("gameVersion=%1").arg(args.versions.front().toString()) : QString();
return QString(
"https://addons-ecs.forgesvc.net/api/v2/addon/search?"
"gameId=432&"
@ -17,12 +19,12 @@ class FlameAPI : public NetworkModAPI {
"searchFilter=%2&"
"sort=%3&"
"modLoaderType=%4&"
"gameVersion=%5")
"%5")
.arg(args.offset)
.arg(args.search)
.arg(args.sorting)
.arg(args.mod_loader)
.arg(getGameVersionsString(args.versions));
.arg(gameVersionStr);
};
inline auto getVersionsURL(VersionSearchArgs& args) const -> QString override

View File

@ -22,7 +22,7 @@ class ModrinthAPI : public NetworkModAPI {
"limit=25&"
"query=%2&"
"index=%3&"
"facets=[[\"categories:%4\"],[%5],[\"project_type:mod\"]]")
"facets=[[\"categories:%4\"],%5[\"project_type:mod\"]]")
.arg(args.offset)
.arg(args.search)
.arg(args.sorting)
@ -47,7 +47,7 @@ class ModrinthAPI : public NetworkModAPI {
s += QString("\"versions:%1\",").arg(ver.toString());
}
s.remove(s.length() - 1, 1); //remove last comma
return s;
return s.isEmpty() ? QString() : QString("[%1],").arg(s);
}
static auto getModLoaderString(ModLoaderType type) -> const QString

View File

@ -9,7 +9,7 @@ FilterModsDialog::FilterModsDialog(Version def, QWidget* parent)
m_mcVersion_buttons.addButton(ui->strictVersionButton, VersionButtonID::Strict);
m_mcVersion_buttons.addButton(ui->majorVersionButton, VersionButtonID::Major);
m_mcVersion_buttons.addButton(ui->allVersionsButton, VersionButtonID::All);
m_mcVersion_buttons.addButton(ui->betweenVersionsButton, VersionButtonID::Between);
//m_mcVersion_buttons.addButton(ui->betweenVersionsButton, VersionButtonID::Between);
connect(&m_mcVersion_buttons, SIGNAL(idClicked(int)), this, SLOT(onVersionFilterChanged(int)));
@ -31,18 +31,38 @@ int FilterModsDialog::execWithInstance(MinecraftInstance* instance)
tr("Major varsion match (= %1.%2.x)").arg(mcVersionSplit[0], mcVersionSplit[1]));
ui->allVersionsButton->setText(
tr("Any version match"));
ui->betweenVersionsButton->setText(
tr("Between two versions"));
//ui->betweenVersionsButton->setText(
// tr("Between two versions"));
int ret = QDialog::exec();
m_instance = nullptr;
return ret;
}
void FilterModsDialog::disableVersionButton(VersionButtonID id)
{
switch(id){
case(VersionButtonID::Strict):
ui->strictVersionButton->setEnabled(false);
break;
case(VersionButtonID::Major):
ui->majorVersionButton->setEnabled(false);
break;
case(VersionButtonID::All):
ui->allVersionsButton->setEnabled(false);
break;
case(VersionButtonID::Between):
// ui->betweenVersionsButton->setEnabled(false);
break;
default:
break;
}
}
void FilterModsDialog::onVersionFilterChanged(int id)
{
ui->lowerVersionComboBox->setEnabled(id == VersionButtonID::Between);
ui->upperVersionComboBox->setEnabled(id == VersionButtonID::Between);
//ui->lowerVersionComboBox->setEnabled(id == VersionButtonID::Between);
//ui->upperVersionComboBox->setEnabled(id == VersionButtonID::Between);
auto versionSplit = mcVersionStr().split(".");
int index = 0;
@ -60,6 +80,7 @@ void FilterModsDialog::onVersionFilterChanged(int id)
}
break;
case(VersionButtonID::All):
// Empty list to avoid enumerating all versions :P
break;
case(VersionButtonID::Between):
// TODO

View File

@ -17,6 +17,13 @@ class FilterModsDialog : public QDialog
{
Q_OBJECT
public:
enum VersionButtonID {
Strict = 0,
Major = 1,
All = 2,
Between = 3
};
struct Filter {
std::list<Version> versions;
};
@ -29,16 +36,12 @@ public:
int execWithInstance(MinecraftInstance* instance);
/// By default all buttons are enabled
void disableVersionButton(VersionButtonID);
auto getFilter() -> std::shared_ptr<Filter> { return m_filter; }
private:
enum VersionButtonID {
Strict = 0,
Major = 1,
All = 2,
Between = 3
};
inline auto mcVersionStr() const -> QString { return m_instance ? m_instance->getPackProfile()->getComponentVersion("net.minecraft") : ""; }
inline auto mcVersion() const -> Version { return { mcVersionStr() }; }

View File

@ -10,15 +10,17 @@
<x>0</x>
<y>0</y>
<width>345</width>
<height>323</height>
<height>169</height>
</rect>
</property>
<property name="windowTitle">
<string>Copy Instance</string>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowIcon">
<iconset>
<normaloff>:/icons/toolbar/copy</normaloff>:/icons/toolbar/copy</iconset>
<property name="windowTitle">
<string>Filter options</string>
</property>
<property name="sizeGripEnabled">
<bool>true</bool>
@ -78,59 +80,11 @@
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="betweenVersionsButton">
<property name="text">
<string>BetweenVersions</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="fromLabel">
<property name="text">
<string>From</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="lowerVersionComboBox"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="toLabel">
<property name="text">
<string>To</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="upperVersionComboBox"/>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">

View File

@ -64,7 +64,6 @@ void ModPage::filterMods()
m_filter = filter_dialog.getFilter();
listModel->refresh();
if(ui->versionSelectionBox->count() > 0){
ui->versionSelectionBox->clear();
updateModVersions();
@ -164,14 +163,14 @@ void ModPage::updateModVersions()
for (int i = 0; i < current.versions.size(); i++) {
auto version = current.versions[i];
bool valid = false;
//NOTE: Flame doesn't care about loaderString, so passing it changes nothing.
for(auto& mcVer : m_filter->versions){
//NOTE: Flame doesn't care about loaderString, so passing it changes nothing.
if (validateVersion(version, mcVer.toString(), loaderString)) {
valid = true;
break;
}
}
if(valid)
if(valid || m_filter->versions.size() == 0)
ui->versionSelectionBox->addItem(version.version, QVariant(i));
}
if (ui->versionSelectionBox->count() == 0) { ui->versionSelectionBox->addItem(tr("No valid version found!"), QVariant(-1)); }

View File

@ -54,7 +54,7 @@ class ModPage : public QWidget, public BasePage {
void updateSelectionButton();
protected slots:
void filterMods();
virtual void filterMods();
void triggerSearch();
void onSelectionChanged(QModelIndex first, QModelIndex second);
void onVersionSelectionChanged(QString data);

View File

@ -67,6 +67,25 @@ auto FlameModPage::validateVersion(ModPlatform::IndexedVersion& ver, QString min
return ver.mcVersion.contains(mineVer);
}
// We override this so that it refreshes correctly, otherwise it wouldn't show
// any mod on the mod list, because the CF API does not support it :(
void FlameModPage::filterMods()
{
filter_dialog.execWithInstance(static_cast<MinecraftInstance*>(m_instance));
int prev_size = m_filter->versions.size();
m_filter = filter_dialog.getFilter();
int new_size = m_filter->versions.size();
if(new_size <= 1 && new_size != prev_size)
listModel->refresh();
if(ui->versionSelectionBox->count() > 0){
ui->versionSelectionBox->clear();
updateModVersions();
}
}
// I don't know why, but doing this on the parent class makes it so that
// other mod providers start loading before being selected, at least with
// my Qt, so we need to implement this in every derived class...

View File

@ -56,5 +56,7 @@ class FlameModPage : public ModPage {
auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, QString loaderVer = "") const -> bool override;
void filterMods() override;
auto shouldDisplay() const -> bool override;
};