diff --git a/launcher/ui/dialogs/FilterModsDialog.ui b/launcher/ui/dialogs/FilterModsDialog.ui deleted file mode 100644 index 67a63bfd..00000000 --- a/launcher/ui/dialogs/FilterModsDialog.ui +++ /dev/null @@ -1,135 +0,0 @@ - - - FilterModsDialog - - - Qt::ApplicationModal - - - - 0 - 0 - 345 - 169 - - - - - 0 - 0 - - - - Filter options - - - true - - - true - - - - - - - 0 - 0 - - - - Minecraft versions - - - false - - - false - - - - - - QLayout::SetDefaultConstraint - - - - - - - StrictVersion - - - true - - - - - - - MajorVersion - - - - - - - AllVersions - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - FilterModsDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - FilterModsDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index 0ff784db..da0331b5 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -91,9 +91,14 @@ void ListModel::refresh() performPaginatedSearch(); } -void ListModel::searchWithTerm(const QString& term, const int sort) +void ListModel::searchWithTerm(const QString& term, const int sort, const bool filter_changed) { - if (currentSearchTerm == term && currentSearchTerm.isNull() == term.isNull() && currentSort == sort) { return; } + if (currentSearchTerm == term + && currentSearchTerm.isNull() == term.isNull() + && currentSort == sort + && !filter_changed) + { return; } + currentSearchTerm = term; currentSort = sort; diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index d4dc872d..d460cff2 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -35,7 +35,7 @@ class ListModel : public QAbstractListModel { /* Ask the API for more information */ void fetchMore(const QModelIndex& parent) override; void refresh(); - void searchWithTerm(const QString& term, const int sort); + void searchWithTerm(const QString& term, const int sort, const bool filter_changed); void requestModVersions(const ModPlatform::IndexedPack& current); virtual void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0; diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 37f68291..57c2e45d 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -13,7 +13,7 @@ ModPage::ModPage(ModDownloadDialog* dialog, BaseInstance* instance, ModAPI* api) , m_instance(instance) , ui(new Ui::ModPage) , dialog(dialog) - , filter_dialog(static_cast(instance)->getPackProfile()->getComponentVersion("net.minecraft"), this) + , filter_widget(static_cast(instance)->getPackProfile()->getComponentVersion("net.minecraft"), this) , api(api) { ui->setupUi(this); @@ -24,7 +24,10 @@ ModPage::ModPage(ModDownloadDialog* dialog, BaseInstance* instance, ModAPI* api) ui->versionSelectionBox->view()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); ui->versionSelectionBox->view()->parentWidget()->setMaximumHeight(300); - m_filter = filter_dialog.getFilter(); + ui->gridLayout_3->addWidget(&filter_widget, 0, 0, 1, ui->gridLayout_3->columnCount()); + + filter_widget.setInstance(static_cast(m_instance)); + m_filter = filter_widget.getFilter(); } ModPage::~ModPage() @@ -59,21 +62,22 @@ auto ModPage::eventFilter(QObject* watched, QEvent* event) -> bool void ModPage::filterMods() { - auto ret = filter_dialog.execWithInstance(static_cast(m_instance)); - m_filter = filter_dialog.getFilter(); - - if(ret == QDialog::DialogCode::Accepted){ - listModel->refresh(); - - int prev_count = ui->versionSelectionBox->count(); - ui->versionSelectionBox->clear(); - updateModVersions(prev_count); - } + filter_widget.setHidden(!filter_widget.isHidden()); } void ModPage::triggerSearch() { - listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex()); + auto changed = filter_widget.changed(); + m_filter = filter_widget.getFilter(); + + if(changed){ + ui->packView->clearSelection(); + ui->packDescription->clear(); + ui->versionSelectionBox->clear(); + updateSelectionButton(); + } + + listModel->searchWithTerm(ui->searchEdit->text(), ui->sortByBox->currentIndex(), changed); } void ModPage::onSelectionChanged(QModelIndex first, QModelIndex second) diff --git a/launcher/ui/pages/modplatform/ModPage.h b/launcher/ui/pages/modplatform/ModPage.h index 06581ab2..85aaede9 100644 --- a/launcher/ui/pages/modplatform/ModPage.h +++ b/launcher/ui/pages/modplatform/ModPage.h @@ -5,9 +5,9 @@ #include "Application.h" #include "modplatform/ModAPI.h" #include "modplatform/ModIndex.h" -#include "ui/dialogs/FilterModsDialog.h" #include "ui/pages/BasePage.h" #include "ui/pages/modplatform/ModModel.h" +#include "ui/widgets/ModFilterWidget.h" class ModDownloadDialog; @@ -40,7 +40,7 @@ class ModPage : public QWidget, public BasePage { virtual auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, QString loaderVer = "") const -> bool = 0; auto apiProvider() const -> const ModAPI* { return api.get(); }; - auto getFilter() const -> const std::shared_ptr { return m_filter; } + auto getFilter() const -> const std::shared_ptr { return m_filter; } auto getCurrent() -> ModPlatform::IndexedPack& { return current; } void updateModVersions(int prev_count = -1); @@ -64,8 +64,8 @@ class ModPage : public QWidget, public BasePage { Ui::ModPage* ui = nullptr; ModDownloadDialog* dialog = nullptr; - FilterModsDialog filter_dialog; - std::shared_ptr m_filter; + ModFilterWidget filter_widget; + std::shared_ptr m_filter; ModPlatform::ListModel* listModel = nullptr; ModPlatform::IndexedPack current; diff --git a/launcher/ui/pages/modplatform/ModPage.ui b/launcher/ui/pages/modplatform/ModPage.ui index 4444583e..afcd9bb7 100644 --- a/launcher/ui/pages/modplatform/ModPage.ui +++ b/launcher/ui/pages/modplatform/ModPage.ui @@ -11,7 +11,7 @@ - + @@ -41,7 +41,7 @@ - + Search @@ -55,7 +55,7 @@ - + @@ -80,15 +80,22 @@ - - - - Filter options - - - + + + + Filter options + + + + + + + Qt::Vertical + + + diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp index 6e666c4c..864ae8e6 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp @@ -67,25 +67,6 @@ auto FlameModPage::validateVersion(ModPlatform::IndexedVersion& ver, QString min return ver.mcVersion.contains(mineVer); } -// We override this so that it refreshes correctly, otherwise it would show -// invalid mods on the mod list, because the API would return mods for the -// wrong mod loader :( -void FlameModPage::filterMods() -{ - auto ret = filter_dialog.execWithInstance(static_cast(m_instance)); - m_filter = filter_dialog.getFilter(); - - if(ret == QDialog::DialogCode::Accepted){ - // CF API can't handle well this - if(!m_filter->versions.empty()) - listModel->refresh(); - - int prev_count = ui->versionSelectionBox->count(); - ui->versionSelectionBox->clear(); - updateModVersions(prev_count); - } -} - // 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... diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.h b/launcher/ui/pages/modplatform/flame/FlameModPage.h index 7078e889..dc58fd7f 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.h +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.h @@ -56,7 +56,5 @@ class FlameModPage : public ModPage { auto validateVersion(ModPlatform::IndexedVersion& ver, QString mineVer, QString loaderVer = "") const -> bool override; - void filterMods() override; - auto shouldDisplay() const -> bool override; }; diff --git a/launcher/ui/dialogs/FilterModsDialog.cpp b/launcher/ui/widgets/ModFilterWidget.cpp similarity index 57% rename from launcher/ui/dialogs/FilterModsDialog.cpp rename to launcher/ui/widgets/ModFilterWidget.cpp index 9440d897..339ecb4b 100644 --- a/launcher/ui/dialogs/FilterModsDialog.cpp +++ b/launcher/ui/widgets/ModFilterWidget.cpp @@ -1,31 +1,28 @@ -#include "FilterModsDialog.h" -#include "ui_FilterModsDialog.h" +#include "ModFilterWidget.h" +#include "ui_ModFilterWidget.h" -FilterModsDialog::FilterModsDialog(Version def, QWidget* parent) - : QDialog(parent), m_filter(new Filter()), m_internal_filter(new Filter()), ui(new Ui::FilterModsDialog) +ModFilterWidget::ModFilterWidget(Version def, QWidget* parent) + : QTabWidget(parent), m_filter(new Filter()), ui(new Ui::ModFilterWidget) { ui->setupUi(this); m_mcVersion_buttons.addButton(ui->strictVersionButton, VersionButtonID::Strict); + ui->strictVersionButton->click(); m_mcVersion_buttons.addButton(ui->majorVersionButton, VersionButtonID::Major); m_mcVersion_buttons.addButton(ui->allVersionsButton, VersionButtonID::All); //m_mcVersion_buttons.addButton(ui->betweenVersionsButton, VersionButtonID::Between); connect(&m_mcVersion_buttons, SIGNAL(idClicked(int)), this, SLOT(onVersionFilterChanged(int))); - m_internal_filter->versions.push_front(def); - commitChanges(); + m_filter->versions.push_front(def); + + setHidden(true); } -int FilterModsDialog::execWithInstance(MinecraftInstance* instance) +void ModFilterWidget::setInstance(MinecraftInstance* instance) { m_instance = instance; - auto* pressed_button = m_mcVersion_buttons.checkedButton(); - - // Fix first openening behaviour - onVersionFilterChanged(m_previous_mcVersion_id); - auto mcVersionSplit = mcVersionStr().split("."); ui->strictVersionButton->setText( @@ -36,26 +33,15 @@ int FilterModsDialog::execWithInstance(MinecraftInstance* instance) tr("Any version")); //ui->betweenVersionsButton->setText( // tr("Between two versions")); - - int ret = QDialog::exec(); - - if(ret == QDialog::DialogCode::Accepted){ - // If there's no change, let's sey it's a cancel to the caller - if(*m_internal_filter.get() == *m_filter.get()) - return QDialog::DialogCode::Rejected; - - m_previous_mcVersion_id = (VersionButtonID) m_mcVersion_buttons.checkedId(); - commitChanges(); - } else { - pressed_button->click(); - revertChanges(); - } - - m_instance = nullptr; - return ret; } -void FilterModsDialog::disableVersionButton(VersionButtonID id) +auto ModFilterWidget::getFilter() -> std::shared_ptr +{ + m_last_version_id = m_version_id; + return m_filter; +} + +void ModFilterWidget::disableVersionButton(VersionButtonID id) { switch(id){ case(VersionButtonID::Strict): @@ -75,17 +61,7 @@ void FilterModsDialog::disableVersionButton(VersionButtonID id) } } -// Do deep copy -void FilterModsDialog::commitChanges() -{ - m_filter->versions = m_internal_filter->versions; -} -void FilterModsDialog::revertChanges() -{ - m_internal_filter->versions = m_filter->versions; -} - -void FilterModsDialog::onVersionFilterChanged(int id) +void ModFilterWidget::onVersionFilterChanged(int id) { //ui->lowerVersionComboBox->setEnabled(id == VersionButtonID::Between); //ui->upperVersionComboBox->setEnabled(id == VersionButtonID::Between); @@ -93,15 +69,18 @@ void FilterModsDialog::onVersionFilterChanged(int id) auto versionSplit = mcVersionStr().split("."); int index = 0; - m_internal_filter->versions.clear(); + auto cast_id = (VersionButtonID) id; + m_version_id = cast_id; - switch(id){ + m_filter->versions.clear(); + + switch(cast_id){ case(VersionButtonID::Strict): - m_internal_filter->versions.push_front(mcVersion()); + m_filter->versions.push_front(mcVersion()); break; case(VersionButtonID::Major): for(auto i = Version(QString("%1.%2").arg(versionSplit[0], versionSplit[1])); i <= mcVersion(); index++){ - m_internal_filter->versions.push_front(i); + m_filter->versions.push_front(i); i = Version(QString("%1.%2.%3").arg(versionSplit[0], versionSplit[1], QString("%1").arg(index))); } break; @@ -111,12 +90,10 @@ void FilterModsDialog::onVersionFilterChanged(int id) case(VersionButtonID::Between): // TODO break; - default: - break; } } -FilterModsDialog::~FilterModsDialog() +ModFilterWidget::~ModFilterWidget() { delete ui; } diff --git a/launcher/ui/dialogs/FilterModsDialog.h b/launcher/ui/widgets/ModFilterWidget.h similarity index 64% rename from launcher/ui/dialogs/FilterModsDialog.h rename to launcher/ui/widgets/ModFilterWidget.h index fac28ca4..5348882f 100644 --- a/launcher/ui/dialogs/FilterModsDialog.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "Version.h" @@ -10,10 +10,10 @@ class MinecraftInstance; namespace Ui { -class FilterModsDialog; +class ModFilterWidget; } -class FilterModsDialog : public QDialog +class ModFilterWidget : public QTabWidget { Q_OBJECT public: @@ -32,34 +32,34 @@ public: }; std::shared_ptr m_filter; - std::shared_ptr m_internal_filter; public: - explicit FilterModsDialog(Version def, QWidget* parent = nullptr); - ~FilterModsDialog(); + explicit ModFilterWidget(Version def, QWidget* parent = nullptr); + ~ModFilterWidget(); - int execWithInstance(MinecraftInstance* instance); + void setInstance(MinecraftInstance* instance); /// By default all buttons are enabled void disableVersionButton(VersionButtonID); - auto getFilter() -> std::shared_ptr { return m_filter; } + auto getFilter() -> std::shared_ptr; + auto changed() const -> bool { return m_last_version_id != m_version_id; } private: inline auto mcVersionStr() const -> QString { return m_instance ? m_instance->getPackProfile()->getComponentVersion("net.minecraft") : ""; } inline auto mcVersion() const -> Version { return { mcVersionStr() }; } - void commitChanges(); - void revertChanges(); - private slots: void onVersionFilterChanged(int id); private: - Ui::FilterModsDialog* ui; + Ui::ModFilterWidget* ui; MinecraftInstance* m_instance = nullptr; QButtonGroup m_mcVersion_buttons; - VersionButtonID m_previous_mcVersion_id = VersionButtonID::Strict; + + /* Used to tell if the filter was changed since the last getFilter() call */ + VersionButtonID m_last_version_id = VersionButtonID::Strict; + VersionButtonID m_version_id = VersionButtonID::Strict; }; diff --git a/launcher/ui/widgets/ModFilterWidget.ui b/launcher/ui/widgets/ModFilterWidget.ui new file mode 100644 index 00000000..ad1090e2 --- /dev/null +++ b/launcher/ui/widgets/ModFilterWidget.ui @@ -0,0 +1,54 @@ + + + ModFilterWidget + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + + Minecraft versions + + + + + + + + allVersions + + + + + + + strictVersion + + + + + + + majorVersion + + + + + + + + + + +