Rework filter widget

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad 2024-04-01 15:22:09 +01:00
parent 6a61900328
commit 71998cb7d9
No known key found for this signature in database
GPG Key ID: 5E39D70B4C93C38E
3 changed files with 250 additions and 332 deletions

View File

@ -46,9 +46,9 @@
#include "Application.h"
#include "minecraft/PackProfile.h"
unique_qobject_ptr<ModFilterWidget> ModFilterWidget::create(MinecraftInstance* instance, bool extendedSupport, QWidget* parent)
unique_qobject_ptr<ModFilterWidget> ModFilterWidget::create(MinecraftInstance* instance, bool extended, QWidget* parent)
{
return unique_qobject_ptr<ModFilterWidget>(new ModFilterWidget(instance, extendedSupport, parent));
return unique_qobject_ptr<ModFilterWidget>(new ModFilterWidget(instance, extended, parent));
}
class VersionBasicModel : public QIdentityProxyModel {
@ -65,55 +65,50 @@ class VersionBasicModel : public QIdentityProxyModel {
}
};
ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extendedSupport, QWidget* parent)
ModFilterWidget::ModFilterWidget(MinecraftInstance* instance, bool extended, QWidget* parent)
: QTabWidget(parent), ui(new Ui::ModFilterWidget), m_instance(instance), m_filter(new Filter())
{
ui->setupUi(this);
m_versions_proxy = new VersionProxyModel(this);
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new RegexpFilter("(release)", false));
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release"));
auto proxy = new VersionBasicModel(this);
proxy->setSourceModel(m_versions_proxy);
if (!extendedSupport) {
ui->versionsSimpleCb->setModel(proxy);
ui->versionsCb->hide();
ui->snapshotsCb->hide();
ui->envBox->hide();
if (extended) {
ui->versions->setSourceModel(proxy);
ui->versions->setSeparator(", ");
ui->version->hide();
} else {
ui->versionsCb->setSourceModel(proxy);
ui->versionsCb->setSeparator("| ");
ui->versionsSimpleCb->hide();
ui->version->setModel(proxy);
ui->versions->hide();
ui->showAllVersions->hide();
ui->environmentGroup->hide();
}
ui->versionsCb->setStyleSheet("combobox-popup: 0;");
ui->versionsSimpleCb->setStyleSheet("combobox-popup: 0;");
connect(ui->snapshotsCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onIncludeSnapshotsChanged);
connect(ui->versionsCb, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ModFilterWidget::onVersionFilterChanged);
connect(ui->versionsSimpleCb, &QComboBox::currentTextChanged, this, &ModFilterWidget::onVersionFilterTextChanged);
ui->versions->setStyleSheet("combobox-popup: 0;");
ui->version->setStyleSheet("combobox-popup: 0;");
connect(ui->showAllVersions, &QCheckBox::stateChanged, this, &ModFilterWidget::onShowAllVersionsChanged);
connect(ui->versions, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ModFilterWidget::onVersionFilterChanged);
connect(ui->version, &QComboBox::currentTextChanged, this, &ModFilterWidget::onVersionFilterTextChanged);
connect(ui->neoForgeCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->forgeCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->fabricCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->quiltCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->liteLoaderCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->cauldronCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->neoForge, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->forge, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->fabric, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->quilt, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
ui->liteLoaderCb->hide();
ui->cauldronCb->hide();
connect(ui->neoForge, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->forge, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->fabric, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->quilt, &QCheckBox::stateChanged, this, &ModFilterWidget::onLoadersFilterChanged);
connect(ui->serverEnv, &QCheckBox::stateChanged, this, &ModFilterWidget::onSideFilterChanged);
connect(ui->clientEnv, &QCheckBox::stateChanged, this, &ModFilterWidget::onSideFilterChanged);
if (extended) {
connect(ui->clientSide, &QCheckBox::stateChanged, this, &ModFilterWidget::onSideFilterChanged);
connect(ui->serverSide, &QCheckBox::stateChanged, this, &ModFilterWidget::onSideFilterChanged);
}
connect(ui->hide_installed, &QCheckBox::stateChanged, this, &ModFilterWidget::onHideInstalledFilterChanged);
connect(ui->releaseCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged);
connect(ui->betaCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged);
connect(ui->alphaCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged);
connect(ui->unknownCb, &QCheckBox::stateChanged, this, &ModFilterWidget::onReleaseFilterChanged);
connect(ui->categoriesList, &QListWidget::itemClicked, this, &ModFilterWidget::onCategoryClicked);
connect(ui->hideInstalled, &QCheckBox::stateChanged, this, &ModFilterWidget::onHideInstalledFilterChanged);
setHidden(true);
loadVersionList();
@ -147,8 +142,8 @@ void ModFilterWidget::loadVersionList()
auto task = m_version_list->getLoadTask();
connect(task.get(), &Task::failed, [this] {
ui->versionsCb->setEnabled(false);
ui->snapshotsCb->setEnabled(false);
ui->versions->setEnabled(false);
ui->showAllVersions->setEnabled(false);
});
connect(task.get(), &Task::finished, &load_version_list_loop, &QEventLoop::quit);
@ -165,35 +160,35 @@ void ModFilterWidget::loadVersionList()
void ModFilterWidget::prepareBasicFilter()
{
m_filter->hideInstalled = false;
m_filter->side = ""; // or "both"t
m_filter->side = ""; // or "both"
auto loaders = m_instance->getPackProfile()->getSupportedModLoaders().value();
ui->neoForgeCb->setChecked(loaders & ModPlatform::NeoForge);
ui->forgeCb->setChecked(loaders & ModPlatform::Forge);
ui->fabricCb->setChecked(loaders & ModPlatform::Fabric);
ui->quiltCb->setChecked(loaders & ModPlatform::Quilt);
ui->liteLoaderCb->setChecked(loaders & ModPlatform::LiteLoader);
ui->cauldronCb->setChecked(loaders & ModPlatform::Cauldron);
ui->neoForge->setChecked(loaders & ModPlatform::NeoForge);
ui->forge->setChecked(loaders & ModPlatform::Forge);
ui->fabric->setChecked(loaders & ModPlatform::Fabric);
ui->quilt->setChecked(loaders & ModPlatform::Quilt);
m_filter->loaders = loaders;
auto def = m_instance->getPackProfile()->getComponentVersion("net.minecraft");
m_filter->versions.push_front(Version{ def });
ui->versionsCb->setCheckedItems({ def });
ui->versionsSimpleCb->setCurrentIndex(ui->versionsSimpleCb->findText(def));
m_filter->versions.emplace_front(def);
ui->versions->setCheckedItems({ def });
ui->version->setCurrentIndex(ui->version->findText(def));
}
void ModFilterWidget::onIncludeSnapshotsChanged()
void ModFilterWidget::onShowAllVersionsChanged()
{
QString filter = "(release)";
if (ui->snapshotsCb->isChecked())
filter += "|(snapshot)";
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new RegexpFilter(filter, false));
if (ui->showAllVersions->isChecked())
m_versions_proxy->clearFilters();
else
m_versions_proxy->setFilter(BaseVersionList::TypeRole, new ExactFilter("release"));
}
void ModFilterWidget::onVersionFilterChanged(int)
{
auto versions = ui->versionsCb->checkedItems();
auto versions = ui->versions->checkedItems();
m_filter->versions.clear();
for (auto version : versions)
m_filter->versions.push_back(version);
for (const QString& version : versions)
m_filter->versions.emplace_back(version);
m_filter_changed = true;
emit filterChanged();
}
@ -201,18 +196,14 @@ void ModFilterWidget::onVersionFilterChanged(int)
void ModFilterWidget::onLoadersFilterChanged()
{
ModPlatform::ModLoaderTypes loaders;
if (ui->neoForgeCb->isChecked())
if (ui->neoForge->isChecked())
loaders |= ModPlatform::NeoForge;
if (ui->forgeCb->isChecked())
if (ui->forge->isChecked())
loaders |= ModPlatform::Forge;
if (ui->fabricCb->isChecked())
if (ui->fabric->isChecked())
loaders |= ModPlatform::Fabric;
if (ui->quiltCb->isChecked())
if (ui->quilt->isChecked())
loaders |= ModPlatform::Quilt;
if (ui->cauldronCb->isChecked())
loaders |= ModPlatform::Cauldron;
if (ui->liteLoaderCb->isChecked())
loaders |= ModPlatform::LiteLoader;
m_filter_changed = loaders != m_filter->loaders;
m_filter->loaders = loaders;
if (m_filter_changed)
@ -224,14 +215,17 @@ void ModFilterWidget::onLoadersFilterChanged()
void ModFilterWidget::onSideFilterChanged()
{
QString side;
if (ui->serverEnv->isChecked())
side = "server";
if (ui->clientEnv->isChecked()) {
if (side.isEmpty())
if (ui->clientSide->isChecked() != ui->serverSide->isChecked()) {
if (ui->clientSide->isChecked())
side = "client";
else
side = ""; // or both
side = "server";
} else {
// both are checked or none are checked; in either case no filtering will happen
side = "";
}
m_filter_changed = side != m_filter->side;
m_filter->side = side;
if (m_filter_changed)
@ -242,7 +236,7 @@ void ModFilterWidget::onSideFilterChanged()
void ModFilterWidget::onHideInstalledFilterChanged()
{
auto hide = ui->hide_installed->isChecked();
auto hide = ui->hideInstalled->isChecked();
m_filter_changed = hide != m_filter->hideInstalled;
m_filter->hideInstalled = hide;
if (m_filter_changed)
@ -251,60 +245,36 @@ void ModFilterWidget::onHideInstalledFilterChanged()
emit filterUnchanged();
}
void ModFilterWidget::onReleaseFilterChanged()
{
std::list<ModPlatform::IndexedVersionType> releases;
if (ui->releaseCb->isChecked())
releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Release));
if (ui->betaCb->isChecked())
releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Beta));
if (ui->alphaCb->isChecked())
releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Alpha));
if (ui->unknownCb->isChecked())
releases.push_back(ModPlatform::IndexedVersionType(ModPlatform::IndexedVersionType::VersionType::Unknown));
m_filter_changed = releases != m_filter->releases;
m_filter->releases = releases;
if (m_filter_changed)
emit filterChanged();
else
emit filterUnchanged();
}
void ModFilterWidget::onVersionFilterTextChanged(QString version)
void ModFilterWidget::onVersionFilterTextChanged(const QString& version)
{
m_filter->versions.clear();
m_filter->versions.push_front(version);
m_filter->versions.emplace_back(version);
m_filter_changed = true;
emit filterChanged();
}
void ModFilterWidget::setCategories(QList<ModPlatform::Category> categories)
void ModFilterWidget::setCategories(const QList<ModPlatform::Category>& categories)
{
ui->categoriesList->clear();
m_categories = categories;
for (auto cat : categories) {
auto item = new QListWidgetItem(cat.name, ui->categoriesList);
item->setFlags(item->flags() & (~Qt::ItemIsUserCheckable));
item->setCheckState(Qt::Unchecked);
ui->categoriesList->addItem(item);
}
}
void ModFilterWidget::onCategoryClicked(QListWidgetItem* itm)
{
if (itm)
itm->setCheckState(itm->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);
m_filter->categoryIds.clear();
for (auto i = 0; i < ui->categoriesList->count(); i++) {
auto item = ui->categoriesList->item(i);
if (item->checkState() == Qt::Checked) {
auto c = std::find_if(m_categories.cbegin(), m_categories.cend(), [item](auto v) { return v.name == item->text(); });
if (c != m_categories.cend())
m_filter->categoryIds << c->id;
}
}
delete ui->categoryGroup->layout();
auto layout = new QVBoxLayout(ui->categoryGroup);
for (const auto& category : categories) {
auto checkbox = new QCheckBox(category.name);
layout->addWidget(checkbox);
const QString id = category.id;
connect(checkbox, &QCheckBox::toggled, this, [this, id](bool checked) {
if (checked)
m_filter->categoryIds.append(id);
else
m_filter->categoryIds.removeOne(id);
m_filter_changed = true;
emit filterChanged();
};
});
}
}
#include "ModFilterWidget.moc"

