From 6ccc7e77f918503125c363eb8ac9455aa9fc095e Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Mon, 19 Jun 2023 22:42:27 +0100
Subject: Basic, unfinished & broken impl

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 121 ++++++++++++++++++++++++++++
 1 file changed, 121 insertions(+)
 create mode 100644 launcher/ui/dialogs/InstallLoaderDialog.cpp

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
new file mode 100644
index 00000000..34c91c68
--- /dev/null
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -0,0 +1,121 @@
+#include "InstallLoaderDialog.h"
+
+#include <QDialogButtonBox>
+#include <QPushButton>
+#include <QVBoxLayout>
+#include "Application.h"
+#include "BuildConfig.h"
+#include "DesktopServices.h"
+#include "meta/Index.h"
+#include "minecraft/MinecraftInstance.h"
+#include "minecraft/PackProfile.h"
+#include "ui/widgets/PageContainer.h"
+#include "ui/widgets/VersionSelectWidget.h"
+
+class LoaderPage : public VersionSelectWidget, public BasePage {
+   public:
+    LoaderPage(const QString&& id,
+               const QString&& icon,
+               const QString&& name,
+               // "lightweight" loaders are independent to any game version
+               const bool lightweight,
+               const std::shared_ptr<PackProfile> profile,
+               QWidget* parent = nullptr)
+        : VersionSelectWidget(parent), m_id(std::move(id)), m_icon(std::move(icon)), m_name(std::move(name))
+    {
+        const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
+        setEmptyErrorString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
+        if (!lightweight)
+            setExactFilter(BaseVersionList::ParentVersionRole, minecraftVersion);
+
+        if (const QString currentVersion = profile->getComponentVersion(id); !currentVersion.isNull())
+            setCurrentVersion(currentVersion);
+    }
+
+    QString id() const override { return m_id; }
+    QString displayName() const override { return m_name; }
+    QIcon icon() const override { return APPLICATION->getThemedIcon(m_icon); }
+
+    void openedImpl() override
+    {
+        if (m_loaded)
+            return;
+
+        const auto versions = APPLICATION->metadataIndex()->get(m_id);
+        if (!versions)
+            return;
+
+        initialize(versions.get());
+        m_loaded = true;
+    }
+
+   private:
+    const QString m_id;
+    const QString m_icon;
+    const QString m_name;
+    bool m_loaded = false;
+};
+
+InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, QWidget* parent)
+    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this))
+{
+    auto layout = new QVBoxLayout(this);
+
+    m_container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    layout->addWidget(m_container);
+
+    auto buttonLayout = new QHBoxLayout(this);
+
+    auto refreshButton = new QPushButton(tr("&Refresh"), this);
+    connect(refreshButton, &QPushButton::pressed, this, [this] {
+        LoaderPage* page = dynamic_cast<LoaderPage*>(m_container->selectedPage());
+        Q_ASSERT(page != nullptr);
+        page->loadList();
+    });
+    buttonLayout->addWidget(refreshButton);
+
+    auto buttons = new QDialogButtonBox(this);
+    buttons->setOrientation(Qt::Horizontal);
+    buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+    connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+    buttonLayout->addWidget(buttons);
+
+    layout->addLayout(buttonLayout);
+
+    setWindowTitle(dialogTitle());
+    resize(650, 400);
+}
+
+QList<BasePage*> InstallLoaderDialog::getPages()
+{
+    return { // Fabric
+             new LoaderPage("net.fabricmc.fabric-loader", "fabric-loader", tr("Fabric"), true, m_profile, this),
+             // Quilt
+             new LoaderPage("org.quiltmc.quilt-loader", "quilt-loader", tr("Quilt"), true, m_profile, this),
+             // Forge
+             new LoaderPage("net.minecraftforge", "forge-loader", tr("Forge"), false, m_profile, this),
+             // LiteLoader
+             new LoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
+    };
+}
+
+QString InstallLoaderDialog::dialogTitle()
+{
+    return tr("Install Loader");
+}
+
+void InstallLoaderDialog::done(int result)
+{
+    if (result == Accepted) {
+        LoaderPage* page = dynamic_cast<LoaderPage*>(m_container->selectedPage());
+        Q_ASSERT(page != nullptr);
+
+        if (page->selectedVersion()) {
+            m_profile->setComponentVersion(page->id(), page->selectedVersion()->descriptor());
+            m_profile->resolve(Net::Mode::Online);
+        }
+    }
+
+    QDialog::done(result);
+}
-- 
cgit 


From 82d3755e25fc01e3468e6940abab9dcc0a819e22 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Mon, 19 Jun 2023 23:36:18 +0100
Subject: License all the things

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/InstanceWindow.cpp                 |  3 ++-
 launcher/ui/InstanceWindow.h                   |  3 ++-
 launcher/ui/dialogs/InstallLoaderDialog.cpp    | 18 ++++++++++++++++++
 launcher/ui/dialogs/InstallLoaderDialog.h      |  2 +-
 launcher/ui/dialogs/ResourceDownloadDialog.cpp |  2 +-
 launcher/ui/dialogs/ResourceDownloadDialog.h   |  2 +-
 launcher/ui/pages/instance/VersionPage.cpp     |  2 +-
 launcher/ui/pages/modplatform/ResourcePage.cpp |  2 +-
 launcher/ui/widgets/PageContainer.cpp          |  3 ++-
 launcher/ui/widgets/PageContainer.h            |  3 ++-
 10 files changed, 31 insertions(+), 9 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/InstanceWindow.cpp b/launcher/ui/InstanceWindow.cpp
