aboutsummaryrefslogtreecommitdiff
path: root/launcher/ui/widgets
diff options
context:
space:
mode:
authorSefa Eyeoglu <contact@scrumplex.net>2022-04-16 18:03:03 +0200
committerGitHub <noreply@github.com>2022-04-16 18:03:03 +0200
commita42d2afceee9f6ea0d209cfb03b178defff1ce60 (patch)
treef0c0dedd898dea025796abc0bce8b303b84e18b4 /launcher/ui/widgets
parentdb7cb125518e85f555b8816442b2ce2db4648cd8 (diff)
parent8e9eca6a970bf098c1045658368dc66b39e438ed (diff)
downloadPrismLauncher-a42d2afceee9f6ea0d209cfb03b178defff1ce60.tar.gz
PrismLauncher-a42d2afceee9f6ea0d209cfb03b178defff1ce60.tar.bz2
PrismLauncher-a42d2afceee9f6ea0d209cfb03b178defff1ce60.zip
Merge pull request #392 from flowln/mod_filter
Diffstat (limited to 'launcher/ui/widgets')
-rw-r--r--launcher/ui/widgets/ModFilterWidget.cpp109
-rw-r--r--launcher/ui/widgets/ModFilterWidget.h69
-rw-r--r--launcher/ui/widgets/ModFilterWidget.ui54
3 files changed, 232 insertions, 0 deletions
diff --git a/launcher/ui/widgets/ModFilterWidget.cpp b/launcher/ui/widgets/ModFilterWidget.cpp
new file mode 100644
index 00000000..ffc8d05d
--- /dev/null
+++ b/launcher/ui/widgets/ModFilterWidget.cpp
@@ -0,0 +1,109 @@
+#include "ModFilterWidget.h"
+#include "ui_ModFilterWidget.h"
+
+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_filter->versions.push_front(def);
+
+ setHidden(true);
+}
+
+void ModFilterWidget::setInstance(MinecraftInstance* instance)
+{
+ m_instance = instance;
+
+ auto mcVersionSplit = mcVersionStr().split(".");
+
+ ui->strictVersionButton->setText(
+ tr("Strict match (= %1)").arg(mcVersionStr()));
+ ui->majorVersionButton->setText(
+ tr("Major version match (= %1.%2.x)").arg(mcVersionSplit[0], mcVersionSplit[1]));
+ ui->allVersionsButton->setText(
+ tr("Any version"));
+ //ui->betweenVersionsButton->setText(
+ // tr("Between two versions"));
+}
+
+auto ModFilterWidget::getFilter() -> std::shared_ptr<Filter>
+{
+ m_last_version_id = m_version_id;
+ emit filterUnchanged();
+ return m_filter;
+}
+
+void ModFilterWidget::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 ModFilterWidget::onVersionFilterChanged(int id)
+{
+ //ui->lowerVersionComboBox->setEnabled(id == VersionButtonID::Between);
+ //ui->upperVersionComboBox->setEnabled(id == VersionButtonID::Between);
+
+ auto versionSplit = mcVersionStr().split(".");
+ int index = 0;
+
+ auto cast_id = (VersionButtonID) id;
+ if (cast_id != m_version_id) {
+ m_version_id = cast_id;
+ } else {
+ return;
+ }
+
+ m_filter->versions.clear();
+
+ switch(cast_id){
+ case(VersionButtonID::Strict):
+ 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_filter->versions.push_front(i);
+ i = Version(QString("%1.%2.%3").arg(versionSplit[0], versionSplit[1], QString("%1").arg(index)));
+ }
+ break;
+ case(VersionButtonID::All):
+ // Empty list to avoid enumerating all versions :P
+ break;
+ case(VersionButtonID::Between):
+ // TODO
+ break;
+ }
+
+ if(changed())
+ emit filterChanged();
+ else
+ emit filterUnchanged();
+}
+
+ModFilterWidget::~ModFilterWidget()
+{
+ delete ui;
+}
diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h
new file mode 100644
index 00000000..334fc672
--- /dev/null
+++ b/launcher/ui/widgets/ModFilterWidget.h
@@ -0,0 +1,69 @@
+#pragma once
+
+#include <QTabWidget>
+#include <QButtonGroup>
+
+#include "Version.h"
+#include "minecraft/MinecraftInstance.h"
+#include "minecraft/PackProfile.h"
+
+class MinecraftInstance;
+
+namespace Ui {
+class ModFilterWidget;
+}
+
+class ModFilterWidget : public QTabWidget
+{
+ Q_OBJECT
+public:
+ enum VersionButtonID {
+ Strict = 0,
+ Major = 1,
+ All = 2,
+ Between = 3
+ };
+
+ struct Filter {
+ std::list<Version> versions;
+
+ bool operator==(const Filter& other) const { return versions == other.versions; }
+ bool operator!=(const Filter& other) const { return !(*this == other); }
+ };
+
+ std::shared_ptr<Filter> m_filter;
+
+public:
+ explicit ModFilterWidget(Version def, QWidget* parent = nullptr);
+ ~ModFilterWidget();
+
+ void setInstance(MinecraftInstance* instance);
+
+ /// By default all buttons are enabled
+ void disableVersionButton(VersionButtonID);
+
+ auto getFilter() -> std::shared_ptr<Filter>;
+ 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() }; }
+
+private slots:
+ void onVersionFilterChanged(int id);
+
+public: signals:
+ void filterChanged();
+ void filterUnchanged();
+
+private:
+ Ui::ModFilterWidget* ui;
+
+ MinecraftInstance* m_instance = nullptr;
+
+ QButtonGroup m_mcVersion_buttons;
+
+ /* 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ModFilterWidget</class>
+ <widget class="QTabWidget" name="ModFilterWidget">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <widget class="QWidget" name="VersionPage">
+ <attribute name="title">
+ <string>Minecraft versions</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <layout class="QFormLayout" name="formLayout">
+ <item row="2" column="0">
+ <widget class="QRadioButton" name="allVersionsButton">
+ <property name="text">
+ <string>allVersions</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="strictVersionButton">
+ <property name="text">
+ <string>strictVersion</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="majorVersionButton">
+ <property name="text">
+ <string>majorVersion</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>