View File

@ -73,7 +73,7 @@ class ModFilterWidget : public QTabWidget {
bool operator!=(const Filter& other) const { return !(*this == other); }
};
static unique_qobject_ptr<ModFilterWidget> create(MinecraftInstance* instance, bool extendedSupport, QWidget* parent = nullptr);
static unique_qobject_ptr<ModFilterWidget> create(MinecraftInstance* instance, bool extended, QWidget* parent = nullptr);
virtual ~ModFilterWidget();
auto getFilter() -> std::shared_ptr<Filter>;
@ -84,7 +84,7 @@ class ModFilterWidget : public QTabWidget {
void filterUnchanged();
public slots:
void setCategories(QList<ModPlatform::Category>);
void setCategories(const QList<ModPlatform::Category>&);
private:
ModFilterWidget(MinecraftInstance* instance, bool extendedSupport, QWidget* parent = nullptr);
@ -94,13 +94,11 @@ class ModFilterWidget : public QTabWidget {
private slots:
void onVersionFilterChanged(int);
void onVersionFilterTextChanged(QString version);
void onReleaseFilterChanged();
void onVersionFilterTextChanged(const QString& version);
void onLoadersFilterChanged();
void onSideFilterChanged();
void onHideInstalledFilterChanged();
void onIncludeSnapshotsChanged();
void onCategoryClicked(QListWidgetItem* item);
void onShowAllVersionsChanged();
private:
Ui::ModFilterWidget* ui;

View File

@ -1,211 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModFilterWidget</class>
<widget class="QTabWidget" name="ModFilterWidget">
<widget class="QWidget" name="ModFilterWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>460</width>
<height>132</height>
<width>553</width>
<height>604</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="currentIndex">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<widget class="QWidget" name="VersionPage">
<attribute name="title">
<string>Minecraft versions</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QCheckBox" name="snapshotsCb">
<property name="text">
<string>Include Snapshots</string>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>553</width>
<height>604</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="categoryGroup">
<property name="title">
<string>Category</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="CheckComboBox" name="versionsCb">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item>
<widget class="QGroupBox" name="loaderGroup">
<property name="title">
<string>Loader</string>
</property>
<property name="maxVisibleItems">
<number>5</number>
<property name="checkable">
<bool>false</bool>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QComboBox" name="versionsSimpleCb"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="LoadersPage">
<attribute name="title">
<string>Loaders</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<item row="0" column="2">
<widget class="QCheckBox" name="fabricCb">
<property name="text">
<string>Fabric</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="neoForgeCb">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QCheckBox" name="neoForge">
<property name="text">
<string>NeoForge</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="forgeCb">
<item>
<widget class="QCheckBox" name="forge">
<property name="text">
<string>Forge</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QCheckBox" name="cauldronCb">
<property name="enabled">
<bool>false</bool>
</property>
<item>
<widget class="QCheckBox" name="fabric">
<property name="text">
<string>Cauldron</string>
<string>Fabric</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="quiltCb">
<item>
<widget class="QCheckBox" name="quilt">
<property name="text">
<string>Quilt</string>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QCheckBox" name="liteLoaderCb">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>LiteLoader</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="ReleasePage">
<attribute name="title">
<string>Release type</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="releaseCb">
<property name="text">
<string>Release</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="betaCb">
<property name="text">
<string>Beta</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="alphaCb">
<property name="text">
<string>Alpha</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="unknownCb">
<property name="text">
<string>Unknown</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="CategoryPage">
<attribute name="title">
<string>Categories</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QListWidget" name="categoriesList">
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerItem</enum>
</property>
<property name="flow">
<enum>QListView::LeftToRight</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>true</bool>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
<property name="modelColumn">
<number>0</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="ModPage">
<attribute name="title">
<string>Others</string>
</attribute>
<layout class="QGridLayout" name="gridLayout1">
<item row="0" column="0">
<widget class="QGroupBox" name="envBox">
<widget class="QGroupBox" name="minecraftVersionGroup">
<property name="title">
<string>Environments</string>
<string>Version</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QCheckBox" name="clientEnv">
<widget class="CheckComboBox" name="versions"/>
</item>
<item>
<widget class="QComboBox" name="version"/>
</item>
<item>
<widget class="QCheckBox" name="showAllVersions">
<property name="text">
<string>Show all versions</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="environmentGroup">
<property name="title">
<string>Environment</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QCheckBox" name="clientSide">
<property name="text">
<string>Client</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="serverEnv">
<widget class="QCheckBox" name="serverSide">
<property name="text">
<string>Server</string>
</property>
@ -214,25 +157,32 @@
</layout>
</widget>
</item>
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Instaled status</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="hide_installed">
<widget class="QCheckBox" name="hideInstalled">
<property name="text">
<string>Hide already installed</string>
<string>Hide installed items</string>
</property>
</widget>
</item>
</layout>
</widget>
<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>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>CheckComboBox</class>