index d9a21f6f..30a215e3 100644
--- a/launcher/ui/InstanceWindow.cpp
+++ b/launcher/ui/InstanceWindow.cpp
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: GPL-3.0-only
 /*
- *  PolyMC - Minecraft Launcher
+ *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/InstanceWindow.h b/launcher/ui/InstanceWindow.h
index 78d7474d..adbc46ac 100644
--- a/launcher/ui/InstanceWindow.h
+++ b/launcher/ui/InstanceWindow.h
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: GPL-3.0-only
 /*
- *  PolyMC - Minecraft Launcher
+ *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 34c91c68..1b003e52 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -1,3 +1,21 @@
+// SPDX-License-Identifier: GPL-3.0-only
+/*
+ *  Prism Launcher - Minecraft Launcher
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, version 3.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
 #include "InstallLoaderDialog.h"
 
 #include <QDialogButtonBox>
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.h b/launcher/ui/dialogs/InstallLoaderDialog.h
index 26b39e4a..7a32e427 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.h
+++ b/launcher/ui/dialogs/InstallLoaderDialog.h
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-3.0-only
 /*
  *  Prism Launcher - Minecraft Launcher
- *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.cpp b/launcher/ui/dialogs/ResourceDownloadDialog.cpp
index 784662a0..8d4e51b2 100644
--- a/launcher/ui/dialogs/ResourceDownloadDialog.cpp
+++ b/launcher/ui/dialogs/ResourceDownloadDialog.cpp
@@ -2,7 +2,7 @@
 /*
  *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
- *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/dialogs/ResourceDownloadDialog.h b/launcher/ui/dialogs/ResourceDownloadDialog.h
index 5077b2ca..b56a9adc 100644
--- a/launcher/ui/dialogs/ResourceDownloadDialog.h
+++ b/launcher/ui/dialogs/ResourceDownloadDialog.h
@@ -2,7 +2,7 @@
 /*
  *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
- *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp
index 97a6bbe4..53a71008 100644
--- a/launcher/ui/pages/instance/VersionPage.cpp
+++ b/launcher/ui/pages/instance/VersionPage.cpp
@@ -6,7 +6,7 @@
  *  Prism Launcher - Minecraft Launcher
  *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
  *  Copyright (C) 2022-2023 Sefa Eyeoglu <contact@scrumplex.net>
- *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/pages/modplatform/ResourcePage.cpp b/launcher/ui/pages/modplatform/ResourcePage.cpp
index 91d722fc..ace7fb1b 100644
--- a/launcher/ui/pages/modplatform/ResourcePage.cpp
+++ b/launcher/ui/pages/modplatform/ResourcePage.cpp
@@ -4,7 +4,7 @@
 /*
  *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
- *  Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/widgets/PageContainer.cpp b/launcher/ui/widgets/PageContainer.cpp
index c3606b78..308fad6b 100644
--- a/launcher/ui/widgets/PageContainer.cpp
+++ b/launcher/ui/widgets/PageContainer.cpp
@@ -1,8 +1,9 @@
 // SPDX-License-Identifier: GPL-3.0-only
 /*
- *  PolyMC - Minecraft Launcher
+ *  Prism Launcher - Minecraft Launcher
  *  Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
  *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/launcher/ui/widgets/PageContainer.h b/launcher/ui/widgets/PageContainer.h
index 89c3343e..1da269ce 100644
--- a/launcher/ui/widgets/PageContainer.h
+++ b/launcher/ui/widgets/PageContainer.h
@@ -1,7 +1,8 @@
 // SPDX-License-Identifier: GPL-3.0-only
 /*
- *  PolyMC - Minecraft Launcher
+ *  Prism Launcher - Minecraft Launcher
  *  Copyright (c) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
+ *  Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
-- 
cgit 


From a389983d7dfb78a2bf6c1b85e5837dcdac789070 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Tue, 20 Jun 2023 00:28:42 +0100
Subject: Just use the old ordering

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/resources/multimc/multimc.qrc      | 2 +-
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc
index f018e874..13052760 100644
--- a/launcher/resources/multimc/multimc.qrc
+++ b/launcher/resources/multimc/multimc.qrc
@@ -348,8 +348,8 @@
         <file>scalable/launch.svg</file>
         <file>scalable/server.svg</file>
 
+        <file>scalable/forge-loader.svg</file>
         <file>scalable/fabric-loader.svg</file>
         <file>scalable/quilt-loader.svg</file>
-        <file>scalable/forge-loader.svg</file>
     </qresource>
 </RCC>
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 1b003e52..5df27dba 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -107,12 +107,12 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
 
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
-    return { // Fabric
+    return { // Forge
+             new LoaderPage("net.minecraftforge", "forge-loader", tr("Forge"), false, m_profile, this),
+             // Fabric
              new LoaderPage("net.fabricmc.fabric-loader", "fabric-loader", tr("Fabric"), true, m_profile, this),
              // Quilt
              new LoaderPage("org.quiltmc.quilt-loader", "quilt-loader", tr("Quilt"), true, m_profile, this),
-             // Forge
-             new LoaderPage("net.minecraftforge", "forge-loader", tr("Forge"), false, m_profile, this),
              // LiteLoader
              new LoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
     };
-- 
cgit 


From 94510edd722b72e375011c6d4a6629c478728c72 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Tue, 20 Jun 2023 19:57:15 +0100
Subject: Rework icons (Fabric is blurry now but looks better)

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 .../multimc/128x128/instances/fabricmc.png         | Bin 0 -> 4839 bytes
 .../multimc/128x128/instances/liteloader.png       | Bin 0 -> 20337 bytes
 .../resources/multimc/22x22/fabricmc-small.png     | Bin 0 -> 5672 bytes
 launcher/resources/multimc/multimc.qrc             |   8 +-
 .../resources/multimc/scalable/fabric-loader.svg   |   1 -
 .../resources/multimc/scalable/forge-loader.svg    |   1 -
 .../resources/multimc/scalable/instances/forge.svg |  43 +++++++++
 .../multimc/scalable/instances/quiltmc.svg         |  98 +++++++++++++++++++++
 .../resources/multimc/scalable/quilt-loader.svg    |  70 ---------------
 launcher/ui/dialogs/InstallLoaderDialog.cpp        |   8 +-
 10 files changed, 150 insertions(+), 79 deletions(-)
 create mode 100644 launcher/resources/multimc/128x128/instances/fabricmc.png
 create mode 100644 launcher/resources/multimc/128x128/instances/liteloader.png
 create mode 100644 launcher/resources/multimc/22x22/fabricmc-small.png
 delete mode 100644 launcher/resources/multimc/scalable/fabric-loader.svg
 delete mode 100644 launcher/resources/multimc/scalable/forge-loader.svg
 create mode 100644 launcher/resources/multimc/scalable/instances/forge.svg
 create mode 100644 launcher/resources/multimc/scalable/instances/quiltmc.svg
 delete mode 100644 launcher/resources/multimc/scalable/quilt-loader.svg

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/resources/multimc/128x128/instances/fabricmc.png b/launcher/resources/multimc/128x128/instances/fabricmc.png
new file mode 100644
index 00000000..c78543ae
Binary files /dev/null and b/launcher/resources/multimc/128x128/instances/fabricmc.png differ
diff --git a/launcher/resources/multimc/128x128/instances/liteloader.png b/launcher/resources/multimc/128x128/instances/liteloader.png
new file mode 100644
index 00000000..88295e64
Binary files /dev/null and b/launcher/resources/multimc/128x128/instances/liteloader.png differ
diff --git a/launcher/resources/multimc/22x22/fabricmc-small.png b/launcher/resources/multimc/22x22/fabricmc-small.png
new file mode 100644
index 00000000..e21ae9e8
Binary files /dev/null and b/launcher/resources/multimc/22x22/fabricmc-small.png differ
diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc
index 13052760..907fbb5d 100644
--- a/launcher/resources/multimc/multimc.qrc
+++ b/launcher/resources/multimc/multimc.qrc
@@ -348,8 +348,10 @@
         <file>scalable/launch.svg</file>
         <file>scalable/server.svg</file>
 
-        <file>scalable/forge-loader.svg</file>
-        <file>scalable/fabric-loader.svg</file>
-        <file>scalable/quilt-loader.svg</file>
+        <file>scalable/instances/forge.svg</file>
+        <file>scalable/instances/quiltmc.svg</file>
+        <file>22x22/fabricmc-small.png</file>
+        <file>128x128/instances/fabricmc.png</file>
+        <file>128x128/instances/liteloader.png</file>
     </qresource>
 </RCC>
diff --git a/launcher/resources/multimc/scalable/fabric-loader.svg b/launcher/resources/multimc/scalable/fabric-loader.svg
deleted file mode 100644
index 06aa7801..00000000
--- a/launcher/resources/multimc/scalable/fabric-loader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="32" height="32"><image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAT5JREFU WIXtliFLBEEYhh/FYBAtq5j08oLtwnVB/AFWDWIyXrhyYhCDXNhfYLPeDxDBbrAJ1++S6BbLGdcg L8eMN6yzrsws3NtmP+Zj3uf9mB1YqCZ12mnRaaeF777l/ziMj5b+2kCu724HAByf9QB4eh79qndw Ait1NXrPPwCDRAHlJIITqDwDruyvL7sA7O5sG99dJJpHQM6zmz4Am8mGUfcl0RwCduaSpr+MxMVV ZtRFIn4CLue2REKaTj+BmfPDg30A7h8egYgIOG9C38y1Hk9e5/aznUvxEZDzXvd87gY5tTO3iSj7 6P8FzhnI8zcAXkbf6720ZdTtzMcTc+ob8x5wnlKzcHpyBECSbAE/SYiAr3MpXgKSi8T62ipQ3bkU nEDpm3DmbGiQGGTDWg4QnEDlF5FUNXspOIGFvgDGZobq+WvV0wAAAABJRU5ErkJggg==" width="32" height="32" x="164.072" y="372.466" preserveAspectRatio="none" style="image-rendering:pixelated"/><image xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAYAAADL1t+KAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AgQExEY5CwLEwAAAB1pVFh0Q29tbWVudAAAAAAAQ3Jl YXRlZCB3aXRoIEdJTVBkLmUHAAAIAUlEQVR42u3Xr27bUBTA4XgKGJgW4lRF7bClMgPzSdMeoDQF VdBgQMiigqhgCsgThIX2AapK5QZmk8xbVC0hIS30+FRpqDlV7ve9wNE9/vPT7fUAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KrMC4C1V ZdFFzq+b1n+OJHywAgAQdABA0AEAQQcABB0ABB0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQAQBB BwAEHQAQdAAQdABA0AEAQQcABB0ABB0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQAQBBBwD2K7MC OHxVWXRRs9erRejZR+Np2Oy6af1jcUMHAAQdAAQdABB0AEDQAQBBBwBBBwAEHQAQdABA0AFA0AEA QQcABB0AEHQAEHQAQNABAEEHAAQdABB0ABB0AEDQAQBBBwAEHQAEHQAQdABA0AEAQQcAQQcABB0A EHQA4FV9KwDe0ma7C52/Xi3CZo/G0y5qdt20mbfPDR0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQ AQBBBwAEHQAQdAAQdABA0AEAQQcABB0AEHQAEHQAQNABAEEHAAQdAAQdABB0AEDQAQBBBwBBBwAE HQAQdABA0AFA0AGA9yuzAtiPqiy6qNnr1SLs3KPxNHTv11eTsNmnJ8dJ7r1uWm1xQwcABB0ABB0A EHQAQNABAEEHAEEHAAQdABB0AEDQAQBBBwBBBwAEHQAQdABA0AFA0AEAQQcABB0AEHQAEHQAQNAB AEEHAAQdAAQdABB0AEDQAQBBBwBBBwAEHQAQdADgPzIrICVVWXRRs5e/foade5gPkn3mo/E0bPb1 1SRs9unJcZI77/V6vbppk2ybGzoACDoAIOgAgKADAIIOAIIOAAg6ACDoAICgA4CgAwCCDgAIOgAg 6AAg6ACAoAMAgg4ACDoACDoAIOgAgKADAIIOAIIOAAg6ACDoAICgA4CgAwCCDgAIOgAg6AAg6ACA oAMAe5ZZAftUlUUXOX+9WiS59812FzZ7mA+Sfd9H42nY7OurSdjs2XyZ7DOvmzasq27oAHAABB0A BB0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQAQBBBwAEHQAQdAAQdABA0AEAQQcABB0ABB0AEHQA QNABAEEHAEEHAAQdABB0AEDQAUDQAQBBBwAEHQAQdABISmYF6anKoouavV4tPIDEbLa7ZM/+/PwS Nns2X4bN/v7ta+jeb+/uw2bXTRvWVTd0ADgAgg4Agg4ACDoAIOgAgKADgKADAIIOAAg6ACDoACDo AICgAwCCDgAIOgAIOgAg6ACAoAMAgg4Agg4ACDoAIOgAgKADgKADAIIOAAg6ACDoACDoAICgAwCC DgAIOgAkpW8FMaqy6KJmr1eLZPe+2e7CZg/zQZI7jz73w+OTH86e3d7dh86vmzZzQwcABB0AEHQA QNABQNABAEEHAAQdABB0ABB0AEDQAQBBBwAEHQAQdAAQdABA0AEAQQcABB0ABB0AEHQAQNABAEEH AEEHAAQdABB0AEDQAUDQAQBBBwAEHQAQdAAQdADgveunfPiqLLqo2dPJD29fgGE+CJu92e7sPDGz +TJsdt20mS/eDR0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQAQBBBwAEHQAQdAAQdABA0AEAQQcA BB0AEHQAEHQAQNABAEEHAAQdAAQdABB0AEDQAQBBBwBBBwAEHQAQdABA0AFA0AEAQQcA3lDfCmJs t3/CZv9u4859VnxJ9pkP80HY7IfHp8DZL6F7n82XYbPrps387XBDBwAEHQAEHQAQdABA0AEAQQcA QQcABB0AEHQAQNABQNABAEEHAAQdABB0ABB0AEDQAQBBBwAEHQAQdAAQdABA0AEAQQcABB0ABB0A EHQAQNABAEEHAEEHAAQdABB0AOA1mRXEqMqii5p9eXEedu48Pwrd+1nxJcn37eHxKWz2bL4MPXvd tP5zuKEDAIIOAAg6ACDoACDoAICgAwCCDgAIOgAIOgAg6ACAoAMAgg4Agg4ACDoAIOgAgKADgKAD AIIOAAg6ACDoAICgA4CgAwCCDgAIOgAg6AAg6ACAoAMAgg4ACDoACDoA8O5kVpCeqiy6qNmXF+eh Z8/zo7DZnz99DJs9my/DZtdN6z8DbugAgKADgKADAIIOAAg6ACDoACDoAICgAwCCDgAIOgAIOgAg 6ACAoAMAgg4Agg4ACDoAIOgAgKADgKADAIIOAAg6ACDoAICgA4CgAwCCDgAIOgAg6AAg6ACAoAMA gg4A/KNvBempmzaLm37TRZ798uI8bPZieePlA9zQAQBBBwBBBwAEHQAQdABA0AFA0AEAQQcABB0A EHQAEHQAQNABAEEHAAQdAAQdABB0AEDQAQBBBwBBBwAEHQAQdABA0AFA0AEAQQcABB0AEHQAEHQr AABBBwAEHQAQdABA0AHgUGRWQEqqsuhSPHfdtL51cEMHAAQdABB0AEDQAUDQAQBBBwAEHQAQdAAQ dABA0AEAQQcABB0ABB0AEHQAQNABAEEHAEEHAAQdABB0AEDQAUDQAQBBBwAEHQAQdABA0AFA0AEA QQcABB0AEHQAEHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAIF1/Ad+GivW8tUyOAAAAAElFTkSuQmCC" width="32" height="32" preserveAspectRatio="none" style="image-rendering:pixelated"/></svg>
\ No newline at end of file
diff --git a/launcher/resources/multimc/scalable/forge-loader.svg b/launcher/resources/multimc/scalable/forge-loader.svg
deleted file mode 100644
index b73360b8..00000000
--- a/launcher/resources/multimc/scalable/forge-loader.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="32" height="32" viewBox="164.072 372.466 32 32"><path fill="#1e2d41" d="m192.211 382.794-12.908-.631 15.769-.012v-1.271h-17.78v4.775c0 .04-.52-3.12-.639-4.003h-1.398v4.445c0 .042-.598-3.714-.661-4.184h-9.522c.649.562 4.23 3.615 6.776 4.871 1.276.63 2.842.635 4.235.674.708.02 1.45.074 1.98.598.769.763.94 1.946.277 2.841-.656.885-2.502 1.077-2.502 1.077l-1.538 1.887v2.191h3.497l.108-2.165 3.024-2.144c-.323.258-1.043.95-2.125 2.615a5.974 5.974 0 0 0-.584 1.19c.764-.647 2.333-1.09 4.146-1.09 1.81 0 3.378.442 4.143 1.088a5.963 5.963 0 0 0-.583-1.188c-1.082-1.666-1.802-2.357-2.125-2.615l3.024 2.144.109 2.165h3.262v-2.19l-1.537-1.888s-2.277-.145-2.873-1.076c-1.717-2.684.721-6.85 6.425-8.104z" style="stroke-width:.341115"/></svg>
\ No newline at end of file
diff --git a/launcher/resources/multimc/scalable/instances/forge.svg b/launcher/resources/multimc/scalable/instances/forge.svg
new file mode 100644
index 00000000..ea402c5b
--- /dev/null
+++ b/launcher/resources/multimc/scalable/instances/forge.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xml:space="preserve"
+   width="24"
+   height="24"
+   viewBox="164.072 372.466 24 24"
+   version="1.1"
+   id="svg132"
+   sodipodi:docname="forge.svg"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+     id="defs136" /><sodipodi:namedview
+     id="namedview134"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="16"
+     inkscape:cx="24.28125"
+     inkscape:cy="4.9375"
+     inkscape:window-width="1920"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg132" /><rect
+     style="fill:#1d2d41;fill-opacity:1;stroke-width:1.02136"
+     id="rect7386"
+     width="24"
+     height="24"
+     x="164.07201"
+     y="372.466" /><path
+     fill="#1e2d41"
+     d="m 183.16438,381.24198 -8.60519,-0.42066 10.51249,-0.008 V 379.966 h -11.85315 v 3.18329 c 0,0.0266 -0.34666,-2.07997 -0.42599,-2.66864 h -0.93198 v 2.96329 c 0,0.028 -0.39866,-2.47596 -0.44066,-2.78929 h -6.3479 c 0.43266,0.37466 2.81996,2.40997 4.51726,3.24729 0.85065,0.41999 1.89464,0.42332 2.8233,0.44933 0.47199,0.0134 0.96665,0.0493 1.31997,0.39866 0.51266,0.50865 0.62665,1.29731 0.18466,1.89396 -0.43732,0.59 -1.66797,0.718 -1.66797,0.718 l -1.02531,1.25798 v 1.46063 h 2.3313 l 0.072,-1.44329 2.01597,-1.42932 c -0.21534,0.17199 -0.69533,0.63332 -1.41664,1.7433 a 3.9826047,3.9826047 0 0 0 -0.38934,0.79333 c 0.50933,-0.43134 1.55531,-0.72667 2.76396,-0.72667 1.20665,0 2.25196,0.29467 2.76195,0.72533 a 3.9752715,3.9752715 0 0 0 -0.38866,-0.79199 c -0.72132,-1.11064 -1.20131,-1.57131 -1.41664,-1.7433 l 2.01597,1.42932 0.0727,1.44329 h 2.17462 v -1.45997 l -1.02464,-1.25864 c 0,0 -1.51798,-0.0967 -1.9153,-0.71733 -1.14466,-1.7893 0.48066,-4.5666 4.28327,-5.40258 z"
+     style="fill:#ffffff;stroke-width:0.227407"
+     id="path130" /></svg>
diff --git a/launcher/resources/multimc/scalable/instances/quiltmc.svg b/launcher/resources/multimc/scalable/instances/quiltmc.svg
new file mode 100644
index 00000000..a7aaca53
--- /dev/null
+++ b/launcher/resources/multimc/scalable/instances/quiltmc.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   id="Layer_1"
+   data-name="Layer 1"
+   viewBox="0 0 23.999999 23.999999"
+   version="1.1"
+   sodipodi:docname="quiltmc.svg"
+   width="24"
+   height="24"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview27"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="10.390684"
+     inkscape:cx="24.685575"
+     inkscape:cy="9.5277659"
+     inkscape:window-width="1499"
+     inkscape:window-height="749"
+     inkscape:window-x="100"
+     inkscape:window-y="118"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="Layer_1" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">.cls-1{fill:#1b112b;}.cls-2{fill:#9722ff;}.cls-3{fill:#dc29dd;}.cls-4{fill:#27a2fd;}.cls-5{fill:#34f;}</style>
+  </defs>
+  <rect
+     class="cls-1"
+     width="24"
+     height="24"
+     rx="5.9670944"
+     id="rect6"
+     x="0"
+     y="0"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-2"
+     d="M 8.53568,6.3874419 A 0.27217496,0.27217496 0 0 0 8.8075922,6.6593542 H 9.2699744 V 7.6928834 H 8.8075922 a 0.27191225,0.27191225 0 0 0 0,0.5438245 H 9.2699744 V 9.0293255 A 0.24091162,0.24091162 0 0 1 9.0290628,9.2702371 H 8.2364452 V 8.807855 a 0.27191225,0.27191225 0 0 0 -0.5438245,0 V 9.2702371 H 6.6590914 V 8.807855 a 0.27191224,0.27191224 0 0 0 -0.5438244,0 V 9.2702371 H 5.3226493 A 0.24117434,0.24117434 0 0 1 5.0817377,9.0293255 V 5.322912 A 0.24091162,0.24091162 0 0 1 5.3226493,5.0820004 H 9.0290628 A 0.2406489,0.2406489 0 0 1 9.2699744,5.322912 V 6.115267 H 8.8075922 A 0.27217496,0.27217496 0 0 0 8.53568,6.3874419 Z"
+     id="path8"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-3"
+     d="m 13.267216,6.3874419 a 0.27191224,0.27191224 0 0 0 0.271912,0.2719123 h 0.463696 v 1.0335292 h -0.462382 a 0.27191225,0.27191225 0 0 0 0,0.5438245 h 0.462382 V 9.0293255 A 0.24117434,0.24117434 0 0 1 13.761912,9.2702371 H 10.054973 A 0.24091162,0.24091162 0 0 1 9.8140616,9.0293255 V 8.2367079 h 0.4621194 a 0.27191225,0.27191225 0 1 0 0,-0.5438245 H 9.8140616 V 6.6593542 h 0.4621194 a 0.27217496,0.27217496 0 1 0 0,-0.5440872 H 9.8140616 V 5.322912 A 0.2406489,0.2406489 0 0 1 10.054973,5.0820004 h 3.706414 a 0.24091162,0.24091162 0 0 1 0.240911,0.2409116 v 0.792355 h -0.462382 a 0.27191224,0.27191224 0 0 0 -0.2727,0.2721749 z"
+     id="path10"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-4"
+     d="M 18.73436,5.322912 V 9.0293255 A 0.24091162,0.24091162 0 0 1 18.493448,9.2702371 H 17.70083 V 8.807855 a 0.27191224,0.27191224 0 0 0 -0.543824,0 V 9.2702371 H 16.123477 V 8.807855 a 0.27191251,0.27191251 0 0 0 -0.543825,0 V 9.2702371 H 14.787034 A 0.24117434,0.24117434 0 0 1 14.546123,9.0293255 V 8.2367079 h 0.462382 a 0.27191225,0.27191225 0 1 0 0,-0.5438245 H 14.546123 V 6.6593542 h 0.462382 a 0.27217496,0.27217496 0 0 0 0,-0.5440872 H 14.546123 V 5.322912 a 0.24091162,0.24091162 0 0 1 0.240911,-0.2409116 h 3.706414 A 0.2406489,0.2406489 0 0 1 18.73436,5.322912 Z"
+     id="path12"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-3"
+     d="m 9.2699744,10.054973 v 3.706414 A 0.2406489,0.2406489 0 0 1 9.0290628,14.002298 H 8.2364452 v -0.462382 a 0.27191225,0.27191225 0 1 0 -0.5438245,0 v 0.462908 H 6.6590914 v -0.462382 a 0.27191224,0.27191224 0 0 0 -0.5438244,0 v 0.462382 H 5.3226493 A 0.24091162,0.24091162 0 0 1 5.0817377,13.761912 V 10.054973 A 0.24117434,0.24117434 0 0 1 5.3226493,9.8140616 H 6.115267 v 0.4623824 a 0.27191224,0.27191224 0 0 0 0.5438244,0 V 9.8140616 h 1.0335293 v 0.4623824 a 0.27191225,0.27191225 0 1 0 0.5438245,0 V 9.8140616 h 0.7926176 a 0.24091162,0.24091162 0 0 1 0.2409116,0.2409114 z"
+     id="path14"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-4"
+     d="m 13.267216,11.119503 a 0.27191224,0.27191224 0 0 0 0.271912,0.271912 h 0.463696 v 1.03353 h -0.462382 a 0.27191224,0.27191224 0 0 0 0,0.543824 h 0.462382 v 0.792618 a 0.24091162,0.24091162 0 0 1 -0.240912,0.240911 h -0.793143 v -0.462382 a 0.27191224,0.27191224 0 1 0 -0.543824,0 v 0.462908 h -1.03353 v -0.462382 a 0.27217496,0.27217496 0 0 0 -0.544087,0 v 0.462382 H 10.054973 A 0.2406489,0.2406489 0 0 1 9.8140616,13.761912 V 10.054973 A 0.24091162,0.24091162 0 0 1 10.054973,9.8140616 h 3.706414 a 0.24117434,0.24117434 0 0 1 0.240911,0.2409114 v 0.792618 h -0.462382 a 0.27191224,0.27191224 0 0 0 -0.2727,0.271912 z"
+     id="path16"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-5"
+     d="m 18.73436,10.054973 v 3.706414 a 0.2406489,0.2406489 0 0 1 -0.240912,0.240911 h -3.706414 a 0.24091162,0.24091162 0 0 1 -0.240911,-0.240911 v -0.792618 h 0.462382 a 0.27191224,0.27191224 0 1 0 0,-0.543824 h -0.462382 v -1.03353 h 0.462382 a 0.27191224,0.27191224 0 0 0 0,-0.543824 h -0.462382 v -0.792618 a 0.24117434,0.24117434 0 0 1 0.240911,-0.2409114 h 0.792093 v 0.4623824 a 0.27191224,0.27191224 0 0 0 0.543824,0 V 9.8140616 h 1.033529 v 0.4623824 a 0.27191251,0.27191251 0 0 0 0.543825,0 V 9.8140616 h 0.792617 a 0.24091162,0.24091162 0 0 1 0.241438,0.2409114 z"
+     id="path18"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-2"
+     d="m 8.53568,15.851827 a 0.27217496,0.27217496 0 0 0 0.2719122,0.271912 h 0.4623822 v 1.033267 H 8.8075922 a 0.27217496,0.27217496 0 0 0 0,0.544087 h 0.4623822 v 0.792618 A 0.24091162,0.24091162 0 0 1 9.0290628,18.734622 H 5.3226493 A 0.24117434,0.24117434 0 0 1 5.0817377,18.493711 V 14.787297 A 0.24091162,0.24091162 0 0 1 5.3226493,14.546386 H 6.115267 v 0.462119 a 0.27191224,0.27191224 0 1 0 0.5438244,0 v -0.462119 h 1.0335293 v 0.462119 a 0.27191225,0.27191225 0 1 0 0.5438245,0 v -0.462119 h 0.7926176 a 0.2406489,0.2406489 0 0 1 0.2409116,0.240911 v 0.79183 H 8.8075922 a 0.27217496,0.27217496 0 0 0 -0.2719122,0.2727 z"
+     id="path20"
+     style="stroke-width:0.0262717" />
+  <path
+     class="cls-5"
+     d="m 14.002824,14.787297 v 3.706414 a 0.24117434,0.24117434 0 0 1 -0.240912,0.240911 H 10.054973 A 0.24091162,0.24091162 0 0 1 9.8140616,18.493711 v -0.792618 h 0.4621194 a 0.27217496,0.27217496 0 1 0 0,-0.544087 H 9.8140616 v -1.033267 h 0.4621194 a 0.27217496,0.27217496 0 1 0 0,-0.544087 H 9.8140616 v -0.792355 a 0.2406489,0.2406489 0 0 1 0.2409114,-0.240911 h 0.792355 v 0.462119 a 0.27217496,0.27217496 0 1 0 0.544087,0 v -0.462119 h 1.03353 v 0.462119 a 0.27191224,0.27191224 0 1 0 0.543824,0 v -0.462119 h 0.792618 a 0.24091162,0.24091162 0 0 1 0.241437,0.240911 z"
+     id="path22"
+     style="stroke-width:0.0262717" />
+  <rect
+     class="cls-2"
+     x="-2.0941913"
+     y="22.665482"
+     width="4.1882367"
+     height="4.1882367"
+     rx="0.24091162"
+     transform="rotate(-45)"
+     id="rect24"
+     style="stroke-width:0.0262717" />
+</svg>
diff --git a/launcher/resources/multimc/scalable/quilt-loader.svg b/launcher/resources/multimc/scalable/quilt-loader.svg
deleted file mode 100644
index fd6faea4..00000000
--- a/launcher/resources/multimc/scalable/quilt-loader.svg
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   width="32"
-   height="32"
-   version="1.1"
-   id="svg610"
-   sodipodi:docname="quilt-loader.svg"
-   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg">
-  <defs
-     id="defs614" />
-  <sodipodi:namedview
-     id="namedview612"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:showpageshadow="2"
-     inkscape:pageopacity="0.0"
-     inkscape:pagecheckerboard="0"
-     inkscape:deskcolor="#d1d1d1"
-     showgrid="false"
-     inkscape:zoom="9.27"
-     inkscape:cx="5.1240561"
-     inkscape:cy="18.662352"
-     inkscape:window-width="1920"
-     inkscape:window-height="1011"
-     inkscape:window-x="0"
-     inkscape:window-y="32"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg610" />
-  <path
-     d="m 9.6700715,5.9303528 c 0,0.2594651 0.2143021,0.4737672 0.4737675,0.4737672 h 0.805847 V 8.2026643 H 10.143839 A 0.4719961,0.4719961 0 0 0 9.6833547,8.6764315 c 0,0.2568083 0.2036756,0.4675683 0.4604843,0.4711105 h 0.805847 v 1.383223 c 0,0.232013 -0.186851,0.418863 -0.418864,0.418863 H 9.1511414 V 10.143781 A 0.4719961,0.4719961 0 0 0 8.6764887,9.6700142 0.4719961,0.4719961 0 0 0 8.2027215,10.143781 v 0.805847 H 6.4050628 v -0.805847 a 0.47465274,0.47465274 0 1 0 -0.9484199,0 v 0.805847 H 4.0760764 A 0.42063442,0.42063442 0 0 1 3.6545565,10.530765 V 4.0760192 c 0,-0.2320131 0.1895068,-0.42152 0.4215199,-0.42152 h 6.4556316 c 0.230242,0 0.417978,0.1895069 0.417978,0.42152 v 1.381452 H 10.143839 A 0.4719961,0.4719961 0 0 0 9.6700715,5.9312384 Z m 0,0"
-     style="fill:#9722ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path592" />
-  <path
-     d="m 17.912735,5.9303528 c 0,0.2594651 0.21076,0.4737672 0.473767,0.4737672 h 0.805847 v 1.7985443 h -0.805847 a 0.47288164,0.47288164 0 0 0 0,0.9448777 h 0.805847 v 1.383223 c 0,0.232013 -0.185964,0.418863 -0.417978,0.418863 H 12.316083 A 0.41797778,0.41797778 0 0 1 11.89722,10.530765 V 9.147542 h 0.805847 a 0.46579728,0.46579728 0 0 0 0.418863,-0.2320131 0.47819492,0.47819492 0 0 0 0,-0.4808515 0.46579728,0.46579728 0 0 0 -0.418863,-0.2320131 H 11.89722 V 6.4050056 h 0.805847 A 0.47553828,0.47553828 0 0 0 13.12193,5.6877132 0.46579728,0.46579728 0 0 0 12.703067,5.4565857 H 11.89722 V 4.0760192 a 0.42151997,0.42151997 0 0 1 0.418863,-0.4224055 h 6.454746 c 0.232013,0 0.418864,0.1903924 0.418864,0.4224055 v 1.381452 h -0.805847 a 0.4719961,0.4719961 0 0 0 -0.471111,0.4737672 z m 0,0"
-     style="fill:#dc29dd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path594" />
-  <path
-     d="m 27.432356,4.0760192 v 6.4556318 c 0,0.230242 -0.185965,0.417977 -0.418863,0.417977 H 25.633812 V 10.143781 A 0.48173711,0.48173711 0 0 0 25.398257,9.7213759 0.47111055,0.47111055 0 0 0 24.685392,10.143781 v 0.805847 h -1.797659 v -0.805847 a 0.48173711,0.48173711 0 0 0 -0.235555,-0.4224051 0.47819492,0.47819492 0 0 0 -0.480852,0 0.47819492,0.47819492 0 0 0 -0.232013,0.4224051 v 0.805847 h -1.380566 a 0.42329106,0.42329106 0 0 1 -0.42152,-0.418863 V 9.1510842 h 0.809389 A 0.47553828,0.47553828 0 0 0 21.365479,8.4346774 0.47288164,0.47288164 0 0 0 20.946616,8.2026643 H 20.137227 V 6.4050056 h 0.809389 a 0.47420996,0.47420996 0 0 0 0,-0.9484199 H 20.137227 V 4.0760192 c 0,-0.2320131 0.190392,-0.42152 0.42152,-0.42152 h 6.455631 c 0.231128,0 0.417978,0.1895069 0.417978,0.42152 z m 0,0"
-     style="fill:#27a2fd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path596" />
-  <path
-     d="m 10.949686,12.316026 v 6.454746 c 0,0.232013 -0.186851,0.418863 -0.418864,0.418863 H 9.1511414 v -0.805847 a 0.47465274,0.47465274 0 0 0 -0.9475344,0 v 0.805847 H 6.4032917 V 18.383788 A 0.47553828,0.47553828 0 0 0 5.6868849,17.964925 0.47288164,0.47288164 0 0 0 5.4557573,18.382903 V 19.18875 H 4.0760764 A 0.42063442,0.42063442 0 0 1 3.6545565,18.770772 v -6.455631 c 0,-0.230242 0.1895068,-0.417978 0.4215199,-0.417978 h 1.381452 v 0.805847 a 0.4737672,0.4737672 0 0 0 0.9475344,0 v -0.805847 h 1.7976587 v 0.805847 a 0.47243887,0.47243887 0 1 0 0.9448777,0 v -0.805847 h 1.3832228 a 0.41886333,0.41886333 0 0 1 0.418864,0.418863 z m 0,0"
-     style="fill:#dc29dd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path598" />
-  <path
-     d="m 17.912735,14.17036 a 0.47376719,0.47376719 0 0 0 0.473767,0.473767 h 0.805847 v 1.798544 h -0.805847 a 0.47465274,0.47465274 0 0 0 0,0.947535 h 0.805847 v 1.380566 c 0,0.232013 -0.185964,0.418863 -0.417978,0.418863 h -1.384108 v -0.805847 a 0.48173711,0.48173711 0 0 0 -0.23467,-0.422405 0.47819492,0.47819492 0 0 0 -0.480851,0 0.48527929,0.48527929 0 0 0 -0.232014,0.42152 v 0.805847 h -1.798544 v -0.805847 a 0.4719961,0.4719961 0 0 0 -0.473767,-0.473767 0.4719961,0.4719961 0 0 0 -0.474653,0.473767 V 19.18875 H 12.316083 A 0.43391761,0.43391761 0 0 1 12.01854,19.068316 0.43391761,0.43391761 0 0 1 11.89722,18.770772 v -6.455631 c 0,-0.230242 0.18685,-0.417978 0.418863,-0.417978 h 6.454746 c 0.232013,0 0.418864,0.18685 0.418864,0.418863 v 1.379681 h -0.805847 a 0.47376719,0.47376719 0 0 0 -0.471111,0.474653 z m 0,0"
-     style="fill:#27a2fd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path600" />
-  <path
-     d="m 27.432356,12.316026 v 6.454746 c 0,0.232013 -0.185965,0.418863 -0.418863,0.418863 h -6.454746 a 0.42063442,0.42063442 0 0 1 -0.42152,-0.418863 v -1.380566 h 0.805847 a 0.47730938,0.47730938 0 0 0 0.422405,-0.715522 0.48173711,0.48173711 0 0 0 -0.422405,-0.232013 h -0.805847 v -1.798544 h 0.805847 a 0.47730938,0.47730938 0 0 0 0.422405,-0.235555 0.4719961,0.4719961 0 0 0 0,-0.47731 0.47730938,0.47730938 0 0 0 -0.422405,-0.235555 h -0.805847 v -1.379681 c 0,-0.232013 0.190392,-0.418863 0.42152,-0.418863 h 1.380566 v 0.805847 a 0.46933946,0.46933946 0 0 0 0.470225,0.460484 c 0.259465,0 0.467569,-0.203676 0.473768,-0.460484 v -0.805847 h 1.799429 v 0.805847 a 0.4737675,0.4737675 0 0 0 0.947535,0 v -0.805847 h 1.380566 a 0.41886333,0.41886333 0 0 1 0.42152,0.418863 z m 0,0"
-     style="fill:#3344ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path602" />
-  <path
-     d="m 9.6700715,22.413023 c 0,0.259465 0.2143021,0.470225 0.4737675,0.470225 h 0.805847 v 1.802972 h -0.805847 a 0.47376719,0.47376719 0 0 0 -0.4737675,0.46934 c 0,0.263893 0.2143021,0.474653 0.4737675,0.474653 h 0.805847 v 1.380566 c 0,0.231128 -0.186851,0.42152 -0.418864,0.42152 H 4.0760764 A 0.42329106,0.42329106 0 0 1 3.6545565,27.010779 V 20.55869 c 0,-0.231128 0.1895068,-0.42152 0.4215199,-0.42152 h 1.381452 v 0.805847 a 0.46225509,0.46225509 0 0 0 0.2311276,0.418863 0.46225509,0.46225509 0 0 0 0.4808515,0 0.4719961,0.4719961 0 0 0 0.2355553,-0.418863 V 20.13717 h 1.7976587 v 0.805847 a 0.47243887,0.47243887 0 1 0 0.9448777,0 V 20.13717 h 1.3832228 c 0.232013,0 0.418864,0.190392 0.418864,0.42152 v 1.377024 h -0.805847 a 0.47819492,0.47819492 0 0 0 -0.4737675,0.478195 z m 0,0"
-     style="fill:#9722ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path604" />
-  <path
-     d="m 19.189693,20.55869 v 6.455631 c 0,0.231128 -0.186851,0.417978 -0.418864,0.417978 H 12.315198 A 0.41797778,0.41797778 0 0 1 11.89722,27.013436 v -1.379681 h 0.805847 a 0.4737675,0.4737675 0 0 0 0,-0.947535 H 11.89722 v -1.799429 h 0.805847 A 0.47553828,0.47553828 0 0 0 13.12193,22.171269 0.46579728,0.46579728 0 0 0 12.703067,21.939256 H 11.89722 V 20.55869 a 0.42151997,0.42151997 0 0 1 0.418863,-0.422406 h 1.379681 v 0.806733 c 0,0.263007 0.211646,0.473767 0.474653,0.473767 a 0.4719961,0.4719961 0 0 0 0.473767,-0.473767 V 20.13717 h 1.798544 v 0.805847 a 0.47553828,0.47553828 0 0 0 0.232014,0.418863 0.46225509,0.46225509 0 0 0 0.480851,0 0.4719961,0.4719961 0 0 0 0.23467,-0.418863 V 20.13717 h 1.380566 a 0.42151997,0.42151997 0 0 1 0.418864,0.42152 z m 0,0"
-     style="fill:#3344ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path606" />
-  <path
-     d="m 20.43477,24.997047 4.562334,-4.562334 a 0.42417661,0.42417661 0 0 1 0.595087,0 l 4.562334,4.562334 a 0.41797778,0.41797778 0 0 1 0,0.595087 l -4.562334,4.562334 a 0.41797778,0.41797778 0 0 1 -0.595087,0 L 20.43477,25.592134 a 0.42417661,0.42417661 0 0 1 0,-0.595087 z m 0,0"
-     style="fill:#9722ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885546"
-     id="path608" />
-</svg>
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 5df27dba..a9d08fc5 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -42,7 +42,7 @@ class LoaderPage : public VersionSelectWidget, public BasePage {
         : VersionSelectWidget(parent), m_id(std::move(id)), m_icon(std::move(icon)), m_name(std::move(name))
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
-        setEmptyErrorString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
+        setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
         if (!lightweight)
             setExactFilter(BaseVersionList::ParentVersionRole, minecraftVersion);
 
@@ -108,11 +108,11 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
     return { // Forge
-             new LoaderPage("net.minecraftforge", "forge-loader", tr("Forge"), false, m_profile, this),
+             new LoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile, this),
              // Fabric
-             new LoaderPage("net.fabricmc.fabric-loader", "fabric-loader", tr("Fabric"), true, m_profile, this),
+             new LoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile, this),
              // Quilt
-             new LoaderPage("org.quiltmc.quilt-loader", "quilt-loader", tr("Quilt"), true, m_profile, this),
+             new LoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile, this),
              // LiteLoader
              new LoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
     };
-- 
cgit 


From 1f16380efce61fa028d6c25308c8cac7925da72a Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Thu, 22 Jun 2023 12:56:47 +0100
Subject: Fix I could use rvalue references and fix my brain fart, but i think
 regular references are more readable and safer here.

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index a9d08fc5..cc8d7e54 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -32,14 +32,14 @@
 
 class LoaderPage : public VersionSelectWidget, public BasePage {
    public:
-    LoaderPage(const QString&& id,
-               const QString&& icon,
-               const QString&& name,
+    LoaderPage(const QString& id,
+               const QString& icon,
+               const QString& name,
                // "lightweight" loaders are independent to any game version
                const bool lightweight,
                const std::shared_ptr<PackProfile> profile,
                QWidget* parent = nullptr)
-        : VersionSelectWidget(parent), m_id(std::move(id)), m_icon(std::move(icon)), m_name(std::move(name))
+        : VersionSelectWidget(parent), m_id(id), m_icon(icon), m_name(name)
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
         setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
-- 
cgit 


From 05d2c1f0b06519eba9cc5ad22848106b49f9bd15 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Thu, 22 Jun 2023 18:18:33 +0100
Subject: Dynamic button text

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 23 ++++++++++++++++-------
 launcher/ui/dialogs/InstallLoaderDialog.h   |  3 +++
 2 files changed, 19 insertions(+), 7 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index cc8d7e54..6e1ad1c0 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -75,7 +75,7 @@ class LoaderPage : public VersionSelectWidget, public BasePage {
 };
 
 InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, QWidget* parent)
-    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this))
+    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this)), m_buttons(new QDialogButtonBox(this))
 {
     auto layout = new QVBoxLayout(this);
 
@@ -92,17 +92,20 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
     });
     buttonLayout->addWidget(refreshButton);
 
-    auto buttons = new QDialogButtonBox(this);
-    buttons->setOrientation(Qt::Horizontal);
-    buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-    connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
-    connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
-    buttonLayout->addWidget(buttons);
+    m_buttons->setOrientation(Qt::Horizontal);
+    m_buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+    connect(m_buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    connect(m_buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+    buttonLayout->addWidget(m_buttons);
 
     layout->addLayout(buttonLayout);
 
     setWindowTitle(dialogTitle());
     resize(650, 400);
+
+    connect(m_container, &PageContainer::selectedPageChanged, this,
+            [this](BasePage* previous, BasePage* selected) { updateAcceptButton(selected); });
+    updateAcceptButton(m_container->selectedPage());
 }
 
 QList<BasePage*> InstallLoaderDialog::getPages()
@@ -123,6 +126,12 @@ QString InstallLoaderDialog::dialogTitle()
     return tr("Install Loader");
 }
 
+void InstallLoaderDialog::updateAcceptButton(const BasePage* page)
+{
+    auto installed = !m_profile->getComponentVersion(page->id()).isNull();
+    m_buttons->button(QDialogButtonBox::Ok)->setText(installed ? tr("&Update") : tr("&Install"));
+}
+
 void InstallLoaderDialog::done(int result)
 {
     if (result == Accepted) {
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.h b/launcher/ui/dialogs/InstallLoaderDialog.h
index 7a32e427..6c8762dc 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.h
+++ b/launcher/ui/dialogs/InstallLoaderDialog.h
@@ -24,6 +24,7 @@
 class MinecraftInstance;
 class PageContainer;
 class PackProfile;
+class QDialogButtonBox;
 
 class InstallLoaderDialog : public QDialog, public BasePageProvider {
     Q_OBJECT
@@ -34,9 +35,11 @@ class InstallLoaderDialog : public QDialog, public BasePageProvider {
     QList<BasePage*> getPages() override;
     QString dialogTitle() override;
 
+    void updateAcceptButton(const BasePage* page);
     void done(int result) override;
 
    private:
     std::shared_ptr<PackProfile> m_profile;
     PageContainer* m_container;
+    QDialogButtonBox* m_buttons;
 };
-- 
cgit 


From 4332b62a6268e3093c957dfcbd652c5275228546 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Sat, 1 Jul 2023 16:39:21 +0100
Subject: Fix search focusing

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 22 ++++++++++------------
 launcher/ui/dialogs/VersionSelectDialog.cpp |  3 ++-
 launcher/ui/widgets/JavaSettingsWidget.cpp  |  3 ++-
 launcher/ui/widgets/VersionSelectWidget.cpp | 14 +++++++-------
 launcher/ui/widgets/VersionSelectWidget.h   |  4 ++--
 5 files changed, 23 insertions(+), 23 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 6e1ad1c0..f62fb8c4 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -30,9 +30,9 @@
 #include "ui/widgets/PageContainer.h"
 #include "ui/widgets/VersionSelectWidget.h"
 
-class LoaderPage : public VersionSelectWidget, public BasePage {
+class InstallLoaderPage : public VersionSelectWidget, public BasePage {
    public:
-    LoaderPage(const QString& id,
+    InstallLoaderPage(const QString& id,
                const QString& icon,
                const QString& name,
                // "lightweight" loaders are independent to any game version
@@ -86,9 +86,7 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
 
     auto refreshButton = new QPushButton(tr("&Refresh"), this);
     connect(refreshButton, &QPushButton::pressed, this, [this] {
-        LoaderPage* page = dynamic_cast<LoaderPage*>(m_container->selectedPage());
-        Q_ASSERT(page != nullptr);
-        page->loadList();
+        dynamic_cast<InstallLoaderPage*>(m_container->selectedPage())->loadList();
     });
     buttonLayout->addWidget(refreshButton);
 
@@ -106,18 +104,20 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
     connect(m_container, &PageContainer::selectedPageChanged, this,
             [this](BasePage* previous, BasePage* selected) { updateAcceptButton(selected); });
     updateAcceptButton(m_container->selectedPage());
+
+    dynamic_cast<InstallLoaderPage*>(m_container->selectedPage())->selectSearch();
 }
 
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
     return { // Forge
-             new LoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile, this),
+             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile, this),
              // Fabric
-             new LoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile, this),
+             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile, this),
              // Quilt
-             new LoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile, this),
+             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile, this),
              // LiteLoader
-             new LoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
+             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
     };
 }
 
@@ -135,9 +135,7 @@ void InstallLoaderDialog::updateAcceptButton(const BasePage* page)
 void InstallLoaderDialog::done(int result)
 {
     if (result == Accepted) {
-        LoaderPage* page = dynamic_cast<LoaderPage*>(m_container->selectedPage());
-        Q_ASSERT(page != nullptr);
-
+        auto* page = dynamic_cast<InstallLoaderPage*>(m_container->selectedPage());
         if (page->selectedVersion()) {
             m_profile->setComponentVersion(page->id(), page->selectedVersion()->descriptor());
             m_profile->resolve(Net::Mode::Online);
diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp
index 5feb70d2..dec85550 100644
--- a/launcher/ui/dialogs/VersionSelectDialog.cpp
+++ b/launcher/ui/dialogs/VersionSelectDialog.cpp
@@ -55,7 +55,7 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QString title,
     m_verticalLayout = new QVBoxLayout(this);
     m_verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
 
-    m_versionWidget = new VersionSelectWidget(true, parent);
+    m_versionWidget = new VersionSelectWidget(parent);
     m_verticalLayout->addWidget(m_versionWidget);
 
     m_horizontalLayout = new QHBoxLayout();
@@ -123,6 +123,7 @@ int VersionSelectDialog::exec()
 {
     QDialog::open();
     m_versionWidget->initialize(m_vlist);
+    m_versionWidget->selectSearch();
     if(resizeOnColumn != -1)
     {
         m_versionWidget->setResizeOn(resizeOnColumn);
diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp
index c94fdd8d..d77e0fa0 100644
--- a/launcher/ui/widgets/JavaSettingsWidget.cpp
+++ b/launcher/ui/widgets/JavaSettingsWidget.cpp
@@ -46,7 +46,7 @@ void JavaSettingsWidget::setupUi()
     m_verticalLayout = new QVBoxLayout(this);
     m_verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
 
-    m_versionWidget = new VersionSelectWidget(true, this);
+    m_versionWidget = new VersionSelectWidget(this);
     m_verticalLayout->addWidget(m_versionWidget);
 
     m_horizontalLayout = new QHBoxLayout();
@@ -126,6 +126,7 @@ void JavaSettingsWidget::setupUi()
 void JavaSettingsWidget::initialize()
 {
     m_versionWidget->initialize(APPLICATION->javalist().get());
+    m_versionWidget->selectSearch();
     m_versionWidget->setResizeOn(2);
     auto s = APPLICATION->settings();
     // Memory
diff --git a/launcher/ui/widgets/VersionSelectWidget.cpp b/launcher/ui/widgets/VersionSelectWidget.cpp
index a956ddb3..efc9c412 100644
--- a/launcher/ui/widgets/VersionSelectWidget.cpp
+++ b/launcher/ui/widgets/VersionSelectWidget.cpp
@@ -11,10 +11,8 @@
 
 #include "ui/dialogs/CustomMessageBox.h"
 
-VersionSelectWidget::VersionSelectWidget(QWidget* parent) : VersionSelectWidget(false, parent) {}
-
-VersionSelectWidget::VersionSelectWidget(bool focusSearch, QWidget* parent)
-    : QWidget(parent), focusSearch(focusSearch)
+VersionSelectWidget::VersionSelectWidget(QWidget* parent)
+    : QWidget(parent)
 {
     setObjectName(QStringLiteral("VersionSelectWidget"));
     verticalLayout = new QVBoxLayout(this);
@@ -116,9 +114,6 @@ void VersionSelectWidget::initialize(BaseVersionList *vlist)
     listView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
     listView->header()->setSectionResizeMode(resizeOnColumn, QHeaderView::Stretch);
 
-    if (focusSearch)
-        search->setFocus();
-
     if (!m_vlist->isLoaded())
     {
         loadList();
@@ -210,6 +205,11 @@ void VersionSelectWidget::selectCurrent()
     }
 }
 
+void VersionSelectWidget::selectSearch()
+{
+    search->setFocus();
+}
+
 void VersionSelectWidget::selectRecommended()
 {
     auto idx = m_proxyModel->getRecommended();
diff --git a/launcher/ui/widgets/VersionSelectWidget.h b/launcher/ui/widgets/VersionSelectWidget.h
index be4ba768..a1b60d35 100644
--- a/launcher/ui/widgets/VersionSelectWidget.h
+++ b/launcher/ui/widgets/VersionSelectWidget.h
@@ -52,7 +52,6 @@ class VersionSelectWidget: public QWidget
     Q_OBJECT
 public:
     explicit VersionSelectWidget(QWidget *parent);
-    explicit VersionSelectWidget(bool focusSearch = false, QWidget *parent = 0);
     ~VersionSelectWidget();
 
     //! loads the list if needed.
@@ -65,6 +64,7 @@ public:
     BaseVersion::Ptr selectedVersion() const;
     void selectRecommended();
     void selectCurrent();
+    void selectSearch();
 
     void setCurrentVersion(const QString & version);
     void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
@@ -74,6 +74,7 @@ public:
     void setEmptyErrorString(QString emptyErrorString);
     void setEmptyMode(VersionListView::EmptyMode mode);
     void setResizeOn(int column);
+
     bool eventFilter(QObject* watched, QEvent* event) override;
 
 signals:
@@ -98,7 +99,6 @@ private:
     int resizeOnColumn = 0;
     Task * loadTask;
     bool preselectedAlready = false;
-    bool focusSearch;
 
     QVBoxLayout *verticalLayout = nullptr;
     VersionListView *listView = nullptr;
-- 
cgit 


From 4cdf669154327b764ea2f7371e3d29f71d06daa7 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Sat, 1 Jul 2023 17:02:39 +0100
Subject: Modify "Change Version" to use "Install Loader" dialog

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 18 ++++++++++++++----
 launcher/ui/dialogs/InstallLoaderDialog.h   |  4 ++--
 launcher/ui/pages/instance/VersionPage.cpp  | 12 +++++++++++-
 3 files changed, 27 insertions(+), 7 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index f62fb8c4..74b3ea92 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -74,7 +74,14 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
     bool m_loaded = false;
 };
 
-InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, QWidget* parent)
+InstallLoaderPage* pageCast(BasePage* page)
+{
+    auto result = dynamic_cast<InstallLoaderPage*>(page);
+    Q_ASSERT(result != nullptr);
+    return result;
+}
+
+InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, const QString& uid, QWidget* parent)
     : QDialog(parent), m_profile(profile), m_container(new PageContainer(this)), m_buttons(new QDialogButtonBox(this))
 {
     auto layout = new QVBoxLayout(this);
@@ -86,7 +93,7 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
 
     auto refreshButton = new QPushButton(tr("&Refresh"), this);
     connect(refreshButton, &QPushButton::pressed, this, [this] {
-        dynamic_cast<InstallLoaderPage*>(m_container->selectedPage())->loadList();
+        pageCast(m_container->selectedPage())->loadList();
     });
     buttonLayout->addWidget(refreshButton);
 
@@ -105,7 +112,10 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, Q
             [this](BasePage* previous, BasePage* selected) { updateAcceptButton(selected); });
     updateAcceptButton(m_container->selectedPage());
 
-    dynamic_cast<InstallLoaderPage*>(m_container->selectedPage())->selectSearch();
+    pageCast(m_container->selectedPage())->selectSearch();
+    for (BasePage* page : m_container->getPages())
+        if (page->id() == uid)
+            m_container->selectPage(page->id());
 }
 
 QList<BasePage*> InstallLoaderDialog::getPages()
@@ -135,7 +145,7 @@ void InstallLoaderDialog::updateAcceptButton(const BasePage* page)
 void InstallLoaderDialog::done(int result)
 {
     if (result == Accepted) {
-        auto* page = dynamic_cast<InstallLoaderPage*>(m_container->selectedPage());
+        auto* page = pageCast(m_container->selectedPage());
         if (page->selectedVersion()) {
             m_profile->setComponentVersion(page->id(), page->selectedVersion()->descriptor());
             m_profile->resolve(Net::Mode::Online);
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.h b/launcher/ui/dialogs/InstallLoaderDialog.h
index 6c8762dc..24064eaa 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.h
+++ b/launcher/ui/dialogs/InstallLoaderDialog.h
@@ -26,11 +26,11 @@ class PageContainer;
 class PackProfile;
 class QDialogButtonBox;
 
-class InstallLoaderDialog : public QDialog, public BasePageProvider {
+class InstallLoaderDialog final : public QDialog, public BasePageProvider {
     Q_OBJECT
 
    public:
-    explicit InstallLoaderDialog(std::shared_ptr<PackProfile> instance, QWidget* parent = nullptr);
+    explicit InstallLoaderDialog(std::shared_ptr<PackProfile> instance, const QString& uid = QString(), QWidget* parent = nullptr);
 
     QList<BasePage*> getPages() override;
     QString dialogTitle() override;
diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp
index 53a71008..86ba5c27 100644
--- a/launcher/ui/pages/instance/VersionPage.cpp
+++ b/launcher/ui/pages/instance/VersionPage.cpp
@@ -432,6 +432,16 @@ void VersionPage::on_actionChange_version_triggered()
         return;
     }
     auto uid = list->uid();
+
+    // FIXME: this is still a horrible HACK.
+    if (uid == "net.minecraftforge" || uid == "com.mumfrey.liteloader" || uid == "net.fabricmc.fabric-loader" ||
+        uid == "org.quiltmc.quilt-loader") {
+        InstallLoaderDialog dialog(m_inst->getPackProfile(), uid, this);
+        dialog.exec();
+        m_container->refreshContainer();
+        return;
+    }
+
     VersionSelectDialog vselect(list.get(), tr("Change %1 version").arg(name), this);
     if (uid == "net.fabricmc.intermediary" || uid == "org.quiltmc.hashed")
     {
@@ -485,7 +495,7 @@ void VersionPage::on_actionDownload_All_triggered()
 
 void VersionPage::on_actionInstall_Loader_triggered()
 {
-    InstallLoaderDialog dialog(m_inst->getPackProfile(), this);
+    InstallLoaderDialog dialog(m_inst->getPackProfile(), QString(), this);
     dialog.exec();
     m_container->refreshContainer();
 }
-- 
cgit 


From 284e374ae858d6784b6df48c83534dc6dc973747 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Sat, 1 Jul 2023 17:20:43 +0100
Subject: Nop

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 10 ----------
 launcher/ui/dialogs/InstallLoaderDialog.h   |  1 -
 2 files changed, 11 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 74b3ea92..31307ee1 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -108,10 +108,6 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, c
     setWindowTitle(dialogTitle());
     resize(650, 400);
 
-    connect(m_container, &PageContainer::selectedPageChanged, this,
-            [this](BasePage* previous, BasePage* selected) { updateAcceptButton(selected); });
-    updateAcceptButton(m_container->selectedPage());
-
     pageCast(m_container->selectedPage())->selectSearch();
     for (BasePage* page : m_container->getPages())
         if (page->id() == uid)
@@ -136,12 +132,6 @@ QString InstallLoaderDialog::dialogTitle()
     return tr("Install Loader");
 }
 
-void InstallLoaderDialog::updateAcceptButton(const BasePage* page)
-{
-    auto installed = !m_profile->getComponentVersion(page->id()).isNull();
-    m_buttons->button(QDialogButtonBox::Ok)->setText(installed ? tr("&Update") : tr("&Install"));
-}
-
 void InstallLoaderDialog::done(int result)
 {
     if (result == Accepted) {
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.h b/launcher/ui/dialogs/InstallLoaderDialog.h
index 24064eaa..09d84777 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.h
+++ b/launcher/ui/dialogs/InstallLoaderDialog.h
@@ -35,7 +35,6 @@ class InstallLoaderDialog final : public QDialog, public BasePageProvider {
     QList<BasePage*> getPages() override;
     QString dialogTitle() override;
 
-    void updateAcceptButton(const BasePage* page);
     void done(int result) override;
 
    private:
-- 
cgit 


From 9f9b5254a239d6359d199c33fa5d966e1f4d6e63 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Sat, 1 Jul 2023 19:32:04 +0100
Subject: Double-click to install/change version

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 33 ++++++++++++++++-------------
 launcher/ui/dialogs/VersionSelectDialog.cpp |  5 +++--
 launcher/ui/widgets/VersionSelectWidget.cpp |  5 +++++
 launcher/ui/widgets/VersionSelectWidget.h   |  1 +
 4 files changed, 27 insertions(+), 17 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 31307ee1..acef60c6 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -33,13 +33,12 @@
 class InstallLoaderPage : public VersionSelectWidget, public BasePage {
    public:
     InstallLoaderPage(const QString& id,
-               const QString& icon,
-               const QString& name,
-               // "lightweight" loaders are independent to any game version
-               const bool lightweight,
-               const std::shared_ptr<PackProfile> profile,
-               QWidget* parent = nullptr)
-        : VersionSelectWidget(parent), m_id(id), m_icon(icon), m_name(name)
+                      const QString& icon,
+                      const QString& name,
+                      // "lightweight" loaders are independent to any game version
+                      const bool lightweight,
+                      const std::shared_ptr<PackProfile> profile)
+        : VersionSelectWidget(nullptr), m_id(id), m_icon(icon), m_name(name)
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
         setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
@@ -67,6 +66,12 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
         m_loaded = true;
     }
 
+    void setParentContainer(BasePageContainer* container) override
+    {
+        auto dialog = dynamic_cast<QDialog*>(dynamic_cast<PageContainer*>(container)->parent());
+        connect(view(), &QAbstractItemView::doubleClicked, dialog, &QDialog::accept);
+    }
+
    private:
     const QString m_id;
     const QString m_icon;
@@ -82,7 +87,7 @@ InstallLoaderPage* pageCast(BasePage* page)
 }
 
 InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, const QString& uid, QWidget* parent)
-    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this)), m_buttons(new QDialogButtonBox(this))
+    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this, QString(), this)), m_buttons(new QDialogButtonBox(this))
 {
     auto layout = new QVBoxLayout(this);
 
@@ -92,9 +97,7 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, c
     auto buttonLayout = new QHBoxLayout(this);
 
     auto refreshButton = new QPushButton(tr("&Refresh"), this);
-    connect(refreshButton, &QPushButton::pressed, this, [this] {
-        pageCast(m_container->selectedPage())->loadList();
-    });
+    connect(refreshButton, &QPushButton::pressed, this, [this] { pageCast(m_container->selectedPage())->loadList(); });
     buttonLayout->addWidget(refreshButton);
 
     m_buttons->setOrientation(Qt::Horizontal);
@@ -117,13 +120,13 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, c
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
     return { // Forge
-             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile, this),
+             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile),
              // Fabric
-             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile, this),
+             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile),
              // Quilt
-             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile, this),
+             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile),
              // LiteLoader
-             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile, this)
+             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile)
     };
 }
 
diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp
index dec85550..e45787e4 100644
--- a/launcher/ui/dialogs/VersionSelectDialog.cpp
+++ b/launcher/ui/dialogs/VersionSelectDialog.cpp
@@ -75,8 +75,9 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QString title,
 
     retranslate();
 
-    QObject::connect(m_buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
-    QObject::connect(m_buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
+    connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    connect(m_versionWidget->view(), &QAbstractItemView::doubleClicked, this, &QDialog::accept);
+    connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
 
     QMetaObject::connectSlotsByName(this);
     setWindowModality(Qt::WindowModal);
diff --git a/launcher/ui/widgets/VersionSelectWidget.cpp b/launcher/ui/widgets/VersionSelectWidget.cpp
index efc9c412..f20dad71 100644
--- a/launcher/ui/widgets/VersionSelectWidget.cpp
+++ b/launcher/ui/widgets/VersionSelectWidget.cpp
@@ -210,6 +210,11 @@ void VersionSelectWidget::selectSearch()
     search->setFocus();
 }
 
+VersionListView* VersionSelectWidget::view()
+{
+    return listView;
+}
+
 void VersionSelectWidget::selectRecommended()
 {
     auto idx = m_proxyModel->getRecommended();
diff --git a/launcher/ui/widgets/VersionSelectWidget.h b/launcher/ui/widgets/VersionSelectWidget.h
index a1b60d35..624d9a23 100644
--- a/launcher/ui/widgets/VersionSelectWidget.h
+++ b/launcher/ui/widgets/VersionSelectWidget.h
@@ -65,6 +65,7 @@ public:
     void selectRecommended();
     void selectCurrent();
     void selectSearch();
+    VersionListView* view();
 
     void setCurrentVersion(const QString & version);
     void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
-- 
cgit 


From 0e5c37768084cf0772ca2598b4554bf262cb581b Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Mon, 3 Jul 2023 17:32:59 +0100
Subject: Various tweaks

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 .../resources/multimc/128x128/instances/forge.png  | Bin 0 -> 3229 bytes
 launcher/resources/multimc/multimc.qrc             |   2 +-
 .../resources/multimc/scalable/instances/forge.svg |  43 ------------
 launcher/ui/dialogs/InstallLoaderDialog.cpp        |  78 ++++++++++++---------
 launcher/ui/dialogs/InstallLoaderDialog.h          |   7 +-
 launcher/ui/widgets/PageContainer.cpp              |   2 +-
 launcher/ui/widgets/PageContainer.h                |   2 +-
 7 files changed, 53 insertions(+), 81 deletions(-)
 create mode 100644 launcher/resources/multimc/128x128/instances/forge.png
 delete mode 100644 launcher/resources/multimc/scalable/instances/forge.svg

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/resources/multimc/128x128/instances/forge.png b/launcher/resources/multimc/128x128/instances/forge.png
new file mode 100644
index 00000000..d8ff79a5
Binary files /dev/null and b/launcher/resources/multimc/128x128/instances/forge.png differ
diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc
index 907fbb5d..4a407d95 100644
--- a/launcher/resources/multimc/multimc.qrc
+++ b/launcher/resources/multimc/multimc.qrc
@@ -348,9 +348,9 @@
         <file>scalable/launch.svg</file>
         <file>scalable/server.svg</file>
 
-        <file>scalable/instances/forge.svg</file>
         <file>scalable/instances/quiltmc.svg</file>
         <file>22x22/fabricmc-small.png</file>
+        <file>128x128/instances/forge.png</file>
         <file>128x128/instances/fabricmc.png</file>
         <file>128x128/instances/liteloader.png</file>
     </qresource>
diff --git a/launcher/resources/multimc/scalable/instances/forge.svg b/launcher/resources/multimc/scalable/instances/forge.svg
deleted file mode 100644
index ea402c5b..00000000
--- a/launcher/resources/multimc/scalable/instances/forge.svg
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xml:space="preserve"
-   width="24"
-   height="24"
-   viewBox="164.072 372.466 24 24"
-   version="1.1"
-   id="svg132"
-   sodipodi:docname="forge.svg"
-   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg"><defs
-     id="defs136" /><sodipodi:namedview
-     id="namedview134"
-     pagecolor="#ffffff"
-     bordercolor="#000000"
-     borderopacity="0.25"
-     inkscape:showpageshadow="2"
-     inkscape:pageopacity="0.0"
-     inkscape:pagecheckerboard="0"
-     inkscape:deskcolor="#d1d1d1"
-     showgrid="false"
-     inkscape:zoom="16"
-     inkscape:cx="24.28125"
-     inkscape:cy="4.9375"
-     inkscape:window-width="1920"
-     inkscape:window-height="1011"
-     inkscape:window-x="0"
-     inkscape:window-y="32"
-     inkscape:window-maximized="1"
-     inkscape:current-layer="svg132" /><rect
-     style="fill:#1d2d41;fill-opacity:1;stroke-width:1.02136"
-     id="rect7386"
-     width="24"
-     height="24"
-     x="164.07201"
-     y="372.466" /><path
-     fill="#1e2d41"
-     d="m 183.16438,381.24198 -8.60519,-0.42066 10.51249,-0.008 V 379.966 h -11.85315 v 3.18329 c 0,0.0266 -0.34666,-2.07997 -0.42599,-2.66864 h -0.93198 v 2.96329 c 0,0.028 -0.39866,-2.47596 -0.44066,-2.78929 h -6.3479 c 0.43266,0.37466 2.81996,2.40997 4.51726,3.24729 0.85065,0.41999 1.89464,0.42332 2.8233,0.44933 0.47199,0.0134 0.96665,0.0493 1.31997,0.39866 0.51266,0.50865 0.62665,1.29731 0.18466,1.89396 -0.43732,0.59 -1.66797,0.718 -1.66797,0.718 l -1.02531,1.25798 v 1.46063 h 2.3313 l 0.072,-1.44329 2.01597,-1.42932 c -0.21534,0.17199 -0.69533,0.63332 -1.41664,1.7433 a 3.9826047,3.9826047 0 0 0 -0.38934,0.79333 c 0.50933,-0.43134 1.55531,-0.72667 2.76396,-0.72667 1.20665,0 2.25196,0.29467 2.76195,0.72533 a 3.9752715,3.9752715 0 0 0 -0.38866,-0.79199 c -0.72132,-1.11064 -1.20131,-1.57131 -1.41664,-1.7433 l 2.01597,1.42932 0.0727,1.44329 h 2.17462 v -1.45997 l -1.02464,-1.25864 c 0,0 -1.51798,-0.0967 -1.9153,-0.71733 -1.14466,-1.7893 0.48066,-4.5666 4.28327,-5.40258 z"
-     style="fill:#ffffff;stroke-width:0.227407"
-     id="path130" /></svg>
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index acef60c6..31d6f9ab 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -38,7 +38,7 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
                       // "lightweight" loaders are independent to any game version
                       const bool lightweight,
                       const std::shared_ptr<PackProfile> profile)
-        : VersionSelectWidget(nullptr), m_id(id), m_icon(icon), m_name(name)
+        : VersionSelectWidget(nullptr), uid(id), iconName(icon), name(name)
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
         setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
@@ -49,21 +49,21 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
             setCurrentVersion(currentVersion);
     }
 
-    QString id() const override { return m_id; }
-    QString displayName() const override { return m_name; }
-    QIcon icon() const override { return APPLICATION->getThemedIcon(m_icon); }
+    QString id() const override { return uid; }
+    QString displayName() const override { return name; }
+    QIcon icon() const override { return APPLICATION->getThemedIcon(iconName); }
 
     void openedImpl() override
     {
-        if (m_loaded)
+        if (loaded)
             return;
 
-        const auto versions = APPLICATION->metadataIndex()->get(m_id);
+        const auto versions = APPLICATION->metadataIndex()->get(uid);
         if (!versions)
             return;
 
         initialize(versions.get());
-        m_loaded = true;
+        loaded = true;
     }
 
     void setParentContainer(BasePageContainer* container) override
@@ -73,13 +73,13 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
     }
 
    private:
-    const QString m_id;
-    const QString m_icon;
-    const QString m_name;
-    bool m_loaded = false;
+    const QString uid;
+    const QString iconName;
+    const QString name;
+    bool loaded = false;
 };
 
-InstallLoaderPage* pageCast(BasePage* page)
+static InstallLoaderPage* pageCast(BasePage* page)
 {
     auto result = dynamic_cast<InstallLoaderPage*>(page);
     Q_ASSERT(result != nullptr);
@@ -87,46 +87,55 @@ InstallLoaderPage* pageCast(BasePage* page)
 }
 
 InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, const QString& uid, QWidget* parent)
-    : QDialog(parent), m_profile(profile), m_container(new PageContainer(this, QString(), this)), m_buttons(new QDialogButtonBox(this))
+    : QDialog(parent), profile(std::move(profile)), container(new PageContainer(this, QString(), this)), buttons(new QDialogButtonBox(this))
 {
     auto layout = new QVBoxLayout(this);
 
-    m_container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
-    layout->addWidget(m_container);
+    container->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
+    layout->addWidget(container);
 
     auto buttonLayout = new QHBoxLayout(this);
 
     auto refreshButton = new QPushButton(tr("&Refresh"), this);
-    connect(refreshButton, &QPushButton::pressed, this, [this] { pageCast(m_container->selectedPage())->loadList(); });
+    connect(refreshButton, &QPushButton::pressed, this, [this] { pageCast(container->selectedPage())->loadList(); });
     buttonLayout->addWidget(refreshButton);
 
-    m_buttons->setOrientation(Qt::Horizontal);
-    m_buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
-    connect(m_buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
-    connect(m_buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
-    buttonLayout->addWidget(m_buttons);
+    buttons->setOrientation(Qt::Horizontal);
+    buttons->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok);
+    connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
+    connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
+    buttonLayout->addWidget(buttons);
 
     layout->addLayout(buttonLayout);
 
     setWindowTitle(dialogTitle());
-    resize(650, 400);
+    setWindowModality(Qt::WindowModal);
+    resize(520, 347);
 
-    pageCast(m_container->selectedPage())->selectSearch();
-    for (BasePage* page : m_container->getPages())
+    for (BasePage* page : container->getPages()) {
         if (page->id() == uid)
-            m_container->selectPage(page->id());
+            container->selectPage(page->id());
+
+        connect(pageCast(page), &VersionSelectWidget::selectedVersionChanged, this, [this, page] {
+            if (page->id() == container->selectedPage()->id())
+                validate(container->selectedPage());
+        });
+    }
+    connect(container, &PageContainer::selectedPageChanged, this, [this](BasePage* previous, BasePage* current) { validate(current); });
+    pageCast(container->selectedPage())->selectSearch();
+    validate(container->selectedPage());
 }
 
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
     return { // Forge
-             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, m_profile),
+             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, profile),
              // Fabric
-             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, m_profile),
+             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, profile),
              // Quilt
-             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, m_profile),
+             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, profile),
              // LiteLoader
-             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, m_profile)
+             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, profile)
     };
 }
 
@@ -135,13 +144,18 @@ QString InstallLoaderDialog::dialogTitle()
     return tr("Install Loader");
 }
 
+void InstallLoaderDialog::validate(BasePage* page)
+{
+    buttons->button(QDialogButtonBox::Ok)->setEnabled(pageCast(page)->selectedVersion() != nullptr);
+}
+
 void InstallLoaderDialog::done(int result)
 {
     if (result == Accepted) {
-        auto* page = pageCast(m_container->selectedPage());
+        auto* page = pageCast(container->selectedPage());
         if (page->selectedVersion()) {
-            m_profile->setComponentVersion(page->id(), page->selectedVersion()->descriptor());
-            m_profile->resolve(Net::Mode::Online);
+            profile->setComponentVersion(page->id(), page->selectedVersion()->descriptor());
+            profile->resolve(Net::Mode::Online);
         }
     }
 
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.h b/launcher/ui/dialogs/InstallLoaderDialog.h
index 09d84777..cdcba2b9 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.h
+++ b/launcher/ui/dialogs/InstallLoaderDialog.h
@@ -35,10 +35,11 @@ class InstallLoaderDialog final : public QDialog, public BasePageProvider {
     QList<BasePage*> getPages() override;
     QString dialogTitle() override;
 
+    void validate(BasePage* page);
     void done(int result) override;
 
    private:
-    std::shared_ptr<PackProfile> m_profile;
-    PageContainer* m_container;
-    QDialogButtonBox* m_buttons;
+    std::shared_ptr<PackProfile> profile;
+    PageContainer* container;
+    QDialogButtonBox* buttons;
 };
diff --git a/launcher/ui/widgets/PageContainer.cpp b/launcher/ui/widgets/PageContainer.cpp
index 0a8a0544..dbbed36a 100644
--- a/launcher/ui/widgets/PageContainer.cpp
+++ b/launcher/ui/widgets/PageContainer.cpp
@@ -147,7 +147,7 @@ BasePage* PageContainer::selectedPage() const
     return m_currentPage;
 }
 
-const QList<BasePage*> PageContainer::getPages() const
+const QList<BasePage*>& PageContainer::getPages() const
 {
     return m_model->pages();
 }
diff --git a/launcher/ui/widgets/PageContainer.h b/launcher/ui/widgets/PageContainer.h
index bb365c82..eac59723 100644
--- a/launcher/ui/widgets/PageContainer.h
+++ b/launcher/ui/widgets/PageContainer.h
@@ -82,7 +82,7 @@ public:
     bool selectPage(QString pageId) override;
     BasePage* selectedPage() const override;
     BasePage* getPage(QString pageId) override;
-    const QList<BasePage*> getPages() const;
+    const QList<BasePage*>& getPages() const;
 
     void refreshContainer() override;
     virtual void setParentContainer(BasePageContainer * container)
-- 
cgit 


From 64c591b234cec2519d8a04b32d4b6e85dcf204da Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Mon, 3 Jul 2023 20:48:37 +0100
Subject: Better parent version filtering; handle old fabric :P

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/Filter.cpp                         |  6 ++++++
 launcher/Filter.h                           | 10 ++++++++++
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 17 +++++++++--------
 launcher/ui/dialogs/VersionSelectDialog.cpp |  4 ++++
 launcher/ui/dialogs/VersionSelectDialog.h   |  1 +
 launcher/ui/pages/instance/VersionPage.cpp  | 12 ++----------
 launcher/ui/widgets/VersionSelectWidget.cpp |  9 +++++++--
 launcher/ui/widgets/VersionSelectWidget.h   |  1 +
 8 files changed, 40 insertions(+), 20 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/Filter.cpp b/launcher/Filter.cpp
index c65ca0ce..f9530597 100644
--- a/launcher/Filter.cpp
+++ b/launcher/Filter.cpp
@@ -16,6 +16,12 @@ bool ExactFilter::accepts(const QString& value)
     return value == pattern;
 }
 
+ExactIfPresentFilter::ExactIfPresentFilter(const QString& pattern) : pattern(pattern) {}
+bool ExactIfPresentFilter::accepts(const QString& value)
+{
+    return value.isEmpty() || value == pattern;
+}
+
 RegexpFilter::RegexpFilter(const QString& regexp, bool invert)
     :invert(invert)
 {
diff --git a/launcher/Filter.h b/launcher/Filter.h
index b55067ac..d3cee2d8 100644
--- a/launcher/Filter.h
+++ b/launcher/Filter.h
@@ -30,6 +30,16 @@ private:
     QString pattern;
 };
 
+class ExactIfPresentFilter: public Filter
+{
+   public:
+    ExactIfPresentFilter(const QString& pattern);
+    ~ExactIfPresentFilter() override = default;
+    bool accepts(const QString& value) override;
+   private:
+    QString pattern;
+};
+
 class RegexpFilter: public Filter
 {
 public:
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 31d6f9ab..bab5b835 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -35,15 +35,16 @@ class InstallLoaderPage : public VersionSelectWidget, public BasePage {
     InstallLoaderPage(const QString& id,
                       const QString& icon,
                       const QString& name,
-                      // "lightweight" loaders are independent to any game version
-                      const bool lightweight,
+                      const Version& oldestVersion,
                       const std::shared_ptr<PackProfile> profile)
         : VersionSelectWidget(nullptr), uid(id), iconName(icon), name(name)
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
         setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
-        if (!lightweight)
-            setExactFilter(BaseVersionList::ParentVersionRole, minecraftVersion);
+        setExactIfPresentFilter(BaseVersionList::ParentVersionRole, minecraftVersion);
+
+        if (oldestVersion != Version() && Version(minecraftVersion) < oldestVersion)
+            setExactFilter(BaseVersionList::ParentVersionRole, "AAA");
 
         if (const QString currentVersion = profile->getComponentVersion(id); !currentVersion.isNull())
             setCurrentVersion(currentVersion);
@@ -129,13 +130,13 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, c
 QList<BasePage*> InstallLoaderDialog::getPages()
 {
     return { // Forge
-             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), false, profile),
+             new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), {}, profile),
              // Fabric
-             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), true, profile),
+             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), Version("1.14"), profile),
              // Quilt
-             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), true, profile),
+             new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), Version("1.14"), profile),
              // LiteLoader
-             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), false, profile)
+             new InstallLoaderPage("com.mumfrey.liteloader", "liteloader", tr("LiteLoader"), {}, profile)
     };
 }
 
diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp
index e45787e4..9fa3c90f 100644
--- a/launcher/ui/dialogs/VersionSelectDialog.cpp
+++ b/launcher/ui/dialogs/VersionSelectDialog.cpp
@@ -152,6 +152,10 @@ void VersionSelectDialog::setExactFilter(BaseVersionList::ModelRoles role, QStri
     m_versionWidget->setExactFilter(role, filter);
 }
 
+void VersionSelectDialog::setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter) {
+    m_versionWidget->setExactIfPresentFilter(role, filter);
+}
+
 void VersionSelectDialog::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter)
 {
     m_versionWidget->setFuzzyFilter(role, filter);
diff --git a/launcher/ui/dialogs/VersionSelectDialog.h b/launcher/ui/dialogs/VersionSelectDialog.h
index 18a50cdb..c20a9ed5 100644
--- a/launcher/ui/dialogs/VersionSelectDialog.h
+++ b/launcher/ui/dialogs/VersionSelectDialog.h
@@ -49,6 +49,7 @@ public:
     void setCurrentVersion(const QString & version);
     void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
     void setExactFilter(BaseVersionList::ModelRoles role, QString filter);
+    void setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter);
     void setEmptyString(QString emptyString);
     void setEmptyErrorString(QString emptyErrorString);
     void setResizeOn(int column);
diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp
index 31e0b9b3..a8e6e948 100644
--- a/launcher/ui/pages/instance/VersionPage.cpp
+++ b/launcher/ui/pages/instance/VersionPage.cpp
@@ -434,22 +434,14 @@ void VersionPage::on_actionChange_version_triggered()
     }
     auto uid = list->uid();
 
-    // FIXME: this is still a horrible HACK.
-    if (uid == "net.minecraftforge" || uid == "com.mumfrey.liteloader" || uid == "net.fabricmc.fabric-loader" ||
-        uid == "org.quiltmc.quilt-loader") {
-        InstallLoaderDialog dialog(m_inst->getPackProfile(), uid, this);
-        dialog.exec();
-        m_container->refreshContainer();
-        return;
-    }
-
     VersionSelectDialog vselect(list.get(), tr("Change %1 version").arg(name), this);
     if (uid == "net.fabricmc.intermediary" || uid == "org.quiltmc.hashed")
     {
         vselect.setEmptyString(tr("No intermediary mappings versions are currently available."));
         vselect.setEmptyErrorString(tr("Couldn't load or download the intermediary mappings version lists!"));
-        vselect.setExactFilter(BaseVersionList::ParentVersionRole, m_profile->getComponentVersion("net.minecraft"));
     }
+    vselect.setExactIfPresentFilter(BaseVersionList::ParentVersionRole, m_profile->getComponentVersion("net.minecraft"));
+
     auto currentVersion = patch->getVersion();
     if(!currentVersion.isEmpty())
     {
diff --git a/launcher/ui/widgets/VersionSelectWidget.cpp b/launcher/ui/widgets/VersionSelectWidget.cpp
index f20dad71..2b22a4a9 100644
--- a/launcher/ui/widgets/VersionSelectWidget.cpp
+++ b/launcher/ui/widgets/VersionSelectWidget.cpp
@@ -238,14 +238,19 @@ BaseVersion::Ptr VersionSelectWidget::selectedVersion() const
     return variant.value<BaseVersion::Ptr>();
 }
 
+void VersionSelectWidget::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter)
+{
+    m_proxyModel->setFilter(role, new ContainsFilter(filter));
+}
+
 void VersionSelectWidget::setExactFilter(BaseVersionList::ModelRoles role, QString filter)
 {
     m_proxyModel->setFilter(role, new ExactFilter(filter));
 }
 
-void VersionSelectWidget::setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter)
+void VersionSelectWidget::setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter)
 {
-    m_proxyModel->setFilter(role, new ContainsFilter(filter));
+    m_proxyModel->setFilter(role, new ExactIfPresentFilter(filter));
 }
 
 void VersionSelectWidget::setFilter(BaseVersionList::ModelRoles role, Filter *filter)
diff --git a/launcher/ui/widgets/VersionSelectWidget.h b/launcher/ui/widgets/VersionSelectWidget.h
index 624d9a23..598e1059 100644
--- a/launcher/ui/widgets/VersionSelectWidget.h
+++ b/launcher/ui/widgets/VersionSelectWidget.h
@@ -70,6 +70,7 @@ public:
     void setCurrentVersion(const QString & version);
     void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter);
     void setExactFilter(BaseVersionList::ModelRoles role, QString filter);
+    void setExactIfPresentFilter(BaseVersionList::ModelRoles role, QString filter);
     void setFilter(BaseVersionList::ModelRoles role, Filter *filter);
     void setEmptyString(QString emptyString);
     void setEmptyErrorString(QString emptyErrorString);
-- 
cgit 


From 40c614b3a579dd7435f917cf60289712190a379b Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Wed, 2 Aug 2023 20:23:09 +0100
Subject: Pressed -> Clicked (doh)

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index bab5b835..0b65882e 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -98,7 +98,7 @@ InstallLoaderDialog::InstallLoaderDialog(std::shared_ptr<PackProfile> profile, c
     auto buttonLayout = new QHBoxLayout(this);
 
     auto refreshButton = new QPushButton(tr("&Refresh"), this);
-    connect(refreshButton, &QPushButton::pressed, this, [this] { pageCast(container->selectedPage())->loadList(); });
+    connect(refreshButton, &QPushButton::clicked, this, [this] { pageCast(container->selectedPage())->loadList(); });
     buttonLayout->addWidget(refreshButton);
 
     buttons->setOrientation(Qt::Horizontal);
-- 
cgit 


From 1bafa36c17604f6faa23f25b9ab61a46ed0de753 Mon Sep 17 00:00:00 2001
From: TheKodeToad <TheKodeToad@proton.me>
Date: Wed, 2 Aug 2023 20:32:23 +0100
Subject: icon -> iconName

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
---
 launcher/ui/dialogs/InstallLoaderDialog.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 0b65882e..6302cadb 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -33,11 +33,11 @@
 class InstallLoaderPage : public VersionSelectWidget, public BasePage {
    public:
     InstallLoaderPage(const QString& id,
-                      const QString& icon,
+                      const QString& iconName,
                       const QString& name,
                       const Version& oldestVersion,
                       const std::shared_ptr<PackProfile> profile)
-        : VersionSelectWidget(nullptr), uid(id), iconName(icon), name(name)
+        : VersionSelectWidget(nullptr), uid(id), iconName(iconName), name(name)
     {
         const QString minecraftVersion = profile->getComponentVersion("net.minecraft");
         setEmptyString(tr("No versions are currently available for Minecraft %1").arg(minecraftVersion));
-- 
cgit 


From 99fd1e622c4ab0218c206abed5876dbb273f5110 Mon Sep 17 00:00:00 2001
From: Sefa Eyeoglu <contact@scrumplex.net>
Date: Sun, 6 Aug 2023 17:43:30 +0200
Subject: chore: replace fabricmc icons with SVG

Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
---
 .../multimc/128x128/instances/fabricmc.png         | Bin 4839 -> 0 bytes
 .../resources/multimc/22x22/fabricmc-small.png     | Bin 5672 -> 0 bytes
 launcher/resources/multimc/multimc.qrc             |   3 +-
 .../multimc/scalable/instances/fabricmc.svg        |  71 +++++++++++++++++++++
 launcher/ui/dialogs/InstallLoaderDialog.cpp        |   2 +-
 5 files changed, 73 insertions(+), 3 deletions(-)
 delete mode 100644 launcher/resources/multimc/128x128/instances/fabricmc.png
 delete mode 100644 launcher/resources/multimc/22x22/fabricmc-small.png
 create mode 100644 launcher/resources/multimc/scalable/instances/fabricmc.svg

(limited to 'launcher/ui/dialogs/InstallLoaderDialog.cpp')

diff --git a/launcher/resources/multimc/128x128/instances/fabricmc.png b/launcher/resources/multimc/128x128/instances/fabricmc.png
deleted file mode 100644
index c78543ae..00000000
Binary files a/launcher/resources/multimc/128x128/instances/fabricmc.png and /dev/null differ
diff --git a/launcher/resources/multimc/22x22/fabricmc-small.png b/launcher/resources/multimc/22x22/fabricmc-small.png
deleted file mode 100644
index e21ae9e8..00000000
Binary files a/launcher/resources/multimc/22x22/fabricmc-small.png and /dev/null differ
diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc
index 4a407d95..bdf3495b 100644
--- a/launcher/resources/multimc/multimc.qrc
+++ b/launcher/resources/multimc/multimc.qrc
@@ -349,9 +349,8 @@
         <file>scalable/server.svg</file>
 
         <file>scalable/instances/quiltmc.svg</file>
-        <file>22x22/fabricmc-small.png</file>
+        <file>scalable/instances/fabricmc.svg</file>
         <file>128x128/instances/forge.png</file>
-        <file>128x128/instances/fabricmc.png</file>
         <file>128x128/instances/liteloader.png</file>
     </qresource>
 </RCC>
diff --git a/launcher/resources/multimc/scalable/instances/fabricmc.svg b/launcher/resources/multimc/scalable/instances/fabricmc.svg
new file mode 100644
index 00000000..7bfc7548
--- /dev/null
+++ b/launcher/resources/multimc/scalable/instances/fabricmc.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="128"
+   height="128"
+   version="1.1"
+   viewBox="0 0 33.867 33.867"
+   xml:space="preserve"
+   id="svg252"
+   sodipodi:docname="fabricmc.svg"
+   inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"><defs
+     id="defs256" /><sodipodi:namedview
+     id="namedview254"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="2.8284271"
+     inkscape:cx="39.421203"
+     inkscape:cy="132.22897"
+     inkscape:window-width="2560"
+     inkscape:window-height="1386"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g2166" /><g
+     id="g2166"><path
+       style="fill:#38342a;fill-opacity:1;stroke-width:0;stroke-linejoin:round"
+       d="m 16.9336,2.1165994 c 0.705567,0 1.411134,0 2.116701,0 0,0.7055667 0,1.4111333 0,2.1167 0.705566,0 1.411132,0 2.116698,0 0,0.7055665 0,1.4111331 0,2.1166996 0.705567,0 1.411134,0 2.116701,0 0,0.7055667 0,1.4111333 0,2.1167 0.705567,0 1.411133,0 2.1167,0 0,0.705567 0,1.411134 0,2.116701 0.705567,0 1.411133,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 0.705567,0 1.411133,0 2.1167,0 0,1.4111 0,2.8222 0,4.2333 -0.7056,-3.3e-5 -1.4112,-6.7e-5 -2.1168,-10e-5 0,0.705567 0,1.411133 0,2.1167 -1.4111,0 -2.8222,0 -4.2333,0 0,0.705567 0,1.411133 0,2.1167 -0.705567,0 -1.411134,0 -2.116701,0 0,0.705567 0,1.411133 0,2.1167 -0.705566,0 -1.411132,0 -2.116698,0 0,0.705567 0,1.411134 0,2.116701 -0.705567,0 -1.411134,0 -2.116701,0 -3.4e-5,1.411133 -6.7e-5,2.822266 -1.01e-4,4.233399 -0.705567,0 -1.411133,0 -2.1167,0 0,0.705567 0,1.411134 0,2.116701 -1.4111,0 -2.822199,0 -4.233299,0 3.4e-5,-0.705567 6.7e-5,-1.411134 1.01e-4,-2.116701 -0.705567,0 -1.411134,0 -2.116701,0 0,-0.705567 0,-1.411134 0,-2.116701 -0.705567,0 -1.411134,0 -2.116701,0 0,-0.705566 0,-1.411132 0,-2.116698 -0.705567,0 -1.411134,0 -2.116701,0 0,-0.705567 0,-1.411134 0,-2.116701 -0.705566,0 -1.411132,0 -2.116698,0 0,-1.4111 0,-2.8222 0,-4.2333 0.705566,0 1.411132,0 2.116698,0 0,-0.705567 0,-1.411133 0,-2.1167 0.705567,0 1.411134,0 2.116701,0 0,-0.705567 0,-1.411133 0,-2.1167 0.705567,0 1.411134,0 2.116701,0 0,-0.705567 0,-1.411133 0,-2.1167 0.705567,0 1.411134,0 2.116701,0 0,-0.705567 0,-1.411133 0,-2.1167 0.705566,0 1.411132,0 2.116698,0 0,-0.705567 0,-1.411134 0,-2.116701 0.705567,0 1.411134,0 2.116701,0 -3.4e-5,-1.4110999 -6.7e-5,-2.8221997 -1.01e-4,-4.2332996 0.705567,0 1.411134,0 2.116701,0 0,-0.7055667 0,-1.4111333 0,-2.1167 z"
+       id="path1587-0" /><rect
+       x="25.400299"
+       y="14.8166"
+       width="2.1166999"
+       height="2.1166999"
+       fill="#807a6d"
+       id="rect246-7"
+       style="stroke-width:0" /><path
+       id="path1670"
+       style="fill:#dbd0b4;fill-opacity:1;stroke-width:0;stroke-linejoin:round"
+       d="m 4.233501,21.166701 2.1167,-2.117 6.09e-4,-2.1165 2.1161,-10e-5 6.09e-4,-2.1166 2.116099,-10e-5 6.09e-4,-2.1166 h 2.115899 l 2.1168,-2.117 6.72e-4,-2.1164 2.1159,-10e-5 v 2.1167 l 2.1171,10e-5 -3.97e-4,2.1166 2.1171,1e-4 v 2.1167 l 2.1167,2.11665 -11.642055,11.642008"
+       sodipodi:nodetypes="cccccccccccccccccc" /><path
+       style="fill:#dbd0b4;fill-opacity:1;stroke-width:0;stroke-linejoin:round"
+       d="m 16.9336,4.2332985 c 0.705333,-6.65e-5 1.410667,-1.329e-4 2.116,-1.994e-4 0,0.7055666 0,1.4111333 0,2.1166999 0.7058,6.67e-5 1.411599,1.333e-4 2.117399,2e-4 -2.29e-4,0.7055 -4.59e-4,1.411 -6.88e-4,2.1165 0.7058,6.63e-5 1.4116,1.327e-4 2.1174,1.99e-4 -2.29e-4,0.7055003 -4.59e-4,1.4110007 -6.88e-4,2.116501 0.705567,0 1.411133,0 2.1167,0 -0.0492,0.747877 0.09844,1.542199 -0.07194,2.26148 -0.32867,0.65734 -0.65734,1.31468 -0.98601,1.97202 -0.429296,-0.748959 -0.696496,-1.614758 -1.230307,-2.288382 -2.059217,-2.059636 -4.118734,-4.1189729 -6.178143,-6.178418 9.3e-5,-0.7055335 1.87e-4,-1.411067 2.8e-4,-2.1166005 z"
+       id="path2115" /><path
+       d="m 12.700401,25.400025 h 2.1167 v 2.1167 h -2.1167 z m 2.1167,-4.2333 v 4.2333 h 2.1167 v -2.1167 h 2.1167 v -2.1167 c -1.411133,-1.9e-5 -2.822267,1.4e-5 -4.2334,10e-5 z m 6.35,-6.35 v 2.1167 h -2.1167 v 4.2333 h 2.1167 v -2.1167 h 2.1167 v -4.2333 z m 2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z m -2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z m -2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z m -2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z"
+       fill="#bcb29c"
+       id="path238-2"
+       style="stroke-width:0"
+       sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" /><path
+       d="m 10.583601,27.516801 c 0.705567,0 1.411133,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.705567,0 -1.411133,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z"
+       fill="#9a927e"
+       id="path240-6"
+       style="stroke-width:0" /><path
+       d="m 10.583701,25.400025 c 0.705567,0 1.411133,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.705567,0 -1.411133,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z m -2.1167,-2.1167 c 0.7055667,0 1.4111333,0 2.1167,0 0,0.705567 0,1.411133 0,2.1167 -0.7055667,0 -1.4111333,0 -2.1167,0 0,-0.705567 0,-1.411133 0,-2.1167 z"
+       fill="#aea694"
+       id="path244-1"
+       style="stroke-width:0" /><path
+       d="m 10.583751,16.933325 h 2.1167 v 2.1167 h -2.1167 z m 2.1167,2.1167 v 2.1167 h 4.2333 v -2.1167 z m 4.2333,-4.2333 v 2.1167 h 4.2333 v -2.1167 z m -2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z m -2.1167,-2.1167 h 2.1167 v 2.1167 h -2.1167 z"
+       fill="#c6bca5"
+       id="path248-8"
+       style="stroke-width:0"
+       sodipodi:nodetypes="ccccccccccccccccccccccccc" /></g></svg>
diff --git a/launcher/ui/dialogs/InstallLoaderDialog.cpp b/launcher/ui/dialogs/InstallLoaderDialog.cpp
index 6302cadb..840a328f 100644
--- a/launcher/ui/dialogs/InstallLoaderDialog.cpp
+++ b/launcher/ui/dialogs/InstallLoaderDialog.cpp
@@ -132,7 +132,7 @@ QList<BasePage*> InstallLoaderDialog::getPages()
     return { // Forge
              new InstallLoaderPage("net.minecraftforge", "forge", tr("Forge"), {}, profile),
              // Fabric
-             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc-small", tr("Fabric"), Version("1.14"), profile),
+             new InstallLoaderPage("net.fabricmc.fabric-loader", "fabricmc", tr("Fabric"), Version("1.14"), profile),
              // Quilt
              new InstallLoaderPage("org.quiltmc.quilt-loader", "quiltmc", tr("Quilt"), Version("1.14"), profile),
              // LiteLoader
-- 
cgit