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
+
+
+
+
+
+
+
+
+
+
+