From 6961a39cd20a63116bb562d61472c31f28ea8738 Mon Sep 17 00:00:00 2001 From: txtsd Date: Fri, 4 Nov 2022 11:58:58 +0530 Subject: [PATCH 0001/1149] feat: Assign java max mem based on system RAM If the system has <6GB RAM, it uses (system RAM / 1.5) If the system has >=6GB, it uses 4GB Signed-off-by: txtsd --- launcher/Application.cpp | 16 +++++++++++++++- launcher/Application.h | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 5772d7cad..c3c76854c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -566,7 +566,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) // Memory m_settings->registerSetting({"MinMemAlloc", "MinMemoryAlloc"}, 512); - m_settings->registerSetting({"MaxMemAlloc", "MaxMemoryAlloc"}, 4096); + m_settings->registerSetting({"MaxMemAlloc", "MaxMemoryAlloc"}, suitableMaxMem()); m_settings->registerSetting("PermGen", 128); // Java Settings @@ -1633,3 +1633,17 @@ QString Application::getUserAgentUncached() return BuildConfig.USER_AGENT_UNCACHED; } + +int Application::suitableMaxMem() +{ + float totalRAM = (float)Sys::getSystemRam() / (float)Sys::mebibyte; + int maxMemoryAlloc; + + // If totalRAM < 6GB, use (totalRAM / 1.5), else 4GB + if (totalRAM < (4096 * 1.5)) + maxMemoryAlloc = (int) (totalRAM / 1.5); + else + maxMemoryAlloc = 4096; + + return maxMemoryAlloc; +} diff --git a/launcher/Application.h b/launcher/Application.h index 8fa0ab10e..280c842fc 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -198,6 +198,8 @@ public: void ShowGlobalSettings(class QWidget * parent, QString open_page = QString()); + int suitableMaxMem(); + signals: void updateAllowedChanged(bool status); void globalSettingsAboutToOpen(); From d87f743a2bd2fac761b94de77ed7255d7a983f03 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Tue, 18 Oct 2022 17:49:35 +0100 Subject: [PATCH 0002/1149] Add flat white icons This is mainly for dark mode users, as I think that the regular colour of the flat icons do not look good with dark mode. --- launcher/resources/flat_white/flat_white.qrc | 46 ++++++++ launcher/resources/flat_white/index.theme | 11 ++ .../resources/flat_white/scalable/about.svg | 3 + .../flat_white/scalable/accounts.svg | 3 + .../resources/flat_white/scalable/bug.svg | 3 + .../resources/flat_white/scalable/cat.svg | 3 + .../flat_white/scalable/centralmods.svg | 3 + .../flat_white/scalable/checkupdate.svg | 3 + .../resources/flat_white/scalable/copy.svg | 3 + .../flat_white/scalable/coremods.svg | 3 + .../flat_white/scalable/custom-commands.svg | 86 +++++++++++++++ .../resources/flat_white/scalable/discord.svg | 4 + .../flat_white/scalable/externaltools.svg | 3 + .../resources/flat_white/scalable/help.svg | 17 +++ .../flat_white/scalable/instance-settings.svg | 3 + .../resources/flat_white/scalable/jarmods.svg | 3 + .../resources/flat_white/scalable/java.svg | 3 + .../flat_white/scalable/language.svg | 103 ++++++++++++++++++ .../flat_white/scalable/launcher.svg | 2 + .../flat_white/scalable/loadermods.svg | 3 + .../resources/flat_white/scalable/log.svg | 3 + .../flat_white/scalable/minecraft.svg | 3 + .../resources/flat_white/scalable/multimc.svg | 3 + .../resources/flat_white/scalable/new.svg | 3 + .../resources/flat_white/scalable/news.svg | 3 + .../resources/flat_white/scalable/notes.svg | 3 + .../flat_white/scalable/packages.svg | 3 + .../resources/flat_white/scalable/patreon.svg | 3 + .../resources/flat_white/scalable/proxy.svg | 3 + .../flat_white/scalable/quickmods.svg | 3 + .../flat_white/scalable/reddit-alien.svg | 3 + .../resources/flat_white/scalable/refresh.svg | 3 + .../flat_white/scalable/resourcepacks.svg | 3 + .../scalable/screenshot-placeholder.svg | 3 + .../flat_white/scalable/screenshots.svg | 3 + .../flat_white/scalable/settings.svg | 3 + .../flat_white/scalable/shaderpacks.svg | 56 ++++++++++ .../resources/flat_white/scalable/star.svg | 3 + .../flat_white/scalable/status-bad.svg | 3 + .../flat_white/scalable/status-good.svg | 3 + .../flat_white/scalable/status-running.svg | 3 + .../flat_white/scalable/status-yellow.svg | 3 + .../flat_white/scalable/viewfolder.svg | 3 + .../resources/flat_white/scalable/worlds.svg | 3 + 44 files changed, 433 insertions(+) create mode 100644 launcher/resources/flat_white/flat_white.qrc create mode 100644 launcher/resources/flat_white/index.theme create mode 100644 launcher/resources/flat_white/scalable/about.svg create mode 100644 launcher/resources/flat_white/scalable/accounts.svg create mode 100644 launcher/resources/flat_white/scalable/bug.svg create mode 100644 launcher/resources/flat_white/scalable/cat.svg create mode 100644 launcher/resources/flat_white/scalable/centralmods.svg create mode 100644 launcher/resources/flat_white/scalable/checkupdate.svg create mode 100644 launcher/resources/flat_white/scalable/copy.svg create mode 100644 launcher/resources/flat_white/scalable/coremods.svg create mode 100644 launcher/resources/flat_white/scalable/custom-commands.svg create mode 100644 launcher/resources/flat_white/scalable/discord.svg create mode 100644 launcher/resources/flat_white/scalable/externaltools.svg create mode 100644 launcher/resources/flat_white/scalable/help.svg create mode 100644 launcher/resources/flat_white/scalable/instance-settings.svg create mode 100644 launcher/resources/flat_white/scalable/jarmods.svg create mode 100644 launcher/resources/flat_white/scalable/java.svg create mode 100644 launcher/resources/flat_white/scalable/language.svg create mode 100644 launcher/resources/flat_white/scalable/launcher.svg create mode 100644 launcher/resources/flat_white/scalable/loadermods.svg create mode 100644 launcher/resources/flat_white/scalable/log.svg create mode 100644 launcher/resources/flat_white/scalable/minecraft.svg create mode 100644 launcher/resources/flat_white/scalable/multimc.svg create mode 100644 launcher/resources/flat_white/scalable/new.svg create mode 100644 launcher/resources/flat_white/scalable/news.svg create mode 100644 launcher/resources/flat_white/scalable/notes.svg create mode 100644 launcher/resources/flat_white/scalable/packages.svg create mode 100644 launcher/resources/flat_white/scalable/patreon.svg create mode 100644 launcher/resources/flat_white/scalable/proxy.svg create mode 100644 launcher/resources/flat_white/scalable/quickmods.svg create mode 100644 launcher/resources/flat_white/scalable/reddit-alien.svg create mode 100644 launcher/resources/flat_white/scalable/refresh.svg create mode 100644 launcher/resources/flat_white/scalable/resourcepacks.svg create mode 100644 launcher/resources/flat_white/scalable/screenshot-placeholder.svg create mode 100644 launcher/resources/flat_white/scalable/screenshots.svg create mode 100644 launcher/resources/flat_white/scalable/settings.svg create mode 100644 launcher/resources/flat_white/scalable/shaderpacks.svg create mode 100644 launcher/resources/flat_white/scalable/star.svg create mode 100644 launcher/resources/flat_white/scalable/status-bad.svg create mode 100644 launcher/resources/flat_white/scalable/status-good.svg create mode 100644 launcher/resources/flat_white/scalable/status-running.svg create mode 100644 launcher/resources/flat_white/scalable/status-yellow.svg create mode 100644 launcher/resources/flat_white/scalable/viewfolder.svg create mode 100644 launcher/resources/flat_white/scalable/worlds.svg diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc new file mode 100644 index 000000000..d2b752b1a --- /dev/null +++ b/launcher/resources/flat_white/flat_white.qrc @@ -0,0 +1,46 @@ + + + + index.theme + scalable/about.svg + scalable/accounts.svg + scalable/bug.svg + scalable/cat.svg + scalable/centralmods.svg + scalable/checkupdate.svg + scalable/copy.svg + scalable/coremods.svg + scalable/custom-commands.svg + scalable/discord.svg + scalable/externaltools.svg + scalable/help.svg + scalable/instance-settings.svg + scalable/jarmods.svg + scalable/java.svg + scalable/language.svg + scalable/launcher.svg + scalable/loadermods.svg + scalable/log.svg + scalable/minecraft.svg + scalable/new.svg + scalable/news.svg + scalable/notes.svg + scalable/packages.svg + scalable/proxy.svg + scalable/quickmods.svg + scalable/reddit-alien.svg + scalable/refresh.svg + scalable/resourcepacks.svg + scalable/shaderpacks.svg + scalable/screenshot-placeholder.svg + scalable/screenshots.svg + scalable/settings.svg + scalable/star.svg + scalable/status-bad.svg + scalable/status-good.svg + scalable/status-running.svg + scalable/status-yellow.svg + scalable/viewfolder.svg + scalable/worlds.svg + + diff --git a/launcher/resources/flat_white/index.theme b/launcher/resources/flat_white/index.theme new file mode 100644 index 000000000..a0b3ba6f4 --- /dev/null +++ b/launcher/resources/flat_white/index.theme @@ -0,0 +1,11 @@ +[Icon Theme] +Name=White Flat +Comment=White version of the flat icons (for dark mode) +Inherits=multimc +Directories=scalable + +[scalable] +Size=48 +Type=Scalable +MinSize=16 +MaxSize=256 diff --git a/launcher/resources/flat_white/scalable/about.svg b/launcher/resources/flat_white/scalable/about.svg new file mode 100644 index 000000000..e42ca9481 --- /dev/null +++ b/launcher/resources/flat_white/scalable/about.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/accounts.svg b/launcher/resources/flat_white/scalable/accounts.svg new file mode 100644 index 000000000..e714bde13 --- /dev/null +++ b/launcher/resources/flat_white/scalable/accounts.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/bug.svg b/launcher/resources/flat_white/scalable/bug.svg new file mode 100644 index 000000000..3122702e3 --- /dev/null +++ b/launcher/resources/flat_white/scalable/bug.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/cat.svg b/launcher/resources/flat_white/scalable/cat.svg new file mode 100644 index 000000000..18da097a7 --- /dev/null +++ b/launcher/resources/flat_white/scalable/cat.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/centralmods.svg b/launcher/resources/flat_white/scalable/centralmods.svg new file mode 100644 index 000000000..d8d10f2f5 --- /dev/null +++ b/launcher/resources/flat_white/scalable/centralmods.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/checkupdate.svg b/launcher/resources/flat_white/scalable/checkupdate.svg new file mode 100644 index 000000000..0fa66fc2f --- /dev/null +++ b/launcher/resources/flat_white/scalable/checkupdate.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/copy.svg b/launcher/resources/flat_white/scalable/copy.svg new file mode 100644 index 000000000..1aaed97b1 --- /dev/null +++ b/launcher/resources/flat_white/scalable/copy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/coremods.svg b/launcher/resources/flat_white/scalable/coremods.svg new file mode 100644 index 000000000..32c343839 --- /dev/null +++ b/launcher/resources/flat_white/scalable/coremods.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/custom-commands.svg b/launcher/resources/flat_white/scalable/custom-commands.svg new file mode 100644 index 000000000..3d67d8f10 --- /dev/null +++ b/launcher/resources/flat_white/scalable/custom-commands.svg @@ -0,0 +1,86 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/flat_white/scalable/discord.svg b/launcher/resources/flat_white/scalable/discord.svg new file mode 100644 index 000000000..ee07ed25e --- /dev/null +++ b/launcher/resources/flat_white/scalable/discord.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/externaltools.svg b/launcher/resources/flat_white/scalable/externaltools.svg new file mode 100644 index 000000000..e7c0930c9 --- /dev/null +++ b/launcher/resources/flat_white/scalable/externaltools.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/help.svg b/launcher/resources/flat_white/scalable/help.svg new file mode 100644 index 000000000..82b413fe5 --- /dev/null +++ b/launcher/resources/flat_white/scalable/help.svg @@ -0,0 +1,17 @@ + + + + diff --git a/launcher/resources/flat_white/scalable/instance-settings.svg b/launcher/resources/flat_white/scalable/instance-settings.svg new file mode 100644 index 000000000..7dac7b141 --- /dev/null +++ b/launcher/resources/flat_white/scalable/instance-settings.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/jarmods.svg b/launcher/resources/flat_white/scalable/jarmods.svg new file mode 100644 index 000000000..f0f298f32 --- /dev/null +++ b/launcher/resources/flat_white/scalable/jarmods.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/java.svg b/launcher/resources/flat_white/scalable/java.svg new file mode 100644 index 000000000..56bb481f2 --- /dev/null +++ b/launcher/resources/flat_white/scalable/java.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/language.svg b/launcher/resources/flat_white/scalable/language.svg new file mode 100644 index 000000000..18c22efb5 --- /dev/null +++ b/launcher/resources/flat_white/scalable/language.svg @@ -0,0 +1,103 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/flat_white/scalable/launcher.svg b/launcher/resources/flat_white/scalable/launcher.svg new file mode 100644 index 000000000..d7ad0dd3f --- /dev/null +++ b/launcher/resources/flat_white/scalable/launcher.svg @@ -0,0 +1,2 @@ + + diff --git a/launcher/resources/flat_white/scalable/loadermods.svg b/launcher/resources/flat_white/scalable/loadermods.svg new file mode 100644 index 000000000..100f7a93e --- /dev/null +++ b/launcher/resources/flat_white/scalable/loadermods.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/log.svg b/launcher/resources/flat_white/scalable/log.svg new file mode 100644 index 000000000..69b7c1dcc --- /dev/null +++ b/launcher/resources/flat_white/scalable/log.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/minecraft.svg b/launcher/resources/flat_white/scalable/minecraft.svg new file mode 100644 index 000000000..a0348e797 --- /dev/null +++ b/launcher/resources/flat_white/scalable/minecraft.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/multimc.svg b/launcher/resources/flat_white/scalable/multimc.svg new file mode 100644 index 000000000..3dce2699b --- /dev/null +++ b/launcher/resources/flat_white/scalable/multimc.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/new.svg b/launcher/resources/flat_white/scalable/new.svg new file mode 100644 index 000000000..46dc3361a --- /dev/null +++ b/launcher/resources/flat_white/scalable/new.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/news.svg b/launcher/resources/flat_white/scalable/news.svg new file mode 100644 index 000000000..414e54540 --- /dev/null +++ b/launcher/resources/flat_white/scalable/news.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/notes.svg b/launcher/resources/flat_white/scalable/notes.svg new file mode 100644 index 000000000..4ce5f6f19 --- /dev/null +++ b/launcher/resources/flat_white/scalable/notes.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/packages.svg b/launcher/resources/flat_white/scalable/packages.svg new file mode 100644 index 000000000..909ad0b27 --- /dev/null +++ b/launcher/resources/flat_white/scalable/packages.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/patreon.svg b/launcher/resources/flat_white/scalable/patreon.svg new file mode 100644 index 000000000..b745765b4 --- /dev/null +++ b/launcher/resources/flat_white/scalable/patreon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/proxy.svg b/launcher/resources/flat_white/scalable/proxy.svg new file mode 100644 index 000000000..a86703f45 --- /dev/null +++ b/launcher/resources/flat_white/scalable/proxy.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/quickmods.svg b/launcher/resources/flat_white/scalable/quickmods.svg new file mode 100644 index 000000000..9e0045b20 --- /dev/null +++ b/launcher/resources/flat_white/scalable/quickmods.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/reddit-alien.svg b/launcher/resources/flat_white/scalable/reddit-alien.svg new file mode 100644 index 000000000..be22148ca --- /dev/null +++ b/launcher/resources/flat_white/scalable/reddit-alien.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/refresh.svg b/launcher/resources/flat_white/scalable/refresh.svg new file mode 100644 index 000000000..08c63bdf7 --- /dev/null +++ b/launcher/resources/flat_white/scalable/refresh.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/resourcepacks.svg b/launcher/resources/flat_white/scalable/resourcepacks.svg new file mode 100644 index 000000000..9dd73c3af --- /dev/null +++ b/launcher/resources/flat_white/scalable/resourcepacks.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/screenshot-placeholder.svg b/launcher/resources/flat_white/scalable/screenshot-placeholder.svg new file mode 100644 index 000000000..41eb6fcfc --- /dev/null +++ b/launcher/resources/flat_white/scalable/screenshot-placeholder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/screenshots.svg b/launcher/resources/flat_white/scalable/screenshots.svg new file mode 100644 index 000000000..68cf89696 --- /dev/null +++ b/launcher/resources/flat_white/scalable/screenshots.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/settings.svg b/launcher/resources/flat_white/scalable/settings.svg new file mode 100644 index 000000000..7dac7b141 --- /dev/null +++ b/launcher/resources/flat_white/scalable/settings.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/shaderpacks.svg b/launcher/resources/flat_white/scalable/shaderpacks.svg new file mode 100644 index 000000000..ccae221c1 --- /dev/null +++ b/launcher/resources/flat_white/scalable/shaderpacks.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + diff --git a/launcher/resources/flat_white/scalable/star.svg b/launcher/resources/flat_white/scalable/star.svg new file mode 100644 index 000000000..116f952eb --- /dev/null +++ b/launcher/resources/flat_white/scalable/star.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/status-bad.svg b/launcher/resources/flat_white/scalable/status-bad.svg new file mode 100644 index 000000000..5a121c09c --- /dev/null +++ b/launcher/resources/flat_white/scalable/status-bad.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/status-good.svg b/launcher/resources/flat_white/scalable/status-good.svg new file mode 100644 index 000000000..ccb732ab8 --- /dev/null +++ b/launcher/resources/flat_white/scalable/status-good.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/status-running.svg b/launcher/resources/flat_white/scalable/status-running.svg new file mode 100644 index 000000000..aa2d5fbff --- /dev/null +++ b/launcher/resources/flat_white/scalable/status-running.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/status-yellow.svg b/launcher/resources/flat_white/scalable/status-yellow.svg new file mode 100644 index 000000000..772699d32 --- /dev/null +++ b/launcher/resources/flat_white/scalable/status-yellow.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/viewfolder.svg b/launcher/resources/flat_white/scalable/viewfolder.svg new file mode 100644 index 000000000..145f86248 --- /dev/null +++ b/launcher/resources/flat_white/scalable/viewfolder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/worlds.svg b/launcher/resources/flat_white/scalable/worlds.svg new file mode 100644 index 000000000..cea30cf81 --- /dev/null +++ b/launcher/resources/flat_white/scalable/worlds.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 92dfd659f1a3e11accdbf0ebbdc7cb91f74d9a21 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Tue, 18 Oct 2022 17:54:26 +0100 Subject: [PATCH 0003/1149] Fix .QRC file for flat white icons --- launcher/resources/flat_white/flat_white.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index d2b752b1a..feda4762e 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -1,6 +1,6 @@ - + index.theme scalable/about.svg scalable/accounts.svg From 7eecf454e83314cd6f8029f54678dea568d41843 Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 21 Oct 2022 14:07:43 -0300 Subject: [PATCH 0004/1149] fix: remove max height logic for mod update changelogs It's not worth it to keep this, it's just a heuristic that fails from time to time. Signed-off-by: flow --- launcher/ui/dialogs/ModUpdateDialog.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index 4171586e9..cedd4a96e 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -366,33 +366,28 @@ void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info) auto changelog = new QTreeWidgetItem(changelog_item); auto changelog_area = new QTextBrowser(); + QString text = info.changelog; switch (info.provider) { case ModPlatform::Provider::MODRINTH: { HoeDown h; // HoeDown bug?: \n aren't converted to
- auto text = h.process(info.changelog.toUtf8()); + text = h.process(info.changelog.toUtf8()); // Don't convert if there's an HTML tag right after (Qt rendering weirdness) text.remove(QRegularExpression("(\n+)(?=<)")); text.replace('\n', "
"); - changelog_area->setHtml(text); break; } - case ModPlatform::Provider::FLAME: { - changelog_area->setHtml(info.changelog); + default: break; - } } + changelog_area->setHtml(text); changelog_area->setOpenExternalLinks(true); - changelog_area->setLineWrapMode(QTextBrowser::LineWrapMode::NoWrap); + changelog_area->setLineWrapMode(QTextBrowser::LineWrapMode::WidgetWidth); changelog_area->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded); - // HACK: Is there a better way of achieving this? - auto font_height = QFontMetrics(changelog_area->font()).height(); - changelog_area->setMaximumHeight((changelog_area->toPlainText().count(QRegularExpression("\n|
")) + 2) * font_height); - ui->modTreeWidget->setItemWidget(changelog, 0, changelog_area); ui->modTreeWidget->addTopLevelItem(item_top); From 1288b926153c86b7966727e60de4af8e7dcb4031 Mon Sep 17 00:00:00 2001 From: Hibi <69405847+Hibiii@users.noreply.github.com> Date: Fri, 21 Oct 2022 15:40:28 -0300 Subject: [PATCH 0005/1149] Add argument to show instance window --- launcher/Application.cpp | 14 +++++++++++++- launcher/Application.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6ffec1ae4..ace06c2c3 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -245,7 +245,8 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) {{"s", "server"}, "Join the specified server on launch (only valid in combination with --launch)", "address"}, {{"a", "profile"}, "Use the account specified by its profile name (only valid in combination with --launch)", "profile"}, {"alive", "Write a small '" + liveCheckFile + "' file after the launcher starts"}, - {{"I", "import"}, "Import instance from specified zip (local path or URL)", "file"} + {{"I", "import"}, "Import instance from specified zip (local path or URL)", "file"}, + {"show", "Opens the window for the specified instance (by instance ID)", "show"} }); parser.addHelpOption(); parser.addVersionOption(); @@ -257,6 +258,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) m_profileToUse = parser.value("profile"); m_liveCheck = parser.isSet("alive"); m_zipToImport = parser.value("import"); + m_instanceIdToShowWindowOf = parser.value("show"); // error if --launch is missing with --server or --profile if((!m_serverToJoin.isEmpty() || !m_profileToUse.isEmpty()) && m_instanceIdToLaunch.isEmpty()) @@ -986,6 +988,16 @@ void Application::performMainStartupAction() return; } } + if(!m_instanceIdToShowWindowOf.isEmpty()) + { + auto inst = instances()->getInstanceById(m_instanceIdToShowWindowOf); + if(inst) + { + qDebug() << "<> Showing window of instance " << m_instanceIdToShowWindowOf; + showInstanceWindow(inst); + return; + } + } if(!m_mainWindow) { // normal main window diff --git a/launcher/Application.h b/launcher/Application.h index 34ad8c152..c453cc28b 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -301,6 +301,7 @@ public: QString m_profileToUse; bool m_liveCheck = false; QUrl m_zipToImport; + QString m_instanceIdToShowWindowOf; std::unique_ptr logFile; }; From 5b75869c0ba60e00147d723d5633c9f6a5d6304e Mon Sep 17 00:00:00 2001 From: Hibi <69405847+Hibiii@users.noreply.github.com> Date: Fri, 21 Oct 2022 16:10:03 -0300 Subject: [PATCH 0006/1149] Add --show to manual page --- program_info/prismlauncher.6.scd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/program_info/prismlauncher.6.scd b/program_info/prismlauncher.6.scd index e3c7de860..f979e4571 100644 --- a/program_info/prismlauncher.6.scd +++ b/program_info/prismlauncher.6.scd @@ -26,6 +26,9 @@ Here are the current features of Prism Launcher. *-l, --launch*=INSTANCE_ID Launch the instance specified by INSTANCE_ID. +*--show*=INSTANCE_ID + Show the configuration window of the instance specified by INSTANCE_ID. + *--alive* Write a small 'live.check' file after Prism Launcher starts. From 82d1dbf1736bb234938db7fdb8aecbc954023989 Mon Sep 17 00:00:00 2001 From: Hibi <69405847+Hibiii@users.noreply.github.com> Date: Fri, 21 Oct 2022 17:59:35 -0300 Subject: [PATCH 0007/1149] DCO Remediation Commit for Hibi <69405847+Hibiii@users.noreply.github.com> I, Hibi <69405847+Hibiii@users.noreply.github.com>, hereby add my Signed-off-by to this commit: 1288b926153c86b7966727e60de4af8e7dcb4031 I, Hibi <69405847+Hibiii@users.noreply.github.com>, hereby add my Signed-off-by to this commit: 5b75869c0ba60e00147d723d5633c9f6a5d6304e Signed-off-by: Hibi <69405847+Hibiii@users.noreply.github.com> From a406aeb3ea8e44f2f511a0755f10d4639f8bfca2 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 22 Oct 2022 20:51:46 +0800 Subject: [PATCH 0008/1149] feat: register as zip/mrpack handler on macOS Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- cmake/MacOSXBundleInfo.plist.in | 23 +++++++++++++++++++++++ launcher/Application.cpp | 7 +++++++ 2 files changed, 30 insertions(+) diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in index 1b22e21fd..597beaa61 100644 --- a/cmake/MacOSXBundleInfo.plist.in +++ b/cmake/MacOSXBundleInfo.plist.in @@ -44,5 +44,28 @@ ${MACOSX_SPARKLE_UPDATE_PUBLIC_KEY} SUFeedURL ${MACOSX_SPARKLE_UPDATE_FEED_URL} + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + zip + mrpack + + CFBundleTypeName + Prism Launcher instance + CFBundleTypeOSTypes + + TEXT + utxt + TUTX + **** + + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6ffec1ae4..bcb3aa0d3 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -943,6 +943,13 @@ bool Application::event(QEvent* event) { emit clickedOnDock(); } m_prevAppState = ev->applicationState(); + return true; + } + + if (event->type() == QEvent::FileOpen) { + auto ev = static_cast(event); + m_mainWindow->droppedURLs({ ev->url() }); + return true; } #endif return QApplication::event(event); From 1dad35ca760662b9fc7c22cc0799403f75780bb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20M=C3=B6ritz?= Date: Sat, 22 Oct 2022 15:00:52 +0200 Subject: [PATCH 0009/1149] update macos plist contents (fixes #132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tobias Möritz --- CMakeLists.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 131d3e53c..09f62bb3c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,19 +211,19 @@ if(NOT (UNIX AND APPLE)) endif() if(UNIX AND APPLE) - set(BINARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") - set(LIBRARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") - set(PLUGIN_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") - set(FRAMEWORK_DEST_DIR "${Launcher_Name}.app/Contents/Frameworks") - set(RESOURCES_DEST_DIR "${Launcher_Name}.app/Contents/Resources") - set(JARS_DEST_DIR "${Launcher_Name}.app/Contents/MacOS/jars") + set(BINARY_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") + set(LIBRARY_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") + set(PLUGIN_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") + set(FRAMEWORK_DEST_DIR "${Launcher_DisplayName}.app/Contents/Frameworks") + set(RESOURCES_DEST_DIR "${Launcher_DisplayName}.app/Contents/Resources") + set(JARS_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS/jars") # Apps to bundle - set(APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.app") + set(APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_DisplayName}.app") # Mac bundle settings - set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_Name}") - set(MACOSX_BUNDLE_INFO_STRING "${Launcher_Name}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.") + set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_DisplayName}") + set(MACOSX_BUNDLE_INFO_STRING "${Launcher_DisplayName}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.") set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.prismlauncher.${Launcher_Name}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_NAME}") From 500a7eceabd292a7ddef5a5e2cec0fd26d66cef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20M=C3=B6ritz?= Date: Sat, 22 Oct 2022 15:10:32 +0200 Subject: [PATCH 0010/1149] update macOS build process to work with new .app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tobias Möritz --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b6400791d..f67ba4c7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -249,8 +249,8 @@ jobs: cmake --install ${{ env.BUILD_DIR }} cd ${{ env.INSTALL_DIR }} - chmod +x "PrismLauncher.app/Contents/MacOS/prismlauncher" - sudo codesign --sign - --deep --force --entitlements "../program_info/App.entitlements" --options runtime "PrismLauncher.app/Contents/MacOS/prismlauncher" + chmod +x "Prism Launcher.app/Contents/MacOS/prismlauncher" + sudo codesign --sign - --deep --force --entitlements "../program_info/App.entitlements" --options runtime "Prism Launcher.app/Contents/MacOS/prismlauncher" tar -czf ../PrismLauncher.tar.gz * - name: Make Sparkle signature (macOS) From a6e65dfc7a7e8080297b59ecf322b788d1c9bad2 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Sat, 22 Oct 2022 15:40:39 +0100 Subject: [PATCH 0011/1149] Add new flat white icons --- launcher/resources/flat_white/scalable/delete.svg | 5 +++++ launcher/resources/flat_white/scalable/export.svg | 5 +++++ launcher/resources/flat_white/scalable/rename.svg | 4 ++++ launcher/resources/flat_white/scalable/tag.svg | 4 ++++ 4 files changed, 18 insertions(+) create mode 100644 launcher/resources/flat_white/scalable/delete.svg create mode 100644 launcher/resources/flat_white/scalable/export.svg create mode 100644 launcher/resources/flat_white/scalable/rename.svg create mode 100644 launcher/resources/flat_white/scalable/tag.svg diff --git a/launcher/resources/flat_white/scalable/delete.svg b/launcher/resources/flat_white/scalable/delete.svg new file mode 100644 index 000000000..4cf7206e8 --- /dev/null +++ b/launcher/resources/flat_white/scalable/delete.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/export.svg b/launcher/resources/flat_white/scalable/export.svg new file mode 100644 index 000000000..a28bb2540 --- /dev/null +++ b/launcher/resources/flat_white/scalable/export.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/rename.svg b/launcher/resources/flat_white/scalable/rename.svg new file mode 100644 index 000000000..f2067c16b --- /dev/null +++ b/launcher/resources/flat_white/scalable/rename.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/tag.svg b/launcher/resources/flat_white/scalable/tag.svg new file mode 100644 index 000000000..2473126f6 --- /dev/null +++ b/launcher/resources/flat_white/scalable/tag.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 99e1c13e80d12764f57a993661656d9ed7de27bb Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Sat, 22 Oct 2022 15:50:06 +0100 Subject: [PATCH 0012/1149] fix: add flat_white to code --- launcher/CMakeLists.txt | 1 + launcher/main.cpp | 1 + launcher/resources/flat_white/index.theme | 2 +- launcher/ui/pages/global/LauncherPage.cpp | 13 ++++++++++--- launcher/ui/pages/global/LauncherPage.ui | 5 +++++ 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 79ac49c76..0dae47df8 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -602,6 +602,7 @@ SET(LAUNCHER_SOURCES resources/OSX/OSX.qrc resources/iOS/iOS.qrc resources/flat/flat.qrc + resources/flat_white/flat_white.qrc resources/documents/documents.qrc ../${Launcher_Branding_LogoQRC} diff --git a/launcher/main.cpp b/launcher/main.cpp index c6a7614c4..e2116f384 100644 --- a/launcher/main.cpp +++ b/launcher/main.cpp @@ -84,6 +84,7 @@ int main(int argc, char *argv[]) Q_INIT_RESOURCE(OSX); Q_INIT_RESOURCE(iOS); Q_INIT_RESOURCE(flat); + Q_INIT_RESOURCE(flat_white); return app.exec(); } case Application::Failed: diff --git a/launcher/resources/flat_white/index.theme b/launcher/resources/flat_white/index.theme index a0b3ba6f4..0292509ff 100644 --- a/launcher/resources/flat_white/index.theme +++ b/launcher/resources/flat_white/index.theme @@ -1,5 +1,5 @@ [Icon Theme] -Name=White Flat +Name=Flat (White) Comment=White version of the flat icons (for dark mode) Inherits=multimc Directories=scalable diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index b8431e8c4..536ab22e1 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -310,9 +310,12 @@ void LauncherPage::applySettings() s->set("IconTheme", "flat"); break; case 7: - s->set("IconTheme", "multimc"); + s->set("IconTheme", "flat_white"); break; case 8: + s->set("IconTheme", "multimc"); + break; + case 9: s->set("IconTheme", "custom"); break; } @@ -408,14 +411,18 @@ void LauncherPage::loadSettings() { ui->themeComboBox->setCurrentIndex(6); } - else if (theme == "multimc") + else if (theme == "flat_white") { ui->themeComboBox->setCurrentIndex(7); } - else if (theme == "custom") + else if (theme == "multimc") { ui->themeComboBox->setCurrentIndex(8); } + else if (theme == "custom") + { + ui->themeComboBox->setCurrentIndex(9); + } { auto currentTheme = s->get("ApplicationTheme").toString(); diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 0d14f147f..76a25f2ed 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -300,6 +300,11 @@ Flat + + + Flat (White) + + Legacy From 46fe7e77b3285a77ee71df5f055b927b777ca112 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Sat, 22 Oct 2022 16:14:50 +0100 Subject: [PATCH 0013/1149] DCO Remediation Commit for he3als <65787561+he3als@users.noreply.github.com> I, he3als <65787561+he3als@users.noreply.github.com>, hereby add my Signed-off-by to this commit: d87f743a2bd2fac761b94de77ed7255d7a983f03 I, he3als <65787561+he3als@users.noreply.github.com>, hereby add my Signed-off-by to this commit: 92dfd659f1a3e11accdbf0ebbdc7cb91f74d9a21 I, he3als <65787561+he3als@users.noreply.github.com>, hereby add my Signed-off-by to this commit: a6e65dfc7a7e8080297b59ecf322b788d1c9bad2 I, he3als <65787561+he3als@users.noreply.github.com>, hereby add my Signed-off-by to this commit: 99e1c13e80d12764f57a993661656d9ed7de27bb Signed-off-by: he3als <65787561+he3als@users.noreply.github.com> --- launcher/resources/flat_white/index.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/resources/flat_white/index.theme b/launcher/resources/flat_white/index.theme index 0292509ff..54dd0e102 100644 --- a/launcher/resources/flat_white/index.theme +++ b/launcher/resources/flat_white/index.theme @@ -1,6 +1,6 @@ [Icon Theme] Name=Flat (White) -Comment=White version of the flat icons (for dark mode) +Comment=White version of the flat icons (dark mode) Inherits=multimc Directories=scalable From 1a8de111a379cfb01cee820730d9729a4f40ac0d Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 22 Oct 2022 23:46:53 +0800 Subject: [PATCH 0014/1149] add linux support Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- program_info/org.prismlauncher.PrismLauncher.desktop.in | 1 + 1 file changed, 1 insertion(+) diff --git a/program_info/org.prismlauncher.PrismLauncher.desktop.in b/program_info/org.prismlauncher.PrismLauncher.desktop.in index e608f5885..f08f2ba43 100644 --- a/program_info/org.prismlauncher.PrismLauncher.desktop.in +++ b/program_info/org.prismlauncher.PrismLauncher.desktop.in @@ -10,3 +10,4 @@ Icon=org.prismlauncher.PrismLauncher Categories=Game;ActionGame;AdventureGame;Simulation; Keywords=game;minecraft;launcher;mc;multimc;polymc; StartupWMClass=PrismLauncher +MimeType=application/zip;application/x-modrinth-modpack+zip From f35a30d371c414ce5961d518510155de7a0b9835 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 22 Oct 2022 23:47:53 +0800 Subject: [PATCH 0015/1149] oops Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/Application.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index bcb3aa0d3..ae832b6bf 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -943,15 +943,14 @@ bool Application::event(QEvent* event) { emit clickedOnDock(); } m_prevAppState = ev->applicationState(); - return true; } +#endif if (event->type() == QEvent::FileOpen) { auto ev = static_cast(event); m_mainWindow->droppedURLs({ ev->url() }); - return true; } -#endif + return QApplication::event(event); } From 4777a4572267a604dc4fa8e1cd1f4bf2fc068929 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Sun, 23 Oct 2022 14:32:35 +0100 Subject: [PATCH 0016/1149] Fix new flat white icons Signed-off-by: he3als <65787561+he3als@users.noreply.github.com> --- launcher/resources/flat_white/flat_white.qrc | 6 +++++- launcher/resources/flat_white/scalable/delete.svg | 2 +- launcher/resources/flat_white/scalable/tag.svg | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index feda4762e..4243760b4 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -41,6 +41,10 @@ scalable/status-running.svg scalable/status-yellow.svg scalable/viewfolder.svg - scalable/worlds.svg + scalable/worlds.svg + scalable/delete.svg + scalable/export.svg + scalable/rename.svg + scalable/tag.svg
diff --git a/launcher/resources/flat_white/scalable/delete.svg b/launcher/resources/flat_white/scalable/delete.svg index 4cf7206e8..3365a96f8 100644 --- a/launcher/resources/flat_white/scalable/delete.svg +++ b/launcher/resources/flat_white/scalable/delete.svg @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/launcher/resources/flat_white/scalable/tag.svg b/launcher/resources/flat_white/scalable/tag.svg index 2473126f6..f91fb0b42 100644 --- a/launcher/resources/flat_white/scalable/tag.svg +++ b/launcher/resources/flat_white/scalable/tag.svg @@ -1,4 +1,4 @@ - + \ No newline at end of file From 0aac85dda145603434e64bf04f39823f44509605 Mon Sep 17 00:00:00 2001 From: he3als <65787561+he3als@users.noreply.github.com> Date: Sun, 23 Oct 2022 14:35:33 +0100 Subject: [PATCH 0017/1149] Replace tab with spaces in flat_white.qrc Signed-off-by: he3als <65787561+he3als@users.noreply.github.com> --- launcher/resources/flat_white/flat_white.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index 4243760b4..9df690600 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -42,7 +42,7 @@ scalable/status-yellow.svg scalable/viewfolder.svg scalable/worlds.svg - scalable/delete.svg + scalable/delete.svg scalable/export.svg scalable/rename.svg scalable/tag.svg From d5109f024b7bde5862a60b7359d815dc3d138663 Mon Sep 17 00:00:00 2001 From: Trisave <42098407+Protrikk@users.noreply.github.com> Date: Sun, 23 Oct 2022 20:32:04 +0200 Subject: [PATCH 0018/1149] Better dark theme selection contrast Tweak background of the selection background in order to make text more readable Signed-off-by: Trisave <42098407+Protrikk@users.noreply.github.com> --- launcher/ui/themes/DarkTheme.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/themes/DarkTheme.cpp b/launcher/ui/themes/DarkTheme.cpp index 07a2efd2d..48231b53e 100644 --- a/launcher/ui/themes/DarkTheme.cpp +++ b/launcher/ui/themes/DarkTheme.cpp @@ -31,7 +31,7 @@ QPalette DarkTheme::colorScheme() darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(47,163,198)); - darkPalette.setColor(QPalette::Highlight, QColor(145,205,92)); + darkPalette.setColor(QPalette::Highlight, QColor(150,219,89)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); darkPalette.setColor(QPalette::PlaceholderText, Qt::darkGray); return fadeInactive(darkPalette, fadeAmount(), fadeColor()); From 43bf601f120c9b1eac1c73feb31c67df54955b6d Mon Sep 17 00:00:00 2001 From: leo78913 Date: Sun, 23 Oct 2022 11:34:49 -0300 Subject: [PATCH 0019/1149] add icons to the instance toolbar Signed-off-by: leo78913 --- launcher/resources/OSX/OSX.qrc | 1 + launcher/resources/OSX/scalable/launch.svg | 33 +++++++++++++++++++ launcher/resources/flat/flat.qrc | 1 + launcher/resources/flat/scalable/launch.svg | 16 +++++++++ launcher/resources/iOS/iOS.qrc | 1 + launcher/resources/iOS/scalable/launch.svg | 17 ++++++++++ launcher/resources/pe_blue/pe_blue.qrc | 1 + .../resources/pe_blue/scalable/launch.svg | 20 +++++++++++ launcher/resources/pe_colored/pe_colored.qrc | 1 + .../resources/pe_colored/scalable/launch.svg | 23 +++++++++++++ launcher/resources/pe_dark/pe_dark.qrc | 1 + .../resources/pe_dark/scalable/launch.svg | 17 ++++++++++ launcher/resources/pe_light/pe_light.qrc | 1 + .../resources/pe_light/scalable/launch.svg | 17 ++++++++++ launcher/ui/MainWindow.cpp | 17 ++++++++-- 15 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 launcher/resources/OSX/scalable/launch.svg create mode 100644 launcher/resources/flat/scalable/launch.svg create mode 100644 launcher/resources/iOS/scalable/launch.svg create mode 100644 launcher/resources/pe_blue/scalable/launch.svg create mode 100644 launcher/resources/pe_colored/scalable/launch.svg create mode 100644 launcher/resources/pe_dark/scalable/launch.svg create mode 100644 launcher/resources/pe_light/scalable/launch.svg diff --git a/launcher/resources/OSX/OSX.qrc b/launcher/resources/OSX/OSX.qrc index 55be28b5f..19fe312b6 100644 --- a/launcher/resources/OSX/OSX.qrc +++ b/launcher/resources/OSX/OSX.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/OSX/scalable/launch.svg b/launcher/resources/OSX/scalable/launch.svg new file mode 100644 index 000000000..fb1891625 --- /dev/null +++ b/launcher/resources/OSX/scalable/launch.svg @@ -0,0 +1,33 @@ + + + + diff --git a/launcher/resources/flat/flat.qrc b/launcher/resources/flat/flat.qrc index 7f59da7b8..508e0a9f5 100644 --- a/launcher/resources/flat/flat.qrc +++ b/launcher/resources/flat/flat.qrc @@ -46,5 +46,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/flat/scalable/launch.svg b/launcher/resources/flat/scalable/launch.svg new file mode 100644 index 000000000..b462f2e45 --- /dev/null +++ b/launcher/resources/flat/scalable/launch.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/launcher/resources/iOS/iOS.qrc b/launcher/resources/iOS/iOS.qrc index 1d7520420..aa08d811a 100644 --- a/launcher/resources/iOS/iOS.qrc +++ b/launcher/resources/iOS/iOS.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/iOS/scalable/launch.svg b/launcher/resources/iOS/scalable/launch.svg new file mode 100644 index 000000000..c16d5c37c --- /dev/null +++ b/launcher/resources/iOS/scalable/launch.svg @@ -0,0 +1,17 @@ + + + + diff --git a/launcher/resources/pe_blue/pe_blue.qrc b/launcher/resources/pe_blue/pe_blue.qrc index 3d3857133..3121ffe6b 100644 --- a/launcher/resources/pe_blue/pe_blue.qrc +++ b/launcher/resources/pe_blue/pe_blue.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/pe_blue/scalable/launch.svg b/launcher/resources/pe_blue/scalable/launch.svg new file mode 100644 index 000000000..b3bd124f4 --- /dev/null +++ b/launcher/resources/pe_blue/scalable/launch.svg @@ -0,0 +1,20 @@ + + + + diff --git a/launcher/resources/pe_colored/pe_colored.qrc b/launcher/resources/pe_colored/pe_colored.qrc index fa6cd9cd4..ce5ad8e21 100644 --- a/launcher/resources/pe_colored/pe_colored.qrc +++ b/launcher/resources/pe_colored/pe_colored.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/pe_colored/scalable/launch.svg b/launcher/resources/pe_colored/scalable/launch.svg new file mode 100644 index 000000000..76713387d --- /dev/null +++ b/launcher/resources/pe_colored/scalable/launch.svg @@ -0,0 +1,23 @@ + + + + diff --git a/launcher/resources/pe_dark/pe_dark.qrc b/launcher/resources/pe_dark/pe_dark.qrc index 6b9c7cb60..156d8f8b4 100644 --- a/launcher/resources/pe_dark/pe_dark.qrc +++ b/launcher/resources/pe_dark/pe_dark.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/pe_dark/scalable/launch.svg b/launcher/resources/pe_dark/scalable/launch.svg new file mode 100644 index 000000000..3746e2dd6 --- /dev/null +++ b/launcher/resources/pe_dark/scalable/launch.svg @@ -0,0 +1,17 @@ + + + + diff --git a/launcher/resources/pe_light/pe_light.qrc b/launcher/resources/pe_light/pe_light.qrc index 963bfcdeb..d8e4a1bd7 100644 --- a/launcher/resources/pe_light/pe_light.qrc +++ b/launcher/resources/pe_light/pe_light.qrc @@ -38,5 +38,6 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/launch.svg diff --git a/launcher/resources/pe_light/scalable/launch.svg b/launcher/resources/pe_light/scalable/launch.svg new file mode 100644 index 000000000..6c27b7e0c --- /dev/null +++ b/launcher/resources/pe_light/scalable/launch.svg @@ -0,0 +1,17 @@ + + + + diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 97152a485..559ebc316 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -656,6 +656,7 @@ public: actionLaunchInstance->setObjectName(QStringLiteral("actionLaunchInstance")); actionLaunchInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "&Launch")); actionLaunchInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Launch the selected instance.")); + actionLaunchInstance->setIcon(APPLICATION->getThemedIcon("launch")); all_actions.append(&actionLaunchInstance); actionLaunchInstanceOffline = TranslatedAction(MainWindow); @@ -741,7 +742,9 @@ public: // See https://github.com/PolyMC/PolyMC/issues/493 connect(instanceToolBar, &QToolBar::orientationChanged, [=](Qt::Orientation){ instanceToolBar->setOrientation(Qt::Vertical); }); instanceToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); - instanceToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); + instanceToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + instanceToolBar->setIconSize(QSize(16, 16)); + instanceToolBar->setFloatable(false); instanceToolBar->setWindowTitle(QT_TRANSLATE_NOOP("MainWindow", "Instance Toolbar")); @@ -761,8 +764,18 @@ public: instanceToolBar->addAction(actionViewSelectedInstFolder); instanceToolBar->addAction(actionExportInstance); - instanceToolBar->addAction(actionDeleteInstance); instanceToolBar->addAction(actionCopyInstance); + instanceToolBar->addAction(actionDeleteInstance); + + QLayout * lay = instanceToolBar->layout(); + for(int i = 0; i < lay->count(); i++) + { + QLayoutItem * item = lay->itemAt(i); + if (item->widget()->metaObject()->className() == QString("QToolButton")) + { + item->setAlignment(Qt::AlignLeft); + } + } all_toolbars.append(&instanceToolBar); MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); From e7e56eb1e397a528df91f9ce99f738c49bde363c Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Sat, 22 Oct 2022 14:50:32 -0400 Subject: [PATCH 0020/1149] add more options to copy instance dialog - Copy game options, copy resource packs, copy shaders, copy servers, and copy mods - Also made a new InstanceCopyPrefs struct to store those options rather than passing 7 different booleans into InstanceCopyTask's constructor Signed-off-by: Marcelo Hernandez --- launcher/CMakeLists.txt | 1 + launcher/InstanceCopyPrefs.h | 18 +++++ launcher/InstanceCopyTask.cpp | 62 +++++++++++++-- launcher/InstanceCopyTask.h | 20 +++-- launcher/ui/MainWindow.cpp | 12 ++- launcher/ui/dialogs/CopyInstanceDialog.cpp | 90 ++++++++++++++++++++++ launcher/ui/dialogs/CopyInstanceDialog.h | 15 ++++ launcher/ui/dialogs/CopyInstanceDialog.ui | 58 ++++++++++++-- 8 files changed, 254 insertions(+), 22 deletions(-) create mode 100644 launcher/InstanceCopyPrefs.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 79ac49c76..77440cca9 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -31,6 +31,7 @@ set(CORE_SOURCES # Basic instance manipulation tasks (derived from InstanceTask) InstanceCreationTask.h InstanceCreationTask.cpp + InstanceCopyPrefs.h InstanceCopyTask.h InstanceCopyTask.cpp InstanceImportTask.h diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h new file mode 100644 index 000000000..ac2feab8a --- /dev/null +++ b/launcher/InstanceCopyPrefs.h @@ -0,0 +1,18 @@ +// +// Created by marcelohdez on 10/22/22. +// + +#ifndef LAUNCHER_INSTANCECOPYPREFS_H +#define LAUNCHER_INSTANCECOPYPREFS_H + +struct InstanceCopyPrefs { + bool copySaves; + bool keepPlaytime; + bool copyGameOptions; + bool copyResourcePacks; + bool copyShaderPacks; + bool copyServers; + bool copyMods; +}; + +#endif // LAUNCHER_INSTANCECOPYPREFS_H diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index b1e338844..360f6cfad 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -5,18 +5,66 @@ #include "pathmatcher/RegexpMatcher.h" #include -InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, bool copySaves, bool keepPlaytime) +InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, InstanceCopyPrefs prefs) { m_origInstance = origInstance; - m_keepPlaytime = keepPlaytime; + m_keepPlaytime = prefs.keepPlaytime; + QString filter; - if(!copySaves) + if(!prefs.copySaves) { - // FIXME: get this from the original instance type... - auto matcherReal = new RegexpMatcher("[.]?minecraft/saves"); - matcherReal->caseSensitive(false); - m_matcher.reset(matcherReal); + appendToFilter(filter, "saves"); } + + if(!prefs.copyGameOptions) { + appendToFilter(filter, "options.txt"); + } + + if(!prefs.copyResourcePacks) + { + appendToFilter(filter, "resourcepacks"); + appendToFilter(filter, "texturepacks"); + } + + if(!prefs.copyShaderPacks) + { + appendToFilter(filter, "shaderpacks"); + } + + if(!prefs.copyServers) + { + appendToFilter(filter, "servers.dat"); + appendToFilter(filter, "servers.dat_old"); + appendToFilter(filter, "server-resource-packs"); + } + + if(!prefs.copyMods) + { + appendToFilter(filter, "coremods"); + appendToFilter(filter, "mods"); + appendToFilter(filter, "config"); + } + + if (!filter.isEmpty()) + { + resetFromMatcher(filter); + } +} + +void InstanceCopyTask::appendToFilter(QString& filter, const QString &append) +{ + if (!filter.isEmpty()) + filter.append('|'); // OR regex + + filter.append("[.]?minecraft/" + append); +} + +void InstanceCopyTask::resetFromMatcher(const QString& regexp) +{ + // FIXME: get this from the original instance type... + auto matcherReal = new RegexpMatcher(regexp); + matcherReal->caseSensitive(false); + m_matcher.reset(matcherReal); } void InstanceCopyTask::executeTask() diff --git a/launcher/InstanceCopyTask.h b/launcher/InstanceCopyTask.h index 829017326..d66bec55b 100644 --- a/launcher/InstanceCopyTask.h +++ b/launcher/InstanceCopyTask.h @@ -1,20 +1,21 @@ #pragma once -#include "tasks/Task.h" -#include "net/NetJob.h" -#include #include #include -#include "settings/SettingsObject.h" -#include "BaseVersion.h" +#include #include "BaseInstance.h" +#include "BaseVersion.h" +#include "InstanceCopyPrefs.h" #include "InstanceTask.h" +#include "net/NetJob.h" +#include "settings/SettingsObject.h" +#include "tasks/Task.h" class InstanceCopyTask : public InstanceTask { Q_OBJECT public: - explicit InstanceCopyTask(InstancePtr origInstance, bool copySaves, bool keepPlaytime); + explicit InstanceCopyTask(InstancePtr origInstance, InstanceCopyPrefs prefs); protected: //! Entry point for tasks. @@ -22,7 +23,12 @@ protected: void copyFinished(); void copyAborted(); -private: /* data */ +private: + // Helper functions to avoid repeating code + static void appendToFilter(QString &filter, const QString &append); + void resetFromMatcher(const QString ®exp); + + /* data */ InstancePtr m_origInstance; QFuture m_copyFuture; QFutureWatcher m_copyFutureWatcher; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 97152a485..d51f799c6 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1616,7 +1616,17 @@ void MainWindow::on_actionCopyInstance_triggered() if (!copyInstDlg.exec()) return; - auto copyTask = new InstanceCopyTask(m_selectedInstance, copyInstDlg.shouldCopySaves(), copyInstDlg.shouldKeepPlaytime()); + auto copyTask = new InstanceCopyTask( + m_selectedInstance, + InstanceCopyPrefs { + copyInstDlg.shouldCopySaves(), + copyInstDlg.shouldKeepPlaytime(), + copyInstDlg.shouldCopyGameOptions(), + copyInstDlg.shouldCopyResourcePacks(), + copyInstDlg.shouldCopyShaderPacks(), + copyInstDlg.shouldCopyServers(), + copyInstDlg.shouldCopyMods() + }); copyTask->setName(copyInstDlg.instName()); copyTask->setGroup(copyInstDlg.instGroup()); copyTask->setIcon(copyInstDlg.iconKey()); diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 9ec341bc8..d19888edb 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -80,6 +80,11 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) ui->groupBox->lineEdit()->setPlaceholderText(tr("No group")); ui->copySavesCheckbox->setChecked(m_copySaves); ui->keepPlaytimeCheckbox->setChecked(m_keepPlaytime); + ui->copyGameOptionsCheckbox->setChecked(m_copyGameOptions); + ui->copyResPacksCheckbox->setChecked(m_copyResourcePacks); + ui->copyShaderPacksCheckbox->setChecked(m_copyShaderPacks); + ui->copyServersCheckbox->setChecked(m_copyServers); + ui->copyModsCheckbox->setChecked(m_copyMods); } CopyInstanceDialog::~CopyInstanceDialog() @@ -168,3 +173,88 @@ void CopyInstanceDialog::on_keepPlaytimeCheckbox_stateChanged(int state) m_keepPlaytime = true; } } + +bool CopyInstanceDialog::shouldCopyGameOptions() const +{ + return m_copyGameOptions; +} + +void CopyInstanceDialog::on_copyGameOptionsCheckbox_stateChanged(int state) +{ + if(state == Qt::Unchecked) + { + m_copyGameOptions = false; + } + else if(state == Qt::Checked) + { + m_copyGameOptions = true; + } +} + +bool CopyInstanceDialog::shouldCopyResourcePacks() const +{ + return m_copyResourcePacks; +} + +void CopyInstanceDialog::on_copyResPacksCheckbox_stateChanged(int state) +{ + if(state == Qt::Unchecked) + { + m_copyResourcePacks = false; + } + else if(state == Qt::Checked) + { + m_copyResourcePacks = true; + } +} + +bool CopyInstanceDialog::shouldCopyShaderPacks() const +{ + return m_copyShaderPacks; +} + +void CopyInstanceDialog::on_copyShaderPacksCheckbox_stateChanged(int state) +{ + if(state == Qt::Unchecked) + { + m_copyShaderPacks = false; + } + else if(state == Qt::Checked) + { + m_copyShaderPacks = true; + } +} + +bool CopyInstanceDialog::shouldCopyServers() const +{ + return m_copyServers; +} + +void CopyInstanceDialog::on_copyServersCheckbox_stateChanged(int state) +{ + if(state == Qt::Unchecked) + { + m_copyServers = false; + } + else if(state == Qt::Checked) + { + m_copyServers = true; + } +} + +bool CopyInstanceDialog::shouldCopyMods() const +{ + return m_copyMods; +} + +void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) +{ + if(state == Qt::Unchecked) + { + m_copyMods = false; + } + else if(state == Qt::Checked) + { + m_copyMods = true; + } +} diff --git a/launcher/ui/dialogs/CopyInstanceDialog.h b/launcher/ui/dialogs/CopyInstanceDialog.h index bf3cd920b..e4c70494f 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.h +++ b/launcher/ui/dialogs/CopyInstanceDialog.h @@ -41,6 +41,11 @@ public: QString iconKey() const; bool shouldCopySaves() const; bool shouldKeepPlaytime() const; + bool shouldCopyGameOptions() const; + bool shouldCopyResourcePacks() const; + bool shouldCopyShaderPacks() const; + bool shouldCopyServers() const; + bool shouldCopyMods() const; private slots: @@ -48,6 +53,11 @@ slots: void on_instNameTextBox_textChanged(const QString &arg1); void on_copySavesCheckbox_stateChanged(int state); void on_keepPlaytimeCheckbox_stateChanged(int state); + void on_copyGameOptionsCheckbox_stateChanged(int state); + void on_copyResPacksCheckbox_stateChanged(int state); + void on_copyShaderPacksCheckbox_stateChanged(int state); + void on_copyServersCheckbox_stateChanged(int state); + void on_copyModsCheckbox_stateChanged(int state); private: Ui::CopyInstanceDialog *ui; @@ -55,4 +65,9 @@ private: InstancePtr m_original; bool m_copySaves = true; bool m_keepPlaytime = true; + bool m_copyGameOptions = true; + bool m_copyResourcePacks = true; + bool m_copyShaderPacks = true; + bool m_copyServers = true; + bool m_copyMods = true; }; diff --git a/launcher/ui/dialogs/CopyInstanceDialog.ui b/launcher/ui/dialogs/CopyInstanceDialog.ui index f4b191e27..e89439e6b 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.ui +++ b/launcher/ui/dialogs/CopyInstanceDialog.ui @@ -9,8 +9,8 @@ 0 0 - 345 - 323 + 265 + 425 @@ -33,7 +33,7 @@ - 40 + 60 20 @@ -123,6 +123,50 @@ + + + + Copy the in-game options like FOV, max framerate, etc. + + + Copy game options + + + + + + + true + + + Copy resource packs + + + + + + + Copy shader packs + + + + + + + Copy servers + + + + + + + Disabling this will still keep the mod loader (ex: Fabric, Quilt, etc.) but erase the mods folder and their configs. + + + Copy mods + + + @@ -153,8 +197,8 @@ accept() - 248 - 254 + 254 + 316 157 @@ -169,8 +213,8 @@ reject() - 316 - 260 + 322 + 316 286 From 15593b5c0912b4fe5ad77d6a27e336e9b68ed861 Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Sat, 22 Oct 2022 23:04:36 -0400 Subject: [PATCH 0021/1149] Add "Select all" checkbox + ui revamp + code cleanup Signed-off-by: Marcelo Hernandez --- launcher/CMakeLists.txt | 1 + launcher/InstanceCopyPrefs.cpp | 15 +++ launcher/InstanceCopyPrefs.h | 3 + launcher/InstanceCopyTask.cpp | 4 +- launcher/InstanceCopyTask.h | 2 +- launcher/ui/MainWindow.cpp | 12 +- launcher/ui/dialogs/CopyInstanceDialog.cpp | 102 ++++++++-------- launcher/ui/dialogs/CopyInstanceDialog.h | 22 ++-- launcher/ui/dialogs/CopyInstanceDialog.ui | 136 +++++++++++---------- 9 files changed, 153 insertions(+), 144 deletions(-) create mode 100644 launcher/InstanceCopyPrefs.cpp diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 77440cca9..7dc060fb4 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -32,6 +32,7 @@ set(CORE_SOURCES InstanceCreationTask.h InstanceCreationTask.cpp InstanceCopyPrefs.h + InstanceCopyPrefs.cpp InstanceCopyTask.h InstanceCopyTask.cpp InstanceImportTask.h diff --git a/launcher/InstanceCopyPrefs.cpp b/launcher/InstanceCopyPrefs.cpp new file mode 100644 index 000000000..56b43a03e --- /dev/null +++ b/launcher/InstanceCopyPrefs.cpp @@ -0,0 +1,15 @@ +// +// Created by marcelohdez on 10/22/22. +// + +#include "InstanceCopyPrefs.h" + +InstanceCopyPrefs::InstanceCopyPrefs(bool setAll) + : copySaves(setAll), + keepPlaytime(setAll), + copyGameOptions(setAll), + copyResourcePacks(setAll), + copyShaderPacks(setAll), + copyServers(setAll), + copyMods(setAll) +{} diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h index ac2feab8a..d360a8a73 100644 --- a/launcher/InstanceCopyPrefs.h +++ b/launcher/InstanceCopyPrefs.h @@ -6,6 +6,9 @@ #define LAUNCHER_INSTANCECOPYPREFS_H struct InstanceCopyPrefs { + explicit InstanceCopyPrefs(bool setAll); + ~InstanceCopyPrefs() = default; + bool copySaves; bool keepPlaytime; bool copyGameOptions; diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index 360f6cfad..e0f682244 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -5,7 +5,7 @@ #include "pathmatcher/RegexpMatcher.h" #include -InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, InstanceCopyPrefs prefs) +InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, const InstanceCopyPrefs& prefs) { m_origInstance = origInstance; m_keepPlaytime = prefs.keepPlaytime; @@ -51,7 +51,7 @@ InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, InstanceCopyPrefs p } } -void InstanceCopyTask::appendToFilter(QString& filter, const QString &append) +void InstanceCopyTask::appendToFilter(QString& filter, const QString& append) { if (!filter.isEmpty()) filter.append('|'); // OR regex diff --git a/launcher/InstanceCopyTask.h b/launcher/InstanceCopyTask.h index d66bec55b..4abbf6e69 100644 --- a/launcher/InstanceCopyTask.h +++ b/launcher/InstanceCopyTask.h @@ -15,7 +15,7 @@ class InstanceCopyTask : public InstanceTask { Q_OBJECT public: - explicit InstanceCopyTask(InstancePtr origInstance, InstanceCopyPrefs prefs); + explicit InstanceCopyTask(InstancePtr origInstance, const InstanceCopyPrefs& prefs); protected: //! Entry point for tasks. diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index d51f799c6..08005b86c 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1616,17 +1616,7 @@ void MainWindow::on_actionCopyInstance_triggered() if (!copyInstDlg.exec()) return; - auto copyTask = new InstanceCopyTask( - m_selectedInstance, - InstanceCopyPrefs { - copyInstDlg.shouldCopySaves(), - copyInstDlg.shouldKeepPlaytime(), - copyInstDlg.shouldCopyGameOptions(), - copyInstDlg.shouldCopyResourcePacks(), - copyInstDlg.shouldCopyShaderPacks(), - copyInstDlg.shouldCopyServers(), - copyInstDlg.shouldCopyMods() - }); + auto copyTask = new InstanceCopyTask(m_selectedInstance, copyInstDlg.getChosenOptions()); copyTask->setName(copyInstDlg.instName()); copyTask->setGroup(copyInstDlg.instGroup()); copyTask->setIcon(copyInstDlg.iconKey()); diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index d19888edb..0a23cd34f 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -78,13 +78,13 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) } ui->groupBox->setCurrentIndex(index); ui->groupBox->lineEdit()->setPlaceholderText(tr("No group")); - ui->copySavesCheckbox->setChecked(m_copySaves); - ui->keepPlaytimeCheckbox->setChecked(m_keepPlaytime); - ui->copyGameOptionsCheckbox->setChecked(m_copyGameOptions); - ui->copyResPacksCheckbox->setChecked(m_copyResourcePacks); - ui->copyShaderPacksCheckbox->setChecked(m_copyShaderPacks); - ui->copyServersCheckbox->setChecked(m_copyServers); - ui->copyModsCheckbox->setChecked(m_copyMods); + ui->copySavesCheckbox->setChecked(m_selectedOptions.copySaves); + ui->keepPlaytimeCheckbox->setChecked(m_selectedOptions.keepPlaytime); + ui->copyGameOptionsCheckbox->setChecked(m_selectedOptions.copyGameOptions); + ui->copyResPacksCheckbox->setChecked(m_selectedOptions.copyResourcePacks); + ui->copyShaderPacksCheckbox->setChecked(m_selectedOptions.copyShaderPacks); + ui->copyServersCheckbox->setChecked(m_selectedOptions.copyServers); + ui->copyModsCheckbox->setChecked(m_selectedOptions.copyMods); } CopyInstanceDialog::~CopyInstanceDialog() @@ -139,122 +139,118 @@ void CopyInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1) updateDialogState(); } -bool CopyInstanceDialog::shouldCopySaves() const +const InstanceCopyPrefs& CopyInstanceDialog::getChosenOptions() const { - return m_copySaves; + return m_selectedOptions; +} + +void CopyInstanceDialog::on_selectAllCheckbox_stateChanged(int state) +{ + bool checked; + if(state == Qt::Unchecked) + { + checked = false; + } + else if(state == Qt::Checked) + { + checked = true; + } + + checkAllCheckboxes(checked); +} + +void CopyInstanceDialog::checkAllCheckboxes(bool b) +{ + ui->keepPlaytimeCheckbox->setChecked(b); + ui->copySavesCheckbox->setChecked(b); + ui->copyGameOptionsCheckbox->setChecked(b); + ui->copyResPacksCheckbox->setChecked(b); + ui->copyShaderPacksCheckbox->setChecked(b); + ui->copyServersCheckbox->setChecked(b); + ui->copyModsCheckbox->setChecked(b); } void CopyInstanceDialog::on_copySavesCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copySaves = false; + m_selectedOptions.copySaves = false; } else if(state == Qt::Checked) { - m_copySaves = true; + m_selectedOptions.copySaves = true; } } -bool CopyInstanceDialog::shouldKeepPlaytime() const -{ - return m_keepPlaytime; -} - void CopyInstanceDialog::on_keepPlaytimeCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_keepPlaytime = false; + m_selectedOptions.keepPlaytime = false; } else if(state == Qt::Checked) { - m_keepPlaytime = true; + m_selectedOptions.keepPlaytime = true; } } -bool CopyInstanceDialog::shouldCopyGameOptions() const -{ - return m_copyGameOptions; -} - void CopyInstanceDialog::on_copyGameOptionsCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copyGameOptions = false; + m_selectedOptions.copyGameOptions = false; } else if(state == Qt::Checked) { - m_copyGameOptions = true; + m_selectedOptions.copyGameOptions = true; } } -bool CopyInstanceDialog::shouldCopyResourcePacks() const -{ - return m_copyResourcePacks; -} - void CopyInstanceDialog::on_copyResPacksCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copyResourcePacks = false; + m_selectedOptions.copyResourcePacks = false; } else if(state == Qt::Checked) { - m_copyResourcePacks = true; + m_selectedOptions.copyResourcePacks = true; } } -bool CopyInstanceDialog::shouldCopyShaderPacks() const -{ - return m_copyShaderPacks; -} - void CopyInstanceDialog::on_copyShaderPacksCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copyShaderPacks = false; + m_selectedOptions.copyShaderPacks = false; } else if(state == Qt::Checked) { - m_copyShaderPacks = true; + m_selectedOptions.copyShaderPacks = true; } } -bool CopyInstanceDialog::shouldCopyServers() const -{ - return m_copyServers; -} - void CopyInstanceDialog::on_copyServersCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copyServers = false; + m_selectedOptions.copyServers = false; } else if(state == Qt::Checked) { - m_copyServers = true; + m_selectedOptions.copyServers = true; } } -bool CopyInstanceDialog::shouldCopyMods() const -{ - return m_copyMods; -} - void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) { if(state == Qt::Unchecked) { - m_copyMods = false; + m_selectedOptions.copyMods = false; } else if(state == Qt::Checked) { - m_copyMods = true; + m_selectedOptions.copyMods = true; } } diff --git a/launcher/ui/dialogs/CopyInstanceDialog.h b/launcher/ui/dialogs/CopyInstanceDialog.h index e4c70494f..e57de0a1e 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.h +++ b/launcher/ui/dialogs/CopyInstanceDialog.h @@ -17,7 +17,7 @@ #include #include "BaseVersion.h" -#include +#include "InstanceCopyPrefs.h" class BaseInstance; @@ -39,18 +39,16 @@ public: QString instName() const; QString instGroup() const; QString iconKey() const; - bool shouldCopySaves() const; - bool shouldKeepPlaytime() const; - bool shouldCopyGameOptions() const; - bool shouldCopyResourcePacks() const; - bool shouldCopyShaderPacks() const; - bool shouldCopyServers() const; - bool shouldCopyMods() const; + const InstanceCopyPrefs& getChosenOptions() const; private slots: void on_iconButton_clicked(); void on_instNameTextBox_textChanged(const QString &arg1); + + // Checkbox options: + void checkAllCheckboxes(bool b); + void on_selectAllCheckbox_stateChanged(int state); void on_copySavesCheckbox_stateChanged(int state); void on_keepPlaytimeCheckbox_stateChanged(int state); void on_copyGameOptionsCheckbox_stateChanged(int state); @@ -63,11 +61,5 @@ private: Ui::CopyInstanceDialog *ui; QString InstIconKey; InstancePtr m_original; - bool m_copySaves = true; - bool m_keepPlaytime = true; - bool m_copyGameOptions = true; - bool m_copyResourcePacks = true; - bool m_copyShaderPacks = true; - bool m_copyServers = true; - bool m_copyMods = true; + InstanceCopyPrefs m_selectedOptions = InstanceCopyPrefs(true); // Default to all options as true }; diff --git a/launcher/ui/dialogs/CopyInstanceDialog.ui b/launcher/ui/dialogs/CopyInstanceDialog.ui index e89439e6b..822ed7977 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.ui +++ b/launcher/ui/dialogs/CopyInstanceDialog.ui @@ -9,8 +9,8 @@ 0 0 - 265 - 425 + 341 + 385 @@ -60,7 +60,7 @@ - 40 + 60 20 @@ -83,7 +83,10 @@ - + + + 6 + @@ -110,62 +113,73 @@ - - - Copy saves - - - - - - - Keep play time - - - - - - - Copy the in-game options like FOV, max framerate, etc. - - - Copy game options - - - - - - - true - - - Copy resource packs - - - - - - - Copy shader packs - - - - - - - Copy servers - - - - - - - Disabling this will still keep the mod loader (ex: Fabric, Quilt, etc.) but erase the mods folder and their configs. - - - Copy mods - - + + + + + Copy saves + + + + + + + true + + + Copy resource packs + + + + + + + Disabling this will still keep the mod loader (ex: Fabric, Quilt, etc.) but erase the mods folder and their configs. + + + Copy mods + + + + + + + Copy the in-game options like FOV, max framerate, etc. + + + Copy game options + + + + + + + Copy servers + + + + + + + Keep play time + + + + + + + Copy shader packs + + + + + + + Select all + + + + @@ -183,8 +197,6 @@ iconButton instNameTextBox groupBox - copySavesCheckbox - keepPlaytimeCheckbox From 4caf06bc99dfe34f10fae943374c98b88ad8814d Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Sun, 23 Oct 2022 00:25:38 -0400 Subject: [PATCH 0022/1149] Check "Select all" checkbox if all options are already selected + code cleanup Signed-off-by: Marcelo Hernandez --- launcher/InstanceCopyPrefs.cpp | 19 ++-- launcher/InstanceCopyPrefs.h | 17 ++- launcher/ui/dialogs/CopyInstanceDialog.cpp | 124 +++++++-------------- launcher/ui/dialogs/CopyInstanceDialog.h | 6 +- 4 files changed, 65 insertions(+), 101 deletions(-) diff --git a/launcher/InstanceCopyPrefs.cpp b/launcher/InstanceCopyPrefs.cpp index 56b43a03e..fad55d1e5 100644 --- a/launcher/InstanceCopyPrefs.cpp +++ b/launcher/InstanceCopyPrefs.cpp @@ -4,12 +4,13 @@ #include "InstanceCopyPrefs.h" -InstanceCopyPrefs::InstanceCopyPrefs(bool setAll) - : copySaves(setAll), - keepPlaytime(setAll), - copyGameOptions(setAll), - copyResourcePacks(setAll), - copyShaderPacks(setAll), - copyServers(setAll), - copyMods(setAll) -{} +bool InstanceCopyPrefs::allTrue() const +{ + return copySaves && + keepPlaytime && + copyGameOptions && + copyResourcePacks && + copyShaderPacks && + copyServers && + copyMods; +} diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h index d360a8a73..c5c1a7ae2 100644 --- a/launcher/InstanceCopyPrefs.h +++ b/launcher/InstanceCopyPrefs.h @@ -6,16 +6,15 @@ #define LAUNCHER_INSTANCECOPYPREFS_H struct InstanceCopyPrefs { - explicit InstanceCopyPrefs(bool setAll); - ~InstanceCopyPrefs() = default; + bool copySaves = true; + bool keepPlaytime = true; + bool copyGameOptions = true; + bool copyResourcePacks = true; + bool copyShaderPacks = true; + bool copyServers = true; + bool copyMods = true; - bool copySaves; - bool keepPlaytime; - bool copyGameOptions; - bool copyResourcePacks; - bool copyShaderPacks; - bool copyServers; - bool copyMods; + bool allTrue() const; }; #endif // LAUNCHER_INSTANCECOPYPREFS_H diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 0a23cd34f..44e70012d 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -122,6 +122,40 @@ QString CopyInstanceDialog::instGroup() const return ui->groupBox->currentText(); } +const InstanceCopyPrefs& CopyInstanceDialog::getChosenOptions() const +{ + return m_selectedOptions; +} + +void CopyInstanceDialog::checkAllCheckboxes(const bool& b) +{ + ui->keepPlaytimeCheckbox->setChecked(b); + ui->copySavesCheckbox->setChecked(b); + ui->copyGameOptionsCheckbox->setChecked(b); + ui->copyResPacksCheckbox->setChecked(b); + ui->copyShaderPacksCheckbox->setChecked(b); + ui->copyServersCheckbox->setChecked(b); + ui->copyModsCheckbox->setChecked(b); +} + +// Sets b to true if state is a checked checkbox +void CopyInstanceDialog::checkBool(bool& b, const int& state) +{ + if(state == Qt::Unchecked) + { + b = false; + } + else if(state == Qt::Checked) + { + b = true; + } + + // Have "Select all" checkbox checked if all options are already checked: + ui->selectAllCheckbox->blockSignals(true); + ui->selectAllCheckbox->setChecked(m_selectedOptions.allTrue()); + ui->selectAllCheckbox->blockSignals(false); +} + void CopyInstanceDialog::on_iconButton_clicked() { IconPickerDialog dlg(this); @@ -134,123 +168,51 @@ void CopyInstanceDialog::on_iconButton_clicked() } } + void CopyInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1) { updateDialogState(); } -const InstanceCopyPrefs& CopyInstanceDialog::getChosenOptions() const -{ - return m_selectedOptions; -} - void CopyInstanceDialog::on_selectAllCheckbox_stateChanged(int state) { bool checked; - if(state == Qt::Unchecked) - { - checked = false; - } - else if(state == Qt::Checked) - { - checked = true; - } - + checkBool(checked, state); checkAllCheckboxes(checked); } -void CopyInstanceDialog::checkAllCheckboxes(bool b) -{ - ui->keepPlaytimeCheckbox->setChecked(b); - ui->copySavesCheckbox->setChecked(b); - ui->copyGameOptionsCheckbox->setChecked(b); - ui->copyResPacksCheckbox->setChecked(b); - ui->copyShaderPacksCheckbox->setChecked(b); - ui->copyServersCheckbox->setChecked(b); - ui->copyModsCheckbox->setChecked(b); -} - void CopyInstanceDialog::on_copySavesCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copySaves = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copySaves = true; - } + checkBool(m_selectedOptions.copySaves, state); } void CopyInstanceDialog::on_keepPlaytimeCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.keepPlaytime = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.keepPlaytime = true; - } + checkBool(m_selectedOptions.keepPlaytime, state); } void CopyInstanceDialog::on_copyGameOptionsCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copyGameOptions = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copyGameOptions = true; - } + checkBool(m_selectedOptions.copyGameOptions, state); } void CopyInstanceDialog::on_copyResPacksCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copyResourcePacks = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copyResourcePacks = true; - } + checkBool(m_selectedOptions.copyResourcePacks, state); } void CopyInstanceDialog::on_copyShaderPacksCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copyShaderPacks = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copyShaderPacks = true; - } + checkBool(m_selectedOptions.copyShaderPacks, state); } void CopyInstanceDialog::on_copyServersCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copyServers = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copyServers = true; - } + checkBool(m_selectedOptions.copyServers, state); } void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) { - if(state == Qt::Unchecked) - { - m_selectedOptions.copyMods = false; - } - else if(state == Qt::Checked) - { - m_selectedOptions.copyMods = true; - } + checkBool(m_selectedOptions.copyMods, state); } diff --git a/launcher/ui/dialogs/CopyInstanceDialog.h b/launcher/ui/dialogs/CopyInstanceDialog.h index e57de0a1e..4171c440f 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.h +++ b/launcher/ui/dialogs/CopyInstanceDialog.h @@ -47,7 +47,9 @@ slots: void on_instNameTextBox_textChanged(const QString &arg1); // Checkbox options: - void checkAllCheckboxes(bool b); + void checkAllCheckboxes(const bool& b); + void checkBool(bool& b, const int& state); + void on_selectAllCheckbox_stateChanged(int state); void on_copySavesCheckbox_stateChanged(int state); void on_keepPlaytimeCheckbox_stateChanged(int state); @@ -61,5 +63,5 @@ private: Ui::CopyInstanceDialog *ui; QString InstIconKey; InstancePtr m_original; - InstanceCopyPrefs m_selectedOptions = InstanceCopyPrefs(true); // Default to all options as true + InstanceCopyPrefs m_selectedOptions; }; From 6a474a01258d375228a0883b0b5c792049ef74ef Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 20 Oct 2022 14:00:11 +0200 Subject: [PATCH 0023/1149] fix: update icon generate script Signed-off-by: Sefa Eyeoglu --- launcher/resources/OSX/scalable/launcher.svg | 14 ++- launcher/resources/flat/scalable/launcher.svg | 14 ++- launcher/resources/iOS/scalable/launcher.svg | 14 ++- .../resources/multimc/scalable/launcher.svg | 14 ++- .../resources/pe_blue/scalable/launcher.svg | 14 ++- .../pe_colored/scalable/launcher.svg | 14 ++- .../resources/pe_dark/scalable/launcher.svg | 14 ++- .../resources/pe_light/scalable/launcher.svg | 14 ++- program_info/genicons.sh | 86 ++++++++++++------ program_info/prismlauncher.ico | Bin 102134 -> 372526 bytes 10 files changed, 132 insertions(+), 66 deletions(-) diff --git a/launcher/resources/OSX/scalable/launcher.svg b/launcher/resources/OSX/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/OSX/scalable/launcher.svg +++ b/launcher/resources/OSX/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/flat/scalable/launcher.svg b/launcher/resources/flat/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/flat/scalable/launcher.svg +++ b/launcher/resources/flat/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/iOS/scalable/launcher.svg b/launcher/resources/iOS/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/iOS/scalable/launcher.svg +++ b/launcher/resources/iOS/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/launcher.svg b/launcher/resources/multimc/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/multimc/scalable/launcher.svg +++ b/launcher/resources/multimc/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_blue/scalable/launcher.svg b/launcher/resources/pe_blue/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/pe_blue/scalable/launcher.svg +++ b/launcher/resources/pe_blue/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_colored/scalable/launcher.svg b/launcher/resources/pe_colored/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/pe_colored/scalable/launcher.svg +++ b/launcher/resources/pe_colored/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_dark/scalable/launcher.svg b/launcher/resources/pe_dark/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/pe_dark/scalable/launcher.svg +++ b/launcher/resources/pe_dark/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_light/scalable/launcher.svg b/launcher/resources/pe_light/scalable/launcher.svg index 69dd84b17..aeee84338 100644 --- a/launcher/resources/pe_light/scalable/launcher.svg +++ b/launcher/resources/pe_light/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/program_info/genicons.sh b/program_info/genicons.sh index bfe756d82..42592c4ee 100755 --- a/program_info/genicons.sh +++ b/program_info/genicons.sh @@ -1,39 +1,73 @@ -#/bin/bash +#!/bin/bash -# ICO +svg2png() { + input_file="$1" + output_file="$2" + width="$3" + height="$4" -inkscape -w 16 -h 16 -o prismlauncher_16.png org.prismlauncher.PrismLauncher.svg -inkscape -w 24 -h 24 -o prismlauncher_24.png org.prismlauncher.PrismLauncher.svg -inkscape -w 32 -h 32 -o prismlauncher_32.png org.prismlauncher.PrismLauncher.svg -inkscape -w 48 -h 48 -o prismlauncher_48.png org.prismlauncher.PrismLauncher.svg -inkscape -w 64 -h 64 -o prismlauncher_64.png org.prismlauncher.PrismLauncher.svg -inkscape -w 128 -h 128 -o prismlauncher_128.png org.prismlauncher.PrismLauncher.svg + inkscape -w "$width" -h "$height" -o "$output_file" "$input_file" +} -convert prismlauncher_128.png prismlauncher_64.png prismlauncher_48.png prismlauncher_32.png prismlauncher_24.png prismlauncher_16.png prismlauncher.ico +sipsresize() { + input_file="$1" + output_file="$2" + width="$3" + height="$4" -rm -f prismlauncher_*.png + sips -z "$width" "$height" "$input_file" --out "$output_file" +} -inkscape -w 1024 -h 1024 -o prismlauncher_1024.png org.prismlauncher.PrismLauncher.bigsur.svg +if command -v "inkscape" && command -v "icotool"; then + # Windows ICO + d=$(mktemp -d) -mkdir prismlauncher.iconset + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_16.png" 16 16 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_24.png" 24 24 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_32.png" 32 32 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_48.png" 48 48 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_64.png" 64 64 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_128.png" 128 128 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_256.png" 256 256 -sips -z 16 16 prismlauncher_1024.png --out prismlauncher.iconset/icon_16x16.png -sips -z 32 32 prismlauncher_1024.png --out prismlauncher.iconset/icon_16x16@2x.png -sips -z 32 32 prismlauncher_1024.png --out prismlauncher.iconset/icon_32x32.png -sips -z 64 64 prismlauncher_1024.png --out prismlauncher.iconset/icon_32x32@2x.png -sips -z 128 128 prismlauncher_1024.png --out prismlauncher.iconset/icon_128x128.png -sips -z 256 256 prismlauncher_1024.png --out prismlauncher.iconset/icon_128x128@2x.png -sips -z 256 256 prismlauncher_1024.png --out prismlauncher.iconset/icon_256x256.png -sips -z 512 512 prismlauncher_1024.png --out prismlauncher.iconset/icon_256x256@2x.png -sips -z 512 512 prismlauncher_1024.png --out prismlauncher.iconset/icon_512x512.png -cp prismlauncher_1024.png prismlauncher.iconset/icon_512x512@2x.png + rm prismlauncher.ico && icotool -o prismlauncher.ico -c \ + "$d/prismlauncher_256.png" \ + "$d/prismlauncher_128.png" \ + "$d/prismlauncher_64.png" \ + "$d/prismlauncher_48.png" \ + "$d/prismlauncher_32.png" \ + "$d/prismlauncher_24.png" \ + "$d/prismlauncher_16.png" +else + echo "ERROR: Windows icons were NOT generated!" >&2 + echo "ERROR: requires inkscape and icotool in PATH" +fi -iconutil -c icns prismlauncher.iconset +if command -v "inkscape" && command -v "sips" && command -v "iconutil"; then + # macOS ICNS + d=$(mktemp -d) -rm -f prismlauncher_*.png -rm -rf prismlauncher.iconset + d="$d/prismlauncher.iconset" + mkdir -p "$d" + + svg2png org.prismlauncher.PrismLauncher.bigsur.svg "$d/icon_512x512@2x.png" 1024 1024 + sipsresize "$d/icon_512x512@2.png" "$d/icon_16x16.png" 16 16 + sipsresize "$d/icon_512x512@2.png" "$d/icon_16x16@2.png" 32 32 + sipsresize "$d/icon_512x512@2.png" "$d/icon_32x32.png" 32 32 + sipsresize "$d/icon_512x512@2.png" "$d/icon_32x32@2.png" 64 64 + sipsresize "$d/icon_512x512@2.png" "$d/icon_128x128.png" 128 128 + sipsresize "$d/icon_512x512@2.png" "$d/icon_128x128@2.png" 256 256 + sipsresize "$d/icon_512x512@2.png" "$d/icon_256x256.png" 256 256 + sipsresize "$d/icon_512x512@2.png" "$d/icon_256x256@2.png" 512 512 + iconutil -c icns "$d" +else + echo "ERROR: macOS icons were NOT generated!" >&2 + echo "ERROR: requires inkscape, sips and iconutil in PATH" +fi + +# replace icon in themes for dir in ../launcher/resources/*/scalable do - cp -v org.prismlauncher.PrismLauncher.svg $dir/launcher.svg + cp -v org.prismlauncher.PrismLauncher.svg "$dir/launcher.svg" done diff --git a/program_info/prismlauncher.ico b/program_info/prismlauncher.ico index e4529f93807cd8f40c25820338e2821dc35105cf..2f0fa67ff6be7681f76aa8ccbdfedabcef766b72 100644 GIT binary patch literal 372526 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 literal 102134 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 d!w-1|h6n5n3 Date: Mon, 24 Oct 2022 11:23:02 +0200 Subject: [PATCH 0024/1149] fix: use display name in NSIS Signed-off-by: Sefa Eyeoglu --- program_info/win_install.nsi.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index 1c1f29dae..0cd7ea118 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -4,7 +4,7 @@ Unicode true -Name "@Launcher_CommonName@" +Name "@Launcher_DisplayName@" InstallDir "$LOCALAPPDATA\Programs\@Launcher_CommonName@" InstallDirRegKey HKCU "Software\@Launcher_CommonName@" "InstallDir" RequestExecutionLevel user @@ -113,7 +113,7 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ ;-------------------------------- ; The stuff to install -Section "@Launcher_CommonName@" +Section "@Launcher_DisplayName@" SectionIn RO From b638a6ae950e472c6e6139cfdbaa2950e848efb0 Mon Sep 17 00:00:00 2001 From: flow Date: Mon, 24 Oct 2022 09:07:41 -0300 Subject: [PATCH 0025/1149] fix: retry mod search job after aborting it This way, we don't get stuck with an aborted job in our way! :o Signed-off-by: flow --- .../modplatform/helpers/NetworkModAPI.cpp | 1 + launcher/ui/pages/modplatform/ModModel.cpp | 25 ++++++++++++------- launcher/ui/pages/modplatform/ModModel.h | 1 + 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/launcher/modplatform/helpers/NetworkModAPI.cpp b/launcher/modplatform/helpers/NetworkModAPI.cpp index 866e7540c..7633030e1 100644 --- a/launcher/modplatform/helpers/NetworkModAPI.cpp +++ b/launcher/modplatform/helpers/NetworkModAPI.cpp @@ -15,6 +15,7 @@ void NetworkModAPI::searchMods(CallerType* caller, SearchArgs&& args) const QObject::connect(netJob, &NetJob::started, caller, [caller, netJob] { caller->setActiveJob(netJob); }); QObject::connect(netJob, &NetJob::failed, caller, &CallerType::searchRequestFailed); + QObject::connect(netJob, &NetJob::aborted, caller, &CallerType::searchRequestAborted); QObject::connect(netJob, &NetJob::succeeded, caller, [caller, response] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index 49766fa66..ed58eb32f 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -267,18 +267,25 @@ void ListModel::searchRequestFailed(QString reason) .arg(m_parent->displayName()) .arg(tr("API version too old!\nPlease update %1!").arg(BuildConfig.LAUNCHER_DISPLAYNAME))); } + + jobPtr.reset(); + searchState = Finished; +} + +void ListModel::searchRequestAborted() +{ + if (searchState != ResetRequested) + qCritical() << "Search task in ModModel aborted by an unknown reason!"; + + // Retry fetching jobPtr.reset(); - if (searchState == ResetRequested) { - beginResetModel(); - modpacks.clear(); - endResetModel(); + beginResetModel(); + modpacks.clear(); + endResetModel(); - nextSearchOffset = 0; - performPaginatedSearch(); - } else { - searchState = Finished; - } + nextSearchOffset = 0; + performPaginatedSearch(); } void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index) diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index a58c7c55b..d2636d87e 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -51,6 +51,7 @@ class ListModel : public QAbstractListModel { public slots: void searchRequestFinished(QJsonDocument& doc); void searchRequestFailed(QString reason); + void searchRequestAborted(); void infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index); From eeb95f89e1200bb23cc2559b5f298b9fdaca7e11 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Mon, 24 Oct 2022 14:40:07 +0800 Subject: [PATCH 0026/1149] add .mrpack mime type Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- program_info/modrinth-mrpack-mime.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 program_info/modrinth-mrpack-mime.xml diff --git a/program_info/modrinth-mrpack-mime.xml b/program_info/modrinth-mrpack-mime.xml new file mode 100644 index 000000000..5001e5e77 --- /dev/null +++ b/program_info/modrinth-mrpack-mime.xml @@ -0,0 +1,9 @@ + + + + Modrinth Modpack File + + + + + From a89df42561cc3089c4878c0c44353fcd1359bf53 Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez <76508651+marcelohdez@users.noreply.github.com> Date: Mon, 24 Oct 2022 19:27:21 -0400 Subject: [PATCH 0027/1149] Simplify bool check in CopyInstanceDialog.cpp Signed-off-by: Marcelo Hernandez --- launcher/ui/dialogs/CopyInstanceDialog.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 44e70012d..1b8e2aa0b 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -141,14 +141,7 @@ void CopyInstanceDialog::checkAllCheckboxes(const bool& b) // Sets b to true if state is a checked checkbox void CopyInstanceDialog::checkBool(bool& b, const int& state) { - if(state == Qt::Unchecked) - { - b = false; - } - else if(state == Qt::Checked) - { - b = true; - } + b = (state == Qt::Checked); // Have "Select all" checkbox checked if all options are already checked: ui->selectAllCheckbox->blockSignals(true); From 385c452ddffa2f40b21d7decede9f255e2b24d45 Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Mon, 24 Oct 2022 20:49:40 -0400 Subject: [PATCH 0028/1149] remove checkBool function, add updateSelectAllCheckbox function Signed-off-by: Marcelo Hernandez --- launcher/ui/dialogs/CopyInstanceDialog.cpp | 30 ++++++++++++---------- launcher/ui/dialogs/CopyInstanceDialog.h | 9 +++---- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 1b8e2aa0b..8445f0a91 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -138,12 +138,9 @@ void CopyInstanceDialog::checkAllCheckboxes(const bool& b) ui->copyModsCheckbox->setChecked(b); } -// Sets b to true if state is a checked checkbox -void CopyInstanceDialog::checkBool(bool& b, const int& state) +// Check the "Select all" checkbox checked if all options are already checked: +void CopyInstanceDialog::updateSelectAllCheckbox() { - b = (state == Qt::Checked); - - // Have "Select all" checkbox checked if all options are already checked: ui->selectAllCheckbox->blockSignals(true); ui->selectAllCheckbox->setChecked(m_selectedOptions.allTrue()); ui->selectAllCheckbox->blockSignals(false); @@ -170,42 +167,49 @@ void CopyInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1) void CopyInstanceDialog::on_selectAllCheckbox_stateChanged(int state) { bool checked; - checkBool(checked, state); + checked = (state == Qt::Checked); checkAllCheckboxes(checked); } void CopyInstanceDialog::on_copySavesCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copySaves, state); + m_selectedOptions.copySaves = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_keepPlaytimeCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.keepPlaytime, state); + m_selectedOptions.keepPlaytime = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyGameOptionsCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copyGameOptions, state); + m_selectedOptions.copyGameOptions = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyResPacksCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copyResourcePacks, state); + m_selectedOptions.copyResourcePacks = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyShaderPacksCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copyShaderPacks, state); + m_selectedOptions.copyShaderPacks = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyServersCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copyServers, state); + m_selectedOptions.copyServers = (state == Qt::Checked); + updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) { - checkBool(m_selectedOptions.copyMods, state); + m_selectedOptions.copyMods = (state == Qt::Checked); + updateSelectAllCheckbox(); } diff --git a/launcher/ui/dialogs/CopyInstanceDialog.h b/launcher/ui/dialogs/CopyInstanceDialog.h index 4171c440f..94015334e 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.h +++ b/launcher/ui/dialogs/CopyInstanceDialog.h @@ -45,11 +45,7 @@ private slots: void on_iconButton_clicked(); void on_instNameTextBox_textChanged(const QString &arg1); - - // Checkbox options: - void checkAllCheckboxes(const bool& b); - void checkBool(bool& b, const int& state); - + // Checkboxes void on_selectAllCheckbox_stateChanged(int state); void on_copySavesCheckbox_stateChanged(int state); void on_keepPlaytimeCheckbox_stateChanged(int state); @@ -60,6 +56,9 @@ slots: void on_copyModsCheckbox_stateChanged(int state); private: + void checkAllCheckboxes(const bool& b); + void updateSelectAllCheckbox(); + /* data */ Ui::CopyInstanceDialog *ui; QString InstIconKey; InstancePtr m_original; From d9463620e601aa62342cafc3fb2fbeae5f56511c Mon Sep 17 00:00:00 2001 From: tobimori Date: Tue, 25 Oct 2022 09:34:07 +0200 Subject: [PATCH 0029/1149] move .app rename to packaging process, update mac copyright string Signed-off-by: tobimori --- .github/workflows/build.yml | 5 +++-- CMakeLists.txt | 16 ++++++++-------- program_info/CMakeLists.txt | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f67ba4c7e..ac701c1e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -249,8 +249,9 @@ jobs: cmake --install ${{ env.BUILD_DIR }} cd ${{ env.INSTALL_DIR }} - chmod +x "Prism Launcher.app/Contents/MacOS/prismlauncher" - sudo codesign --sign - --deep --force --entitlements "../program_info/App.entitlements" --options runtime "Prism Launcher.app/Contents/MacOS/prismlauncher" + chmod +x "PrismLauncher.app/Contents/MacOS/prismlauncher" + sudo codesign --sign - --deep --force --entitlements "../program_info/App.entitlements" --options runtime "PrismLauncher.app/Contents/MacOS/prismlauncher" + mv "PrismLauncher.app" "Prism Launcher.app" tar -czf ../PrismLauncher.tar.gz * - name: Make Sparkle signature (macOS) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09f62bb3c..611ca1de7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,15 +211,15 @@ if(NOT (UNIX AND APPLE)) endif() if(UNIX AND APPLE) - set(BINARY_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") - set(LIBRARY_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") - set(PLUGIN_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS") - set(FRAMEWORK_DEST_DIR "${Launcher_DisplayName}.app/Contents/Frameworks") - set(RESOURCES_DEST_DIR "${Launcher_DisplayName}.app/Contents/Resources") - set(JARS_DEST_DIR "${Launcher_DisplayName}.app/Contents/MacOS/jars") + set(BINARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") + set(LIBRARY_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") + set(PLUGIN_DEST_DIR "${Launcher_Name}.app/Contents/MacOS") + set(FRAMEWORK_DEST_DIR "${Launcher_Name}.app/Contents/Frameworks") + set(RESOURCES_DEST_DIR "${Launcher_Name}.app/Contents/Resources") + set(JARS_DEST_DIR "${Launcher_Name}.app/Contents/MacOS/jars") # Apps to bundle - set(APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_DisplayName}.app") + set(APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.app") # Mac bundle settings set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_DisplayName}") @@ -229,7 +229,7 @@ if(UNIX AND APPLE) set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_ICON_FILE ${Launcher_Name}.icns) - set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2021-2022 ${Launcher_Copyright}") + set(MACOSX_BUNDLE_COPYRIGHT "© 2021-2022 ${Launcher_Copyright_Mac}") set(MACOSX_SPARKLE_UPDATE_PUBLIC_KEY "v55ZWWD6QlPoXGV6VLzOTZxZUggWeE51X8cRQyQh6vA=") set(MACOSX_SPARKLE_UPDATE_FEED_URL "https://prismlauncher.org/feed/appcast.xml") diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index f6e2ea848..61949e137 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -15,6 +15,7 @@ set(Launcher_Name "${Launcher_CommonName}" PARENT_SCOPE) set(Launcher_DisplayName "${Launcher_DisplayName}" PARENT_SCOPE) set(Launcher_Copyright "Prism Launcher Contributors\\n© 2021-2022 PolyMC Contributors \\n© 2012-2021 MultiMC Contributors") +set(Launcher_Copyright_Mac "Prism Launcher Contributors, © 2021-2022 PolyMC Contributors and © 2012-2021 MultiMC Contributors" PARENT_SCOPE) set(Launcher_Copyright "${Launcher_Copyright}" PARENT_SCOPE) set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) From 482d3a1d76e1c66e351b400c40d772be624cd9b9 Mon Sep 17 00:00:00 2001 From: tobimori Date: Tue, 25 Oct 2022 15:24:41 +0200 Subject: [PATCH 0030/1149] update macos copyright year Signed-off-by: tobimori --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 611ca1de7..d2111fe44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -229,7 +229,7 @@ if(UNIX AND APPLE) set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_ICON_FILE ${Launcher_Name}.icns) - set(MACOSX_BUNDLE_COPYRIGHT "© 2021-2022 ${Launcher_Copyright_Mac}") + set(MACOSX_BUNDLE_COPYRIGHT "© 2022 ${Launcher_Copyright_Mac}") set(MACOSX_SPARKLE_UPDATE_PUBLIC_KEY "v55ZWWD6QlPoXGV6VLzOTZxZUggWeE51X8cRQyQh6vA=") set(MACOSX_SPARKLE_UPDATE_FEED_URL "https://prismlauncher.org/feed/appcast.xml") From 610b9711178d164a41f76106968c3fb511570fd8 Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Wed, 26 Oct 2022 02:09:45 +0200 Subject: [PATCH 0031/1149] Improve a bit README.md (#305) Add Open Collective and fix some stuff. --- README.md | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d7df8e264..dc6cdbc72 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ -

+

Prism Launcher logo Prism Launcher logo

+ Prism Launcher is a custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once. This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. + ## Installation - All downloads and instructions for Prism Launcher can be found [on our website](https://prismlauncher.org/download/). @@ -16,25 +18,24 @@ This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. There are development builds available [here](https://github.com/PrismLauncher/PrismLauncher/actions). These have debug information in the binaries, so their file sizes are relatively larger. -Portable builds are provided for on Linux, Windows, and macOS. +Portable builds are provided for Linux, Windows, and macOS. + +For Arch, Debian and Gentoo, respectively, you can use these packages to get compiled development versions: + +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=appveyor)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=appveyor)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=appveyor)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=appveyor)](https://packages.gentoo.org/packages/games-action/prismlauncher) -For Debian and Arch, you can use these packages for the latest development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue)](https://aur.archlinux.org/packages/prismlauncher-git/) -[![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange)](https://mpr.makedeb.org/packages/prismlauncher-git) ## Help & Support -Feel free to create an issue if you need help. However, you might find it easier to ask in the Discord server. +Feel free to create an issue if you need help. +#### Join our Discord server: [![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner3)](https://discord.gg/prismlauncher) -We will also soon be opening up our Matrix channels. -You can already join our Matrix space: +#### Join our Matrix space: +[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge&logo=appveyor)](https://matrix.to/#/#prismlauncher:matrix.org) -[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?label=PrismLauncher%20space)](https://matrix.to/#/#prismlauncher:matrix.org) - -We also have a subreddit you can post your issues and suggestions on: - -[r/PrismLauncher](https://www.reddit.com/r/PrismLauncher/) +#### Join our SubReddit: +[![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge&logo=appveyor)](https://www.reddit.com/r/PrismLauncher/) ## Building @@ -60,13 +61,11 @@ Be aware that if you build this software without removing the provided API keys If you do not agree with these terms and conditions, then remove the associated API keys from the [CMakeLists.txt](CMakeLists.txt) file by setting them to an empty string (`""`). -## License +## Sponsors & Partners -All launcher code is available under the GPL-3.0-only license. - -The logo and related assets are under the CC BY-SA 4.0 license. +We thank all the wonderful backers over at Open Collective! Support Prism Launcher by [becoming a backer](https://opencollective.com/prismlauncher). -## Sponsors +[![OpenCollective Backers](https://opencollective.com/prismlauncher/backers.svg?width=890&limit=1000)](https://opencollective.com/prismlauncher#backers) Thanks to JetBrains for providing us a few licenses for all their products, as part of their [Open Source program](https://www.jetbrains.com/opensource/). @@ -85,3 +84,12 @@ Thanks to Netlify for providing us their excellent web services, as part of thei Thanks to the awesome people over at [MacStadium](https://www.macstadium.com/), for providing M1-Macs for development purposes! Powered by MacStadium + + +## License + +All launcher code is available under the GPL-3.0-only license. + +![https://github.com/PrismLauncher/PrismLauncher/blob/develop/LICENSE](https://img.shields.io/github/license/PrismLauncher/PrismLauncher?style=for-the-badge) + +The logo and related assets are under the CC BY-SA 4.0 license. From 63b6c6685ce53e3fac1902e0ee7a6998c5d341d0 Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Wed, 26 Oct 2022 00:20:36 -0400 Subject: [PATCH 0032/1149] Abstract away InstanceCopyPrefs' internals through new getSelectedFiltersAsRegex() function + fix typo in comment + remove unused import + add [[nodiscard]] to methods Signed-off-by: Marcelo Hernandez --- launcher/InstanceCopyPrefs.cpp | 33 ++++++++++++ launcher/InstanceCopyPrefs.h | 5 +- launcher/InstanceCopyTask.cpp | 60 +++------------------- launcher/InstanceCopyTask.h | 4 -- launcher/ui/dialogs/CopyInstanceDialog.cpp | 3 +- 5 files changed, 45 insertions(+), 60 deletions(-) diff --git a/launcher/InstanceCopyPrefs.cpp b/launcher/InstanceCopyPrefs.cpp index fad55d1e5..6432a5351 100644 --- a/launcher/InstanceCopyPrefs.cpp +++ b/launcher/InstanceCopyPrefs.cpp @@ -14,3 +14,36 @@ bool InstanceCopyPrefs::allTrue() const copyServers && copyMods; } + +// Returns a single RegEx string of the selected folders/files to filter out (ex: ".minecraft/saves|.minecraft/server.dat") +QString InstanceCopyPrefs::getSelectedFiltersAsRegex() const +{ + QStringList filters; + + if(!copySaves) + filters << "saves"; + + if(!copyGameOptions) + filters << "options.txt"; + + if(!copyResourcePacks) + filters << "resourcepacks" << "texturepacks"; + + if(!copyShaderPacks) + filters << "shaderpacks"; + + if(!copyServers) + filters << "servers.dat" << "servers.dat_old" << "server-resource-packs"; + + if(!copyMods) + filters << "coremods" << "mods" << "config"; + + // If we have any filters to add, join them as a single regex string to return: + if (!filters.isEmpty()) { + const QString MC_ROOT = "[.]?minecraft/"; + // Ensure first filter starts with root, then join other filters with OR regex before root (ex: ".minecraft/saves|.minecraft/mods"): + return MC_ROOT + filters.join("|" + MC_ROOT); + } + + return {}; +} diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h index c5c1a7ae2..432d67c40 100644 --- a/launcher/InstanceCopyPrefs.h +++ b/launcher/InstanceCopyPrefs.h @@ -5,6 +5,8 @@ #ifndef LAUNCHER_INSTANCECOPYPREFS_H #define LAUNCHER_INSTANCECOPYPREFS_H +#include + struct InstanceCopyPrefs { bool copySaves = true; bool keepPlaytime = true; @@ -14,7 +16,8 @@ struct InstanceCopyPrefs { bool copyServers = true; bool copyMods = true; - bool allTrue() const; + [[nodiscard]] bool allTrue() const; + [[nodiscard]] QString getSelectedFiltersAsRegex() const; }; #endif // LAUNCHER_INSTANCECOPYPREFS_H diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index e0f682244..7fbf86363 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -9,62 +9,16 @@ InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, const InstanceCopyP { m_origInstance = origInstance; m_keepPlaytime = prefs.keepPlaytime; - QString filter; - if(!prefs.copySaves) + QString filters = prefs.getSelectedFiltersAsRegex(); + if (!filters.isEmpty()) { - appendToFilter(filter, "saves"); + // Set regex filter: + // FIXME: get this from the original instance type... + auto matcherReal = new RegexpMatcher(filters); + matcherReal->caseSensitive(false); + m_matcher.reset(matcherReal); } - - if(!prefs.copyGameOptions) { - appendToFilter(filter, "options.txt"); - } - - if(!prefs.copyResourcePacks) - { - appendToFilter(filter, "resourcepacks"); - appendToFilter(filter, "texturepacks"); - } - - if(!prefs.copyShaderPacks) - { - appendToFilter(filter, "shaderpacks"); - } - - if(!prefs.copyServers) - { - appendToFilter(filter, "servers.dat"); - appendToFilter(filter, "servers.dat_old"); - appendToFilter(filter, "server-resource-packs"); - } - - if(!prefs.copyMods) - { - appendToFilter(filter, "coremods"); - appendToFilter(filter, "mods"); - appendToFilter(filter, "config"); - } - - if (!filter.isEmpty()) - { - resetFromMatcher(filter); - } -} - -void InstanceCopyTask::appendToFilter(QString& filter, const QString& append) -{ - if (!filter.isEmpty()) - filter.append('|'); // OR regex - - filter.append("[.]?minecraft/" + append); -} - -void InstanceCopyTask::resetFromMatcher(const QString& regexp) -{ - // FIXME: get this from the original instance type... - auto matcherReal = new RegexpMatcher(regexp); - matcherReal->caseSensitive(false); - m_matcher.reset(matcherReal); } void InstanceCopyTask::executeTask() diff --git a/launcher/InstanceCopyTask.h b/launcher/InstanceCopyTask.h index 4abbf6e69..1f29b8545 100644 --- a/launcher/InstanceCopyTask.h +++ b/launcher/InstanceCopyTask.h @@ -24,10 +24,6 @@ protected: void copyAborted(); private: - // Helper functions to avoid repeating code - static void appendToFilter(QString &filter, const QString &append); - void resetFromMatcher(const QString ®exp); - /* data */ InstancePtr m_origInstance; QFuture m_copyFuture; diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index 8445f0a91..e658f26d5 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -44,7 +44,6 @@ #include "BaseVersion.h" #include "icons/IconList.h" -#include "tasks/Task.h" #include "BaseInstance.h" #include "InstanceList.h" @@ -138,7 +137,7 @@ void CopyInstanceDialog::checkAllCheckboxes(const bool& b) ui->copyModsCheckbox->setChecked(b); } -// Check the "Select all" checkbox checked if all options are already checked: +// Check the "Select all" checkbox if all options are already selected: void CopyInstanceDialog::updateSelectAllCheckbox() { ui->selectAllCheckbox->blockSignals(true); From 2e0f8189057c2d9a3d76a9d88afe59f8daf41b08 Mon Sep 17 00:00:00 2001 From: Piper McCorkle Date: Mon, 24 Oct 2022 13:19:30 -0500 Subject: [PATCH 0033/1149] Add a snapcraft.yml for building Snaps The included snapcraft.yml can be used to build a Snap (the application format used by Canonical's modern package manager) out of Prism. If the project wants in the future, Prism can publish these Snaps to the Snap Store so the Prism Launcher can be installed through the Ubuntu Software app on vanilla Ubuntu. I haven't registered the Snap name, so it's currently free for anyone to reserve. I'd suggest that a Prism developer register the name prismlauncher at https://snapcraft.io/register-snap to ensure the name belongs to the project, even if there are no plans of setting up CI to publish snaps in the short term. I have also modified JavaUtils.cpp to be able to autodetect the Java versions included in the Snap, and added "*.snap" to the .gitignore so the compiled Snap isn't accidentally committed to the repository. Signed-off-by: Piper McCorkle --- .gitignore | 3 ++ launcher/java/JavaUtils.cpp | 25 +++++++++++------ snap/snapcraft.yaml | 55 +++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 snap/snapcraft.yaml diff --git a/.gitignore b/.gitignore index f5917a46f..b9a793d2e 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,6 @@ result/ # Flatpak .flatpak-builder flatbuild + +# Snap +*.snap \ No newline at end of file diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 6c0c60cd3..5efbc7a86 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -439,19 +439,28 @@ QList JavaUtils::FindJavaPaths() javas.append(FS::PathCombine(prefix, "bin/java")); } }; + // java installed in a snap is installed in the standard directory, but underneath $SNAP + auto snap = qEnvironmentVariable("SNAP"); + auto scanJavaDirs = [&](const QString & dirPath) + { + scanJavaDir(dirPath); + if (!snap.isNull()) { + scanJavaDir(snap + dirPath); + } + }; // oracle RPMs - scanJavaDir("/usr/java"); + scanJavaDirs("/usr/java"); // general locations used by distro packaging - scanJavaDir("/usr/lib/jvm"); - scanJavaDir("/usr/lib64/jvm"); - scanJavaDir("/usr/lib32/jvm"); + scanJavaDirs("/usr/lib/jvm"); + scanJavaDirs("/usr/lib64/jvm"); + scanJavaDirs("/usr/lib32/jvm"); // javas stored in Prism Launcher's folder - scanJavaDir("java"); + scanJavaDirs("java"); // manually installed JDKs in /opt - scanJavaDir("/opt/jdk"); - scanJavaDir("/opt/jdks"); + scanJavaDirs("/opt/jdk"); + scanJavaDirs("/opt/jdks"); // flatpak - scanJavaDir("/app/jdk"); + scanJavaDirs("/app/jdk"); javas = addJavasFromEnv(javas); javas.removeDuplicates(); return javas; diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 000000000..f64e5b0a5 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,55 @@ +name: prismlauncher +license: GPL-3.0-only +base: core20 +website: https://prismlauncher.org/ +source-code: https://github.com/PrismLauncher/PrismLauncher +issues: https://github.com/PrismLauncher/PrismLauncher/issues +donation: https://opencollective.com/prismlauncher +contact: https://discord.gg/prismlauncher +summary: A custom Minecraft launcher with modpack support +adopt-info: prismlauncher + +grade: devel +confinement: strict + +architectures: + - build-on: amd64 + - build-on: arm64 + +parts: + prismlauncher: + parse-info: + - usr/share/metainfo/org.prismlauncher.PrismLauncher.metainfo.xml + plugin: cmake + build-packages: + - default-jdk-headless + stage-packages: + - openjdk-17-jre + - openjdk-8-jre + source: . + override-pull: | + snapcraftctl pull + # Fix the icon reference in the desktop file + sed -i.bak -e 's|Icon=org.prismlauncher.PrismLauncher|Icon=/usr/share/icons/hicolor/scalable/apps/org.prismlauncher.PrismLauncher.svg|g' program_info/org.prismlauncher.PrismLauncher.desktop.in + # Remove the build directory so that local development doesn't interfere with Snap compilation + rm -rf build + cmake-generator: Ninja + cmake-parameters: + - "-DCMAKE_INSTALL_PREFIX=/usr" + - "-DCMAKE_BUILD_TYPE=RelWithDebInfo" + - "-DENABLE_LTO=ON" + - "-DLauncher_BUILD_PLATFORM=snap" + +apps: + prismlauncher: + common-id: org.prismlauncher.PrismLauncher + desktop: usr/share/applications/org.prismlauncher.PrismLauncher.desktop + command: usr/bin/prismlauncher + extensions: + - kde-neon + plugs: + - home + - opengl + - network + - network-bind + - audio-playback \ No newline at end of file From aacf7938ae6cf3447d02847a1a4f606bd0b2f2cf Mon Sep 17 00:00:00 2001 From: Piper McCorkle Date: Wed, 26 Oct 2022 06:11:19 -0500 Subject: [PATCH 0034/1149] Add CI build for Snap Signed-off-by: Piper McCorkle --- .github/workflows/build.yml | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac701c1e0..31e4112a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -412,5 +412,25 @@ jobs: with: name: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage path: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage - - + snap: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: 'true' + - name: Set short version + shell: bash + run: | + ver_short=`git rev-parse --short HEAD` + echo "VERSION=$ver_short" >> $GITHUB_ENV + - name: Package Snap (Linux) + id: snapcraft + if: runner.os == 'Linux' && matrix.qt_ver != 5 + uses: snapcore/action-build@v1 + - name: Upload Snap (Linux) + if: runner.os == 'Linux' && matrix.qt_ver != 5 + uses: actions/upload-artifact@v3 + with: + name: prismlauncher_${{ env.VERSION }}_amd64.snap + path: ${{ steps.snapcraft.outputs.snap }} From 990cfb7b3378aa5c4f0482c1f6ef4bfa8b073e81 Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Thu, 27 Oct 2022 18:08:56 +0200 Subject: [PATCH 0035/1149] Remove appveyor I forgor :skull: But seriously I forgor to remove the &logo=appveyor thing AAAAAH!!! Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dc6cdbc72..db0e2c623 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Portable builds are provided for Linux, Windows, and macOS. For Arch, Debian and Gentoo, respectively, you can use these packages to get compiled development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=appveyor)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=appveyor)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=appveyor)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=appveyor)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square)](https://packages.gentoo.org/packages/games-action/prismlauncher) ## Help & Support @@ -32,10 +32,10 @@ Feel free to create an issue if you need help. [![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner3)](https://discord.gg/prismlauncher) #### Join our Matrix space: -[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge&logo=appveyor)](https://matrix.to/#/#prismlauncher:matrix.org) +[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge)](https://matrix.to/#/#prismlauncher:matrix.org) #### Join our SubReddit: -[![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge&logo=appveyor)](https://www.reddit.com/r/PrismLauncher/) +[![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge)](https://www.reddit.com/r/PrismLauncher/) ## Building From b18466da8430ba782e59f50812f3724defa1f2a9 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Thu, 27 Oct 2022 12:29:41 +0100 Subject: [PATCH 0036/1149] Fix: Don't specify x86 in manifest Signed-off-by: TheLastRar --- program_info/prismlauncher.manifest.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/prismlauncher.manifest.in b/program_info/prismlauncher.manifest.in index 1d7644450..6f4467c7d 100644 --- a/program_info/prismlauncher.manifest.in +++ b/program_info/prismlauncher.manifest.in @@ -10,7 +10,7 @@ - + Custom Minecraft launcher for managing multiple installs. From d35c985d2ebca44903bedba87c99efb8db0f158d Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sun, 23 Oct 2022 12:57:29 +0200 Subject: [PATCH 0037/1149] feat(actions): use clang32 for building on windows *way* faster Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b6400791d..a7dd31d7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,12 +30,12 @@ jobs: - os: windows-2022 name: "Windows-Legacy" - msystem: mingw32 + msystem: clang32 qt_ver: 5 - os: windows-2022 name: "Windows" - msystem: mingw32 + msystem: clang32 qt_ver: 6 - os: macos-12 @@ -89,6 +89,7 @@ jobs: update: true install: >- git + mingw-w64-x86_64-binutils pacboy: >- toolchain:p cmake:p @@ -99,7 +100,6 @@ jobs: qt${{ matrix.qt_ver }}-imageformats:p quazip-qt${{ matrix.qt_ver }}:p ccache:p - nsis:p ${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }} - name: Setup ccache @@ -194,7 +194,7 @@ jobs: if: runner.os == 'Windows' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja - name: Configure CMake (Linux) if: runner.os == 'Linux' @@ -280,7 +280,7 @@ jobs: cd ${{ env.INSTALL_DIR }} if [ "${{ matrix.qt_ver }}" == "5" ]; then - cp /mingw32/bin/libcrypto-1_1.dll /mingw32/bin/libssl-1_1.dll ./ + cp /clang32/bin/libcrypto-1_1.dll /clang32/bin/libssl-1_1.dll ./ fi - name: Package (Windows, portable) @@ -292,7 +292,6 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' - shell: msys2 {0} run: | cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" From 2ba3de79d8df31d196f0cd249b1606e7233cf840 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 27 Oct 2022 21:14:30 +0200 Subject: [PATCH 0038/1149] chore: add comment about copy bug Signed-off-by: Sefa Eyeoglu --- launcher/FileSystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 39e68c207..76cfccb0b 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -401,6 +401,7 @@ bool overrideFolder(QString overwritten_path, QString override_path) std::error_code err; fs::copy_options opt = copy_opts::recursive | copy_opts::overwrite_existing; + // FIXME: hello traveller! Apparently std::copy does NOT overwrite existing files on GNU libstdc++ on Windows? fs::copy(toStdString(override_path), toStdString(overwritten_path), opt, err); if (err) { From 93894f62ffcb8c33caf36e8801e163738cc2873d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 28 Oct 2022 00:05:11 +0200 Subject: [PATCH 0039/1149] fix: avoid segfault for unexpected API reponse Signed-off-by: Sefa Eyeoglu --- .../modrinth/ModrinthPackIndex.cpp | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp index 3e53becb4..ae45e0966 100644 --- a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp @@ -1,20 +1,20 @@ // SPDX-License-Identifier: GPL-3.0-only /* -* PolyMC - Minecraft Launcher -* Copyright (c) 2022 flowln -* -* 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 . -*/ + * PolyMC - Minecraft Launcher + * Copyright (c) 2022 flowln + * + * 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 . + */ #include "ModrinthPackIndex.h" #include "ModrinthAPI.h" @@ -35,7 +35,7 @@ void Modrinth::loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) pack.provider = ModPlatform::Provider::MODRINTH; pack.name = Json::requireString(obj, "title"); - + pack.slug = Json::ensureString(obj, "slug", ""); if (!pack.slug.isEmpty()) pack.websiteUrl = "https://modrinth.com/mod/" + pack.slug; @@ -59,23 +59,23 @@ void Modrinth::loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) void Modrinth::loadExtraPackData(ModPlatform::IndexedPack& pack, QJsonObject& obj) { pack.extraData.issuesUrl = Json::ensureString(obj, "issues_url"); - if(pack.extraData.issuesUrl.endsWith('/')) + if (pack.extraData.issuesUrl.endsWith('/')) pack.extraData.issuesUrl.chop(1); pack.extraData.sourceUrl = Json::ensureString(obj, "source_url"); - if(pack.extraData.sourceUrl.endsWith('/')) + if (pack.extraData.sourceUrl.endsWith('/')) pack.extraData.sourceUrl.chop(1); pack.extraData.wikiUrl = Json::ensureString(obj, "wiki_url"); - if(pack.extraData.wikiUrl.endsWith('/')) + if (pack.extraData.wikiUrl.endsWith('/')) pack.extraData.wikiUrl.chop(1); pack.extraData.discordUrl = Json::ensureString(obj, "discord_url"); - if(pack.extraData.discordUrl.endsWith('/')) + if (pack.extraData.discordUrl.endsWith('/')) pack.extraData.discordUrl.chop(1); auto donate_arr = Json::ensureArray(obj, "donation_urls"); - for(auto d : donate_arr){ + for (auto d : donate_arr) { auto d_obj = Json::requireObject(d); ModPlatform::DonationData donate; @@ -104,7 +104,7 @@ void Modrinth::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, auto obj = versionIter.toObject(); auto file = loadIndexedPackVersion(obj); - if(file.fileId.isValid()) // Heuristic to check if the returned value is valid + if (file.fileId.isValid()) // Heuristic to check if the returned value is valid unsortedVersions.append(file); } auto orderSortPredicate = [](const ModPlatform::IndexedVersion& a, const ModPlatform::IndexedVersion& b) -> bool { @@ -116,7 +116,8 @@ void Modrinth::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, pack.versionsLoaded = true; } -auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_type, QString preferred_file_name) -> ModPlatform::IndexedVersion +auto Modrinth::loadIndexedPackVersion(QJsonObject& obj, QString preferred_hash_type, QString preferred_file_name) + -> ModPlatform::IndexedVersion { ModPlatform::IndexedVersion file; @@ -141,6 +142,12 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_t auto files = Json::requireArray(obj, "files"); int i = 0; + if (files.empty()) { + // This should not happen normally, but check just in case + qWarning() << "Modrinth returned an unexpected empty list of files:" << obj; + return {}; + } + // Find correct file (needed in cases where one version may have multiple files) // Will default to the last one if there's no primary (though I think Modrinth requires that // at least one file is primary, idk) @@ -167,7 +174,7 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_t file.fileName = Json::requireString(parent, "filename"); file.is_preferred = Json::requireBoolean(parent, "primary") || (files.count() == 1); auto hash_list = Json::requireObject(parent, "hashes"); - + if (hash_list.contains(preferred_hash_type)) { file.hash = Json::requireString(hash_list, preferred_hash_type); file.hash_type = preferred_hash_type; From a5be974f1a53a8e56527d639beb4c16f3a7e18c6 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Thu, 27 Oct 2022 21:05:32 +0200 Subject: [PATCH 0040/1149] feat: use clang64 on qt6 builds Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca82d3d8f..dd2c05994 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,7 @@ jobs: - os: windows-2022 name: "Windows" - msystem: clang32 + msystem: clang64 qt_ver: 6 - os: macos-12 From 03b48554b1dcffc662b4275af6defbf3516eada2 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 29 Oct 2022 00:01:22 +0800 Subject: [PATCH 0041/1149] fix(style): convert tabs to spaces Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- cmake/MacOSXBundleInfo.plist.in | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in index 597beaa61..400e482fe 100644 --- a/cmake/MacOSXBundleInfo.plist.in +++ b/cmake/MacOSXBundleInfo.plist.in @@ -48,21 +48,21 @@ CFBundleTypeExtensions - - zip + + zip mrpack - - CFBundleTypeName - Prism Launcher instance - CFBundleTypeOSTypes - - TEXT - utxt - TUTX - **** - - CFBundleTypeRole - Viewer + + CFBundleTypeName + Prism Launcher instance + CFBundleTypeOSTypes + + TEXT + utxt + TUTX + **** + + CFBundleTypeRole + Viewer LSHandlerRank Alternate From e6e92f2b0e9ef16bdbae371ccb284339a70cff02 Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 28 Oct 2022 13:31:21 -0300 Subject: [PATCH 0042/1149] fix: only allow workarounds for blocked mods from MR when 100% safe If a version on Modrinth has more than a single mod loader associated, it means that it's possible we might get the wrong file for download, since individual files don't really have this kind of metadata in the API response. So, in such cases, it's best to let the user take care of it instead. Signed-off-by: flow --- .../modplatform/flame/FileResolvingTask.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index c50abb8f2..25b56fbd1 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -3,6 +3,8 @@ #include "Json.h" #include "net/Upload.h" +#include "modplatform/modrinth/ModrinthPackIndex.h" + Flame::FileResolvingTask::FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess) : m_network(network), m_toProcess(toProcess) {} @@ -84,18 +86,21 @@ void Flame::FileResolvingTask::modrinthCheckFinished() { delete bytes; continue; } + QJsonDocument doc = QJsonDocument::fromJson(*bytes); auto obj = doc.object(); - auto array = Json::requireArray(obj,"files"); - for (auto file: array) { - auto fileObj = Json::requireObject(file); - auto primary = Json::requireBoolean(fileObj,"primary"); - if (primary) { - out->url = Json::requireUrl(fileObj,"url"); - qDebug() << "Found alternative on modrinth " << out->fileName; - break; - } + auto file = Modrinth::loadIndexedPackVersion(obj); + + // If there's more than one mod loader for this version, we can't know for sure + // which file is relative to each loader, so it's best to not use any one and + // let the user download it manually. + if (file.loaders.size() <= 1) { + out->url = file.downloadUrl; + qDebug() << "Found alternative on modrinth " << out->fileName; + } else { + out->resolved = false; } + delete bytes; } //copy to an output list and filter out projects found on modrinth From 76146e0f17dc56a68128edb13a73f4852af86e84 Mon Sep 17 00:00:00 2001 From: leo78913 Date: Fri, 28 Oct 2022 15:51:20 -0300 Subject: [PATCH 0043/1149] add a flat white version of the launch icon Signed-off-by: leo78913 --- launcher/resources/flat_white/flat_white.qrc | 1 + .../resources/flat_white/scalable/launch.svg | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 launcher/resources/flat_white/scalable/launch.svg diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index 9df690600..e11d63165 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -46,5 +46,6 @@ scalable/export.svg scalable/rename.svg scalable/tag.svg + scalable/launch.svg diff --git a/launcher/resources/flat_white/scalable/launch.svg b/launcher/resources/flat_white/scalable/launch.svg new file mode 100644 index 000000000..9e7594318 --- /dev/null +++ b/launcher/resources/flat_white/scalable/launch.svg @@ -0,0 +1,16 @@ + + + + + From be3c9abcfeb68ad76914848e7135b2595490beda Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 28 Oct 2022 20:11:46 -0300 Subject: [PATCH 0044/1149] fix: copy single files too in FS::copy eek Signed-off-by: flow --- launcher/FileSystem.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 76cfccb0b..9bca847e7 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -182,6 +182,21 @@ bool copy::operator()(const QString& offset) if (!m_followSymlinks) opt |= copy_opts::copy_symlinks; + // Function that'll do the actual copying + auto copy_file = [&](QString src_path, QString relative_dst_path) { + if (m_blacklist && m_blacklist->matches(relative_dst_path)) + return; + + auto dst_path = PathCombine(dst, relative_dst_path); + ensureFilePathExists(dst_path); + + fs::copy(toStdString(src_path), toStdString(dst_path), opt, err); + if (err) { + qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); + qDebug() << "Source file:" << src_path; + qDebug() << "Destination file:" << dst_path; + } + }; // We can't use copy_opts::recursive because we need to take into account the // blacklisted paths, so we iterate over the source directory, and if there's no blacklist @@ -193,20 +208,13 @@ bool copy::operator()(const QString& offset) auto src_path = source_it.next(); auto relative_path = src_dir.relativeFilePath(src_path); - if (m_blacklist && m_blacklist->matches(relative_path)) - continue; - - auto dst_path = PathCombine(dst, relative_path); - ensureFilePathExists(dst_path); - - fs::copy(toStdString(src_path), toStdString(dst_path), opt, err); - if (err) { - qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); - qDebug() << "Source file:" << src_path; - qDebug() << "Destination file:" << dst_path; - } + copy_file(src_path, relative_path); } + // If the root src is not a directory, the previous iterator won't run. + if (!fs::is_directory(toStdString(src))) + copy_file(src, ""); + return err.value() == 0; } From 81333515e0ecfa0ad0880032808a220a3f463e30 Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 28 Oct 2022 20:55:25 -0300 Subject: [PATCH 0045/1149] feat(tests): add test for FS::copy with files Signed-off-by: flow --- tests/FileSystem_test.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/FileSystem_test.cpp b/tests/FileSystem_test.cpp index 47a963b0c..21270f6f6 100644 --- a/tests/FileSystem_test.cpp +++ b/tests/FileSystem_test.cpp @@ -183,6 +183,32 @@ slots: f(); } + void test_copy_single_file() + { + QTemporaryDir tempDir; + tempDir.setAutoRemove(true); + + { + QString file = QFINDTESTDATA("testdata/FileSystem/test_folder/pack.mcmeta"); + + qDebug() << "From:" << file << "To:" << tempDir.path(); + + QDir target_dir(FS::PathCombine(tempDir.path(), "pack.mcmeta")); + qDebug() << tempDir.path(); + qDebug() << target_dir.path(); + FS::copy c(file, target_dir.filePath("pack.mcmeta")); + c(); + + auto filter = QDir::Filter::Files; + + for (auto entry: target_dir.entryList(filter)) { + qDebug() << entry; + } + + QVERIFY(target_dir.entryList(filter).contains("pack.mcmeta")); + } + } + void test_getDesktop() { QCOMPARE(FS::getDesktopDir(), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)); From c00f96c7ca49a624ea8e9c4774ea11e954bbdc4b Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Sat, 29 Oct 2022 00:55:33 -0400 Subject: [PATCH 0046/1149] create getters and setters for InstanceCopyPrefs + use pragma once like other .h files in this directory Signed-off-by: Marcelo Hernandez --- launcher/InstanceCopyPrefs.cpp | 72 ++++++++++++++++++++++ launcher/InstanceCopyPrefs.h | 29 ++++++--- launcher/InstanceCopyTask.cpp | 2 +- launcher/ui/dialogs/CopyInstanceDialog.cpp | 28 ++++----- 4 files changed, 109 insertions(+), 22 deletions(-) diff --git a/launcher/InstanceCopyPrefs.cpp b/launcher/InstanceCopyPrefs.cpp index 6432a5351..ae30bb824 100644 --- a/launcher/InstanceCopyPrefs.cpp +++ b/launcher/InstanceCopyPrefs.cpp @@ -47,3 +47,75 @@ QString InstanceCopyPrefs::getSelectedFiltersAsRegex() const return {}; } + +// ======= Getters ======= +bool InstanceCopyPrefs::isCopySavesEnabled() const +{ + return copySaves; +} + +bool InstanceCopyPrefs::isKeepPlaytimeEnabled() const +{ + return keepPlaytime; +} + +bool InstanceCopyPrefs::isCopyGameOptionsEnabled() const +{ + return copyGameOptions; +} + +bool InstanceCopyPrefs::isCopyResourcePacksEnabled() const +{ + return copyResourcePacks; +} + +bool InstanceCopyPrefs::isCopyShaderPacksEnabled() const +{ + return copyShaderPacks; +} + +bool InstanceCopyPrefs::isCopyServersEnabled() const +{ + return copyServers; +} + +bool InstanceCopyPrefs::isCopyModsEnabled() const +{ + return copyMods; +} + +// ======= Setters ======= +void InstanceCopyPrefs::enableCopySaves(bool b) +{ + copySaves = b; +} + +void InstanceCopyPrefs::enableKeepPlaytime(bool b) +{ + keepPlaytime = b; +} + +void InstanceCopyPrefs::enableCopyGameOptions(bool b) +{ + copyGameOptions = b; +} + +void InstanceCopyPrefs::enableCopyResourcePacks(bool b) +{ + copyResourcePacks = b; +} + +void InstanceCopyPrefs::enableCopyShaderPacks(bool b) +{ + copyShaderPacks = b; +} + +void InstanceCopyPrefs::enableCopyServers(bool b) +{ + copyServers = b; +} + +void InstanceCopyPrefs::enableCopyMods(bool b) +{ + copyMods = b; +} diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h index 432d67c40..3855965de 100644 --- a/launcher/InstanceCopyPrefs.h +++ b/launcher/InstanceCopyPrefs.h @@ -2,12 +2,32 @@ // Created by marcelohdez on 10/22/22. // -#ifndef LAUNCHER_INSTANCECOPYPREFS_H -#define LAUNCHER_INSTANCECOPYPREFS_H +#pragma once #include struct InstanceCopyPrefs { + public: + [[nodiscard]] bool allTrue() const; + [[nodiscard]] QString getSelectedFiltersAsRegex() const; + // Getters + [[nodiscard]] bool isCopySavesEnabled() const; + [[nodiscard]] bool isKeepPlaytimeEnabled() const; + [[nodiscard]] bool isCopyGameOptionsEnabled() const; + [[nodiscard]] bool isCopyResourcePacksEnabled() const; + [[nodiscard]] bool isCopyShaderPacksEnabled() const; + [[nodiscard]] bool isCopyServersEnabled() const; + [[nodiscard]] bool isCopyModsEnabled() const; + // Setters + void enableCopySaves(bool b); + void enableKeepPlaytime(bool b); + void enableCopyGameOptions(bool b); + void enableCopyResourcePacks(bool b); + void enableCopyShaderPacks(bool b); + void enableCopyServers(bool b); + void enableCopyMods(bool b); + + protected: // data bool copySaves = true; bool keepPlaytime = true; bool copyGameOptions = true; @@ -15,9 +35,4 @@ struct InstanceCopyPrefs { bool copyShaderPacks = true; bool copyServers = true; bool copyMods = true; - - [[nodiscard]] bool allTrue() const; - [[nodiscard]] QString getSelectedFiltersAsRegex() const; }; - -#endif // LAUNCHER_INSTANCECOPYPREFS_H diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index 7fbf86363..a4ea947d2 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -8,7 +8,7 @@ InstanceCopyTask::InstanceCopyTask(InstancePtr origInstance, const InstanceCopyPrefs& prefs) { m_origInstance = origInstance; - m_keepPlaytime = prefs.keepPlaytime; + m_keepPlaytime = prefs.isKeepPlaytimeEnabled(); QString filters = prefs.getSelectedFiltersAsRegex(); if (!filters.isEmpty()) diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index e658f26d5..f76b509ea 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -77,13 +77,13 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) } ui->groupBox->setCurrentIndex(index); ui->groupBox->lineEdit()->setPlaceholderText(tr("No group")); - ui->copySavesCheckbox->setChecked(m_selectedOptions.copySaves); - ui->keepPlaytimeCheckbox->setChecked(m_selectedOptions.keepPlaytime); - ui->copyGameOptionsCheckbox->setChecked(m_selectedOptions.copyGameOptions); - ui->copyResPacksCheckbox->setChecked(m_selectedOptions.copyResourcePacks); - ui->copyShaderPacksCheckbox->setChecked(m_selectedOptions.copyShaderPacks); - ui->copyServersCheckbox->setChecked(m_selectedOptions.copyServers); - ui->copyModsCheckbox->setChecked(m_selectedOptions.copyMods); + ui->copySavesCheckbox->setChecked(m_selectedOptions.isCopySavesEnabled()); + ui->keepPlaytimeCheckbox->setChecked(m_selectedOptions.isKeepPlaytimeEnabled()); + ui->copyGameOptionsCheckbox->setChecked(m_selectedOptions.isCopyGameOptionsEnabled()); + ui->copyResPacksCheckbox->setChecked(m_selectedOptions.isCopyResourcePacksEnabled()); + ui->copyShaderPacksCheckbox->setChecked(m_selectedOptions.isCopyShaderPacksEnabled()); + ui->copyServersCheckbox->setChecked(m_selectedOptions.isCopyServersEnabled()); + ui->copyModsCheckbox->setChecked(m_selectedOptions.isCopyModsEnabled()); } CopyInstanceDialog::~CopyInstanceDialog() @@ -172,43 +172,43 @@ void CopyInstanceDialog::on_selectAllCheckbox_stateChanged(int state) void CopyInstanceDialog::on_copySavesCheckbox_stateChanged(int state) { - m_selectedOptions.copySaves = (state == Qt::Checked); + m_selectedOptions.enableCopySaves(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_keepPlaytimeCheckbox_stateChanged(int state) { - m_selectedOptions.keepPlaytime = (state == Qt::Checked); + m_selectedOptions.enableKeepPlaytime(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyGameOptionsCheckbox_stateChanged(int state) { - m_selectedOptions.copyGameOptions = (state == Qt::Checked); + m_selectedOptions.enableCopyGameOptions(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyResPacksCheckbox_stateChanged(int state) { - m_selectedOptions.copyResourcePacks = (state == Qt::Checked); + m_selectedOptions.enableCopyResourcePacks(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyShaderPacksCheckbox_stateChanged(int state) { - m_selectedOptions.copyShaderPacks = (state == Qt::Checked); + m_selectedOptions.enableCopyShaderPacks(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyServersCheckbox_stateChanged(int state) { - m_selectedOptions.copyServers = (state == Qt::Checked); + m_selectedOptions.enableCopyServers(state == Qt::Checked); updateSelectAllCheckbox(); } void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) { - m_selectedOptions.copyMods = (state == Qt::Checked); + m_selectedOptions.enableCopyMods(state == Qt::Checked); updateSelectAllCheckbox(); } From 5ed7eb9d537558da603683d517f5537f0e4537a1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 29 Oct 2022 13:12:51 +0200 Subject: [PATCH 0047/1149] chore: update credits Signed-off-by: Sefa Eyeoglu --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index cecda1df5..52d6baef4 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -97,7 +97,7 @@ QString getCreditsHtml() stream << "
\n"; stream << "

" << QObject::tr("With thanks to", "About Credits") << "

\n"; - stream << QString("

Boba %1

\n") .arg(getWebsite("https://cmdplusv.neocities.org/")); + stream << QString("

Boba %1

\n") .arg(getWebsite("https://bobaonline.neocities.org/")); stream << QString("

Davi Rafael %1

\n") .arg(getWebsite("https://auti.one/")); stream << QString("

Fulmine %1

\n") .arg(getWebsite("https://www.fulmine.xyz/")); stream << QString("

ely %1

\n") .arg(getGitHub("elyrodso")); From 7f991ed897d0f344166511daddde4aa4994a67b0 Mon Sep 17 00:00:00 2001 From: txtsd Date: Sat, 29 Oct 2022 19:24:12 +0530 Subject: [PATCH 0048/1149] feat: Add Repology badge to README Signed-off-by: txtsd --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index db0e2c623..57f1e30a3 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. ## Installation + + Packaging status + + - All downloads and instructions for Prism Launcher can be found [on our website](https://prismlauncher.org/download/). - Last build status can be found [here](https://github.com/PrismLauncher/PrismLauncher/actions). From b142a6da5b2ae433ce8164c7be0a3c3870131414 Mon Sep 17 00:00:00 2001 From: fn2006 Date: Sat, 29 Oct 2022 16:10:18 +0100 Subject: [PATCH 0049/1149] fix hardcoded svg Signed-off-by: fn2006 --- buildconfig/BuildConfig.cpp.in | 1 + buildconfig/BuildConfig.h | 1 + launcher/Application.cpp | 2 +- program_info/CMakeLists.txt | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index b8fa51339..1262ce8e4 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -49,6 +49,7 @@ Config::Config() LAUNCHER_CONFIGFILE = "@Launcher_ConfigFile@"; LAUNCHER_GIT = "@Launcher_Git@"; LAUNCHER_DESKTOPFILENAME = "@Launcher_DesktopFileName@"; + LAUNCHER_SVGFILENAME = "@Launcher_SVGFileName@"; USER_AGENT = "@Launcher_UserAgent@"; USER_AGENT_UNCACHED = USER_AGENT + " (Uncached)"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 13ccdaa18..4a3090736 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -51,6 +51,7 @@ class Config { QString LAUNCHER_CONFIGFILE; QString LAUNCHER_GIT; QString LAUNCHER_DESKTOPFILENAME; + QString LAUNCHER_SVGFILENAME; /// The major version number. int VERSION_MAJOR; diff --git a/launcher/Application.cpp b/launcher/Application.cpp index f6b418502..c6814abf5 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1177,7 +1177,7 @@ void Application::setIconTheme(const QString& name) QIcon Application::getThemedIcon(const QString& name) { if(name == "logo") { - return QIcon(":/org.prismlauncher.PrismLauncher.svg"); // FIXME: Make this a BuildConfig variable + return QIcon(":/" + BuildConfig.LAUNCHER_SVGFILENAME); } return QIcon::fromTheme(name); } diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 61949e137..b0507816b 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -22,6 +22,7 @@ set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_ set(Launcher_ConfigFile "prismlauncher.cfg" PARENT_SCOPE) set(Launcher_Git "https://github.com/PrismLauncher/PrismLauncher" PARENT_SCOPE) set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) set(Launcher_Desktop "program_info/org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) set(Launcher_MetaInfo "program_info/org.prismlauncher.PrismLauncher.metainfo.xml" PARENT_SCOPE) From 98891a036dcd96dc7d9bf6b8f11c2a5f2ddd054e Mon Sep 17 00:00:00 2001 From: fn2006 Date: Sat, 29 Oct 2022 17:35:37 +0100 Subject: [PATCH 0050/1149] use existing variables Signed-off-by: fn2006 --- program_info/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index b0507816b..f064e0984 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -21,12 +21,12 @@ set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) set(Launcher_ConfigFile "prismlauncher.cfg" PARENT_SCOPE) set(Launcher_Git "https://github.com/PrismLauncher/PrismLauncher" PARENT_SCOPE) -set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) -set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) +set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop") +set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg") -set(Launcher_Desktop "program_info/org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_Desktop "program_info/${Launcher_DesktopFileName}" PARENT_SCOPE) set(Launcher_MetaInfo "program_info/org.prismlauncher.PrismLauncher.metainfo.xml" PARENT_SCOPE) -set(Launcher_SVG "program_info/org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) +set(Launcher_SVG "program_info/${Launcher_SVGFileName}" PARENT_SCOPE) set(Launcher_Branding_ICNS "program_info/prismlauncher.icns" PARENT_SCOPE) set(Launcher_Branding_ICO "program_info/prismlauncher.ico") set(Launcher_Branding_ICO "${Launcher_Branding_ICO}" PARENT_SCOPE) From 5d1aac3c53904f7c843dc5cfdbdd33086eb4b6d6 Mon Sep 17 00:00:00 2001 From: Marcelo Hernandez Date: Sat, 29 Oct 2022 22:27:31 -0400 Subject: [PATCH 0051/1149] added option to not copy screenshots + moved select all checkbox to top row, centered. Signed-off-by: Marcelo Hernandez --- launcher/InstanceCopyPrefs.cpp | 16 +++- launcher/InstanceCopyPrefs.h | 3 + launcher/ui/dialogs/CopyInstanceDialog.cpp | 8 ++ launcher/ui/dialogs/CopyInstanceDialog.h | 1 + launcher/ui/dialogs/CopyInstanceDialog.ui | 85 ++++++++++++++-------- 5 files changed, 81 insertions(+), 32 deletions(-) diff --git a/launcher/InstanceCopyPrefs.cpp b/launcher/InstanceCopyPrefs.cpp index ae30bb824..7b93a5164 100644 --- a/launcher/InstanceCopyPrefs.cpp +++ b/launcher/InstanceCopyPrefs.cpp @@ -12,7 +12,8 @@ bool InstanceCopyPrefs::allTrue() const copyResourcePacks && copyShaderPacks && copyServers && - copyMods; + copyMods && + copyScreenshots; } // Returns a single RegEx string of the selected folders/files to filter out (ex: ".minecraft/saves|.minecraft/server.dat") @@ -38,6 +39,9 @@ QString InstanceCopyPrefs::getSelectedFiltersAsRegex() const if(!copyMods) filters << "coremods" << "mods" << "config"; + if(!copyScreenshots) + filters << "screenshots"; + // If we have any filters to add, join them as a single regex string to return: if (!filters.isEmpty()) { const QString MC_ROOT = "[.]?minecraft/"; @@ -84,6 +88,11 @@ bool InstanceCopyPrefs::isCopyModsEnabled() const return copyMods; } +bool InstanceCopyPrefs::isCopyScreenshotsEnabled() const +{ + return copyScreenshots; +} + // ======= Setters ======= void InstanceCopyPrefs::enableCopySaves(bool b) { @@ -119,3 +128,8 @@ void InstanceCopyPrefs::enableCopyMods(bool b) { copyMods = b; } + +void InstanceCopyPrefs::enableCopyScreenshots(bool b) +{ + copyScreenshots = b; +} diff --git a/launcher/InstanceCopyPrefs.h b/launcher/InstanceCopyPrefs.h index 3855965de..6988b2df3 100644 --- a/launcher/InstanceCopyPrefs.h +++ b/launcher/InstanceCopyPrefs.h @@ -18,6 +18,7 @@ struct InstanceCopyPrefs { [[nodiscard]] bool isCopyShaderPacksEnabled() const; [[nodiscard]] bool isCopyServersEnabled() const; [[nodiscard]] bool isCopyModsEnabled() const; + [[nodiscard]] bool isCopyScreenshotsEnabled() const; // Setters void enableCopySaves(bool b); void enableKeepPlaytime(bool b); @@ -26,6 +27,7 @@ struct InstanceCopyPrefs { void enableCopyShaderPacks(bool b); void enableCopyServers(bool b); void enableCopyMods(bool b); + void enableCopyScreenshots(bool b); protected: // data bool copySaves = true; @@ -35,4 +37,5 @@ struct InstanceCopyPrefs { bool copyShaderPacks = true; bool copyServers = true; bool copyMods = true; + bool copyScreenshots = true; }; diff --git a/launcher/ui/dialogs/CopyInstanceDialog.cpp b/launcher/ui/dialogs/CopyInstanceDialog.cpp index f76b509ea..3f5122f66 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.cpp +++ b/launcher/ui/dialogs/CopyInstanceDialog.cpp @@ -84,6 +84,7 @@ CopyInstanceDialog::CopyInstanceDialog(InstancePtr original, QWidget *parent) ui->copyShaderPacksCheckbox->setChecked(m_selectedOptions.isCopyShaderPacksEnabled()); ui->copyServersCheckbox->setChecked(m_selectedOptions.isCopyServersEnabled()); ui->copyModsCheckbox->setChecked(m_selectedOptions.isCopyModsEnabled()); + ui->copyScreenshotsCheckbox->setChecked(m_selectedOptions.isCopyScreenshotsEnabled()); } CopyInstanceDialog::~CopyInstanceDialog() @@ -135,6 +136,7 @@ void CopyInstanceDialog::checkAllCheckboxes(const bool& b) ui->copyShaderPacksCheckbox->setChecked(b); ui->copyServersCheckbox->setChecked(b); ui->copyModsCheckbox->setChecked(b); + ui->copyScreenshotsCheckbox->setChecked(b); } // Check the "Select all" checkbox if all options are already selected: @@ -212,3 +214,9 @@ void CopyInstanceDialog::on_copyModsCheckbox_stateChanged(int state) m_selectedOptions.enableCopyMods(state == Qt::Checked); updateSelectAllCheckbox(); } + +void CopyInstanceDialog::on_copyScreenshotsCheckbox_stateChanged(int state) +{ + m_selectedOptions.enableCopyScreenshots(state == Qt::Checked); + updateSelectAllCheckbox(); +} diff --git a/launcher/ui/dialogs/CopyInstanceDialog.h b/launcher/ui/dialogs/CopyInstanceDialog.h index 94015334e..884501d14 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.h +++ b/launcher/ui/dialogs/CopyInstanceDialog.h @@ -54,6 +54,7 @@ slots: void on_copyShaderPacksCheckbox_stateChanged(int state); void on_copyServersCheckbox_stateChanged(int state); void on_copyModsCheckbox_stateChanged(int state); + void on_copyScreenshotsCheckbox_stateChanged(int state); private: void checkAllCheckboxes(const bool& b); diff --git a/launcher/ui/dialogs/CopyInstanceDialog.ui b/launcher/ui/dialogs/CopyInstanceDialog.ui index 822ed7977..b7828fe31 100644 --- a/launcher/ui/dialogs/CopyInstanceDialog.ui +++ b/launcher/ui/dialogs/CopyInstanceDialog.ui @@ -10,7 +10,7 @@ 0 0 341 - 385 + 399 @@ -112,25 +112,31 @@
+ + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + Select all + + + false + + + + + - - - - Copy saves - - - - - - - true - - - Copy resource packs - - - @@ -151,17 +157,10 @@ - - + + - Copy servers - - - - - - - Keep play time + Copy saves @@ -172,10 +171,34 @@ - - + + - Select all + Copy servers + + + + + + + true + + + Copy resource packs + + + + + + + Keep play time + + + + + + + Copy screenshots From 19a8d51bf3567950db77d6bc05b16373fd1a0a1d Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sun, 30 Oct 2022 11:52:16 +0800 Subject: [PATCH 0052/1149] fix: more user friendly Java warning text Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/launch/VerifyJavaInstall.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 99809f828..43f118f44 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -71,5 +71,7 @@ void VerifyJavaInstall::executeTask() { { emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); } + emit logLine(tr("If you are sure your version will work, go to instance settings and check \"Skip Java compatibility checks\"."), MessageLevel::Error); + emitFailed(QString("Incompatible Java major version")); } From b4be28b9bb29609212b398a5f46ee4dbc400cf2d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 30 Oct 2022 18:37:03 +0100 Subject: [PATCH 0053/1149] fix: fix disabled trash undo action Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 559ebc316..55f3e4f85 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1134,11 +1134,6 @@ void MainWindow::showInstanceContextMenu(const QPoint &pos) connect(actionDeleteGroup, SIGNAL(triggered(bool)), SLOT(deleteGroup())); actions.append(actionDeleteGroup); } - - QAction *actionUndoTrashInstance = new QAction("Undo last trash instance", this); - connect(actionUndoTrashInstance, SIGNAL(triggered(bool)), SLOT(undoTrashInstance())); - actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); - actions.append(actionUndoTrashInstance); } QMenu myMenu; myMenu.addActions(actions); @@ -1834,6 +1829,7 @@ void MainWindow::deleteGroup() void MainWindow::undoTrashInstance() { APPLICATION->instances()->undoTrashInstance(); + ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); } void MainWindow::on_actionViewInstanceFolder_triggered() @@ -1940,6 +1936,7 @@ void MainWindow::on_actionDeleteInstance_triggered() auto id = m_selectedInstance->id(); if (APPLICATION->instances()->trashInstance(id)) { + ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); return; } From fd099166c6a69bf77491cef8aa42cbdf06c78e35 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 30 Oct 2022 20:27:37 +0000 Subject: [PATCH 0054/1149] Fix: Check if Windows 10 before calling setDarkWinTitlebar() Signed-off-by: TheLastRar --- launcher/Application.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index c6814abf5..38613280a 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -62,6 +62,7 @@ #ifdef Q_OS_WIN #include "ui/WinDarkmode.h" +#include #endif #include "ui/setupwizard/SetupWizard.h" @@ -1154,7 +1155,7 @@ void Application::setApplicationTheme(const QString& name, bool initial) auto & theme = (*themeIter).second; theme->apply(initial); #ifdef Q_OS_WIN - if (m_mainWindow) { + if (m_mainWindow && IsWindows10OrGreater()) { if (QString::compare(theme->id(), "dark") == 0) { WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); } else { @@ -1395,10 +1396,13 @@ MainWindow* Application::showMainWindow(bool minimized) m_mainWindow->restoreState(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowState").toByteArray())); m_mainWindow->restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowGeometry").toByteArray())); #ifdef Q_OS_WIN - if (QString::compare(settings()->get("ApplicationTheme").toString(), "dark") == 0) { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); - } else { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + if (IsWindows10OrGreater()) + { + if (QString::compare(settings()->get("ApplicationTheme").toString(), "dark") == 0) { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + } else { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + } } #endif if(minimized) From b7d5fee9956a2fe7801f009eb7905eeae4f09c34 Mon Sep 17 00:00:00 2001 From: Fayne Aldan Date: Sun, 30 Oct 2022 15:55:15 -0600 Subject: [PATCH 0055/1149] Change Profiles to Accounts for consistency Signed-off-by: Fayne Aldan --- launcher/ui/MainWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 559ebc316..84a789415 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -527,7 +527,7 @@ public: menuBar->addMenu(foldersMenu); - profileMenu = menuBar->addMenu(tr("&Profiles")); + profileMenu = menuBar->addMenu(tr("&Accounts")); profileMenu->setSeparatorsCollapsible(false); profileMenu->addAction(actionManageAccounts); @@ -1052,7 +1052,7 @@ void MainWindow::retranslateUi() accountMenuButton->setText(profileLabel); } else { - accountMenuButton->setText(tr("Profiles")); + accountMenuButton->setText(tr("Accounts")); } if (m_selectedInstance) { @@ -1395,7 +1395,7 @@ void MainWindow::defaultAccountChanged() // Set the icon to the "no account" icon. accountMenuButton->setIcon(APPLICATION->getThemedIcon("noaccount")); - accountMenuButton->setText(tr("Profiles")); + accountMenuButton->setText(tr("Accounts")); } bool MainWindow::eventFilter(QObject *obj, QEvent *ev) From 42350e689d9dba0c9385f15e7d4c4da0a71f200c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 30 Oct 2022 23:50:56 +0100 Subject: [PATCH 0056/1149] chore: improve display names of certain languages Signed-off-by: Sefa Eyeoglu --- launcher/translations/TranslationsModel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 2f57de3a9..20aa6d040 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -83,6 +83,12 @@ struct Language else if(key == "es_UY") { result = u8"español de Latinoamérica"; } + else if(key == "en@pirate") { + result = u8"Tongue of the High Seas"; + } + else if(key == "en@uwu") { + result = u8"Cute Engwish"; + } else { result = locale.nativeLanguageName(); } From 27dfe30fe61055de5591d60c43351c7b2ca22668 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:44:11 +0800 Subject: [PATCH 0057/1149] Update VerifyJavaInstall.cpp Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/launch/VerifyJavaInstall.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 43f118f44..89ece6e59 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -71,7 +71,7 @@ void VerifyJavaInstall::executeTask() { { emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); } - emit logLine(tr("If you are sure your version will work, go to instance settings and check \"Skip Java compatibility checks\"."), MessageLevel::Error); + emit logLine(tr(""Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what you're doing."), MessageLevel::Error); emitFailed(QString("Incompatible Java major version")); } From 8467daa0ec71544b86fadae5bbaca9818f21254e Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:58:38 +0800 Subject: [PATCH 0058/1149] oop Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/launch/VerifyJavaInstall.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/launch/VerifyJavaInstall.cpp b/launcher/minecraft/launch/VerifyJavaInstall.cpp index 89ece6e59..6ae666b47 100644 --- a/launcher/minecraft/launch/VerifyJavaInstall.cpp +++ b/launcher/minecraft/launch/VerifyJavaInstall.cpp @@ -71,7 +71,7 @@ void VerifyJavaInstall::executeTask() { { emit logLine(tr("Java version %1").arg(major), MessageLevel::Error); } - emit logLine(tr(""Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what you're doing."), MessageLevel::Error); + emit logLine(tr("Go to instance Java settings to change your Java version or disable the Java compatibility check if you know what you're doing."), MessageLevel::Error); emitFailed(QString("Incompatible Java major version")); } From 29d362a6e08f28ac48e737510a17ae7b3b717850 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 30 Oct 2022 18:54:52 +0100 Subject: [PATCH 0059/1149] fix: do not trash instances in Flatpak Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 9 --------- launcher/Application.h | 2 -- launcher/DesktopServices.cpp | 19 ++++++++++++++----- launcher/DesktopServices.h | 2 ++ launcher/FileSystem.cpp | 4 ++++ launcher/ui/pages/global/LauncherPage.cpp | 3 ++- 6 files changed, 22 insertions(+), 17 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index c6814abf5..0c370b42b 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1136,15 +1136,6 @@ std::vector Application::getValidApplicationThemes() return ret; } -bool Application::isFlatpak() -{ - #ifdef Q_OS_LINUX - return QFile::exists("/.flatpak-info"); - #else - return false; - #endif -} - void Application::setApplicationTheme(const QString& name, bool initial) { auto systemPalette = qApp->palette(); diff --git a/launcher/Application.h b/launcher/Application.h index c453cc28b..8fa0ab10e 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -116,8 +116,6 @@ public: QIcon getThemedIcon(const QString& name); - bool isFlatpak(); - void setIconTheme(const QString& name); std::vector getValidApplicationThemes(); diff --git a/launcher/DesktopServices.cpp b/launcher/DesktopServices.cpp index c29cbe7d0..302eaf967 100644 --- a/launcher/DesktopServices.cpp +++ b/launcher/DesktopServices.cpp @@ -119,7 +119,7 @@ bool openDirectory(const QString &path, bool ensureExists) return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -140,7 +140,7 @@ bool openFile(const QString &path) return QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -158,7 +158,7 @@ bool openFile(const QString &application, const QString &path, const QString &wo qDebug() << "Opening file" << path << "using" << application; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen([&]() { @@ -178,7 +178,7 @@ bool run(const QString &application, const QStringList &args, const QString &wor { qDebug() << "Running" << application << "with args" << args.join(' '); #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave return IndirectOpen([&]() @@ -203,7 +203,7 @@ bool openUrl(const QUrl &url) return QDesktopServices::openUrl(url); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -216,4 +216,13 @@ bool openUrl(const QUrl &url) #endif } +bool isFlatpak() +{ +#ifdef Q_OS_LINUX + return QFile::exists("/.flatpak-info"); +#else + return false; +#endif +} + } diff --git a/launcher/DesktopServices.h b/launcher/DesktopServices.h index 1c081da41..21c9cae0b 100644 --- a/launcher/DesktopServices.h +++ b/launcher/DesktopServices.h @@ -33,4 +33,6 @@ namespace DesktopServices * Open the URL, most likely in a browser. Maybe. */ bool openUrl(const QUrl &url); + + bool isFlatpak(); } diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 76cfccb0b..aaa75e6f1 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -44,6 +44,7 @@ #include #include #include +#include "DesktopServices.h" #if defined Q_OS_WIN32 #include @@ -228,6 +229,9 @@ bool trash(QString path, QString *pathInTrash = nullptr) #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) return false; #else + // FIXME: Figure out trash in Flatpak. Qt seemingly doesn't use the Trash portal + if (DesktopServices::isFlatpak()) + return false; return QFile::moveToTrash(path, pathInTrash); #endif } diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 536ab22e1..4ae7509cf 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -49,6 +49,7 @@ #include #include "Application.h" #include "BuildConfig.h" +#include "DesktopServices.h" #include "ui/themes/ITheme.h" #include @@ -143,7 +144,7 @@ void LauncherPage::on_instDirBrowseBtn_clicked() ui->instDirTextBox->setText(cooked_dir); } } - else if(APPLICATION->isFlatpak() && raw_dir.startsWith("/run/user")) + else if(DesktopServices::isFlatpak() && raw_dir.startsWith("/run/user")) { QMessageBox warning; warning.setText(tr("You're trying to specify an instance folder " From f2d445d27b1052a038cd94a5c514cee807abd894 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 30 Oct 2022 19:08:02 +0100 Subject: [PATCH 0060/1149] fix: fix undo key sequence Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 55f3e4f85..3b1779b7a 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -335,11 +335,10 @@ public: all_actions.append(&actionSettings); actionUndoTrashInstance = TranslatedAction(MainWindow); - connect(actionUndoTrashInstance, SIGNAL(triggered(bool)), MainWindow, SLOT(undoTrashInstance())); actionUndoTrashInstance->setObjectName(QStringLiteral("actionUndoTrashInstance")); actionUndoTrashInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "&Undo Last Instance Deletion")); actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); - actionUndoTrashInstance->setShortcut(QKeySequence("Ctrl+Z")); + actionUndoTrashInstance->setShortcut(QKeySequence::Undo); all_actions.append(&actionUndoTrashInstance); actionClearMetadata = TranslatedAction(MainWindow); @@ -1023,6 +1022,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow } } + connect(ui->actionUndoTrashInstance.operator->(), &QAction::triggered, this, &MainWindow::undoTrashInstance); + setSelectedInstanceById(APPLICATION->settings()->get("SelectedInstance").toString()); // removing this looks stupid From dfdf739282792ca646bb284b3d83b2d2265a9d55 Mon Sep 17 00:00:00 2001 From: Chrono Date: Mon, 31 Oct 2022 19:44:55 -0400 Subject: [PATCH 0061/1149] remove one space Signed-off-by: Chrono --- launcher/ui/pages/global/APIPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index 1ae788c7f..d56a9ef68 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -179,7 +179,7 @@ - Enter a custom client ID for Microsoft Authentication here. + Enter a custom client ID for Microsoft Authentication here. Qt::RichText From 028e086960402f685e07163def36d6b5eee1b796 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Mon, 24 Oct 2022 04:08:38 -0700 Subject: [PATCH 0062/1149] send blocked mod info to dialog & prototype UI Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../flame/FlameInstanceCreationTask.cpp | 18 +++++--- .../modpacksch/FTBPackInstallTask.cpp | 22 ++++++---- launcher/ui/dialogs/BlockedModsDialog.cpp | 42 +++++++++++++++++-- launcher/ui/dialogs/BlockedModsDialog.h | 16 ++++++- 4 files changed, 78 insertions(+), 20 deletions(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 48ac02e06..15e660a9d 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -372,13 +372,20 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) auto results = m_mod_id_resolver->getResults(); // first check for blocked mods - QString text; - QList urls; + QList blocked_mods; auto anyBlocked = false; for (const auto& result : results.files.values()) { if (!result.resolved || result.url.isEmpty()) { - text += QString("%1: %2
").arg(result.fileName, result.websiteUrl); - urls.append(QUrl(result.websiteUrl)); + + BlockedMod blocked_mod; + blocked_mod.name = result.fileName; + blocked_mod.websiteUrl = result.websiteUrl; + blocked_mod.hash = result.hash; + blocked_mod.matched = false; + blocked_mod.localPath = ""; + + blocked_mods.append(blocked_mod); + anyBlocked = true; } } @@ -388,8 +395,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked mods found"), tr("The following mods were blocked on third party launchers.
" "You will need to manually download them and add them to the modpack"), - text, - urls); + blocked_mods); message_dialog->setModal(true); if (message_dialog->exec()) { diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 7b112d8f9..75fda2086 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -176,8 +176,7 @@ void PackInstallTask::resolveMods() void PackInstallTask::onResolveModsSucceeded() { - QString text; - QList urls; + QList blocked_mods; auto anyBlocked = false; Flame::Manifest results = m_mod_id_resolver_task->getResults(); @@ -191,11 +190,19 @@ void PackInstallTask::onResolveModsSucceeded() // First check for blocked mods if (!results_file.resolved || results_file.url.isEmpty()) { - QString type(local_file.type); + // QString type(local_file.type); + + // type[0] = type[0].toUpper(); + + BlockedMod blocked_mod; + blocked_mod.name = local_file.name; + blocked_mod.websiteUrl = results_file.websiteUrl; + blocked_mod.hash = results_file.hash; + blocked_mod.matched = false; + blocked_mod.localPath = ""; + + blocked_mods.append(blocked_mod); - type[0] = type[0].toUpper(); - text += QString("%1: %2 - %3
").arg(type, local_file.name, results_file.websiteUrl); - urls.append(QUrl(results_file.websiteUrl)); anyBlocked = true; } else { local_file.url = results_file.url.toString(); @@ -210,8 +217,7 @@ void PackInstallTask::onResolveModsSucceeded() auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"), tr("The following files are not available for download in third party launchers.
" "You will need to manually download them and add them to the instance."), - text, - urls); + blocked_mods); if (message_dialog->exec() == QDialog::Accepted) createInstance(); diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index fe87b517c..e29f8eb3e 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -4,17 +4,22 @@ #include #include +#include -BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QString &body, const QList &urls) : - QDialog(parent), ui(new Ui::BlockedModsDialog), urls(urls) { + +BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QList &mods) : + QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) { ui->setupUi(this); auto openAllButton = ui->buttonBox->addButton(tr("Open All"), QDialogButtonBox::ActionRole); connect(openAllButton, &QPushButton::clicked, this, &BlockedModsDialog::openAll); + qDebug() << "Mods List: " << mods; + this->setWindowTitle(title); ui->label->setText(text); ui->textBrowser->setText(body); + update(); } BlockedModsDialog::~BlockedModsDialog() { @@ -22,7 +27,36 @@ BlockedModsDialog::~BlockedModsDialog() { } void BlockedModsDialog::openAll() { - for(auto &url : urls) { - QDesktopServices::openUrl(url); + for(auto &mod : mods) { + QDesktopServices::openUrl(mod.websiteUrl); } } + +void BlockedModsDialog::update() { + QString text; + QString span; + + for (auto &mod : mods) { + if (mod.matched) { + // ✔ -> html for HEAVY CHECK MARK : ✔ + span = QString(" ✔ Found at %1 ").arg(mod.localPath); + } else { + // ✘ -> html for HEAVY BALLOT X : ✘ + span = QString(" ✘ Not Found "); + } + text += QString("%1: %2

Hash: %3 %4


").arg(mod.name, mod.websiteUrl, mod.hash, span); + } + + ui->textBrowser->setText(text); +} + + +QDebug operator<<(QDebug debug, const BlockedMod &m) { + QDebugStateSaver saver(debug); + + debug.nospace() << "{ name: " << m.name << ", websiteUrl: " << m.websiteUrl + << ", hash: " << m.hash << ", matched: " << m.matched + << ", localPath: " << m.localPath <<"}"; + + return debug; +} \ No newline at end of file diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index 5f5bd61b7..4be020eca 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -3,6 +3,15 @@ #include +struct BlockedMod { + QString name; + QString websiteUrl; + QString hash; + bool matched; + QString localPath; + +}; + QT_BEGIN_NAMESPACE namespace Ui { class BlockedModsDialog; } QT_END_NAMESPACE @@ -11,12 +20,15 @@ class BlockedModsDialog : public QDialog { Q_OBJECT public: - BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QString &body, const QList &urls); + BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QList &mods); ~BlockedModsDialog() override; + private: Ui::BlockedModsDialog *ui; - const QList &urls; + const QList &mods; void openAll(); + void update(); }; + From 1598d6582473f1bb6aa02fd9b4dabc8210771e56 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 25 Oct 2022 01:19:19 -0700 Subject: [PATCH 0063/1149] watch filesystem, compute and match hashes Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/modplatform/helpers/HashUtils.cpp | 58 ++++++++++ launcher/modplatform/helpers/HashUtils.h | 15 +++ launcher/ui/dialogs/BlockedModsDialog.cpp | 120 ++++++++++++++++++++- launcher/ui/dialogs/BlockedModsDialog.h | 23 +++- 4 files changed, 212 insertions(+), 4 deletions(-) diff --git a/launcher/modplatform/helpers/HashUtils.cpp b/launcher/modplatform/helpers/HashUtils.cpp index a7bbaba50..bf53aa0e1 100644 --- a/launcher/modplatform/helpers/HashUtils.cpp +++ b/launcher/modplatform/helpers/HashUtils.cpp @@ -35,6 +35,18 @@ Hasher::Ptr createFlameHasher(QString file_path) return new FlameHasher(file_path); } +Hasher::Ptr createBlockedModHasher(QString file_path, ModPlatform::Provider provider) +{ + return new BlockedModHasher(file_path, provider); +} + +Hasher::Ptr createBlockedModHasher(QString file_path, ModPlatform::Provider provider, QString type) +{ + auto hasher = new BlockedModHasher(file_path, provider); + hasher->useHashType(type); + return hasher; +} + void ModrinthHasher::executeTask() { QFile file(m_path); @@ -78,4 +90,50 @@ void FlameHasher::executeTask() } } + +BlockedModHasher::BlockedModHasher(QString file_path, ModPlatform::Provider provider) + : Hasher(file_path), provider(provider) { + setObjectName(QString("BlockedModHasher: %1").arg(file_path)); + hash_type = ProviderCaps.hashType(provider).first(); +} + +void BlockedModHasher::executeTask() +{ + QFile file(m_path); + + try { + file.open(QFile::ReadOnly); + } catch (FS::FileSystemException& e) { + qCritical() << QString("Failed to open JAR file in %1").arg(m_path); + qCritical() << QString("Reason: ") << e.cause(); + + emitFailed("Failed to open file for hashing."); + return; + } + + m_hash = ProviderCaps.hash(provider, &file, hash_type); + + file.close(); + + if (m_hash.isEmpty()) { + emitFailed("Empty hash!"); + } else { + emitSucceeded(); + } +} + +QStringList BlockedModHasher::getHashTypes() { + return ProviderCaps.hashType(provider); +} + +bool BlockedModHasher::useHashType(QString type) { + auto types = ProviderCaps.hashType(provider); + if (types.contains(type)) { + hash_type = type; + return true; + } + qDebug() << "Bad hash type " << type << " for provider"; + return false; +} + } // namespace Hashing diff --git a/launcher/modplatform/helpers/HashUtils.h b/launcher/modplatform/helpers/HashUtils.h index 38fddf039..fa3244f6b 100644 --- a/launcher/modplatform/helpers/HashUtils.h +++ b/launcher/modplatform/helpers/HashUtils.h @@ -40,8 +40,23 @@ class ModrinthHasher : public Hasher { void executeTask() override; }; +class BlockedModHasher : public Hasher { + public: + BlockedModHasher(QString file_path, ModPlatform::Provider provider); + + void executeTask() override; + + QStringList getHashTypes(); + bool useHashType(QString type); + private: + ModPlatform::Provider provider; + QString hash_type; +}; + Hasher::Ptr createHasher(QString file_path, ModPlatform::Provider provider); Hasher::Ptr createFlameHasher(QString file_path); Hasher::Ptr createModrinthHasher(QString file_path); +Hasher::Ptr createBlockedModHasher(QString file_path, ModPlatform::Provider provider); +Hasher::Ptr createBlockedModHasher(QString file_path, ModPlatform::Provider provider, QString type); } // namespace Hashing diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index e29f8eb3e..9ba033d79 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,3 +1,6 @@ +#include +#include +#include "Application.h" #include "BlockedModsDialog.h" #include "ui_BlockedModsDialog.h" #include @@ -5,20 +8,29 @@ #include #include +#include -BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QList &mods) : + + +BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, QList &mods) : QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) { ui->setupUi(this); auto openAllButton = ui->buttonBox->addButton(tr("Open All"), QDialogButtonBox::ActionRole); connect(openAllButton, &QPushButton::clicked, this, &BlockedModsDialog::openAll); + connect(&watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); + + hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); + qDebug() << "Mods List: " << mods; + setupWatch(); + scanPaths(true); + this->setWindowTitle(title); ui->label->setText(text); - ui->textBrowser->setText(body); update(); } @@ -50,6 +62,110 @@ void BlockedModsDialog::update() { ui->textBrowser->setText(text); } +void BlockedModsDialog::directoryChanged(QString path) { + qDebug() << "Directory changed: " << path; + scanPath(path, false); +} + + +void BlockedModsDialog::setupWatch() { + const QString downloadsFolder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); + const QString modsFolder = APPLICATION->settings()->get("CentralModsDir").toString(); + watcher.addPath(downloadsFolder); + watcher.addPath(modsFolder); +} + +void BlockedModsDialog::scanPaths(bool init) { + for (auto &dir : watcher.directories()) { + scanPath(dir, init); + } +} + +void BlockedModsDialog::scanPath(QString path, bool init) { + + QDir scan_dir(path); + QDirIterator scan_it(path, QDir::Filter::Files | QDir::Filter::Hidden, QDirIterator::NoIteratorFlags); + while (scan_it.hasNext()) { + QString file = scan_it.next(); + + if (checked_paths.contains(file)){ + continue; + } + + if (!checkValidPath(file)) { + continue; + } + + auto hash_task = Hashing::createBlockedModHasher(file, ModPlatform::Provider::FLAME, "sha1"); + + qDebug() << "Creating Hash task for path: " << file; + + connect(hash_task.get(), &Task::succeeded, [this, hash_task, file] { + checkMatchHash(hash_task->getResult(), file); + }); + connect(hash_task.get(), &Task::failed, [this, hash_task, file] { + qDebug() << "Failed to hash path: " << file; + }); + + if (init) { + checked_paths.insert(file); + } + + hashing_task->addTask(hash_task); + } + + hashing_task->start(); + +} + +void BlockedModsDialog::checkMatchHash(QString hash, QString path) { + bool match = false; + + qDebug() << "Checking for match on hash: " << hash << " | From path:" << path; + + for (auto &mod : mods) { + if (mod.matched) { + continue; + } + if (mod.hash.compare(hash, Qt::CaseInsensitive) == 0) { + mod.matched = true; + mod.localPath = path; + match = true; + + qDebug() << "Hash match found: " << mod.name << " " << hash << " | From path:" << path; + + break; + } + } + + if (match) { + update(); + } +} + +bool BlockedModsDialog::checkValidPath(QString path) { + + QFileInfo file = QFileInfo(path); + QString filename = file.fileName(); + + for (auto &mod : mods) { + if (mod.name.compare(filename, Qt::CaseInsensitive) == 0) { + qDebug() << "Name match found: " << mod.name << " | From path:" << path; + return true; + } + } + + return false; +} + +bool BlockedModsDialog::allModsMatched() { + for (auto &mod : mods) { + if (!mod.matched) + return false; + } + return true; +} + QDebug operator<<(QDebug debug, const BlockedMod &m) { QDebugStateSaver saver(debug); diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index 4be020eca..f1ea99ca0 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -1,7 +1,14 @@ #pragma once #include +#include +#include +#include + +#include "modplatform/helpers/HashUtils.h" + +#include "tasks/ConcurrentTask.h" struct BlockedMod { QString name; @@ -20,15 +27,27 @@ class BlockedModsDialog : public QDialog { Q_OBJECT public: - BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, const QList &mods); + BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, QList &mods); ~BlockedModsDialog() override; private: Ui::BlockedModsDialog *ui; - const QList &mods; + QList &mods; + QFileSystemWatcher watcher; + shared_qobject_ptr hashing_task; + QSet checked_paths; + void openAll(); void update(); + void directoryChanged(QString path); + void setupWatch(); + void scanPaths(bool init); + void scanPath(QString path, bool init); + void checkMatchHash(QString hash, QString path); + + bool checkValidPath(QString path); + bool allModsMatched(); }; From 13c7efa0584caf34950a6e6efa4b8e3bee16d764 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:59:37 -0700 Subject: [PATCH 0064/1149] copy found mods to instance (FTB and Flame) Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/FileSystem.cpp | 22 +++++++++ launcher/FileSystem.h | 2 + .../flame/FlameInstanceCreationTask.cpp | 35 +++++++++++++- .../flame/FlameInstanceCreationTask.h | 3 ++ .../modpacksch/FTBPackInstallTask.cpp | 46 +++++++++++++++++-- .../modpacksch/FTBPackInstallTask.h | 3 ++ launcher/ui/dialogs/BlockedModsDialog.cpp | 7 +++ launcher/ui/dialogs/BlockedModsDialog.h | 1 + launcher/ui/dialogs/BlockedModsDialog.ui | 37 +++++++++------ 9 files changed, 137 insertions(+), 19 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4026d6c16..4285fa876 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -163,6 +163,28 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } +bool copyFile(QString &src, QString &dst) { + using copy_opts = fs::copy_options; + + std::error_code err; + + fs::copy_options opt = copy_opts::none; + // The default behavior is to follow symlinks + opt |= copy_opts::copy_symlinks; + + ensureFilePathExists(dst); + + fs::copy(toStdString(src), toStdString(dst), opt, err); + if (err) { + qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); + qDebug() << "Source file:" << src; + qDebug() << "Destination file:" << dst; + } + + return err.value() == 0; + +} + bool copy::operator()(const QString& offset) { using copy_opts = fs::copy_options; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index b46f32812..68f6bc4c8 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -75,6 +75,8 @@ bool ensureFilePathExists(QString filenamepath); */ bool ensureFolderPathExists(QString filenamepath); +bool copyFile(QString &src, QString &dst); + class copy { public: copy(const QString& src, const QString& dst) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 15e660a9d..fbc4ecf30 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -399,6 +399,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) message_dialog->setModal(true); if (message_dialog->exec()) { + copyBlockedMods(blocked_mods); setupDownloadJob(loop); } else { m_mod_id_resolver.reset(); @@ -410,6 +411,36 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) } } +void FlameCreationTask::copyBlockedMods(QList blocked_mods) { + + setStatus(tr("Copying Blocked Mods...")); + setAbortable(false); + int i = 0; + int total = blocked_mods.length(); + setProgress(i, total); + for (auto mod = blocked_mods.begin(); mod != blocked_mods.end(); mod++, i++) { + + if (!mod->matched) { + qDebug() << mod->name << "was not matched to a local file, skipping copy"; + continue; + } + + auto dest_path = FS::PathCombine(m_stagingPath, "minecraft", "mods", mod->name); + + setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total))); + + qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; + + if (!FS::copyFile(mod->localPath, dest_path)) { + qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; + } + + setProgress(i+1, total); + } + + setAbortable(true); +} + void FlameCreationTask::setupDownloadJob(QEventLoop& loop) { m_files_job = new NetJob(tr("Mod download"), APPLICATION->network()); @@ -455,7 +486,9 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) m_files_job.reset(); setError(reason); }); - connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { setProgress(current, total); }); + connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { + setProgress(current, total); + }); connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); setStatus(tr("Downloading mods...")); diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.h b/launcher/modplatform/flame/FlameInstanceCreationTask.h index ded0e2ceb..69a8f1ab4 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.h +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.h @@ -10,6 +10,8 @@ #include "net/NetJob.h" +#include "ui/dialogs/BlockedModsDialog.h" + class FlameCreationTask final : public InstanceCreationTask { Q_OBJECT @@ -29,6 +31,7 @@ class FlameCreationTask final : public InstanceCreationTask { private slots: void idResolverSucceeded(QEventLoop&); void setupDownloadJob(QEventLoop&); + void copyBlockedMods(QList blocked_mods); private: QWidget* m_parent = nullptr; diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 75fda2086..f6bf24880 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -176,7 +176,6 @@ void PackInstallTask::resolveMods() void PackInstallTask::onResolveModsSucceeded() { - QList blocked_mods; auto anyBlocked = false; Flame::Manifest results = m_mod_id_resolver_task->getResults(); @@ -201,7 +200,7 @@ void PackInstallTask::onResolveModsSucceeded() blocked_mod.matched = false; blocked_mod.localPath = ""; - blocked_mods.append(blocked_mod); + m_blocked_mods.append(blocked_mod); anyBlocked = true; } else { @@ -217,12 +216,16 @@ void PackInstallTask::onResolveModsSucceeded() auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"), tr("The following files are not available for download in third party launchers.
" "You will need to manually download them and add them to the instance."), - blocked_mods); + m_blocked_mods); - if (message_dialog->exec() == QDialog::Accepted) + if (message_dialog->exec() == QDialog::Accepted) { + qDebug() << "Post dialog mods list: " << m_blocked_mods; createInstance(); - else + } + else { abort(); + } + } else { createInstance(); } @@ -326,6 +329,9 @@ void PackInstallTask::downloadPack() void PackInstallTask::onModDownloadSucceeded() { m_net_job.reset(); + if (m_blocked_mods.length() > 0) { + copyBlockedMods(); + } emitSucceeded(); } @@ -349,4 +355,34 @@ void PackInstallTask::onModDownloadFailed(QString reason) emitFailed(reason); } +void PackInstallTask::copyBlockedMods() { + + setStatus(tr("Copying Blocked Mods...")); + setAbortable(false); + int i = 0; + int total = m_blocked_mods.length(); + setProgress(i, total); + for (auto mod = m_blocked_mods.begin(); mod != m_blocked_mods.end(); mod++, i++) { + + if (!mod->matched) { + qDebug() << mod->name << "was not matched to a local file, skipping copy"; + continue; + } + + auto dest_path = FS::PathCombine(m_stagingPath, ".minecraft", "mods", mod->name); + + setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total))); + + qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; + + if (!FS::copyFile(mod->localPath, dest_path)) { + qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; + } + + setProgress(i+1, total); + } + + setAbortable(true); +} + } // namespace ModpacksCH diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.h b/launcher/modplatform/modpacksch/FTBPackInstallTask.h index 7c6fbeb93..2cd4d7296 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.h +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.h @@ -43,6 +43,7 @@ #include "QObjectPtr.h" #include "modplatform/flame/FileResolvingTask.h" #include "net/NetJob.h" +#include "ui/dialogs/BlockedModsDialog.h" #include @@ -76,6 +77,7 @@ private: void resolveMods(); void createInstance(); void downloadPack(); + void copyBlockedMods(); private: NetJob::Ptr m_net_job = nullptr; @@ -90,6 +92,7 @@ private: Version m_version; QMap m_files_to_copy; + QList m_blocked_mods; //FIXME: nuke QWidget* m_parent; diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 9ba033d79..542d06815 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -31,6 +31,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons this->setWindowTitle(title); ui->label->setText(text); + ui->labelModsFound->setText("Please download the missing mods."); update(); } @@ -60,6 +61,12 @@ void BlockedModsDialog::update() { } ui->textBrowser->setText(text); + + if (allModsMatched()) { + ui->labelModsFound->setText("All mods found ✔"); + } else { + ui->labelModsFound->setText("Please download the missing mods."); + } } void BlockedModsDialog::directoryChanged(QString path) { diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index f1ea99ca0..93b9f46a6 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -51,3 +51,4 @@ private: bool allModsMatched(); }; +QDebug operator<<(QDebug debug, const BlockedMod &m); \ No newline at end of file diff --git a/launcher/ui/dialogs/BlockedModsDialog.ui b/launcher/ui/dialogs/BlockedModsDialog.ui index f4ae95b69..371549cf4 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.ui +++ b/launcher/ui/dialogs/BlockedModsDialog.ui @@ -13,8 +13,8 @@ BlockedModsDialog - - + + @@ -24,17 +24,7 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - + true @@ -44,6 +34,27 @@ + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + +
From e9d4793b1e98944dad910b3952c117bb2d3369de Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 25 Oct 2022 20:18:14 -0700 Subject: [PATCH 0065/1149] minor clean up and add some docs Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/FileSystem.cpp | 7 ++++ launcher/FileSystem.h | 1 + .../flame/FlameInstanceCreationTask.cpp | 2 + .../modpacksch/FTBPackInstallTask.cpp | 4 +- launcher/ui/dialogs/BlockedModsDialog.cpp | 42 +++++++++++-------- launcher/ui/dialogs/BlockedModsDialog.h | 5 +-- 6 files changed, 38 insertions(+), 23 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4285fa876..8fe441b31 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -163,6 +163,10 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } +/// @brief Copy file at src to dest, ensures the full filepath exsists +/// @param src srouce file path +/// @param dst destination file path +/// @return boolean: was there an error during the filecopy? bool copyFile(QString &src, QString &dst) { using copy_opts = fs::copy_options; @@ -185,6 +189,9 @@ bool copyFile(QString &src, QString &dst) { } +/// @brief Copies a directory and it's contents from src to dest +/// @param offset subdirectory form src to copy to dest +/// @return if there was an error during the filecopy bool copy::operator()(const QString& offset) { using copy_opts = fs::copy_options; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index 68f6bc4c8..ab006d48a 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -77,6 +77,7 @@ bool ensureFolderPathExists(QString filenamepath); bool copyFile(QString &src, QString &dst); +/// @brief Copies a directory and it's contents from src to dest class copy { public: copy(const QString& src, const QString& dst) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index fbc4ecf30..edacb8197 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -411,6 +411,8 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) } } +/// @brief copy the matched blocked mods to the instance staging area +/// @param blocked_mods list of the blocked mods and their matched paths void FlameCreationTask::copyBlockedMods(QList blocked_mods) { setStatus(tr("Copying Blocked Mods...")); diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index f6bf24880..49fbafd67 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -189,9 +189,6 @@ void PackInstallTask::onResolveModsSucceeded() // First check for blocked mods if (!results_file.resolved || results_file.url.isEmpty()) { - // QString type(local_file.type); - - // type[0] = type[0].toUpper(); BlockedMod blocked_mod; blocked_mod.name = local_file.name; @@ -355,6 +352,7 @@ void PackInstallTask::onModDownloadFailed(QString reason) emitFailed(reason); } +/// @brief copy the matched blocked mods to the instance staging area void PackInstallTask::copyBlockedMods() { setStatus(tr("Copying Blocked Mods...")); diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 542d06815..f5bc7f735 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,5 +1,3 @@ -#include -#include #include "Application.h" #include "BlockedModsDialog.h" #include "ui_BlockedModsDialog.h" @@ -27,7 +25,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons qDebug() << "Mods List: " << mods; setupWatch(); - scanPaths(true); + scanPaths(); this->setWindowTitle(title); ui->label->setText(text); @@ -45,6 +43,7 @@ void BlockedModsDialog::openAll() { } } +/// @brief update UI with current status of the blocked mod detection void BlockedModsDialog::update() { QString text; QString span; @@ -69,12 +68,15 @@ void BlockedModsDialog::update() { } } +/// @brief Signal fired when a watched direcotry has changed +/// @param path the path to the changed directory void BlockedModsDialog::directoryChanged(QString path) { qDebug() << "Directory changed: " << path; - scanPath(path, false); + scanPath(path); } +/// @brief add the user downloads folder and the global mods folder to the filesystem watcher void BlockedModsDialog::setupWatch() { const QString downloadsFolder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); const QString modsFolder = APPLICATION->settings()->get("CentralModsDir").toString(); @@ -82,23 +84,24 @@ void BlockedModsDialog::setupWatch() { watcher.addPath(modsFolder); } -void BlockedModsDialog::scanPaths(bool init) { + +/// @brief scan all watched folder +void BlockedModsDialog::scanPaths() { for (auto &dir : watcher.directories()) { - scanPath(dir, init); + scanPath(dir); } } -void BlockedModsDialog::scanPath(QString path, bool init) { +/// @brief Scan the directory at path, skip paths that do not contain a file name +/// of a blocked mod we are looking for +/// @param path the directory to scan +void BlockedModsDialog::scanPath(QString path) { QDir scan_dir(path); QDirIterator scan_it(path, QDir::Filter::Files | QDir::Filter::Hidden, QDirIterator::NoIteratorFlags); while (scan_it.hasNext()) { QString file = scan_it.next(); - if (checked_paths.contains(file)){ - continue; - } - if (!checkValidPath(file)) { continue; } @@ -113,10 +116,6 @@ void BlockedModsDialog::scanPath(QString path, bool init) { connect(hash_task.get(), &Task::failed, [this, hash_task, file] { qDebug() << "Failed to hash path: " << file; }); - - if (init) { - checked_paths.insert(file); - } hashing_task->addTask(hash_task); } @@ -125,6 +124,10 @@ void BlockedModsDialog::scanPath(QString path, bool init) { } +/// @brief check if the conputed hash for the provided path matches a blocked +/// mod we are looking for +/// @param hash the computed hash for the provided path +/// @param path the path to the local file being compared void BlockedModsDialog::checkMatchHash(QString hash, QString path) { bool match = false; @@ -150,6 +153,9 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) { } } +/// @brief Check if the name of the file at path matches the naem of a blocked mod we are searching for +/// @param path the path to check +/// @return boolean: did the path match the name of a blocked mod? bool BlockedModsDialog::checkValidPath(QString path) { QFileInfo file = QFileInfo(path); @@ -165,6 +171,8 @@ bool BlockedModsDialog::checkValidPath(QString path) { return false; } +/// @brief have we found all the mods we're lookign for? +/// @return boolean bool BlockedModsDialog::allModsMatched() { for (auto &mod : mods) { if (!mod.matched) @@ -173,7 +181,7 @@ bool BlockedModsDialog::allModsMatched() { return true; } - +/// qDebug print support for the BlockedMod struct QDebug operator<<(QDebug debug, const BlockedMod &m) { QDebugStateSaver saver(debug); @@ -182,4 +190,4 @@ QDebug operator<<(QDebug debug, const BlockedMod &m) { << ", localPath: " << m.localPath <<"}"; return debug; -} \ No newline at end of file +} diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index 93b9f46a6..cf1d3b3d5 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -37,14 +37,13 @@ private: QList &mods; QFileSystemWatcher watcher; shared_qobject_ptr hashing_task; - QSet checked_paths; void openAll(); void update(); void directoryChanged(QString path); void setupWatch(); - void scanPaths(bool init); - void scanPath(QString path, bool init); + void scanPaths(); + void scanPath(QString path); void checkMatchHash(QString hash, QString path); bool checkValidPath(QString path); From d2f3dbaa2984b70a71e5fb1b246a31987a6fdf10 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 30 Oct 2022 22:39:12 -0700 Subject: [PATCH 0066/1149] fix mispellings and wrap strings for translation Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/BlockedModsDialog.cpp | 18 ++++++++---------- launcher/ui/dialogs/BlockedModsDialog.h | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index f5bc7f735..136a7371b 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -29,7 +29,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons this->setWindowTitle(title); ui->label->setText(text); - ui->labelModsFound->setText("Please download the missing mods."); + ui->labelModsFound->setText(tr("Please download the missing mods.")); update(); } @@ -51,20 +51,20 @@ void BlockedModsDialog::update() { for (auto &mod : mods) { if (mod.matched) { // ✔ -> html for HEAVY CHECK MARK : ✔ - span = QString(" ✔ Found at %1 ").arg(mod.localPath); + span = QString(tr(" ✔ Found at %1 ")).arg(mod.localPath); } else { // ✘ -> html for HEAVY BALLOT X : ✘ - span = QString(" ✘ Not Found "); + span = QString(tr(" ✘ Not Found ")); } - text += QString("%1: %2

Hash: %3 %4


").arg(mod.name, mod.websiteUrl, mod.hash, span); + text += QString(tr("%1: %2

Hash: %3 %4


")).arg(mod.name, mod.websiteUrl, mod.hash, span); } ui->textBrowser->setText(text); if (allModsMatched()) { - ui->labelModsFound->setText("All mods found ✔"); + ui->labelModsFound->setText(tr("All mods found ✔")); } else { - ui->labelModsFound->setText("Please download the missing mods."); + ui->labelModsFound->setText(tr("Please download the missing mods.")); } } @@ -124,7 +124,7 @@ void BlockedModsDialog::scanPath(QString path) { } -/// @brief check if the conputed hash for the provided path matches a blocked +/// @brief check if the computed hash for the provided path matches a blocked /// mod we are looking for /// @param hash the computed hash for the provided path /// @param path the path to the local file being compared @@ -153,7 +153,7 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) { } } -/// @brief Check if the name of the file at path matches the naem of a blocked mod we are searching for +/// @brief Check if the name of the file at path matches the name of a blocked mod we are searching for /// @param path the path to check /// @return boolean: did the path match the name of a blocked mod? bool BlockedModsDialog::checkValidPath(QString path) { @@ -171,8 +171,6 @@ bool BlockedModsDialog::checkValidPath(QString path) { return false; } -/// @brief have we found all the mods we're lookign for? -/// @return boolean bool BlockedModsDialog::allModsMatched() { for (auto &mod : mods) { if (!mod.matched) diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index cf1d3b3d5..0a5c90db0 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -50,4 +50,4 @@ private: bool allModsMatched(); }; -QDebug operator<<(QDebug debug, const BlockedMod &m); \ No newline at end of file +QDebug operator<<(QDebug debug, const BlockedMod &m); From fda2c116bef33df2ca49d77ff4b016e724f47549 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 30 Oct 2022 22:42:35 -0700 Subject: [PATCH 0067/1149] code quality cleanup Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/FileSystem.cpp | 2 +- launcher/FileSystem.h | 2 +- .../flame/FlameInstanceCreationTask.cpp | 23 +++++++++---------- .../flame/FlameInstanceCreationTask.h | 2 +- .../modpacksch/FTBPackInstallTask.cpp | 2 +- 5 files changed, 15 insertions(+), 16 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 8fe441b31..508da08d4 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -167,7 +167,7 @@ bool ensureFolderPathExists(QString foldernamepath) /// @param src srouce file path /// @param dst destination file path /// @return boolean: was there an error during the filecopy? -bool copyFile(QString &src, QString &dst) { +bool copyFile(QString const& src, QString const& dst) { using copy_opts = fs::copy_options; std::error_code err; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index ab006d48a..771bda605 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -75,7 +75,7 @@ bool ensureFilePathExists(QString filenamepath); */ bool ensureFolderPathExists(QString filenamepath); -bool copyFile(QString &src, QString &dst); +bool copyFile(QString const& src, QString const& dst); /// @brief Copies a directory and it's contents from src to dest class copy { diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index edacb8197..30438a1a5 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -413,31 +413,32 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) /// @brief copy the matched blocked mods to the instance staging area /// @param blocked_mods list of the blocked mods and their matched paths -void FlameCreationTask::copyBlockedMods(QList blocked_mods) { +void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) { setStatus(tr("Copying Blocked Mods...")); setAbortable(false); int i = 0; int total = blocked_mods.length(); setProgress(i, total); - for (auto mod = blocked_mods.begin(); mod != blocked_mods.end(); mod++, i++) { + for (auto &mod : blocked_mods) { - if (!mod->matched) { - qDebug() << mod->name << "was not matched to a local file, skipping copy"; + if (!mod.matched) { + qDebug() << mod.name << "was not matched to a local file, skipping copy"; continue; } - auto dest_path = FS::PathCombine(m_stagingPath, "minecraft", "mods", mod->name); + auto dest_path = FS::PathCombine(m_stagingPath, "minecraft", "mods", mod.name); setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total))); - qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; + qDebug() << "Will try to copy" << mod.localPath << "to" << dest_path; - if (!FS::copyFile(mod->localPath, dest_path)) { - qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; + if (!FS::copyFile(mod.localPath, dest_path)) { // FIXME: use FS::copy once #333 is merged + qDebug() << "Copy of" << mod.localPath << "to" << dest_path << "Failed"; } - setProgress(i+1, total); + i++; + setProgress(i, total); } setAbortable(true); @@ -488,9 +489,7 @@ void FlameCreationTask::setupDownloadJob(QEventLoop& loop) m_files_job.reset(); setError(reason); }); - connect(m_files_job.get(), &NetJob::progress, [&](qint64 current, qint64 total) { - setProgress(current, total); - }); + connect(m_files_job.get(), &NetJob::progress, this, &FlameCreationTask::setProgress); connect(m_files_job.get(), &NetJob::finished, &loop, &QEventLoop::quit); setStatus(tr("Downloading mods...")); diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.h b/launcher/modplatform/flame/FlameInstanceCreationTask.h index 69a8f1ab4..fbc7d5bf7 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.h +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.h @@ -31,7 +31,7 @@ class FlameCreationTask final : public InstanceCreationTask { private slots: void idResolverSucceeded(QEventLoop&); void setupDownloadJob(QEventLoop&); - void copyBlockedMods(QList blocked_mods); + void copyBlockedMods(QList const& blocked_mods); private: QWidget* m_parent = nullptr; diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 49fbafd67..5091db0ca 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -326,7 +326,7 @@ void PackInstallTask::downloadPack() void PackInstallTask::onModDownloadSucceeded() { m_net_job.reset(); - if (m_blocked_mods.length() > 0) { + if (!m_blocked_mods.isEmpty()) { copyBlockedMods(); } emitSucceeded(); From a7a331a26e43df3dbafdbb29a59d38ba807ffa7d Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 30 Oct 2022 22:49:54 -0700 Subject: [PATCH 0068/1149] ensure FS::copyFile is marked for removal Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/FileSystem.h | 1 + launcher/modplatform/modpacksch/FTBPackInstallTask.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index 771bda605..11981f68f 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -75,6 +75,7 @@ bool ensureFilePathExists(QString filenamepath); */ bool ensureFolderPathExists(QString filenamepath); +// TODO: remove in favor of FS::copy once #333 is merged bool copyFile(QString const& src, QString const& dst); /// @brief Copies a directory and it's contents from src to dest diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 5091db0ca..06ef1deb6 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -373,7 +373,7 @@ void PackInstallTask::copyBlockedMods() { qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; - if (!FS::copyFile(mod->localPath, dest_path)) { + if (!FS::copyFile(mod->localPath, dest_path)) { // FIXME: use FS::copy once #333 is merged qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; } From 6010ce0dc587527caa05bdc9b4cecdb9bd811375 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 1 Nov 2022 04:28:57 -0700 Subject: [PATCH 0069/1149] chore(remove FS::copyFile): Now that #333 is merged and FS::copy works on non directory copyFile can be removed. Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/FileSystem.cpp | 26 ------------------- launcher/FileSystem.h | 3 --- .../flame/FlameInstanceCreationTask.cpp | 2 +- .../modpacksch/FTBPackInstallTask.cpp | 2 +- 4 files changed, 2 insertions(+), 31 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 508da08d4..bf0849ec3 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -163,32 +163,6 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } -/// @brief Copy file at src to dest, ensures the full filepath exsists -/// @param src srouce file path -/// @param dst destination file path -/// @return boolean: was there an error during the filecopy? -bool copyFile(QString const& src, QString const& dst) { - using copy_opts = fs::copy_options; - - std::error_code err; - - fs::copy_options opt = copy_opts::none; - // The default behavior is to follow symlinks - opt |= copy_opts::copy_symlinks; - - ensureFilePathExists(dst); - - fs::copy(toStdString(src), toStdString(dst), opt, err); - if (err) { - qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); - qDebug() << "Source file:" << src; - qDebug() << "Destination file:" << dst; - } - - return err.value() == 0; - -} - /// @brief Copies a directory and it's contents from src to dest /// @param offset subdirectory form src to copy to dest /// @return if there was an error during the filecopy diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index 11981f68f..b7e175fdf 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -75,9 +75,6 @@ bool ensureFilePathExists(QString filenamepath); */ bool ensureFolderPathExists(QString filenamepath); -// TODO: remove in favor of FS::copy once #333 is merged -bool copyFile(QString const& src, QString const& dst); - /// @brief Copies a directory and it's contents from src to dest class copy { public: diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 30438a1a5..5d4dc689f 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -433,7 +433,7 @@ void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) { qDebug() << "Will try to copy" << mod.localPath << "to" << dest_path; - if (!FS::copyFile(mod.localPath, dest_path)) { // FIXME: use FS::copy once #333 is merged + if (!FS::copy(mod.localPath, dest_path)()) { qDebug() << "Copy of" << mod.localPath << "to" << dest_path << "Failed"; } diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 06ef1deb6..1e4bbe19b 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -373,7 +373,7 @@ void PackInstallTask::copyBlockedMods() { qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; - if (!FS::copyFile(mod->localPath, dest_path)) { // FIXME: use FS::copy once #333 is merged + if (!FS::copy(mod->localPath, dest_path)()) { qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; } From b142e2a7a75171da4c5bad9be17aa1bc52676b67 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 1 Nov 2022 13:59:11 +0100 Subject: [PATCH 0070/1149] fix: fix logo name Signed-off-by: Sefa Eyeoglu --- program_info/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index f064e0984..b0507816b 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -21,12 +21,12 @@ set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) set(Launcher_ConfigFile "prismlauncher.cfg" PARENT_SCOPE) set(Launcher_Git "https://github.com/PrismLauncher/PrismLauncher" PARENT_SCOPE) -set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop") -set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg") +set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) -set(Launcher_Desktop "program_info/${Launcher_DesktopFileName}" PARENT_SCOPE) +set(Launcher_Desktop "program_info/org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) set(Launcher_MetaInfo "program_info/org.prismlauncher.PrismLauncher.metainfo.xml" PARENT_SCOPE) -set(Launcher_SVG "program_info/${Launcher_SVGFileName}" PARENT_SCOPE) +set(Launcher_SVG "program_info/org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) set(Launcher_Branding_ICNS "program_info/prismlauncher.icns" PARENT_SCOPE) set(Launcher_Branding_ICO "program_info/prismlauncher.ico") set(Launcher_Branding_ICO "${Launcher_Branding_ICO}" PARENT_SCOPE) From 209a1650e489e21417ce2e1a29862703d51a2cd0 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 1 Nov 2022 07:06:36 -0700 Subject: [PATCH 0071/1149] clang_format and code cleanup Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../flame/FlameInstanceCreationTask.cpp | 11 +-- .../modpacksch/FTBPackInstallTask.cpp | 24 ++--- launcher/ui/dialogs/BlockedModsDialog.cpp | 95 +++++++++---------- 3 files changed, 62 insertions(+), 68 deletions(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 5d4dc689f..f86e9335d 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -413,15 +413,14 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) /// @brief copy the matched blocked mods to the instance staging area /// @param blocked_mods list of the blocked mods and their matched paths -void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) { - +void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) +{ setStatus(tr("Copying Blocked Mods...")); setAbortable(false); int i = 0; int total = blocked_mods.length(); setProgress(i, total); - for (auto &mod : blocked_mods) { - + for (auto const& mod : blocked_mods) { if (!mod.matched) { qDebug() << mod.name << "was not matched to a local file, skipping copy"; continue; @@ -433,9 +432,9 @@ void FlameCreationTask::copyBlockedMods(QList const& blocked_mods) { qDebug() << "Will try to copy" << mod.localPath << "to" << dest_path; - if (!FS::copy(mod.localPath, dest_path)()) { + if (!FS::copy(mod.localPath, dest_path)()) { qDebug() << "Copy of" << mod.localPath << "to" << dest_path << "Failed"; - } + } i++; setProgress(i, total); diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 1e4bbe19b..70ef75716 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -353,31 +353,31 @@ void PackInstallTask::onModDownloadFailed(QString reason) } /// @brief copy the matched blocked mods to the instance staging area -void PackInstallTask::copyBlockedMods() { - +void PackInstallTask::copyBlockedMods() +{ setStatus(tr("Copying Blocked Mods...")); setAbortable(false); int i = 0; int total = m_blocked_mods.length(); setProgress(i, total); - for (auto mod = m_blocked_mods.begin(); mod != m_blocked_mods.end(); mod++, i++) { - - if (!mod->matched) { - qDebug() << mod->name << "was not matched to a local file, skipping copy"; + for (auto const& mod : m_blocked_mods) { + if (!mod.matched) { + qDebug() << mod.name << "was not matched to a local file, skipping copy"; continue; } - auto dest_path = FS::PathCombine(m_stagingPath, ".minecraft", "mods", mod->name); + auto dest_path = FS::PathCombine(m_stagingPath, ".minecraft", "mods", mod.name); setStatus(tr("Copying Blocked Mods (%1 out of %2 are done)").arg(QString::number(i), QString::number(total))); - qDebug() << "Will try to copy" << mod->localPath << "to" << dest_path; + qDebug() << "Will try to copy" << mod.localPath << "to" << dest_path; - if (!FS::copy(mod->localPath, dest_path)()) { - qDebug() << "Copy of" << mod->localPath << "to" << dest_path << "Failed"; - } + if (!FS::copy(mod.localPath, dest_path)()) { + qDebug() << "Copy of" << mod.localPath << "to" << dest_path << "Failed"; + } - setProgress(i+1, total); + i++; + setProgress(i, total); } setAbortable(true); diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 136a7371b..2cf942500 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,18 +1,16 @@ -#include "Application.h" #include "BlockedModsDialog.h" -#include "ui_BlockedModsDialog.h" -#include -#include #include +#include +#include +#include "Application.h" +#include "ui_BlockedModsDialog.h" #include #include - - - -BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, const QString &text, QList &mods) : - QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) { +BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList& mods) + : QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) +{ ui->setupUi(this); auto openAllButton = ui->buttonBox->addButton(tr("Open All"), QDialogButtonBox::ActionRole); @@ -21,7 +19,7 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons connect(&watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); - + qDebug() << "Mods List: " << mods; setupWatch(); @@ -33,22 +31,25 @@ BlockedModsDialog::BlockedModsDialog(QWidget *parent, const QString &title, cons update(); } -BlockedModsDialog::~BlockedModsDialog() { +BlockedModsDialog::~BlockedModsDialog() +{ delete ui; } -void BlockedModsDialog::openAll() { - for(auto &mod : mods) { +void BlockedModsDialog::openAll() +{ + for (auto& mod : mods) { QDesktopServices::openUrl(mod.websiteUrl); } } /// @brief update UI with current status of the blocked mod detection -void BlockedModsDialog::update() { +void BlockedModsDialog::update() +{ QString text; QString span; - for (auto &mod : mods) { + for (auto& mod : mods) { if (mod.matched) { // ✔ -> html for HEAVY CHECK MARK : ✔ span = QString(tr(" ✔ Found at %1 ")).arg(mod.localPath); @@ -70,33 +71,34 @@ void BlockedModsDialog::update() { /// @brief Signal fired when a watched direcotry has changed /// @param path the path to the changed directory -void BlockedModsDialog::directoryChanged(QString path) { +void BlockedModsDialog::directoryChanged(QString path) +{ qDebug() << "Directory changed: " << path; scanPath(path); } - /// @brief add the user downloads folder and the global mods folder to the filesystem watcher -void BlockedModsDialog::setupWatch() { +void BlockedModsDialog::setupWatch() +{ const QString downloadsFolder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); const QString modsFolder = APPLICATION->settings()->get("CentralModsDir").toString(); watcher.addPath(downloadsFolder); watcher.addPath(modsFolder); } - /// @brief scan all watched folder -void BlockedModsDialog::scanPaths() { - for (auto &dir : watcher.directories()) { +void BlockedModsDialog::scanPaths() +{ + for (auto& dir : watcher.directories()) { scanPath(dir); } } -/// @brief Scan the directory at path, skip paths that do not contain a file name +/// @brief Scan the directory at path, skip paths that do not contain a file name /// of a blocked mod we are looking for /// @param path the directory to scan -void BlockedModsDialog::scanPath(QString path) { - +void BlockedModsDialog::scanPath(QString path) +{ QDir scan_dir(path); QDirIterator scan_it(path, QDir::Filter::Files | QDir::Filter::Hidden, QDirIterator::NoIteratorFlags); while (scan_it.hasNext()) { @@ -110,30 +112,26 @@ void BlockedModsDialog::scanPath(QString path) { qDebug() << "Creating Hash task for path: " << file; - connect(hash_task.get(), &Task::succeeded, [this, hash_task, file] { - checkMatchHash(hash_task->getResult(), file); - }); - connect(hash_task.get(), &Task::failed, [this, hash_task, file] { - qDebug() << "Failed to hash path: " << file; - }); - + connect(hash_task.get(), &Task::succeeded, [this, hash_task, file] { checkMatchHash(hash_task->getResult(), file); }); + connect(hash_task.get(), &Task::failed, [file] { qDebug() << "Failed to hash path: " << file; }); + hashing_task->addTask(hash_task); } hashing_task->start(); - } /// @brief check if the computed hash for the provided path matches a blocked /// mod we are looking for /// @param hash the computed hash for the provided path /// @param path the path to the local file being compared -void BlockedModsDialog::checkMatchHash(QString hash, QString path) { +void BlockedModsDialog::checkMatchHash(QString hash, QString path) +{ bool match = false; - qDebug() << "Checking for match on hash: " << hash << " | From path:" << path; + qDebug() << "Checking for match on hash: " << hash << "| From path:" << path; - for (auto &mod : mods) { + for (auto& mod : mods) { if (mod.matched) { continue; } @@ -142,7 +140,7 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) { mod.localPath = path; match = true; - qDebug() << "Hash match found: " << mod.name << " " << hash << " | From path:" << path; + qDebug() << "Hash match found:" << mod.name << hash << "| From path:" << path; break; } @@ -156,14 +154,14 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) { /// @brief Check if the name of the file at path matches the name of a blocked mod we are searching for /// @param path the path to check /// @return boolean: did the path match the name of a blocked mod? -bool BlockedModsDialog::checkValidPath(QString path) { - +bool BlockedModsDialog::checkValidPath(QString path) +{ QFileInfo file = QFileInfo(path); QString filename = file.fileName(); - for (auto &mod : mods) { + for (auto& mod : mods) { if (mod.name.compare(filename, Qt::CaseInsensitive) == 0) { - qDebug() << "Name match found: " << mod.name << " | From path:" << path; + qDebug() << "Name match found:" << mod.name << "| From path:" << path; return true; } } @@ -171,21 +169,18 @@ bool BlockedModsDialog::checkValidPath(QString path) { return false; } -bool BlockedModsDialog::allModsMatched() { - for (auto &mod : mods) { - if (!mod.matched) - return false; - } - return true; +bool BlockedModsDialog::allModsMatched() +{ + return std::all_of(mods.begin(), mods.end(), [](auto const& mod) { return mod.matched; }); } /// qDebug print support for the BlockedMod struct -QDebug operator<<(QDebug debug, const BlockedMod &m) { +QDebug operator<<(QDebug debug, const BlockedMod& m) +{ QDebugStateSaver saver(debug); - debug.nospace() << "{ name: " << m.name << ", websiteUrl: " << m.websiteUrl - << ", hash: " << m.hash << ", matched: " << m.matched - << ", localPath: " << m.localPath <<"}"; + debug.nospace() << "{ name: " << m.name << ", websiteUrl: " << m.websiteUrl << ", hash: " << m.hash << ", matched: " << m.matched + << ", localPath: " << m.localPath << "}"; return debug; } From 7f32c6464d84181fc8947f632da340a863dc53d6 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 16:58:22 +0000 Subject: [PATCH 0072/1149] Initial better mod browser link implementation Signed-off-by: TheKodeToad --- launcher/ui/dialogs/ModDownloadDialog.cpp | 5 ++ launcher/ui/dialogs/ModDownloadDialog.h | 2 + launcher/ui/pages/modplatform/ModPage.cpp | 63 +++++++++++++++++-- launcher/ui/pages/modplatform/ModPage.h | 1 + launcher/ui/pages/modplatform/ModPage.ui | 4 +- .../pages/modplatform/flame/FlameModPage.cpp | 19 +++++- .../ui/pages/modplatform/flame/FlameModPage.h | 2 + .../modplatform/modrinth/ModrinthModPage.cpp | 2 +- 8 files changed, 87 insertions(+), 11 deletions(-) diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index d740c8cbb..38b4ffcf9 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -187,3 +187,8 @@ void ModDownloadDialog::selectedPageChanged(BasePage* previous, BasePage* select // Same effect as having a global search bar selected_page->setSearchTerm(prev_page->getSearchTerm()); } + +bool ModDownloadDialog::selectPage(QString pageId) +{ + return m_container->selectPage(pageId); +} \ No newline at end of file diff --git a/launcher/ui/dialogs/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index 18a5f0f36..125cb776a 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -53,6 +53,8 @@ public: const QList getTasks(); const std::shared_ptr &mods; + bool selectPage(QString pageId); + public slots: void confirm(); void accept() override; diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index f2c1746fc..7f62fff1e 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -2,6 +2,7 @@ /* * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 @@ -37,6 +38,7 @@ #include "Application.h" #include "ui_ModPage.h" +#include #include #include @@ -80,6 +82,8 @@ ModPage::ModPage(ModDownloadDialog* dialog, BaseInstance* instance, ModAPI* api) ui->packView->setItemDelegate(new ProjectItemDelegate(this)); ui->packView->installEventFilter(this); + + connect(ui->packDescription, &QTextBrowser::anchorClicked, this, &ModPage::openUrl); } ModPage::~ModPage() @@ -158,8 +162,8 @@ void ModPage::triggerSearch() { auto changed = m_filter_widget->changed(); m_filter = m_filter_widget->getFilter(); - - if(changed){ + + if (changed) { ui->packView->clearSelection(); ui->packDescription->clear(); ui->versionSelectionBox->clear(); @@ -241,6 +245,54 @@ void ModPage::onModSelected() ui->packView->adjustSize(); } +void ModPage::openUrl(const QUrl& url) +{ + // do not allow other url schemes for security reasons + if (!(url.scheme() == "http" || url.scheme() == "https")) { + qWarning() << "Unsupported scheme" << url.scheme(); + return; + } + + // detect mod URLs and search instead + int prefixLength; + const char* page; + + if ((url.host() == "modrinth.com" || url.host() == "www.modrinth.com") + && url.path().startsWith("/mod/")) { + prefixLength = 5; + page = "modrinth"; + } + else if (APPLICATION->capabilities() & Application::SupportsFlame + && url.host() == "www.curseforge.com" + && url.path().toLower().startsWith("/minecraft/mc-mods/")) { + prefixLength = 19; + page = "curseforge"; + } + else + prefixLength = 0; + + if (prefixLength != 0) { + QString slug = url.path().mid(prefixLength); + + // remove trailing slash(es) + while (slug.endsWith('/')) + slug.remove(slug.length() - 1, 1); + + // ensure that the path doesn't contain any further slashes, + // and the user isn't opening the same mod; they probably + // intended to view in their web browser + if (!slug.isEmpty() && !slug.contains('/') && slug != current.slug) { + ui->searchEdit->setText(slug); + dialog->selectPage(page); + triggerSearch(); + return; + } + } + + // open in the user's web browser + QDesktopServices::openUrl(url); +} + /******** Make changes to the UI ********/ @@ -270,8 +322,8 @@ void ModPage::updateModVersions(int prev_count) if ((valid || m_filter->versions.empty()) && !optedOut(version)) ui->versionSelectionBox->addItem(version.version, QVariant(i)); } - if (ui->versionSelectionBox->count() == 0 && prev_count != 0) { - ui->versionSelectionBox->addItem(tr("No valid version found!"), QVariant(-1)); + if (ui->versionSelectionBox->count() == 0 && prev_count != 0) { + ui->versionSelectionBox->addItem(tr("No valid version found!"), QVariant(-1)); ui->modSelectionButton->setText(tr("Cannot select invalid version :(")); } @@ -317,8 +369,7 @@ void ModPage::updateUi() text += "
" + tr(" by ") + authorStrs.join(", "); } - - if(current.extraDataLoaded) { + if (current.extraDataLoaded) { if (!current.extraData.donate.isEmpty()) { text += "

" + tr("Donate information: "); auto donateToStr = [](ModPlatform::DonationData& donate) -> QString { diff --git a/launcher/ui/pages/modplatform/ModPage.h b/launcher/ui/pages/modplatform/ModPage.h index ae3d7e77e..c9ccbaf20 100644 --- a/launcher/ui/pages/modplatform/ModPage.h +++ b/launcher/ui/pages/modplatform/ModPage.h @@ -82,6 +82,7 @@ class ModPage : public QWidget, public BasePage { void onSelectionChanged(QModelIndex first, QModelIndex second); void onVersionSelectionChanged(QString data); void onModSelected(); + virtual void openUrl(const QUrl& url); protected: Ui::ModPage* ui = nullptr; diff --git a/launcher/ui/pages/modplatform/ModPage.ui b/launcher/ui/pages/modplatform/ModPage.ui index 943f02aa2..94365aa5f 100644 --- a/launcher/ui/pages/modplatform/ModPage.ui +++ b/launcher/ui/pages/modplatform/ModPage.ui @@ -16,10 +16,10 @@ - true + false - true + false diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp index fd6e32ff7..a4b7b5a14 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp @@ -39,7 +39,7 @@ #include "FlameModModel.h" #include "ui/dialogs/ModDownloadDialog.h" -FlameModPage::FlameModPage(ModDownloadDialog* dialog, BaseInstance* instance) +FlameModPage::FlameModPage(ModDownloadDialog* dialog, BaseInstance* instance) : ModPage(dialog, instance, new FlameAPI()) { listModel = new FlameMod::ListModel(this); @@ -53,7 +53,7 @@ FlameModPage::FlameModPage(ModDownloadDialog* dialog, BaseInstance* instance) ui->sortByBox->addItem(tr("Sort by Author")); ui->sortByBox->addItem(tr("Sort by Downloads")); - // sometimes Qt just ignores virtual slots and doesn't work as intended it seems, + // sometimes Qt just ignores virtual slots and doesn't work as intended it seems, // so it's best not to connect them in the parent's contructor... connect(ui->sortByBox, SIGNAL(currentIndexChanged(int)), this, SLOT(triggerSearch())); connect(ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &FlameModPage::onSelectionChanged); @@ -78,3 +78,18 @@ bool FlameModPage::optedOut(ModPlatform::IndexedVersion& ver) const // other mod providers start loading before being selected, at least with // my Qt, so we need to implement this in every derived class... auto FlameModPage::shouldDisplay() const -> bool { return true; } + +void FlameModPage::openUrl(const QUrl& url) +{ + if (url.scheme().isEmpty()) { + QString query = url.query(QUrl::FullyDecoded); + if (query.startsWith("remoteUrl=")) { + // attempt to resolve url from warning page + query.remove(0, 10); + ModPage::openUrl({QUrl::fromPercentEncoding(query.toUtf8())}); // double decoding is necessary + return; + } + } + + ModPage::openUrl(url); +} \ No newline at end of file diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.h b/launcher/ui/pages/modplatform/flame/FlameModPage.h index 50dedd6f4..aef9c6987 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.h +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.h @@ -64,4 +64,6 @@ class FlameModPage : public ModPage { bool optedOut(ModPlatform::IndexedVersion& ver) const override; auto shouldDisplay() const -> bool override; + + void openUrl(const QUrl& url) override; }; diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModPage.cpp b/launcher/ui/pages/modplatform/modrinth/ModrinthModPage.cpp index 62e417c8a..c531ea904 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModPage.cpp +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModPage.cpp @@ -53,7 +53,7 @@ ModrinthModPage::ModrinthModPage(ModDownloadDialog* dialog, BaseInstance* instan ui->sortByBox->addItem(tr("Sort by Last Updated")); ui->sortByBox->addItem(tr("Sort by Newest")); - // sometimes Qt just ignores virtual slots and doesn't work as intended it seems, + // sometimes Qt just ignores virtual slots and doesn't work as intended it seems, // so it's best not to connect them in the parent's constructor... connect(ui->sortByBox, SIGNAL(currentIndexChanged(int)), this, SLOT(triggerSearch())); connect(ui->packView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ModrinthModPage::onSelectionChanged); From b9547adce7c7222a2d3c8dc455e7619f2be7a221 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 17:02:24 +0000 Subject: [PATCH 0073/1149] Add more license headers Signed-off-by: TheKodeToad --- launcher/ui/dialogs/ModDownloadDialog.cpp | 1 + launcher/ui/dialogs/ModDownloadDialog.h | 1 + launcher/ui/pages/modplatform/flame/FlameModPage.cpp | 1 + launcher/ui/pages/modplatform/flame/FlameModPage.h | 1 + 4 files changed, 4 insertions(+) diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index 38b4ffcf9..7f6f450ce 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -2,6 +2,7 @@ /* * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index 125cb776a..6227b58e5 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -2,6 +2,7 @@ /* * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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/flame/FlameModPage.cpp b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp index a4b7b5a14..faf12cea1 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp @@ -2,6 +2,7 @@ /* * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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/flame/FlameModPage.h b/launcher/ui/pages/modplatform/flame/FlameModPage.h index aef9c6987..da4fcdffb 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.h +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.h @@ -2,6 +2,7 @@ /* * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 From d03ae34b61b6c61d0afd4a5ba0d27347c87b0726 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 17:19:54 +0000 Subject: [PATCH 0074/1149] Auto-select first result Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 7f62fff1e..780750a82 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -261,8 +261,7 @@ void ModPage::openUrl(const QUrl& url) && url.path().startsWith("/mod/")) { prefixLength = 5; page = "modrinth"; - } - else if (APPLICATION->capabilities() & Application::SupportsFlame + } else if (APPLICATION->capabilities() & Application::SupportsFlame && url.host() == "www.curseforge.com" && url.path().toLower().startsWith("/minecraft/mc-mods/")) { prefixLength = 19; @@ -282,9 +281,14 @@ void ModPage::openUrl(const QUrl& url) // and the user isn't opening the same mod; they probably // intended to view in their web browser if (!slug.isEmpty() && !slug.contains('/') && slug != current.slug) { - ui->searchEdit->setText(slug); dialog->selectPage(page); + ui->searchEdit->setText(slug); + triggerSearch(); + connect(listModel->activeJob(), &Task::finished, [this] { + ui->packView->setCurrentIndex(listModel->index(0)); + }); + return; } } From 6c7d04043984c0c2c25d2cd646be223786defdc3 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 18:12:27 +0000 Subject: [PATCH 0075/1149] Hacky tweaks Signed-off-by: TheKodeToad --- launcher/ui/dialogs/ModDownloadDialog.cpp | 13 ++++++++++--- launcher/ui/dialogs/ModDownloadDialog.h | 4 ++++ launcher/ui/pages/modplatform/ModPage.cpp | 10 ++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index 7f6f450ce..876f015a3 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -132,6 +132,8 @@ QList ModDownloadDialog::getPages() if (APPLICATION->capabilities() & Application::SupportsFlame) pages.append(FlameModPage::create(this, m_instance)); + m_selected_page = dynamic_cast(pages[0]); + return pages; } @@ -179,17 +181,22 @@ void ModDownloadDialog::selectedPageChanged(BasePage* previous, BasePage* select return; } - auto* selected_page = dynamic_cast(selected); - if (!selected_page) { + m_selected_page = dynamic_cast(selected); + if (!m_selected_page) { qCritical() << "Page '" << selected->displayName() << "' in ModDownloadDialog is not a ModPage!"; return; } // Same effect as having a global search bar - selected_page->setSearchTerm(prev_page->getSearchTerm()); + m_selected_page->setSearchTerm(prev_page->getSearchTerm()); } bool ModDownloadDialog::selectPage(QString pageId) { return m_container->selectPage(pageId); +} + +ModPage* ModDownloadDialog::getSelectedPage() +{ + return m_selected_page; } \ No newline at end of file diff --git a/launcher/ui/dialogs/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index 6227b58e5..c637a70ac 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -25,6 +25,7 @@ #include "ModDownloadTask.h" #include "minecraft/mod/ModFolderModel.h" #include "ui/pages/BasePageProvider.h" +#include "ui/pages/modplatform/ModPage.h" namespace Ui { @@ -56,6 +57,8 @@ public: bool selectPage(QString pageId); + ModPage* getSelectedPage(); + public slots: void confirm(); void accept() override; @@ -69,6 +72,7 @@ private: PageContainer * m_container = nullptr; QDialogButtonBox * m_buttons = nullptr; QVBoxLayout *m_verticalLayout = nullptr; + ModPage *m_selected_page = nullptr; QHash modTask; BaseInstance *m_instance; diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 780750a82..6a53e25e5 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -282,11 +282,13 @@ void ModPage::openUrl(const QUrl& url) // intended to view in their web browser if (!slug.isEmpty() && !slug.contains('/') && slug != current.slug) { dialog->selectPage(page); - ui->searchEdit->setText(slug); - triggerSearch(); - connect(listModel->activeJob(), &Task::finished, [this] { - ui->packView->setCurrentIndex(listModel->index(0)); + ModPage* newPage = dialog->getSelectedPage(); + newPage->ui->searchEdit->setText(slug); + newPage->triggerSearch(); + + connect(newPage->listModel->activeJob(), &Task::finished, [newPage] { + newPage->ui->packView->setCurrentIndex(newPage->listModel->index(0)); }); return; From c890aa18f7b24bbb0429456d8c4a9cbb1c8d2bb1 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 18:25:54 +0000 Subject: [PATCH 0076/1149] Only select correct mod Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 6a53e25e5..231e98f67 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -262,7 +262,7 @@ void ModPage::openUrl(const QUrl& url) prefixLength = 5; page = "modrinth"; } else if (APPLICATION->capabilities() & Application::SupportsFlame - && url.host() == "www.curseforge.com" + && (url.host() == "curseforge.com" || url.host() == "www.curseforge.com") && url.path().toLower().startsWith("/minecraft/mc-mods/")) { prefixLength = 19; page = "curseforge"; @@ -287,8 +287,15 @@ void ModPage::openUrl(const QUrl& url) newPage->ui->searchEdit->setText(slug); newPage->triggerSearch(); - connect(newPage->listModel->activeJob(), &Task::finished, [newPage] { - newPage->ui->packView->setCurrentIndex(newPage->listModel->index(0)); + connect(newPage->listModel->activeJob(), &Task::finished, [slug, newPage] { + for (int row = 0; row < newPage->listModel->rowCount({}); row++) { + QModelIndex index = newPage->listModel->index(row); + auto pack = newPage->listModel->data(index, Qt::UserRole).value(); + if (pack.slug == slug) { + newPage->ui->packView->setCurrentIndex(index); + break; + } + } }); return; From d1626d20bd4fdeeb1e9cf0f00d862fc75ddaa663 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 18:30:11 +0000 Subject: [PATCH 0077/1149] Slight cleanup Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 231e98f67..9bb56290f 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -287,12 +287,15 @@ void ModPage::openUrl(const QUrl& url) newPage->ui->searchEdit->setText(slug); newPage->triggerSearch(); - connect(newPage->listModel->activeJob(), &Task::finished, [slug, newPage] { - for (int row = 0; row < newPage->listModel->rowCount({}); row++) { - QModelIndex index = newPage->listModel->index(row); - auto pack = newPage->listModel->data(index, Qt::UserRole).value(); + ModPlatform::ListModel* model = newPage->listModel; + QListView* view = newPage->ui->packView; + + connect(model->activeJob(), &Task::finished, [slug, model, view] { + for (int row = 0; row < model->rowCount({}); row++) { + QModelIndex index = model->index(row); + ModPlatform::IndexedPack pack = model->data(index, Qt::UserRole).value(); if (pack.slug == slug) { - newPage->ui->packView->setCurrentIndex(index); + view->setCurrentIndex(index); break; } } From 576867605dc09b1d117598908d41482e168fbc95 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 1 Nov 2022 18:40:12 +0000 Subject: [PATCH 0078/1149] Add another fallback Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 9bb56290f..f269fc72c 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -290,15 +290,18 @@ void ModPage::openUrl(const QUrl& url) ModPlatform::ListModel* model = newPage->listModel; QListView* view = newPage->ui->packView; - connect(model->activeJob(), &Task::finished, [slug, model, view] { + connect(model->activeJob(), &Task::finished, [url, slug, model, view] { for (int row = 0; row < model->rowCount({}); row++) { QModelIndex index = model->index(row); ModPlatform::IndexedPack pack = model->data(index, Qt::UserRole).value(); if (pack.slug == slug) { view->setCurrentIndex(index); - break; + return; } } + + // The final fallback. + QDesktopServices::openUrl(url); }); return; From fef60a9da0216bdcb266d935bbfea03aba8905b4 Mon Sep 17 00:00:00 2001 From: Tayou Date: Sat, 29 Oct 2022 19:27:20 +0200 Subject: [PATCH 0079/1149] add support for multiple custom themes also moved theme related code from Application.cpp to new ui/themes/ThemeManager.cpp, this class should cleanly isolate theme related functions and help avoid code duplication in future theme related additions. Themes can now be just qss or css files, they won't have color pallette information with them in that case Signed-off-by: Tayou --- launcher/Application.cpp | 70 ++-------- launcher/Application.h | 9 +- launcher/CMakeLists.txt | 2 + launcher/ui/themes/CustomTheme.cpp | 202 +++++++++++++++++++--------- launcher/ui/themes/CustomTheme.h | 43 +++++- launcher/ui/themes/SystemTheme.cpp | 49 ++++++- launcher/ui/themes/ThemeManager.cpp | 152 +++++++++++++++++++++ launcher/ui/themes/ThemeManager.h | 44 ++++++ 8 files changed, 445 insertions(+), 126 deletions(-) create mode 100644 launcher/ui/themes/ThemeManager.cpp create mode 100644 launcher/ui/themes/ThemeManager.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 2da8ac560..7b33361c7 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1,7 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Tayou + * + * PolyMC - Minecraft Launcher * Copyright (C) 2022 Lenny McLennington * * This program is free software: you can redistribute it and/or modify @@ -54,12 +57,6 @@ #include "ui/pages/global/APIPage.h" #include "ui/pages/global/CustomCommandsPage.h" -#include "ui/themes/ITheme.h" -#include "ui/themes/SystemTheme.h" -#include "ui/themes/DarkTheme.h" -#include "ui/themes/BrightTheme.h" -#include "ui/themes/CustomTheme.h" - #ifdef Q_OS_WIN #include "ui/WinDarkmode.h" #include @@ -749,28 +746,11 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) qDebug() << "<> Instance icons intialized."; } - // Icon themes + // Themes { - // TODO: icon themes and instance icons do not mesh well together. Rearrange and fix discrepancies! - // set icon theme search path! - auto searchPaths = QIcon::themeSearchPaths(); - searchPaths.append("iconthemes"); - QIcon::setThemeSearchPaths(searchPaths); - qDebug() << "<> Icon themes initialized."; - } + m_themeManager = new ThemeManager(m_mainWindow); - // Initialize widget themes - { - auto insertTheme = [this](ITheme * theme) - { - m_themes.insert(std::make_pair(theme->id(), std::unique_ptr(theme))); - }; - auto darkTheme = new DarkTheme(); - insertTheme(new SystemTheme()); - insertTheme(darkTheme); - insertTheme(new BrightTheme()); - insertTheme(new CustomTheme(darkTheme, "custom")); - qDebug() << "<> Widget themes initialized."; + m_themeManager->InitializeThemes(); } // initialize and load all instances @@ -880,6 +860,10 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) performMainStartupAction(); } +ThemeManager* Application::getThemeManager() { + return Application::m_themeManager; +} + bool Application::createSetupWizard() { bool javaRequired = [&]() @@ -1127,43 +1111,17 @@ std::shared_ptr Application::javalist() std::vector Application::getValidApplicationThemes() { - std::vector ret; - auto iter = m_themes.cbegin(); - while (iter != m_themes.cend()) - { - ret.push_back((*iter).second.get()); - iter++; - } - return ret; + return m_themeManager->getValidApplicationThemes(); } void Application::setApplicationTheme(const QString& name, bool initial) { - auto systemPalette = qApp->palette(); - auto themeIter = m_themes.find(name); - if(themeIter != m_themes.end()) - { - auto & theme = (*themeIter).second; - theme->apply(initial); -#ifdef Q_OS_WIN - if (m_mainWindow && IsWindows10OrGreater()) { - if (QString::compare(theme->id(), "dark") == 0) { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); - } else { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); - } - } -#endif - } - else - { - qWarning() << "Tried to set invalid theme:" << name; - } + m_themeManager->setApplicationTheme(name, initial); } void Application::setIconTheme(const QString& name) { - QIcon::setThemeName(name); + m_themeManager->setIconTheme(name); } QIcon Application::getThemedIcon(const QString& name) diff --git a/launcher/Application.h b/launcher/Application.h index 8fa0ab10e..33d8db29a 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Tayou * * 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 @@ -44,6 +45,8 @@ #include #include +#include "ui/themes/ThemeManager.h" + #include #include "minecraft/launch/MinecraftServerTarget.h" @@ -198,6 +201,8 @@ public: void ShowGlobalSettings(class QWidget * parent, QString open_page = QString()); + ThemeManager* getThemeManager(); + signals: void updateAllowedChanged(bool status); void globalSettingsAboutToOpen(); @@ -255,9 +260,9 @@ private: std::shared_ptr m_javalist; std::shared_ptr m_translations; std::shared_ptr m_globalSettingsProvider; - std::map> m_themes; std::unique_ptr m_mcedit; QSet m_features; + ThemeManager* m_themeManager; QMap> m_profilers; diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 0dae47df8..5b0d9282a 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -650,6 +650,8 @@ SET(LAUNCHER_SOURCES ui/themes/ITheme.h ui/themes/SystemTheme.cpp ui/themes/SystemTheme.h + ui/themes/ThemeManager.cpp + ui/themes/ThemeManager.h # Processes LaunchController.h diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index 3e3e27de3..3c35bf37c 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -1,12 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * Copyright (C) 2022 Tayou + * + * 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 . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Authors: Andrew Okin + * Peterix + * Orochimarufan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include "CustomTheme.h" -#include #include #include +#include "ThemeManager.h" const char * themeFile = "theme.json"; -const char * styleFile = "themeStyle.css"; -static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAmount, QColor &fadeColor, QString &name, QString &widgets) +static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAmount, QColor &fadeColor, QString &name, QString &widgets, QString &qssFilePath, bool &dataIncomplete) { QFileInfo pathInfo(path); if(pathInfo.exists() && pathInfo.isFile()) @@ -15,8 +52,11 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm { auto doc = Json::requireDocument(path, "Theme JSON file"); const QJsonObject root = doc.object(); + dataIncomplete = !root.contains("qssFilePath"); name = Json::requireString(root, "name", "Theme name"); widgets = Json::requireString(root, "widgets", "Qt widget theme"); + qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); + //auto colorFileList = Json::ensureArray(root, "colorFiles"); auto colorsRoot = Json::requireObject(root, "colors", "colors object"); auto readColor = [&](QString colorName) -> QColor { @@ -26,7 +66,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm QColor color(colorValue); if(!color.isValid()) { - qWarning() << "Color value" << colorValue << "for" << colorName << "was not recognized."; + themeWarningLog << "Color value" << colorValue << "for" << colorName << "was not recognized."; return QColor(); } return color; @@ -42,7 +82,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } else { - qDebug() << "Color value for" << colorName << "was not present."; + themeDebugLog << "Color value for" << colorName << "was not present."; } }; @@ -68,23 +108,24 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } catch (const Exception &e) { - qWarning() << "Couldn't load theme json: " << e.cause(); + themeWarningLog << "Couldn't load theme json: " << e.cause(); return false; } } else { - qDebug() << "No theme json present."; + themeDebugLog << "No theme json present."; return false; } return true; } -static bool writeThemeJson(const QString &path, const QPalette &palette, double fadeAmount, QColor fadeColor, QString name, QString widgets) +static bool writeThemeJson(const QString &path, const QPalette &palette, double fadeAmount, QColor fadeColor, QString name, QString widgets, QString qssFilePath) { QJsonObject rootObj; rootObj.insert("name", name); rootObj.insert("widgets", widgets); + rootObj.insert("qssFilePath", qssFilePath); QJsonObject colorsObj; auto insertColor = [&](QPalette::ColorRole role, QString colorName) @@ -119,75 +160,112 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double } catch (const Exception &e) { - qWarning() << "Failed to write theme json to" << path; + themeWarningLog << "Failed to write theme json to" << path; return false; } } -CustomTheme::CustomTheme(ITheme* baseTheme, QString folder) +/// @brief +/// @param baseTheme Base Theme +/// @param fileInfo FileInfo object for file to load +/// @param isManifest whether to load a theme manifest or a qss file +CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest) { - m_id = folder; - QString path = FS::PathCombine("themes", m_id); - QString pathResources = FS::PathCombine("themes", m_id, "resources"); + if (isManifest) { + m_id = fileInfo.dir().dirName(); - qDebug() << "Loading theme" << m_id; + QString path = FS::PathCombine("themes", m_id); + QString pathResources = FS::PathCombine("themes", m_id, "resources"); - if(!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) - { - qWarning() << "couldn't create folder for theme!"; - m_palette = baseTheme->colorScheme(); - m_styleSheet = baseTheme->appStyleSheet(); - return; - } - - auto themeFilePath = FS::PathCombine(path, themeFile); - - m_palette = baseTheme->colorScheme(); - if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets)) - { - m_name = "Custom"; - m_palette = baseTheme->colorScheme(); - m_fadeColor = baseTheme->fadeColor(); - m_fadeAmount = baseTheme->fadeAmount(); - m_widgets = baseTheme->qtTheme(); - - QFileInfo info(themeFilePath); - if(!info.exists()) + if(!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) { - writeThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, "Custom", m_widgets); - } - } - else - { - m_palette = fadeInactive(m_palette, m_fadeAmount, m_fadeColor); - } - - auto cssFilePath = FS::PathCombine(path, styleFile); - QFileInfo info (cssFilePath); - if(info.isFile()) - { - try - { - // TODO: validate css? - m_styleSheet = QString::fromUtf8(FS::read(cssFilePath)); - } - catch (const Exception &e) - { - qWarning() << "Couldn't load css:" << e.cause() << "from" << cssFilePath; + themeWarningLog << "X couldn't create folder for theme!"; + m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); + return; } - } - else - { - qDebug() << "No theme css present."; - m_styleSheet = baseTheme->appStyleSheet(); + + auto themeFilePath = FS::PathCombine(path, themeFile); + + bool jsonDataIncomplete = false; + + m_palette = baseTheme->colorScheme(); + if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) + { + themeDebugLog << "Did not read theme json file correctly, writing new one to: " << themeFilePath; + m_name = "Custom"; + m_palette = baseTheme->colorScheme(); + m_fadeColor = baseTheme->fadeColor(); + m_fadeAmount = baseTheme->fadeAmount(); + m_widgets = baseTheme->qtTheme(); + m_qssFilePath = "themeStyle.css"; + + QFileInfo info(themeFilePath); + } + else + { + m_palette = fadeInactive(m_palette, m_fadeAmount, m_fadeColor); + } + + if(jsonDataIncomplete) + { + writeThemeJson(fileInfo.absoluteFilePath(), m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath); + } + + auto cssFilePath = FS::PathCombine(path, m_qssFilePath); + QFileInfo info (cssFilePath); + if(info.isFile()) + { + try + { + // TODO: validate css? + m_styleSheet = QString::fromUtf8(FS::read(cssFilePath)); + } + catch (const Exception &e) + { + themeWarningLog << "X Couldn't load css:" << e.cause() << "from" << cssFilePath; + m_styleSheet = baseTheme->appStyleSheet(); + } + } + else + { + themeDebugLog << "X No theme css present."; + m_styleSheet = baseTheme->appStyleSheet(); + try + { + FS::write(cssFilePath, m_styleSheet.toUtf8()); + } + catch (const Exception &e) + { + themeWarningLog << "X Couldn't write css:" << e.cause() << "to" << cssFilePath; + } + } + } else { + m_id = fileInfo.fileName(); + m_name = fileInfo.baseName(); + QString path = fileInfo.filePath(); + //themeDebugLog << "Theme ID: " << m_id; + //themeDebugLog << "Theme Name: " << m_name; + //themeDebugLog << "Theme Path: " << path; + + if(!FS::ensureFilePathExists(path)) + { + themeWarningLog << m_name << " Theme file path doesn't exist!"; + m_palette = baseTheme->colorScheme(); + m_styleSheet = baseTheme->appStyleSheet(); + return; + } + + m_palette = baseTheme->colorScheme(); try { - FS::write(cssFilePath, m_styleSheet.toUtf8()); + // TODO: validate qss? + m_styleSheet = QString::fromUtf8(FS::read(path)); } catch (const Exception &e) { - qWarning() << "Couldn't write css:" << e.cause() << "to" << cssFilePath; + themeWarningLog << "Couldn't load qss:" << e.cause() << "from" << path; + m_styleSheet = baseTheme->appStyleSheet(); } } } diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index d216895de..f4a7b7378 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -1,11 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * Copyright (C) 2022 Tayou + * + * 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 . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Authors: Andrew Okin + * Peterix + * Orochimarufan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #pragma once #include "ITheme.h" +#include +#include class CustomTheme: public ITheme { public: - CustomTheme(ITheme * baseTheme, QString folder); + CustomTheme(ITheme * baseTheme, QFileInfo& file, bool isManifest); virtual ~CustomTheme() {} QString id() override; @@ -27,5 +67,6 @@ private: /* data */ QString m_name; QString m_id; QString m_widgets; + QString m_qssFilePath; }; diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index 49b1afaa1..b8eb2a3c9 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -1,30 +1,69 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * Copyright (C) 2022 Tayou + * + * 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 . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Authors: Andrew Okin + * Peterix + * Orochimarufan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include "SystemTheme.h" #include #include #include #include +#include "ThemeManager.h" SystemTheme::SystemTheme() { - qDebug() << "Determining System Theme..."; + themeDebugLog << "Determining System Theme..."; const auto & style = QApplication::style(); systemPalette = style->standardPalette(); QString lowerThemeName = style->objectName(); - qDebug() << "System theme seems to be:" << lowerThemeName; + themeDebugLog << "System theme seems to be:" << lowerThemeName; QStringList styles = QStyleFactory::keys(); for(auto &st: styles) { - qDebug() << "Considering theme from theme factory:" << st.toLower(); + themeDebugLog << "Considering theme from theme factory:" << st.toLower(); if(st.toLower() == lowerThemeName) { systemTheme = st; - qDebug() << "System theme has been determined to be:" << systemTheme; + themeDebugLog << "System theme has been determined to be:" << systemTheme; return; } } // fall back to fusion if we can't find the current theme. systemTheme = "Fusion"; - qDebug() << "System theme not found, defaulted to Fusion"; + themeDebugLog << "System theme not found, defaulted to Fusion"; } void SystemTheme::apply(bool initial) diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp new file mode 100644 index 000000000..6e1566d2f --- /dev/null +++ b/launcher/ui/themes/ThemeManager.cpp @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * Copyright (C) 2022 Tayou + * + * 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 . + */ +#include "ThemeManager.h" + +#include "ui/themes/SystemTheme.h" +#include "ui/themes/DarkTheme.h" +#include "ui/themes/BrightTheme.h" +#include "ui/themes/CustomTheme.h" +#include +#include +#include +#include + +#include "Application.h" + +#ifdef Q_OS_WIN +#include +#include "ui/WinDarkmode.h" +#endif + +ThemeManager::ThemeManager(MainWindow* mainWindow) { + m_mainWindow = mainWindow; +} + +/// @brief Adds the Theme to the list of themes +/// @param theme The Theme to add +/// @return Theme ID +QString ThemeManager::AddTheme(ITheme * theme) { + m_themes.insert(std::make_pair(theme->id(), std::unique_ptr(theme))); + return theme->id(); +} + +/// @brief Gets the Theme from the List via ID +/// @param themeId Theme ID of theme to fetch +/// @return Theme at themeId +ITheme* ThemeManager::GetTheme(QString themeId) { + return m_themes[themeId].get(); +} + +void ThemeManager::InitializeThemes() { + + + // Icon themes + { + // TODO: icon themes and instance icons do not mesh well together. Rearrange and fix discrepancies! + // set icon theme search path! + auto searchPaths = QIcon::themeSearchPaths(); + searchPaths.append("iconthemes"); + QIcon::setThemeSearchPaths(searchPaths); + themeDebugLog << "<> Icon themes initialized."; + } + + // Initialize widget themes + { + themeDebugLog << "<> Initializing Widget Themes"; + themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new SystemTheme()); + auto darkThemeId = AddTheme(new DarkTheme()); + themeDebugLog "✓ Loading Built-in Theme:" << darkThemeId; + themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new BrightTheme()); + + // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown? Dunno how to do that though) + QString themeFolder = (new QDir("./themes/"))->absoluteFilePath(""); + themeDebugLog << "Theme Folder Path: " << themeFolder; + + QDirIterator directoryIterator(themeFolder, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); + while (directoryIterator.hasNext()) { + QDir dir(directoryIterator.next()); + QFileInfo themeJson(dir.absoluteFilePath("theme.json")); + if (themeJson.exists()) { + // Load "theme.json" based themes + themeDebugLog "✓ Loading JSON Theme from:" << themeJson.absoluteFilePath(); + CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), themeJson, true); + AddTheme(theme); + } else { + // Load pure QSS Themes + QDirIterator stylesheetFileIterator(dir.absoluteFilePath(""), {"*.qss", "*.css"}, QDir::Files); + while (stylesheetFileIterator.hasNext()) { + QFile customThemeFile(stylesheetFileIterator.next()); + QFileInfo customThemeFileInfo(customThemeFile); + themeDebugLog "✓ Loading QSS Theme from:" << customThemeFileInfo.absoluteFilePath(); + CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), customThemeFileInfo, false); + AddTheme(theme); + } + } + } + + themeDebugLog << "<> Widget themes initialized."; + } +} + +std::vector ThemeManager::getValidApplicationThemes() +{ + std::vector ret; + auto iter = m_themes.cbegin(); + while (iter != m_themes.cend()) + { + ret.push_back((*iter).second.get()); + iter++; + } + return ret; +} + +void ThemeManager::setIconTheme(const QString& name) +{ + QIcon::setThemeName(name); +} + +void ThemeManager::applyCurrentlySelectedTheme() { + setIconTheme(APPLICATION->settings()->get("IconTheme").toString()); + themeDebugLog() << "<> Icon theme set."; + setApplicationTheme(APPLICATION->settings()->get("ApplicationTheme").toString(), true); + themeDebugLog() << "<> Application theme set."; +} + +void ThemeManager::setApplicationTheme(const QString& name, bool initial) +{ + auto systemPalette = qApp->palette(); + auto themeIter = m_themes.find(name); + if(themeIter != m_themes.end()) + { + auto & theme = (*themeIter).second; + theme->apply(initial); +#ifdef Q_OS_WIN + if (m_mainWindow && IsWindows10OrGreater()) { + if (QString::compare(theme->id(), "dark") == 0) { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + } else { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + } + } +#endif + } + else + { + qWarning() << "Tried to set invalid theme:" << name; + } +} diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h new file mode 100644 index 000000000..fa6ea2369 --- /dev/null +++ b/launcher/ui/themes/ThemeManager.h @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * Copyright (C) 2022 Tayou + * + * 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 . + */ + +#include + +#include "ui/themes/ITheme.h" +#include "ui/MainWindow.h" + +#define themeDebugLog qDebug() << "[Themes]" +#define themeWarningLog qWarning() << "[Themes]" + +class ThemeManager { +public: + ThemeManager(MainWindow* mainWindow); + void InitializeThemes(); + + std::vector getValidApplicationThemes(); + void setIconTheme(const QString& name); + void applyCurrentlySelectedTheme(); + void setApplicationTheme(const QString& name, bool initial); + +private: + std::map> m_themes; + MainWindow* m_mainWindow; + + QString AddTheme(ITheme * theme); + ITheme* GetTheme(QString themeId); +}; + From a3f5ea359827abb7949070cdcd8d56be50ab3360 Mon Sep 17 00:00:00 2001 From: Tayou Date: Tue, 1 Nov 2022 15:41:08 +0100 Subject: [PATCH 0080/1149] added suggested changes Signed-off-by: Tayou --- launcher/Application.cpp | 18 +++------ launcher/Application.h | 9 ++--- launcher/ui/themes/CustomTheme.cpp | 24 ++++++------ launcher/ui/themes/CustomTheme.h | 3 +- launcher/ui/themes/SystemTheme.cpp | 10 ++--- launcher/ui/themes/ThemeManager.cpp | 60 +++++++++++++++-------------- launcher/ui/themes/ThemeManager.h | 15 ++++++-- 7 files changed, 68 insertions(+), 71 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 7b33361c7..fa2023121 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -2,10 +2,8 @@ /* * Prism Launcher * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Tayou - * - * PolyMC - Minecraft Launcher * Copyright (C) 2022 Lenny McLennington + * Copyright (C) 2022 Tayou * * 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 @@ -71,6 +69,8 @@ #include "ui/pagedialog/PageDialog.h" +#include "ui/themes/ThemeManager.h" + #include "ApplicationMessage.h" #include @@ -747,11 +747,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) } // Themes - { - m_themeManager = new ThemeManager(m_mainWindow); - - m_themeManager->InitializeThemes(); - } + m_themeManager = std::make_unique(m_mainWindow); // initialize and load all instances { @@ -860,10 +856,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) performMainStartupAction(); } -ThemeManager* Application::getThemeManager() { - return Application::m_themeManager; -} - bool Application::createSetupWizard() { bool javaRequired = [&]() @@ -1109,7 +1101,7 @@ std::shared_ptr Application::javalist() return m_javalist; } -std::vector Application::getValidApplicationThemes() +QList Application::getValidApplicationThemes() { return m_themeManager->getValidApplicationThemes(); } diff --git a/launcher/Application.h b/launcher/Application.h index 33d8db29a..ec434c6cc 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -45,8 +45,6 @@ #include #include -#include "ui/themes/ThemeManager.h" - #include #include "minecraft/launch/MinecraftServerTarget.h" @@ -71,6 +69,7 @@ class BaseDetachedToolFactory; class TranslationsModel; class ITheme; class MCEditTool; +class ThemeManager; namespace Meta { class Index; @@ -121,7 +120,7 @@ public: void setIconTheme(const QString& name); - std::vector getValidApplicationThemes(); + QList getValidApplicationThemes(); void setApplicationTheme(const QString& name, bool initial); @@ -201,8 +200,6 @@ public: void ShowGlobalSettings(class QWidget * parent, QString open_page = QString()); - ThemeManager* getThemeManager(); - signals: void updateAllowedChanged(bool status); void globalSettingsAboutToOpen(); @@ -262,7 +259,7 @@ private: std::shared_ptr m_globalSettingsProvider; std::unique_ptr m_mcedit; QSet m_features; - ThemeManager* m_themeManager; + std::unique_ptr m_themeManager; QMap> m_profilers; diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index 3c35bf37c..c346d42f3 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -66,7 +66,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm QColor color(colorValue); if(!color.isValid()) { - themeWarningLog << "Color value" << colorValue << "for" << colorName << "was not recognized."; + themeWarningLog() << "Color value" << colorValue << "for" << colorName << "was not recognized."; return QColor(); } return color; @@ -82,7 +82,7 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } else { - themeDebugLog << "Color value for" << colorName << "was not present."; + themeDebugLog() << "Color value for" << colorName << "was not present."; } }; @@ -108,13 +108,13 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } catch (const Exception &e) { - themeWarningLog << "Couldn't load theme json: " << e.cause(); + themeWarningLog() << "Couldn't load theme json: " << e.cause(); return false; } } else { - themeDebugLog << "No theme json present."; + themeDebugLog() << "No theme json present."; return false; } return true; @@ -160,7 +160,7 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double } catch (const Exception &e) { - themeWarningLog << "Failed to write theme json to" << path; + themeWarningLog() << "Failed to write theme json to" << path; return false; } } @@ -179,7 +179,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest if(!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) { - themeWarningLog << "X couldn't create folder for theme!"; + themeWarningLog() << "couldn't create folder for theme!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); return; @@ -192,7 +192,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_palette = baseTheme->colorScheme(); if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) { - themeDebugLog << "Did not read theme json file correctly, writing new one to: " << themeFilePath; + themeDebugLog() << "Did not read theme json file correctly, writing new one to: " << themeFilePath; m_name = "Custom"; m_palette = baseTheme->colorScheme(); m_fadeColor = baseTheme->fadeColor(); @@ -223,13 +223,13 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "X Couldn't load css:" << e.cause() << "from" << cssFilePath; + themeWarningLog() << "Couldn't load css:" << e.cause() << "from" << cssFilePath; m_styleSheet = baseTheme->appStyleSheet(); } } else { - themeDebugLog << "X No theme css present."; + themeDebugLog() << "No theme css present."; m_styleSheet = baseTheme->appStyleSheet(); try { @@ -237,7 +237,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "X Couldn't write css:" << e.cause() << "to" << cssFilePath; + themeWarningLog() << "Couldn't write css:" << e.cause() << "to" << cssFilePath; } } } else { @@ -250,7 +250,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest if(!FS::ensureFilePathExists(path)) { - themeWarningLog << m_name << " Theme file path doesn't exist!"; + themeWarningLog() << m_name << " Theme file path doesn't exist!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); return; @@ -264,7 +264,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } catch (const Exception &e) { - themeWarningLog << "Couldn't load qss:" << e.cause() << "from" << path; + themeWarningLog() << "Couldn't load qss:" << e.cause() << "from" << path; m_styleSheet = baseTheme->appStyleSheet(); } } diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index f4a7b7378..6d1f46b4b 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -39,8 +39,7 @@ #pragma once #include "ITheme.h" -#include -#include +#include class CustomTheme: public ITheme { diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index b8eb2a3c9..ec24c6d76 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -45,25 +45,25 @@ SystemTheme::SystemTheme() { - themeDebugLog << "Determining System Theme..."; + themeDebugLog() << "Determining System Theme..."; const auto & style = QApplication::style(); systemPalette = style->standardPalette(); QString lowerThemeName = style->objectName(); - themeDebugLog << "System theme seems to be:" << lowerThemeName; + themeDebugLog() << "System theme seems to be:" << lowerThemeName; QStringList styles = QStyleFactory::keys(); for(auto &st: styles) { - themeDebugLog << "Considering theme from theme factory:" << st.toLower(); + themeDebugLog() << "Considering theme from theme factory:" << st.toLower(); if(st.toLower() == lowerThemeName) { systemTheme = st; - themeDebugLog << "System theme has been determined to be:" << systemTheme; + themeDebugLog() << "System theme has been determined to be:" << systemTheme; return; } } // fall back to fusion if we can't find the current theme. systemTheme = "Fusion"; - themeDebugLog << "System theme not found, defaulted to Fusion"; + themeDebugLog() << "System theme not found, defaulted to Fusion"; } void SystemTheme::apply(bool initial) diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 6e1566d2f..3c338fd67 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -29,20 +29,25 @@ #include "Application.h" #ifdef Q_OS_WIN -#include +#include +// this is needed for versionhelpers.h, it is also included in WinDarkmode, but we can't rely on that. +// Ultimately this should be included in versionhelpers, but that is outside of the project. #include "ui/WinDarkmode.h" +#include #endif ThemeManager::ThemeManager(MainWindow* mainWindow) { m_mainWindow = mainWindow; + InitializeThemes(); } /// @brief Adds the Theme to the list of themes /// @param theme The Theme to add /// @return Theme ID -QString ThemeManager::AddTheme(ITheme * theme) { - m_themes.insert(std::make_pair(theme->id(), std::unique_ptr(theme))); - return theme->id(); +QString ThemeManager::AddTheme(std::unique_ptr theme) { + QString id = theme->id(); + m_themes.emplace(id, std::move(theme)); + return id; } /// @brief Gets the Theme from the List via ID @@ -62,20 +67,20 @@ void ThemeManager::InitializeThemes() { auto searchPaths = QIcon::themeSearchPaths(); searchPaths.append("iconthemes"); QIcon::setThemeSearchPaths(searchPaths); - themeDebugLog << "<> Icon themes initialized."; + themeDebugLog() << "<> Icon themes initialized."; } // Initialize widget themes { - themeDebugLog << "<> Initializing Widget Themes"; - themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new SystemTheme()); - auto darkThemeId = AddTheme(new DarkTheme()); - themeDebugLog "✓ Loading Built-in Theme:" << darkThemeId; - themeDebugLog "✓ Loading Built-in Theme:" << AddTheme(new BrightTheme()); + themeDebugLog() << "<> Initializing Widget Themes"; + themeDebugLog() << "Loading Built-in Theme:" << AddTheme(std::make_unique()); + auto darkThemeId = AddTheme(std::make_unique()); + themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; + themeDebugLog() << "Loading Built-in Theme:" << AddTheme(std::make_unique()); - // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown? Dunno how to do that though) - QString themeFolder = (new QDir("./themes/"))->absoluteFilePath(""); - themeDebugLog << "Theme Folder Path: " << themeFolder; + // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown?) + QString themeFolder = QDir("./themes/").absoluteFilePath(""); + themeDebugLog() << "Theme Folder Path: " << themeFolder; QDirIterator directoryIterator(themeFolder, QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (directoryIterator.hasNext()) { @@ -83,34 +88,30 @@ void ThemeManager::InitializeThemes() { QFileInfo themeJson(dir.absoluteFilePath("theme.json")); if (themeJson.exists()) { // Load "theme.json" based themes - themeDebugLog "✓ Loading JSON Theme from:" << themeJson.absoluteFilePath(); - CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), themeJson, true); - AddTheme(theme); + themeDebugLog() << "Loading JSON Theme from:" << themeJson.absoluteFilePath(); + AddTheme(std::make_unique(GetTheme(darkThemeId), themeJson, true)); } else { // Load pure QSS Themes QDirIterator stylesheetFileIterator(dir.absoluteFilePath(""), {"*.qss", "*.css"}, QDir::Files); while (stylesheetFileIterator.hasNext()) { QFile customThemeFile(stylesheetFileIterator.next()); QFileInfo customThemeFileInfo(customThemeFile); - themeDebugLog "✓ Loading QSS Theme from:" << customThemeFileInfo.absoluteFilePath(); - CustomTheme* theme = new CustomTheme(GetTheme(darkThemeId), customThemeFileInfo, false); - AddTheme(theme); + themeDebugLog() << "Loading QSS Theme from:" << customThemeFileInfo.absoluteFilePath(); + AddTheme(std::make_unique(GetTheme(darkThemeId), customThemeFileInfo, false)); } } } - themeDebugLog << "<> Widget themes initialized."; + themeDebugLog() << "<> Widget themes initialized."; } } -std::vector ThemeManager::getValidApplicationThemes() +QList ThemeManager::getValidApplicationThemes() { - std::vector ret; - auto iter = m_themes.cbegin(); - while (iter != m_themes.cend()) - { - ret.push_back((*iter).second.get()); - iter++; + QList ret; + ret.reserve(m_themes.size()); + for (auto&& [id, theme] : m_themes) { + ret.append(theme.get()); } return ret; } @@ -133,7 +134,8 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) auto themeIter = m_themes.find(name); if(themeIter != m_themes.end()) { - auto & theme = (*themeIter).second; + auto & theme = themeIter->second; + themeDebugLog() << "applying theme" << theme->name(); theme->apply(initial); #ifdef Q_OS_WIN if (m_mainWindow && IsWindows10OrGreater()) { @@ -147,6 +149,6 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) } else { - qWarning() << "Tried to set invalid theme:" << name; + themeWarningLog() << "Tried to set invalid theme:" << name; } } diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index fa6ea2369..871e6fe2f 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -15,21 +15,28 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once #include #include "ui/themes/ITheme.h" #include "ui/MainWindow.h" -#define themeDebugLog qDebug() << "[Themes]" -#define themeWarningLog qWarning() << "[Themes]" +inline auto themeDebugLog() { + return qDebug() << "[Theme]"; +} +inline auto themeWarningLog() { + return qWarning() << "[Theme]"; +} class ThemeManager { public: ThemeManager(MainWindow* mainWindow); + + // maybe make private? Or put in ctor? void InitializeThemes(); - std::vector getValidApplicationThemes(); + QList getValidApplicationThemes(); void setIconTheme(const QString& name); void applyCurrentlySelectedTheme(); void setApplicationTheme(const QString& name, bool initial); @@ -38,7 +45,7 @@ private: std::map> m_themes; MainWindow* m_mainWindow; - QString AddTheme(ITheme * theme); + QString AddTheme(std::unique_ptr theme); ITheme* GetTheme(QString themeId); }; From afcdf4b9cf5c65d67657bf6a682eb43d61b21ee6 Mon Sep 17 00:00:00 2001 From: Tayou Date: Mon, 31 Oct 2022 13:00:41 +0100 Subject: [PATCH 0081/1149] condensed icon theme code Signed-off-by: Tayou --- launcher/ui/pages/global/LauncherPage.cpp | 42 ++--------------------- 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 4ae7509cf..a1cbbc339 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -384,46 +384,8 @@ void LauncherPage::loadSettings() m_currentUpdateChannel = s->get("UpdateChannel").toString(); //FIXME: make generic auto theme = s->get("IconTheme").toString(); - if (theme == "pe_colored") - { - ui->themeComboBox->setCurrentIndex(0); - } - else if (theme == "pe_light") - { - ui->themeComboBox->setCurrentIndex(1); - } - else if (theme == "pe_dark") - { - ui->themeComboBox->setCurrentIndex(2); - } - else if (theme == "pe_blue") - { - ui->themeComboBox->setCurrentIndex(3); - } - else if (theme == "OSX") - { - ui->themeComboBox->setCurrentIndex(4); - } - else if (theme == "iOS") - { - ui->themeComboBox->setCurrentIndex(5); - } - else if (theme == "flat") - { - ui->themeComboBox->setCurrentIndex(6); - } - else if (theme == "flat_white") - { - ui->themeComboBox->setCurrentIndex(7); - } - else if (theme == "multimc") - { - ui->themeComboBox->setCurrentIndex(8); - } - else if (theme == "custom") - { - ui->themeComboBox->setCurrentIndex(9); - } + QStringList iconThemeOptions{"pe_colored", "pe_light", "pe_dark", "pe_blue", "OSX", "iOS", "flat", "flat_white", "multimc", "custom"}; + ui->themeComboBox->setCurrentIndex(iconThemeOptions.indexOf(theme)); { auto currentTheme = s->get("ApplicationTheme").toString(); From 718a9a35599a109578bbf36925548f60e9a0167d Mon Sep 17 00:00:00 2001 From: txtsd Date: Wed, 2 Nov 2022 01:20:58 +0530 Subject: [PATCH 0082/1149] change: Update credits Replaces txtsd's GitHub link with their website Moves DioEgizio and flowln from contributors to dev team Signed-off-by: txtsd --- launcher/ui/dialogs/AboutDialog.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index 52d6baef4..a36e4a3dd 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -73,17 +73,12 @@ QString getCreditsHtml() stream << "

" << QObject::tr("%1 Developers", "About Credits").arg(BuildConfig.LAUNCHER_DISPLAYNAME) << "

\n"; stream << QString("

Sefa Eyeoglu (Scrumplex) %1

\n") .arg(getWebsite("https://scrumplex.net")); stream << QString("

dada513 %1

\n") .arg(getGitHub("dada513")); - stream << QString("

txtsd %1

\n") .arg(getGitHub("txtsd")); + stream << QString("

txtsd %1

\n") .arg(getWebsite("https://ihavea.quest")); stream << QString("

timoreo %1

\n") .arg(getGitHub("timoreo22")); stream << QString("

Ezekiel Smith (ZekeSmith) %1

\n") .arg(getGitHub("ZekeSmith")); stream << QString("

cozyGalvinism %1

\n") .arg(getGitHub("cozyGalvinism")); - stream << "
\n"; - - //: %1 is the name of the launcher, determined at build time, e.g. "Prism Launcher Contributors" - stream << "

" << QObject::tr("%1 Contributors", "About Credits").arg(BuildConfig.LAUNCHER_DISPLAYNAME) << "

\n"; stream << QString("

DioEgizio %1

\n") .arg(getGitHub("DioEgizio")); stream << QString("

flowln %1

\n") .arg(getGitHub("flowln")); - stream << QString("

swirl %1

\n") .arg(getWebsite("https://swurl.xyz/")); stream << "
\n"; // TODO: possibly retrieve from git history at build time? From 0a0ce74105b1c01bb312175a823e715d6abb310c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Tue, 1 Nov 2022 19:06:27 -0300 Subject: [PATCH 0083/1149] add rory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar Co-authored-by: Ashtaka <66513643+AshtakaOOf@users.noreply.github.com> --- launcher/Application.cpp | 1 + .../resources/backgrounds/backgrounds.qrc | 9 +++-- launcher/resources/backgrounds/generic.jpg | Bin 0 -> 335269 bytes .../{cattiversary.png => kitteh-bday.png} | Bin .../{catmas.png => kitteh-xmas.png} | Bin .../backgrounds/{catbgrnd2.png => kitteh.png} | Bin launcher/resources/backgrounds/rory-bday.png | Bin 0 -> 89472 bytes launcher/resources/backgrounds/rory-xmas.png | Bin 0 -> 90158 bytes launcher/resources/backgrounds/rory.png | Bin 0 -> 90624 bytes launcher/ui/MainWindow.cpp | 17 ++++----- launcher/ui/pages/global/LauncherPage.cpp | 16 +++++++++ launcher/ui/pages/global/LauncherPage.ui | 33 ++++++++++++++++++ 12 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 launcher/resources/backgrounds/generic.jpg rename launcher/resources/backgrounds/{cattiversary.png => kitteh-bday.png} (100%) rename launcher/resources/backgrounds/{catmas.png => kitteh-xmas.png} (100%) rename launcher/resources/backgrounds/{catbgrnd2.png => kitteh.png} (100%) create mode 100644 launcher/resources/backgrounds/rory-bday.png create mode 100644 launcher/resources/backgrounds/rory-xmas.png create mode 100644 launcher/resources/backgrounds/rory.png diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 2da8ac560..5772d7cad 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -501,6 +501,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) // Theming m_settings->registerSetting("IconTheme", QString("pe_colored")); m_settings->registerSetting("ApplicationTheme", QString("system")); + m_settings->registerSetting("BackgroundCat", QString("kitteh")); // Remembered state m_settings->registerSetting("LastUsedGroupForNewInstance", QString()); diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index 52921512a..db48af8bb 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -1,8 +1,11 @@ - catbgrnd2.png - catmas.png - cattiversary.png + kitteh.png + kitteh-xmas.png + kitteh-bday.png + rory.png + rory-xmas.png + rory-bday.png diff --git a/launcher/resources/backgrounds/generic.jpg b/launcher/resources/backgrounds/generic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4832b0a9a2d8f83f899e811376077ab7c7dffc9 GIT binary patch literal 335269 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

9x5Kl%7~>Ls_! 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� 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

;i-bv@5bEI;z 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

r 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/backgrounds/cattiversary.png b/launcher/resources/backgrounds/kitteh-bday.png similarity index 100% rename from launcher/resources/backgrounds/cattiversary.png rename to launcher/resources/backgrounds/kitteh-bday.png diff --git a/launcher/resources/backgrounds/catmas.png b/launcher/resources/backgrounds/kitteh-xmas.png similarity index 100% rename from launcher/resources/backgrounds/catmas.png rename to launcher/resources/backgrounds/kitteh-xmas.png diff --git a/launcher/resources/backgrounds/catbgrnd2.png b/launcher/resources/backgrounds/kitteh.png similarity index 100% rename from launcher/resources/backgrounds/catbgrnd2.png rename to launcher/resources/backgrounds/kitteh.png diff --git a/launcher/resources/backgrounds/rory-bday.png b/launcher/resources/backgrounds/rory-bday.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f576f056a5ac6372493f30f8f6de9ee6e50ce6 GIT binary patch literal 89472 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

Cj0m`?Y9ohuja zmVWvDgG-KL{hwACiLTvP=;?mi|B~z{*ZubmIPC5RM!Vfg{2+YJX_fo3lj&S9elB?W zpvaD4*@a6N&iO3gdZE~)te2g=wYkPxvHTf(lGeM~d!`*RaJaH|TmOrBUbAOZ>^mK- z)E^ko(En=2rWIK#zQ4Y+cW(K0lwtaXz510e*@UgC-xx96Qc=74`U|gJc}TA1x4z{m zOOG~uU7{+IH9aObC-c~cYg5{VHqJRCxbD*{jp>466WT9DTbVZ6d30T7Vm`ootmn)1 zNXb*v=H2vVk9TVie!=tIY*A^Amvw%K%!+R{S6F*(9F|VD-25Y`!v2$VWOatgYmM6+ zF?T<&cr12YJ0hXT`Pa)I-9c9(GDX-pqZT#nHQ{$*-SWWsR7E$-U-^iA0tVd@3yqzQ zT4n#tJT%W@pNWBgWYnCzOY^p!o3!wdqGSS(@A}Us6$~@YFYkM7rT2JSe@m*+&eK&H zCwDwte!Z?vKjP=sJ7-Ub)%aO71_w(eP<0FNck`oF4ns z)ZGu?W?R-U&*?QYl`Nmvcw*jl7m3SL_wmaHu~aX4B+$p;s^%qG+IQrUF(dPF(GS_i zX}Jw~n?IGAaQ<&~E3G&nE~~7|A9mnbgQ|)ogVQC;JH4{jGrvE5yxcjTKjrhuTLH^- z3R1nMU!v?)_$d|R)^Cid~T?Bb|g^Y*82ym(q0 z&yA2I=RM42x2CIdMO|L>phV4K;K%Aa$pwa>foFD}#9b4O{yTo*Q1r`s|! zJWgglWI0unJw-w#q=856Som|Tyeo{Wc5apFdZQdK?8*B%=1tEuUIAgbrk2f{*k68Y zsNA4wB=Y6?*Nz<>J1#^XDBs04?Uv(DKi}se)foxJ2Rj>H-d?)rgHgrTpL=%6X%@Kc z^x!=DZQJve%NNb{4Jw);cu2+7Dqyz%kGIX84X!npBs~qPl=r4F@orfrE9iFPm!I?N zBN6yFo z)rGm+^v+#WT`AIUIZZR`)`!+d{nHtk;x7nS7w9iJzVKY>vceZG6PM5ZAQ)A3?WIY< zL~ccu-G0_VIa`)q-X*8PKO*S3id<1?mL-e2-rT%3DdtI{iWtz-|8j_9d8 zO81sLRO@tIYVy|jF*Exo|K&bei)w6d_E~j!l=IJZKH6lmgim7bj3d#jS(jYjU%Tnn z-__e55M&s}m4Ww%?wfpZ`malyZr_V~f9%eS7Q~aDsl@L7#TuC+;lA%Fl9VC--e&}|Q-75FXqqcR@q{mw?E9^9J;J@ZMXMTR# zK1seMH)k&t{Uq13y=m(@?*H%Y|9`Sw%k}?zilf+D)jKc0`^(<3`@3t3|My9n|Ifbe zzImX1)!G9b`76vy&$k~EUlqx?{k>mLZN7=&_tyWFg^y#+WGe~<*jZwEe<^;6kFVJ5 zH}%isKX>I0&ExuiZpO6aJ-6RB#fq5Rl?py4p{B^^oT3}>KSJ7Y!LIs;3Ti!;Up8G{ zd(rpp&dm{~(ZN6VU9FD)wEEW3M-1`b56;L{n9aq%=%|Upj#VEvy63NxJM-Q4*VAO~ zAIe|OZkt^2m0@dTAKsj-x+sjPQZq1q1IJ5zxeC) z>YdJi{>&t~C_eQ6UoW@E6P4}qpIlp7ZmVA-K7X}a*3skPvs^8gu5roSbShwtOOFea zrkAVCW*xo70-KaqyxwKLXxf7XYg8_XrL!LJIw7gm$rU&!)lz7uPoRWnLf|x`S>4JV z_pNf52j%o_E($p1q`K6{i%ZB=Z(_tckt7!*m7twosX}TO?W9$I?q0UKC3pF{BT@y? z>)l(G=j`9RQ}2&~!ud(FdkvPBYW(5fb&v0S*V1(lu5lb!^S!L&Q#@^xhEk=Jopf!} zy6ux+7-(`X@_c;jQP)OQ4&$ts)3tu4vL7E*`I(8Z)IC@GH zc~!VfPdt)&iql!;(UTMV0(aH?nYeYg&Al9@pL^fs{y83Ka(6}ak7O&~--)k7f-j%qOO7(x9x?NcC>z*r5-qGiop6MvRi|v z?9)8!SMs4Ow{lC&&6zSgKgIR+R+VP$-Q8TZh#{~^hE=g&S#Gi|>yPKtX9z3`kxSRu znB0_f!uiQFR?Y=Y8&%YG1pnuDE|0x8-Qw_Z-?skB+VYf_OJhNzRBzq{U$eIbZii<+Jmz;~%~U6@nH+nsSl6n&RMz<7xB7yY;_k;~ z>6V*SrY}4BE^V>&wwPP5&skO#8gaA6vx-P9JKxWkRu=l~?CkAE@BiDK|7m}oxzRyE zfP;kzKlR|O+n!gl94t)hna|zbuYcrm{r3;&nHvv0p0K`(ovHD_>tlfvZL91BIAq!t z)_{$gqx38Ey@P^4h3t&wmGeaw%K0+e>*mUEupFAMB)}o_aLLO13Tqk<9B$EfRS>A? zc-)aKaK+()XG=(df`EmZqYrcAV}TY^0S+71!XNdG4i73?^nDZrDrDR*AAD#d$T6oO zAWxWsMNaL?IyNSKhaEz^EKKf|lUB49yDAj;I31DVV0pIVcln?HOpOOlavqZ6V0m!! z<^2Vl8V?wPd2$ajmPjqS=J4PNOCm1|6aSJ1=Eeivg0CW&8`qori-bN*t6Q27&Bfy9 z(g70E_vi8Fcl|n}pPz;4JH&vFu>P)9!Utt#IOa^5z{SV1Z=Ou4hN9Cxa{&ueu>Eq~ z!iqt>Ec4n0HnK6rC(q#z_y0B}A)Sk5o)^f>1IC=M*EAmZ2sUkA(*r}stbm&i4>UpU z*;gmyEFmv?MPMr%({W{vY=sY|Pft4iENGEpF%_`jbc|qbJP=&5Xa(C=UY2K(`k@w{1 zj-smzPB$Ld%yCGHW6wy6(VdH0;S7Ieyg>y+}X(>xS!Z43)9Zx?=Gaq-pV`u7D3w-+dU5IMA6 zS)gL`gdbbpl{fBZILEAcLC7g3%2PV~YIbU&zt_#p*N!@Il~$)0R0!5eu`N+PH0yzK z^8e)h^^<w5k>jBXWzZyA1X{ym?8IiX!Sdr#wm+dd#)e05{= z{!#LN_W?`IOzoBTdbjMFbgas@vxKE%m7&Dzf@?{Pnk?*#Up{P;6S%6*`6{qabKPB= zzbR2y=S#k}+kQ>#fQ0@U)^~ zYonxIQr&$@iV18jsAPZ4)7)vJt;r0 zy`}&4A%(QxWr9E0K3sfbo5SI#-T5U*yI1^igu3UFlb0kES&l{YY_zCp(OT-@=_#W* zDdO{W``;zsl>7zGALo3&xvqZ4;eUnK_4AB0wNIT&SaUS$c8}WA9XV$%NL1gp+}>@! z&Aj2i^bh-wf@^CpZDVdUpQ*5>aXV}0`s+T8_RRYfRdt^qSyikz&o-?m{{u~F%=Gf6q%QWIN$5n zcp%zQV>{;_-7Oy{K27DckBQ8w-9C5e^;gGKQt$Gt-ZfL|bz5qv__@wY7Ttz=tX?%H zp^q=G`)qnhNdBr;f~0<(*pG{E4Cgc2v)7sLt{0a-8)g%6e`VVLBRT)iF;4$@F{66h z+pjmz8!HGoSu9=h_NnJ2m5WL1=XNfQ>sIL!=-(-FZc>L$ul$dj`~S_3m%CSgWP{3` z+J`n;3yw#Y*D_5E`*K_ItxlqaX2Chbd0|(MX^8JWx@_acB`cC%&p8x-LFZxrQ~$>E zAH}tP-zk@1XUf+BB@^z)H{brQl#0C@^)h~cQJE#<4QapMsky&Olg-*DU-Ip`b)|P@ z+vK9CYoQk<%+?f^K7Mn=GV6Ja^!#a|6&u%lY+BhU_U}o(AICjb!;*7nTOW#jIDK>9 zoTJ?7^7^N^f4nHyyO#dJ>9(+wio>EM0hvom_s?ElDRsPi?=%mk-Y}t$7OrzYet17m zYgM~{m4}DC`l|B=`nK!lg=%}M`*%)Rv?8l*a#Lnx@YQ9)nWE;$rYz13wR*mfv!-)@ z#LhPJ^uJZ#-g`T-NLMs-9+IkvHuzz(*emJoyRDagy!xi)xy0~V(wfCU z?R7Hq?hL7i$Cwh8mbyi)Hk!2Qw#96pWlt|eSO*1dYZaMUP|{nxD=+7bgLi-vm#C)e z_Nk|)wwgr>31_wnJlZJus<1L`@2eP#{+-LJVzx}$@~I_k-i8ZjXNrijFV=Lus&egC z`DPWrZ*7zHrIW?y7T-VSzDm3y|Ka5$|Czt*Phn~_?*nC$PN5BlJy+W8-5MUhr&=K1 zYO~K0QNanvX2n?_y`^_;XQWGLVA$3PL0qq6V$9X%iI}>E7N_SQNr+i?ZD;GQjS4Cg z_t|e>w2F7~qOPrzd`?&0lrEQXy}KaoT}-&T;m1oaM6S%k3?n zMb^e0jOhs$xa@9bxjXcd`-ZhT3pKLa9y={9EH>=?8Ww4~_~Mo|J*KS%kBpPwp1pPB z`$wkV*Y{X`-=Ji&jbjf3I9V~>U|At$t+OiaOSk_!oo`W^+T3s1g{B2@sWg>MyKqWq z%~q3RL06A;-#x<+V%pYkzyJ8#y@J(;HMbTnDfAK2T;!3sCfQ<^(aJ1=fGNDkqNaR# z7h_xeJWDk_aD|F*QjeiXXmfF&hxR0o%cmv<3tnBE`C$E|`oHG;pQzv8{p-kmZ^aXr zXINbF>FzRFH~HWak0~M{y^damc0pO`CVF=A(@l@vvip$VVC$z=@cGh;cK&76XUbIm z$;@~Z{Qu*de>J{;m$#g-{2&7=z;!KZJkQ=|zJE*BCoEk2*53Jl-);N#Z|jUOG5c?x zOlf*ionez!nMJ(LkaAulDsCn|bDHVz!b?1t5+w#fZc&~X~%3GR}=`+ja z4ZpfXa^@P*b332f_=_!_cKg_ks~?x#+4RBuN9pT!*&D^rQoSti?W~pCpSHWt-1F_@ z>&K5*Ob+SHkGa@2_0;yT-_xg6y$lMJEX*$d|GfNrH^=^ObI-?pe(zUR!PE#&VT$_> zpa1Q8^~vtTp3$C#-^%0P6}>$qz0V+GauEh0^G z{|cUS)b2icsl!A2l8O`O!DB`J%@?OMU!1ZkZ-$8I-mtbXJ5wIx%@Y|^uddwtak}0r z{Ra|t5(jf+&Aj>U9-dhIKxU#*5XVN2ck{DU_4w7U)*BrAC%W(3*X?)wFIw$UeB-=l z_Ya+Y&wl9G-I}v|e61GqMDw$JkPKFt~P)7=D&RX z|Bq{LSG0fo{vmDE#g%)19=P5F@?Ed&gL<|vXLld=v+fPI+r4%AI{ng!m)qz4Oi^Ts z`hCuI>&A%em)nHy-HtnIdHi01my9N#oA8|CEt^|ZuBo_h6Ljy=>AWG^BkAjvch7o3 z7SG-=FQM1Vt!m<@{9aVmwK-(|VZ$1kDI!}wvuLtTUUVqReU{4?E6K@=g3f)cOS^M) zmD&9@ub;(R$QPcARyF&v;*0d=+do6SOm^ootX(p}>y(Q3mdQc$a#IUsGF4CQa-2Hp z+?%h#D_?Hi%&K|Be*a$UU;Fdk_VIjZuQ2@Y-L!+v&q3hYf!l3|r|+$ak^a2;;*yx0 z^pjup-}6SidfFcNc(Z_$Kz8d!CMj=g{~f#bo>Dh2zbP$tr8o6?f=j5m&etgZj-`_( z#aS!+D!qH#E78OK?hW5fTZxOWpXiiEt9)GjAC@6&2 zi)&KE<#WM3g(k@9{rdg<4 zRmvQ7;vGv*Z_;)XCdhZ`MXYy<)|M2pK!-E^3 zjOKghHc#Kj*G1v^@B72VcKv+yE@6||ys(l_PhLh>aHy&peagG%r~U9u5x*i!=-mf% zQp*jFSspLi|JOrhmdmWIOZ5tu+?4m#Slzbw;Eabm7TiDiVw=&V2>IwY^N(!i_2xgX zTz@XFr+;;=tqr5Br~eJV@NZU3G8lh3d208@N;(+0LUHuv*)&I_v9n!C?_^Iz!4=}kt{ z^WO2)-OXL7H<^MQ+-B!CEfkzkaYX1r_)*fYuiks@!8<4Q+c#p~U8-wx{t@Y+nX%OH`8BZ@Ta6ZZd^~!WxovXSq7^raFJz}{ zsLD^=pmOO*tgE%RgfAD{V$H1^dDK};lV5Bzz7#P(BEdf_?(>En^Pa5q_xn5Vie!xt zi_EgK?T>{Rw`^{S)4n+SbnG>;+eIsHFPf`fx9I$uBbjooc4f1TKi_zKV$zBAf73kw zCxqPFcutkYk$27ng*A=OQ}2B)mAwBff9~(U`P)A}s$kzQwyk6Tqx*-~cYpn;6ybH! zwlijeQ;f@`?VqoFjn15v+IhuG@4NNeI-!;O1eA1FRb{OCy|wt8v8GF`d76RVsf%;x z9xRh`7dM;syR$HFZKlt}V;A3d@A}ssUt6_$p2*dA)4#Xb-;IlpknG|9yXO$sza?{y z%}UwmJL|{#^Xu*RyC?H}U2-7ewAcR6H-x|c+3A($p_w7oUEFufYFTQlz=Ew+dYx69 zgnv9d@kQk5S5=c~6;D*>CdY)lk?WD{S^mV+Wu9Bj<40DvrMpWu{Rmm~*D{K0T9xj; zJCbfr7Y-(VoPS+mU1PFvi)ld&%fHW;4o^3YIdGjf?(qDQqM9XE^X~e8e99GEv;Qv7 z1t*TF$D+P`S~Fe6DtqgtbwZ2gs}=IB*pqd~L!}nV*jAiu|B?vNex8yGAzqu1Uwu9owgif46-f+O@7pu)Kdq0udpLP& z&T<@*st^;pacKL@-5uiB#P)UmVYADcd){Jhf9mOvD{ty0ES<7!_R&ZY_q!e^Lp)}B zDTXA=vLDvWTvN#R$>iCYQ%rly-0uE(=kj#T#Oh?8i9r(CE3@qxmd@L06TQ-0#rJgA zF{?>8%-4!Lh^!2gd0E~naL0DWwf%pS+Lz|}ZJ)buLkH)A%U(Y|Tw;sztSf#j=X$fC z`g=p~Q@fYJUfC=%W~~=~{ZxLT{+Vgw%fmM7mVfYGmc?_p&@u2@hUSZJMS3|ppAH@^ z{iIU$jcuN=F6-W~uFo8Q()YIhubDml+o8toT?%U&7u(c?&SSJ^`zNEnO49D@?1x7$ zKYY!)ydrRK@A~hnFGqZz?4j?a8J#I~JoC-$H&!*r7w$5%_#j*Hs6*wN%fuuDJ&7Lf zEt6cL66f5X8bqpB2ovp>N`^+PL%& zfvaw9C^k40k-b%9(OlI>hmJ9YpIbX&uS?+E+AB4?y^_`4TekMvhqEQ}%5*ENVf+yO zSTjzi`bTMCgFVwfCVTr5&h^TIo72AEF&CP7(`?&gk5y0W()UhPU7ac8sj52hn#G;O z+Xr+yUu>(Hn|@WIYtyrH?;7ql8x}sXpY%2|T&}(R+M)xlU13teSKC$@K6!hBdyRn4 zsV<$qnY+4F(p6GxO5gA=|B{yb=U$lK=>s8GdCR}KMPx^2sBfBjY>nQwoi$}MZF=Kh9qklI z*c*MrwAZrW`*9XEn_JZu0u@S*5&Q3D?AiE2`cC=tvXAPM_#5UI*q^mN;J)1U-TV}- zJvYSe+AO_)y1H`GoYz|}rQCa9cd1L|+L4KB-O7(5gtOn@VwoW#YX0uc#n(?tqBI#c zhN%>`6!X27i4>~dzAWfSl;Iqobm1fuFV9CF!Pna|BhR+w{9bV*;&pnn+rEo`_x=@} zfA>ymeZ+^GYi-x%onLe^*unGUwXFVwOBSq=K6NV~#MIDWo`}h@O=iNsrZ+n5x%2Np zJY(qH4d!z$NjRH#zkI?u*XH4&V@hjvex6eLml-L3dDXpx@jmD7zHU6Qk@L{6ud3|( zI^)%2kGe02{UiFTyrDm>fAvoJseV(0{JbnXmPkFRTr$0SZcXjVa^23wM=gRr-kBks z>AJ==>bKlZ|ETOMr`$LCCPzfR*l;Ib_`KU1*=rw8-28j<{4=IM43b}BkL`NR_&s*h z=fGTswK_{z@$P1K<~ycZn%ucKIJ#5CTj}2II9KhX>+9;LU)*v;(pe-^D*1-2&x`U+ z!NQ-ncdp8_kPwZ?j(C@*Q~LREo6O(fQ#vx-?1w!q??{V2u$N+XvOau(lk@(E_2NwX zTwckXNxzby0O!Rgd{N2UAcgiW&Pc3nQV?|Qh{)n{4tmVJxzq}Eat~A5``hJoYF~ES`CGs-5STq}mdBogeij)|oOJuVi18Xr5E*f9mp!km~Qx zGS6InE4nQ8tav%Ugpbz}hV}yyr|epVjjR6C-qr0}*W_nii860HctiTiuiX2( zntdYC+O}chx8mQP-lRDO&i$!JOr+-=aiZAt&R>mN zBKlg}cH^cS-P6RZF5W8g|FUbX%K1sHTbJgonVMoDQT+0d+V^+wihrM*C%;?FzJA-8 z>*f1wf=~Uu-ncYwwsiTo9j00rU&)1U5BJMmTk0p2X}4#Or*`+xNADP`n>8<=O6Xa- zY1&=p(}&i$zs>xx>1e3UG2S&^FD zh4a*QUG@`n+OY3VdhJ&Euhy2UPuETn`1ADspQe);UY8|St*UFyfBodh#!U z*OXKVMtDBfxO*$YLvK#(`Sr0kPlb!^E=tdDF>DK)SM>Ff+U)G^oHcqEPEEdPwRFL% ztZUcBemtu)CvKj(qW}KQMthm!^7=C~r%tMS{^k0|Ngf-w-AJ_1oH@;O z|NdGBne3JcZ}|5zX0N3{P4@_ zYWL+H+TJ&!qL-}5diSPxXJx*_{<)uwoR-*h?x;xXT(;5YbldFRhn{ z&y|*k8Br4R^s8*O=AEDX$u>_nJ63v=$0e`iiATCNude+ycX@Z#RSA2Z#BcYHRXwj* z@??$bvF6^de_Q8UU$fd(+&A}NOJU$y*HUr)RlivhdFM1JtjQNQth-ynIRDw-OMm^^{d`B&OP)xn-zRm0CO$uzDEspAiq~yn+R5eb&weR6 zv-n!`#g@Izir@Lvt{fAxch@|#=X(B^DIrDkj?9UEU;Oyq1e;#X)om)5BC>DZl%J^n zapk#m+qW;iYAoNmEhXDbvaHEq}@d!)ks zJ^SYR=mTv*i|%JX&(7BV+grDNYF))!oBD5yU&q+(cU)inXW@PR;{5ajB~kP4-P_Of z$s{dxVe^5+HK{=%N8UbOuJAm9-S@Gz)7k5pYfIZzoz69uPRpBj>HQO*(`^fN437!9 zOTE@%f2>*iaPEfXCm$~gx7c@Jo{NkBC7DHrZPmY%ts;*ksVDEe@08iOkxx_R+}X+O zhvIigcn4nVQB!@Z^Q?QW;Lj?TWZlb~maXBPdx!h=mNhTSjh3bMZtW|K+<50~|JL}) zix#bz^>M?B_Yd@a_A}%O^msQ43$=Vb>-Nx};XeDm-u$lp3#UZ9DgXTSXk7Z*>$$1+ zf4+&<{dlWg^Z0IYiS=>olQx`+ES^G!bHgmYKTA8_BJjo9vbveGckRx-)}MHF=LuCt zy>|G~QEsv}Bh~QnqD6UY<{Kg4fF{Dzc~a-1h^all-)o z=J6c%bX-4mk^j!dBZn_)&xvFCtzuXkC3VB{ctVVU=BihJs`7W;$o|T(Wy+Oa)u2o1 z{7S6n0!`V{WG7xyNvaPC3gdmeXp!Nxk6Y$#-BL28)H%@f%Pq~V8{hQ1ryM`SG9~oz z`+awwzWet={8+>XZ%xrUr(l6=2Rbz0dsYjuMgf`9{htJ99nC z+N@b7*RJ$_ef(w0l02T@kDENa%h-c=t!?pq8T<0GQDV8l(TMhqeVejw$cn_=d0}5X zU#1|x{zyht==SpV{YS1>)wivWziWNbk%NWf&@VNmj}u?UKRBH(lwjj#zI?5~t8A}j9%s60cNbW+O`c?OP2%-pz2`Mq8}oQP*W8q!YUkQBf9I|2^f!F! zAzKq|*1mY6IeAl3)U_>_euT^plX+UmR4sMen(v&YJ{4G}qd2ZKL%ZA@{0ja^GraT~2mc zQ<^LxZaR60i3nwil`Xv3lx^^vG z`p*4{``5KuJ?3|>v>jY>B&E;fV#%kL=-tY{-im0lR3C1#xq4^r%td_i`S0h?pB!;H zcWIBB-PV~$+RCOS$k$z*ex%!Pfu-iTpWXeLS7(&TeZQpPrS9sxer`}0@3CKxP3DAH zELbD`?wx-?(61FC2i|S?z_x5vT1)GZtE38>>E_6Su;GXJBExWI~1>LLu{+5r6`u~mn zy-r@P&eHd>R)@dM6t#N$W{UC^_Lb7k^VD^|1?AoU@@$g%RFBL_7K;q0t=e|yp7hVs zkUv$g4lY@8-|O#{$umEf2S}^Ap53yhb4p5-S;S+B9`9qWzEatIYN~f_7Os$5bxfhv zK9661wN2+lr+{m`zR3nr`=*$DSe+)f((m-F2=A*WgO_e~$~F}~`pMwYoN2soO%~

BZl8^Y@AS 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

Cj0m`?Y9ohuja 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 z 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

H?a^Sa`+O=koO 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 literal 0 HcmV?d00001 diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index eda234df0..2a6e8c1f3 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1560,15 +1560,15 @@ void MainWindow::setCatBackground(bool enabled) QDateTime now = QDateTime::currentDateTime(); QDateTime birthday(QDate(now.date().year(), 11, 30), QTime(0, 0)); QDateTime xmas(QDate(now.date().year(), 12, 25), QTime(0, 0)); - QString cat; + QString cat = APPLICATION->settings()->get("BackgroundCat").toString(); + + qDebug() << "The choosen cat is " << cat << "."; + if(non_stupid_abs(now.daysTo(xmas)) <= 4) { - cat = "catmas"; + cat += "-xmas"; } else if (non_stupid_abs(now.daysTo(birthday)) <= 12) { - cat = "cattiversary"; - } - else { - cat = "kitteh"; + cat += "-bday"; } view->setStyleSheet(QString(R"( InstanceView @@ -1576,10 +1576,11 @@ InstanceView background-image: url(:/backgrounds/%1); background-attachment: fixed; background-clip: padding; - background-position: top right; + background-position: bottom left; background-repeat: none; background-color:palette(base); -})").arg(cat)); +})") + .arg(cat)); } else { diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 4ae7509cf..44421d3bf 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -334,6 +334,15 @@ void LauncherPage::applySettings() APPLICATION->setApplicationTheme(newAppTheme, false); } + switch (ui->themeBackgroundCat->currentIndex()) { + case 0: // original cat + s->set("BackgroundCat", "kitteh"); + break; + case 1: // rory the cat + s->set("BackgroundCat", "rory"); + break; + } + s->set("MenuBarInsteadOfToolBar", ui->preferMenuBarCheckBox->isChecked()); // Console settings @@ -425,6 +434,13 @@ void LauncherPage::loadSettings() ui->themeComboBox->setCurrentIndex(9); } + auto cat = s->get("BackgroundCat").toString(); + if (cat == "kitteh") { + ui->themeBackgroundCat->setCurrentIndex(0); + } else if (cat == "rory") { + ui->themeBackgroundCat->setCurrentIndex(1); + } + { auto currentTheme = s->get("ApplicationTheme").toString(); auto themes = APPLICATION->getValidApplicationThemes(); diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 76a25f2ed..3a4e7da4b 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -340,6 +340,39 @@ + + + + Cat + + + themeBackgroundCat + + + + + + + + 0 + 0 + + + + Qt::StrongFocus + + + + Background Cat (from MultiMC) + + + + + Rory ID 11 (drawn by Ashtaka) + + + + From 668342b4708fca830a0650a6902805de3ff1380a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Tue, 1 Nov 2022 19:31:37 -0300 Subject: [PATCH 0084/1149] add rory flat too (and holiday variants) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar Co-authored-by: Ashtaka <66513643+AshtakaOOf@users.noreply.github.com> --- launcher/resources/backgrounds/generic.jpg | Bin 335269 -> 0 bytes launcher/resources/backgrounds/rory-bday.png | Bin 89472 -> 83235 bytes .../resources/backgrounds/rory-flat-bday.png | Bin 0 -> 57713 bytes .../resources/backgrounds/rory-flat-xmas.png | Bin 0 -> 59495 bytes launcher/resources/backgrounds/rory-flat.png | Bin 0 -> 52337 bytes launcher/resources/backgrounds/rory-xmas.png | Bin 90158 -> 85543 bytes launcher/resources/backgrounds/rory.png | Bin 90624 -> 76448 bytes launcher/ui/pages/global/LauncherPage.cpp | 5 +++++ launcher/ui/pages/global/LauncherPage.ui | 5 +++++ 9 files changed, 10 insertions(+) delete mode 100644 launcher/resources/backgrounds/generic.jpg create mode 100644 launcher/resources/backgrounds/rory-flat-bday.png create mode 100644 launcher/resources/backgrounds/rory-flat-xmas.png create mode 100644 launcher/resources/backgrounds/rory-flat.png diff --git a/launcher/resources/backgrounds/generic.jpg b/launcher/resources/backgrounds/generic.jpg deleted file mode 100644 index c4832b0a9a2d8f83f899e811376077ab7c7dffc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335269 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

9x5Kl%7~>Ls_! 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� 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

;i-bv@5bEI;z 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

r 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 diff --git a/launcher/resources/backgrounds/rory-bday.png b/launcher/resources/backgrounds/rory-bday.png index c1f576f056a5ac6372493f30f8f6de9ee6e50ce6..66b880948e72ab0833ded55169024d339fac11a5 100644 GIT binary patch literal 83235 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 literal 89472 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

Cj0m`?Y9ohuja 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

BZl8^Y@AS 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/backgrounds/rory-flat-xmas.png b/launcher/resources/backgrounds/rory-flat-xmas.png new file mode 100644 index 0000000000000000000000000000000000000000..96c3ae3811db74674e47dabeff9ea411019f5829 GIT binary patch literal 59495 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

Sc{=HEL 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 L{an^LB{Ts5ZjSUs literal 0 HcmV?d00001 diff --git a/launcher/resources/backgrounds/rory-flat.png b/launcher/resources/backgrounds/rory-flat.png new file mode 100644 index 0000000000000000000000000000000000000000..ccec0662bcbef77e2c9a59d6fa5cbd4414193804 GIT binary patch literal 52337 zcmeAS@N?(olHy`uVBq!ia0y~yV4TFjz&MM8je&td_2SX#3=E8gna<7unaRlv3>p(l zC)#=+4iIU(zpX1tTQWqT@I=7Tg{_Me`l8zPT)oyNTvgra8>Q%Z*tbh0{NT}r4-|I& zF#W+_A{ryg;wb1c=MQ6@ZqTEhz6)J%3Fn z?4tYDhd2^ggj8BBzd5N*cDw$ga!FKI`;He^_pVEB;huH4!NLBc&gPxoHvV(&73ChR zK5}@?5|Ix7j^sIf9yQt}SD%|7be+GS<#SA#AV=4{qK&;*&C*o!g!~2FeHR~^^<2=r zGvnGRqo;;Zj|(Qaa(SKz2t269v!f$;TSnU4+RnCo&eTr^zizK+n!LC}s4{s;*oxI| zk?OIF&pU*k`TO5Swl?k7dpS?0z3b~#Dx%d@qU z)XR^WRmBkVmTB?%ZHK0|i7XPmQu^RAlf)Tj=kEs&?6P0|%21_lO&WRD&6g#iqHI`6J$U|`@Z@Q5sCVBk*#Va65q%QG1m7}!fZ zeO=j~aWjfZYqT%n*SKP@vSRiUJ^AXNbz=N7$lL!$GT6?y(V z7qM;nDBQQ1dw0!}msGOsqqI8=B&u`#C)q`N%O?hTH5oiv=Igmz(16!tcigeI zrkoy*pe3go8Om11&)>JH{>XRhuuE%FQV#TS7Btu2cpG`S$7ZeYH}=i;QNI@dU%4h} ziE&_?QR1a1t&Iym?s@R^{Mj?sEYkX`pPV_jy~0|oPNzQSrd+1gs98Tzx>6#TFn>kDx1$>ktV%qBba<}}Ao3%C~*CIl)TJJ97 zS-t*0Pqtb2uezw;-`#%JA@)^;N3dVPiJyzsUuP%?kne2K{pa_G{pv4{kZjwsF3;Gg zUraY<{q?N(m5gIxXkhSkaSW-r_2zHogw))+>+E&&p1&!NFIvC%-q!nd)$vQiyt8sW zJUV&a64L>eSO`VWoC=e}<)n-YY(D`TgGW-+#(9M!{eW0gK%o zm+cyxn$qXW|M;@{_rJUI|6h_`Ub~Bxm3^7Oq^73iN19AYiFWmp3*^6hw{8%b!_K9s zsWC&yU!afegH-|N4ECr4+zq^U*zYl$HJCooO<tNOY4f64nx zub=;a^#7OQ<+WbFA1Mk(GSub&`)b&8`<2c{rW(N?>Id|hw%-uEqJLyb!YmP|pn@bD z9R>f#Ivi)@#5$O3)IY>C-ES|bqt2);sxd^_|N6S;RdrzK;KceL_%@=xxTw-wof**xne=wy&2{!+pk^C9#p7QQ0jF zYaMM;txGrr1tm@&W`5T2p0!T>8~csvV{F0$4$C1 zgLUV`|2mCP|4M6*zb|bJ?Kxq?u&?!|Z~nyYuC}Wxp|Kal9riRuep&r9oa4?}dF?Wr zaM8(izx4|ES0w0khyANyWSQ}1wb+K1jZS(AEl(pA82)Lf>Hgf$T&K7He*XvN`E^?b zCO6dva(Eu}oRlQ?W4WQ&bVK`&!pfyT=X)sr>VE50zuA11`pm44E2bK(+kWHc_s3bE z7}GxLB)1$r$iZvq9}9Qw;jn9 zGk6alH@ulY|6oeL>GvOZBOf$N9Q+x*y!IpO@8ugjxcsKb?!MliaO6pArfjt4+1usj z74=Jtzch>5_;CG+eXu?;XmheAtNad|!$)VnvTzekxHd(y=jz8upR50OeEwMXyYH`z znr{t9YiN<2hR&p>%a6UtdhXg@fs zbNM^l;w7`S_U3tBJR&lyPN+gM;>ib2QTbyL2LGRJ(chI&FCyl7aNp0D^M5^DDdV0! zW3^XG zr%y5)+dD#T$Z`ITHefv0EusB*hxrG)51bE#7rQLq*81V?)BRtbMbC$rcJuo?4=-IBc}qX+sP+4M+KoH%ZoVteTw5n| zdDf#fy{)d<9YF>CnfDf43(&9JQ?v1?dHy;# z$yQ9iXGrbrZ+@?@V_Nz7o7K!9ce`hs+t|G3on1XWZAR{#TXo5-J1TE|2NzC7$0~a& zJbcWqK5vjemJ+HO_4;Vg$?AuHqZhkvjdIe=T|TpD>b3M}$D%1_NlCkpS8ww+7JX#$ z^w{6EN|UqMqnuBcf61Pn?y}qND$B0sPj;>g{>B7yoRm!EXDl@MDlLCJC8DJbR=aY5%{S(~w+m-EpaYL-vt+o9AZvSbTS1gO~r*JI_ z3ARdGePk1hc>3x!rEM*RRkxD`*I=cZmY z%WV;enYX$yb)VYzV)x=JSP=V@;cV6;+m>kYn1!P$T}q z+OYUkI)8D@=}94{7|Y+So11d){}qp^Ka2V%99%lZ%`P!g#9>mZ%lXRJBD`m=ddI}) zB%D6J-R7dhEG->xfn%DP%T`W{nR02#Or^6%HpksGdvhfn1EZ2XJ!fg^Xnx;qctPaj z#A0_vmE{NIn2K0`>^7hZAMOT@a!aQvstqsR4Q+zwG%~A>WNR6p| zykGdI*Rs$5Iam%GSiU`N8>*ujkrO^4Xpuy;xB~0#_wtG-j9jNIS>d6q>zFR^$Vy1F zXM;*+TlVc1&n_R<#^(lIK{?)&G<|R0FTarOaWVe&oj{J0oSWJk&M^O1{LpSF`YiaS z40mFd*SX@V>?v6_(FyMlYXwFrw@!a2BsH1(~b@uPY zmX9kh9`8s#xpve06BZ}4=4Bgp1;s=!YVoWPXb8IfT`RcDAn=Iiu`vBbG8SLl4THE$ zW@()Bn0lx@*DdgrhTqDmu`K86xTWs1?W?=>ed&V)ndCg5gMM;C6Qw@1H`Fuz5%t-8 zc;(vEdCwJE98#Z$drWE5sQz_naihxF3sJ($B?BitvJ~^2X4oS%<*9+1|b4r}u z3cXf|%xx6B{XEpA;l#$Z=9heq-c59wrB!@>OCc}c;TE6FOFomAaA~s6yu@>Oich9h z^8}O7o<%JOHOwAe;(y7XJmu0CH^aG(9h?8_9hCY!a|g5Qv1^r!HhA>SY-e#vNK&xx z^?Z0YoZ;_+DW@6h9!#!QJ*OME>Z9zz%Qi7l&JyWIJl!T~HN|*r|D`zffUA~a;nk8~ ziiMLN?KGR~_#@`}#E77KYp336J*O~hqLYB?v8-UPiJHFU5`xDx=Or6+B%f;Zo}@V? z?3ht!@S-CfUilJ}(`K!$>v%6IeqF;$pdt6I^^L83e-35dpWf6Q%yH82!wi#q*Bk98 z)a%MT|6IM!cW2Ei*3@9d;0a5lPFL=kl(F=)t8TJ@n#S4{OZ56wCEGX`YaA@kVe{-t z_GC-+StW88F;I0KAL?!Y5tufXSQfsq>DHirOF8j zc5=@9ukxYV!0~Ic>S>W_s+p!E$C zI7zKxovF&q!uZHg$8w2>x5QRnQd!KRsNiRO#nQ)Z1{+gi`phi8Lo+tLfA-zas7L6M zk0FonD%I)t4BR*lYIsfD>2YM`#y^Wpk{4SaDqVA@t1;_=RCb!c#I$7>lV@qh?9^ZV zWVMK7^z%th9?K5MiFLHj{P>aGaOECx|5q`;nkTMQ&Ah&18nadGWrwdeY59yQGu6%= zIGsNA#@a8TQjfoQhn&2}}%cuxI*X=NI6>aLGj3*Z9$qkgV!? zH@D8eZjxYd@p@oVP~%dA%$3_zZ@zNhvMR0p%?+W`lX^aJeN_pr6bnC=Fl9qx|BH6R zsv}GCj%-so_PE0C{ppD}1AQcpNd|GTB{p?VT@n$rD5PmhQ{a@0OwPGIQ_f5|mF?am zpv{{&$@f*+Aq!PMqnP81q$+G)@Vw+zewF$@GyO~Uf&JERZwD1va4A}F%XD=}bz7=339GRe7c?Wzj2Un!P)im=RN_wO%#wRD_1-vX&61 z6?e1@nHCv_#nuTVzAK+1!L91qYx+21(%QNcPOB$%f1kI8@jrLL`z`Oi4?fgrc_Lt= zqQtnY@sT`xT|@93lNrlqW?s@@;lF16rRwlU`?;@GFK^Si^;Rl0e$$>?Gv8GGPW0LO z#7IK*i@Vy@@Wp|VZ6{_Nv45oEnr-kuYuTT<;oP~i-rPw}*;%UC%D|G*Iw@(A-P$Sh zj;x$=tBgA>$~aG9!Iqte6E3y52Rbc&wDBUhWXnnAu#-Eqw+cLZEwMd}sWtkwO%TUP z#!3&DIOc!;2l|<>UbZt|YI-=(Wt!%@`}Y$JI2a%E+rKTg)``kKr8+%4ZpQM^uM?a; zBorU`+q-WfYa-Ljz)72myXN297#(I^e(rg6aKGrw<`D;nf+Frmn?Wx&Efq{vB$Hf{?k|%`cG`dtUq4;7-1k9N|B;p0>*!{m)K&A-R$Y`nniL~q9>O^@=qKN=E$4SJoOwOrS>{cz z*%2pqXcx>$vFOv}S<9w3W7ov3m+hW6Ee`y0>sGVvBZYe2AJr1sPkcH!B)<2)zVYR^ za@*pL>eJCByPfB%NX{u1oS8Z8=f3wfocA}Mobv2n)^*OuTZ$4FE;ME>oL4lfxA|ae z*Bs4~d+W1fUfStNyzNhNOLUT0{$pLQ0rMKRfC%O1GY=`;omC4xB~(>1+XM<8pKJU4Zf@x! zi?hKYU)M2IAH3<5Y{fp?M$fTa;NqGeUk*zgpA?by@8l|hFI}|jUDsxXuRH%~BEL?f!OHz}?{)N^oA8_8 zYER{7#=n6s%g!xp@X$=?KeOyPe{WchxLp!k!rF588`Dx2#u}~-mihU5+LT{Mxz}E{ zd)TD>;STpnIa9@Yfgkz?n=hUh@ygzEX-Q_=+Xx;uMW%}9dw+lVby!*c|CWnVUX7>I z?W>N4JbnJ}YvPOx(k*++t9v!f?xvm3lI=*o9T6mO>}1)kH`1edoOq_+y30 zTt|=9QWKVO)$CH(mlr+h|3mrums|XIKH#wV?zE{{^1=D!TeIh!ytb36<57#s$qhLt z6C@_3c3sp^I-{;MuRN~4vN3yl)Z`PD53HB0eEE9IRoRQuE$M12^jbO9xD$Vccxo2p zX#d}Ia!Qgxmycrnyh%BpmW8KnU-v|7avWK*PW`M;`NKW0{@%}6yMO16b#uP06qA|w zJj$aiLOJ(L!^-)Oc+?d*5@$X7%C6`+X_3*&_c(%U!tj*tRt`rY7^JuUiDY>?K@WD7z56z)gx&et_Fu=J%@VGZ{_&URwbcCYo;z=RI`=olYiXvNyYrQG ztOvi>ewrGmsPugPb3aft@_nd3Q1aUL+V2EkvGaeo>lo%bn5+zIN$kmuF4@K0w)n)B zKXPq1wxvwzJ{6h#rcHWzz1gc}zq9iVoT4V_oZXPiy>#opjqj^8e2y}JLz|LyxO zK7DkFC;Ro>SnJ=L+fpUNuT+?Iy}os3+v^?Cd{P~cTdLNcak75ktbbN-!IgR1UDu?} zZ|$7i6LoZX+*i-bJ;@Q>6MrVCmFPXGwEkMS)@zl>ylnrv^To1DL|Eoc-hb|AfrchW z4gYDOEz!Iw_gu}plEj|R;&Hls$j!@h(lYmZ96ii`9`90`TmEqBA)ED&ZyfR5bh_j6 z&p!g*r#$Cx6JEk|hH>xYnoCWOAMX^HWP9xXKfMR~OkW?@<=x&kG3Xf+)4JCaQlA~( z_x9e!v_Q`?Zr@2uEc$x4sJy?k!+mjBTK4Mm86t)#PQ=Pu$`Iq;0JR$TUy}_QvWZB=C{>^4Nx81UPA6qmWC_KY7<=O7Q>!l}+T&K-! z_109@@KVpoDOovR;3JZy^1i5YA*zKQ15b1LRJ?+sfP@@eIDFP$@{g|Y2X zste-Q2XM2L+E-WYP`)2o{!6)S@r;VD;uop!nl|ThH?CYYJxD?DNM=`ZG|yoR{z=Wx zZ)N0)&sgO9@?feB}};SbIkE2SC?ITvZwa^!tIA^Zri!fJYKBRl3;Y$?(~%>wxwqZr*J#8 z#&~d@Ge5s&f{lvOdZv2O%Ui$SklAeAn(#(je)l$+KhFqX-x%oi z&@%12{W-PM#uL@L*G*{(I{ElgYvsDQ$VGS8J-#um^6b(N&!0z~IcG8{aLNn)f49v0 zOYS)}ytlY9&2?{-k+03=Gdu3L%;>o9rzmlKUqxT<`&~QwdKqMHUrLbWwwf^O|bl(-GV62iVqG#YU$hg66bt-RmHdOdC>Z)Gc&KN zb#K)^8@=vHR?KU~*S?v*4tHc7Rp$}Dw|~3iVzCKnT~FC#tC};yuU#<-xOGHGXXg70 zx}EQLPM(sz_TaQWIfV%kxVn z*gU!POYw}ts^sG-nUOu0HJcRHD}t*N_8mL!F^OgA!Ou4PzV()SUfvta zoh*LZ^SEz|fnj6O$(ZMNa+W^FaP=4@T=?eJkjdQA3NjqN7a%-HWl-gDx( z@usih{W+<~WiR*^Imh3&_#4K&&bCjU!zC?AK8SK)AS(0R$=Lu4>sE8-vwFtH62Q_ z;PE}(>*JdhbS%&4wwd1MA1uEuD&z7rBgLj}%8zkY?T^~(vQ@}NNr_?G(!wY2THU=I zx96{!kXL`?Q`GdWXYB%~Tzc(Z@>_Y4bJ%-s#R8q~i1f)k-9Zn0r8KM7`Oea`Ic~O9 z{AZI+Lj27TCl0Nt36s9v&Iy@0Gc#a)xZ1&Y?I(?n8u0vlusS?4?&ghh-s3;EiXDmw zn3p_TOn2Ihh}Qml`IBeGoL##waLN21PNQF7jo+AERM%VO{tIFX3aH z+jL*@_Jv&d%-U1^`gUve>zdC#oG1CRm-J<_)-O^rQtRtIee$zS@XfjPKlr<*Oe)&x zv~o#gOh)k9DH_v3eN2tMlSZbQEH`q(UVdwH*;tq;V;;nn75aD=CsY5=ooWo9i+QDb zxwh@yu6FNF-X`!$vps=fU0pYVUr>+Sx9G1c?@;P?Oh=h(rbfy!7H{J^!_}J0@aQ zVrnV#QXj|1y|c?BXUtz1!}p>jZ(c`7&-v9?*95JerZLs#)>^53?*rG)usHd6gZwRv z?6sXjlQ&g;e#cfm&HU#x>+kC8)*Uv|J9FBob&8NZ|BvO7W}F7U*RAyU9<%sM`|jeV ziyBE~%RJ|(Y`I;UmM+yV8uXdNac@|fh}&*2%nd)p+mp-B-7y3HHl>OD%NDd*1Z;=^d_=NiS zY1x_cTRRuc(C|B9znfwAzWHWBT+h;^&zv{qWa{_2dH!~xjpfP%)A;94Q0NPOr1JP* zR(t-Q+7dxYaS1QYg51lK_C48sVvlUc>xdoO_8$IP^5bc!*X8!rA)hjTnhHx-HJLK0 z9e(@iXyuk`Jcl#fSASJE&}%Bm)oSc?x2)t}KRNG@jb6f*C7CIin|90nlI>xgs+r2A zKGiMB=t)^e*E5M|5z#p^&;2~)Ho3?g2=(Is^lp<-a_61`ne%He=9K=j==0qi=(yPP z(HWo5)j!I&s+|rxWT5OTyy~jfH95PNf0H67wf+=K6q(JV_~38!_njL|+Jn0OC0J~1 z>e=o1XqQ={#oRONavz%Pz7_P~a!$yMxoiD*-G0~Jt{?wo<*K>&I;MV=dp*0^dG7tg zy`0SFO}po&YF%SKKUYL>SKr?BZ&w`+3^gCut(oF|X3Og>(Y$&(XKlZliaA}#yY}Oj z`MpE~iMQSyC3ZyyAMWhQ?a38l_uKe#;q32Hm!l?Y?zQgL?teVN=;h9|O$R@-1l!hM)J?uYT}%doC=rbjpr(&9ANc&wh}y zpPm}Itbxv|l|e&cNc`*{4rd?)B5#@J;S$WBXB&DYF=UPd&}OWwz<#OSg{yl;$pKxi%|n z>5)rLv!`D5J@nz@<4LvWXO_G&yr zrXTL*F4Gmdy!6JglDP$qFG|)eOOTr5t|&Mor=Oo${_Liluk8EZKbDv7S!Dmb`dqh{ z=H;6r54|<;&{)fPxaFZiN^0rlGhY2kY|R(WES%6}(DTt&{C;`aQS~j? zS`s^gB$ozBp8xzwt*_nL%W-jFVrF66)2F4+p3S|z<-uiVA$6UFB2)|P#AgJr_}V`ba#)g*+?YtoUOc)cScW3AdDqrB;M zx`G>ZW-hPTZ89tL+4HCnEmdQs3i+Ph?{=*_+-_GOd%bi=b^Y7U{*9ln=?0zH)A6Zf zF6Zq-ImxM$47@mOrfYbrEpE&8_PaD?tL?c0W5X>Lo}G_G)_y(SDo}jj?dCfTTOOR8 zXA&W|TVHyp?ZjR%g-8acCu$x|keFo>!4kR5a}v+-FM6|B9+#g}?tDB$=k$q9LXH8mw#>BW*_LW(d^x3T zo$JacoA+$$d%x2}+VqgYyjM?-_-I!BRa_fp+HdQ@m-YJ1%wMa|HZA_FHYLczXm7dN z<#Rhbw&g}mo$~3M{NubmUavjdrcJ(nttY+3hxz(eM#r5`X2&I6H7d-RSHIs$b?Jhu zD~v9$dbpGC{k=WM6C~`ueOxx}u+6y|SsmA(J0!mMT)uT?>GoXDIb6Y<^VKavnB;G7 zQ)~QQ7??Rr)6A-tWlz%WZ`rE%_wLK5IW z-YRojsYhs%N~(d$?x%6}F4HtuU2PU+vE$P`Te8Q(k0bPqM$b!rw;k)8AMEC7Q=IDM zu=0su+eX1DK7o3_6^<-%(Dw~yYi9Jy)S7A(Bp3I@=K8~_)7NkKmM}T4zT1ijX^-kYDyHG}2{k=p&WZFERS*a#P<_mJY&lk(yK6iVg z$Q=K3izjSpxZWyo)ueO(cH#DOb9ZN}6gn+8UlR05l1KTH%F&aXz2;51TraT2?B5>? zKS>_vMH-4-!rQj};`wCuxOj8#o|TK9U22W2+N-$tUq_bdf$u&0D{M;h4PH!Mra9G% z_55cw;djS&pZoakZKmFmw8dOf>*DtwC=dzK`nmg=mru8f=gk{$B&Wwo1Zq|Oj$6R` zVaJ(->l;6DeO51@CM(W+t1^Dgf%3xK+kfV4x0^U^4#zeDqxt4Wd#fj;N^)}uF>cm6yUmbEoVt>>Mw)Z4qxInQkbG>gpx|IM@G=Gb^waOaciof5M?e~w{S z&;Oom9X9XN>J2){;Z}WTALTGBw#Y@#3U5{t{;{V>uO+2_%Kg((E4PKsWZtmt-qGUR zs=ta4HRh%CY`JY(v)`&vHudM4?!^MfHTVAOFgfipiDzx%41T^zK}H&_I_q-^5;vYr z5HR9OUUcG0`3j$z#T#^UZf_Blc3^K(b5k#)4gt%NJh-af4t*dBX?QM^|ZWYj$5OgHqZUK zeX~~#gVFqB7V~)X{S~j7`|4<}oK`!@M7c+(xITtG+N=0oSspJ}utnytmYde`ujjS> zew?juF@FxXVkHOnj8LuF^8Z~WTy@sxJ*wuLdyzr0<)mIwuGChe%vlqcNP4aGEIxSH z;NOIPw?Mm^lRi_VGpFwMXVG3g`$*xTrQDmpuq$ud#uhOxA$hZZy?~LFtInD2FUr`L zWVStyuqbnrQ7^Hw^;&8)?X5tY;oQ9W+SA3q)z&RN@K{;Cs`K~h>@{ohWKN&G9(DOG zuLO_wmn!G9v{%13)%eU>S9iuxu}A2{+ICz1>DOmh^m&?>etP70deRA-m}E}Nl??WJ zOQuX=>QCEz?9w5gt6nbyLg!CQ4b=O2Wp%2a?%9nuUoPIN*5|wV{Kw*%mYRK%4yA6_ zBdzD}Pv+vky3TW=_0hyj``;`~yC8FT%cZ8tPw#Ma3K*@A3trdepnX;9|LjvD%?CNA zvVY#BvpB}+E7RV89bT#lUk{4CwF#(+=Jl{7A)FQ`JXbw{c2ZxaGIc>(=E4 zu4E~xc4qk1JfUjunGA`K2W}~G*xal9u2=TXece^B5-aAkG%1}k=Zz$0&5KN$|5pE4 z#Xj$qA`f<4UaeR;Y3fPmdN6a&`>Dj#3 z3ax?yGrN!1{dSj~YT@T2TD|(%otW1b^3)nP=Ed*WbtG;1@n31;iY(gvK2im9mT)-Q z@rA!xA#FK3OR3f2mRQ>SycNt!~&-*n40$0 zar*SQJx-I(r^>(oHSeC6v$6U0C+z$GZ~n9X|BHAdslH|V4!9M1)eAh@W#&1_k7=d9 zr7qh>g$?q)jABf2du&d}tUmSj=~?#{mYx8XdD&W5KF{5?g-_h&{>;Cn0c&gu_Utfl zejtB#dA#0ljkOt9v})cs>tB4&zcP%;YCk}|Hi3!p3>-f`K@hPpY!a6 zVgBA(0kdqmRa&QPd8KM|{hsNA%=A46N^`vSP2XL?H@{PKso-J@m4e!s({oeGdgCAX z%$zCf)UoH^i4rb}`R>y+-4abixleq*W0RNu@z&|^h{)SdJ}s@>_wg97)n3KLffhHH zL`;s=aX-CmBr+J49Us~)`p8V*}TGhzt+e?DJ@n8KF#e6o+wQ64Rf|o7Fo-XqU4!*8v;Q0EZ%m))w$LibD za&o@C_|_h!u(LATbd;Hv;W9etWRPY<*PrC6&kb{_-w5 zvBjkF^696KzYlqSD^x5kdrxIDtIAH%v^z16Ia?g#?$%E6(OD{*-E1o1@PMUa zTe{mzE!Sm1t9rRL)}K26e|7w!X3jL)sGRcs z&nx*2U#+=VTkxFw@7JgQ^}HY7+NY=EzclyC=^g8QcgG&yq`LjR&4Rn@-tOkAR8JGv z+PQs?>-y{Vmz0d|W%gYzIc~pvrV>xGAy@LoJ$u~h4V<_R7DyOL^h89>IJ!wCP{jY1 z@0-#^nX^7UUB73dIqRH%pM;NcE-TLW*&LW!w(Q@P<2S^n%-Ngmnd5CFb#za8`dpRJ zjHSL_1zA}lGRMsp*W_BCXRx|sdUKlZ6gQqlih*K=J?>u?+cod-Z+djR{*nDN_WCE~ zAGPEEeE)MReE-3_?9q4j>_7LZs(ogd!`6_r!o;?!y@w9f{5}!ckfxIFuv8{Mm))Yz zcWaazhvQbE8Ovrz1?#d-?ritBSDUqqfJCbF*cPrg~f^5cHP)$_GaT=)IhTJHC| zhKujS%xxb3?$m#|UHHf7>9v~Lzkl=ppETio{{8ojjom4^dy~1COutk)PujyJbs|0V zjlFNkbK$RNd?u7$nZmu|SQAs4p~s|_sZ&cg={)}TNy?ks*d?$h)iW&2JYq(^?K=lG z(`&{2LSJkI3g>LtcX6r64io9AwUHGwt7-(UZBm&oHaliU{)VgE+gXj)@02*cz+#cN zr;?^6qwL2I715KE_U_zy^4T@DnWsKocQoKiezz{SAl>*tnaMlf*>&|Ud&3@X4PP(& zGj3Mf483{JgScw6o;Fl%b*UFfV*LJYt>3RmTh6tnQ6Af@oUQ&gZhY2Y;P;`%cWKh( z%+_qnE6q~#YSUhsMI8`*Aica+iM9Rl8LpH5|F7^*PUYm!t7{I*eOB&v_#VHk$z3lF z2_EGoH~OqYv>IP7nU%`J_Aofz-KHniGwrshRIk?S?Agcn?GE(Y-Z`LbU} zn}qgm{i>^{bJp%#VPA6aYV(F_neb)(*Jf!?f4(x*`*)G>GB1I2ru%hY%5_ioyj(kN zZ_T8InTr)$4-~)I!}|Y5YB`IyK<|5&8<&(qcbhYL3Vk%Le_WqpP_(n~@v*+^*HR{D zifHd;KN5MWK;lx?wH;NJ6N4;g+zkKHRS!d3hsTMpu)$E&f zRp_kSRKN5C86tt}WpiYjrZC+vFO-@7TU&baod1tgY$Df%t@cUM3KS`R`RLC&%X>%$Jq9w2eaE6-1o?7sxD4(netZ7TW9HmZ*zI?)jfar?xxg?A6Jhq`{2e_E%@NNeAy;pIkm=i^|t1*0m4M-3>jYaqsi3$vO`m>nHoy-_L)(`TkdC9UZ+- z-2Z=xN5)0YED6jos}Xy4N;uo#a#x^`QIC6ym2$A=;S?8jlgtzAN`JI1YEO~X9+Cm)}?%Ra^1 zZtAIn&tF;e`L2#kT`j)(Tf*lSuA?TNlO`R}^qgd1emkjdpKaz;{xn7|=gYm-t1mx4 zcDDM??(J1MPK%}_iOlk2>aCK@mXDpbRgGIF_oQta)9-a>AI11?mrmV#Q?g6rR6$Pn zr1yc}Y>kVbG#Fp~?!;mIy+(jn?pHO(px^9AFsQTzI6Ags{C%p7nkzRfArq}$NNur{YQPy!v#uS-NmYD zxBAnx(zKE#_+Pr#Rwd5Y==~_ue_*Cx{VwJL=^wuxqBu_ee0*l-wz4hGm6AWYXI$Lb z?!@dhJFD0rkNNbpJJE5=Z%Y?_JfzdUR--_+n}2WF%;@d!3}txy4;)?k@@u=of~n=b zXFpj4%u1U)t8eO6-n3h#Q-VsYn3tI7UhQwzF+Rx@x$MS`7c*}@Y<#)+%Z}fI>4)T1 zo4R&?ug$-9`jNA~{>%0I3-#ZYC`W5v_H!|~J1<&A;T;#?V_LF_j zFHbq$CphuXmZ@Pn`D;JD{eC}Hq^_^%XMyNDf7fiWXSZv*@RjdZ*ZrNzls_wR+bQ2y|Mq=~T;|JboSyOP z=PTCZ=VoTz+3f6+^T3|ju58NV%(aoRx04KdB>I$AO>Ox46*NP+BFu|rU-gUg`>xHJ znbzv|H^Fe);z>`gKHffdQZf(F(S+nB%E zB7Rnh!-ZQRcjF^8lI^!hWHZKBKjz){?^*Qm$rmRiM^5su{nY&D-u0^>=g^HvD zhge#+-{v@>2eN`>FEpRWony{yYhmW#@0_*F3)c zBDrs>r{a#X)Xvw}r`?dr+ju8d@#MDSLf)KjuPruIS$pui?y05f`~6v)%C>sm{Oqsu z;9tP8B~RY0b7%E`sI#xY>;rq_(M;I_o8a2g((Z=_N*`?54u9DAcK7#g$qyx)c5hel zyz%PG&g%D!`Fo4IpH3}hc&EGm?qx^r?BwcllNzpO^e@l{Wz2!H>I(@#xeeQ(TtU65>DP-=yZK+ z#nYo~^MC%Zng8d6jQI3Z{%_O@9)FAd)%T$K%IpLUSuk1AGQoC=LOrPDlD!kfwV{Y~HHNW&T&+;yg*0Q@^t3%UkYhQOxe%GK}Dld2WJ^#$i>z6NT zY_giWuj2b&>nUD#fg+o??K@f^vT@fg$4Sfjmu!?1-+OO@h3VpUR;Kgi8j^oezt zwKOBr&BFAA(q~nb7d6Y*8tdGCWNlwKcROhJU)J**Wv9L_IHn*cq_%tW)^ES9j(R%H zO1oTHDBmtn@~igV?ppTq-#or9o;y9)`_n6L-*vGoH(u@Z@t(iS{lWXchS#G$zvSO{ zApiF||4mmrD<0n!bqh4|G@q{)<-9WG*|aOGQeS;Fdi`3q>3}oWzF&Xu|J|rx|BL&6 zWRiu{ycz3vBxKFuRJ@tk8^c=n!eYL*uko~SvyD33*JG7WxL@vDed_qy;1+@YD;*q) z8**oxygy+r;j*VbTlBQi<<~LS75jp3t(8g?x%`$-t>1X7T!PijS9`Wkd->{@$;ZkW zI;Wo;OAGhb-1+gJ?Yn#R2Yhxn3N-20U)|z*^TwM?@;&pScy0Iop7rTjboq*DwQS83 zw5LBin8Wie<}Z7*T@Z)XRIN*&6ka~xzsezf!pxs4XVY5!>)%NI{~}&jTr|IDLC*Gi zn=F~5n{CsybHjG6K5|o;?Mlj?_m3sY)9u1q9?X^AUSj4HlNXzkeI+sb%FK`l{S$)% zKIM8f+S>iJRhIM0oR%j2=R|qUluhqHpWPnzk~e9Qh4qKuh4Yv9Uz&BGeCGy}(|=;P z&zGLu)RQefdwt!b!{PSsGyX6|@%Mjs6O&<2ck(Fv5PRV3;~J)=CUf60oG;x`9$%PP z*!EE4(2q%XV>Gs@b9-s3D=jvy6pwG$@Y`8k->u`jBJ6aU;`B)cB8JA74{XcLySvL@ zLNy{t=-J+lI@!0|@2&{H@k-{L>LitwtTU8M6S7yg=iatDZIt+{O!JY2<&};6r=NvQ z&)-)#yTA6wt#hyM6tjkTU3^>W$dPqb>PBjS;4$fEQsv?eLN#B$zWx>ceocyb{`#9y z*)i8m&gx9BVLLoQ$9h-9w7p#2r6-RSbSK)V1WN{a$ecd7RW@kqq$QfuOt$LGJmnGE z<@B(6-pvM?#io;73jbVPzt{LvYCw6;?9)@ZmgaSy+u%IKZHdqE94a8+`Rc^cV}<~KB?>+d<90rJypwO=^GomhIhg7v1t#4#^U9oZ z>eEhXGtX5&KV844)|>n+ZFWmw&XJU52md}bmARdkStxdU(h*Ou_2vn=dz*u1MXfz@ zEo^?!$@I*^X}xFV=A|2D9h>RTp18+L`eBFvR_Xa+U01L2w$voX$H`sJtM}L$a&EGi zNl)_$>!5(srtvl3)9pQ$?O)rz*kg)!qo>-6X)pPg1(zu_Oo~3V*>;hRlXq)aK$-WM z^V>4EtoqS-IA^z~h1ZX->uYASzgFXW`o8$ihs2YYrqq949shW5`Fpl$Q)-?#>wla( z|EIwIpJ&T|p1OWNC3&^;DkHXw4Qm6_!_BTgiF+P4RaIB-oXL;Q_y0}gcN8_={=WUj ztF|MaZX(N%C-pM0G`eq%S{9~#Ip^Ap*|~x&cD-&>tFE4(aIXF0tKW^%4omX?>OA_? zFZa4ucZOWLr^mAf|2bDCFI_3vW?g>$1;5j}_}BxRd=BsC-%~VI$GcEwappADjk(=A zr$5c=Wc-^q|L0G&#`{Uho82Gmj@ez+xbvpi;)yFY)?L-wv97naa9;lYO5yw8Gp=dZ z{GI*2=;tFFj>g>RGv`b?AEktEyjiK*C!BXL>hY(eH*2?U^uOGr;<-VGdr5QWwe$lP zAM)-k3SXylQ~%z3gRWqaN||nOye@eV2$dsU3|GQa-g4_9PKe(=o*?r>D zBb}>Ro%P?B<{L<~O}W!BDLg58!$}P}-!)q2zin9JyH(`F%j@eu?(E-tAZPKZTh}Jc zE;oPq#qA6G#dVPe!Iq^xi7KDJ|Lnf5|LBI<*Q}c<-#LTDuV#dZoOnHBrwXHh?D?}g z7J7cM9%V<|?M@i(-YTc&85DNS=i9Zb+Mn<2*xB^ny7JVTsnN<@r#E>9UpBkDDM#n_ zqhDK9YwkO19`)8YD~N5MSvGlfxR_+Cq4w(6KlVw^xsrEPvQO#OTC2r@N4Bo^-t+5J z=)O-^%`?r;EZVyBYI1Gu>n-tpnhSOoe%4!G|G;ST+f%{f6-$kF?bX|sn|!-0uQOt& z<>cwni$6AV$^Uy`ns+Di@!fk9f==#m^-`U0;@R73$*SWm)g8j27e5P>3HbNa$euoT zUUR#I{hwdnJNgb=zrVZi-ijHSoyP^2gmvZDytX}LFl);K&r2dx4i(Do`)n+~EKK|L z`kJ@87vFxn`D#bSw9^`#7nK%=t}e=4=es%V(W_Rm^)d5Jg>9}^ty%Xy;=a_Tjiw9i zJC+yyQqq?T^$ONwPdR0B?~2r{UMzvvC@_YN_ z13xS@_;>%#kWDYVw?)87pwDSqxY>-{aJiq`@A9gh{pu2UA}qZ-Yirl@swaCNeV)BQ z()!QyXSa9`&nOUiT&)*4oqJF%_ayVq*C@&J#Xldcz8)EK z#`>AvB*oN^w^m=@QB-Ltzo(Q(E|RhNUx$frrs?aRLld;8i|;H^^v^mo+1c*TFYiTx z>o47`VK~{*dsdFY_^eTPvFWN*{_7h(jE@$iBq{E7JktD?arRurxp5Uwmh=?*uRl<} zGQ?|5eo28$`^~CW_Sex{q?XyGn)!2W)a}&uP4-fBVO!L`rCwC@`}tQfznYF0hqb62 zxY9p|X;xjn!v2qEzi)ZJGiHy3(9x~~+XXAR`HvTJGzmpcOS&z#Hmp}CcyecDb)x6V zH$KHeE8=5jEWG^I*!c32m`{4#h zhfa4_*sQvGgPXl}XDU*1rp;W!wp3*C#R(?9E3Qkk{5x0jX3wYCj02B8wMJ%L<;vev z%zk|1%dhP@xiedXIXV`%n4IR@V!)+X7&E&_b3vST@Y-parr9yOEc|!=`EjK{Q}wE| z$=^Hwds%L8{CUGYZeiT&g6H?NuCI>^IO~=hUf8XwdVQVF!J}eJYCYI1gJv_VRa27a z4YJxh!6f(#yI}NQ!M$}RqJoScY}l`t?$}`By*ZGTWo_EoGm)AzB|JAr9-i03E0=!n zB+K@953fm=+$-7e=g`*Da~9f8MXWzQWX^M#rLt(gijMwz!>)C~dNZ#{Zp(eXQBeAN z>BOK%Z;h{B7GchNzc2Rs!NQzkp6d^fit9a_sUzy8I-lEnvx?`bzfVnLjvw5lx;W5f zaoo}GwpD)>gS=|ar;5m})%qXtK6Tp0O}jj0)PLNbdRkaeCc4UNWo)UX=cElgcX~$o zYEC~TeELGd5tk^wv&+tMhl^>j+vV@Ao?W&(Z<)86=G=P?2NPO?ewUZ_N{d~~N?jKd zmy)>8cXj0L$ffmJKjxj*){k8nxW4G`t=2b(9_6G(7QGkVTob_gA~EhxW}{!jnLBn1 z?0Zfa9Zf4g^7rbyd4&`Is(Ag_*Bx|B$!qeJ6cetKcVfC{mQCI=?^52?!kF1RZ>n9I zbmqL-M_cjh8_Oc@GR-Ms-Tq8DW%9qdf?vh`e{U0)nGh^GN%rGJ{^VKP=4wS{#~eRa zo@;Yn`Shlm1(R-?`X8Gn$8>w!$}q1=wi%0}bU!z}|M;!CoMA^zrrc>GB}0jx9UDyC z*V{k2_m@2;Vpi$|e$!dAb07WIGrzyT{?_(ve;w~fm3ocuea#L(j!uibc0{UBCjAm~ zu8xG4<|dt`mv1V03ccF8i}R5Ggr7|-X3o!kXdxCT6RgL&W8KWCh_}2I8@3&NHf?6Z z3>CF)rggRQ-*<6qW|(IEIx4Q0>dkHZEz!+TUVK~bMuYo{uCC#{|9xIfQW>Wx|2Au> zo@76*qn~q5HJ%Q?zvFoLzS8M|JIbqeOc7ha$u!@ht8;S6qkX}*dW=_0@%}N-d2wKJ zWvcA?;sCEey`NiVh34E&TNb-KhVRCmH;l8~_IBk)dt|#;PAoZ)>+xn%_XIQje<^Oa zn$PCX{g$h5!I1v+@+Yl=SGVnNZv!n)K7VwZtni<+8~Y*(%<>j9r9G75U$LvIQgEq= z?(GPzsYM48EEZi|Q=DJftI@TysB+@^y1%-st_sQ5{dK)p_59kph{KUi*(io4gX;_xG8v(b5-RjcV>Idj>tSnE7T~`7ZXe_cOgzPCd^@sN)wS*IjXSX~jbx7Y*Z%L>EaKhhzBX#vb?FC{dS05h z)>@rj{rbi>*WGs?d|JwycB?ezdSdQg=e1FX3T38=rGJPy-Xl;ZyCtk*-QuU`;&h#w zuCpvpTBE+h;}*X|Pe$E`E%}uP87;V-9u=O-TWh#}`2o^6j#BOxIJ? zudt=sYb^D6G-c;bvuUZ9TG;RH=YjZuZvUIM>{YY<3jvD{=K%HaP0v3lI z{2X)hHSd{hkOOohD|}AJdIt~Mja}ay;t|0?`u@+>gnPhmw0-YMR9su z>d`rSqO2#uws%M8iM358zAL9Nzu6Oe=1$J!hXpNfBSN%NUF!O4?;qcmt8@C?-S*ob zCl!X;aoC(c-8=DP?fuH!Lpl!AmV|BAobKIoXoia6@!tou!*AYrV`P1K!ENaaFTeFZ zoiy_u)7r4uHS5bi*oZ48WM)na+w3+eWl3h+(|NXvH;-#GPCLDX&E50yty8lTxpY0Z zHcv2{TErj~b6v3~Nl)io(erz+p8O47J$2<2CaGSnsa`YF_I8EMD%*YTQPatk*_q}U zSF|g|nJ+{=j9@ywt+)Ek!}DjBoZQT?oii>w{GsLtp=BC71tt|Ai`?L0#}Q-qb}~c9 z;u(469x}^$+85V!Oi=I>@>%u!3%gG5#2|&Gy^m*j{nDN;zVS0_7)OT5sxxP|{y4V% z-r-W&Q&WZh-eWjz^fp}UX~LzuKb9DFvY1U1nc`*lw8-H>^%O6=dC#9|UMb7t^{_dw zVl?Akij-nXUSg-sk9C?;y{33on(ZhFdgCymWUYIwpId-VbdX;3vIB;`y&6k2&sI&{ zesAZ|KQ+>tEU%?yUwze@_gtXOaH^NX=D_5-ZLYgx%`Z#Hdj;E>&uH??70c1|34i)W zj&b9)GkQ9oR{A@vw^!*5UUgOIwD#*Mrx~-QqoIIC(n0t&o-}%@svf^r7x@q@0>g%=z;8SCgr6EzMpB=@idvPuRpWN_PCO#kl3@^ zE`f)BZ-1x!>D7a<)#u*cKE1r`z1!jwK680$CaEm7mq@x@?6LCGHKVll{n8@YqUYM(y{Ew6cU_`a$;`~k zrSMSqb-hpLs>?UzTKh-KU&y+)Vv0@7b;F}GGh}X`V@-N4TYc*8X72~vzY7UAh+I}$ z`e07sEvH8bEl+$FY>gDSzklzUudBsh@VDjUlt{L!S^Rl$kWD{kf5jr}(Bm6t&d&|v zs>2!VF7g1Z! zoND$JWRYXin9iJ*KI_Xb=Vxirlg}73x}Q2{y}QG6Q~T>19;X*Y>CUXuxSnWYv{d@E z_UkieObTLVdmUYVch%*rDIb~b_0ObOTPxO^e*gXFM&m}8H^;Bt>uE6e|LrF#Gv~6{ zB<=(4e!tavCI%I}{>GIk5x9C<<@;x`HrE&4T~+-0n^Dy3_AF^XHpK;Dyk|1vk1xFa z+E}JdrSR07oaU;vhpgYAZ9CY|?aznGP@%^J+W?I2NcK-f&>1btI`s@&GRlWE**QcqvY8Ei2-`-`o zZWA*bFYAub4`~O!egAk`VO6;Q?=n%DhG4--vW?&R8K?XGR(qqu<7{=8(LC?o;>#~T z9{Sqdl6dALz>-=^;;XYsdH9_K)*G`qwsq@noAG;GXIsW&j?FBNom!v;? zT<$+9P-5Z{&a+Ez+W0A}ZQlR=*5*F(t#j+Umap~Byw7uB)9HYyrVorqWGhbf6e_Z; zd(5$Y9lG3R^hD}KNH19M(mmF#A|Tz9uz(8l&!!2?&DdnVjdt{X8uIxi6@ zY1^PYQp^A2vuJCYh+9r+ z)tda0isyT8=j46!m^>wKJAcNdkd1pb)oE>&-ln>i+k5k-5WbE@E#mPzj=b?{K701w z$Nt*8zxxD#EEC!lr8%=M>e{~halgZb*DA!Ejg7MOyz6e=SH4k+22w9U2ejXW!siq zmfo;ym*eWt<=5pmY}pK518-!saH5DKF0VbiEh~N1&FjH}3c8=8Ds+VpTm3L(^Z0&!gZ6H7PS)p5muoiHsi!a4f9>*x zTW2b^=XRIp-*L_Kot47luDE)&^o?z%D<@jCPF{R!F5-Mx9uldwyk zKmNsDFJUam;Xb`>M@3?t(Xt;ACzF)bc1=xZI>|Gavqg0y^Je3+RRXzAmrNfOpE;7a zWl!DreGbOqc~@Lk#vQFYG)HKuNb_2~?CtL_-G4J-=}eIYdV9YWt>0>L-{zaJoz}GM zF7CHN5%UTy<&H4j?A&ty@X8wQ`PIVl7z}7=N1{A-TOOx zikIEhtj>oCEst-gOBLL&&3jO#w>FKpC1J+-9(&GBdrB*|MkVE~n|gkBf!{H&%QFRe z6d7`#?Oat-y&(7!W2g~#oacdzrxh`=P6B*wf%&zcCr#KiZK>p8KmMtj#?Mohbv~Wp zwm>UbCGp6D%S(SJ%uQVW{lvpV2Tz=v^dykcD%9oOuB<0_tIGFX?-#f(*cAAlG5T~q zPtMr{oW~QyuFjBto3{E(k*z|`tu_Y9glXWBKFX2sX#(>d9l_Z(nX^q4#)!$Rc^Z-?8% zloi({6j=`E^`HH{`b^x;3Zw5IG9%`7*6#Q^cW%{kC#l{m37`Guxc$BLY5RZ6x6|tw zez-5MJ<7`d#H3|OXJ`K$>z0PN?dKQRFNxADEH9g?;u#S&XX#~GhFLdnPA<>2-geYy z_rYgj)1N+N-@S}a?!T?!R*BD_bx*0vPu%Wh85lA}zrfo1?6dpaoLbD@+;5Dg*n0dD zSnF&x>z3vc&r27gqODm&G>@*ht}fL#p>nmvRLv=;0&YHzm!FziV!kaSKE}%9+3hbI zYYMU-T=~52&}G-vJ?B12E4^9!%jv|0qNc_2TONd17%JX;cx@NQoY#@Fyfk<1Wdsc- z&y3H0SgH5-AIJ5rGiT>ce7g43@)H%m_dGX?_d5A{eXMeq@Vh&aj`JN7Dt)G{tP$Dh zyf*9D<5P#(V)$#zk4-!AqtaBP=eKLs0;d4$rh|EhbtWxNRn`i2h?=%_y6Cd4YTm({ zz9fVtNx6EZ&YUpK=3#^5yhE?A$zNai{e%0pG@AxZJ5iU#d1BwLAJe~864%ib{Ln;a z()Gq`nejgYFGg+Nc~v!7vhn@Jx8HtVQIB)Z>^*1HvZ3?wl`nZ#yJkOM$u1DI!Q#G? z$HepgmNUP)XZvc(pD-=U?3^6;`^?OQE6&djO=?p0^>InB%u&hzswn$-ou=-=f}1I& zvJ*4!=dUgC=a5-Y@}&9gZzUb!{~u;mMtv<=@43`4Dm6Jf@cZ@rqgviI3d?3V7Ok`7 zRs1P%-XmOjt?Ax>6Y}?09=_sxLo9QWklV)0xq7Nnz3;1!$DI^tHM}HrY_Ex=d-Wd= z&6zVZgVs*Fkdt0Gmn*9IM&aEk$?sF2&gRk2Y>vHI_(^Zdv&0Fu8yTPcn-^uD$@Z>s zW9;$kzf|nzSG6~6@okUmd;WLvrYS0~7GLr>o@g&s`tJ8n+tv`9N4HMO~DXUqHfF>=k4v$F%& zPB|0v;qsT4hu>9A+^DM5^3zUsWA&{?=Z>Z*#yjx$$7>#6_rA38jmOoOQaQ&LZZvov z>3@FVIsHcyI8N{Qc}jdiiQ@YE7ExO7C!e@9A!EbAgxCAz^6s83+Y=#u;3e;6O$#IS zzbp5*%sl2ZaVhthts(uYl>~-;y>T$^xF2{?+N!(uWi>2Pn+khJ1ll6(|7IN zlK3A#+IReT)jj*`&2Ju2p90peeR^YyzRraivv2nAe)G}x*ZekFho6%K1((k|KE2P` z!9=Uq^RZ&2)WjCsNrCQJQ>Pm0={A&~-2E@^-?{%^B+e~-u)}iV)in17f0Yj$%8dU~ zI6+M_e{b#NdkHQ}p9r(q@yq2D6=v$?hp+PxGUit1IJUQ?#bc7o^Np>_J6)Gd`S~Y@ zTeB};<-_3}>w2GC_Sjl~3VEc=zxcCh;7nE{Zo|)K{=U5>JayKuNruz%#jX~dEs?OR zIMnoE_0(DMYhQe8ZOwW7&#UVFTIm$eM{j;6Wz2nI=fQnpTCVo~m`PuEZp+X;m%RJ< z)4!q*rubS*YCl-vc6M@rmTUS-!3lx=6;~9!56wNP@Hk|{{RJG`=4bmA-G0Sjf67=$ z{wDWQk@CFzhYMxe4hwG6ojE&qQmSO2NOAp5pZUhQt|pn&gxWS{Y=8CG|JuZ`#HFTQ z**V9R-p=*Wt~_u2IDDx|a`t(@&`tLOwI}8NkF{#aNfEo)em>Mn;7Q)Pg0o-VSX~It zVo=mQofjYBbJ@c4`g=X=%sC6TUSkrNCbI4AlDM5F9IH}qZ(8G!EgIeT_}9}(9IK{2 z78ZQ@WV54Gd*0sq1-BO(x$R}om@3G-z2n#G6*@Ej7#~w!q!D#|esy0g=zt7;hWo|0 z#B1(wD0*C;VqG52;l;R`-%PSsNp4N<#*H_Z25B0~v`z7{o0~WPz;_3ZoyoJyUQD&% zuvr%ynN(Zbz4ol!O~dj@Q-g$l=rz8d>2yR`@5mkTsHcuUY?`%G+f6q;KeE=w*1}-w z2haBn{uXvU8`AakZaFUXF_Bql>fxPq(=6}7?YIZ#pH7wX{)p06Y_VC^vt2g#?pt9G zrps3HS!w~1XI5->65_q^YNAL653~L49R!wEBg7Z%yO( zw@YOwnb_`qHq}2>MnACf!`;fN+LouznSyOHQ9e1>mzv!^*Xm<)u6m|9)+iqLkyu17S_r@KaG|9v_bNefczO$De=}b#qI7P|V zIOegm{gbZbIh>0P&b8;t{x9WJ{G=Ekpf|TU(Zz}}=X1K)^SMo`{(GJ#8%`8!d46PS zKKlc+gKO=s#C)u{7_~UmYud3RiPKfyOjPxs6ScDO`*C~F`EApaYp1{M=#OC+^Z%XX z&&^n3UHeXH#@yTmQx@4vTwD>(ak%55!I7_XHcpUvXW3#b1?;LFFh=}x)i zp}0YZdyC!SytT3!tZ!DRPwdkS5~(!(W5Muu!w!zjvagXQTc>FqZ`$Jfx@LcF)ZsZF zPDC+kOr6*g`zWzpr+419b<5dnq`3qw-_N;H_EhSaR%PGCFIBaVEG|x+v|irk#*}r* zlT*`T-aqx`uAJ-Hc1>nS^M-4)EIemqn(wGe?fm+cZ?VC=Dya?E0*gD$ zIdP`H8}%J#e$$N1U^#TEd-YQ06?eXFbuV1B!S~dfQ$E+O8_s+9L-PCg*N03(N>(ki zpZ2tHj%%yGvbXXSFL}SuwKBDzeobupeAbimr1zZDj<+tmYPw3a?Ws>+8n4G5vihmk z-bM*N=R*ccT}o3fX)IkCvQ2#RUmxo$Qf-Gh){1Z!>rOT<)+vvfoZ97OdEk5OtX`?5 zo9cgwzGb(lKh}8PL_b32xbUSDZ=T36e>jc*sp@2@IbS{>_nZ6o%yZThyM$E}`Da)$ zM}GY&t>>-uIHPu#tIX4Q*5`933kY!scSJB`tUdb7ZTp{lzgPdS6FIgyq*EhPOO#ol0BH}6~PJl!o@YwDj0XJ<=iPu(QH^>(R#S8~;R zo*6SUi#{IGDV+0Ym)YKb6ADD$W}oX!^=vwjzWQ={-ZoDW^&Yp&_di5VTN1Z^!wv)I zwPD9feHx$sbYiaDt)A*Qr<~#5`Ezj|m;YSUo4ugyQfo@W5s!4A@Q`D&-FI^tH+riF z1yroq96HnU>)rVD2JQpxjn<$eZ(Zj+ktxn``gGyXMD69Z3)6YmPMv<_VyoY*75TNl z+g62oe>(U}O#bhM(@Q#MTHVOI8W|V2JV?{`*`e1q3-*ckB_~Ht3Oe~5v{B&eTj}3L z-LfK@Dr?hvkG4vFx+wH~a^blxUA-0_>DI14RvL$Xa=r8Ez${bI$B`K^aW47`pAq{CcUwM)wu-0M=Fr74ToG}R&$oujt~CkFxf9}e?{4{< zO;X&gZ*S~aci3A$#>LBXlFHBh{^gr;B#!5l{+i+?H*M;6SIhNDOh4a6GRvhnE1YQl z!0zCYyzs`-J@dnJ?!;@Ez1#e8{$qz7VKW}sJ!2Izl0TCA{E^5ElemX6$<9YJ7kM1A zE4-oTd#HKNdv(LO?&3+&u^YsX>#8sr&;QHg!gO9QbJi&n-;KGme`{wS2|Tp@{tm~b zG6oWTA8M!ToQ{Z#OwUWZeRQgdX3#0mw(wcYrg+M>R1w+=Ilw`omfIjXmD_o_OZE15Ej10PFg z%PGq`Jlnt7`132B?hd!rJWEBaygS%tzi3ufj5$1oO~k3F&vKgof4=Qu!kZs!++dHK zW+>6Zp}C{*vt0hZT5e5Mrh^FvNx8Y*7V}K@9^SMj_N#PM<{^V+F?=^}nB>|{6H70c z`|_=L%<*M$>kX_gJ81VF_;SZeyi~^{@E7&5F=%#R z;`7$R-9NpS`qUddTD$%J@zR`Y*UWeB-*oQPE4I7$zNy%29$ojN{qYTpzTRuI^70K< zY6g1w9^JZh>#=RRUXA{X1LrRJb8B0x4R^7JT=A{n|F)K-Wckd~P`MoS;Hz`|bK$j9 zB_|4e^?WSoC7WYryR7yS_wrgFnMH}|@wYG#_Ka8@t*c;HNmy~Wnc`zAFlE}Y|Z ziN&t`mUxAn=j9LvFRz2Y+}u+#yXGEOGc&V}nD*q{-O#xDx4+hH+?AR2Y+lODM_a?! zC*Bsj|Kr;3C7ESU&gdTBHep&TTh>*f&&9bpw~u|l%N+i2zCp6-jrfK4EsVWh|Cv~M zaM1<_*UErDKJo86C#nj1rm%$_U91vFXrKOc^%@ek6UAuBle`@p;@5YrY zx2Y_hzbseiGgh0Wsa#!f4^M&mBXpSN3&F&gK5@Tv0vZLE9w1xkr^L%ka6a(<&PHr zeACMRAfv;e=V^k#BMYo;z_nrtDn@#pXCaR zzSIRc&A5`J$Re(Prtsq<8^;Ip|NE@n8_>DYX48o!Os_ZY_;SwE_V~xep>ES!jx6T$ zykX8O#V;;>u<%YvUERaYn?G}3&%NETec#{B%WFGX*`HYGPI{gu^~g|p%e9=`uODsL zZ*TfgJN;k6kx!qj0ws!{ep)nB;I)-YpwFZwJ#K>A^Ymv+YP`yLxn^GaBZWYb$2;}5 zW=Wp6jkcY)tnHe@l|H`xQXw6NS@Vo`Ke2Sk-s zWft>44OjCA#U~4MHBTS7G_gO(K+!k2?eK&|Iq92sUTpf6FnRmEeMf(9e}DNcAID*d z)0p!>G4(L6~mf`p^xzvx80^|9oe&E$>Hhz#e&hf$flKy`hAJ|WHPv>6!q^2;&$;f%4v|Z_zYbu^j z+s&8UmKQqCx$gOftyhypj@d-qcHwAzZIP4vRkGLVir^Z-+uJy5`n{IAY>s?-=#oy< z>y=^_^E^xJrn{uyE>+b^tbTE|xJO`TsFBgMj;bB=Z|vi1dj4~YS8C2}x%VD95BP&B zjLxYB{|$N5(XSK4a;v|$K;+WPFE{VJ5^OWfT(zV0x840e*Q)oFKh}GHcaQg^Wm|6d z*3|ueSRmUTwbp5KpflIOM~8Tp932 zb(-o&8-C65)0+TGQ*yo>PyUQ!^PY`ZSl^J#3rBTrahQ@z2}K`<^uYEsk;e#Pr-EIs1-o z_?s8iCU5z6T|V&TnUtYKPmi}Y|F-F;80S6TwC$qhtGNsAt}(Q~ujJXIf2VZ*(;p|2 z12Xe^j~u&OdaTWJ?g`xh%}Ak{VILFUUzn|B%;sp9)A?oz-yg{b;SIB0tv>vGV6knQ z-7yzi<2RxOX8CD5S8qLD(I_+f{_T2owf+B1{IVxrjS@c2x%Xd(-}3Woqfb}%Jo)fS zed&R1xoNj~Z>_a@8}|2RfB&1K6-roYP;ot@q`r=IT3k~5j6TE6A`h22M-y*gD{=VeRJUpJ+) z#$krr#;E7ci?`V;1a&E=d&;t|{d&af=ABm)Wj3{?yg7C`Dp+e~!tXyZ-Q3=rEzZxK z(DS^#pyk`A=aRjrgr=PGc&r#HH0ju3X70|H0=bE|zoq1S5jKkz`tkR`pUn8$ga0i0 zLKjZ0pUdUM;nnCqD~;!~;pS;uHoPso_v@QXabxD+g`!I$+j3{>ZJYNxU>%E9*QT7j zWm!vSI&rMbjecRGEObf8OS8PT_Hx(a85&*zUJq~Zd1>~=F;$ctb1Dc}A~J<(zJ}i? z6W{4sTWeM^Rqo1AGj>ulcAh7^#cgq*mSXQ=8#^J{WryD%S^9LB+`Q+8dUiET^2~MO zAB-IWKh_LYHy(6nNn^V%>c zFUy}iTV{)DrS?yci%{wk&bu4;^zUu{i1_zLQZow|KbD#QSwZI*lcA*P+pxJsmJ4FO zUG$pU{n_4Z%OeNhmieMB4y$`iUJ3J>pS;8|SC!rFOohznioCOomyX9X|I>cp&rt6F zyG+Dp-s7U&xhsq#IUILBF_xKWcJ1-CXOYWRgw_6PZkTyfZ2q4Y-J4>no?Q7sRqS|D|co z6r~TgSyzp?Kj%&|SscW7Zf&cnsoL7d^Y>RT2z8VB=5feQ%eLm!`?8)RmKm~_-XADo z|0nFQeuLLJwd0B^`bAB;LC3l0$nW^E&wIW7k?*luPa9M`KiW+1uYVJoc02Tx>h~L2 zj>qg0&QFes$S6o$sCcZfD^Q~N`#q`nzrU(=*5}N*vexo~?VXjvec4=sj7Cf6SFgXO zayQ&Azmx3=YlmT`jg!1$^4V>rvLsLF)`^AGwY31KAiH5 zYlu9+8ab=*;~}1xcYDG%d+iQY_B7JdIcsDeZQj=@93@z8*S~R^O(rvM#NtJ4v)0x^9PY_=peJ{od-ihO7Zott<}x!XJl`m^t)6%^GA$&W(!l(fyHs! zmvcgP)KvCOkKc9Tj*qOx-Dme7mprUmd**x1_4Xfs%J=y#6`GT^^v|~aQ4fC085{FX zo0j&`hW&hTz)U4yKH#4yZY91|HNAUfgo?G%wx|P#w)nk!xJ^|pW4W4Z*|Di9Vz#$8eT-=j zkK5(3^G)#TDd%ENt-2<4dt1fdt*fVa$?gC3e*f8DZskR_>Yd5A)kGEiJM+x4L$p_iG))-0Rnl&-_#od-=gxrPD?&497Q~G-_2bn(p6s-BJ7ArCD0mIhTuy?@<(VE&;ctm~Z>)zVutxjI?uBs6?q zH#}z8mV0uK;_7806_fA!%}R^ezpW)V+T>O0t+i6?inm48^v32V@83LSl8*89t65in zygOgp@veQ{=6x3*uPuLH^!V6cPs0a=bG%nRF_vlD(dWB4aOrK?4LdBnWz<3EGzR*L zi>EDlzVp-0^2~!}cRj?O*@b?(7hT!-$oP=o#(>DCQ6^J~GV|L(Rk?d{j zP4)e1_m^dv;+uNT8d)wwOKzWFk5v-(&#p`edg7SS_}rRfK@?|!%cO@jULnf{vsZxX7%tP`E{jnhwd?$V6h zV=q?esNGIK+aVy}%9;H-mZix{)u45aQ_%Y3Q?#dMify@dpg(bz^}o6Y=Q8haZ+gk) z$vI>0FV0)nRCdIzpSrUyccO;ZjtwS<@5C@y9=o;sed~>hf~IAcd#xADs+!KT_UzVu zUmmeOQh6#~|Mazrr&(zEo@)ZfIX4^o##~<(wpw6H&8)LhYtuyUf8N$~VDp7vH$UH$ z5nJ1MCPGcilzCkU*SF23-7OQAMEXeacDlzN`uB^mi=VaG@x<--caE0I-dejVQ%6~4 zb8+#DnjN>Mn7hqC9-&&#CLt2mnYc$RYpuY~h?GO2Itvf1Y_d;YR=2L6RcpH7)z!h3 z_cFOWXKL=)y6vum!l&4Uk8kW)=ezUC<}DZ8xQ+jX&fB$9{3o@rewc}Qbn$fuK= zdZM=W2pHv>tcr}g7;n(om~mle>Y}MHS#;)Yz4=z{rBk|QVtsE##_&k^U;7fbqI-EV!S z9i$QJ_+eAQYW;>FkLCT>@{_0M1?`=+NOV`Z@PiXgMsFofhRk^t#PQki9OwwCvu}Ln zmaT4kdn@GBznQ{GI?`@X*Bu$_58&6StUzmKbqV1URb=HUl zAx)=*CIwDcdGqe~#KValk8j-ByZ>B)grX`B+p_yH63c$Aj;{_5(NbL(8@uT0nq2_|JMie2+_ZuNPa!)J4C`1-ELOPWdz8L-c%shqu&EJQ8R9rCM^0g;(p` zi9@?H{;tmWyPt9Yocp_#xlfsh_wHGJ_u|B$Nl#r1&Zf0it@T;?Wb=*-%VIvAThhTW z`JlgNQVi2R`58a2&3qa9)M8m<%F2*g5n6>ZvmdQL6JeA&>wyJd=B!T#!`EMU@4n~f zx3w$hE`B`2YGT=HKg|!9T7Qe(**#-m`}g(uzddMdk{-kf*(HjT~1OHzE^ zmRN_`g}eGAznCtVs@5YEcHL^t+H%9(wqv#@7hIR`T3`QJ*6wSe@w^lKdmd-}i)8+% zWWexG&gOU0qOESr7kajIR0nXS6|A;DRPggV_uSg37i+er@0}cG78T3BF4;=EUiPxc z=l9I}+1vv7l+`ZxP4rp%CEV+Bs_6$?t115GGD~K6*y=hdjiTa-T3 zN`2Mpt#S=twN$IhYW?la?s`Ix7wq!=Sh?Jn_+cD?E5wO zd$))NJ%|$9_uk0(@`9^t3@@+iyzJ**yThRSem_>h`d|2liV?wYKl8IA7{HN#w|lr)NAUF?<>Qy!hW8*2CA)q@?`yVDx~%iUo3cQf<;`Ns~~XA3^_ zW!fAlI~^*S|M$7o%m0}r*Q_4R{cGUX@n7dds>O~OGCzekEMB$uoZ{|(eU}qh(+({V zU^>37FsHk0^|3cTf3I-!9RDn`N$0Gq@?8uGMr@Q#3 zr9QTJW@_@-xtI0RhSym+t#5da*#G?5(`uymDC>&1xZU5E*Wd4Se0taUe)NJMz8y7% zjbX1j7ulS26FQ%eb}7;DWAocJYfmg;NLNg`XdF6a2e+cYC8t|@m&ywFa7_!IbZFg# zfH3L1I)7hXzyGv%d!DhB>*Q^&)eEPnd0svqr5pTg^8tB@{~vU|JegGz%XfW(U%^d3 z>-t!gz5iL}`dPnzZ2I6oWH~rx~%Er<~c6ZLzI1>$AbJ z=S#Pq6EC;iIOEvbXdh{g$>|D9XC3i9wx9h?w97Y_?41VD(ZBA!|9Qp!-_H5JUBj1t zT-rS6{|(uQ)nPx@z5m1Uwrs9R?Hz-J#Hgj&t&ui21vg*5y??W@X;{S1_wWDAP4D^m zb)`gsPmjvWnf6D2mS?}^R_r)5VSVk->qqzhJz9VE+OxKvMH%w^!e6SGZLTYxHflR8 zaQ}N>ad8G?z0i;H1L6;Bj(dN3z;`5i0^h;;zYRWKi=S-ub6@hE$7h-AMSeV=VQKI? zX_lDh=L_cA=C{xMDfwJ0P;q10oFj66O&^o&x7n2)GdcEh_qx|fx4#|9GFYdh{olG; z$-sK;4CU?x*NX4|y%}Erz}o)%$@!wwHgCJW{>Hb(@3g$VW}TJ#8a4CgOtz<+{8!&i z$ouwidX}|Y>z2=sewTD6UAmP!x92}^Pe;ec_wOZ~f1imowi2HllW;IXdD{0g<^^~5 zvCdi$^5|=S-4y=1FN-^vOFs2X22J07{pHqP{r$S%p~D57Kk^%=t1quVrz3oKcViz=5*kV&)fswKb={gyepPJ zzC~d2(fSy6qks1zRr&VBdX zFe*Fm&YtD_f4=>G;)+Q2qIqYY8%oB+&zN)EQgCviZ~ITjn-l)3ME=+w@KN3G#H;&E zd{5fvESn&+bJg8VDw~aYwWc(Uo+t5KhmG{J=(LUbD;$Pf$C#ruhLfd$f*aW zotRp|w!T>Y`@y0dyKgVwKiJw|yKDdaZ!S(8R(JR9DK4LC;dcYP`}$bBwVxg5A0D@m zGoR-c8s1b@Dv&%9&+zxUW4!&r%Mr|nnr#xIR&O~_^2EmEv1aYpD#^V|HK*6q{Qu$h z_+4vf>xn%~cb&3ZbE9{R3|Yr5)>Z_y4c9bK4vDP`v)-^_L}98B0GUd9+vU z?RjolvYUCDSo(_VT2s9293Q;Z&6&3TLR7-eA|dVxW*qwcoE@^08AI>=yk?Zdw5&2w zY!++SuC(KPyB}*iz3W&!C;XVHa?x?yQ`w&LtPL46J71;me_ed=_WfVGJd~$XM8Lzxk!| zH$lHUUqodU>^i<0>nd)vT$Fu!$@#292FpS|aW4MrpE_IY@q!=kDvqDqrdD)5YJ#wG zxwhrDXV!K0 z3=yW*&d_JqTF+=tT*_@^*1f!|H^L(H#G^Y$pU%utdpUz|r#NyCMJoO!>$Bx_{4aoX_5Q^`)@uc8%%YSF%Kx zsB+fKpIKJB`|qERA2fSrzt(50XRoN5c7W691u|zi)9?LgF9}#6{r8yg_e$E@{#Mg+X>x*&*8pnvncO9H_wZ!ql6d89n~z^=K+ zy>pZWrtz1hw(odi?P+~tzxXkyiFy(5$_(Oe-Ck!nv;5M;;MXgPC+Rmt>MxyI&geJK zU-0C{+>_>Q(FX)|!6*|FD1YWx<=x>l;d@JNyatNlbV=#ZQ~*@7HF#j3_ZrR^$FB z7gALUpJd4nf>1oH7{~O=oxSQ7@@j=N7L(nUiVnU z*!Vv2w%F%l-F5MM9kzyCK)^ z)+g%A%5>N&?;gGJ)U;2ZgY(H{Hu?Wq1!Zfe&b8fsZn1>l=dcW^UakFKxBvJ1=UCod z{eJ)NAH1je*bYzV?bXYiC8(~+FPHP_=J}cqg%6g`uJ3IUoFw`npGk6#U)6_*iuC#y z>zhlSxjen}UhU;ykz-Y}J{_8DE_Zi+yZTdx%>BvBR8_wIdHrDejP0@)qb4uYT$e1& zGA~oOzNxii*@X+I*G}53p=8~r05|Ih6^^5omy&{cB} zEV&vjR{m~{Qp?pN4~+zgZ07{%onO7)sCy`W!g9`<-AljA?|Z^ zr`f;rM%?!NRl8=oI%%vmn(2CR+NEEzw@c$EPm490Z+)4K-Q-f4z$Gd5DG^cH(hk?+ zZ+s8-eSJi~z(djSdiFg_t@U~DzqYAAvXhEd^y=OH*~+3a_3uoF6C2Ox-xgKLNoM5W zcCqB|XclLwm}k3@NpAM5-LHTAoFCP&;ZRL#NqOhBii6jFGP}fO8;MQ*Utj%RR_%1z zwdeb?LtmLxJ}=pH$kNN5F|}ucfL8>QPGb-6jGhBVY|TA7ciE#OK9xHBxW$&-)T?9Q zaV$c?$b)H$qoudI`uw@ymz)dTdae9_MCe`H&FSBkyqh_1X4U-kvKKGcty}djYX7fI ze2lY~vP^!PZxZlv?$LlL(-srs%X@1A|(29_!h z1q%%oF27{I|8zokS47_Kw`p|MTpBP3~~Lm%Zy2=9w?M-K*)UxHRa*Uss8> zt_%$BvpiiKL-^ws+|2pB!hNo@cCWmJc+sRK>;C>Jn0c6W(|*wk^AC&9Ji-tS>@LtiS5$v{dcOC zm%r*fuaapRVO4MM-G7IlW9i9AHUGOuo^)+HST?~!&?Hc63D z;GtoE?Ut&atN+#g{{H`a{>q=H#ZMn-GjExjcjoHq?iNRf<(FNnXXVW?Ft=`fzq`z3 zvhdY;+8HPI?#g5QXZWGnfmvN8p3RPBPj`-*&6}8zD#p^wuC0@W9efr_hGk)6UsDm>8b@QyafzYr)d({$Ec&kF0nh=V$-& z=9xLWA8)=kOF!>xZu{4jclIs@-yO^K$P zZ+@m7=sM}5wfRy^;L`b#4$dw|_U2zIcrWh9yM#^t-Helumw-onV`n-An3=x%(^SjYZ@UznD&Br~=hE+TZ4*Kojc?cQJoPKnvi`*xAKv7p&-0{2*QFgv&3bAm6;M58;?s+> zx#w+v98h=vRDc{yut3_!?wUfe7hjK@GG6@YU--c(ziXct)hEV&Pl@Q5&L}G2(-435 zbA$QG1y_v(jtgG?FZcQcXFK0P@827RXFF}O5twk^_42MBBSY=rp3e(x^UAC9Ona*R z^_x`6-dU~RvT;J5bYWQhyJwp-_iuYHcijw)1vhghtE}7-CA;O?t6QdbR^&GRY)yUjRjq&b>E|ydN-r)t8& zqK7VCS$K!%4~yQ9Jq@$3e#|~#-S95$$ddflErE5akA4*Ii&gbrA3n*ZOR(VWJ^g}z zm*qeCZvQ;v>n6_Bx#yU?G^4n~Q~vGKulo|X{zqN$dHFrL-tTRB6lWfr*>U?2Z?uqC zpofflh_;~PgRgtk79WZ77IEFXOF*#u*5tf(KM$sre^5JD6_eT|=$9IH;s9r0T-o#a z*G<IW=VaDNYj)X`E>c|id+ymg>1GSl*S=IJ{>VF<@p|05qBoKL?KhN8 zo;>C>XXnd1Z(bU&Uo~&{%e3F_`@h%kZT~vR~FcFgX5@@cyL(#v`2wXfg1b*~C4Owatc-+X=SudCYMYo_hq z|NK6K{jQ~xw*>bwyO(WhG%-D5wJ=IEv1h4BtMbVkQMNO*#3vZ=7_UyzNc$vK-nEbW zwA6Nk#^3wTz1#6ws`qsqhx9hX@7d?pikScEU%UOD=c`3NA2$^h&b-8T)n>cjru8%V z=AQO$U$?-}{+z;_Zr`}_Ma}z6A5OjF^me-9Nu4QoKE1lS>_N-XEt_X}m&LiIP2_oV zI3U@8og;f{(5^2}mfJUHtyQc4vF?88bNM=s(&i&9*+(~D>o~L``}1jy1$W;WnT8$) zH7%a63_b1R6SDH^sghlWbB|gr4RXmkqrvpK`AUJ~FaAd{an~{H z7F>Gs&L+R-Me0^b>kX4iI$GRaRdWR{+wUknsxq5JLSM12>r=L~0WUj?>Ux&zJ1bHQ zMfcRL_1bsg$JTwP&z1ZN^LW4K$;}+A;`Xn9FTOL?b(^KOW{a@J?3jE*u{94a_SZMf znltZN?E62t?{+_**Bf*F)Y+Euyct!SeHY(+c5AEZ%B!bj?9G;+dfM@FC8wD9>npEy z&&@qub+UKf?82$f?GLQtsx)Wu@zAel%70gwo*DnsFm?BTkItKA>0iz&p8EVn=$cuC zu8I=(!y|8|_ucvTL;32>ohyIe`|qyxa@(n_rQ(m35B%r8;;Q5S?_T}xr?wJpu0`Cp z=k!>3*ohkY_G0t1kEMtjgs)|2al}XOT;`buSk#_S&gvd5b^g)0bTSIn}?o zz2+@H-|4yMaeu8*H-Ek8J z?yFjRYx~bIFU>uZgrt|BI;I`meQmSX37yGXT2~y<(wFhw`ZnR!x~Rjo%h~FUriZ`( zlj3+Srl5HHO!1VnsxR4JueUxX{r(p3Nqhdc--Vg?1l>Oxwn1-cQS0oyovjKSkx>x} zzQU7KZhk6NSK4A7`>I#$tebSUuKTlPoqDi-|1uxx^0DoD za%=jBQ=7|gp1WGVJoowWsWW6%6mn&kem!&Ku2WSLWuGlNqPx(d z_MMts{rAb1<)6>S>@1o1bm`Ju{ZF2gHf@M_erv0$Ud$e?xqfR7T~OaT?dems%t>i; zjpuAv7M~&8b;{^Ny@vezRo9vgey$MD2>!qR)Ry=KZLtgYdG0ZoHQTN@JM-C{w^`4g zxwB5)nLO{>&AYw3`L+aA+~N+>=dll+YyFYi|7YL(9Tgvo>zl<}Zf|o-cc4hGi){VC3&)+)odd>1__p`5ASY@lMUoNqNAv|)m;Kthj zyT1JnJHa8Qy41$s#bs%4@7hU@DqoMNiS1u@)lA#fytI$)atC|s()2AnVL$mha{fi= zJ39XQeC4ad!pC9Da`Q5#y8OL0@lKacOUh-9r5#?Xee-Ni&MbaDV}DWW&+O~lQca)S z)qEyCZD(0-=j!WX!S)}HUXHpht*aNa$7{Fn;;pBioqj%7=Z=)Jl0@>xux*#FKDs>P zTYm8?)|C}g^Hn4N`JX!0fA{z0RZ99jN^gH=%XS=!40_LYZ;j3S$BsMG{O|wG@w0tA z)w=5OTrN*ub(Q1og<@;A`uJb3xbk*+`?YxW?M_V!Z_d8?P^&K;@U;JiROHlk+<&bz z3(7a9G?vZ18~gljnS0BnM)zARp62>03#Rni3I^1L_U?Q9R_gG^FAlrE&2ycQ?zeK^ z*NNN9{iACe&F(TXItlFF$$aC?=09Fy=e1f=qB{&MZ4a;Ae&2ET)km+Mo|Z`7RvVnY zCUk9?yV!K8_?UI(m$R==Q`=W{U-^o(?i$fY76)hjv&dg7;+d7PeRs*Ob@xu)54qI) zr>y4P)A!d4|86~H^1oNe_=}nPVvE}csvGNBYXn}3F8-*0|I=sdTOa&dQ~1IecP;*M z-|<h^sIFEZpCGbUEDS7rQX`DyRp78qU(~MY1O-ZjlX8c*|h4|O-e25ENtz0$TOu+ zDNb^#+0|u#qRnm8BeO;3F4s=KSyoxIQediX;JUD#j}7}1v#Q#(r|VzLF)1tZedVXF zcmBNo_Vs7=Tj%Dz**;75>f2)({+IL0Gfbj=d_p!}OX^v8_1%UI5$}(BZ(W}M;iGqV z!YkQZ+WTj1`Dvw^w#4$d^An?WiBIDv{JuHW&G*ih$Gq=Lw(=ET-qY5y=<2HtTkb51 zl0296)aQo4+Pyk|&5wS!T@$+Z$S&d=t4rDL$#`FUR8KJSt<)qyW#wc2>p z4#pRizir;V`(S23#FA>s*R2`#=BszG>soI;Ht*D_dab!zQv@%FdAT2)Um))LK=ble^cx zYAOk@G&D_JyD@CJ*UAT%o>uO<%VPh5qq!k%^Wlq&FSG3PUnyc}zyHjopl0FY&n?PI z_8Q)2iu>uPmRGxU)7$6kb0*t<+avuWdDFL_S&yDA%&l1NBxLBKc=1+hn2ydB%fg(h z+pe8Et+oG`%T*WlS4O@$;;gA#m9qC0dyH}2();|{`-9Cso?5f^?wKDK?OcrYVn6P3 zt!SQpi*H%6=*oG!5)*HB1Z4j&4{d*B)9roID?BOA;l=e$$@e)cg&baO6a8`SlV`NR z+eJsqCY;D>@Vj3keE-+?{mqMy_kaHP{SRy5_T6`*)Krz~W=UPTGU15k+A{Y0-!)wo zy}fyD;)^fuoGfE)b$Dxbw@Rkh^2YB0M{oB-z8mS-W z4_wkP+jseDwuh!GpZQb+CC|I;ajU0o-@A5C`?Tkk%UtJeeRKeZyM3<5GZ?){PqpyP|)|Y48Z?D>~-3%*LN@Pw_N$-gPtJK{>*@!#ed>L;3-f7Nu&y(rbcC&x~rSaWf$>;pJ zkB6q$3L9@OcFvt?a^lsjNh+Q%m%O_5WaaKzQ~WD`ga*vJ)n3jqpCOL>&&}(1N|^*- zl(=24&Rgyjl*aKkkj=AqVN6#-UdD*Z(q0OG|fGQ?tAlb!sYCx&7Oj>DpUQ7QeZF&%C}n`~GkDhET3APtH#1zhgMb z{Ps)FS;wwU;^{Rh?Un8|)X}@Pv!b$5J6z0jQpx4-%$0$YwN36U-KIW?y=-%$f8Ex2 z2k|Qsk6FXLEf#-Vq`P%PD2Ga^OWS?%+%G&kw&$f-=DboCR+m~fxsx zU9HC)KbdxNoq`(ohVV^XW$WLcllnZ1>8Y#T(#NMw-{e$%@K6=lzt}0pIU#4#2u-CMAcKzFS(S#q3U$@>^ zIbn{}A+vS%!e{yB=Jj-mUhB$E-sI|dek^j^wH^8ji#XK0g|6(< ziu`82d%stZhnVB}w};zWwS=qg_Lr{t_4V0_;N6?PnXA3NGbjC{?um11dbC=tEzUjUw$n$-Cc2FZ<-RWOj?|=Eb zDq+@&Tj#oY%@6yn|988sPD`X>o|vIyq{NC1nIxuZQBU`_9>3Pltb4wSCOemHAc4*DV)Jyqh zksE3^Ejs#q{|nU;>sY%F)8F4cxGYBY!oLqpryMoT-_w&d#@QT=G!tVnWO-FSE{5QL}H%FztT2{g>z|Ys=df-P2Pp z3x7Ym_lTWC%Yu+c+4KI&{J!a5>m(*Fw&&~`_B^IlPaD`w>dhJW17H?U0 z^_|dhPUFkc_4kx6c}vRmx*9#$c49W`v)t2vv##lT_txe-*|j)mp1VQfos@&R3XzkK zBph!xD*xHAS&un0`T6Zr%Wb2WRU$vwavyrW`4zXTB;U27KTkBj_U!-s=cs-C_uYq7 zI?%)9UQb1E}0XRgg(b*O&T zG`T-p?2Dysp0Stj-Iu-G$!L@3x&V z-dr@@BW|tSm0vIS{VusEuzywHycGvG?vdWlb;+;Z@UHoaeJ}W%ZC2|5Vpr1bROjMsmA_?~Tz|EnqXzCOO-O(#QjkjkE5Maf@Tx=JOxJ=b&9 zmZeRq+WWHU-R8*>$>vv+?nUihG^uun^~}`NmyJKg2YVQ?<;vcZe5GN_>h)%EGu78uo z{q}0xd~^A9@nQ8rzt$&;b3%=-96cQ6y**pgRq<<8chuSzPu;Dro;ABK_Wdop!tZ*b z*^*V0uByHX7d+YLlc};o^NiSCTQk8+Wz!ATyqj;)xr2q%e)e~}9t+R+TiJRF&84<+ ztIeLYbG^>C+J>za^TcJXD~+tmUWxcuy}G>QYR;mqd|FqvPJK4H#;3S2=}bV>hg19C zO-;MkUaL1&&{VWJ-ZWXbR+QQu6GBP&GpUFk>J$xW#M$vu=!R^D}wy-Oi$X)~Rj*dwzlZFHailmz-_bBKlt6ajMQX zQ=jdZAAIaS{m4s7Z$#r>M)PCvGMstr_^Nw#(oN=Q#o25)o z#qh%kjq(c;-ixm~YHGMDc6akey{(I0admp~yl=06EBF0;mR$V#!0&y#xbJf~{=9lt z{336Zs^{V9TWlw7`EXJ0qrmnphvfAmy*4mSPRU#M?%?N};ynVnN4o3$7wru9{{888 z?d-C(TUT6~xKTjx#?A>#4lpmichctfDrt3_qK8@64g@MPdCvK^=Ek1D>w1gWU0YQAGPhaPe7(mV zvu{(2_Yr|xZ}rZei8>kRCD`3`FqMCE6p8zS2t<>x-aCne^SA(vmQ03aV6j1JWgum zG3tqanHsYuCFSBX3(uVunT<=As=4?1Tz;uCWzm%E&!NRT~{Jmqs)`X57SMF_pb!npcgO>5qq4O{N0aMToCZx9xq%h~;w^UQ@4j}`ZNwja*;VZM%| zV(9|&&B@-(T5J7-?%QYPBu&+pkohUy7!eXx9vS1gIG%OBe}s<3n=OI&>KB(hdA^~r z`&(+my(k!Hyi|J^zD+)YrR2f)BSqfJuQ=^l^3D0<+*hfgZ!hw7w4O^=ba$->uSSCkirP7?8y(vWqy#k!v@VtQKLhS(L( zsquGCYOn7LuiDPB|HhWd@+%6Dc6EM_{rqN5BFD+p2f_#D?%w(MTGYGU|CugNPVJMO ztM*~7Dz1K?I6AQQR;K2tsA)yyl(htSI;{8=!3iYB|qJFegE_BKg+Ir zM&dbJr@4EFTbsoP!elB)Fm7DAa;|J%Tm6Z zPeNGhTo+z@VY&I@N>S#y*^loY5A44@M}YBm;k#`n*^$c@@4dIODe=Kn`(=xE%1_{a zUmgB(-FsJ`P3w;)A6@wN$x-<~S8PFp%gw9v?73~q&CBmebc=TE=FH5pD9dT{I(oIV zCDB7evj zmAjnxMmX*1o!L!)J3sAu6n;;y?yLHw*7bEJHotAQPpSB=zPDVtty211Ud*19>l?0Z z+Hxgfz9~usO8?BA__n<>b`#U#b9Op6OsC{Mntp$YmwR0E41Krba_`#;4=1P)*S_%>#Pxrx4ONa8>Ren=BYdKRiHKy`mUY(9jo>RUZ`;c`iPiWFFuk2#|?_1JY(^)sns1tm1Lxo*rja$Hj z@cQ7XY4{>ioNxbEkSq8Et!~`!w~q=?0JY znR8T%Q*Y`mkuAT)_eNnWbHk0PN^ ze!h6+j=++=PV42S?ta{Ssmp6=%lqHA@7#-8e=*W9Nl&T$G503DgDmEA8g|U9yB#sv zq%67XirIv^-U~Yv$`%~0nY6W7(!cp#!J^$irruYZQ@2#_?4R@_+eF0l?`*Z(mV7Xv zHASJhJ8bpu-%B+rZr^#+vNFv3jL-EMb5i0Ul`?@Q4a@}r` zYLDRa#|59pE6n-z+-%P8I>WjBJCB>3x_|$z-?qaSbSK65oSSDUrM>juozHuYxvcdO zV3}iMczWVZ&vSF^oHV&KTp1HzJZ6`R(q6VaD@0pxY0!?f{D;2Vf==p=-PvSXRxO{Q zZ+xs+w(fIghi#!{O#GzMkE_>t6xv>kX%JmCEAH)Q$o#t(LH)qb_sD)9wi?=$h zc~fwpmv!n^N5k0ZmXD|NrJs7=+mRNVd~C_aZ||?a@>E;&GN$m6jo()3pM2G+(*q`4 z`E9-b`QEFWPIfMP&EmSU(U7gZ_~R|(JuhsvX8ksd-1pwtJ$^Gs(udW@zgMmQHf175 zXGg%yS*p1u>q1vQ^}am$>hbAbir2WdW_4z5J@R(@+(X}OCYda~+nH%*9ik=Z?d`ip z)Mjnw)?F+!TQ^D?ZoGEs?XfwQwP#XuZ|2_H`cyaY$c|kT6^hCmE4!yWI`npNjfQL? zFI)Z%O&gU z-2Cq|Hr(o|{@!3bN&83h{9Wz&Kd0qCTX@aq*O6$i<>|{-pVyu4q~FDK>ZwrTi(su* zi|Nz-cZwJWY6t7JXRMt$XT^nAM@n{c8ecY@q;fREQB!5RwniB zyty(?`1o4IcaOd(J)i$gdtDvN$)X>}a~|H#E_rZn^2;^5^;@iY>g;cK*Rk$C`v1VOeCHzqezH;F*RtHc@#Y+FtN*Y^Gg#Ao z|BH!dl)kaso?qRW(pccXSfnMf;bdFD)+pISJ3XIEMdvK=I~UaDG|5CYZbh(`YeiIW z{+8=C{u`Z2H~H**v+Lile|&uB)%-m6Y&!jrKWpX;k@z{U1J50uYO*Qhs%eDx@6SC; zHo7<(EPbgLac07rNoOmfuChrRyv;dN{3<5;-@{XUx03I1{?R$r?Z_o4nULaC^e#eD zdi#V6(KBYP{hPD=uH~vJzx@2Q7o8}5#wvcj;4%;E{m%}Xk8VUNxu>abR5F<*Yc+R9 zuzJ72{tah}_HKRFp5Yp?Zo5bD;Ug}lx8UN1^$$_9X{0PFJXk zzkiXl_3AAN_TE^lhv&|mU)%Q5tn28FE0J|x&0(#ko2vJ4|KNOZDenCV3!_a}riA~$ zAZ=0p&BA={ykkAN$+|EXu zr4xkJ(`L>tjSXk2|C?>?8~m>RflXBQsiy_fy;++jIzAQ5+rKBYEnGw?&&A~JnjK#Q zX4e(?ocOgmSAF*zH(?d?Upp_FeLi%=ckhA(4wFLGYxYbwQ|wo$<=uPzS4!J$m)5;+ zTkV~e&kpLcu{q0L8^8bX_r0dC*+2bge_!3wc-&>Jk0zJqRHw9M*>kLmdx|U<1!)F? zj`KL=(_nL`;A!m4=anpu4VP})?1|CY;;yf^DUW$&lbltFK~F1DF4*w65Kg&V!iOxSEXTDO!n+Hauo-E zoey6ZKJ8k@TQ1T3oiABd8k)?O?USFqP^5KBlylQJzxtR6h;uc(eWwqKZ+iU5Gkkb?0QlwYcZ)KH+$FRNg{2ksLE>(rcuZ^d;ti7>cHa$L9 z{3(md45sy4o~uq`pYok)J?p+**R40rztJ5%i~GQP=JP4sr8?(!FVUFl)OXG|aP_no zWx-OtVu=rmbN8LQ^G4-tSo_b_;ipcY<~6l8-g!1wWO`iZ^E)xCJbvGmx^+}+($e0j ztjyG1x*J3jYR=k~g^n(P4gx<)4$aW`(m8pGcKGxe^VV(LaD(B(=g-|a z(H>K#vl=(oB_E5C0j49XmR?oT=|eS6AVR#UhbZl5_%3Sjqp z7*lokO**5vdk)j-1C(DOd6@q`53q;X86nwIEsi~JWerMd@CjBey zyxi;~weNW+Fv;Fgn#L<1S-VQ)MxJzbJ@4DUng!wp-QA{k*0--I8L-b`=wmQvG@s#6 z_M%eYhwcM=;|aI8TRU>5#>UICuMsLJ56x%U*L#*dW_|S4-omLLJ(DVaOw{Hm`1M4v zPuBX-moF;wwl~J{rKNPHtUaRs``-(t)@#ZF`uAT%c3#Pg3v=?!U`6{!5` zubIf9%p*~&t)^dL>tvK?|Hu2m@PW~WMY^A|3U6?&7T?L3C~32kO+CeX$L=@wC*}GJ z)@|^7u+zf-z*>ukk%uZdmFC=#VO@2=lW*FC7?ywHdc|LgSJy{&ocMOrxc;oxX_X^K zz5mJ2Ik_*_g+(xYiiM$}W*UOo!m$rqR zZ#%_(y!zs%l^1Fp403G?UUK9q+Vk&`{=qs&byL$^juU=68byT}Mej5&ao|qBI;G&< z2CWY|a~{}mTFkZGCjWlTtONg9|7m|v|CcLwKzbnBGJl3oJ>o zxjp;6_Z043=JH}kR+P>UwtJQ~yT>#u^3l@ktDpUqcdVR${O-y4|7#3ICax`DJ{V|G zxbne~r#mf9KUI5Rp~p6v*Y{@dt^@yB?wxV4(idSe;`;XM@Vkv|rA0hHq8_*&_}oyO zW4P>brQGGq#vxkf8C%yj>zGXnUzdITdU@Icvuo=2 zUY&~mc{AC5UHzl{g>Ppad{_SPMhCCXOo15(QoH6d%5m?JnC@$~_0>*JJu$OW=YQBe zcwV@1LfXFsMTN!5IV~*LM1%{(P9_)r-5J+wyx#oj{{SyTW8>Y8u8-0S1zxkbxSu;K znzMbz#spiHTyI@3?U#OW4QH?@{IJjQ&qCv-0DNABDzPe_7OjG2?~awamHvj@LAo1czy< zySf@bme#p=ky+^69u`mg^?!`K`rog6XBORaa7v-r>C8FokId%mn6pg2eda+`HlB5% zVi{d0_9}gOcRJw%`7HN&Vlm#o_ZmE~=k!q2j@=UJ<2D z)o;4<|67T9vDk1`Se|pLG|4^^u;tpBbLRr})`vfsz4b}hO@YNPJPe;F9`U&JX2r8+ z#-!`}r}jUK`A{44IONppi1nY&msGyn|HO6&m*Gvh+oE$V`hNa!w>xv(?pNTtxLrr2 z@BI<`GxPTMUj=-szhBMX-?v~&q2u27%yCVh&wk?%&`e8zz9K{`^4K#e@jc;Xg@PLc ztl~IMt`KDIZP(3=UH@A&MCz2f!mXU%S8_6KTyiRNewnF0JG@2zz?H@Py)*tiDc_fI z^#A|6xBpeFFJGC!FM0X)-mRA3*T_G+v$?L~>*3r7wmW_@u0P0nTkLaum%}8LC7E4@ z%hc7hCx`^N?s}iM&_?6z%6m@^ZWZ9Z+nTfHO~oP=OZQtf%nzRw2HTxwmj7{d>;8CF zR`xlysw$S*99>6KbN0yoa6fRKA^gtz7M0FwrA^;t7Z)Wh`dgc}_-%62tVK0<7VY`E zJpLx%471077HZtC-B|MMzqZw$w@>cg-*=bwT1>2 zypXsby*JlLz&-H5-2?nAjvqc1?W|c8wf5of)sN+GUa{OiiS_n%e>E)$Ml&%f{`9}A zuN}~L{(5J|(X}!5+Yinb3cPptk^f$fH_uB z&lca{nY}zeEMUWWiwUcrC6t8=u($+1xt_Ik{a2g+@tJGq*WT6qpq+PaM||p>Y;it= zBx~;Q(%*+nvVFb2D6N=#`*8}#!C4|pZF6QVnBpc7GHu?PDQZ*ScM9efQ|p@v!5H+XSZzWE-tc3f|oj(e0Vs<7uGg=HoSM%jVpO zDZcydJf!ch-}?OYj%)ixM0y&S|K{3%Un76au0lRIIQYz&GmJHi6|x_a56qv)&ob#s z>2lxbp3;Qx3XAu6EK=4y6@UBa)mVW^Y3skX8ggddDOZe~opk92rS%j}(tt2(|M zIlRR1+Kw+t*_TZ3m$f=*x?ajmm}FL1EtwsB=>})#R4cf`Dsb?XW~*~dk` z`{VL@UitaPr~_NSz6jj0lZ#KPJ?&`B)o0NS>zV#bRWKLuYaHBiu*}lsmsOgFLuQ`P z{%t#!tv|IzbZ&OTf`AUwl3Cmlv%l$d`z6madD#&0s7zMypwwfgr%9f>c#kY=SYW$f z+=2bYHnGjQJD;l;a!)QX%=Edl^76WP*EOnn`V-Y;t$MSMyiI-d&FJnop}W_V)ZR9| zv~$+4{TZlKB+T5rj*E*=tKH2b;p|Mo(mNk!&u6L=-#FcHqe9y0+jW0Jjk zy~b$|i|1sMmkLRp(cVi6XYaVI@Y2lFc(vloZ63RP9R$l?MI=`>CG@`BxyeOGt@Gl% z`H|9wnU@aEnzAESy)!yu@`YU8iO1&p=p^~vQS-GrGPg~5{SM#Vbywedf4=2&E3%4d zo&22p_FI~ononA&K7Y@(a|X|jUAGRrSN@jFvNipY>wOj*S#yuoFJ^8MuejJVrB83w zwMynqo18*;O4cQW^e(x5Xqn;MU#1N?7t0H~P4bd`dOWR{6fS>0Z&T*2;$T+Co#N_( z*&dVi3acfjIAzbz%kEqd;<{$(?WiOC+9k8Q8@ktPtPMQHIrW+yQ$?Le^20+hv&!bL znexjhFX_S2y>?4kSrtYzIvpdG||L0Q$AV9#@=lw9g18)S zhE54$eEL|^EH81_>NHjEc_o*&1cx8Hb>aKsdyl;|C*?`6HT9}qQrLa!iQ%Oky_e+b z0*VZ$Eb+Zm_)$n*N_NtYskzSIW8<$SOj@@&$*Na}V}3(W#Kw$5+dDb47%t6U(Q=3D zmEQy5>RLT+F1ND_<0Y!s>CHaybALheS^@4e%=Nr~ct1!VD1R7rRou9uoO^x9qMD@6 zW6c+{#HTM0H3`(*xM7P6*UIOu9lo{6LIT}_y{9&-elFbXu;yr#^POC!YY9iYgjg5Mc{(|Cul9yz>Z<2OCst1hI$d2W z1$K@2BpK6yi~F)J__05^{Nh1;!sYXiZ(Y5A=-e}J@f@zeA5W#~RMm3V&G1<^Wl`AL z3pra~l^bH1m$wDCX$0=Gf0iOb?`8pJX10fBHKnpg=%#-%WFeSKoJg z)_xR9aO`0!<@U0bykhV2=K5o||6)Btm)8Z?D>$9$dcrRF@X=H4l3lU4_kRxG7j(*5 z(|>2!Ij&ZrLbaA_c9jbk73I!9dCPwHBB%5W1|^NVg4w1X+$;F@Y_iaB(9aO@2C5^8ZVy6nU`ufgev@incbQ#cmQ*?XyaB2%D} zhrXVk+rw3ty)6nad})5RI{y$`z4?jahTDb8yj)y-Dy^=YT$k+TcqnpdUze8r#Y?d@ zvwW@ZuU7f1)@vK6^1O#*c1fm9hQZr7vGA;(m_0Q!RXo}EA7?t^wbCXcakG4{FzcrM zsSm#IOnA}w{MoZp3krB<8DuLdtbe?{5}r5S?Aq z@~TsQV!^N39BTKP`1S|A_{?!3QRCtq*Ozg-1^u(7Sq@f)h4pJI2uX*K&P zdy&Ym<$3~|el92e$<@T=<*rdz5;J(sv*lC6@_-smEvLzal0$t!a1ndj87jt@q@V!mg^tm0w@|`NJcI!gY0cY1UW_g(NpG`XJwD*w;2jX5%F5oKH1W2gm*y0v^(MXwOiAwz=U05*KdsZ8y)DcKsk?zJLsWaeLrnR;oWY5?Z~uRx2Zm9wS#-*kE?C^6Pvzq){1`+xbnXP?;q z@oUG%imA(~{l1vZa+AH1=fj=7c9pEGix&w@Qhada$lnK3Kg|31-to!5CztL2=XXB) zx9-Q(dPS`tDyLq*`*WAiT5D0w9=E4QguIULdtW`ZXywUg&B0MFe?prk?OtOe_|e5> z{jZa(s@r{hzHL8yMDxipu|U=e!@m-~jt3h-R$LaIy1?njm-(!Q@uvL$K1OTE)^@T8 z|G)6+#r6va4{Pkb+3Cf4U0Cp}ulLJ{Ra=f*dwbMf` ze$(2ACxdI9&FXn=B`tPcS6{avK}5uGlAy8~>(iY{JKmXw{ETSHyx;iJj$L{`!)!Zd zLv_LEj$dJdf}YcYug-nH?bYX#SAS*)AIte|bI(9Jn_=~oS6v;)ug$7D_xO>De4~Daumd{(g-dq-WrlS-%(QOas zlpw7+Tq-ksw4Oe`p7l-pv-fqqImN~Ix7YMM4F-=qJ`=2MMzbtW}6ABl)fZJ!zw;d94nw%Dui{zLs79b`q^723r-_;- z$DXV_5~aQ8lZ?LrpOol%b~nSkmhV>BlU*y2`e0^tts56toA1U~Z;XqsPw!wAymXGK?z7#SGn1E1 z&9!&-{v^9(?(^;$lUHpB3R@&{ZN`?3C8>2EA5EY7((KtCg-Nkb^9zK{*Nd!M+tlo& zsPcPG+yc9o3ocphsxdLS`)jV(qx=g=|M-&LIbBNb2;ur3-gar*?aaCJ>z{n~TweE5 zCNJ-#fk4dbDG%7rXELv6__sx164)H}mb&MW2TNYxXgx1Dry}j>tRF2#Z{3qGFIReL zYb0NtN$)&GCmr+U`kj*ViO2Ktag8@`m7Yy$`VbJQqx55+ zec_Wcb2B4mX6nTM>oP3dz2~sQo}^?!#tNl%y4^RA6mxSOn|DablI6=IEj7l=jyL(H z^e6V}Cht!7i1rUSab44MUbAn$d(PW{PA-q#8*jw!DDl6Q8>78@*W`(xSYvEY9&U9F zDiF|Uc`{*R(T_<9zD-;77OS7rQ2l0+`MPt`wt32Cf1^~NedMyeDzn+-CIKTR-j^|&`89!RNK06tnoXfR)X2gMgOK(RlviskWsT(Ua zxvcEcX72`;=_jY=t1#~4{t*xL+meLXs*R$vo%VSAo-e=jQ&{n#60v>PfExHrZ(C>5_x_#YgyO?-{_`c3z^ z1C}a>)Wtbm>YlXap5x0C_7f65JzeCzU#DXFx2pK|{smKlp5F2)c(Y8sYO;HN?^f|6 z(Isy=FEE8|pBsMQs2Sdw)p) z>rs9s+v-n!4_=)0U;F#wkxODnQaHaq*}Cb#xqu@Y+N4NQ$D?6JO8c0^4h** zK@T=p*IKZ$9$q9csY!O>6sO;+-^)#SFKjvcIe&S{ljt?!m6J98PuzR&_(C~-1JiOh zf0@0doJ*~wZA$k(_`~{OaRAFLZa%iw2_ihbd)$uB-YaZ)(s@_SlXR6ibxSLrmUC*| zeEnDYR$-R^**QC6n=Ykr-<)>wYutm?)wMEETNhqB{e|lk!=ju&ieB#fFIR27zPNdH z_1^l!PTHoTQ`LE+*I$^!UMD+UC?=plL8E0!g31@I7tifE%_6^@+HCJ0@H?=({C?c~ z+Z*@{*2p%l<*gNbu%G#T`=Pa=1qB+H__^KMg0eP5-7C|t`?LM)9btXNyZ@Ig{k>!F zz5R3L=FKQ+S}Usg&+db~#+r#u%x;MjMS7;h{pA#x``7Byv!mZ5*Z)#xdw;rmZ@%@B zTU)9nZ%%RD#PCPxgMUHex27g$*NaL^6RrznJ8D|>*Gx$GcJcm;o8R=6pS_8Df4ywO zqW3!s&bLo{bnQ>DgK2}>x~ABNc^AYQ*b8+Z-{<@zdg1gZtvgYy?43>?TxC=5T)q1D z)$WdScJHSy>5V_2_Iri!IwsjW%5g83zx#i?T!+b@*^YhA@voOJSxo=v`am(Jdx|LY z8ZJRiiwqH`pbf7(Oc$6mY?^y?e$dNLvqgm7li_w1SpI+R zq;HRwnFnxq9CTbNFsaGb(Z#@1Jn&x2e7$|5m;c43EKd4pdnf*BZNSw2T63#ETFbIO z#)#K$-F$HmD=T}G(v7$c>KaQ0q#sYbqAB}xdf4=TIdgum)L5EaQo*U=vSdMmXzK)# zHUBTwc?Kd zsO4_W6dwBd;fzzB0?bxApfH#1lJGouW6>64yGc8^mlYp1JOAJPLFj@y{wX(aUJF;c z=2DoxGw9MU}Sy_|46jfM%vzZnehn&B(qe}jWH~-3lM_XTfU_N|vhkW$T)t7~Vl zvi|OK^5FU=>ZPf6-cEFVk;qiD{SFpC55M@JU;gS@kk{GYiBDI_U;Xw=fSc=^EGSV~ zf7;QyYR-WpXV1?___h1!>Oba==G%As2HuNb`1f~WP4rE1ksfW3LhmBOogbd^E2-_f zKc(-FFsIr+_Vr)vwng!-Z|;8_`mcG5{`Qx8@4hY+6?tRbHDyXuZEwefve_DMonPDB zyP{jX&G>(g>Pzn_OU^S{w$I=^a@T}&!6*Bvc?%cYAJP7s^L(HEpOBvy@3V;%yK!-C z^C~pOM*o4}=i+rDbmdm4NcFIji3 z^k#3bJ}A~+i-h|gY+R(SVR@I;Kv(5$!zTg3FHdx(HY_WZTok#1O<$vnkDF_oci~eJ znTmD7(?dm=f&!=rHi-SVkA71$vvSq~eFg>w)e_f;l9a@fRIB8o)Wnih1|tI_BV9v7 zT?4}qBO@zA6Dw0QZ36=<1A`d14gXOzp(l zC)#=+4iIU(zs>7tnAHk}M-vv-@#u=M7GAL`(G1FBU9ERA_Y#+P>(C;BL<8Q+dNk#gyUlzo4Q_eTNoy}PcL_5?U?m3;78d0whmdB^k4%h7$R z75x<*Q=c$>e$ZX$Bj;An9a>N%5~!5lbA_uk zR5N?Y>Mt)>bnW~n&N~yBw)~mJRujX(T$%7e?nV6fw5xZH{}i5Z zdztz!X1@Lg&Q<+6e;7H6GWc3mxm+0-7!;B{f_xbms?-=58d?|_elajGG`wJ7C^cYU zc$L7wU^Rn*LA+qju0R_G1_rhyZ+904F!<@byPko8fwRCPvY3H^KM{l(SJ*GlWME)m zFY)wsWq-!aC?>6b-DqhA0|Vpcs*s41pu}>8f};Gi%$!t(lFEWq1#qNW^v(^5E;_8h z^XIvUZPNwezT{@x%fI6n2=$ws+#>|;$LXxeUv5VI>X;BDvgNQA=Ba3 zS0gi#lw_9)N}+r#8@y|Of0_DMx$Z{I)+LcAPc+C1KVbXcaeMc&$VxZ$H~eY!JztLh z364DKk-nHG_0W=&`fP2-ikrjj%#Fi2%;K(1HMYM0s7U8e#LsmTPg|zUk$(I80C(L% z=I!Z!p7pvbemm*2YR5{YAC2=r#(xS9Fuh`Tzc7CT|Du^McE6}L@O9M}jQssGA}M`; zkdN0L4Lx21H}UddiQ{`0T@8QoBXq<1?}hj8eyGjbUvlTjBE@RPz2VBU?&}`QkGoq? zT4)v(_S|f8bKr*1$oA5wr=t#TS=Rn_zS117e7Dl~8iKa!X&E;6m&U*BQ<%aSAzQwq zy0vk>yWIJGR)O;0GS;29Zd^F=-es|ncaamc{u~k6d2e!&MxCuY}>MK z&)BG6OniQSrG+Og31eVrVDNNt45_&F=5OYN)Xb{;?SJomw|#9}etyr+^lNcfW3Ptp z_5c3mjqwadg@g?PEUtn|u3b!?k&3Nf5Atcta9KNr-B@OKLO$oF;1Y#fkHiBOrFtp~ zv2+MpFmWar7(1Nz`Tiv?w))-7a{J$}`QPu|zG>B_RoN$R?K;0+NqPFIGu7`VJ+Ghl z_P>LpH@}+;W z7F_u}FX(xV=Je+=+f7n$|J(A|;`6%I%W|dTH5s&~u{un8{`0AU%%0otwZK}5tx(L?dX)?E6iWf!_P{(`4F}_xYbLELf^?eU?l>gHV%Cw$R$n&vUj~y!-$0-8=q&-QD8< z|NK4ZkZ>vHzwrk(wZEYO1^2-YZ&6_2-6ry=NB`;e+1vhZt-Nk)`F_{s_S*ZlZ+_3w zm>TiPMrxa{r>0I}dHo@&8(qo&3d+AfzQ3>RZT#PJ&(e6_Fx+ST#}QF|=llK#FP92T zYHCtv=FYh3wCBo(xAAie=bV@S`1f$S*3?U@w@RsdsVd6_EpmIb@cm=AUy;Y6_uhMV ze|ODK|9`)?Zr$qgn&k)M2iXU;UAH_B)-I6y&L|=x62KN$y!6jf&Er3p3OjyiOf-*-m!p1=Ou=cd`ZDIL3e9P-+gRfGE;&*f@*x-3`S{?*q*7U#tqQxlTEgas7% zgS}Z1$x?Sz=uvoj%=g~utFDUA)1LnPT!_}IR*=e60IQuY4DuwQcRa zH)ZDSm2u2b5{fq;{bQQfbY24-9d>+-^;d-+g)ftR{^q9F(;L#gZf`>bIxasoIzQ#~ zmE7M8pUh_s*s4>g#1Z9tyX^m-+k0(J81b)2c;;8t|NEe3MU_U&k_8VgDmPp{aDP+l zkDHO#V}Hi1HTztA`SQ}@sa*OYtJhS>t*iOL{8DwPMW~*6nymWI@ZG!LyH@5UE}D2+ zEED{KEWqYtc%|Fz>+f&%zj_Sau;;^)o(zTedL?55{|VO*8JqdJ~7%ubQf zJUZ$5*&jjg{ylv6ZWSB<3#Qp3n(LZ&F95|9y9x)>B$dR})YiKF{0=)~+_HV=-M_$M z%3c$FVEgK6U*Ehe+WED6?X^Ggvu1yeTYL3`8`GxyGpm=#NL>z9wMa1hICawHzReq? zT(jTLvJPZi7r0~x*SjWA=8~JB;`yWh-{Sur_kYg4U--%9d!vG|5+bg zpDGX^_hrx0_5QxH|Gw_r*_yvS>fA;JhqrN$Vs5x+NZM0y6`qITMGb)$g zkH70R$!MACPvtI=@Pq0B9G;E`Yd_82|8w@A5AF6LP90P2{~Wgev+UZh)d!|;y=K37 zYn@+qEthbsNuz$0)1I15AyGe8cXuzZOHNGuxHanRs+(pBElKaA_dU;jfBpEIzdshZ z9Gy66Rq9k*P3ih;Z@(S3v1eM7{7TieYxRR|BFvqvtlt|RTO29ud2FF{dQ;TA=j*fA z)(3k1ob%XX-}~Qu3ClBYo!{j1ymH@cm6OxX6@O1zdF4-ec$nYcH($Q|ne(_~cB?b< zPYokU^&{WJTv!yg?vtBVklgoL;opqn2Y>70|BH+3@B7QYKDOHY`Y-hZ^}ID6ifXLe zA0|j&;pVb?dZbXNNkJe{Lhk(MKhe`t_vYOGR=hMQ^W68pUR$F=uV#f-&l4}RlC_lK zdmOi3{Mg(+yGItK@u%8UTXs0w7%)v@mi+Cmn0#=8lLF(?uP#2v-rxMZ_j@FM+z)#vLmnMPw`qB zzvgPz`RS*hE{$3nW?%MZ#`mx5>+k;E8von$yLbGrpn^|NP6jOv()_(Ip3`Q%(r23+ zFTT5aa){N)SL?_*O-SSteEH&Y2*>BIv+r#YP|Mm`9Qd#C$dQSY95kn9-Q6M4Hog4v zmhOu?v_-y7YO2*xn$*;^TftK(Ej|6_jT;r`O7GTdb2RB&^cC-jS{pWf`t-Z=|NopX ze*ecYbBm%U98ZfR8+1nmEQ%e_`YN}-gG^n;z+W(5lQr2ZxRO?=M+I;!)X2)rJzwob%+q*;ZxVz!j zN!vApVpz=sT~t_E%Nw6pmh8S8x%O-PN1ONQwfF5!jE#eT@0|bJ^1J;H{(sCLyZ8U- z*3r{@v`f#4qeZ|&le4Mea6A9!H!m-55fgjiCiq%fde7c{=cXE@tT3II`Y`I6i-%g0 zQCEao>6Aj3LvkB$-rm18yd9+>e9gzBm+t?&T|e76{oI|c%Ig_seYH}( z|GZiL|BQR*_#)>Szy7T=&1-wdiL*|dz9;AMy{YQUEa7Q-om30SaP);~P5pHK|DW@p|9n1wfAiYi=ZySp zKl7a5_e05f>5Y!$vPmr=uWQp?^VF3d^R4&c2vT6Ybn&>R`Ld&OQ&P`Az8dxRgt6lV zmSqj|nWxEJFAn_h1RQv>0!|CIhIy?Fp6Zo)@$;U9%F3DI@iia&UaqOVD7DsfU2gE~ zdB-;8wnZKblktD%`c6ge_ui*HEG`^E3Oje6JGAz2&-X5URsFEl=ggNc=bt*|Q^WIy z>kPjO?d@6p*+6y0oyNc;f#ovKXL>CS;%#y`d-m+Z%6qkc?be!lc};mNknHy*J8;SR zw#02yRU+4XeKMzhx97LNY7dO_dOVEy^t3J>XnOtWXI1U9n5CN-t~6dZ+#SNj)%ERu zQ`7DRd6Cy9z5hM${qIjNE-v=*^}YK$|K{bhs!LKPqy}1dRn^a0cCu{NHtD{@FSE9O zi`g1AUsChx*^4LRzPTAb_N=fJ61J3zm{MJLymY6Wg9n zAHAS8&;OnY1|>0B3096%o7NNwu+;616Tf`<@^{&ZJ={+cCq0?%S@g1I{q{zIz5Kub zn(He5vH!BC_4=}9eD&3d4^M0?+PUw&;oWE1k59O~nOS$fb;gY3GyLMvg_v?SP zS`xhAp`BI_?2NlFK3nheEjgktF0QVnB6s6o*4TFDr;)&U|w9SG;_)(?j?y5 zue_)08Ordze=qLkIcM3I_QO8ex(yr^+&`SpblvWCoR#Hace?;ByF~=T^BTyDe8be!};JdOKa1>cJWO) zo!TNW_hCWB&bxW}U#s?}6c^6&p3$U`5D|iZRxmG#vx#`-kK>{qrL0J zySaDv%uczpap|``o_uNU>xG)SQa6eozk1h%SHCUMWLKxe<)fh%EcM4Ah0_Kd@8^~C z(j&vpZhCW}z(Qxfef_<=w{A^3{BT0q?z696X}x~^`pfUyNh*v97BZVQZ$A9$l~(xr zxTody-^+jgz5l<~?#F}X4VPc8X$|~h|1|160%@aKM(ip=$HDxr9x=pfp|LwQ*#7IM%11_Q8XMWeNh|=7(jf=~!(ZrY0 z?32y?7vF!sUz+)9zI}b%|8M#K%idPs|2@yv+PYhyDQ&ao+OWkJGYm{kj~+Y57QQY< zu}i7#uwwYSn8e!JT7lyqt7fI%Kl|y=_M88g>~7tdQ*U=>Q`V$ZU&W>S?>9WEODa0e zvS;Qw`wPci7_|4DU#T#|^3Ct|x+`zv4!v1gFSg^9Y)~QVd^;{hO^qGaZ3pC^SL!X+ zh+>WNyj-&J`s=NBzg{d3+I(}%^5x5yrbaHw^xA(vJw2UWk!5QX@BQzk>#x5q-F>%v zZ`}Lx%O-!T4;;Td?|7QTy_#sD4O0bvPI+CGx^&r%;PZQ8xj)psxtqPny)KS@Yy54o zrquJ3m!E#xTK@a5cHq48i7iijd+yd8Om6|T58v_i7Vf=!>hquFhaY}8tkKoC?e<$x zNo;v~lR}r0zvk1Ug)yf#o!O@2T{Um|bg!j%(>DLilR2LM{r6w_(%pCMYii5BHUEFs zYks7C@4RhGo_zlQWd57IYuN&HBd6I(v0UyGm^#~bM_zeDL9E8H`S;)KEDcC{$QDwd+I9RGpE-==y%sKyg52H?r)!g99dFE`*j<$V|cUttF zcH+?HV0ydj-Bg{^_fCEO!+gB3PR1?pcf{g@^;O^2RIIx90ZzO3 zJR4=NmzK8($hRi`*z31^^M#is(;B8;{2ueJZ1?q?+xK=AJw2tsbNI*gx}VcOf8A>O z?@xH0>(;{;l1di+?fw6>{^sx9(gzCtHNShWy>@0{&`Ory90%vcswB<-b$s6+I4yUbFwB-}>;_{>Lq^nZL5m7X*9Xf02e%y#%v(i@@~;`K-0Z3a2*Z#H?5z zruA|0|2OuJciaEo>@+*>A zFEIDXyt;3Cg-cS76WdW^WGK39*>3HXeRlun z_kXOn%<}cC{k~h~-}nE2KStf*xzIO7=KuSDyFYG^KJdIT|NPH=pQYRRWaGd5jm}bj ze73_};fRWs z^Y_k`D<|{MoZ0in>*bwLlTGX!&p&^}H(y?5-V~pk+h!Ea(M)`0lkWC?^#fyviMO;g zDo)gVo&R^U_22E>HG)50C9T}@!FcoL^JgmNZC~H<=J4AikJ%V+PX1LD(GwiQy)K$} z%BQNxGKt4~Lzir~V-^wgbUgU@@IjI5@w&IaeO!O$%$%y+tW|5im82Y$6TGP}wbS?b zHQxNkzfNkfe%r8UQd=f#*)rMXTp^9Y{2!lj%~JqHd4&zfna*$1ZI;@7ciLO`O4`_X zGw<=8i4`AymDhjzS+U-u<95xz4Hq0DHD66rmD+aq2**jwcL^quA6_m5^&F2M=K0_n zeyTYA_1DYx#@4$l_5=xj4-&uWZ;~g_V=H)~PIGHMQ$fK#3x8C|VfA;L?y5y>;onCimUD_3_vPpgI*7(4`fv(EQI*JirY|>({ ze_IkVqjHjy2PEx$cp-2==!1B}`tz0dPU`#k%h#^Fxh1==xI6p(-G7H_l_%eJQRa^h zn098$?o|=f4%}E`zfg91ce}%_xu64mc%wcdpoj;2(Llt29CV5ck8157sm757@Tm@Oocg z-MZquygW;emK~YPf89OTeMeJj=hN)|7k*Jr1vj=ZTF-C|7dvWma``+^aVKYYym7zU zgXqokwtrZ=bLY|hH7_n)D*n1_?Kk0x{*TNqo_O2FFTZrgo5+f%oR4MA*0*Rd>P+ck zTj#Isnzeet14Ts!UiHTPYg;NF2dp&teKail*J)$psh77(eJWEb64zXNd+FwHx0b&7 zyRW(I?_OD{#~d|A9A5i^-YJ}3X4u>*&vPkh>hI-Km6S9!Dl9Cd_VN75&(YjpyCS6O znYOX9_j+I7P`@xO^Ntg|TPIHJcvF6Bf9$DOeM+AuvIbp=bN|@Xu>YCX*Gr4u`|rP#v19)Hd1A}6O?5QCzdv(JxU=R`=YK!h z$o|zg?DpAvaYXe!Hp|&vm1uFsFz_bVhjY$$EltN=1Sg7!$S`QD{f}pk6Lb30w*E@K znauO6$xlDMdA@wvp7m$XbzR;n_03nQ$o!?wj_!<<{qrAQ>^||MEM3NZuHJOj3+&4b zg8v--`7GEAWR#7?y`u*cTn|XPuhb9Mea+3iuYOb7?WxbDd4FbYK6$Z7()(2BUrw7H z9dEWa?~e^J+SXe?OcyZOF#q9B_^v4LcQ6?|O7iAO@G?z=Dhb(&ZZbG!>7BpFWD@&ua@n*lL;J;a(Wjd&^CEgnQQhk$ezux5Qbqq6b_A)=z1?eBimR;=Hd@tX_Lns%=9;1FD@~7E6E=Na+e5YM z3#)7tgfFMIU;9 zbM`**vv%sgYF(bRiN(L$XZFdUHRXNnj-PuOq_*k$vmbn8KmC)_l;^w;bkvk8Un|N7 z9aLTxu{AoNK)mNxDf0tW%_H$!mi~EqU{hSK)wzw9_vhEH3){SZ?~W7Z&!5dGi*5K= z_szfTgXp7ami@QSb#ByN zdnWs(8+?9-1af#DOqbGRiJvw1>Er#M!hb}qK5GBt!(r)v_rtp+?=PRM!X4Ccf5Xy0 z=HAo3vfkh1XC||}bXOSnJ}YD8`ozS>;H$5CV#eCjbo=briL>wb|F7S( z{O+TNZmQhzn8@4z0wwHLY_BSR~M;=UPZM0m^CLw%K z=0@p~p2s%V8TS8us&9P8=-*oVKhAY!g%kOA$J)IqlMP=vT}Sa>sp^sQyS&ccbYhto z^v%1s?Z?iamGf4H6@Dv8d8@8u9)IwD-q*K#yH4EeKW;j)(Bx58?`l&q_W$ks!VSLI z&40i5fB4~oAN7Af9De`j+tzH$WzDbUng6RA*gQC_RpBFII;rVA)8_-v4d3nVmf&CE z`(SzDy!r=PrJ8@T>vO&Tg#Vw)_9K3`-u}WT9e*-+?=^T_X}|cPxyqc@sIe~ z^XfkKmzVFaPqgr9T%X+a?*3Cf=^I@0a=JQ}Jhf=>x0z}zFsrEHFrl&`?~d- z-e*jqSQL})xtY2{(t2c8(A(SnD^^egpJODi&EmkQ*C|9OF^*g71jZ=8~^uVTNGK%}M4t581L|xr>_4Qdbee>Be zdec8n*`?T9>K)Z?&3%$r@Tj`an)@=LcUF3LPn>WgMqKE*Ah+i}^`)hUuWx;}_~3%y z^Y{J#*Z=S5v$SYu{vXu`-Uqv=`rEo@t$uL%RN;f^Q-kzb9WO*gMP<#gF8AB_@tE{q zoAY<&|2$xSb!n;ht3$2aS=H6IuSJC+KH!uvrXTHSIF1GCkHQzf0kK|lc%Wp|;y8r+F+chWZ_NV7>yen7xXT^~x&#qiMo4;+!k7-X!FJIYZ zArmL{tWrEeey^y_Q4y!04=WvK2ybVIn-ug<_x|_u74xoJ6hG_vZ~pJt{Q`bjtCXMn z@fAv*Z1D>*G#FKWDra{`>g+>1nMEMQj(3 zJ}gi^SIil+f4<&ikx%iG2M!b47JbYjv~h zA75*ycPY&EyYKJ4e>}PQ*hhs&6%rp8+C8`vqQ7&cn^B$pI!#Z-4^t+symq-+=d>PQ zyR_7<8H=g|wJW_qE(&gZz3av{-A^|5fh$Am?rvJMIq1}-mzS4c)&Fxyzr(qmFELVV zT596$Zx&TE16E&+h>TP`UwmsWU-QEW2NMp2Z9n~c_wJahv%=OM>zQ)mPE7ji-2#(8 z9^c+=VD~cn&a?kJ&z{%tQ85ym?EdifzWEdG1Z3=gSuL|PWBJOfzL$UbP0HDF*@UsI z;jMeY4p#m~PzDoyQt3Bq*|eZnDVuNp=@NLfA@}yX*X#G|?fGQu;brj89_V~dw%WJVEX?Jt~KK7e< z>}>q)_y3PwJh6C9|C_&ee{cQ&?z&WufQRCSsY&Xda}wuuuTHd>`($VHOkK@2!SkHB z6g7XCJoL~!Z!-I=ao=MZ&ZYy_MNc|@+<9*2zWAa8N8^;D`yDJj3w|sWQumwl;KM>^ z70*L?yU!}{cy8|Ljq8`s&n*=7XmMDo**GO4=-#%&ukv2YegFKCcYpa5z1dgXE4H+L zGfY0XW2fz}XH&vGH3gh<)H}akOqjrTX-n5e-<>CV(@wJbGqz3;vB|Po&>86-{ruO@ zbBAwC4{6XkcFZMVS8jfxgk-Hh!;%>Lj~12l>>uxX=d?1U>e^?U^;fexH>aOBGB$3W zBBaPNE%mLoO0v%BB+#hiy!v@*n>}}5POMFCw(ylaVkmwq_ukv@mh#6-wjL8>3g>up z@#?p`H}>DpG<&kIrR8;NS$lhQ#{QXwb5q{)oK@%5d7c6H#D+Z~T>uJ2;1 z;mEOVI;>~mz@?~JA;NLyXD-_hskBpnyd`c=Dwe4JIQf9#8MVEeXT-{DOEkVrWN~HC zb8DC<`}a-Zf)>xtjD%y`-tNl1eO_y6*1FeS!OQ(NZraq88kw^;~}{&)tT+TO50uJDzfxsURKVt(63Z2$eo zPid?9+OHa1Z>x9CEqHP#!uyuCSzpkNpjB5jy6oP3zwJ3sTY>4`(HI308&yzYu|aUg z&OX-%qMAp|U#I@(emd#5rRq~-CO&n~Pj=sFS+_LVEMc?BETirBUgUY{O3imR!Ha~uIbNb4w zuTv`h)?ZgXYgDB8g0DS?r@h8T=9Axk|M2W3*Ft>DFX@VXD5z#^^cS0UTlAxP?*7G2 zzYlNd+kgA<-lbti{~|h0O3&cabN4b^9Dern(4RcvwEALi^lP%IXEeAe}-?OU#0X4=@1AZg6_SLj3P zgYFp~&n(<5mbty}PhK?Bb#3Y8&wG@&<(hBS5iTw+o?}-#OMyd8Q}^^P^Wb&`4vXSv zJm+mb^DI?RxIRmz&yi!2iK>rK*`kiqi6?&6&EI;kLFM!cjn?&7cs2ER)Gpa1KVM{G z5BJ;t&2~on*6w{>c6^cHOx2s|GcHe@G%4ttpNw_*Ap^;@Ncjxr=bDQqEpK!3;F4q2 z+@SNI`}5_g;&FCcBWl0SObttWB{M6#W9rRarnlGZ_}Ue}iY;!bRK?Rt&qHdiubNuB zJ?h)s0~pZMiF_1#QaHyjh^L^@ZiPo~0qW*LR7uEj+QQ zr}+6fLwo!Fpe&)OcUJmslAo4pXm5X>TYt}i&*$y?-~WCRHTn6@mr|#VF6k_mJ-#Mg zQl7s(MwX}J@)VWR0ZtFRI&T?&-1q%&-JO*k_I38}u2qRNcg!#8F<-vp)5Y4e-#znt z>$m0IUX&DhFiRx$b>NoCPby`1Fs-p$v^(HK11QO9T$o{X?7GZts~G+2sm`Byvr^}0 zJ-D=DTEAn{`2K?`NV(MUa~npQOMov z&Fo!!?M|w{-j=!c;<<^lpS#PI9=~>P(eHb|PVDpEm#`@)g3B=>GHFKYx1$dWb_gHm zRbcryr+TxQc7+evmjwoy%f&bQ_(yx0G2a(F+m)YY!Jx^yZRrP@*h0vUaEUJOS!X0Or{^yo^=7PfuesWYcWP&-}YZbAlfIwkuxD@pNi<{8R1te@5%~{j*Y^Upp;raigEmBAw(3&$mo& zIjiyLRKkI+4<}fhf2qP59e5;7X7MrCUlR}9%RCjEv`Da3bJP2+u9YIK-~6i%HA;8A z-kvNo^-8X^X3OvNx7*$=eaRz`e5bKn@u>P7a8{Fgyj;aZC#^EBNOt$cw4GU3Pw)8l zHoncNVUm!gkkDFFjt?^3HrKzj2}WfvvQYIbjyZm4lghM^8`D@8`mD3N&eQJfH{b5; zqen^w22MqfH%h%<=e6|Ep+`!~&(C>yrTF~Dnim2~G@BnzkP(>X%2Tqrhx@NxbYKg^ zx;Dk^#1jgqFElI{xn|c?)ZI~Fs}$J3!>;J?-}}!!<^4C`Kl!An=Dv=iMB2=+i~Zc! zwJnsmyHq~VMb+O1R4Zy3oq19;E#>Bx$|SDI za#+LB%W=+(7e}`0%G@?uv`FMq+1Zmm**UkL{d_+E_~$*IYo8G99b zyu9oax>}{M=WXSKT`JRDtvz2HH@s`1c6ruYi)V}D`pYIQSfaASGvHg-i5+H(3@*Pl z>tAlSX}YwJ^l{z&Z|p;>nk~2-mzjpQIsdHNKYv+N^^Au{wi}vGZc?8D3ToBIB1cQ6 zz06Ymkfx(L_oZ7ydVP`gI)P+I$x>TR#|N_??L221x$Y%@GFxC%c65YSl4fxEglW#} zOlQxI*3s21d~!mtMSxvy>Ya)`Nk!66y;_$ZZqGb-c4C&VB}c}UtP015_>~iW+wBfK z@-4wZz3-;4(6vJaLH?XN-0@yHiU9@99X-KO{j2SY4%hB``T4Kf?fmb?Oe-S9`lftZ zn`eHnCz-K^<&QSk?4RnhK+ZK44DjEabE{Nm`y0!(Sr1NTJt*A%yx6eIZ;6Ru>+^_| zooZe|#s(HWoR3A$Z!OH>R^764`Vz~`S%wlk72j^Aue_Souc9TXymU#}dgI+29F|@@ z@U3=9P)lLY2A!;4wu#qrc-gibo=`SvgXr-XNxn#4=PJ)8rd88g)sO5``m|&5#Jx3_ zUOk-6>Yt=1qSEpG_un_ob@rFllz!@^ZCmny6SVrLdSAm<-J_@8i0IF^JJP+J@8g+= zm1(m@ZH_OyD<7mkJ0#Rdt7*Eo-v6)lpJxBr{{PQ!Cgb2u+%i%vg{B|gE_;5`d0wQT5zBCvnPz=a!zcCZ<{TEiK65p8H(IGDXVF%!~mv$35@4ugwlQ zRxiz2XVu#I<)59{m>eR-8?^Q%Z+nWv-kVEeRtskP+IPKh72Lg;sW{W!} z32c#JKR>4;&|LRKRnU%|ew(Jx&bBM4-BG05^&rP>$#1-7Iq)XC8gcVTtnEG^p*GEMv%F~n=i|wu3~}?aw?DDInzlCPv&`;=Tl2oP z7p}GDxcV&5|G1~xV-?x;g85H&#{G!@_vY{6ecAG#W2@EtHZ8n%>(tgbpG!6?e&nr= z`0SR3n=Vb@#?zEWZI%A1Tq1UX`Bbj}ws(owEJabM|T#`~-J2z@As2))Z ze%J5ibAZEZXUww;3!P=`3!8qnvcBqN%UkKPG;Vp=>O{-FnSah1O)^J@6ro77=$J-5QTZ}$QD1hu=|^8((T zRbTWV^U&drgEvykxs;{0Uc4UUqaNB;DZ8eBpBZmRE5q?^PWMY&L>}#Eo3(U_&dxs3 zDKVMRt7MLPX70YszeI#j;GD_o@N}uEzKSl>(kjcBUp`-bIAf($#n-F{;cbDBc5k~{ zDD(R9)wADjP5ml+>+grhW%fBGzb{VQvr_$Qf3>Tpr|E|evC>Ob3MXy6DkpH%P?vl+AJJ}sXATV{83^qaig z!mpQ9_3FL|uAZ(}__Ue7;``n5iF5fPWhOthT%CBrepl60`&;*(oj$9Uek%2u%<&r= zd+NSV-jG+I!xzO-v{t>?XuGtZNP{lR>@9d_mOsHclPD3jLBAQ zn3Vs_;F5`Qm#}fPnnQN26IZ9mvse3~z7^(h-`>XYc#6&Wlb>X+Z;P8VdtK_fe5Kci}8w{m#ng zbIX7HuK)ku*xda1#l`M{UbdU6PU>>8SFAiTCHHavn~1z`KdV&A z)90IWPIf#p=k??dzi&P~Z^8F@opx)clStqkAvH~_^Pa}OlhTfOo-#06yIS?UBZq|Bu?HKTSVl}!I$u09 zt2R+PS!8E>_RlG<^Yg5ad#~SnZ07X1q<0q-uT|UL zI;a@5=OAW!ib|hgYKgy5C#Q|D9cPs`t^x@5%mNdc5sF z=f8PZX1vy(rOv@{#*ZUG949Xy-yvri*YREH!|Ma*lVXba8QTp@`=zcgKF1QwKCv(N zs?^nlb%DBTuV^iO8g(;%o92`v?Ub2MH|VsOxPI3$mfP@H?4HhfK@Oqd^8$sFIHNh!q(o(YAB>+C#AS0_ ztt)s}bBD@VPUT{`Q=fYbyiN$Jcpf@-jIEttJ}omd^U=Yt5l2(5nCUEG(G>Jrm?M4r z`^v3RGIh@+`{vvECa1Bzv`~o>&h9OWZFzm^;w$`u-ra6}r|-_^XPT~4p8t7w%uV9iPqq)W3qDuOo6_XJNMO=(X71qUGmdo} zQS@2zk;~0x-eDJ+$E-n;=3IVEE>>TffQ&@6?Jm+N#|Iq90+L*ar*LCe1;flVE zx`C&*yfVtVEy{F!6Gu&Z)`Q0uVuh0yZCw^sv~s$URMy{ zIV7;w(Zf^1ZOyuMMy94m@7%eQvi*0mu<#DofMdp*P8?HGFV33%_{`2?o9}-Sv0}E>C%@ zvT*jYH_J5Nnk=24y5;f|mu#iAk|{Tz{C{MlercA)dEeLX?4*^B%X81DSbg_{X`ZMM zXN(lzPx0Hgo6Bb9CAOrz{b;MmTE1w-M4Ou&J_`#ug>yZ8qD~#;IF&tPmPgmi&GFK; z>l*9~LV{jRdS0=0lYQ*^DbsAO=Uq9qkE>?-r00)rab4fIL6^Jwikr1vVrt|$gRa1! zAWj=CRsQSS3S^}(JlT1yG$-b^lV<0nNd|rbO`R1Qnx4j!qr5In(K&r`tDy4rjT@&b z^$6ST*mBNq`SI4PvdgkmU#0$ckUQXZ_4yUAZk4k)a`-(i^{AW`U@DPHj+q~xt{J*EGsAc9{p06~7wH^6Dsr@1`C>tfg6vh}9L>&8 zb9SXZ^s@AvxwP_J&+A9tooq}?XOzjjns#)`;|mhC`yW*Kx@6c2PWGQw=Kne7N6@at z*S`oI(_6Y?vQ49i)29?AgVqn0K35ETGw=Eu)Q3DS-J&OOYui#?)yWHT zcbA@*-Mi$=*Zmc@gMPgG=USqu@IjU>QTBp|=1HSkXTfid6Pz~OSe2-Ga{m7Msl9jY zD(zMh z)-V2fN%h=(`}0#zPrrHRhQmDj^Vg2C-Sumq7o;-nXqCvtyzP$JZJtej!Ebb&QzRoN zDKwavzdUhiMMgfSg~a4%_6?{V^&XX7>F%GJPi=c_Ab>|ZbW zpr>J`+uA$UTdoKdul+UWz2(Z>m9I)Rf9iQ}^);^ifo#+)!OB@(HfKY2+X_h8dg|WM zWqQ0K`jgB%6}jq*-z)a6*lM|KWz>PP-R|~1k@w#QetP4X`^+&g$iO~S@$9pT?~mAK z@2*{BqI}lG>%hBre0d^`4WQxnih0NL|2@k$vbXo2_ngJ?!;x;z8OJxqtqxopVo~-+ zV)yRdJnhbQ|9&LbeK;&%^zxBwS$Ua5cGOEQg;hBJ-3&S4WWX?#En?CrdTi8CCDA`vqT`C{P(?tgPxT z)BbqhdBgLI)t)XnoO6fG=1j3(tKy6o)j5jK0ys_zdn&5<^F6-%EZv~`^z0aaaqFN{ z%2N+S$IY5OtLoX0rs78*{v@8?njMvW`n!*K=-Qy9#AOFtxmW*~=Pjfjvu8`*rMLVA zwf{A;Sob}DP|f$+I`-b)9i3}M+Mi2Dyh;f2cH)?p{;HzyXzSHjz4h-eNgm-?S*YW< z{`SE_nM)>5tMC7o+Zxpy|8r`5VruG9nfdRNZ?h}s@Xy}3b?^JxUmhGf#N^&Dm%9C~ znhf8`O+9DN`W`Y^a{1+k&6}IoitH_$z2SOtdi89bt{XRQJ-YQu%PV_MVD7O(nMo$B z=MQ@c$=qHhf4n8gs3ZB4jPnRR^aZ@yJc)}0i@ajNfd$jX-c?~UJEobfyv zc>Lj2uU661heVrH&foMDT4XalW`1Rr)x3uD3at}tEYBodir73u%AF}hdh3G=pALO7 zJ}(y?6EP$A+ES6mYqzdB1bmt?bJZpjbJxXU0#j^qycIvq;Xfa*?0xpmvC9o2YNchl zi_ey&AGms!Z}VBBsgtS`wkxu1d9_SY!7J!c%JfA0WltKA7Mz zVVR2Op#lSgvrJ9`UMJ5LoLHJCzS1;R^JjD2{PojL|B2abnaOZsi`@I;n>1c2`|Gq$ zu&EPSR`Aa#O-^N#ZfMkuT)X-=7v9{Q+WPWo+TNI4)73%Dg>x>a ze_WZC?VG*p+;Q>iH}1Wg^;g!PbL*z_Z$hTNOE_^XZ~oW0a*glrlx08otI)C_@~h>p z3o3rbR?WJLCLTl-og8R-+h1S_17PuRo-#6UqcVfX*mA6YJS?Wbw|8b zo?NuvYpK!C|0cd4wMEm!#5fjnTrc#P)KawcP=Upg`|ltBwtK4JkbSoL{a$wwSCiSk z!aF$|pI0vNblQJEJv+Pm?c3Z*Dv7zJQ@y9_U3^(`?FM^RscO z&Gm&(tZz&^TC&(_uh@fI*D_|^`EzJ*(ZVT9WPZf#+f;epwEKAHq)9(tO1-_;P`3U2 ztFq}+Z(4nlJ1fKZDMmRzdHbRzDcd5KS$EvHA-iGQT~`Ipnq<@Y%M1@U?qsTey>|YB zDN23GcHeiN4_tj!ZQ{wx0p>g7bxuF}@bIvVU5&)ruTOGo=3h2pUANpezV7E!>71X( z54W90wBw3?XE*{@Jk7^r|#(pPa4N_S;WS zP1XMMpxypSyZs-<_j^9`y?*`rNYv+h&(soU3EkZGct@Uy>%~`}J{5sNy-dFhN!=Dws-@+7k zNGA#~u{FO~xw8L_tC#2AphdUkCq37Up3B(y{@%qig*j|9(k!E9pJz{ON}hetQk*tWGVzBwPVaDF)@Zu{Z>do{w>OEb4dojG%6#_HD^ zO6QApPFEE@^PMN8b9>pvoJ$!d7L~6=*6;skW&h*f_n*)A|NjlzhLW=Tu9~ONgc=Xz*nUhZ+KW|%| z@o(y8_q+LZA7$cy|B)1XK8yd(N)b0hasB)YZ~5fD*Y4MEX?T0C;hurZ^H~SVHSR7G zjbQeiwQz}o*BQP^ld><%x-E&!Gt=)|cE7AjF>ubpDK3j|zT&z0wsrB-uq2}u7W1z3 zKboS!b8?f2CQI|d2`it8eCFofvCg{l$0wWpiJ$g7kdtuL2@Vd{(bwO+XOGV$6;M-G zg6G6%nfu?fxw*MNU0E6YA4D|Y|9kiT)3@92*WGcC+tBXhAt%RW%>SudLUE?3(~kD( zQJd%2zkKpi{Jf0ir=8+{74emCxBU2&eZHt7^Vk(zK9++|vv0q7Q}Vv*^@GVSb5eNR zKdX37dbCrlx2yj4EcaQGhfi3X?3l!J-Z1a*?!6N>ysvqf?b~;*z~adFztSyB1g2Cw zb2PsH4QdwMDL&6w@bQuBAp?=fX`J`JzgG93_vhgI|Nq|C|ES*oz537H{lClQzblHr zS?G~#E2DK_^MUIIvXQ?|TDvAW@9#39@k*pwdq zWwJ=L=dVPcS8zW>}p=XQ=JhSQtWN*kR5-tjIK>F(~X`F;ETv&H>(kNW?;=zmdS zrPQ^kYWwZKkIMIbo@@U@y8dzg5%5sS{=fPEZ}WK6oFP z8MSoFpR3pX=l?q0D@mTyNE_jgR5V{umEnC8uS$KAb>Ei4U1O-}Fq5G$QsQXOcqdMhPg z_k&SfFXq9isoFWYxxP7}d3uM$n~L&7v_!+g!y{v3Re78zKHvGNHvZ3-<@SI5_Qu`+ z+yDRZ{~v|&NeAV)6e|l<)LvDHDl5dZ?~CBuW30`6d3jv@$0Hl#e?41WoWG~$lx=lZ zYwOKpC%$}mc;PLt$0VNHK`}dbxr(U!-}UsF6kiW;@q~Jd($@b)ACq)(hzW$d-eo1|Z3i#xw zbKZZh&F?d(E}gIW81q#B-=Ej7o<8q0y1K$=U6#C9<}5=Qx0XO2sdaI;7uj>nKV_Dn zsyh3v-0in^o>@v0ey-Hors^)}(UYt>$;4gLQ{U&t+twqCf4NV4dGVge=igS%9gb6k zRA5^s84|(b3U0e?A_M z*;gaERAj1G>iwCMokHwpo}R8>{Pk66Sy`FOtYw=nzsz~_?%h8RubZZuyIB31TzjAV zn=s?Ag0_TU<-MR!Q)j-swNUx==FjJ4Vn5uk_^F~l-}+d{-cKHWkDNFbX(SqSbUbP? zIs3sT{e7Je_nXxEeZRE2ySs&%Pb_NtbaIN9YKy>=N;|Qn)1`M+6EwRPnf5Ri z9u#&^RGHs%WXJm|iT|q=)67r2K47SMRD0@y_<3{Jot2Nv3Ozq3M(qBtOP}XhZEMI~ z=`O{&B-3qq_MaZJZMUj#*Uw*9kWzBs@>iqHXSuSiW2dA}%<2u9WN@xya!;H@u%_jg zcFw&EJtH$sDyJzLDN7v4$P}CLU-a2y_L{gH@5IQi1Ld8Qr`%ImWX<9Em~rl0k?Z^( zlV;4FD{E$MzO&}1k-Gmp&`K5=+o}>JjmMlnodWWXZqkXlK35_jYMN^M;l#_^-eyfw z@#2_hn>+E_@~KW9?|S-gx>Rs&-c}}TJolf~hc&q?C$C+3>(Zl~#eeRs6#aQtf9~Ti zA62EcCQR|G+QL3N`)q>5#8k`c>vAu@Z)eC@JO9+?DcR9F=S)s)O)J~wvo(rIvry-x zf>)0Yhhw^cV6T}@pL|j8Jez+%=k@ak1+yMobgw)&=J+C^9Xy9x^6Z!F-tB53^Wc|i z)m^>ayLa#T`|b9cHETW`;@1E0s9WF2*w}exh!)FJvy{lT#}*-4Q$JS6uD>qH*B-N@ zK(SP&U876xd!kqX$H}=8`d1K5?SD%F^^C4Okc(EZ69Q~S6eIeBps^r%Gt@o#tbT_;^RS?eU5$oyyWA3AKz>~ zziG>s66aH=H?46BFmT$mZJXQn+p6b_-&V#=dcISRhfPo6*t(;v{qvnX^8DF&44hln zGY3x#@;x1N-fG(_y)$NS_4gEc{ke30&!L%QJ3?+OY$i{ zx^abfUfQRa&!=vxPJ5Oe6Lt4u#@zY$->f+3;lq~bH1Fj_r=>D^9X4|OK^$K5nsaAL zdDTk@stIPU@?gnXlYb$v{KlO-PagN%Kl}6Z^Oc_b&`lUVbl>MO-> zU!7dc{UyZxri!n91I*+%j7=fJy<3+2C-=6EM+x}GdPQGB*+`FRDt z&XW_F%&uMUcsyfu_&S9p56=I4bH3v5*Xxz<&PYz1HeGZ2>4<4xL*Ch2YUrF!Dl3~- zwDZihYhtr!&jzi_>y2Aq?#1!(c;>8iw(pX43`CrYl(~ZWD>;p&i}XI+joKPy6{q=I zdvmbq>pPp1^Y;I3+WBOY5)&KU78~A_OuGGTd6N98y9Vo| zr+TT{oEP4`d$&=SlK$yUsy^GFsJTABChVxFvUrxJ8dD|T58gA~B`f1}uZpG3UV8NA zvhSyMCfEG!eLiD;W&r1&<3T?6PZvliE>-b0jye8pFaP?F2i?OvAN^QqcQ|A1%P(zP zmU+*yxs$X@Zo(4DZK{#?U)_AZeuitv&v~+v{tMdfGzbKIlCe3i<`u-2=ugm zol8+Pa^1(8%kO@jvwr_!?)#edpFb`6KU)Tk&hi#Yq!tVcfYSwOZm6O5Kp1q!9 zVdK2>$)=r`lXu%bc;z;`-2UDI^PV#X4);@;G|3P zZajx19R2oh_Fc!y;kf_$!o9l>KRc$DzxS)y<>25SOND}igXdTjHW{a%EBNvv@YGYI zdCwnK-dpY$G9^gHvZ&?e&B%TK|GuBROmkZ5(HXMuoX=c4(xl#Se$#}C8M2D*1~1nL zGwpk^>)XVgVagWOS&?(Cww+kHn0rsvJBhPZKR0rFtTVN`z9h3PRr}Xp0mhmS7fpBV zU4Gf9PCs$VhRbh@KY4Ud_t)QSbU(qsM@@IDeC#b1sh`QV@18#@yD_bGQj>w7+Gj0u zYi(HsN67ko;KG!)M#xu{8ev*u~9Eh{f8h!wwGSn>UC`OnGrKZX0` z?a%%BV>8vO_2tXVK3QwG%{PyH|GPWR=BtWw%Yus;3AfGm#`!PLoOP^l4yR(-mTTej z+>W>TYtIi={MaaNaP*7V292c^d!xSjpYyxkJbj+^q1Dg(ieJ58at}}A^m_N$F7Cjb zhD8>No<>ttU-CO`(lOtrvADOxUpsQz=G)Q%t1I^W`=dC|errb%*L~yWX_3orzU6uO z?XdbXIi*$wdCpduo2zb2liC}ZQt4NpaYpI5?n$pxo>6>fP8R(!-j^NBU2{n%UE(Ou z;ugnrc3qXe$4+rd-m<^;>WS;soQcl=+v2v^b7jb(@3qgKJ&TBmS#mY2@Wlm1K6yKv znW2?Yi$xV#Ro1dz<(eUBMFfY4s&OhnmY0?Lu z$6KBJd|vL^iJ>1b=gG};&aUnIc&%!eOh8`Z?%V3>&!0Z$ z`}pg#`v;r$LhWlMn|(INDSbE|ezX5Sr{D}(waBz-QI^|UQ$1sDyJ=S5?NU8^;*-om zmdsfXZ-^z;!_L1z6!lp|G&0s?>sra_8Z&& z9(?oWP5&c{bMB>+kJqkXtto3=!X3ld7dfq}u58!0H*ZSz{&_T0c~8YN18wfhb1aPd zU)$9Qp4>DiCVPsB`l5ddDH3iu`Q;}!^{kyMclX`pVCg`wNvY<`w)yVTdVVu`^RHg< z{*ISvm6uMhp5o&9InD3dtBog5+zaWFl$#RaCAs?7#F>lV-{N5LI@xKNGV6ItWBy=n+r1c_~jkHkl~;3hCTFv`zMqK}vP??CtmK zq!n4Xxw(D({U7hrJAL{zXyx#lHEVpV4%wWqPGVEstfTBHbjjrD+U@rqJv!QL#p7%% z!&k0z`q#N@*RK7#|7Ujn=T3`jOo!70JyZ%re#{B_)cf@3N`0H^n#^xcE>`yGoiF%w z!p41Cy4}b^l3&c*%BsKD6e_hI*s6PHmgn@;ooao-ZGlcx zmZVs6Xa*(nPt-ro8_xD6sy~k6JCNrM=Jm>4z(tY3ezTdcc^Wv@70wvn=(;~mEZxQ%)Wo7W> zU%>|-Ki{mT!uY}HL#XD_ol{$18Xpf!n?B!mpGKeTtfyx>Q^UlT`M&?pcyGn5IX3V2 zJ&pBBRQzxjgkup3`>vvkdQ*>{K1qm*3hwRMjuv zzWsJyp6}F4`gT)qyTaic5dqEIcBl(JIBO&ZgRb&|sN4$NS$qd`j5*mU7gztDN=R zoFgQeDX~_jkK-{JHP1RA=cd6Ws_7+x>wHo z|9$i3&EeK_&!wkLdzSg|vYv|AG5ym=J5EeDbp7@$WN%Sc;kwG2)QzhCGV>l6pO;Tx z6=?Xfn|W8E;VvQB{|mF`zTYi-j?8&in7U&#Rkm}OkTeITZr(ejKQ-Fo06hWoe@p7^qjQF-E_0b*%N{#?3z-J z>y)RIohWsaQR7(YA?!PA8BcrKhOd8qem+v@viRbXpp^nFjNRScbF9nzcJ8!{xxO?+ z>tfbcwRd}x8$Z^{UoSoRxu(dl@Uzo;ozrTI4F5%NIL=x&dHdF_ruS+-pRF;FP+1%H zdM>xP-kBjD>MRS(8;NO*lb@gXKIdfetYtS}JelKbwOQu2 zlV;~yk$KsFu1*Qk&{WSfKW@0X@_E`U8OuElQzqr*J8ZYUFm0(oP-j`b!#Y!Oeft@w z+Z#Nku5Hzwaz^lwi(cfs*}Eo9inwI6Cvu*!y5cmG!xFQ43{G#D%Il;sRkG-6RPobO zQ%}AH^^0o$|GvLGYVEA5uAnn#&L!OzyL?&KYpIauq=2{r`Jy&Ts$!EB^oM z)()G-np-U{OqUOQo}pPf`?c8z(d!#O2fK?;CBuR$HFsq`rWwqE`YNp?0Q+n^S`IR{8s$y z=rQZrt~g_hRJ7N_8(ab|g--T99mN6DoTB93>ZPpgoHZr2H|+j5Nj~=-D~;#ex`l97M-uUd-rbnz2EOu*B55r!-7wLA1fuDEPq+ecRg%-rtj4oH*%z#55-K*_MKoe@Tj9e;o9Sic2aZp_W>LN6WX)=;pOU;!W=77Pon{$0=aHpY;has|?j{@b zocuJ$#`=cFnN4nU!?*PcJg|QD>dt2wiMKX|Io+VCed`;?@1}6%dEE8T)R-DGO+4MQ zCZloX%3B$n(^@ASnmsr3(yVprhczz#f8~F_YQbYMCY#&Gg1VxXruf)gKC|S0%Z!fu z_pX1h_;$2d$L9LMjk?D3r!2AR5uUij(o(WaVPg^ZlGaVRQ;b^w#T-^R&C%|B$;469 zb^mqc^TkVy)}EZU)Z;SG?QNP zxkvv0kK;?r@7J3DezCY;Z|~=G*7gzc@&A(_@aNoq=N8zKds}4pt@$=~xlWf3@kp*q zU`b)~s6D^Y?)#sQ!Jq-1%TEtHzH*V3PuFkuT}Aea$H|O0wB?Q+ygJiG?b#~d-b*o$ z4erN$T$*X6nb3E1Md11i@-8v^HaRYRvw5Q;=llouOA2qVetfH9o%32L1KZHKbJi>k ziP^EqQH0NOTSidqV|B;pv+gM@3i`%zxP?1>`^xaM4fkHTwddLITA2Mx;l$R=i=jcY z`m|L)#-v{=T5B3{NoIGDkfjjM=Z!8M(&g*5m#zpqedV?2tF1=+p8LI0XLx$x`HzdK zU(fv(zj^QNz3+wn`IomH`>ZYIH0#O~nX8pDx0SkrV{R*X8g07cvL|EnF0&7@Io`c4 zLEZlhQUs2%;O{r>Mu^^bY}IbE+_{`pg*e*W`WzvYuH`xcvaE?_dT|#m}f4?w)UzD>$A#zmIaD#^8M?xR6Qs8a7_sA<$C?v`bA8#wb;cIb&ov{ zZ4#+mw^6tCxuuDe=(6RjSXB9sZ&g=+aM0k{-Trj}{5i{{pI)q$Tf5}aES0l2@4OQ{ zs+k=fyDo2wW+k8W?O3z&DxO2lmJ=hqW;!}5T(?v`KIa4T`8hG4W0c*_9h$bO=YdD( zQWYjc!8XI{c>iQ&-*gop^ZnPROxko^Ug-GAd2T(s>z$78*S~&i$riV;&p{qGw_Q9R zyQZgYJF4gxbjZTpvr$zi=kyk>+tYsDuu)s)=#<@Yd5VVF?{{x6x;9*U5G53Sl*O;p zafShh@}w(!-c8m~m%RDA`DfHR(`FSVnQt520(~Wps(5xi-u38ED|ejC@vkPnQ?FV1 zOnM?!AXy>&Bi*Uv>c$S6lbLtUTg_Kf{Mc~nMY8Fy9Wi`1_3J|OZR&p+oSz%D?1{b2 zZsE&IQ++(Qvfck4cxsl5W_i*cN&WMiFHX{8@SUV$(dRoaTjzFC)hfHFsMK8z^H`3l zA1-?E(88>EGjCdS>9Xijsjr`0To~5nzS*#C-_h6Sb%R#_Sa!55gvD=C&)c&3W#t{Y zn%B1PirKS^`M|TX{(A~l3nq6SxWe!$=5a)qiTT76H*Ou-xYqOgWC1siCod`$(v2i4 zUw=OLf@O{7bnhMOGJSQ~m)?%sz;jrjH?3;bv3GgXpUAzod%Vu#_{IX+&*^)%`x&d9 zHr@BUr$^EE2$R%xL$SA?+A_Qz?e2^8pD?>}hRNv<$G3`mZ=9Ms`S_{w+*hLcS2U*y zs=qv9e&)_L!D%XI)n4v5IOVC5B6R3s08hK~+O2X~Yl9as*D(Cy?&;X_-E4`7&CZ&r z7MFywRpD;$!y8t;j=1+IXY;>b-ReiX)B6Ob>}mhiWU^9sv%8{i@FtzZpZDzk_p>nn zUqyTQtYs>mPV0J?ew%Io^TL+mcfrz<%Om7U@49dV3v+lqt2?*lm5!c|p>62mDBggg z{M+g0ZXM&Z@}7|&>V7ot^A2A3iN~J#%|E?*HwUBjTt)fVdn%`ktp2{(_x|>dzhTUM zrt9Q6T+*`SgE(rg9}Fr|QM$hV*V%{OQy#TVes?xv@w*j8J6m4g@G;Ha@$TQT&Zz8L za~apJv^wiHRsK!MyO;l71X`Ud&hb*dIO%ss$I^A?%u~GASw37oQ}bLjm*x(|O+raJ zCeM=ZZ)I$cnXTxd%3AkAKwVO*cM{jk-b+o}T-VK&{T|qL%uHJu6Zz zRqS}bUi+I}i#ecCWbHAetLzz{rUQFEajUvHcHwD_SofvfCvHcWNfs}^Ep`22j`zb` z(n@%Vb_kU3#%*!nIjC=EaV0944h1^-sELbN#>k1N8%}J|RILrhLp4oTU2T zdZT%RrQ(V+TVFlRuX(uUZ}|U1(<9?%R4p-WwJ_6M{xRX&-zZBDP0l8xrIXU?^18fs zx(NK>X%`HXnVkCb2*-wtD=xg`>qwe>sN#l)=87<%SI54`rlm_UoH=)8<@M7M*VeAw zGxx4sc-Z!tt1Nu3Hb?*a|5*F>mtTU{uicK>war;#cCBn?)&JNiCgqC9+OKTRpN;97 zviMhnisxoe#o8E${n4Lnj&IYkIe+wfjMP`H<9#}TYgxAcooRB~q51vJoSg0Nf7L~J zF*Vhc2tKqjbLzWPTyF8=V@=PsS(BdMyQEOC{I<;hKR-SnC_lT#-Cky<|10Zj`o|X8 z{9;k;5nSHzvGBCaUtu4Spbt|%g>awDc(IDhnvs$7p1zofA+68Ft_#<__5`-yuFa1 zqWL<4Yl(<`}y;;Kd?C!qa+~~9l{$i(TkKXA#@@4t$z^~1qdVcO3|G-OI zR;O3(FInAbadcj4yiqJ=nh5Xk}==t?yuFm=WoPV@7Fg)4!oM-=! zQ=5C^f8GqYEG_xxkRP0FoNJetDqH^TP7Rk-{M@CP#|kW14iwJ$ZGPbLte0uM`n3;P zb-XWTnV#4*N5jkG(v+JsH5X~jvpC%Mf7$oCnhPG9GcvEvoSXUJx8BnO#<9`g{;6Lu zIejDZ`%8Z3Q~yl*a(icOWhtB^q%L{=+U-A2{<4ct{MfK?3e)jT4%uGwl5g$ZdTgU; zU+P;=+q?f?hI&0d9I91mvUk-=-n)uYjF%s7+ho#xZI+|N!mqJ12P-%(ZPfU^OwLqJ zr{>DE;Kw}ECLKF*sigew7uy*eTBnPREoNq`xcSsvm%N(6($JiFTfd^K^3}GxTcku| zjz5~d|C>*q^F>V=c*lbEwXZM5e4$J6&cm{a}iLZklYiy39NZEwx}_vEw1J^S+f zTl&F=3Ou&oR_v2s^Vmc469eFO%LUMT_lw9q>tJRiphz%Sr(q@5I|&$2V%St1erfB@;C-y)f~a z@MSkAj%8AzWw&jA{e2kA*?3K=WoLX*36p&NpB)7<()YKz=P{Vu&RcAC?#93RJCe(n zWEKb%8QooHuzKD6e^dMBC(hGSv@Ff&`~T$r?@*iL&;I{Dzu$i9lAG~vpN)=9Df}A$ z|ERg%zx@B_^yRA_o)LU`gIzx7zmoB96v$ATQ`^QAMhuFaUWYV#%=>sf98TiTPiC*btY^u%hJ-IH5s3PNgcFJ7O`bY@QX^Bd2;8qbR7v}wOMe{#Fv zq?O0Z(z)bjEcfzAn-%)+{{P4OpK$BXS>bcFDPFuO{>rn~9shdu=luOq|NZ^HQ`y>| zgQpg5pHRnPrqq`$tj?J@W5c$6r?+0sJ*1)5HR)v7_P=??o#^w!MGcC%aU{ z*w|NVs!-;niK&*GjeVC)h?tgCnK@18G=E8vy+-Akb0#xp=Wf_z(fi!8yfofq!`|D; zxy94dwjMd;)4TV!%x0bCmu01@zwWkpP`G{86eiQCZ0mWs95&+RCgsWfX|grf4FxZ2 z+$|ND(HJz{Yv+-LQ!STCg-*V-tNZc!&vWAHJFd<0+IggNad$|Qb-8HO;>jE2N_X1! zO}TdO`2FHHCw007GlO?ax>qszn9oU0yq)#PH!bqmn@vI$JNi_oh%lyARDAq+XLeKb zgO#f$YH0r4{r}(k?)umNe|$f$mice`)G3>pHvT=eGgb8|$!2i~ zS3zuf%A<;U56uddmRP>ZvC=SSUixIk(c25}tuU~@yd*|1@qVg^O`Prn3$yh3wq1{J#O&Nwd3^px zw`;mVCoT#+eY}^=BuP#1kW=a;1FsLU?HZnHtJ`!{)pJkXk}BUZQ|eZN#N(N3C&f)! z^3>+~RCen{O~+3LtEz~HZ~w9SfBXLHFL)Qn^FMwv{+y1{de~&@vdY|%Y z=S3O|gT7tNFf+RyqOIC=zu1|EE2HjW94X?l)mSP7Gq&f-v7K-FE7Wrn^X$5&ZzuZad6?A>WFExMDBgQbEQh^ zYQur@mwZm@en#d!lP@j4UmaNxU=!-}>Ecx0?NUG1-h^%eQ)`rIGRBw(Hl*FIYYQacYaDM2QqQ)<$cAxQ_`$Y6COhW(!Z2-P+tBo^Rc%dANMZO`l+&lV_CNL^fZUEH%C+ZgL>bc$UC-8_f6pL^+9R#eP*Sa ztYX}JR_pD(fG_PE8D{-DmfhO4ykohiN6mwuI_LKXmfczQe&@SCA-SvG-2C+F6<_46 zi|_a}rrZ2#?lAG(=q~-{-IdGr`Wd;OeiqKTB;Vo^=p>^4=H0g!{W-_dqrOgDxhSo2 zqw99-1-GSxR{p41*PPqG{*lSwx_%R1&FQCitTW^_IX&gbiN1S(d~1WaRtBzbXj|Ma zF3IEUrF#B~JKv7)=AJ>@%6F+P6?dEB^)7bq0`u+GCA*wgsZM{o^O){(?&D#LIX}PY zGhO@f!UEH8Ri9*JPD@?2ciVk&>Ku-30!3T$pFEIj);Z1Lc9!pQu<5ep(mLn1zgzju zs4qzSX@kM8V+A|v-S1mCNs2%7U3jZ*&D)5~jFR%%Rj^b2Y8nRYFAr?c|UUhe8)^Pu=Z_||L3bG?5~3yL%Suw+ux*|TQr z*1q`0)^fPwlA)1l=+VzwldlAt-75X4aHP;{ySd6)qe&{x*%Ccs?4Fu0r#ppR-xfJ% z{-XQ*l5NWb^jmIjotV1w=EGdc=!tdv{Y6|uv{IWEIL*s`WO1-m_K?Q0QdyNp=QguN zU0yN0@NViM4KM!>?+7E4fJ8^-=rax6IMsXpgb@dlgD*IkrO<{g)WMFRH`u4_m zn+=aG#EdVOYE2cI^*Xk`difDn1^3$$$9F$m%e>;NtcsVHR-^l*w3fgmIr-zqCS8)* zZQ8}wDmll*F7a5On&E7T%{r%x&**q|I(f|VnkS|hdGJTZ+2=dwU6R@#$UA4}%U34? zO_EA$+0Spy@sGQmjN9U;-piu1R(uZp<+5Sh zK4%$q9sO-DzP7)4_bt$C!`{n_uk%atDL+e_U1Ih3;wSmm+|(n5PP^|e4dDuy<|}b* zi?uD^+B0{*ewE|7quisLLULt(@Zh-Sq3qDM}iZSF{*Ua~r?eQk{|eY|^pS=}%AO-Y7k@=9uuL zi@R8}x6~i!k$YyI({)Gtnecxj#!9K{`rt@#R?l1H zlE_rXlpWL8Xi*~-g;gQJV(s$%>-rvP?Q!M<> zh*WPrb;jrOzRNyL!guAY_Z;xsefpXoyCO@rv~^3O%bX<~i9V`VJ!F>d+0E8|yitTH zQ?sXDtK4*L{;j85Ck6Q=yF3v%R{T04JVDH+WFDKM;0(LZ#tt`&V=Zs5vHBdmRXT22 zaDn}i&$*v;(hWM!@OVwRFl$}m(_3PWCzXATS4|aqJ$rYWoa*&8`6U*G ze*{iu=>Pt)>iy)kCML$ly!(FkUjOO-|3|qbUmJT}Q}3fGarQ?Fbtb9I6$#3(Si$n8 zUGQ~uuGc*8+?6i&Y!lsXTw8m;x@PH7pUsDsUY#4=!qOA)V_oxmtI2y6g6_r(#wxs9 zb+*F(%8CLTd-LA+wm0%-D||Rn>bE!Q+0o7FFTS#coU*gt9lLH#-mG0t>o&$1+Z&a6 z)k*zWGJTGO@1(v<(Q?n6E*?CyP1Nbrl#eDHCj%cyJDlFM=Fg2!Zw|d&%zdgjf9}Bx zx3=8pQuI-@@%mspJud%Ad1~|#Pp?T!zE6L2iNjkneM-a5m)q9MAGY{g`ty?%!=_w6 zyKS~J-YmLt^R3`<&chRTzr9v=Jf>CY48wiDe&=?vi0Io&o z|5MIhv$hJYOTN3|L1zBm0~>X{=2?4vyi>0pHpPwSvB3S01yhV)zLA>zR5CLwZQ`-& zo5!CuO9iJ(w_R*>ahUhI=T%wPWp)0I+jbs4^-0IR^1031cMT5>=EN*nVe8gDpYOtye>ZcD#(+FMAtS@hXP z%@XOq6gBDWS=m#KB^s44xfuvd)RG!eJ|eIq;lIj z)@pB~n1|iI9ctIEmCwiuTX|KBhs`-HZPt!+6*mI!7k+z?7`rEHt>@&P)z`OmDkWzY z{dsXnw?DLc%C*_~rV(>yCzUVvH9z|y=Czpn$(bv;iq~qrpBK-3QiIDlbKOTar~6yg zr@j1MZRfkWNBeg6jcrN=wK1n<*EX0+|NHZa=SJzi-|hc}Jp0~T>YO!+n3Wmu=}b$F zjQX0jxtmMG_eITbdB1ax%{G_y_D9Nc+75R-ZIx_m?#O<9d&}*+p5pUMt}pz! zV$VW*NyRf;>K^QV^Np=ZfYqisa(eBDaC=t%sp^p)r)GFO(LRu~IBew{>wN_ktD=4# znKR{@)ZFYt26C1k+`2v2OYcz)6gjHaUMJnJcDriF<@2+nbC*nM zNj!4u)0=&|*VZL(Hn^RVxvw*McJ1BAjR$AXGgy_{|J+~q!#DQpH(v6b^~;Zzl>YJ2 zuBTA(FXOp3q3*i)$*1iyEq5+FdTmq8zOQTJQ|kU%*jIf|{`aK%KJ$aM{OgTwulaCl zrf8qOe!wT&OD3|W-ZnSpPngoQbEaD19D}PXHtoHA^t*5EdehkFcfadTI`Z+vf{*X! zoi{lx(X#Po%8IWk0tGh7$+x>6=qcZB_k3U(!rZ@h+uA8TdrVIIC5c`B>wjSHTRFXo zH8v}q9wo#D+-G>UWXi#dORt^zQ}T7)GdnvvCGyzTtG;5-mUS+YSgMl!`u3T#X8F|%rY$Xq zdHzo4)ca-&zZf~`ub^~VBBJ<3t3^DUh5?9$+(0t^&j+j@O|4RE!D_*`5P>v z)3-~jD$gC^)TDf)1%{b-5 zIS1Z+V+&cG>Stg4q*2~Gx#Q)7U3{wd7t8#(qNQ3@TRgMw>#JWWxd-Q-_&n#G!NXU_ z_@Z~mZnAM#=$I^WT=>c=vz^yi)}4M-(tW^ohU4AeOP^SpWT&pn-L^E>Q~T^D$p_vu zay#X1uQhA$P@m_bxUpfnfzl?HAFAiqo;TGteJ;n&-D*%-rMd39?5WiI7Aw;v|JMEJ z+^wAFrs6uygydLzK zNlNkSX|k-#UFfFPs+L;*|GRou@FNxXH_64*R0RK@|9|~|^S=uZ|NQ)HZnJ&bB$m`} z$6F82+gJ4G)jMnseEi{*&C&z*8;cfBt>$>+R>9(SGYLan#}| z+xk8KSnYoNF#7*A|8Mx4ciY_8Zkx4prqJ_c%Lq2us_~lEZM|Hx$1yD2l+_HoT&ST!&C`m(I0 zE4@zcUH-ZK+A*)gK|;4TzWCaflebkpeAnD_2}#>3^fgo?XXF=sI}><^{mreN(Pus+ zd(C=QQ}a=3y59QUvcvJ)-|VZ~zkc~Qt*5`|&)j+1eWrG}`OQ07$!VwZ{3VX6Wby^M z9yYibe*N|f+wdDq8P}NoyurP>x$OkE;r)voh&n&`eD zuCnrN70>6EtG%9dyk{}v_0T6qPY(Suz4!Ztk+|MkxgXy)Y}~zZlgM&Exkpo{`z33Z z&JJb0@b0_i{(YxrUf*}<{J%%*KZyT-6rYlqSUBm@rKsfF*LihV1=2Zh|CQByAD6m% zziai4#Lc@8N2SlLv$44FyZH8RPT}VX_c!Y*y7cUvVAC{HR=dK>LgM{|=BF%f9$HT) zJ-@EK^zvG_qn0N2t}pe!OCVos`qZ)Sgp57$TRF-~VX?AqTsk(R8LGQNwPRiU?cQ|Fw^N2I&L%xRC zUa)@K*s+M`wo#H$#k!l8Mg7)S^V1}bf!-)RW&Q5U?U=i<$usyoJ~h0&rt|;N z?)y*6|J{5q)b`M2%CmGYAOE{mi4&hn-raD1>sr~eU$R9)Hph={m-oHp?Riq6=jKZu ztGD+a)UJKWYAbO0P!Dn(ig{{kK(V&e5BfwWru6_8)Pa_B((r@=&_fzfVYbT`6%1QaXY46=si;fO=yJT~F;ddF6=e@2vXW;m* zjQz{umf4r{dZQH1&5KFM+coQ&w(6^?4OusTOws)MVBPkqo7_!5Y}9Q(sG#1Hx2D+i zwVdkzXV+(`apcHE`|VpdWx@PymCqlw^Bn&0P-GFqmbARGF8%t4uFICcHvbcD{$|t7 z`wkJB+jM`r|37R0X#Kyf`_KLV`TtY-&AWH^I+jc+{cZpCph0T!@i*=>*O{!W?9Xf6 zC9o{)k=3-IpuEDpC+y~FYgTYoTxvPOq!rY0y4Pz%lBQ*Bk?gCfmzFrx>1V8synkn@ zeTM{(vR3N+wQE7kC00)H{xPrkekA8w)62a^UvKTb8X-3&#l&~t#+}aFtrM!3AO7Yi z-B7ms__eaxZ{PA|&Qd&a@z=w%Wt@p!@3!S$e#_fAdCJ?l_w4$ocCsuH2{~m~Cvf4N zd(PJHo(pI2>HYjE-v4Ckfz!vPePA!0SEkb)b#w6(s~0{O-?>cQGWFVnYO&9omwJ|O zx|a5;u2Ap5u9qomraV!9zyEmuz1sH=IZwVQi>rOgQ~y%Grnzdb(>l|+8%{@+H~XYd z7Rh_yeeK#c2_81{U2GAPvQqySZ@PBj-LaI&zV}ukcZ{ahY*`w-R7LgtN15BF5;vJ% zl;10A!)lZ1w5Wl*@qJZLm$8@Us?>fr(;fMncj@?gUKTN&wdn7MKc-u*o!Rn=zixw9 zPgDm?x#S1<5GueWMu+FqZvVX8hX*UfHC{$0ZCWN>}et==e4nUXE(kzH9g)lZuQ z&e*(L`tsY@_3a#t?qREBY-1M7-0(5AomZXK)w=VqzQiGoNA31MHGef&|HyOWIyljp zTPAAe^Ha~*!pp-wH@(j8T-vg7nR(Z(b@ub3nxAVnUHZ5FvVo5zkI<~r`A1)7daWzJ zAN>D&&HQ7(Lt74P)Kz2&?P1=~UATEhtqOb4hXXd5PLr&+y}GXTPuk0Czt|6x?9@|B z*|oF!x%*zf-p#`%xbOKT`IhZl-|ve))3n^Z`s*|m&fRb2!q??}xW_IY8GD=Q!K+tl z^0hTnv$h_27B+kJb+Z*yyxBKNe)3C+JooCB+24uUALh+{DmD4_IYzC<;~S?&N?mOz zI=TGbjHK<;XE6PFa>Tr9y{U0<>c_3u`@HY({;xafw_-z@>4He^4Z7VX(_&&}H|$n7 zDwH|8@^NWgb>_72dGix96?Z&7bM&Wo_=~UX{H9uxlV9{`M@y^RTzmMwV?uKDr)Af- z94lTMos)UMLhpT)h|3VvZjW6DYPd0+lM0o_S1} z^2qf5=K6aZb@e~Qz7n19RbZgI=JC5_D!wnjJ6lEiEe$&K{Z93*1sQFReeODXOs*1k zx{!12#;sd>A1|}saa8ijz87EFeEhFodT0>zw#>ig$Hi1H)qahxn|E%d8uUcO-&gaz zd~%~*&aS(Rg;`U-b3Qt;Qxi39XYv!X}QfnFIcrFJfH>&yh z#4ZXd{9x-kN9EYRXA1M~++Of`j{Kh=%=`W?=9l0r-d3)p<1H{Hr{;XbnP{(1XFA#3 z`9g2zx*xl={Mn;w^M5ndGtV7+Hev4F3D5m>K84r4O(yVh*p^GCbBU3CUX{>u>)+1+AJI1byZSz0=EU1b8{^sY>tsReDmS?J2-Q9QNPL^<+ zp~8+`yF7PaPR?HKyWW0|%;Cdo=Zo2zXQb_Ql5o9}o!YYV@#F0$lLeMbzMs3l>)I^g z<9xv@uQ@zdGn#nKBY?|MGYA)m{n;nqy^iJY;XpgO^Hc75&akt&&hX zv*lIAJm*QvBD@~%S~pW;T9W+kN@bNGuS-6~4=+vIxISP~>&{Gxw>3(#XoO}?S3n_)$2e`HdpFRhrFPeOJ+$%ujFQBg?xQ_ zb?%zm+)Jl0oi9G|c}~%Tejfez|DWhCJy4t*bNg7w9);7!n_?zsPq?+{N#&1q$wv7e zlUx=TPnPR?H09_`&3{|h*ESZtYzY44v|;b%r}O`uuRk^a&xgBz;{U$9{nDW4>Yb3e zFRSL7Tr8;)yjyoBL8T^5zF*C=c$10z+OMYK+Sa=TuV4GM#ai&`q|@tb{<_w^Tz&rX z+oLhNwt4TiR_VFae(PM^`f$s_nwdLis$KPJcx|zxZ6vUyx#oC_r0C$ z(^Dg#>{L6y`Qkm^Zk4Nl9-RH|`FO_6ux5jgJ`^~#=8dGh=o<--pFDZ<@9BBNmW|#P}{=j+9j}-oii2YGAZ}Yx=y%UbV zoAGqxltaZiWxH$t{WxFeH7P63u3YARY2uyEEz4O=S5!SZy?(ypW&5kmi7HK#@@H{s zG4B1>EPYf9 z>oBdWebU8CmFJeOmaeIIC}scW;_o&2?^dOmKA8I4|5NMr^M(H&Yya`T|5NVy|Nn3P zmQP5%IqhEi-*0yRV)8GiPb+`>yY&0#{10ht$&L)p5<(3RI2}Y>I~AQ-MR_I#Twrxh zn!v;A5xBsEQ-bjjgG__O;ldd+pU2x@U!PlAI{mCy{<`wxxqmmFKYQlYyH)2-ojSAX z)jIt}yH{PhQ+>v^`t80B$`lH`!flD&Bx%Iel247{W zf0k~4*uVap(Asko+^QV}j`cLXNcP^$-um3~Ns;8IpFB&0=2fljdA?Jm+tTKK=kx8q zpBAg9U%7NDO#2f1MVIdds{Sl8@|8APjVTAW^(>zf#M&@3iu1Ky>DG7RflHVVzg_CP zYp>#RKc6ItNolLkAN{P}@tEWEr5?q@6J{)PlsW$Lj7xvs?$bwHIM3^DzWd_APBV4? zGXd+TO7eVhDYTn^ber#)o1FJ5zq74-9iWv``FHK=Gw1yp1ZFIATpM-i-m}|l+iT_J zBpd~b9$!=Yym{;HQ#YjBmc;39xcMSMqUpMRytBu_)92?M-KOJ_lyIlwy8Ok~*38dm zyt*9)F23f?*lJ}RC(EwMUnda6^(Un3sLAIu=X@^6^AzTE&;RkMdybW1@AI7!%R0M~ z)0VCJ^EduytkhY(r!j($Ii^grzRP%BEIcyy_OoxFcAeQ_wplneuHu_a{NG2#HD9^U z7bfLRivPVfzc4#>^1XzXOegyn#ysvT86#Z`F5Q!V8q*m6Bt9LR z8XEPM@$S7BeEKsEAK0-|@$&hfGlMrrEb~;He({an!uf~q6}X73t}>i&=yO@2>+#3K z@fKgYf3dhXxhqbPIIwwI=9#0OlQdKI&Ykr&P?<;hnwe?!>m!F)uII0LxGT(Srs<^| zm4gO8i#+@jrQ13arRG>!_P(}K@jP_X*fr<&qA1P6q{Oa+1_`;f+}E!j^PF1L_%Fd_ zX-tBFMB%3+CgSJjKX6~a*L&rRvQ<5=Z|wQ}&nW))J82HZA9uLLC$urHh&^Z`vTpj*o6G%*{(e&nx2~KGL?B1Rqa3ie17vz-sf*qqvzNe?%e#+ z!Y9YnI>*#XXMLX1(gkzQF9#eY%usb3G|{^XXq@)7PfWf1B2yr*AQ3P1c?LUP7*Fj|J7E zDuOjNM2jotb>~LUnAWLY^3#GR`Q}UBI|f~Uw>)2Z!6ae6`_SvwxJ^Sd?(;B^b_Kk@iX6Cc^{J2vob6t(YIW1j%#+(%w-hL~u zQhmJ4=FZB+rE^ZLVQ&>^dYEwH)h)BFUf-PWOV4*+8*^ZzuGL<~X_}EYZ#=92*Ze;C zOuA)p64z3ZzTBmLQ+}1d`pWe;@j!vV11qz|fgVd^5^`&!r^|iDih+cYRO^jtt*J9p zHcP4=7LT=<~lLeGBn#wUiLkoSvP7I@}Yo*$Q^;dA-T5BnC~etFXT{;p*) z$J5HnPH1=pc`fDRnU?yn(ymY@aTeRtqInj68+1P_^Uig+emDE-rM}}QuB1#2+wHwI zO6l?LoILZBX|;ZHXB_)}cZy(|(DBZD9rX}CSia?* zDQDMDo|`?#e+Dyen;jcwzWwLl{Jn0wFDnOjeO{inV#=osVIfwDGv}|Ic)ls7?!Vcz z)JreFWtx3GwDPZu(;|y~>stdk)(Xu1Xv_7JXJ<@Xk>>e3Z&+sbluy4eI45pK(ylnQ zF5$I4H77RYcE?;x&)atH(IvLN1{tz*oLai)Tja;m{v{!&vX{Fv zo?ab&C+60YkP}A_m87bLZ)mA|!Bm#|Wd4us_G}e58jmnPRac zw5iMUt=o%l?nerp7TYGI?)^KlcH-Zj!x_)!oa~o|5*6E~Z{|IGqwjGA^V*IJZtPRkD|kL^VD{wP zVH>MGFZX-f&yCxE9&QTax@}aLD}20gOVoyi>9&(pDi`czy=-za_3sqMX%kMTTD-N| zQ~uVB;d8ODL>r&b-g^x*Us}!0oBwnwZ`!i#FG0bJtJb!>zIA8E&QBNCUEZ4@A#{A> z#~Ajh1?|p@6D2$}%byi4(s1%}G<*E<%1z5@;oCFI*|$XHPO?Zd;E0I3`|L{R%97N{ zFPm1(STTL0PII8Zgpamwt`w_Xf4Onv%_SFen4^Ny@(uRit`!do(0g`u=H=p#UsA5# z+1~n2@YpAxV~>yI%>ACPb6L9Q#+|H*XDf_e?=Fvj>pNfN#oM&6msof_lw^*pJifW7 zta7IO-n~Z>eq8)guvTL22b<{$A_6UfP7S%4?MDrIPNdbu9A6Z1X7jFXt&byAJe`h} zYfdkkvCMO8kiz7T875X4vtP+fOTCcsz2f!V**V*Hc^pJD zec!n34<Y?!qlVFE z#T+jvO#gc2iHqltd6TDQtE_Zncp5aX*vUIjh3nH#ouhSqNs6bf-``X46SA5salMq| zaEAg%`L+9dpE^#oV*a&nwc4xHOj*bMj}<038JLGY{HFIkh3tsP9G4kr~rYUW%IiPhrRF=jmsHzSy?c=s7RHe7Nw-8^5J738l5%mrYiL zbe%cx8?;trLvHukwPHW#^ruGp_=gtect>;G7V}cI=v&%kAZB0poNasfc8)_5htC>s zH#n+cICJK_Ewab`+!i}*j-AIc={Os|@dS>9)8%iw17+;jPB~=Mt9<$AP5zquM@!#q znNsxp`FDf8=a2stI6UD>mTJhNjztpZiw%}Mxw-uOrL1zx*XNDQgO>;C3A72SKU+R? z&WaEBes|AUHgnp6tH*Z<%c)ONQRGp2^_8nF@zUGg6KSx0zc+ToQfO zn=iQgQh8}Y@#@ax=r!x|1(#W8YqHLJz2c#UKys3+;rye8IX7Q^`LfrN$?Co1gws_q zR@VNDuO=JtY|v?bdR4bb^8MkaIi4IJ1r*P2StHuGP!*tNT0(AY0HkiU0S+qd6vX7N3+L<(}i4p4l8gdr!9Z|^dqXer|rU0heWI(Lw{$$nAM|_PkwSJjp$O z`4<-X&UQ%;o(FT1XU;cVGAEGhZOd~@e&3kmCcbIuudOq8dEEW+WetJ5T%w4uyWz)-^75Ysztoh@axKzO zn*Gthm-+U#71zDK{ATt!tuXtn!lmptyY!Z2CP}14*f z@8y->Z*i^v_rtd9r_N>JRG-rx_A*ZT)7n(#o1aXnVLRMlaAke@$3L9gq;s>bD!ujV z58J)kc)Gr6At;ziHL&Jfg(vGUv+ zbYt_D7Y#`>Cixsw=t?@Iami7!OGC6Mrt-g-u(0S7ft=j!8X`p&eMbuu+iuX-bpO&^RI4+&Fne;tZcH+G3D7GI~KRBJgK$sy-lJwI%lQ@Gd-B0(y&OSri(DjR}RX((A z{CeX-BI_ic4<-d+ntET@8&f5Wa*uVjZ~Ob=8(YlojYpoiNH)ay+3%R^*Po>5F2MF< zUhxy|GZFte6?jBHf4)3pS!bqXOX7(qF0B_eo;+JC+H#?J>eHgeqeri{mpn}{kjT95 zd0v%AdDmXMWs&ZuRF?jJ#d}EhT62k55!E^b+ zpPQ97*AH&@>+9RW`O2XJG%p(#ouQqy9Jje}I>Mhq-vTWoc4d-um<3%4Q!7FmE?E+h$pt^(~@&)wEQjK<$UsdTYzv z=SIvB3*vgDvFzrn7m6E7qAYeUuB_Q}-OsBr(Q8xW+};e<$f=v|z2i}+F8|ZE@G7&+ z@oP)Pjz9d9Y1_Qv?wh3BV)0c^g%0QMQDo~pxw~7p>4R?Fzy3WAdavt`baLsOUKXNDc){fNKDVz1C7Bvy^dXMkycpQ{7>P) z=_iqU_WJINczX2tyhSlu_X_{FC`82GzvIF_fyMT&UEVJHgUUVa8?&kpxF+11uxXiy zCByyV8S~e?d2>XbZHdU8sF-96nTh99ca$Y_9^bZN3iq9;n5%8>{0lj?S)LTn+xBg% z&aJt6fB#J|=vZ;JOXL$M0;|v1TzWd!c@ob}eVNt_pf`Wv@N+Vg|*fv zgJFYC@Q!tBi+1u9%Dlg@YqE=>1kcGd8=c!KeL^zFootkPza2hyPvOZJmJvyoCCMc=9R3>iT6Eh;kje$7RP#nM^|PR>*TxpoPADV}T;CVS(ggWNs2XEzL| zX&yA#pp#p)^TWtL05T%$@b~j#~8@uvb+_8`AwO!Z7Jb2T| zxo2%d&bkAqUa{S;PoMhsTf@v%-p96Th;Dkasm`nC#(hKkRjO+qx9Az(du?^+x71g5 zWi#pAX<=rOH!~)j|0PmnXFh#9=alBFjhzv1zBt=)70PVhvq>x`*IdMaVcMnt^Bx!; zC}bDnoWdCH^)g~vV2RG;Dph~I$97*7jND|7=j3ny5Ys+;&7&SxCT-T(a{n!NIt8N4 zVo%*QI#qbUWa*j^u8+af{f_^QyKmsz{4+#+)$P~zKcr;@w&h;T`!2!b7WH#RfBcH? zyC>Y$A%PE_6ohClM?Ren#^}NETuYCP{rmvhX6Cx6zm1b#aesJYa&9fR+ENtBN zD+9Q;N#)jkxfVL@`Zmr(9R@ua<-c5#rp=r@{lpV4A3vV}P4V}VF86j}ARo3@=J{nk*@371)`jdHj#d&l7*$--&x^vK*pWNV0#}IpITTs zdFfT%dHYMcqLzNBNRdsxn)FeD_v>TlIVv$bw;kb+tM7N)-L9y*_aDRg&zAKsE%ogF z%FOifn`~g`CaT2Ybg$+&*ZR8u$D;?YFMp+?fymtejbWqDw}us#)-EUVNx`rDCx6)Be^Vmc@d9!`c%p zx_nM&JbBEVFvFvOE3gnJ+5W*WFL3E$%*e+q)(3 zP;mP5f@3`glofnbyb7QGjqW{m%1YeNSA6r)rVrefXR0OQR6U*6-%Kkm?95y2Dswc* z!KnOY%yJvsK&xBa6$VEN5AolxnZLgNz3w8Hf=^!}7r9K*pHlg;HGSsnxd*qLsg1v{ zz*G7A)9;wQ8*jwMMZR6ke6n=Q)pwJ3JxOkQ%%@_QFtcsVvzqc(S8{rj&eh+z{vcV< zRj^QI^R8{Zxsf8>k=L$okG!8_U~kRow4f{{q))tUp|{7|GXBE`E2ezX(OV~b|F?Ii zh*Nci$mb{Ak^wTcD}yvUeqAY+TW@20o`2HBh}dY+ZgZCTwJ$AC)g3agw@BG-`k?nU zZ<}LFw&x;?v_(-#S&P4n>h16RvSl`#cV#N>y6x)~ThqgfN0l{D z;!^gui2aqb^OBDzMXGs)?(R(snYGHkNOhe8N9Es7zWcr(D=k{;c`km(kwbrM<~^Tu z{`m)6e|zTNdzUdu^@`>1tDUL+K6dZbtkPL8+^YN49iMDGRLDNb$l$frwKG0@pXmF9 z8U)Xs=Pv7|xovy2kN;JVq@$lssqK3|>GaPp)yz7lZLYQbo_m~aTXL}8Q%8bNYVVw1z7fYKFI_3|NO9|;^Xc>EiRVWP&aImsS3UVMcd1YCr@Pnhr7yO8 z@O5=`$A)H2(fpIqXMC?)7)Gb(?V85tY`_@1s7h0Y{A_JeYXpMo{uv6hFS#=BhNHyAoYKBh z3BxWWnd51j;tqa~JyW9h@J88XEvFR|sx+P7wSLaY*;=5J+gOvd&CTrb=eyVQH*C7- z7GY-e^75T~%Wm&JdUk2)xw&&5zB!qh^^~bilYa}pT%VKKwQWiZh0bsLs=Rbc(v{bn zw{AJL;rj89TiQKD+|XsvZ^j~d1u{$c8kESr%O{yAOG5_!s8~nfOSvXJo(C|;~d8& zJ=7YwojP_UNAGMmRQ$I}Ri3wW~XK^vm{XPneNW zyLNJ$i0N^&xq$*g>L-=&X6%=qq_Xht%a6yR!)M;md2C^J_Z`D+vz6CR9a$OjQ!(k! zm%1lr@m?n{Pxmw8a>~0O=e+XqWVNoxDqEGdop^3E>zj7p&v{y{dHdfAw)wDd2ruc) zK5A3?a7x^l`!Yi6T>8A%JWQx;v!5mq;x_xeI!dF4;z=^j&@ zjv6}6U~ycsb++7|GoLr=D=bOKTC`@b)}+U?w}g8=T;3M*c+#{9{0lwTh;*<_`1M|k z$=OM$p=+bg^yl-foOe!mIQM(rrJQXyUd^;AeP?sjY1-@UVLP|(aTIXd^XHDGSla8~ zx1P*sb5xvu(16!$mhH0Du08y7_KQ54SH8iXYvpt7sk@@?h&TH)+)X^de=l~)#h1alDJw*a zeWq;kId>)Iv`LTi-d?6_=Cf;_x4-{%?y9TQS-#$|>Ai2wZszoLp42=SS26AUzCTRC z!lr*`);V;)-0ShEqu`2aC-c^=JMC^oMVFL(TlQ=7@*v{~uj1^N7>_ zVBtdxCQr7t-=YPbDz>FoIB`6>vf*W+yO26hJ7Zt+<%}(oeN5M`ZCi2uw8b{p?YHf# z#DZtBu34Kq`Q(os>kb!K*v$LvFXVIi#>A5S{h8kuH+q##%?e%fKey`F`#_GcX)$J} zkA7Z0W6lbp9%d*KEbUR4qMlw3z$iTj}kK z<>Op8T|0ZW%*c;*sj^*DQfYLR8QHap|lwY)_5$Ip=%(*zwH_?;}55xqtD@ z>VpOkzMWFb-(TJxUSHFC^=od6iHCv4wAW|Oo-O=%D6;NTf6c^|owp|5nPnkm^eR`F z?^f2&YhNoWb7vcL87{e__w27Ue=hSU7XF^c94ev@WF|~>vhaE+@$$f}#m6SwYfK3$ zsb*dm7oS+Q>)fYTYBPJ>mtS6f`E9VKc=@T*yR$a`nlIBil-+3ZE-lG5Yt#V$qAg_7#@AgPKe|h!&{=4|NOp9fi5yn>!#qt|=B;~Ei zD^4zz)?}5uer%(T&h14;#-0n~?wslXYBf~)E z%j&bW4J-qnKl*7LV^KaUYU`iE_m%t2n^m|xCv{jz3G!Kg+09$|_nFtTS7)zU1fH6) zZhD@FX4v8%oo`P(?t09jQd$ybB;vHAaMFyZYqx7ER3|7qh`7a6zGs_zuVKymN0oZg z(!6QQU$2a*bdt!@=Q&?|`M!`6kMq=TVsbB%JT!y<=P+ybofG=eydhWk_{N}_A{!TX z{V7;@$<_X>-y_9a=kMH|X{*?Iz^GjMd|UU4GXZnUe!LRr*|nE({oc~v`+tvROSC=t zJb!1!d4-uDV?XYkKJU}BH1(_e_bcLa^UW8%NpLw>Z1<(7HSkRD)U_{;otkFCqbaWD zm6f+?l8;YFO6e-SQ^CSB*r%2V3bYxnetla%V*4%rB?=~K| zJ?-SlotzU-S0oiyI;+kt%W-E66j-)W!y~gpK=8Cr+K;L0=S*4ZbZp}i9^=US=bmjo zbUKw^&ZS}PTfY2#)y=2F^EdCixx`#T&{c3+>Vw~Q-0FUXzur{p#aWy_b7jf5EK4O> zqp3%DtfW_{q+Q83dX=|u(gc^yrc)C=e!Uf(zFznD|HJnGnthf|d2RD!x81?R2LjoJ z#4T8#@M?Moap}L_eTy~lW9KQ4V**YBu7caAU;9wg|FxH``Cv!yS+(1}W;fUP@3%kl zJvQpC-n`ch0!94k-w%i%{Ve0B=d*e1)g?Dy2*`ijvV4lr`K=#g-1(L4lDN(_=;dlI zHJ+?;L72;vW!kpSe+^h}u&Vjn9#5Zo@cRCrvQcy8^5gb7O1SO$awjsEqm)17bfs78 z8bQ`Z!#5?8-`K0pd3c>#YSWf0S-kPowN)Eg^yDpwN?pbuJ`0e$+XAScntSG$FsM3GVL+0>=RA(>a$yI5q{dY|1 z3+js7ethfe({n6skH31Q=ERYwzxLwGFP61g)7GvPQ}_4juTOmw%*)QBwk)&Y*ApJ? z)wAzdvF%-}aBCi-(2R|B28j`>o2z;hir3y{Tk|?O&64AEA9e--but&-(Q1 zsdUA|~Wh3ob*Rlb2qJ z#s7a7os+ZOV9AoOvyUy!yk^AIyo!8vnfppsXv}p>F{gNwSAwjyj}jat-mp#lxHWRd z%FgNYERR-S55LuYIy!NZ#`9l~CO3XNF6u7p;m2^3T>r7%{=j!xzccybYyO)0Tz;^!nEQ8C zwC|b;DaLYZv%O8CVwc@v&(1jRd8lmj;a_RpZ?7D@Y{ILxRAyarvc#mG_nS5pGzCAO zuR2>_nMZlNGM(GsrUF{^|@aKA}kICN8G=$ zxOXg$IU8#deOlD%M%$Eixl$5s-@3|liqjW;pWGMStu4Z3$)nl1sKaY#L+VT)|EmT( z%_^Q9iz;GP+daryQ@rP(K|*Qn>j;xGEdpC^$1)iGduW!`&!WZR^EX|lVN39;4|nx; zGG!LO`t$kAFXeszdh;*jl>fX{eotlo*O{~L$@_+_zNWoMBW?4=q^w5|8dD5p3X3zF zx39aCvihQ<*TJ2WjptYzddnQuagS!{RGCtF=8nkCBvaK5vgeOEsR|Z~2=Lr)Im}mB zq0Sr2kx}|9X5X$Or>cT^+YWM7aeO?f@F=-wF_((a+}=5?Q!*taPn)cXId;@Qr7!it z&TGq+IvV1Z-CC>X&5^ZL$rE&nM4>4R}Z|Xj@At%j0Zo!XhsZ9z?uD<=e zSAKtc>P(+&UgaKrH6kqn5z9QcPPzU`lYNK2m*%wV+kQTr{eJVNdkGd?1-Y|>?7Y_o zJ=nT^-N$3Qw|8vR2wQHkw_sN5&!5WjEqfo^G^%uRw&yn0bz4Z)daQHTysON4sN?I} zuq`__?c^hci!Q$uVp(|V z*ScFbGCXb@bv|ynx>fhtbG1M(`wp+d`&@^-G@A^TL}?Z!CC*yAR;)R(;Dt%T(gWXP zLl#X4%E~WOl#_qd;;ewl-S}MPOA7huXp1LS#<%gN!`wsN)`|i7IuGs8e zv;R-b_nln2`STpxmA_-QdO6NcuXUMYz~i|#C?R>ZtHjaoN@_J3CjvB&u3gGo_y6|# z;-7zA*%mY0HaeMRGi$Eg>e;epvzRxv8W|fK&xx4v_|Z?}l+81f_wOk*xn!*T@WZ-U z`O7jN+z@L{6e!(wxJCV+a=&d~mMMROomFh9@8J`c(>gOHJTy1@JQkd3ZV?B%uFm4g zv$tFG)E-Yfomx~>nS?U-Bh}lWC2Pi}Hj%wbk_uP8@#oEfc-^V_j`(1pcNU=rVS#JNi&$Q=Pcb$pNN&9R$KQI5l@ijA(-rt{O@$lH&(tW=d zm+!19ZoRENJ11v*hw#xiUsNUsUyj%*6I>iT$GW&EeZ_?u3F)n0n8n+bV>9-8KNCI9 z=_n!C5-6kI`LR&^38!4G%+=+-45|v;6;1&qI>E+~OAeUzUtIr4usO)fWZUhT+2+^x zTT8H+PO++f^@L|}pvU5yj+zCs(jUs^9X9B(yY|@GtMR$jnsvEFufIuoPI^$ucQ~tda=7)YLl9t zT~mAdi|78IZ{K%p+~T#~{>k0d+aqu1e7LG_IhwrE=ZjGyNNWDGBvbO8yPRn!iY`b6Y@bSAcW8SO3w?pW-#^g&Nk!@1wKtF8)dHa2ZiIJC{z>aN}4gBkI5>TQZ2ZKkKK_TC$o zB+|mew%FOe>hJ^+uE=F-tDk(9%sE}f!)g)yvT~|JlEZ~-@&6>EHV8CDt#w-)_V~$5 zW1FvMKJWSUYIV%MKYG*G$2|SM@2AxEaI=bEe>k5l%l7e~qA9wms#u|A*}r#t{?Gfc z`buBwX0N#-`th+(zVH8GBo&lLarQ@Kn{{e#VP70-g4-wW9%%)RW9 z;SAef{2Z=KKG~-mA)=x%I4>@KvU%L484rr#o+Qrm1PC)P&zQGv8hEoB5DI zk^xW0Ba5lLlT@@08tKlut9ai2zs>yfqM2LTQ;aP2;w)CD-u<3p)z35~$i=b0;EM8# z?e8ix`f?|JjTN}@)hqGauSdU9O&pIWgttB5lv9=oRVci;RQIq!$~}W67p2)G+8izC zAN(g0SZ~kgIqAgKuWy%Je5F<>a_Z>q?3P5Am2=b|SFc%@TevdDLA5Jz!Re5=UB6}6 zpB64K&=tPD&7!(WOj9*cV%dHBJErLpEGE&hHSwo=y8A!gu6VNWSg|?Zk=g^^vp@X) z8Qc24dX9DVte-n0#r)PH%GPcwFvk6S5>#E%Sw4=a%=s zMOy?a=ABNDubTIACFj4R@^#&(-|y?6uOF~JRKQ{V^`jedK^LsvI`qXRE0q8Crj0q$ zx63r9d#7xU^g7Bk)r<3Z;e?=~qQrNCZ?&~TgeI$SYVk>amC`7Ezr=~-V9DMiKZ7sd ziM#pjv*rEQ{LNe|)#UxZ&FGiy)0&{MKxgTR-P_*IZaZS6;^*~y>zcz~U;kX9(3f1b zS8-cz(cfc6KWoG^Rhb;unmq1(3K zZWr=!;1;%8=est_MfH|!tk=(qGZXJ{Yo!+SdPlRjOqulaX6C;y^Z&4}yC0EKTFZRC zbmpuz%kvkXp8WS9!|`n&ZTQcZUi!_mE%)J$bM0F;$emSKRD197m7fNEZbuF##NV9s z-ZI9<__Xxw(|XZ<*wSQeHykaG|u*Os>uH@a^fi3sdL_@bY5|~ z-z1IJhDLxf%1DQ$@bwroYmo0vC%* zZJ`Gj_{zNTf0}Y8YWL19p1UurKek>F8U4J``vCvV&_i`i#~Iv3J+>{&K6~roAzmxPRxh@iJI`ZM%g>#hR&(tRCmu*J_;uk|io_(9z>0Z? z@7!VedvC(ov(FaF^e0NC)bO)w2)8i(1oXZ#-WlO?Nv=M)aYeQ7oBif3o9;d6EzcKnU#yihAMSpBOIFV&i z{crvMHSe?SYs3{lOub}x?~qVMU+dqD_i^%?M+$vb-}UvmJfSVI1H2_*_CtdOVcLdL zY}O$O7g8tt9AjnNd#~Z4#)6x#YzoX4tu|E;h_NaQv@{b>*Z$W(`r{zN)B)=28=nT#Vhi)s91x$3ue&d+!OHHp(=! zUb80eQcl^6@9ZYGW1AH2tTcD_axTq{S__)|6K>((w^G_XAU0yjeXk{?@`Ee>o* zzWtR~|R=X`K`}RQBs@b>;LLs|6v8nmzWf^j$q^h6>;JxxGCPEzSJr z&re?zW%O$6rRV=|`0xJ|Jo#%7-wvKVZRh+zD=}HxEDSztGx6H#g{%HA$ta~odTGdcky}LD2(nGPlO?dWNz1PyW*R0FE z{F*oD_>pEuFUOTL4u7}RIsN3yNlCR=PyHkEpEL`+IJ@z}K^N788@tkzcJyylJEQ2J z>f$)xvAVb5f|BQ=-_vX_<(N&6F>}_Nz3}Ec?#m`x(=z$;b@OZNc^03xDfFpXQ}9B& zO5*69xZCq2*&fb(sBz_Nq+-V-iOdt~SMIYn1a%qkWS0Nhvb(lP;YgXzth0R0i3g6Q zF)OlcOTCy=Cdt#La`IqvN2XN8I%l)j!CFse%v`r{%Asv`3vZr~(E6$xxbd4_U?-o3 z^|J8!NgNZ?RGH^?su+HsZ^0pRTy^%@f`4b`M9f&5EY-FqylZ`k*Ut4!m-&C2%zyB& z;D!Iu`9BxyZ{Bv*&R(WfwB>+_N@tMu;g0_8Q;scee3;;|dZ~Bp;Y0@!)jLr!57%yA zU-{ZR`6&e;_E?u+# zvo`!~mF0i&oXbB>1_}tObBS2=9WB}Fp!YfB7GKRAnWKx<0vAqMboJGyomW#*OPgnJ z54)MSB{KGQQt|4}_m*33+eW>8*C;xjH`vJB+Hq^lf$y=Oe)1G=F0DCV`()kmiHE*y z;hR1|Q}jo0$-86?*F{N(5~pjtFn*Og>B#T-N%GDdjk&ii`WBboy7151eEPM>$opc` zGW`~Am>#zM9^*CnZ<+Q7{}rr=UbCm{>t~tMbHW`az2cHwrtUqbK*-fFQN&oL z=aSsXgZ-{vjhVBqXt}yMcKAFEuq*Xodb>#D?3KWe!DYNbJEv>B5ahXKowN4$(H}P@ zrbmCTdOF9_@My8P|Ho&$%>|vNq^W7ue>wK(7Jp;@M;D`~6OS*n6HHHgZF1{xr$JYG zvw;)GiC=n?r#7wYjC!__Mey*1@-ty6MtXn$yhJAOJ*>iCmj(9(d zr_*a|gInU1S$vKH$8Jn(e10QhS>yXCi*2nA*K3!GsBHXoLZSG|1^$)if`0vd*l5hI z*fNbZoa_Gev)>kFCfpXgwp?$*l4$v(jZdD+*K6DjaR&{N6?lkzd2c=8g^o-9y<^)h zR@={CmRj`gipgi=(tRIaMJsU}7Oy@3^YPz<8q789vCpcU*y~&hSFAqt@}|`LdogGG zn+$HtvsrBORD2zH=J$4qLv{-=-7oG~G^5VyaFPe}Ws?A|n*V{}dlH!$|mUrSoTs7xYMOru%3uI=;=zZ2qyS?1D!^N1bWT61UZ=&Q`JF1dSQbH`(r>sy24v$;>3%$&b= z^R9afuFGF~$;+YicW=;6hpj;eOjP@lS9@vR=00TcEoODXOg2Y}&W8pH9LmaF!rNxW zvTWFSb(uZKjl3P^TelHX7~R+ zOkMT#&(enmJN9kaRVpd#6IP)#^OMJ;0OphXKhFQR$zs1jWOxE|#Inv*sTs>`ww0bR zPze-yY#}!9xq)S1T4}Acv)8g^StqZAL_Xn?OuQ}Tr8;BTRG$#;L)&~4Z;Q2wa5PSE z`r*Viw{P{`O%ny0EIc`!b^k81-R^vE_r^op>p$pipJo;rcYE1&d7+lwhof58l&`t| zP~n1P$FybZr*Nkj$<6HP_L}4$-(0I7a;UbGqdrK1MXR&ZE!OQXTcL^5(TBDB&)n#% zd=p))|EuC!`Ol;Ct0d2t{&+Y$y!dF%vz_;UAIrAiQhn#N{hnmj~$m?tX7| zwKHpD#p7?ctl#?mXY&_nl=qY=Qzbn=` zOSnEMw)+{wcG^T^YSA1k)8jKIPkv(5cW%NZwcSDO;TtCgJ=!UDHK=c8RcFn)!&`V3 zSt$01zP;Db>((Au@3P!HMI^(h=_ljvJME2zXC)7OkJ+@7r+BmQk9pm1Z%pxSZLjO$ z7rk_i@yM6ULf4nG7h0s;xT_+uC6N6^FGJ?eE62Y7J+e*r$Z;JuCyq_~yq8~3PhPFs zWH8GmA$Ir9UuIFwuQ}xmWug==a`#po+t#z6agheY{jHi$Yr1|eKI?I;PTlyj=&$C6 z&Z^F;wH@zwpE-AB#$2t3GL!xH2sFi9ODuChtFk&$2-@o$-n&SORC-L>(|Vq z&!+9J=FPBwll_II{Luxb&LD}PuKC-1Kl>l?d}FoEbM2J$RbeWRt=f$)s4u3DSOk^0`gT`9u*n zlW5zv#SLNk9=oj*L|Rx9&lp_zmC~lzzvau)Sl+J-mcFl^;$`{vupaBvAi3K{nj)K0 zHrwrcUbD+Px{W!^&v;wO#?OiJ7cV+xN>0&`xRAeAsP~u3?>D_Y^Zg~JH}ftrIgzqS zKKjxxg_`rOjHk1szpy#mzux_5uk`6&70+oG%kKGq=y+h@9nGrwWWH#VzC@de*G``F z=dXQ2x!J>h|6P#NnJLv_`&n{X=7U{gMqiK3TQhye9F1U|w3XAicl3R|pnhqo$c{eO zwR4^y$(ie&o^ELveY`MdTkx}R2{)d@9f1;;U-D;`vh%nr7EVf#Fj8fZdDm&NZSKBp zj(X37SBk8h!Y%SS^3zYApD}E=x2*`{`o5Q;=8=M~Zm*Jxb;tvMgAgHMzFR!j(ky?~ zJWXzG_o)#%eruzJ>MD!A?$=g7>YnYhKkUSzbyUVtV&l%cf~_^nBv>wv6KZo;3Rz^LNc}X@zyimPVXNic));B$w%tw)}OnkF zI;6aE(VS~Cp~gru#!FQt(7_RHL}bkxbDPs9o6M(Q+s=0Q0Nb`DQ<~css(fTAe-yyvsrOjO?c;OZ(?7a{I%*7` z7njvFMQMINuwHlRG)>2s?dG#DK2^NFbz)G#!#_-ug;Uegv#z{Wjd^}h{LbMPzP3;2 z_G`NyE1x-6$JjV@VaS=lGwB|aS{@oWa1`WlFWsV3Kc{M!%?g{&DU*DTDfcCBlI+h~ z>LH|l=DdI6Otq&$^RkvooIQ6%Q>^$<>0AFtQI+)qDq>$ zcbM_v2JZ{`6OQ~|e7h~sr`|v%&?{PeiCfvv8ouL|8!oNLo#}J!^h%?)RlXtJo28?5 zS6_X}xim!j?e~8y{DSRHjxWEoO`Gy4k}>r1geS&wKhHF;cJQ`bcH)&>2SZV0?uHP( z=O>;Q&#^M>eEs5bg-E&D%G8xkkJ&wq1Jr^~lJZN`1*S z*AH&=DUu9lzs&A3NhM-gXKwV4b-qhu4jAyrUP*h!(XmWzwXOZ*r}8fwrzbZ`m_Pnv z|9GEXe(&1yUjKQgc6KRGxn#D>Q%2zZW_=}=9yi6=(YY*5IoB>XuW<^}U`g3@lYNP0ayOQHisjEvGWf< zG7@VQQ1`uTuw}#i#^(|3N*65Nb#o|cJTabQWqCA1#K<^yX`H^2{3MS@e-rXQ81OV( z^p%SQ9QXa1e(wC^8)Ea)n}cHZ?sF1Re^N8O=9>5H$NX$d6*!!-t_p3-ope6^W6ks+ zP5+%!4wueZ_S}-qtM=CC39%ZiN34E(EV@!>&h&Y5X=lp>mqG`VSHe8Ecy>pBH>}Zk z@wIKw_kTj$asxG=2RU1Nu8nhF`Yen8*7MD}lQ*j`f63dXvGmp4dmoQLtwK-C z1F;Xv547g5ds*HXcl@~dY4&Fgk_lofm|{yNyj@^=dfTP?^2TS0G3yU=sZ0*)Smltg zBqZjvjl|uuH3C{J9VOuzk!ss=Cw+`vrmn4_c;fjV_q+xEUY?UwtS9dY6j59%HeriS z_VI4TzGR-mcM`WADeQU7G0)2U_?eWME2}yKK_^65dGSiL3QC?|7>%;fW_0#0s6lk~)#Y$m>AE2~!UnjYHfF;}ShZqRjgwx}sVM<>pc ze7T*Y{r7q?PR76gCM=z*%j3Lh-^Bw4Do=wZ8uaYky2EYZgrnPhYW^Sm(@}H&;nMW; z0eUGXQ~w&zd%ou1ulM_I^*yrS_F2$;GW&(=r^$TmGg!D@95CRt;ohUua$@$fOi?b@ z^%KrpIvQ-6y2xIlFE7VjDtD@iZHd57vk%S-zALa7Ni@1JrB4a6RNV4m;atC|@;_Kx zFZ6E|kqCNca#{PS&9dA{XLt0+2sFlOawMo1H0b5eT-KR6%lc4h@^p)(2MT4{4hv38 z4bXgA`SfS8#kQmQ{}1->C@SrIsF7lE>FkeAuX#mw#RY~ZOjbNCn)&gM$D>NVqfTK` zZEFfnY_jY(E!**INmFlT*pJR&Mllsn525y!X0wL{|C6Qu{u4ND6d84M(S3PE)h|`f zz6z3VueQqX*WMI4f3o^A&FP=+IPSJl$T|J!%*o8GsZE7xiLW-#OD_HY@c);s^JEsXTsu9VL*vp>eO{GAKMt77pFRJ$cAkRgBJYYzTNszVEqTA`g|>rg z*F%kz+RaCwg-HiwhKBt2TYg)7{r<0Z`ui&c8Lk)e`Fb5P`LgWw)92@R?mhTn_1kv| zKcxRZs?J|w8pNwddJ5P zOrDY-cr-uAL|bh8_PjzMzf9Bg>7`=XO_I}3b_yL$@(VpxS$JXQl*I=uBxWoF}5^gA!jp5vnFws?YyXGGl1Mc)PgnR`w$ zkm$)UDV=%7h~NIEZ|S!`>ubKfod3S$_s#YDe_e}yp|FV|hv{}rQP0Mh5{92T0aJtK ztqWb9zHGUg-+4d(C(G4d&xx7w^wCe_JwN_j_VK%7f5_frFQn0tS z4n3E?`Tp;Zv)}(|7N1`qRr_t}^PlVgzq`MGJ#+O1Ywe4fq32C_1dn$1TxR?D_sz6& z`-aSX7p|Pc2TF5ST}|@xKHJ@HE4}IZ--4Vo$&ugA>2P$IB)s@EG4s{e$~zJA+VkrQ zE?hF;iMg)WC+rg(-+Y<-@|xVz#pUKPUsE^wXz!yjb(@z^Kw?(HWGgkbiF_*a8IHRssziDED6Fg-@&3`Cj|JV%q0_ z)8i^%X&*RtJ-+s}?Sj^Q#dh<1940Z^^`CPqTKD?u{9Psg?wtHN)B9`GQLCK>r-Q}M zfBcj_Z)u25!i;CJo9rEThCJ#2_hkCZlHGq^9M8Y}_UkI~^Yed}+yDN=J^O$E|LgU? zZ}0!-|4;D$!~Os37Z`p2vycCsWB4;6E9IArNg{1VUBW)j_rf!?*SuA3J>nsLYa>hT z(mBh+bZx#c9^N?r(7N?aaW*=qkC^D@L~Born%0^dZO!QXU%fod%MJKv4=h+Eb9N>lsgkNUF5R0Bh%yk&*gr#E5kHHE=+!Z{YT1~8B-e1 zGo~|W&pzu{_peyL_M`Fn*s5Qr<123ddbz%CV*Ib^b<^hm={z62cFNb{zlN$uvbLTH z-}fW(+xx0|D%fUs{&3lxzs#I`(?QOuxDPzh$a_ zcRv1f{hr&Oz4!goHRh#%IQ98?=OPPpiMH3TXP*re;PZYT6aVZ=PH&aw{`apJHRK#i z7CC&%t=VEH_ig_-h8u2KcKV-lsx(+~J)wQ;(yQzp?E?J=PT9R-wh_uPofWgMsCVt# zx3Z_RPMf5zjS5=2W^Rtj;V16v<4tF;)pIO(&oEJ?%b-hwuUUCx*16|3dUNL{r`Aeq zK0RbC?)T@+{vXf!*$*h~n)t_Jao;(YG{*F_s$IXj?Y~csuYGoDXYqNP(!TEJ=O>&_ z{dnhh@?lR!i{f7_@h|yblvLGxzI{KrH23kA#1s3KpVsI7pSu6+{{K(oe;@z^9-+g+<`KEWQS`SiynZGXMyY1tqsm{P*YH{GTm}HFcg05xd-l z%D&8h^ie07W?|t+7HsX*6v|u>)b?y|oZp3) zUkY-%E&5)5Z{NZ1khuSL^_la2AEutSJ^a4@_3=kHxz*z$?&sXA_Mf6T6bxmw@0{^OgM!k?cMMYh=Ns9u>HX;b=9W^LK@ zsaH$y)%=dVSM%Fz>+QGy^Xor8ultm}|I_OI`*z&FUNzxXTjw)<^#hv6x5a&sSv~2i zjN0nTn(I6FuT~2Vbo(-YW{>yYD24f-FE9Jre0S>KggrO^9DyPCxweIYjkgImpMYn4IKl}BxY%zOQ_%gn--I&(-JmSW*&es|C z)8 zH>32|9qJJRQKh1jyaL2A2dOwYM&VVL`PM<#<|`IC*u z8Pm*P$ixXq9ya1lQ`7!;bMobrXP2%`$X-2D+#%m!(N)O_8m;edrqu9X-x&C!s41xH zWYx@-E47}V(=!NM|KZBNpo*oDGeOK*FRI=AEGZJ7qkCE z^NG~W73;1!OY^vIiF*6)(WO_r6D493=i4r0=T$L2z?xw9eCPAn>!*ItJDjt(WxIdY zt2m3kqbYlPOjN|roi(-$JY;#`wTwuV?DbomVxB^eE%dg%T@ccgdwbU1No>;#%{G}& zzIi*u{!LNL-XM*6_Qtbce{)YN%$!@c-alXB!pq(-OLo1UaQ^444GcH7wLZQv$Hwq% zYq9!@t6e#H+kal14H{vX6FI|)W1&EhLeP5N%iiK1+)pCb80ePwodEZX9p^qtJN7b$PsL!m+Juy|<*~x2dOizOU(J zlP#wo`b^d6vD|6kY4=|KWb1Bmozu5Y8XaS9o3?cG>bpKJ_X5vZ>2WBonDXh-&2IGq z+y3wC^e<v6)XU(a^(^86;pmSL5^(RR4uYj1AN`Gdu>LQBim ztmo&R#i(`TM&8Cv``*rO3w-~z-EsHr?HA^~S2j_t=yreHY}xp(wMMSO)2r~?OK)+% z|E>1F)#LwM5|7*YVXFSVq)_dpiz}aRQPJhq{dxcGx1Dv5ue~+Dx988aOMBmoetYQg zQ=zj?u_`UAr(&EoPejz(I?pU^KZzDr%cC^oxQ`WV;H)l$TpVKvn zTtDG#m51Vq=SDqljQRVjg%w%E&(E9WwoGfv7J;^<wmtH|GRSilemg^lU7{UYOhRu z_v3kj#ggl4PT-eb7`-D6Tq(b5x7TxM2nZFzjlT4$Y?=J`jT z*skZVeYBg+c(b~}olkRXC(gC=l+tOrFtcNeg4B{mm$!BCM|a=9ZeFtekLuaG4o1r) zygwhvncU93l3ifw)Ookn*WcV1FVUtVIBEO6oldJSI&d^TkN95m?XZR$!^|FUi6dXw znFW|`oAFPT(&2S9dz`p*YHQ53?OID?Zf;$hQCPWow#HP(WfzvNEBtHYn6Beq_ws`D z$M6fUUx-XN|Gap!{a4}mif^mq{~bCR|Ld`R_8jZlCZA^o*A5u)bUto581Owruxa-8 zX+Lh6$3N}eesAgJtFwBy=jpcA|LA>R^ZC`+Xu}OXd^={>_&h7S;4sP2yd}%w;DjQp z$JUqEB}aZOns?Ic;l7u(UN0Xi9X6OTODA}(NP+C{8)9$o7ESHUy=~2yTE61LhiW#$(<1? zDjj=@^Wy8|S!HrjoM+hPG1dviUi#E^H0kM5@%g{c`2U@#U-xXY{(gg>N6+t7(VJ)A z{k7rIc7{Nai#b~(_v}6Nz5WZ^`n~_mdegeMe&wzET>fvu_IvvdojN78_+rP&POHU% z0(FnA@Bcsi+FYzUBj`}}8)wNM3;Z2rWnF6%ZW*LpEuXv7>DuJ4Mf1EAcfaS}@csFc zD@&)(oT(+e_0dMZ&9j$vzOGss)A_r=EByPupxxG0hdq0z3ONL=4zKukiRo(=qo!(e z;E797&B5Hkd%nDhl(~H`c2+CjtffwEdHE;O7N6ZJ-5s;LZ0^#pYCCJ@IVqlBXZ|xH zJL~=avnB~kuG}v?neEdnx}m+xzO&LthQl@MLVn00;X`@YY2&Tp;A*sjRCu5It> zg5M&CH|Fv>{RrbZ#cAoada}`~$Z`_zGe0=BRw=-2< zHKzG3nNl&&*>Jw%gbXC6RR&;NflT}DBpNjZ}u3gg`re9QDZv3L* z(vyQL4y!)!e&M6St+M~eXZz}3`G2n3|L2bX@#gdSIZ-pd##cR*{CFl9g&)fFz+nM_17xOjqZ8swBFNo24@N?Jo9ZNooo|y9V=)1yqDLQg4wSUVm``g+cGvebcXKCw?o^kw)(bqsn z4m**QK9yvT^Yt*NI3rP6Il_em6KO~<@Wo1#}f=h9;@woUQ=Sw`FO^^1Q(H` zGp0FC(qQ|mSa&Sdgs1b-41=B*{B0HY{+?Y@E8_Ah(Zo9R@tID|*MDB#+&O)oZS|)o ze^LzRpH@i}kuIE*^4MZ#nAhHxb3x}AKfmZLmW*YSUR2Hg-PzOR!oe3mznI2eFP*&q z@B6>j{{P?qyI%j*zxLtN^yTTx)sNmZR-ZY4{?To6Ivp&DC;IPKRR7N2|2Mk%+$YoZ zm7lrpC3xSQ_T^1XB;POFwq9PYRp*O~S&PJ4HY$ZQ`K`bIw>iJ&`PQvp&oaDySu`{D z@|x;-4;&53zDY98j5$_)(cnqR(iy3nf)uLfo5wAA7TTAqxHO??kr zT|Mhv_PZH@mGib6XH@Ljar)sqo`W;1uCJdochj_W=Wp-cU6YuUzA8jLO@gOt&AQxz zx7W0`hnra%njZ|=`)6UoqiVjdS)B@A74M(5?b^F(qRzcI!9t<#pEom&BB}!a;&C9WPM$9$!zR6!KZGV(rJHLC|w0SG0S{Rx?v@L)6GhdatELslPOs7PR@*wgqCr@N!zu3XzijRQkLLe7RTf&Z+;56a@}dXQ zUxTixdpW@3wyQc6GP+{-4(MAMz%tD4Tr!Zrf)t zq3424j`x9^F~@$-$)0`HOVNAl4CP|^!yQUX{iQOCc^+Kp)bu*aT)52MpsjZOcTsB} z!KEU7j~`U76I*9}ZPT3W zGuyFulj9tfIWyJ<%kdk(-RZP0d-CZWJx;2JBsT8ZwNPyOwAMt4m|X?W^c=r7tFHgJ z<+p{iU}l3ywf2fHGR%8_sBQfBi?7te({y!+Rr@DF=H7ChD_m>#{JU$tiLo&Kfk8~| z-${q(+1~zKr*-qKU}tUpAG?V!zO!oxOnbb_B5={oR~k!&axM$(-W)3bZ*QQ4p%m+p z!b1fT8#dlta`V-MkG5`$8&o_aV(-d$AA4V5@=dGozW%Y<*JG}!Pye_iQ|g+_+6?P$ zPp@gU-r@G2uV+*J(dEaNpRM;&*6z8P^WCla;R*NEl~XR%Hk*~}|L&1~74J0tgpI<# z%k{6OZ>oR){$Ke153SSZ|CGGGb?#vm`Qw2{`1gID`{MTg&(e2a_RO#}H&5KXt##t0 zmZpRwYooh8L<Qa5ezWfNUB&Jq z8v%tiCDZNVCR~-1TDP|RW0|M^ytd`#kE@@HxA@dwyA-`3rq5~Pk+Vlt^YqtV$SIu= z6r}r9Q`Fu@a`x#RSG*#5E{m;w*Kj&~-R5oE6vdvU&6q#?=6%aIXQPh&4?CGx>AmD| z*JIak)u<$vl4VKD8iSVFPM`Z=)i;wj$z@I5FJCt-xwL>K^Zp@U=JpE*J&#r!O+UOV z^>N+Bc|3-lWzGMV3$!f^m1|o(ae~vSl`B0b>WZ}geYj%p-Hcs(|2ep93}d>+eOpeO zwS>9Og6m3wMUsI;XW8!Vpsr(Ov+pIG_;iY`)oEIgp}#=e1TC)F%RU|uWx2jlQ`E@k znwL#!U8DZ~Pa^SEKQ&)}){mRUe344v@(X(> zPw1aFY5RpO_w*P2)^k&vJoW$e|6lUw|0@6A|9^FTYTBYdO#=KjJpUAR_We!X_xbjI zHTB}Ke^)||-tn#wU|JM$@x_-FqMPT;T>Egz%p{4Udw!kMU8k43Vbi|9d%x%D)bh%@ ztYhe{z5Act;$858?ro`hDK^hH&r9BUbdLYpDaW_IUw>R-$$`=>)el_udMuqJpZ!ec z+tz;qGRJQ&{PHd}OIH5KyQJE8a5^uG)5zO&$-ARifIs5?35*yCSkZ-4n6 zo8!D`-_0kzr_E>1UuS3<`0v6(i8h7F9~lnz9yQ%2_ zRasl*|F&OitGZ{d(Cr;ZzP{vDVOaOv$TaZrlS49}H(wU{WU0AC^KVXH-g4jl*B4)v zz3{rf<8g~dU->*&MvYbSO8xA!EC zw#5$`r9R7lz4M+!a)#Qv?AaQp-pB3Tdn=<VJAJ-7OC{-3S; zZNAU{7yr+{{@c>$dNt=Z^(^*`Yz?`sy_d_-M40X z(V=3K$(zl2eq5V+i+(B2F=`-y6ThR#;~!oLr>*E}cg+Zj)~E zrHwjXmGiR<%N0&Ge>^(J^z?Pk)`i( zfS&lw72$#$MmKeSCQY1rm3N!8@2|rR8eNiXigz6yM2_#!yxC?VrM@&$@?`z=3SAaUXC*T_A4`!XdXmhHTpZrikZ(S+}s;>CU<#}96=|8QQ&90+)9S`?`>5b{Rr{@&w7|;J4tG3!z>*$;IMGxx~ma077ZP9o1N($?J z`#TOyZ@xGmvlWPqH#PKq-1qY9~!@@&~?5dif@@;{E@ynV>VPlZscLy!Fd% z)23~DX4`M)Y~Phq+y8la`i3`qOG9jb&O4p*VRL2GU&ZayuRD08Emzl^-rZiXtNNE_ z^?#Y~PRHiY{rKhg4|^4rmpZ3*sF+R56I>$l_};vqVnIvq+15_A?ReZ09>2TEp&%{s zRp0H8AD0=g;o&{QLX1ZV_C}e1fyYVdai>(LXoW|MK_ybNv6m{eOewfBxy7zdEez z+{N{pT&GW~U0)Xy85tKhFCxF>sYZ{$rG(TBy;U>4uibfByqW7^$u8TMHK~0XYP8f_c#3S8k~{6`6F33yLYMcu~j=C$8LZ5{#{V4fAjk-{qoAbhwse(&QD+u;xd}o{`iJSH|xAzCG*nfRdP*PbU82C%lDK4 zuX3rx)F0mk>SdfYk0w|wy8QO?Yd()jEm=!f{H-{0<5Btc7}b`FgyuaTZw2a#`y8Hd zHvaeCaPz5)`ocudg{_`?CjM{t|5r=v|E~Z4^SsUPD>u8|S3lZuP5APrPfI&rUR*nS zd)4i;+wO9;I%c+=I{Eph`26ZsWzVk6kzq^RbnC??L!qLr{$Kp-o?F}hIGexkn_Ioa z8Yc6`_XQ61znfWv_!w`1GUILH?Q^n8J?_mVf_F|Yx~(1}Bmni!BOV@1M>@UA< zrykk(g11d)eQt49-K3NJJoQ|RPO2`64gzdz*5|JZE1xi9ny&b>G`_-wV*cJT{nqm1 zJ%(pPj?H^{=~nKV_c8NL6x1E1CLG^8`G=pFOv8=R%9^)pv-kYHr)&3rCb#^_l-FFN2l)?ofNwhKo_f{SREF))Hs3`m3-7)YY!&pqLp24YTIWJN4)5{x9q2{lEV2(foNezb;w+6lj~}x-LND+H*gPuyq=% zE`N4g7c{webMUc~t(G~rm0tf|WG`{z?Ax?Y-*$&@|M%gxeZ~IUueVklo_EXu=#T%huO6KYDMx<~7O_dmS`w zXYi>_LACm)ckSnY|99T)b<2-eNX0hHyen%Y^Z$$mx8)Pp%-ZDcvgOLR-tuX6vN&zH znsGVj`-~M+SBMl#RC@?5OB8T3jJ%&L(R1Y0FR?=#T$aWx3bNz6+PJs5<&I=T*`#TP zq87TPZ>JnT_IIiY!{ROTfAuA#xJ**{Qsw-}B~fzH`@cVI7il~L&2X2*{!QL2ls;Y7 z?3~hkmPxylj{8a59*EErkDM|8>7%3EbF6B+zTew@tT)(>;s+wIx@q5gZ`VlPf|Zu=A3{2Y3gbd zDc`E*z%1F?|Dl~0o-XwUA!ozB7wx{>y=`06&ehkazbN^w(y7GZG$|r|*}UfptqMI! zY|Vm)C(biBvd?01;JCIu>d(3BagX=DJ{_~O?DyRAd-40eUjKLM|Dz}S|6Tw8hr9lf zc>S%_*R}X#Z-jC*zO|UbRe9>EQeW-ysx>*ce>KPdyn6o!d;NR)Kd-_jsU%zez3&`6 zgTJSF%{;xRy+v+Zk!3l>mrQt!=YQ0&Pf%c7G3E1_v)A7ByB70%Xa*N+Wgj=X?zJ`N zo7WNflYG_h4{b93ym7f?j>Q{~IX&Wwl@tE;JonmklPAb)*Ihj=K0}^ni_VoxuPt{J z2-JJaCVbf>qx`o-kdQj(+p^h#Qw(fPeYeI~eR;g+^uhPvf?BQwKJH`t%U*im#?)BD zOKTM65-UbWA}9Yn@;UZ z^zhsm;WA5X?!AV$Z`t<7$zQ&ZR?aSvJLPcVgWUY>?9sP%t1Yw`_*?(b)*NH7@ z^Xm>QSuC#p^36G)H>FZ0GJRQmj$WQiW1f8JWYxKyR9o8{w|@EGwYKd)UrH4&(s*Y4 zq`2zT9TOh6#RBIya~|#}+kX7)QB@%ob$^`)yN}~W4hBKrn`U2Zb&wm7$=Ap z{^42bj4*%!3PbL;n=j!KTKnCrE9@=OoSsfiNqN7md}+?QQ-N3k+#S#x&V zW^ZZP>4|*;P8>1k51Qy+yJj8{9h+(Zx~0fCI5e*68_&))_3oYrxB0Lg7Ua5dBkSU8 z{)p)ND%14~lj@%BC{L7MQC|CCe%AX^|I_i8ZqB_J$aUC&v)L|M`nAaC$aC{&*;Xhd z`tS5zro|HY-t+Na1_7r4jVCkbtWa9g`1U7D;E_j{xE3q;{O#)D4{Wx7m&!O(!R6mp>fI0R{|`Gg_8nwo=EVx|9N-4{)l|tbKXM+No8q9 z6;D6M_wDD{pbIG=7#V8e=E}@^k@5l{7wFxQ~D1(GI?_9 z_8TcLol&m4+UT3&O0muSS8f~lPWH0&S9?6^bS3+>C-SR*^{J=XoMYGzrQM%MPEN8N(%czFS7w=K9i$uQu%4=eGH#QlDvPQQfX%CwF#Q zH#KKUaj6gB+l()aHK6Bo8^4S!DWxngLCl@CR zFBSROQ+|JyWc5T9&Oi}iS3yUKi}F1grn^mM$zHp@J=4TG$NW}QQ>w_LpL+Yh?Oy-s zc6@zr?_0jQZ42gAzH|NfRKHGf^4ZiU$`8N&GYs%5eERqG_Wz6jzxn@f_x}&`|9n=e z`c)_RBlN+q#J%VLF5_of8+e~RMr59syyn`20)U>_g^W52iee%ZoqkO7ge|Rg*d;aOn z<>@zWL@d9VwbE^|=C5YK_xB^xsy3~88vM;h<>nX0c`L+j-pERfX1ibiIQQQ_`#y^UwF;mA#}7?dOOGA0RMgR zo9>*bSfl76 z^ws>{&Y$xC(*Ivw|Nn9QFKP3OGd);pgnyLsDKr=9-+3=8m~r*=^oE|y6II7Hzkccz z7S<`}obt%w@02E&uiB?&webbiB8=e0tNL zCH|irE-)W9d+RqpZTb1LM^zVTESm6@FJ$Ep4UR1_ev2mP3i+kH=1vRCILL>-}T@ zf3p4~|Nn>f|DI>RFl*^eOaChtwe-h@!u|8VFnwT(TCwKA?lRTKmd5+iyF0z+ol(^M z7PV~2g!4u+tY3aBPjU%dFaG^*v!wr~=xMcEzTC5(Fe|Y4xdTsix!n^9iAZ+WjT6+n zk_(^yl`hj!T-Gfyr3GuOUk|Mnc8SpkK!W-gh(d*jv*%D*HlrXpik~_N({k#rnVZ|9<-ar~Kdi`uAMB*#Fsm$o=x<*Mk-J ze%Eb(#W%}p8e@-3V8>*av|91c0Toh+r0Aa*X@?2N&ggAsLS(AOWnAkfa!ku&aHdSeUICJ=+2pWjyG!WZz|MR znYzEzeWlzDxn6zI%%9WLEd;Wza-FyTE%Nu^guLzQc`W=60ce<>cu{=cQ4UfM4C4nXbjvp8M?>{rI|DL`6 zulfJG`un@zweRViW}hklRq@XI*b~hDi;X95dLHpS=k%GgSGulvSFUl^$o0_tV8ecW zYcQ|QwjsF4#ltkmE?0)8x96!;0&yj~W%*^xdPJ1mKt<~qo zByc{?=H#g==HnYRpBR__*)xUdv{A+XUtIaII}d)krM5GsZ+cwKyLUy({ZcIlw)yDo z|7@ncdNv2>c;Q(|ilOHF?)RTL7xFvepIvEzPmsUJ&x9`i`DrhNrkf>2#l@;S8c6iM zD6>j=Kl$cO>7E^XuO*c3KC032p?3ez;{6|r@9zI2{y*kl>+^YLdh_fLf4RbP)92a7 zj8)7ni6^e_`)d1d|Nc+s!~eI(|2uv^&tz8Zmh~sfZ_{yPn$>xX3Y)eo4kW2TU zn;@cAB%-$G+cnc|Qn_lcRkzKaYn^d9c}AO~+2e_)t0LMS+}bK_GHdPe_Ft<+e%8!; zK5t*c>l-;aTX$3yr+$y&pL9{};X3y{U0asd*jPR2wmldp(RT1k%G~98^HPg8`K^lx zls+4`Y1hpwdfoD$e|H9%+}gG9-W$Ftk9S<$S)5*7|2hBf*C+A+XV)(+`}an(I4i5k z>EVOs3;fKUlRmJ=|JSSk{{L_Pto^^v*T3F+_Uu`;54?J8r`cHY0W!YeY$lc%N1 zBJk)hf92GVwx?9j9cTDi)AxMdUYG5+(@mr<=9x7gJu2lkb)(y?S}R#p}S0WZ^$7>}?EcS)uzrEe$V-b+_ot zPA%Sf@!7Aen(EEDPwq5Ix=obeVQ$h;^Ay>+X1P#nD2(ATSc0_-`js~{hwF)Z1;bhJY0CL;|)8zCX?Ty+3zfG z8=e2XZf;?Y@NJ`yvcCgnt@T{gF`1=t!G!Y(vnD+>I8d5fbN*)dx6RkLy!xzUtTI{VfY`Z-uL_ObqCiYg+0$LZR%fMai69udg0}_%q_cg*5+N5XVaQ~ z+St@mahdw-e%DF`Poc1|>pP2{#!kC#b~4Q-uJYZTgTGa(d3PPtIw z*|X24%$TtvP*eQrmornQ>Q6JsF+W%$;p+9JU0J{_X7((*$5 z?LH5)7!Sv{ZidSSIm~7W(G%n{JWX_GiJW|RreNE=m+xNg-L-pFc6{;uq?0$cOBa5x zKL7D>=ZQ1#*1cM(y4gtk^}hy(w6N4PmpeT>?*GldUtd=B>88dK`v(>g%Ua9r|4jM& zxojs+$wVwY;X2?&Tzh|@DRQFzwnvO@l@(i4k$&M0-zP6N~t&43oI`&`}&#q;Q zu5X^;^NNGHE#=X}@9Si8zF&|_c3Aa}PeyJ*_4`I=jyS7&G46hkwd`qv$@F9T`^xyH=jkkrS+`+pukOpO)6Xl<>yZ6<$w7c+g_+fcy8%1) z265SQl<$A&xhc?wOtKO$CY}8!g z^ZcZX%-b?|DQW4WCx2Q_@;EZVZ>fQ)WuJ@9w=*STb`Ka9+&BMt^62UvC120IU41=2 zE}`cx%Ll!A1C zhGoZ!AIM~sRz=*sqxRO1`=?Xq_1U^bMt0RV{GTu6kZgZx)bs3;#M!0qZby9h@WJ-c zW_2UZoHsfK%7Ndn)hV7fnsm}4uI8amiLbQ9w`C`f{CKh8w{hEyb=-@O&-M7&5r4Nv zlx4;B**_i}QvJ7?U+>=Eci-<lMj=Qm~yWhJ0KmC}4v%SMdh3^Lg zr^NH-X?OqrO)fl_IE(MqSG}N>7D1YZiBfGmQzo&`TcP5~^xVQikzvplfQ{JLSqSsBKb$w$TYO6H|L z{K2#>_3^nwMs?r*soyQP-|^#MtH0j9#}?<5jvPp2byw*8v*WNlO9R_E&EzwT?z7&l zvAG+6Xu`sLOONG`FPMtX^^>2Zqc~HbIX~Vf+4xx5Iv>6%3twxeH?KbZxG?BM$|Z~P zXCh(O%{Io~aawxKX>V#mR?U+}U%rhqx~|7rwQ^5?zbGX0V%An6i*>8zN);IuXUv;* z;K~!0PqS?+;y&E4E+~7rd+mY4>mx00%zM#oA})E&d(jG&M~tAx*~Xdr57OV)p1EK5 ze)6ZIr?2Zx_qzSw;YZrt!@*K!H4<{+9vTdX7=>ESET7VJ!FIFg?=uGZZ>#LKo#yrN z@9nzFDD&YjLzfbNnbgGdqL=utq~u!UsHvBiZ?Jz|&^KeN}_ILXVU<@--zVW$b+>IF$@GPkda=}tc#c7MwhAFEP_+v?xh#oCgxsuU_5C7L!T za=$lFZ92Zg?LqU-MTu879@jeho+H?QRmZH8eJ^D0J{I{nMUkcN?So@)t1G@A?mowV z??>dnV`r_q*S(HwkuZrlEGQ)S;G~iezr&06M1wgxUzyor@5Wm`oOAd)(~N1&TfZ7r z)p8eaethW2*^dvZ?22wadB?1rl5oxA;Eg)&+u}ziRqmGl)W^9==kb}Bl>%OY8aW?l zUtgcNIzajE^)qv?Jo@XQmONwD2}QZfC!QT!_GV|E!-IE*>ppDT9_I6H2DRp^L`#+o4 zX>aIdTYDusX!Yg8Zxn>~$Q$~)n$2xlrM2PhzHM8#o;)|luJVTeW9^4AXAWh|I+c6e z@w!3hb9Q!th+@Is0>kt}mdu>s^_4BQJ!yQ;m~1(mzWg$C(BL|1 zm1HOyd)UQn_K^>B^^dghwY0wFIJ0kKFu&vz>y9nYSADKfJZThH^KnnfzdMV#^6z)u_QeqFCmhi==>f@!(*wo&!e(vJ=wp!l(6pI|o~H zN>A&A)XL?&74?!j22xhPf+F9{wdgD0i|wCya;4-npCbk3mi(v7_J7h!EGrV3S;91j zdG+e-l;q^kFP8mf`@J*vy7T=l9l5(-e9aAcB|Gt+m4}6}pjQHuBmW1UiH~k^w)V~Y z;3mT}r+Cep+(+#BdwT8veZT*C-}l4j_kaHDzxS(b`Q@E#4`+rR6ciVH@Ub=J#}ScZ z79amK{A8YNQg*<}i6h~Qjzq2W<7CMKzLH&PHvSdap3SoF<8}7DKR?&I`3tk~N?pss zFL!I_GlYhoxLN%C#GgAV>rJgrOn=4yFYTP+B=3h$i`5-Kr?9EaKhNxM@}Rt-fX_E{ zV#jeo7DfjSLtXZ%QQU6#f9+wAyW%~Iz2Q2mllK|bjR^`y)vl_KBAhsy6plRlBz5oa zgXEfmhd~uTU!C=SUtjXkJ@)Vqi38OPul%db{kxCbUS?zX#9-CZ@S9P2p1cBwgw213 zvqJ1&s>MFB8lHG*A$Mx3T8#gV2`|SCK`@8)MrtS(2zF$e-Iu#pU@A&cLQfSS8_xy*izFOzhD%U3$ zR=$ldI`^L|ssBWy{^DEya^W5p4ZaM#ok8K#H1{Yp$g^ya`R*WZkSsIrd2;b;uG8Nx zypDYF_3gnR-98152bFRSiM1*5)hAl=g{Hcy9FpvN{}OLdq`K#`E2Bwgm?)wu^XvO7&!Ve2D3v!owH~=ICk7Zmavfw(=g6cw)=9 zHBsWwciV!34}WVSdBb0{ol`hlT5~zdTA(X9{aiwl&hgmu$HNwWdyvsztn$dJ?%`GA z6HA0&l#EGf3L~blzp96{`cCUTT4%y|9|tU_xAtf?b&|>+7tfoi?=x` z)5*W!nA0^*iOm{{hUfVA-LPvhZ0kL1wCSaU+Of?6DVYVLo(Cju?|l1ys?6U#iuXT1 zcyh{e(n~?mWk^?~a__|6J9IPnvdwhgiNBZDYp7N{ZLR$CC_BBdypnrr5$Cj2#d#Gy zse%3vcfQ=!H*=+@#-<*H4HsX1xsV}U5F`J~?(OwT5sw!Q?R*^E8$Q)-V_@)f@^oEI{Dk&*=l40OPP(FcFYj8w8WT>&6DMzS3QYJNr}27Lm)mWJeG%?P z>yna+xRR3}xBu07*RA9EL54eg{e73cS6LYkp4`bf$KJSkV$83X_6p}5+IIV>)P}pf z5ZpeyvqE7`aZaA-$IajEkM-W}p6joF|Hrx6`TKvD39#fl`>g!@@Vo75o0Svxa6Oo6 zkkaMyQe&aZIhACIlPdGQ6xOZcdSuAkrE{>j_JonElHRRC)lR4DB?4NzwtrKdbj`|)JJe!b|H+Ly`~H2(^znbf_cE~chGf{1O#%}i-?>saN6}&J zwIl5E^=-4ur=Jqni~If0UEHpc{{XA!q;2z3Ki)V!d5@K5LpZ~pQ^S--p6cwE#eA<|4QZlC0y&kvXGwy%7> zcmIy!=kMGZ^a8y;=lr*w!`G``Sz5%P&R8SsFsb;&EUo1totIW#&AhD=zh+TL=7TSt znkkn~+TP#%d*!MV9L{a4%fkZm%NWHT9Qos^GU=rI{`bskDKbxk1i8Ieuh`Dh(vzq& z{m}I|tG&gEpRU||Jxk$u-_*ljK0B?xd(i*>KZ8Gu?SGz|yZ_HUe)~07Uzs!PapqY0 z;jvH`PsOFpdzl{SG-w{1xoTyXl4p>P==F)7N9Ugs7Dy6G$T4Z|?9|a%8jvEnaRy&# zsN?s=Zbo;``>j~f{UPAV`uXaLj0~%US}R^`iH?ZTR^pI|voPhY448hadY*EN!n*7m zI@dPr32RE7DRHuQ!%pF1muY?1u9`Al$SEz%Ph?!`m7G5P>`&v(7KX-U9sE6fJhD>{ z9{2E=$I0Qi_1XdX|2NAI+y8mIf6woC?BaR9_U&hQp!V&GOP{d+uRb+~a|{-|3UWrr zG!#8O7nRsdmpW4>W7A{EqS(Gn>%UDw1tJ>Ma>vDl0EP zmOLVV#ct>M@URwv8-48d2?aHMx4(Zf$Q9pwIr;a76&V%k&W00RS3RuU`fpmukrcM` zZx=^oF1YsQ(Vdl&D#F!PU(0qa=B!%Qdb@kJM(C^sEy^=bJ$Q0b*yU3i<4LI-j?{%1~=`dGqq?{^D~7C7gAZDVt9^cGGyb)2An~ z(ap0b-FmyIQm>VTVXC8(^xQJ;=%rHIw0-BykUajwBklVivmX+dLnF4eKmDq7Yp$H9 z`s13Cnx;9k>=|EjT=hzcbX$D!(6cbPuWrT5*H)U$KBQm!SB5V=_k+S-*Nz(}JWT`V zPcC&?xmKA$@bLMmS+eu%%0#!n(_x*y{{HT7i_P!-%iJ5cpY4G&!)=Q;(~0_<Tip8o)}x_&zMgZBh`5<^f6wMG@BHsqJztx*y;@L7Xr=78$2C!J+9wz=Y-ZTU zmLTQ8#gIP7nqkUCpGnJvtW-LkCcQY2`Sr8kvM1bk?fkozXFC^+mI4$)#w9Nu4Yqp$E%WHdO6xZ7{5u*Z=co;htZQ{wSWE!lQ1-E^b_ubN#dK zqks*$?B?%v9?bo2cdUJW4Bz^Dd&=KW?!Nx-&!OY<>t0meGi8|nu;XoreTLli>}-8S z7xP0*M;eqE6)Niz%6POhB%a;)b4KIjGGPV|5!a@~2m{^p=TGdmtY0+6VUh}q;|G`D z*DQr)W4;tFzjadl&aXDxzcLrCt|+!BnVPl#yqWpL+cZZkdq-I{ukhl?Gk*PbdNcf0 zO6FMGGRFo7uG{Ll|9a}Y=dBO^ym+!rVUAE-_1Dxt$LoLRFS?zXyg9;Iz(8lM=*8E! zPoxI7KNdg6mbSr1a>JW;?Wu~$y7rb<%WZg11p-aVT)hVI(BVaK0onX~d8 z=dj6-J}nQG~_c#G+JC{>-p$#{mPG1()!hU z>Wg!tIcAevl)5#)C{&buHj13aw%eoO^71qTTT8Ck`Z;&s)|gKE|Xa4pC=h z@V#zeHp#Jccf;DG&>4~fO_$Y|@s%%2Iexu|Une*tq@X@Z;6P!_on4z7-v9rRyXWsa z_lT&wukP*JT~V1>__Fr?_xmgbq7LHc511WpPS}6%D38+8uci#Q9=x_-U*0)GZT`&p zQ{pXbdrP$XT$I`_UKFv>cTt;t;D(1(myYu!4LA3oMVHeHia47dObibCSi!SOE4i#n zCO9~`UsFY*By;5<|89P+xkWxV7P|x=v(|`W(&D|CyFI~D&*!wOn&|Nx8PAH9`By0| zzV|9=b%gWMdrC%3pC0WDmXMrn@n-o4)fFm>?`JB+YaBGlt*B#&4gUD*=j01toU@|U z1P&dvRM6ZlZf^ZwvQR;Q>3Ct`!$+buzjxaoa-Uz*=CturOjKn3_L!A5@(1`C@30jd z_&u}V?6<0lOw!`%EC(0`m<^6vs>B8_5jIZ#bUogR({quBYLdtDM;*sad-~HRc)ajX zN$xmqlCt^G8^dMU4|*2oTOE@7r+Asu`Fi8ZlYu?GsfLF0ZcBRAsI--7JaDpDazFVHf2wrrC{^*0-p zOnaj>zuQ$#7RZQeuhw31?e>OTaiOUO_U4T%Ki>JbWwO0d3`eKT{a%lrQX*pjHT{6i~qpN4eI>o6yiekZznyyx&?N2KTV&!+{ z28>YQ(<)>cl1%InDfUo)EckH)v|V8QRMw&%iyFb zp?>3z*2l9of{7smgqvpT;`aCc z|L(u9+5BD=|Ir}UE~RF}vdrYwAM|VP@8!$TEZ(l z^{vvaxq2U)1y;K7-1K1*PL|a8lsspTyxN9;I}h>+i(8%%J*0GeG574hEdmm5{O{{4 z1nWQEm4Ce0-_CjUU01W&$6k1RyLIT%tN%f(&FvLhzVQEED5v`Ev#3SPggj>#_2r6e zqFc+ZZz-C&Tq(IQiz>ZIPi&L%q*`uk`e6hbC$Q>^4aYu z;Jp9ypMSy2Po-O|*&Y?j?pk+uZHV;$yL*>T-7e}{Xz~2~7o}BypDF02TDXJ=FCe=!?rrXD=@5(cdU@c}+y*bDEKd~^k130?XMnPJ@3M|{wb@&n?GbJ*^EZQJfTrt^0 z{qc#^BM%f8ifnuQX!GmSD@=ELs3loczEX*+ewwOr>Y~?q0WZdLfvfY9bCbEZhKX-- z`S^)j-N4wgX=2W+)kojkaqmB(U)OQ_{NK6F+)}G}d}Nj9O;O<3uwze~{NE?CH3bia z^6u?wuUgzWV_o~liZ@<6gMR;QU3zu9hN|6Ckwgi*pL6Au`Lxvd7`G_I{jzG9I4{#% zG5O*4ID2t_wWRo}-4h&Vzxc51#HVvbI_EzdT1{$ObmGO=+(K1@ANHP$CZuvE?udTx zwS02L*QuLN*q&Pz;#3yQdMUtW%U!*h&(D7RE~pUVrnKzftF06CuO@uat*GnR`O+|B z){F}EmItTKisnqsx)8#ees0b&{o2pc0b3Vuw+#$6J(4697Jhxh#;v@r6F=VSR{yy6 z`g!GVqQCDnD;z1?+Uj=thUfjH{eSLR97#}`ShkzvXk+iKMtR|55_$LH4*1u9vzr!X zR#09jxi*ZQC8J{B|7T@OztvxRb+$a&@b1^Y4`$w7T{l4{rRZv-hFd9P595qGTGtLM za4Zc!H~+$~UjMS*pIl-hUiW%> zeCxW^{ol_m>RK@|ptRtr`5bk{z{Jnb7i3tOJX#d7>cEzmihcbXW2A(WB^$aI?swYR zxOA)1rk5)Jqxb)v{m}b)`~r7fB}N7=F1@p7d*fLrQMda}=eHbTV~RY~T(*(tvWilwQ9*^owmvX?|N4`kd*e9^qJeYHO z_w?KD9DFNgwOx;|ZuIMYzG33}ghbW;sb_P~`1IGltY%zrefvdIpBsJZ&(ge13(hHe z3b_?)?)h}c=2`l&iKo>PZ}H92WwyQCm}<@8%y!OF#Pyhm+1AN+n{(JZcl3ogZ8<6I zbo6y_P@+U>%$^$NwPDg-ixR4;nAY#Dk$arH`1f|FhcgaY9=~*ot?t*i>K|`j`ReGd zUwARAIp~&g&%OAlZGZC_au^I2hg=IUzA(K}=1}o7-VVp3|5s&4=>Pd~cXi|29hd5V zmDlq=_doA2?IrVEb(at&$7!ks#}=Nrw7^6EmDalF%CkKW80e@7C8fFas@4d+nDhC# z_9LVE3Fjs;UO4FRsCZZX6T=CQl`X3OrRInp?c5&qenC+F!!LhK7#=L$TwL+@>E#{U zCoOLYT9zfn{@mS6|MRDt!WD1-c;<*^uh`C$^JMjpukl<*zWkeaUAKKh^URr2t&e{e z*zj+Ad}vE-&Xd&{TXsoEpHx`3dd7Uo_SZiRewi`w9kbZuc`#Z0no9~eIK55Bs2Zc1jlGvj^GT2VG@LlJ<@IE>~ zRPt;X|6=9L8Pl4>7Rwp;*hyB-k>X@%=(el%Xxl+`fSRZFm0 z$9scp{&MZ^;=ZiCXRU277slS-*S6J9Np5;v?NXbyS-WnT`wF!wYApR=!@ssnyoF)c zvgD#9p4ri^Yu4mGnks(&;hC3}J-vMjJWd`$t#X$YPjA|BqUxSYtH1_>BfZhzKP<2R zSbHZj!fo+QC!J-#7oIe;j!nK54jhApZAJaf6Q&X1_4;ZCrGsAcTLG*5S|0SEOT8HhXTdu4P!THjKSrSH*d<+p3y< z#oCV)A5OSp;Wyv1`{Qo!7vFTItkzwVH|^ss@8t_ta`~O}Q;@vAapTUFA+OFB)a6B4 z%~ChzbM=38b^5ua8k6RrrJY;Xa!tGD_2ZiPx%zj%k|LfP=(6V?c3GZ%=*7(kG8aNk zJ=97Lzldyn{d3jpUxr#c?|d#*^S%-$dQ_!l$0VJ|O)k;Po^IK;dTrR=o2I(A-|n1u zJ|%MA+b?&n7v21FdRp%CnCputsU&6`fB)Og!y!X*P=HiXC^M(ZTOtyP{5h{d}Tl1{I&mh_WUvq)7iQ;RWGIL zeoQXkuwf6^{qK&Nx>HYY_20&|^r-@e9#aMT@rv0G9Y1W*o@2{U|Fo)ZRdR%h;N`fu z2;DxD+qNOEbN^ghzprbv`tk)QE}egSaoH4y>me(;1SU;CcfPT3LBty6xqb`sqdwTw zFOPol@W$lj>W8OH>tg?2)PJ-`Vqv?qwV-v&j+BvZyYS+Bl;vSY55~-4~ub z-Dgjux4&aiPgA?P*vxy=?~s%^^X4D^dD&Rw`mGh$Zr{)e`*?Q!{M&|0a<=eR%A~U-gm99->SE|rLW4jEEZat$so1V<>sU%a_nM~$*lGq zxA)0kQJ58C!_X|dTftFaPHbeX{nWE*=T>)p@>WcKJY^Ek(v+U!1E2p)SkgHsAm!-i znQ32s6<*$ydHqFWF<<1gi9SaR?aZ1ct3NZaHtyVbQE*AH=ZaZf7h}Y3_U!nPwRLwv z4ErP%$IB)?y-y5`Cb??OWOy#~cVB0OPy3>}hkr{&jlO#C zZEQVb=v%!sYW4rbwfFY$C9pa$FIp!3kweC9wGZoo`O(`}PhFL3&vA40vX?!fS+bk< zL>|olzcn1xI7qB9VQ#qpzI11CnEW+=4n+y+vj@IA@A+|P&I`*h)i1wmPZa%nUTyhS z)u-gh!@V8~(Ikha_{aMhjrmCnIewbwn5 z%`e}@)o}4(?y|e@>X=!Q9R-X$Cxy6940WA$)kn?Ni^I~jLC`BxDaA+sXJgb_(ooxW=Aec6*L`zN0MuyeOJ>&lBJ1=TAX?*F-V`bTTH zpQ7C5cj9wv^jsviaS1ya7#nll=UAMxJ7dFi4S$1PSi+*YF1SG;^#;M(n(%WtP#jcQ&#iL*#$u@K*jm7H_xUuM@7 zy|EIz&h=#SYVHXtOqYu;8vcs7ziL6gWkJmOi1Xpod`|C_W=XtTwnwO8zSEnxa(u7( zUNS7WQQBIupo5{|b!9_`pA&)68)8k-;W6g<^Zj0w`ly#q)>KU9e^VKfC(9i`d zwchEjQxLn%$hTw?XUb;D6ywYnyV%Zu7U(~2U~AcUbEamB(aVEvmkw*zw00%V50B4Z$lAI$ZS~~!*QDQ1(cZdx&gW=`JVmc$Tf_F7d*azXJfA1N=IX3t`lly- zk?-qWQnxcEKYevC-#fjhAA7H#dtm?LYWRm&-0BN5PXz?Lt6rwq;xJ8BMJ3iEm*1(# z%XQY9=kpeH^qhCyGRIZv(~^R|lrjx$}g0_KwM(O+rm+%a6a-J-jWad}mB{?0Qox z(GHQ5TrL;4b+Ugqv;P+Q;lbYr%q#fwM0RgZeE7gllc6P1g5UWJqs8r)Qp%ckpY}(~?_oACGW6UPcnI&_5ySC}l{aH#WiXxG1 ztGY^V966#P;@bH9=Yr-cFRQ5sW(I$rF?;T@D^GTKEL<9Fz1f7l?4Scj#EA4w{4)|i;b z+>e(#zx2P=)E7UC_AWNpyL0I7RHnMWv-KZsuX`#wXVz>6MTZj>PuSnotGDpPG^wsw z^{XIw#T@2IJOH(jIN=TRs#TAUPT$}5=Ng;VZP$!dO}$R6`txSCu3I@lgY{wK zu5C5qmxF^VULGx;Ab(uoBZHuvPwb3o-62+|9~t(}+~$1k^VHJwpQlI7ty_KZm09n+ ztDHwWSMon#J8~-YwWeK2n?CpD0)|EG8;_Q7HpsCszGiQ{Z+=#wd6~z3ev#varX4Sy zi7vigzjjNkQ5$#&^X3Mkn zYjTw)dv^cw(rey%Q*uwiH}FEj32pU{YdvZWj|mvDi5ZpfGA}I>4PSTnnDzVk1FvpP zi`2-SE`7GF(eRrxL%kn|X7Ra5lZE^0Wm>0s>v?WDZFzrFj(NUyoa1#7{dKD~LnlsN z_Vm)(B-zuiZ*w@cZM|_N=ONJvf)gnAaN|h=g$TEyTd*#p7czq`B%fb>=jp{-rQQ- zy7q0+-nsf$@9E@R|G(tw%f0V+%sXh=@3_P>&oSqWG5_z4_u2UbkFxxznQ}zY<#?;c zm+1^Sh38iHz0Na>e(SdPVvfnIwbpaj6>h%!^4c!9^@&l_M2wCd6l6<0kZdTsGNs9D zQcK$E=A?~1MO)iy3Zr5?Dhal~wV0rBcjZZ&NAfN%a&tfvA5UND#_X#C%^e?e zpC5OuUB13e`+DBS)}>pYow{|bX#4Hm$1VSJHrThXxajuA*xk{iO>vhyht@p#oNZQr zt0$?%UKQEN?vU1_9u*rL8>PMQmcfE-E}=r+UCV4fq#U+nPgYFYC?WDxTdn4M)I5RA z4fh>I#YEhnxO`jV%+V;a3IG^$9Q{r&G5*=GoEoQcztK+CpOhJf0CK|>yd&G+}swjRdUGKo*`F?}^XW>Wu^Ufc8 zu#L-b!S(|Z`z71nOnY5`7_06Vb!|nn{uL!dhB+& z@z-8tkWBa8(qEl;>_ zTo&G0wDVfrD%0KaTARMuO?}b!zJ1d3_QzY@!lU&=4jweLo%q|!kdYy_zqZt+$@aFu z%Y^?OGSWJmx^C#3__nK@-m@n*Vcp|^`}~fa2micbd39EARxWdE5bvgz4@br0U2Md} z%YxlqJQyBMH8rzpnsBh@^IU#&ru)+wt}xtb-Em3RVNS{1!*y$Z`*2KLl{pGp0%YN5hek1j_YGcT{b@^gv zik9Be&kg^RwDHWTsZ#I1{&tz9;Zd&RfbzaGUZ#pX|= zq#2rKtlRcH{rK(qF|oUhXLVz2(9CtyX{If81=nz3bxUkLGo6vn>pbtN#C0 znREEF&5K?CMCU5U_^jt|u2Jgz<#A-66NiCyb!&Y_m^v}ySW-ZPq`HTXwLjcbNU@c{u?iS>*X}*nn~>C2(`IM!NHHe zW$W*sVPj}+JIzn^a`EQNh1b7Mn*DRpy_Zr~w#h!)rI&NObzSy_(zC&$OPw_D28pIF zy>Bk=b$jZwx4XT=1XyZ067M$%>|e2qb`jGJ$JSJu|0y?I*U^V@x% z{GY=)R(Ail*FApy>i++^`4?xNocNpX_NrA~K5E>t^#Lu8NBr2GTtt+PGOB)DBQq<# zZ>^K&k2jOQ=PbYPXL#&G_xicbi%#q)s}>E z9c9N4%>VaPI{g3d`hWJZZ@>SJ?U0<%uh4b#{OlPv5{CD+89Nwfv}imE?g+i3&tsP* zp#Fz>y4A*;R~ty&z~m{Bm{ z+nwSM8vLe@PFi%WT&sUj!g=jYSD*0a>*waLh}pZh?)HnDAIq+vxi+iKpF>so=8{K0 z6{o7cEcTvc@!Wp7pV6Hvi-I4amnK?1W}M`uma+Tx^4mvkI1f!QI9B-Y49~4tVcEkj z>+=u4_Y|WH?_lZlWWJ61m;C$iq1<|Y|m9b*cF%X}kKhlwMvPoE>;uvhYGVG??^2>_z z6 zuc4n&hriD3Q<=SzO|X;El3OpB9<_!%ZAkl)TU)t!k;p0D<(FRU%8m}5E1=Z-G$gDZkv$&@) z+?>+axiT^%il@ZhjOU&5u62rXm$xcB`So_U_wByNB@8PB-mlc^`|0`adc6Jjo$KWt zJ@%d0@OB5k;M^+;i>BpvJigJ=@hPjh|6Zc~_YVEfK3pf|ZV7a6-sLC})f=Y2J#a;9 zZ`t{r(qEa!xtHW<^_6JZ8RV->cxN8!of23uy+m-Pi&N180Ve_fWf$Ik`&qV<Yl>?-^JPSwoY8jt(!Komw88Iq$)yuDnb*H9xS{tl$s({%QE1X~XC=AzWyeoEU2VQ2^V>;n{dp~` zP8d{){aV&rww=FIpr_AYVe(0b>sytDrhYiMj_=`ygfG7y%u&5&#`QC8wJW29z{;8b z674TFKbkyy_59tgHuq)36&YO^*KvBb-FO!p31hrIKR`kH~rhQvQ(OyyCVPXmX&+7)dF9?4|WX<&8X^$*i`I#XnXmRj#VTmIwGb$-V5hYu8O&Yb6DOw?iFW-d6#a89sIP9@UOXy$=CcYH2! zuc&hChkcW$eB%=Av@ zDgSQ+cNZCnOFJBwD>3}2Gf4cRyEP)OWxJT!lU}E(OD0>X9dlcFq`0Hy z$x9~PMj#ZX3d(D^JDk6x@~qfTDjwI{=WzD@wz$YZ;qX{ zKUV*-zfSu9m;HZi|HRk-SbW&-iJ;)`Q-$I}4le49E^n8x7`nbLJhyq>^W!?VT@!aJ z-ruv`PkSrdvSrIAp6zY$x~OyVvdeW-gJT(6GYbsP&zAAc+UX-S?JeK81?7$hI8m~@che>KQABLk5mW>ZcJDH zpmSoCo{WG+^ZQ7priU{7Zns~~Zw!)Lca@Qwxn%eH_&-vt-Z&tdHSWilXcdM zzI>H7ucEFY#Hi6lsV?L9vias5ODCvuYG+HIx;u5z``u>VM@%dycP);3uMod#alYjQ zPG%L!<^Jay3;6e4ZeQ}^LoD~g_Xo;7+W4t3wylbAzgUAITZ0U+Jt9i9J7b>b?9c&Mi5&@z?8ls18U+lFG5uI4u;}8% zHHF{rUFyoUzVi9+vWuI=|NpfAAMUukK-2-`nf~V=bzVAmc*rR^y)-yhd;Rmu$G?_b ze6ykTscFtr?<<>hCV3p0=%wbM>}XkF66?J6)`7c6OLty0v^j3}bfV8B4cml?^%HU%mhT?|tN4URHi%Hh;?sMlT#=$SRAO4J2`5xcI339DV&#XPQIK` zR;3Ysdqa+RZyNV1mm51LCr?myYC0f#=%Mw35I2b(95&SjMdDut0v~U1;Anh5Lut|j z#fS&ojfJ@t+Za8=1b^v8JUCp;BiQ(ZujY8mBGs0NjRgVnoD2dj4-fq7EG~Ga_@(Mr z+1Aj#b>(-z+Qb(howo1R{vU_s7Y6T;;`BVS@o}Z7P{MVcb4?nD?z3(G7^|_wvxIDNyK~#3%Wp;~p70nN^ z!ifq;4wqLY>|;Ow^5A!!4Hw)cI@Y%uv~V!<>wIu@R_;?izj*@B&DVBOZ30udl5_5UZ;rcf za@K3B-uis8DcR=lS6t7#qqrvzB5~_(^tD^JKwJ_^~Ikv94lOyom7rRI=G%y7KsgSKGE3vZ-Im!8&~alk*$IZ z^Detf?07Jzvp=!J;LAa$c#+4>_2qRftxBgJKHM;~`^}Sm77QQe{_4`X7?Zd=F@FE% zi^+3t%O2jvcc9lr<&lLD=gH>}Z{&*WF-JU}BmPIBK=-!dvQ*8dUb&!ob}u@W8A> zqwv_CMtiQio4bpDu%|zmQ+SSpLCJH6p%oL0_dVMccfa(`g%@8vmWG92GynAI&?l|P*!wPvFS<#zc^pX&2sIU&qV6(D zwI{{+#aG`=p&IRL(<5%k2!@O1m+Z;lVE?YDBq*ZcZmPvO9Ok; z9y5z{0qq3MBh{`h*1Nawee<_mDR84h?&gSa^X{#s$G@60u6Zy+e@|D1UFW$Xd-=B5 z(^DVbdl}ucakbm}?UHS0KK)g=Yg%B>c%&!J|JIE&kH76z)zMj-RGZBG z)lK?=gVHkRP*FvVi7WoZa41U1OFOE~UDlhXowI$`lDlsw&&xbqSX&V%aK@)^Lh!YmnZMKJpobWLThKfx((+?ZOe6aaH@2y4d`Om4YVG(-MLpd6+ zy(^iZpOc)K%FFG&`h}G3jA^X5%M`qYR3e4)wh8jL1a)RjxbpWAEoRYp~`C=YNYu&^D_TOuN6lrD8_?C3TcX}bil{r_|Lmsq=o18Pc7XX^Q}oscd|adUQj8^W?z?jyhLvy(#OB?)F|i{q@;% zYKmK?o=lmc}`Ch&-9&&{`G;oCm7&TdVr zylA599C+2wYU-m^tB&cM4%_9%|J9BA_3TO!Z_$u!UX$qDk{-EBD^-$qu}Ll6>%ie? zH1&wK{$7VmD@9gbk;>R={X(iX&rfnqoUVedv$x- zTZxu{=+ICl&q+cp3-7#?x}h~?!%Y2!_ss=a7$0qv*mTop$~&nAtF+F|wQP+s^X{2< zw0Gaz*~^|X#~A6h2RKdec_C3!WXr=}9Z=r&o&UG-u4M_kZ!Pl9UK+PMyG&u(9qaa5 z9%ZF(-5wtE?95!U7K^kkOpFX$eEFqV^xJc77hjt;O)%A*S~XAp#8)@(xTv_vdH186 z62BajY|gcQ(Br&FWRi>gw^hF*l(dDOr7btKGjrlloV4bZjojsjyY!@Tn~jfoSV^|8 zI`zBu`gduM8igLiHP2TsiOAcv)N3`%!{^&tSG?<#7(vvYgT(W$0Sx>ZYh<%(|dB<-rZ zasK&*38Ji%g_8q9TTe_93H_qZ(ipSr{-Z_;TLD$+Ql?J2TKY4L`; z2Tr9`CI_fTwrkvRcd_~G;#9Pwpo4Foo=aif4z3+%B(hl?H$3}Uce&K|YAI;5vbKo# zrBAP{VqrxjAb0`^7=; zH?2*Y8S*+;s*UI447SKg^W4e`()m&?{DXANf4*J1R(sl8Jx84|Zoc0)TwUIG zPfV2zp8VLt(3sbAkwtA$-yADT_442AVlrn%+`aScZC~TOOrgj{0imp?4qx||n|^m* z;<<}&BU4sK#OsF5%I&xk_J2cvw9An?0nU>bQ(wHl+WH|Qit)n3Ij0j(JlL`Bs%cf; z+KZpOZ(mKQ-F!l8E8E#6K_w>BTQ^;Aduk~t=ERZoQ9@1q*aR;%153lU$?9o_RWc~f*a*s zoId3oP$-L>qIg8L<%acro~8qDzWeTvS{;3Qwe;TC+r>^C3yVurT+Gn^*n*>pVNS6| z*Qb~cF2$7Pp;q%clFO=umiy0Zkn5f}@1^kZ_M2~|;F;BM5dwW;&Z8evwB@721&j~)gX`;T!P0&ol zz4rN^y64|b;P%eW$yN5(nrij2nPHCMktC}Xe=gizectBq&B>dWKP&v#YMfG3CmR>-zfH+tzPyt4|->DqVhJ zt#$X67hhK{(@>G?b_{&-T*-^Ea4ZX;@6vJuD!U>?LOO7 zjYqq}e?%If6jTz;E%dX?#}N`~!%Hw9mPi@)U-Uq4HH{hck>%|7jWyJO*^6CuH(zxFKI z$KU|kykf3>ex8M^uK9;`ar>R~?!+#B{ZmWlxU-gE^D@nTEsev8M}Hr(aNl{&ZR4FU z+)tme9Z5(^(U$*sMws*D$AlM7x0@|2W0?wAoqS|Et|jq1MO=9O^>FXmn*Wde^`-Oo zeh&QjXlnFNx7!)ZgEHfTMM5X0w%V}^f7zsyn4;o+evX}L`iqtZ2jG+8yj-Ad#GBn>{zGOwd=7+WWl~$2wb{{19>~smgV_5~$O0bBb%noj3#A=0!M^C&T#5~$ya5&EHN)_R$ouACkw+2{_BMvt1r9n&R%r) zt@6wc#koE98CG@gmDc?JC%;t0@x+Eb8_#a<`dYI-f4%b`**%Br{s{{DANpvc?ZPAJ zcW%34*JoXZ(vCxat{z;=rogSJ!Pp?vpn1L2-F*9}TmJWImjC@LzkhE*eqnB4VDi%x zB~A558)v9^|ISM&z2PC`syF-KolfDDl#(8XIqi+dZSSkso^H&vJdrxd<9_|~li{5m z{f)aftU9&AoOg}57WY-R?^-Pz+?|BL;s2SrdByZEihePNo&IvU*rqZkIh;F`chHVa zA^rBZBbPpL?fZLIK4ky*!{*#itFpDH%NCmWdU^^4K1~)`dSX*ciB;>)ot9_j+qhb! zTzfA$rz!A0|AkjyCi)$l*ztP7mxWm#j4cy7_DHbLnk%<+cZi1g>9f@gd5W97IxCJ@ z+NC#i9B*~J5@@Cn6n9-gX_{_F#!_|#M!~HryYJ?Gy4*egqy4|l??d$J%92l)G8<3q zP=EY!#)c2%vu@H$%OL-Q1um6QC``+W=Ju7;fP^PilP*V7VHR^?`GQf0d| zB(q5%p+@C%=)Bmw2ao^wAaC(pWQR zooorByFY8&HRwFANvYoLbFcEf)9cCS*O^+kot)HJp*7t%u%O}6;f;Cs{Z%@XYI0i6 zoH?f5nAGn7_8_6)&88cLjBLM_HShMWT=QI8diCt7=M{Es zTeR>$Jvd zZPtBT_SNnT$g5#dJQtXy4GC5EqpdRnZ!#3fE{d@E^8b@$^5&&)H`Tv9)tk02g0sf{ zf|~lVDLHDjH~OpNJyagem@`Y|Y}oNr;#?`4BPLt0pPMtMX<3)(JGc8zD{rZ-Z1MYM zreqSurWY4~Y-;rCb60O?m**Vc&9?D@)-2`Die;TGDvt^i1y;`1YB~GYx1(~ZN`v9~ z&o7QWn^s$1xb@*r#o6;@{QG*Jz1TeO8B;@!TJOu5mgNuc?Jd|H6Ixx%zSD)rLS8)mv^$Ta(A)0?BXP}QJyC@ z-&&wpu(adaL&L)cUrvYThh5*^HTUMsmv`QrS)yaB{PxhC;(~MUqaUAK5?pjXV|I7< z>5u!KHZ(l=GgIsDSU`TP05r|ONq?D(C3BF_}rO!9dlaZ+ufuX@0`truT?QS=s)%4HU}+uh!J zRcV`7=@akXrAbSF9#fFI>9A$H?IQ^RPR}Eb0uD>|TvJF3IL6TP^s{T(<8w*2a^1_9 zskwa((W+cxy^Eva=u^`t-M44VpZ#-=utBm6H~04`PnWu`%(pu70yFfvS{LuNN`0IYC%DL{$Q-gT z;(us0hiSsw@4q)r-O9T^EdQALG54iAZ)(c88hbc#RPD9%da9*!8`Q*0+QsLjsdY8% zXS@BM#@kujH}{t5_q<$XZaR%OcxAHYtQ|xUZphMS!}9{QlGrL`Er3mnTZTb82|7!)bl)e^5x2vFXsFH zeY$f0=iU2i_5Z)uv0n}rZvQJ`?=HZyqwKL>-n~eUZCy{xt{a4hn{&P2|MOY2?YW;C z4T2rpp36I)xpISnS@Ymh1Spr#v3VSTe!X5~^&k{Iv>ECey;rsi; z^G%wje${=tJip%HTF%yw{r?Z%Kf2RcedB!HLw%2xIGj};ZFFCE{KTdn!+K|&CSd-8Y(&J*J!mIe5(HA&%e@tt-m{6R31eLFWsiZ$IQ>%Eqd&R=H)FbR8Dpp z@LVn1-92MnVu}j4Yu%^UGUqI}eR9po5nG_aHR+`L_Uz8%$shhK_{IMJ+yC2TvENxc zR;=PR)Gro2km_=*TkyOgC>4n5xx7^oZhN>Q^|qhVL=TH~tIK(rrv&u$q%6$7C4852 z;i80n+h)2ijbcuhSs5bqX>o^$;)~g3pZotku`WHm$xT6uJ&$n*i=xW2MENrv9fwtf zCUqP>axlSo@$;WS%d;yOHa&>Z4$scmzI(>ZSq@5q^^2@Mk0eh};r!~xz54a+jPhL) zvL`twR?YAcSIjWkz1054;s5I&>{`dSao-PShWAc4j<~qkTz7F2Dx6`^Vdc!)@UAj$ zPyVeIX3g`Tw`Q$v+?V?B${(3WACJF(F-e7UXO7fK7nwSN1vj%6Up8HkDW&4HknfC` ze9P;f74HvC?XLfnUZ3f}alf= z1D$>ML-^b*ja6MSX3U<8Ht0xitrDIh)YISFWXN{?s{@B%_bQHqY5Q90e;=>k`EBm| zzbnp4csniG`p)6T{_p(154gI>uqr8bT4)(`oH)WLU~ue$x$n&vv#)G=Q?WeRV{IAx zB%S0E74Dy&x0*Q{*R9l;o~|*V^4*9{cNmUwu`|yeIF>_gc1(|5h;mP&{H%CwQ^$ zYe$E^AgAY%z+=r8mF5a&dVTDU0@>TG|0<+RTBY&v=T6BvcBPLtu6?2E=_Jt>5fOFt z=;`aar#IPhe9Us}IAP6T$9lo~O|zh2VF;+|USYgt(fuZm(o~D*hPMk}&-8JVJeeA# z{`|Sz>0c=v3q_U|O})RPGJoN{j65fwwf}hzvze4S9Ps5I$BfuYi) z=V1LU+#6#Hq#LfhmCD+DHCMaK>e9=S%PUiuly|;atb0<4w%=hx9S!>U&w_f+%Y5DEoxcaxMD#4x& z^{sq7%Hrn&wZb=sYJ^(d&67Q}X(?ZzdS^#R1;?Tel}C|F**6As&0N;`wYO&VZR6_L z#p2)pI>^hP_1qZ2(-KqwI)g!g<-^~DXFn%?`4tg)`#^u)r?~gK?Q1^gEx)|d!Nq#J zpye+&7aNm{ZAUuN=bALEXZ+#H@O;wACs$VM@3;6hd;dpmQ&p(;d0~BDYxIRzTTedxBN0&f$$=`Pqi*iLV_PJfQlZO6HGr|GsLkP zFemUhRF#yNSd@Nhu{O4y`ZcE9>i)1~|#do_K zPW%G}6DW>%7_dDsXV}B=fTh8cL6c+oz0eLz5mtvu0!F7S!x>ZQhAhIONEn^V%s&Y2{RNjEEagQi7WABkef)Si;ImBD1(|m zVpzs-hDoBm!$VAA5l`RUX>m*!a}FsUNzJGg+WN=M#YPFF%$>vKu1fP=-JZZ*T1rYv zN{=Qk?1;Lf3}TXn`R4zZ_wnjtJTuY%JOcxRYKdz^NlIc#s#S7PYGO$$gOP!ek*=Yk zu7P2Qk&%_5iIt(Hwt<0_fq|aOxi=^pa`RI%(<*Umh?gu2U|?X-fZI@#nVVW%l9*e7 zrpL(K${1>i#h=~}3=9lvAU&DM$yUkv1(ija=@}&qe)$S;j*dcUajHUEQEF;Vk{ zniv=uWMMi|Qj3#|G7CyF^Ya*rgWR1Il1ejkN^~>x9=D!6%D}+D;OXk;vd$@?2>`&3 BeK7z4 literal 90158 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

Cj0m`?Y9ohuja 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 z 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 literal 90624 zcmeAS@N?(olHy`uVBq!ia0y~yV7$h_z&MM8je&t-Q$vz31B2|ss*s41pu}>8f};Gi z%$!t(lFEWqh1817GzNx>TWe=Umc{Ix>iXZXON!|iHxK*UC{t$s{ofn|PE9dNot`sU zsk!T!?E|yrj1SJ)|NFk{|HIQY`Fi5nTd%+RdCK;?#gD~5&tI?D-+cc4_usd^zFz;~ z@#l5@>+O~MJCA>juik9$pEz&5W?k&})<*f|@h9(X-5>wt`Tum~s@)$_x;`$M zV6#8CYd)jOUzh1^aSzJ99P^(9o)4+}ePzF!lfyqfzx(?u=I@ru`ghy>?}VxE>;Fz! zTf0B$OYyd%KULnpG*5i}{rJA!d#9hj*X+6Q|K+)zwfd9g=dCyHIp0y&wXg2o-M9NJ zjk_mmFI*Qt`Ip(z@8a)g-*MWW*S9b<|Br}X;``m7@2+^|dTm>L-KV`y{1eyQnQ)j- z`A)&T$6Vct&njX}{&f@{{W34-WKw^3PwSMgvUyvsT=whjSvURLoJZd`wv^v~H@&(% z`%WeMJt<~!?p59Q|Ca6l-B^8byMKNe=eGTN4jns66Act6GHwzJ;xw)3zUZVd zp_hfXO)j`^GEYm;qqGTz%R^53cJDHk-}vF4l=qX&+HuOWE7+ zRlQFxIDc>|`+T`Qi9M3(vns{RUvIgYHa|JgPJ8{PSDUVe#U~%1YxZN~>uq<-?mupE z)|^{&YUOc1>%TqTEAKwZ+xPTZ_V&AV$G@+sUHVo3{{D$uKTO^F!)U4bt?z3-uDQA0 zo8_Qq;5mfvj{_f{{B4D2Uvw7NJ`vw!aeCh3Eb&zHQIz4pl?z2c|7KYLbfNcSie{1o?M zTj`~{Px>qlU${P*b;Yf;#yVq1jiVPL%~fZVo!k9+@60+`QHQ3&*Acth?uZv}@~f1r z%D-y(mdSs6MEugD1s_vyAQ_OdVGZ|4LsO%HnYEZTDEvNAnZ-yP5N z(#-;9O=FkfP}}Gd5s<2}?a~iT?ue7@EHSfhu93RUseDji>%FtklrdK^uQaWfKDj(zL_C|3| zzg&juduyIejb3zC+TmXH4W7I<52xUJ$=6RXgr5_!%f0C47`fBy`s9U^9J8!8YFG-h zPCt|I@1oe74TUX&eUO$@BJ zIep<7&lj-;8;`4`iq_q#ymq*jW7hn4X3CSoFC-bOD`?JVzB1?HLh+8tm4_64jpIvZ zDSXW7lK#6wO^#nRaO?elKc@FjH_CL-5cPf##XI};mYjugzm8Z(&3W}g<5tY&o2g${ zKV!e}?2e7;?{kIcODmc-=rX+wRZg1ayihh^@m*Qjn@baxtAFEN(y}36|Debg)|{Co z*A^{(ah!RML)_LiWkGD$y5($5IS%YTv$S!JZ=uiq#^*hM8>cf)wdSAW>2+;W_7vwG zwbQpeR()1_HSzd4qgF1(_pc$Nc))XVM_w!s??1in^3tnD@V?&6vlNyd3Nc<9{L3U$)GE0`Z%-b3c!{_BhetXqSlbRw zIN-GIRL8+TDZfLi`s=ScC_Q7T)v3BN!)ezZ=?U(#9b4wCVmx4X`}?fubPpTF&x}(i z{b!sv=|f@k`WEITOyW_B7P5~8XGFWE3Dla0ch9=Z_96b#@(;TlR)6L5=l@)jHcR_{ zM}KCFo=MQPQvHL{+PJ49cWEPPaOu%yXn`+;>68C!0bEiEo;@mpkC zXfVr3#Q&;wXR5F>R)=MWsUlmYW_USqE6#J2JYYm$GL;pKh6}A=#^`T zXEMCR#B{E4)AOJ++>OAL@^f`Be=5h5hDn`v(ZN9@kL5O*~ z`={7=eMx@q`4Wl7bL3u3O_=YJKDCfV?Vl;XDqr-$tv_!%xw#ls2pisuvbS8(I_J{uuGKE6~ist@ie51BVcba2s{N^wG z{d{4^CZ?sa?RT3Xn$P`me&oZ%ClGe&o|A?Q7RGqffaU<8g zPpbuzHqALvn7x%PU_;s$nJfpT2@e9bYvq42N-a7Qv%GH7hPD0?f@!waNfw`+=A4^p z8^wrt_kV7Beyyr$D~jAga0uFlKKjYix)9#Zz{maTLBa!)+25j-dq$*R_W;#biM zofBrBtwsE45~ozeinfiFA7wdr_*V*UxWZHZ_^6qJds@IYOC7p@J zFM6h(>Xox+5cRtKkj+|Dap_&tgA4Ie|oHeaoNnU3x7M!KJs2+TxliLe(lHM<{c|Gws2(T+KDVw-oCJgV_T+S zYTlHauDjp1gtC@+Dmtl8p0N1Z;=9#T=ij|hf59qJe;&gep@m%e7g^5~X9)aU`0f

H?a^Sa`+O=koO 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 diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 44421d3bf..822c69b0d 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -341,6 +341,9 @@ void LauncherPage::applySettings() case 1: // rory the cat s->set("BackgroundCat", "rory"); break; + case 2: // rory the cat flat edition + s->set("BackgroundCat", "rory-flat"); + break; } s->set("MenuBarInsteadOfToolBar", ui->preferMenuBarCheckBox->isChecked()); @@ -439,6 +442,8 @@ void LauncherPage::loadSettings() ui->themeBackgroundCat->setCurrentIndex(0); } else if (cat == "rory") { ui->themeBackgroundCat->setCurrentIndex(1); + } else if (cat == "rory-flat") { + ui->themeBackgroundCat->setCurrentIndex(2); } { diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 3a4e7da4b..0b36652c2 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -371,6 +371,11 @@ Rory ID 11 (drawn by Ashtaka) + + + Rory ID 11 (flat edition, drawn by Ashtaka) + + From 7956e6f04e32448b0043a49ff08873e117ba0a0b Mon Sep 17 00:00:00 2001 From: flow Date: Tue, 1 Nov 2022 19:48:26 -0300 Subject: [PATCH 0085/1149] fix: don't use forward-declared Ptr types in meta/ This would cause ODR violations when those headers were included in other places that also included stuff like "Version.h" (note the "meta/Version.h"), which can cause problems, especially in LTO. Signed-off-by: flow --- launcher/BaseInstaller.h | 5 +-- launcher/BaseVersion.h | 5 ++- launcher/BaseVersionList.cpp | 10 +++--- launcher/BaseVersionList.h | 8 ++--- launcher/java/JavaInstallList.cpp | 10 +++--- launcher/java/JavaInstallList.h | 6 ++-- launcher/meta/Index.cpp | 16 +++++----- launcher/meta/Index.h | 17 +++++----- launcher/meta/JsonFormat.cpp | 18 +++++------ launcher/meta/Version.cpp | 4 +-- launcher/meta/Version.h | 11 ++++--- launcher/meta/VersionList.cpp | 30 ++++++++--------- launcher/meta/VersionList.h | 32 ++++++++++--------- .../minecraft/VanillaInstanceCreationTask.cpp | 2 +- .../minecraft/VanillaInstanceCreationTask.h | 8 ++--- .../atlauncher/ATLPackInstallTask.cpp | 4 +-- .../atlauncher/ATLPackInstallTask.h | 6 ++-- launcher/ui/dialogs/VersionSelectDialog.cpp | 2 +- launcher/ui/dialogs/VersionSelectDialog.h | 2 +- launcher/ui/pages/modplatform/VanillaPage.cpp | 8 ++--- launcher/ui/pages/modplatform/VanillaPage.h | 12 +++---- .../AtlUserInteractionSupportImpl.cpp | 2 +- .../AtlUserInteractionSupportImpl.h | 2 +- launcher/ui/widgets/JavaSettingsWidget.cpp | 2 +- launcher/ui/widgets/JavaSettingsWidget.h | 2 +- launcher/ui/widgets/ModFilterWidget.h | 4 +-- launcher/ui/widgets/VersionSelectWidget.cpp | 6 ++-- launcher/ui/widgets/VersionSelectWidget.h | 4 +-- 28 files changed, 120 insertions(+), 118 deletions(-) diff --git a/launcher/BaseInstaller.h b/launcher/BaseInstaller.h index b2e6a14d6..a1b80e93f 100644 --- a/launcher/BaseInstaller.h +++ b/launcher/BaseInstaller.h @@ -17,13 +17,14 @@ #include +#include "BaseVersion.h" + class MinecraftInstance; class QDir; class QString; class QObject; class Task; class BaseVersion; -typedef std::shared_ptr BaseVersionPtr; class BaseInstaller { @@ -35,7 +36,7 @@ public: virtual bool add(MinecraftInstance *to); virtual bool remove(MinecraftInstance *from); - virtual Task *createInstallTask(MinecraftInstance *instance, BaseVersionPtr version, QObject *parent) = 0; + virtual Task *createInstallTask(MinecraftInstance *instance, BaseVersion::Ptr version, QObject *parent) = 0; protected: virtual QString id() const = 0; diff --git a/launcher/BaseVersion.h b/launcher/BaseVersion.h index b88105fb6..ca0e45027 100644 --- a/launcher/BaseVersion.h +++ b/launcher/BaseVersion.h @@ -25,6 +25,7 @@ class BaseVersion { public: + using Ptr = std::shared_ptr; virtual ~BaseVersion() {} /*! * A string used to identify this version in config files. @@ -54,6 +55,4 @@ public: }; }; -typedef std::shared_ptr BaseVersionPtr; - -Q_DECLARE_METATYPE(BaseVersionPtr) +Q_DECLARE_METATYPE(BaseVersion::Ptr) diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index b4a7d6dda..4ed826123 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -40,20 +40,20 @@ BaseVersionList::BaseVersionList(QObject *parent) : QAbstractListModel(parent) { } -BaseVersionPtr BaseVersionList::findVersion(const QString &descriptor) +BaseVersion::Ptr BaseVersionList::findVersion(const QString &descriptor) { for (int i = 0; i < count(); i++) { if (at(i)->descriptor() == descriptor) return at(i); } - return BaseVersionPtr(); + return nullptr; } -BaseVersionPtr BaseVersionList::getRecommended() const +BaseVersion::Ptr BaseVersionList::getRecommended() const { if (count() <= 0) - return BaseVersionPtr(); + return nullptr; else return at(0); } @@ -66,7 +66,7 @@ QVariant BaseVersionList::data(const QModelIndex &index, int role) const if (index.row() > count()) return QVariant(); - BaseVersionPtr version = at(index.row()); + BaseVersion::Ptr version = at(index.row()); switch (role) { diff --git a/launcher/BaseVersionList.h b/launcher/BaseVersionList.h index 80a91e8f5..31f29022a 100644 --- a/launcher/BaseVersionList.h +++ b/launcher/BaseVersionList.h @@ -70,7 +70,7 @@ public: virtual bool isLoaded() = 0; //! Gets the version at the given index. - virtual const BaseVersionPtr at(int i) const = 0; + virtual const BaseVersion::Ptr at(int i) const = 0; //! Returns the number of versions in the list. virtual int count() const = 0; @@ -90,13 +90,13 @@ public: * \return A const pointer to the version with the given descriptor. NULL if * one doesn't exist. */ - virtual BaseVersionPtr findVersion(const QString &descriptor); + virtual BaseVersion::Ptr findVersion(const QString &descriptor); /*! * \brief Gets the recommended version from this list * If the list doesn't support recommended versions, this works exactly as getLatestStable */ - virtual BaseVersionPtr getRecommended() const; + virtual BaseVersion::Ptr getRecommended() const; /*! * Sorts the version list. @@ -117,5 +117,5 @@ slots: * then copies the versions and sets their parents correctly. * \param versions List of versions whose parents should be set. */ - virtual void updateListData(QList versions) = 0; + virtual void updateListData(QList versions) = 0; }; diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index 0249bd22e..155c956a2 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -73,7 +73,7 @@ void JavaInstallList::load() } } -const BaseVersionPtr JavaInstallList::at(int i) const +const BaseVersion::Ptr JavaInstallList::at(int i) const { return m_vlist.at(i); } @@ -122,7 +122,7 @@ BaseVersionList::RoleList JavaInstallList::providesRoles() const } -void JavaInstallList::updateListData(QList versions) +void JavaInstallList::updateListData(QList versions) { beginResetModel(); m_vlist = versions; @@ -137,7 +137,7 @@ void JavaInstallList::updateListData(QList versions) m_loadTask.reset(); } -bool sortJavas(BaseVersionPtr left, BaseVersionPtr right) +bool sortJavas(BaseVersion::Ptr left, BaseVersion::Ptr right) { auto rleft = std::dynamic_pointer_cast(right); auto rright = std::dynamic_pointer_cast(left); @@ -210,11 +210,11 @@ void JavaListLoadTask::javaCheckerFinished() } } - QList javas_bvp; + QList javas_bvp; for (auto java : candidates) { //qDebug() << java->id << java->arch << " at " << java->path; - BaseVersionPtr bp_java = std::dynamic_pointer_cast(java); + BaseVersion::Ptr bp_java = std::dynamic_pointer_cast(java); if (bp_java) { diff --git a/launcher/java/JavaInstallList.h b/launcher/java/JavaInstallList.h index 3c237edf1..733dc7e1c 100644 --- a/launcher/java/JavaInstallList.h +++ b/launcher/java/JavaInstallList.h @@ -42,7 +42,7 @@ public: Task::Ptr getLoadTask() override; bool isLoaded() override; - const BaseVersionPtr at(int i) const override; + const BaseVersion::Ptr at(int i) const override; int count() const override; void sortVersions() override; @@ -50,7 +50,7 @@ public: RoleList providesRoles() const override; public slots: - void updateListData(QList versions) override; + void updateListData(QList versions) override; protected: void load(); @@ -59,7 +59,7 @@ protected: protected: Status m_status = Status::NotDone; shared_qobject_ptr m_loadTask; - QList m_vlist; + QList m_vlist; }; class JavaListLoadTask : public Task diff --git a/launcher/meta/Index.cpp b/launcher/meta/Index.cpp index 6802470d9..eec1b329b 100644 --- a/launcher/meta/Index.cpp +++ b/launcher/meta/Index.cpp @@ -24,7 +24,7 @@ Index::Index(QObject *parent) : QAbstractListModel(parent) { } -Index::Index(const QVector &lists, QObject *parent) +Index::Index(const QVector &lists, QObject *parent) : QAbstractListModel(parent), m_lists(lists) { for (int i = 0; i < m_lists.size(); ++i) @@ -41,7 +41,7 @@ QVariant Index::data(const QModelIndex &index, int role) const return QVariant(); } - VersionListPtr list = m_lists.at(index.row()); + VersionList::Ptr list = m_lists.at(index.row()); switch (role) { case Qt::DisplayRole: @@ -81,9 +81,9 @@ bool Index::hasUid(const QString &uid) const return m_uids.contains(uid); } -VersionListPtr Index::get(const QString &uid) +VersionList::Ptr Index::get(const QString &uid) { - VersionListPtr out = m_uids.value(uid, nullptr); + VersionList::Ptr out = m_uids.value(uid, nullptr); if(!out) { out = std::make_shared(uid); @@ -92,7 +92,7 @@ VersionListPtr Index::get(const QString &uid) return out; } -VersionPtr Index::get(const QString &uid, const QString &version) +Version::Ptr Index::get(const QString &uid, const QString &version) { auto list = get(uid); return list->getVersion(version); @@ -105,7 +105,7 @@ void Index::parse(const QJsonObject& obj) void Index::merge(const std::shared_ptr &other) { - const QVector lists = std::dynamic_pointer_cast(other)->m_lists; + const QVector lists = std::dynamic_pointer_cast(other)->m_lists; // initial load, no need to merge if (m_lists.isEmpty()) { @@ -120,7 +120,7 @@ void Index::merge(const std::shared_ptr &other) } else { - for (const VersionListPtr &list : lists) + for (const VersionList::Ptr &list : lists) { if (m_uids.contains(list->uid())) { @@ -138,7 +138,7 @@ void Index::merge(const std::shared_ptr &other) } } -void Index::connectVersionList(const int row, const VersionListPtr &list) +void Index::connectVersionList(const int row, const VersionList::Ptr &list) { connect(list.get(), &VersionList::nameChanged, this, [this, row]() { diff --git a/launcher/meta/Index.h b/launcher/meta/Index.h index d33ab0c89..06ea09dcf 100644 --- a/launcher/meta/Index.h +++ b/launcher/meta/Index.h @@ -19,20 +19,19 @@ #include #include "BaseEntity.h" +#include "meta/VersionList.h" class Task; namespace Meta { -using VersionListPtr = std::shared_ptr; -using VersionPtr = std::shared_ptr; class Index : public QAbstractListModel, public BaseEntity { Q_OBJECT public: explicit Index(QObject *parent = nullptr); - explicit Index(const QVector &lists, QObject *parent = nullptr); + explicit Index(const QVector &lists, QObject *parent = nullptr); enum { @@ -49,21 +48,21 @@ public: QString localFilename() const override { return "index.json"; } // queries - VersionListPtr get(const QString &uid); - VersionPtr get(const QString &uid, const QString &version); + VersionList::Ptr get(const QString &uid); + Version::Ptr get(const QString &uid, const QString &version); bool hasUid(const QString &uid) const; - QVector lists() const { return m_lists; } + QVector lists() const { return m_lists; } public: // for usage by parsers only void merge(const std::shared_ptr &other); void parse(const QJsonObject &obj) override; private: - QVector m_lists; - QHash m_uids; + QVector m_lists; + QHash m_uids; - void connectVersionList(const int row, const VersionListPtr &list); + void connectVersionList(const int row, const VersionList::Ptr &list); }; } diff --git a/launcher/meta/JsonFormat.cpp b/launcher/meta/JsonFormat.cpp index 796da4bb6..473f37d66 100644 --- a/launcher/meta/JsonFormat.cpp +++ b/launcher/meta/JsonFormat.cpp @@ -37,11 +37,11 @@ MetadataVersion currentFormatVersion() static std::shared_ptr parseIndexInternal(const QJsonObject &obj) { const QVector objects = requireIsArrayOf(obj, "packages"); - QVector lists; + QVector lists; lists.reserve(objects.size()); std::transform(objects.begin(), objects.end(), std::back_inserter(lists), [](const QJsonObject &obj) { - VersionListPtr list = std::make_shared(requireString(obj, "uid")); + VersionList::Ptr list = std::make_shared(requireString(obj, "uid")); list->setName(ensureString(obj, "name", QString())); return list; }); @@ -49,9 +49,9 @@ static std::shared_ptr parseIndexInternal(const QJsonObject &obj) } // Version -static VersionPtr parseCommonVersion(const QString &uid, const QJsonObject &obj) +static Version::Ptr parseCommonVersion(const QString &uid, const QJsonObject &obj) { - VersionPtr version = std::make_shared(uid, requireString(obj, "version")); + Version::Ptr version = std::make_shared(uid, requireString(obj, "version")); version->setTime(QDateTime::fromString(requireString(obj, "releaseTime"), Qt::ISODate).toMSecsSinceEpoch() / 1000); version->setType(ensureString(obj, "type", QString())); version->setRecommended(ensureBoolean(obj, QString("recommended"), false)); @@ -63,9 +63,9 @@ static VersionPtr parseCommonVersion(const QString &uid, const QJsonObject &obj) return version; } -static std::shared_ptr parseVersionInternal(const QJsonObject &obj) +static Version::Ptr parseVersionInternal(const QJsonObject &obj) { - VersionPtr version = parseCommonVersion(requireString(obj, "uid"), obj); + Version::Ptr version = parseCommonVersion(requireString(obj, "uid"), obj); version->setData(OneSixVersionFormat::versionFileFromJson(QJsonDocument(obj), QString("%1/%2.json").arg(version->uid(), version->version()), @@ -74,12 +74,12 @@ static std::shared_ptr parseVersionInternal(const QJsonObject &obj) } // Version list / package -static std::shared_ptr parseVersionListInternal(const QJsonObject &obj) +static VersionList::Ptr parseVersionListInternal(const QJsonObject &obj) { const QString uid = requireString(obj, "uid"); const QVector versionsRaw = requireIsArrayOf(obj, "versions"); - QVector versions; + QVector versions; versions.reserve(versionsRaw.size()); std::transform(versionsRaw.begin(), versionsRaw.end(), std::back_inserter(versions), [uid](const QJsonObject &vObj) { @@ -88,7 +88,7 @@ static std::shared_ptr parseVersionListInternal(const QJsonObject & return version; }); - VersionListPtr list = std::make_shared(uid); + VersionList::Ptr list = std::make_shared(uid); list->setName(ensureString(obj, "name", QString())); list->setVersions(versions); return list; diff --git a/launcher/meta/Version.cpp b/launcher/meta/Version.cpp index a8dc3169d..68cfa55c8 100644 --- a/launcher/meta/Version.cpp +++ b/launcher/meta/Version.cpp @@ -54,7 +54,7 @@ void Meta::Version::parse(const QJsonObject& obj) parseVersion(obj, this); } -void Meta::Version::mergeFromList(const Meta::VersionPtr& other) +void Meta::Version::mergeFromList(const Meta::Version::Ptr& other) { if(other->m_providesRecommendations) { @@ -85,7 +85,7 @@ void Meta::Version::mergeFromList(const Meta::VersionPtr& other) } } -void Meta::Version::merge(const VersionPtr &other) +void Meta::Version::merge(const Version::Ptr &other) { mergeFromList(other); if(other->m_data) diff --git a/launcher/meta/Version.h b/launcher/meta/Version.h index dea8dc8a3..7228fa366 100644 --- a/launcher/meta/Version.h +++ b/launcher/meta/Version.h @@ -30,13 +30,14 @@ namespace Meta { -using VersionPtr = std::shared_ptr; class Version : public QObject, public BaseVersion, public BaseEntity { Q_OBJECT -public: /* con/des */ +public: + using Ptr = std::shared_ptr; + explicit Version(const QString &uid, const QString &version); virtual ~Version(); @@ -78,8 +79,8 @@ public: /* con/des */ return m_data != nullptr; } - void merge(const VersionPtr &other); - void mergeFromList(const VersionPtr &other); + void merge(const Version::Ptr &other); + void mergeFromList(const Version::Ptr &other); void parse(const QJsonObject &obj) override; QString localFilename() const override; @@ -113,4 +114,4 @@ private: }; } -Q_DECLARE_METATYPE(Meta::VersionPtr) +Q_DECLARE_METATYPE(Meta::Version::Ptr) diff --git a/launcher/meta/VersionList.cpp b/launcher/meta/VersionList.cpp index f609e94c3..7f001dfc2 100644 --- a/launcher/meta/VersionList.cpp +++ b/launcher/meta/VersionList.cpp @@ -40,7 +40,7 @@ bool VersionList::isLoaded() return BaseEntity::isLoaded(); } -const BaseVersionPtr VersionList::at(int i) const +const BaseVersion::Ptr VersionList::at(int i) const { return m_versions.at(i); } @@ -52,7 +52,7 @@ int VersionList::count() const void VersionList::sortVersions() { beginResetModel(); - std::sort(m_versions.begin(), m_versions.end(), [](const VersionPtr &a, const VersionPtr &b) + std::sort(m_versions.begin(), m_versions.end(), [](const Version::Ptr &a, const Version::Ptr &b) { return *a.get() < *b.get(); }); @@ -66,7 +66,7 @@ QVariant VersionList::data(const QModelIndex &index, int role) const return QVariant(); } - VersionPtr version = m_versions.at(index.row()); + Version::Ptr version = m_versions.at(index.row()); switch (role) { @@ -129,9 +129,9 @@ QString VersionList::humanReadable() const return m_name.isEmpty() ? m_uid : m_name; } -VersionPtr VersionList::getVersion(const QString &version) +Version::Ptr VersionList::getVersion(const QString &version) { - VersionPtr out = m_lookup.value(version, nullptr); + Version::Ptr out = m_lookup.value(version, nullptr); if(!out) { out = std::make_shared(m_uid, version); @@ -143,7 +143,7 @@ VersionPtr VersionList::getVersion(const QString &version) bool VersionList::hasVersion(QString version) const { auto ver = std::find_if(m_versions.constBegin(), m_versions.constEnd(), - [&](Meta::VersionPtr const& a){ return a->version() == version; }); + [&](Meta::Version::Ptr const& a){ return a->version() == version; }); return (ver != m_versions.constEnd()); } @@ -153,11 +153,11 @@ void VersionList::setName(const QString &name) emit nameChanged(name); } -void VersionList::setVersions(const QVector &versions) +void VersionList::setVersions(const QVector &versions) { beginResetModel(); m_versions = versions; - std::sort(m_versions.begin(), m_versions.end(), [](const VersionPtr &a, const VersionPtr &b) + std::sort(m_versions.begin(), m_versions.end(), [](const Version::Ptr &a, const Version::Ptr &b) { return a->rawTime() > b->rawTime(); }); @@ -168,7 +168,7 @@ void VersionList::setVersions(const QVector &versions) } // FIXME: this is dumb, we have 'recommended' as part of the metadata already... - auto recommendedIt = std::find_if(m_versions.constBegin(), m_versions.constEnd(), [](const VersionPtr &ptr) { return ptr->type() == "release"; }); + auto recommendedIt = std::find_if(m_versions.constBegin(), m_versions.constEnd(), [](const Version::Ptr &ptr) { return ptr->type() == "release"; }); m_recommended = recommendedIt == m_versions.constEnd() ? nullptr : *recommendedIt; endResetModel(); } @@ -179,7 +179,7 @@ void VersionList::parse(const QJsonObject& obj) } // FIXME: this is dumb, we have 'recommended' as part of the metadata already... -static const Meta::VersionPtr &getBetterVersion(const Meta::VersionPtr &a, const Meta::VersionPtr &b) +static const Meta::Version::Ptr &getBetterVersion(const Meta::Version::Ptr &a, const Meta::Version::Ptr &b) { if(!a) return b; @@ -194,7 +194,7 @@ static const Meta::VersionPtr &getBetterVersion(const Meta::VersionPtr &a, const return (a->type() == "release" ? a : b); } -void VersionList::mergeFromIndex(const VersionListPtr &other) +void VersionList::mergeFromIndex(const VersionList::Ptr &other) { if (m_name != other->m_name) { @@ -202,7 +202,7 @@ void VersionList::mergeFromIndex(const VersionListPtr &other) } } -void VersionList::merge(const VersionListPtr &other) +void VersionList::merge(const VersionList::Ptr &other) { if (m_name != other->m_name) { @@ -216,7 +216,7 @@ void VersionList::merge(const VersionListPtr &other) { qWarning() << "Empty list loaded ..."; } - for (const VersionPtr &version : other->m_versions) + for (const Version::Ptr &version : other->m_versions) { // we already have the version. merge the contents if (m_lookup.contains(version->version())) @@ -235,7 +235,7 @@ void VersionList::merge(const VersionListPtr &other) endResetModel(); } -void VersionList::setupAddedVersion(const int row, const VersionPtr &version) +void VersionList::setupAddedVersion(const int row, const Version::Ptr &version) { // FIXME: do not disconnect from everythin, disconnect only the lambdas here version->disconnect(); @@ -244,7 +244,7 @@ void VersionList::setupAddedVersion(const int row, const VersionPtr &version) connect(version.get(), &Version::typeChanged, this, [this, row]() { emit dataChanged(index(row), index(row), QVector() << TypeRole); }); } -BaseVersionPtr VersionList::getRecommended() const +BaseVersion::Ptr VersionList::getRecommended() const { return m_recommended; } diff --git a/launcher/meta/VersionList.h b/launcher/meta/VersionList.h index a6db2fd73..a4d5603d9 100644 --- a/launcher/meta/VersionList.h +++ b/launcher/meta/VersionList.h @@ -20,10 +20,10 @@ #include #include +#include "meta/Version.h" + namespace Meta { -using VersionPtr = std::shared_ptr; -using VersionListPtr = std::shared_ptr; class VersionList : public BaseVersionList, public BaseEntity { @@ -33,6 +33,8 @@ class VersionList : public BaseVersionList, public BaseEntity public: explicit VersionList(const QString &uid, QObject *parent = nullptr); + using Ptr = std::shared_ptr; + enum Roles { UidRole = Qt::UserRole + 100, @@ -43,11 +45,11 @@ public: Task::Ptr getLoadTask() override; bool isLoaded() override; - const BaseVersionPtr at(int i) const override; + const BaseVersion::Ptr at(int i) const override; int count() const override; void sortVersions() override; - BaseVersionPtr getRecommended() const override; + BaseVersion::Ptr getRecommended() const override; QVariant data(const QModelIndex &index, int role) const override; RoleList providesRoles() const override; @@ -65,38 +67,38 @@ public: } QString humanReadable() const; - VersionPtr getVersion(const QString &version); + Version::Ptr getVersion(const QString &version); bool hasVersion(QString version) const; - QVector versions() const + QVector versions() const { return m_versions; } public: // for usage only by parsers void setName(const QString &name); - void setVersions(const QVector &versions); - void merge(const VersionListPtr &other); - void mergeFromIndex(const VersionListPtr &other); + void setVersions(const QVector &versions); + void merge(const VersionList::Ptr &other); + void mergeFromIndex(const VersionList::Ptr &other); void parse(const QJsonObject &obj) override; signals: void nameChanged(const QString &name); protected slots: - void updateListData(QList) override + void updateListData(QList) override { } private: - QVector m_versions; - QHash m_lookup; + QVector m_versions; + QHash m_lookup; QString m_uid; QString m_name; - VersionPtr m_recommended; + Version::Ptr m_recommended; - void setupAddedVersion(const int row, const VersionPtr &version); + void setupAddedVersion(const int row, const Version::Ptr &version); }; } -Q_DECLARE_METATYPE(Meta::VersionListPtr) +Q_DECLARE_METATYPE(Meta::VersionList::Ptr) diff --git a/launcher/minecraft/VanillaInstanceCreationTask.cpp b/launcher/minecraft/VanillaInstanceCreationTask.cpp index c45daa9a8..0bb92e876 100644 --- a/launcher/minecraft/VanillaInstanceCreationTask.cpp +++ b/launcher/minecraft/VanillaInstanceCreationTask.cpp @@ -7,7 +7,7 @@ #include "minecraft/PackProfile.h" #include "settings/INISettingsObject.h" -VanillaCreationTask::VanillaCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loader_version) +VanillaCreationTask::VanillaCreationTask(BaseVersion::Ptr version, QString loader, BaseVersion::Ptr loader_version) : InstanceCreationTask(), m_version(std::move(version)), m_using_loader(true), m_loader(std::move(loader)), m_loader_version(std::move(loader_version)) {} diff --git a/launcher/minecraft/VanillaInstanceCreationTask.h b/launcher/minecraft/VanillaInstanceCreationTask.h index 7a37bbd6a..d1b816824 100644 --- a/launcher/minecraft/VanillaInstanceCreationTask.h +++ b/launcher/minecraft/VanillaInstanceCreationTask.h @@ -7,16 +7,16 @@ class VanillaCreationTask final : public InstanceCreationTask { Q_OBJECT public: - VanillaCreationTask(BaseVersionPtr version) : InstanceCreationTask(), m_version(std::move(version)) {} - VanillaCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loader_version); + VanillaCreationTask(BaseVersion::Ptr version) : InstanceCreationTask(), m_version(std::move(version)) {} + VanillaCreationTask(BaseVersion::Ptr version, QString loader, BaseVersion::Ptr loader_version); bool createInstance() override; private: // Version to update to / create of the instance. - BaseVersionPtr m_version; + BaseVersion::Ptr m_version; bool m_using_loader = false; QString m_loader; - BaseVersionPtr m_loader_version; + BaseVersion::Ptr m_loader_version; }; diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp index 68d759436..291ad9161 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp @@ -58,7 +58,7 @@ namespace ATLauncher { -static Meta::VersionPtr getComponentVersion(const QString& uid, const QString& version); +static Meta::Version::Ptr getComponentVersion(const QString& uid, const QString& version); PackInstallTask::PackInstallTask(UserInteractionSupport *support, QString packName, QString version, InstallMode installMode) { @@ -1037,7 +1037,7 @@ void PackInstallTask::install() emitSucceeded(); } -static Meta::VersionPtr getComponentVersion(const QString& uid, const QString& version) +static Meta::Version::Ptr getComponentVersion(const QString& uid, const QString& version) { auto vlist = APPLICATION->metadataIndex()->get(uid); if (!vlist) diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.h b/launcher/modplatform/atlauncher/ATLPackInstallTask.h index 78cd87fb1..90e25ae2e 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.h +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.h @@ -68,7 +68,7 @@ public: * Requests a user interaction to select a component version from a given version list * and constrained to a given Minecraft version. */ - virtual QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) = 0; + virtual QString chooseVersion(Meta::VersionList::Ptr vlist, QString minecraftVersion) = 0; /** * Requests a user interaction to display a message. @@ -137,8 +137,8 @@ private: QString archivePath; QStringList jarmods; - Meta::VersionPtr minecraftVersion; - QMap componentsToInstall; + Meta::Version::Ptr minecraftVersion; + QMap componentsToInstall; QFuture> m_extractFuture; QFutureWatcher> m_extractFutureWatcher; diff --git a/launcher/ui/dialogs/VersionSelectDialog.cpp b/launcher/ui/dialogs/VersionSelectDialog.cpp index 70ef72d6c..d7880334f 100644 --- a/launcher/ui/dialogs/VersionSelectDialog.cpp +++ b/launcher/ui/dialogs/VersionSelectDialog.cpp @@ -120,7 +120,7 @@ void VersionSelectDialog::selectRecommended() m_versionWidget->selectRecommended(); } -BaseVersionPtr VersionSelectDialog::selectedVersion() const +BaseVersion::Ptr VersionSelectDialog::selectedVersion() const { return m_versionWidget->selectedVersion(); } diff --git a/launcher/ui/dialogs/VersionSelectDialog.h b/launcher/ui/dialogs/VersionSelectDialog.h index ed30d3f3c..18a50cdb0 100644 --- a/launcher/ui/dialogs/VersionSelectDialog.h +++ b/launcher/ui/dialogs/VersionSelectDialog.h @@ -44,7 +44,7 @@ public: int exec() override; - BaseVersionPtr selectedVersion() const; + BaseVersion::Ptr selectedVersion() const; void setCurrentVersion(const QString & version); void setFuzzyFilter(BaseVersionList::ModelRoles role, QString filter); diff --git a/launcher/ui/pages/modplatform/VanillaPage.cpp b/launcher/ui/pages/modplatform/VanillaPage.cpp index 99190f31e..29fecb854 100644 --- a/launcher/ui/pages/modplatform/VanillaPage.cpp +++ b/launcher/ui/pages/modplatform/VanillaPage.cpp @@ -187,12 +187,12 @@ void VanillaPage::retranslate() ui->retranslateUi(this); } -BaseVersionPtr VanillaPage::selectedVersion() const +BaseVersion::Ptr VanillaPage::selectedVersion() const { return m_selectedVersion; } -BaseVersionPtr VanillaPage::selectedLoaderVersion() const +BaseVersion::Ptr VanillaPage::selectedLoaderVersion() const { return m_selectedLoaderVersion; } @@ -227,14 +227,14 @@ void VanillaPage::suggestCurrent() dialog->setSuggestedIcon("default"); } -void VanillaPage::setSelectedVersion(BaseVersionPtr version) +void VanillaPage::setSelectedVersion(BaseVersion::Ptr version) { m_selectedVersion = version; suggestCurrent(); loaderFilterChanged(); } -void VanillaPage::setSelectedLoaderVersion(BaseVersionPtr version) +void VanillaPage::setSelectedLoaderVersion(BaseVersion::Ptr version) { m_selectedLoaderVersion = version; suggestCurrent(); diff --git a/launcher/ui/pages/modplatform/VanillaPage.h b/launcher/ui/pages/modplatform/VanillaPage.h index 7193597dd..39aba760b 100644 --- a/launcher/ui/pages/modplatform/VanillaPage.h +++ b/launcher/ui/pages/modplatform/VanillaPage.h @@ -76,13 +76,13 @@ public: void openedImpl() override; - BaseVersionPtr selectedVersion() const; - BaseVersionPtr selectedLoaderVersion() const; + BaseVersion::Ptr selectedVersion() const; + BaseVersion::Ptr selectedLoaderVersion() const; QString selectedLoader() const; public slots: - void setSelectedVersion(BaseVersionPtr version); - void setSelectedLoaderVersion(BaseVersionPtr version); + void setSelectedVersion(BaseVersion::Ptr version); + void setSelectedLoaderVersion(BaseVersion::Ptr version); private slots: void filterChanged(); @@ -98,7 +98,7 @@ private: NewInstanceDialog *dialog = nullptr; Ui::VanillaPage *ui = nullptr; bool m_versionSetByUser = false; - BaseVersionPtr m_selectedVersion; - BaseVersionPtr m_selectedLoaderVersion; + BaseVersion::Ptr m_selectedVersion; + BaseVersion::Ptr m_selectedLoaderVersion; QString m_selectedLoader; }; diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp index c68e40bad..f5f50caee 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp @@ -53,7 +53,7 @@ std::optional> AtlUserInteractionSupportImpl::chooseOptionalMod return optionalModDialog.getResult(); } -QString AtlUserInteractionSupportImpl::chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) +QString AtlUserInteractionSupportImpl::chooseVersion(Meta::VersionList::Ptr vlist, QString minecraftVersion) { VersionSelectDialog vselect(vlist.get(), "Choose Version", m_parent, false); if (minecraftVersion != nullptr) { diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h index 3b37c9bed..37010b3ff 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h @@ -46,7 +46,7 @@ public: AtlUserInteractionSupportImpl(QWidget* parent); private: - QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) override; + QString chooseVersion(Meta::VersionList::Ptr vlist, QString minecraftVersion) override; std::optional> chooseOptionalMods(ATLauncher::PackVersion version, QVector mods) override; void displayMessage(QString message) override; diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index 314a126e4..c7c4dbbd9 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -245,7 +245,7 @@ void JavaSettingsWidget::memoryValueChanged(int) } } -void JavaSettingsWidget::javaVersionSelected(BaseVersionPtr version) +void JavaSettingsWidget::javaVersionSelected(BaseVersion::Ptr version) { auto java = std::dynamic_pointer_cast(version); if(!java) diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 0d280daf3..5344e2cd1 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -60,7 +60,7 @@ public: protected slots: void memoryValueChanged(int); void javaPathEdited(const QString &path); - void javaVersionSelected(BaseVersionPtr version); + void javaVersionSelected(BaseVersion::Ptr version); void on_javaBrowseBtn_clicked(); void on_javaStatusBtn_clicked(); void checkFinished(JavaCheckResult result); diff --git a/launcher/ui/widgets/ModFilterWidget.h b/launcher/ui/widgets/ModFilterWidget.h index 958a1e2b0..706ffd21a 100644 --- a/launcher/ui/widgets/ModFilterWidget.h +++ b/launcher/ui/widgets/ModFilterWidget.h @@ -49,7 +49,7 @@ public: auto getFilter() -> std::shared_ptr; auto changed() const -> bool { return m_last_version_id != m_version_id; } - Meta::VersionListPtr versionList() { return m_version_list; } + Meta::VersionList::Ptr versionList() { return m_version_list; } private: ModFilterWidget(Version def, QWidget* parent = nullptr); @@ -73,7 +73,7 @@ private: /* Version stuff */ QButtonGroup m_mcVersion_buttons; - Meta::VersionListPtr m_version_list; + Meta::VersionList::Ptr m_version_list; /* Used to tell if the filter was changed since the last getFilter() call */ VersionButtonID m_last_version_id = VersionButtonID::Strict; diff --git a/launcher/ui/widgets/VersionSelectWidget.cpp b/launcher/ui/widgets/VersionSelectWidget.cpp index cc4fc6a2f..404860d90 100644 --- a/launcher/ui/widgets/VersionSelectWidget.cpp +++ b/launcher/ui/widgets/VersionSelectWidget.cpp @@ -142,7 +142,7 @@ void VersionSelectWidget::changeProgress(qint64 current, qint64 total) void VersionSelectWidget::currentRowChanged(const QModelIndex& current, const QModelIndex&) { auto variant = m_proxyModel->data(current, BaseVersionList::VersionPointerRole); - emit selectedVersionChanged(variant.value()); + emit selectedVersionChanged(variant.value()); } void VersionSelectWidget::preselect() @@ -186,11 +186,11 @@ bool VersionSelectWidget::hasVersions() const return m_proxyModel->rowCount(QModelIndex()) != 0; } -BaseVersionPtr VersionSelectWidget::selectedVersion() const +BaseVersion::Ptr VersionSelectWidget::selectedVersion() const { auto currentIndex = listView->selectionModel()->currentIndex(); auto variant = m_proxyModel->data(currentIndex, BaseVersionList::VersionPointerRole); - return variant.value(); + return variant.value(); } void VersionSelectWidget::setExactFilter(BaseVersionList::ModelRoles role, QString filter) diff --git a/launcher/ui/widgets/VersionSelectWidget.h b/launcher/ui/widgets/VersionSelectWidget.h index f56daa8aa..e75efc6f6 100644 --- a/launcher/ui/widgets/VersionSelectWidget.h +++ b/launcher/ui/widgets/VersionSelectWidget.h @@ -40,7 +40,7 @@ public: void loadList(); bool hasVersions() const; - BaseVersionPtr selectedVersion() const; + BaseVersion::Ptr selectedVersion() const; void selectRecommended(); void selectCurrent(); @@ -54,7 +54,7 @@ public: void setResizeOn(int column); signals: - void selectedVersionChanged(BaseVersionPtr version); + void selectedVersionChanged(BaseVersion::Ptr version); protected: virtual void closeEvent ( QCloseEvent* ); From 76203018e9dae39ebd7ee8db511a07736ea270f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Tue, 1 Nov 2022 20:21:34 -0300 Subject: [PATCH 0086/1149] forgot the qrc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/resources/backgrounds/backgrounds.qrc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index db48af8bb..fb4267070 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -7,5 +7,8 @@ rory.png rory-xmas.png rory-bday.png + rory-flat.png + rory-flat-xmas.png + rory-flat-bday.png From 48d34741f3255976cc2e208ef4bf858ae0beb782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Tue, 1 Nov 2022 22:53:45 -0300 Subject: [PATCH 0087/1149] keyboard navigation is important MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/ui/pages/global/LauncherPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 0b36652c2..6de644ee5 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -343,7 +343,7 @@ - Cat + C&at themeBackgroundCat From 8dfa3393dc59a386123c84dd30287bf9f1d17faf Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 2 Nov 2022 08:43:42 +0000 Subject: [PATCH 0088/1149] Formatting and forward-declaration Signed-off-by: TheKodeToad --- launcher/ui/dialogs/ModDownloadDialog.cpp | 10 ++++----- launcher/ui/dialogs/ModDownloadDialog.h | 25 +++++++++++------------ launcher/ui/pages/modplatform/ModPage.cpp | 13 +++++------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index 876f015a3..0a0e61e36 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -132,7 +132,7 @@ QList ModDownloadDialog::getPages() if (APPLICATION->capabilities() & Application::SupportsFlame) pages.append(FlameModPage::create(this, m_instance)); - m_selected_page = dynamic_cast(pages[0]); + m_selectedPage = dynamic_cast(pages[0]); return pages; } @@ -181,14 +181,14 @@ void ModDownloadDialog::selectedPageChanged(BasePage* previous, BasePage* select return; } - m_selected_page = dynamic_cast(selected); - if (!m_selected_page) { + m_selectedPage = dynamic_cast(selected); + if (!m_selectedPage) { qCritical() << "Page '" << selected->displayName() << "' in ModDownloadDialog is not a ModPage!"; return; } // Same effect as having a global search bar - m_selected_page->setSearchTerm(prev_page->getSearchTerm()); + m_selectedPage->setSearchTerm(prev_page->getSearchTerm()); } bool ModDownloadDialog::selectPage(QString pageId) @@ -198,5 +198,5 @@ bool ModDownloadDialog::selectPage(QString pageId) ModPage* ModDownloadDialog::getSelectedPage() { - return m_selected_page; + return m_selectedPage; } \ No newline at end of file diff --git a/launcher/ui/dialogs/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index c637a70ac..29bdcf82d 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -25,7 +25,6 @@ #include "ModDownloadTask.h" #include "minecraft/mod/ModFolderModel.h" #include "ui/pages/BasePageProvider.h" -#include "ui/pages/modplatform/ModPage.h" namespace Ui { @@ -34,13 +33,14 @@ class ModDownloadDialog; class PageContainer; class QDialogButtonBox; +class ModPage; class ModrinthModPage; class ModDownloadDialog final : public QDialog, public BasePageProvider { Q_OBJECT -public: + public: explicit ModDownloadDialog(const std::shared_ptr& mods, QWidget* parent, BaseInstance* instance); ~ModDownloadDialog() override = default; @@ -53,27 +53,26 @@ public: bool isModSelected(QString name) const; const QList getTasks(); - const std::shared_ptr &mods; + const std::shared_ptr& mods; bool selectPage(QString pageId); - ModPage* getSelectedPage(); -public slots: + public slots: void confirm(); void accept() override; void reject() override; -private slots: + private slots: void selectedPageChanged(BasePage* previous, BasePage* selected); -private: - Ui::ModDownloadDialog *ui = nullptr; - PageContainer * m_container = nullptr; - QDialogButtonBox * m_buttons = nullptr; - QVBoxLayout *m_verticalLayout = nullptr; - ModPage *m_selected_page = nullptr; + private: + Ui::ModDownloadDialog* ui = nullptr; + PageContainer* m_container = nullptr; + QDialogButtonBox* m_buttons = nullptr; + QVBoxLayout* m_verticalLayout = nullptr; + ModPage* m_selectedPage = nullptr; QHash modTask; - BaseInstance *m_instance; + BaseInstance* m_instance; }; diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index f269fc72c..af16eaeff 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -257,17 +257,15 @@ void ModPage::openUrl(const QUrl& url) int prefixLength; const char* page; - if ((url.host() == "modrinth.com" || url.host() == "www.modrinth.com") - && url.path().startsWith("/mod/")) { + if ((url.host() == "modrinth.com" || url.host() == "www.modrinth.com") && url.path().startsWith("/mod/")) { prefixLength = 5; page = "modrinth"; - } else if (APPLICATION->capabilities() & Application::SupportsFlame - && (url.host() == "curseforge.com" || url.host() == "www.curseforge.com") - && url.path().toLower().startsWith("/minecraft/mc-mods/")) { + } else if (APPLICATION->capabilities() & Application::SupportsFlame && + (url.host() == "curseforge.com" || url.host() == "www.curseforge.com") && + url.path().toLower().startsWith("/minecraft/mc-mods/")) { prefixLength = 19; page = "curseforge"; - } - else + } else prefixLength = 0; if (prefixLength != 0) { @@ -312,7 +310,6 @@ void ModPage::openUrl(const QUrl& url) QDesktopServices::openUrl(url); } - /******** Make changes to the UI ********/ void ModPage::retranslate() From 6c45a990ef6b50e909368c3dfd41566ec5ca6986 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 2 Nov 2022 09:13:44 +0000 Subject: [PATCH 0089/1149] A good use of auto Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index af16eaeff..f245bfc27 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -291,7 +291,7 @@ void ModPage::openUrl(const QUrl& url) connect(model->activeJob(), &Task::finished, [url, slug, model, view] { for (int row = 0; row < model->rowCount({}); row++) { QModelIndex index = model->index(row); - ModPlatform::IndexedPack pack = model->data(index, Qt::UserRole).value(); + auto pack = model->data(index, Qt::UserRole).value(); if (pack.slug == slug) { view->setCurrentIndex(index); return; From a1ed8154f75378a25ea20781d481fb971f616dc8 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 2 Nov 2022 09:31:39 +0000 Subject: [PATCH 0090/1149] Another fix Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 36 +++++++++++++---------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index f245bfc27..f347d8171 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -282,27 +282,31 @@ void ModPage::openUrl(const QUrl& url) dialog->selectPage(page); ModPage* newPage = dialog->getSelectedPage(); - newPage->ui->searchEdit->setText(slug); - newPage->triggerSearch(); + QLineEdit* searchEdit = newPage->ui->searchEdit; - ModPlatform::ListModel* model = newPage->listModel; - QListView* view = newPage->ui->packView; + if (searchEdit->text() != slug) { + searchEdit->setText(slug); + newPage->triggerSearch(); - connect(model->activeJob(), &Task::finished, [url, slug, model, view] { - for (int row = 0; row < model->rowCount({}); row++) { - QModelIndex index = model->index(row); - auto pack = model->data(index, Qt::UserRole).value(); - if (pack.slug == slug) { - view->setCurrentIndex(index); - return; + ModPlatform::ListModel* model = newPage->listModel; + QListView* view = newPage->ui->packView; + + connect(model->activeJob(), &Task::finished, [url, slug, model, view] { + for (int row = 0; row < model->rowCount({}); row++) { + QModelIndex index = model->index(row); + auto pack = model->data(index, Qt::UserRole).value(); + if (pack.slug == slug) { + view->setCurrentIndex(index); + return; + } } - } - // The final fallback. - QDesktopServices::openUrl(url); - }); + // The final fallback. + QDesktopServices::openUrl(url); + }); - return; + return; + } } } From a29d88c31305deda4136df9ad5046aed60a91afd Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 2 Nov 2022 09:59:52 +0000 Subject: [PATCH 0091/1149] Even more fixes Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 54 +++++++++++++---------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index f347d8171..6ec283fca 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -254,19 +254,20 @@ void ModPage::openUrl(const QUrl& url) } // detect mod URLs and search instead - int prefixLength; + int prefixLength = 0; const char* page; if ((url.host() == "modrinth.com" || url.host() == "www.modrinth.com") && url.path().startsWith("/mod/")) { prefixLength = 5; page = "modrinth"; } else if (APPLICATION->capabilities() & Application::SupportsFlame && - (url.host() == "curseforge.com" || url.host() == "www.curseforge.com") && - url.path().toLower().startsWith("/minecraft/mc-mods/")) { - prefixLength = 19; + (url.host() == "curseforge.com" || url.host().endsWith(".curseforge.com"))) { + if (url.path().toLower().startsWith("/minecraft/mc-mods/")) + prefixLength = 19; + else if (url.path().toLower().startsWith("/projects/")) + prefixLength = 10; page = "curseforge"; - } else - prefixLength = 0; + } if (prefixLength != 0) { QString slug = url.path().mid(prefixLength); @@ -282,31 +283,36 @@ void ModPage::openUrl(const QUrl& url) dialog->selectPage(page); ModPage* newPage = dialog->getSelectedPage(); + QLineEdit* searchEdit = newPage->ui->searchEdit; + ModPlatform::ListModel* model = newPage->listModel; + QListView* view = newPage->ui->packView; - if (searchEdit->text() != slug) { - searchEdit->setText(slug); - newPage->triggerSearch(); + auto jump = [url, slug, model, view] { + for (int row = 0; row < model->rowCount({}); row++) { + QModelIndex index = model->index(row); + auto pack = model->data(index, Qt::UserRole).value(); - ModPlatform::ListModel* model = newPage->listModel; - QListView* view = newPage->ui->packView; - - connect(model->activeJob(), &Task::finished, [url, slug, model, view] { - for (int row = 0; row < model->rowCount({}); row++) { - QModelIndex index = model->index(row); - auto pack = model->data(index, Qt::UserRole).value(); - if (pack.slug == slug) { - view->setCurrentIndex(index); - return; - } + if (pack.slug == slug) { + view->setCurrentIndex(index); + return; } + } - // The final fallback. - QDesktopServices::openUrl(url); - }); + // The final fallback. + QDesktopServices::openUrl(url); + }; - return; + searchEdit->setText(slug); + newPage->triggerSearch(); + + if (!model->activeJob()) + jump(); + else { + connect(model->activeJob(), &Task::finished, jump); } + + return; } } From 9ca4f19aeabf3cc4a105159c4b4796101a401126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Wed, 2 Nov 2022 07:45:43 -0300 Subject: [PATCH 0092/1149] remove logcat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/ui/MainWindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 2a6e8c1f3..28eaa741b 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1562,8 +1562,6 @@ void MainWindow::setCatBackground(bool enabled) QDateTime xmas(QDate(now.date().year(), 12, 25), QTime(0, 0)); QString cat = APPLICATION->settings()->get("BackgroundCat").toString(); - qDebug() << "The choosen cat is " << cat << "."; - if(non_stupid_abs(now.daysTo(xmas)) <= 4) { cat += "-xmas"; } From 4254c20edad247a5a326638faceb5f631e20e231 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Wed, 2 Nov 2022 10:46:38 +0800 Subject: [PATCH 0093/1149] experimental: install mime info in CMake Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- CMakeLists.txt | 6 ++++++ program_info/CMakeLists.txt | 1 + 2 files changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 131d3e53c..73b1d5b03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,6 +205,8 @@ add_subdirectory(program_info) ####################################### Install layout ####################################### +find_package(SharedMimeInfo) + if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) @@ -262,6 +264,10 @@ elseif(UNIX) SET(Launcher_BINARY_RPATH "$ORIGIN/") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_Desktop} DESTINATION ${LAUNCHER_DESKTOP_DEST_DIR}) + if(SharedMimeInfo_FOUND) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_mrpack_MIMEInfo} DESTINATION ${KDE_INSTALL_MIMEDIR}) + update_xdg_mimetypes(${KDE_INSTALL_MIMEDIR}) + endif(SharedMimeInfo_FOUND) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_MetaInfo} DESTINATION ${LAUNCHER_METAINFO_DEST_DIR}) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_SVG} DESTINATION ${LAUNCHER_ICON_DEST_DIR}) diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index f6e2ea848..3c8cad0f9 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -23,6 +23,7 @@ set(Launcher_Git "https://github.com/PrismLauncher/PrismLauncher" PARENT_SCOPE) set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) set(Launcher_Desktop "program_info/org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_mrpack_MIMEInfo "program_info/modrinth-mrpack-mime.xml" PARENT_SCOPE) set(Launcher_MetaInfo "program_info/org.prismlauncher.PrismLauncher.metainfo.xml" PARENT_SCOPE) set(Launcher_SVG "program_info/org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) set(Launcher_Branding_ICNS "program_info/prismlauncher.icns" PARENT_SCOPE) From cb796dbdfbe2099bc77911c01c8633d9f28aedac Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Wed, 2 Nov 2022 16:38:32 +0000 Subject: [PATCH 0094/1149] Remove unnecessary block Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 6ec283fca..ec6f488fb 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -308,9 +308,8 @@ void ModPage::openUrl(const QUrl& url) if (!model->activeJob()) jump(); - else { + else connect(model->activeJob(), &Task::finished, jump); - } return; } From 8d39a9ea6185eacb79dc30a36a9d8e8fcc631528 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 2 Nov 2022 20:08:08 +0000 Subject: [PATCH 0095/1149] Fix: Increase stack size on Windows to 8MiB Signed-off-by: TheLastRar --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94af61f38..ed83c2055 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,11 @@ set(CMAKE_C_STANDARD 11) include(GenerateExportHeader) set(CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}") +# ATL's packlist needs more than the default 1 Mib stack on windows +if(WIN32) + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}") +endif() + # Fix build with Qt 5.13 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y") From 7eb0b1c69af3feb0c6dcce1e3293c42e11caede7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 2 Nov 2022 23:02:32 +0000 Subject: [PATCH 0096/1149] chore(deps): update hendrikmuhs/ccache-action action to v1.2.4 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dd2c05994..c74d8c4fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,7 @@ jobs: - name: Setup ccache if: runner.os != 'Windows' && inputs.build_type == 'Debug' - uses: hendrikmuhs/ccache-action@v1.2.3 + uses: hendrikmuhs/ccache-action@v1.2.4 with: key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} From 3d11d044d2849c098187de4e973a8787538f4496 Mon Sep 17 00:00:00 2001 From: leo78913 Date: Tue, 25 Oct 2022 19:22:11 -0300 Subject: [PATCH 0097/1149] add an option to lock the toolbars Signed-off-by: leo78913 --- launcher/Application.cpp | 2 ++ launcher/ui/MainWindow.cpp | 32 +++++++++++++++++++++++++++++--- launcher/ui/MainWindow.h | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 5772d7cad..9013577c4 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -614,6 +614,8 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) // The cat m_settings->registerSetting("TheCat", false); + m_settings->registerSetting("ToolbarsLocked", false); + m_settings->registerSetting("InstSortMode", "Name"); m_settings->registerSetting("SelectedInstance", QString()); diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 28eaa741b..ef056fcb1 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -262,6 +262,8 @@ public: TranslatedAction actionNoAccountsAdded; TranslatedAction actionNoDefaultAccount; + TranslatedAction actionLockToolbars; + QVector all_toolbuttons; QWidget *centralWidget = nullptr; @@ -420,6 +422,12 @@ public: actionManageAccounts->setCheckable(false); actionManageAccounts->setIcon(APPLICATION->getThemedIcon("accounts")); all_actions.append(&actionManageAccounts); + + actionLockToolbars = TranslatedAction(MainWindow); + actionLockToolbars->setObjectName(QStringLiteral("actionLockToolbars")); + actionLockToolbars.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Lock Toolbars")); + actionLockToolbars->setCheckable(true); + all_actions.append(&actionLockToolbars); } void createMainToolbar(QMainWindow *MainWindow) @@ -427,7 +435,6 @@ public: mainToolBar = TranslatedToolbar(MainWindow); mainToolBar->setVisible(menuBar->isNativeMenuBar() || !APPLICATION->settings()->get("MenuBarInsteadOfToolBar").toBool()); mainToolBar->setObjectName(QStringLiteral("mainToolBar")); - mainToolBar->setMovable(true); mainToolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); mainToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); mainToolBar->setFloatable(false); @@ -524,6 +531,8 @@ public: viewMenu->addAction(actionCAT); viewMenu->addSeparator(); + viewMenu->addAction(actionLockToolbars); + menuBar->addMenu(foldersMenu); profileMenu = menuBar->addMenu(tr("&Accounts")); @@ -601,7 +610,6 @@ public: { newsToolBar = TranslatedToolbar(MainWindow); newsToolBar->setObjectName(QStringLiteral("newsToolBar")); - newsToolBar->setMovable(true); newsToolBar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea); newsToolBar->setIconSize(QSize(16, 16)); newsToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); @@ -736,7 +744,6 @@ public: instanceToolBar->setObjectName(QStringLiteral("instanceToolBar")); // disabled until we have an instance selected instanceToolBar->setEnabled(false); - instanceToolBar->setMovable(true); // Qt doesn't like vertical moving toolbars, so we have to force them... // See https://github.com/PolyMC/PolyMC/issues/493 connect(instanceToolBar, &QToolBar::orientationChanged, [=](Qt::Orientation){ instanceToolBar->setOrientation(Qt::Vertical); }); @@ -918,6 +925,14 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow connect(ui->actionCAT.operator->(), SIGNAL(toggled(bool)), SLOT(onCatToggled(bool))); setCatBackground(cat_enable); } + + // Lock toolbars + { + bool toolbarsLocked = APPLICATION->settings()->get("ToolbarsLocked").toBool(); + ui->actionLockToolbars->setChecked(toolbarsLocked); + connect(ui->actionLockToolbars.operator->(), SIGNAL(toggled(bool)), SLOT(lockToolbars(bool))); + lockToolbars(toolbarsLocked); + } // start instance when double-clicked connect(view, &InstanceView::activated, this, &MainWindow::instanceActivated); @@ -1073,8 +1088,19 @@ QMenu * MainWindow::createPopupMenu() { QMenu* filteredMenu = QMainWindow::createPopupMenu(); filteredMenu->removeAction( ui->mainToolBar->toggleViewAction() ); + + filteredMenu->addAction(ui->actionLockToolbars); + return filteredMenu; } +void MainWindow::lockToolbars(bool state) +{ + ui->mainToolBar->setMovable(!state); + ui->instanceToolBar->setMovable(!state); + ui->newsToolBar->setMovable(!state); + APPLICATION->settings()->set("ToolbarsLocked", state); +} + void MainWindow::konamiTriggered() { diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index cb8cb4aa1..f9d1f1c73 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -203,6 +203,8 @@ private slots: void globalSettingsClosed(); + void lockToolbars(bool); + #ifndef Q_OS_MAC void keyReleaseEvent(QKeyEvent *event) override; #endif From e9bfd43ff73a482433e725aec715012c3c6c2a2c Mon Sep 17 00:00:00 2001 From: Tayou Date: Thu, 3 Nov 2022 04:54:57 +0100 Subject: [PATCH 0098/1149] added requested changes Signed-off-by: Tayou --- launcher/Application.cpp | 2 +- launcher/Application.h | 2 +- launcher/ui/pages/global/LauncherPage.cpp | 3 ++- launcher/ui/themes/CustomTheme.cpp | 22 +++++++--------------- launcher/ui/themes/CustomTheme.h | 6 +----- launcher/ui/themes/SystemTheme.cpp | 6 +----- launcher/ui/themes/ThemeManager.cpp | 2 +- launcher/ui/themes/ThemeManager.h | 2 +- 8 files changed, 15 insertions(+), 30 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index fa2023121..d27176c5c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Lenny McLennington * Copyright (C) 2022 Tayou diff --git a/launcher/Application.h b/launcher/Application.h index ec434c6cc..78ab8fbd0 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Tayou * diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index a1cbbc339..7c7aaf4e9 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -1,8 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 Jamie Mansfield * Copyright (c) 2022 dada513 + * Copyright (C) 2022 Tayou * * 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/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index c346d42f3..a61bdbaf9 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify @@ -20,10 +20,6 @@ * * Copyright 2013-2021 MultiMC Contributors * - * Authors: Andrew Okin - * Peterix - * Orochimarufan - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -56,7 +52,6 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm name = Json::requireString(root, "name", "Theme name"); widgets = Json::requireString(root, "widgets", "Qt widget theme"); qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); - //auto colorFileList = Json::ensureArray(root, "colorFiles"); auto colorsRoot = Json::requireObject(root, "colors", "colors object"); auto readColor = [&](QString colorName) -> QColor { @@ -165,7 +160,6 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double } } -/// @brief /// @param baseTheme Base Theme /// @param fileInfo FileInfo object for file to load /// @param isManifest whether to load a theme manifest or a qss file @@ -199,8 +193,6 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_fadeAmount = baseTheme->fadeAmount(); m_widgets = baseTheme->qtTheme(); m_qssFilePath = "themeStyle.css"; - - QFileInfo info(themeFilePath); } else { @@ -212,18 +204,18 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest writeThemeJson(fileInfo.absoluteFilePath(), m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath); } - auto cssFilePath = FS::PathCombine(path, m_qssFilePath); - QFileInfo info (cssFilePath); + auto qssFilePath = FS::PathCombine(path, m_qssFilePath); + QFileInfo info (qssFilePath); if(info.isFile()) { try { // TODO: validate css? - m_styleSheet = QString::fromUtf8(FS::read(cssFilePath)); + m_styleSheet = QString::fromUtf8(FS::read(qssFilePath)); } catch (const Exception &e) { - themeWarningLog() << "Couldn't load css:" << e.cause() << "from" << cssFilePath; + themeWarningLog() << "Couldn't load css:" << e.cause() << "from" << qssFilePath; m_styleSheet = baseTheme->appStyleSheet(); } } @@ -233,11 +225,11 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_styleSheet = baseTheme->appStyleSheet(); try { - FS::write(cssFilePath, m_styleSheet.toUtf8()); + FS::write(qssFilePath, m_styleSheet.toUtf8()); } catch (const Exception &e) { - themeWarningLog() << "Couldn't write css:" << e.cause() << "to" << cssFilePath; + themeWarningLog() << "Couldn't write css:" << e.cause() << "to" << qssFilePath; } } } else { diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index 6d1f46b4b..e845d23da 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify @@ -20,10 +20,6 @@ * * Copyright 2013-2021 MultiMC Contributors * - * Authors: Andrew Okin - * Peterix - * Orochimarufan - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/launcher/ui/themes/SystemTheme.cpp b/launcher/ui/themes/SystemTheme.cpp index ec24c6d76..a63d17411 100644 --- a/launcher/ui/themes/SystemTheme.cpp +++ b/launcher/ui/themes/SystemTheme.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify @@ -20,10 +20,6 @@ * * Copyright 2013-2021 MultiMC Contributors * - * Authors: Andrew Okin - * Peterix - * Orochimarufan - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 3c338fd67..4b7cd46d4 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index 871e6fe2f..96088d82d 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Tayou * * This program is free software: you can redistribute it and/or modify From c2f37716e59055636bee2d1549a16809c408e45b Mon Sep 17 00:00:00 2001 From: Tayou Date: Thu, 3 Nov 2022 05:05:07 +0100 Subject: [PATCH 0099/1149] clang_format for PR files I'm getting a rendezvous... I thought I did this already Signed-off-by: Tayou --- launcher/ui/themes/CustomTheme.cpp | 121 +++++++++++----------------- launcher/ui/themes/CustomTheme.h | 12 ++- launcher/ui/themes/ThemeManager.cpp | 49 +++++------ launcher/ui/themes/ThemeManager.h | 17 ++-- 4 files changed, 87 insertions(+), 112 deletions(-) diff --git a/launcher/ui/themes/CustomTheme.cpp b/launcher/ui/themes/CustomTheme.cpp index a61bdbaf9..3ad61668e 100644 --- a/launcher/ui/themes/CustomTheme.cpp +++ b/launcher/ui/themes/CustomTheme.cpp @@ -33,19 +33,24 @@ * limitations under the License. */ #include "CustomTheme.h" -#include #include +#include #include "ThemeManager.h" -const char * themeFile = "theme.json"; +const char* themeFile = "theme.json"; -static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAmount, QColor &fadeColor, QString &name, QString &widgets, QString &qssFilePath, bool &dataIncomplete) +static bool readThemeJson(const QString& path, + QPalette& palette, + double& fadeAmount, + QColor& fadeColor, + QString& name, + QString& widgets, + QString& qssFilePath, + bool& dataIncomplete) { QFileInfo pathInfo(path); - if(pathInfo.exists() && pathInfo.isFile()) - { - try - { + if (pathInfo.exists() && pathInfo.isFile()) { + try { auto doc = Json::requireDocument(path, "Theme JSON file"); const QJsonObject root = doc.object(); dataIncomplete = !root.contains("qssFilePath"); @@ -53,14 +58,11 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm widgets = Json::requireString(root, "widgets", "Qt widget theme"); qssFilePath = Json::ensureString(root, "qssFilePath", "themeStyle.css"); auto colorsRoot = Json::requireObject(root, "colors", "colors object"); - auto readColor = [&](QString colorName) -> QColor - { + auto readColor = [&](QString colorName) -> QColor { auto colorValue = Json::ensureString(colorsRoot, colorName, QString()); - if(!colorValue.isEmpty()) - { + if (!colorValue.isEmpty()) { QColor color(colorValue); - if(!color.isValid()) - { + if (!color.isValid()) { themeWarningLog() << "Color value" << colorValue << "for" << colorName << "was not recognized."; return QColor(); } @@ -68,15 +70,11 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm } return QColor(); }; - auto readAndSetColor = [&](QPalette::ColorRole role, QString colorName) - { + auto readAndSetColor = [&](QPalette::ColorRole role, QString colorName) { auto color = readColor(colorName); - if(color.isValid()) - { + if (color.isValid()) { palette.setColor(role, color); - } - else - { + } else { themeDebugLog() << "Color value for" << colorName << "was not present."; } }; @@ -96,26 +94,28 @@ static bool readThemeJson(const QString &path, QPalette &palette, double &fadeAm readAndSetColor(QPalette::Highlight, "Highlight"); readAndSetColor(QPalette::HighlightedText, "HighlightedText"); - //fade + // fade fadeColor = readColor("fadeColor"); fadeAmount = Json::ensureDouble(colorsRoot, "fadeAmount", 0.5, "fade amount"); - } - catch (const Exception &e) - { + } catch (const Exception& e) { themeWarningLog() << "Couldn't load theme json: " << e.cause(); return false; } - } - else - { + } else { themeDebugLog() << "No theme json present."; return false; } return true; } -static bool writeThemeJson(const QString &path, const QPalette &palette, double fadeAmount, QColor fadeColor, QString name, QString widgets, QString qssFilePath) +static bool writeThemeJson(const QString& path, + const QPalette& palette, + double fadeAmount, + QColor fadeColor, + QString name, + QString widgets, + QString qssFilePath) { QJsonObject rootObj; rootObj.insert("name", name); @@ -123,10 +123,7 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double rootObj.insert("qssFilePath", qssFilePath); QJsonObject colorsObj; - auto insertColor = [&](QPalette::ColorRole role, QString colorName) - { - colorsObj.insert(colorName, palette.color(role).name()); - }; + auto insertColor = [&](QPalette::ColorRole role, QString colorName) { colorsObj.insert(colorName, palette.color(role).name()); }; // palette insertColor(QPalette::Window, "Window"); @@ -148,13 +145,10 @@ static bool writeThemeJson(const QString &path, const QPalette &palette, double colorsObj.insert("fadeAmount", fadeAmount); rootObj.insert("colors", colorsObj); - try - { + try { Json::write(rootObj, path); return true; - } - catch (const Exception &e) - { + } catch (const Exception& e) { themeWarningLog() << "Failed to write theme json to" << path; return false; } @@ -171,8 +165,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest QString path = FS::PathCombine("themes", m_id); QString pathResources = FS::PathCombine("themes", m_id, "resources"); - if(!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) - { + if (!FS::ensureFolderPathExists(path) || !FS::ensureFolderPathExists(pathResources)) { themeWarningLog() << "couldn't create folder for theme!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); @@ -184,8 +177,7 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest bool jsonDataIncomplete = false; m_palette = baseTheme->colorScheme(); - if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) - { + if (!readThemeJson(themeFilePath, m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath, jsonDataIncomplete)) { themeDebugLog() << "Did not read theme json file correctly, writing new one to: " << themeFilePath; m_name = "Custom"; m_palette = baseTheme->colorScheme(); @@ -193,42 +185,30 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_fadeAmount = baseTheme->fadeAmount(); m_widgets = baseTheme->qtTheme(); m_qssFilePath = "themeStyle.css"; - } - else - { + } else { m_palette = fadeInactive(m_palette, m_fadeAmount, m_fadeColor); } - if(jsonDataIncomplete) - { + if (jsonDataIncomplete) { writeThemeJson(fileInfo.absoluteFilePath(), m_palette, m_fadeAmount, m_fadeColor, m_name, m_widgets, m_qssFilePath); } auto qssFilePath = FS::PathCombine(path, m_qssFilePath); - QFileInfo info (qssFilePath); - if(info.isFile()) - { - try - { + QFileInfo info(qssFilePath); + if (info.isFile()) { + try { // TODO: validate css? m_styleSheet = QString::fromUtf8(FS::read(qssFilePath)); - } - catch (const Exception &e) - { + } catch (const Exception& e) { themeWarningLog() << "Couldn't load css:" << e.cause() << "from" << qssFilePath; m_styleSheet = baseTheme->appStyleSheet(); } - } - else - { + } else { themeDebugLog() << "No theme css present."; m_styleSheet = baseTheme->appStyleSheet(); - try - { + try { FS::write(qssFilePath, m_styleSheet.toUtf8()); - } - catch (const Exception &e) - { + } catch (const Exception& e) { themeWarningLog() << "Couldn't write css:" << e.cause() << "to" << qssFilePath; } } @@ -236,12 +216,11 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest m_id = fileInfo.fileName(); m_name = fileInfo.baseName(); QString path = fileInfo.filePath(); - //themeDebugLog << "Theme ID: " << m_id; - //themeDebugLog << "Theme Name: " << m_name; - //themeDebugLog << "Theme Path: " << path; + // themeDebugLog << "Theme ID: " << m_id; + // themeDebugLog << "Theme Name: " << m_name; + // themeDebugLog << "Theme Path: " << path; - if(!FS::ensureFilePathExists(path)) - { + if (!FS::ensureFilePathExists(path)) { themeWarningLog() << m_name << " Theme file path doesn't exist!"; m_palette = baseTheme->colorScheme(); m_styleSheet = baseTheme->appStyleSheet(); @@ -249,13 +228,10 @@ CustomTheme::CustomTheme(ITheme* baseTheme, QFileInfo& fileInfo, bool isManifest } m_palette = baseTheme->colorScheme(); - try - { + try { // TODO: validate qss? m_styleSheet = QString::fromUtf8(FS::read(path)); - } - catch (const Exception &e) - { + } catch (const Exception& e) { themeWarningLog() << "Couldn't load qss:" << e.cause() << "from" << path; m_styleSheet = baseTheme->appStyleSheet(); } @@ -267,7 +243,6 @@ QStringList CustomTheme::searchPaths() return { FS::PathCombine("themes", m_id, "resources") }; } - QString CustomTheme::id() { return m_id; diff --git a/launcher/ui/themes/CustomTheme.h b/launcher/ui/themes/CustomTheme.h index e845d23da..f2b1b06ed 100644 --- a/launcher/ui/themes/CustomTheme.h +++ b/launcher/ui/themes/CustomTheme.h @@ -34,13 +34,12 @@ */ #pragma once -#include "ITheme.h" #include +#include "ITheme.h" -class CustomTheme: public ITheme -{ -public: - CustomTheme(ITheme * baseTheme, QFileInfo& file, bool isManifest); +class CustomTheme : public ITheme { + public: + CustomTheme(ITheme* baseTheme, QFileInfo& file, bool isManifest); virtual ~CustomTheme() {} QString id() override; @@ -54,7 +53,7 @@ public: QString qtTheme() override; QStringList searchPaths() override; -private: /* data */ + private: /* data */ QPalette m_palette; QColor m_fadeColor; double m_fadeAmount; @@ -64,4 +63,3 @@ private: /* data */ QString m_widgets; QString m_qssFilePath; }; - diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp index 4b7cd46d4..01a38a864 100644 --- a/launcher/ui/themes/ThemeManager.cpp +++ b/launcher/ui/themes/ThemeManager.cpp @@ -17,26 +17,27 @@ */ #include "ThemeManager.h" -#include "ui/themes/SystemTheme.h" -#include "ui/themes/DarkTheme.h" -#include "ui/themes/BrightTheme.h" -#include "ui/themes/CustomTheme.h" +#include #include #include #include -#include +#include "ui/themes/BrightTheme.h" +#include "ui/themes/CustomTheme.h" +#include "ui/themes/DarkTheme.h" +#include "ui/themes/SystemTheme.h" #include "Application.h" #ifdef Q_OS_WIN -#include -// this is needed for versionhelpers.h, it is also included in WinDarkmode, but we can't rely on that. +#include +// this is needed for versionhelpers.h, it is also included in WinDarkmode, but we can't rely on that. // Ultimately this should be included in versionhelpers, but that is outside of the project. #include "ui/WinDarkmode.h" #include #endif -ThemeManager::ThemeManager(MainWindow* mainWindow) { +ThemeManager::ThemeManager(MainWindow* mainWindow) +{ m_mainWindow = mainWindow; InitializeThemes(); } @@ -44,7 +45,8 @@ ThemeManager::ThemeManager(MainWindow* mainWindow) { /// @brief Adds the Theme to the list of themes /// @param theme The Theme to add /// @return Theme ID -QString ThemeManager::AddTheme(std::unique_ptr theme) { +QString ThemeManager::AddTheme(std::unique_ptr theme) +{ QString id = theme->id(); m_themes.emplace(id, std::move(theme)); return id; @@ -53,13 +55,13 @@ QString ThemeManager::AddTheme(std::unique_ptr theme) { /// @brief Gets the Theme from the List via ID /// @param themeId Theme ID of theme to fetch /// @return Theme at themeId -ITheme* ThemeManager::GetTheme(QString themeId) { +ITheme* ThemeManager::GetTheme(QString themeId) +{ return m_themes[themeId].get(); } -void ThemeManager::InitializeThemes() { - - +void ThemeManager::InitializeThemes() +{ // Icon themes { // TODO: icon themes and instance icons do not mesh well together. Rearrange and fix discrepancies! @@ -78,7 +80,8 @@ void ThemeManager::InitializeThemes() { themeDebugLog() << "Loading Built-in Theme:" << darkThemeId; themeDebugLog() << "Loading Built-in Theme:" << AddTheme(std::make_unique()); - // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in dropdown?) + // TODO: need some way to differentiate same name themes in different subdirectories (maybe smaller grey text next to theme name in + // dropdown?) QString themeFolder = QDir("./themes/").absoluteFilePath(""); themeDebugLog() << "Theme Folder Path: " << themeFolder; @@ -92,7 +95,7 @@ void ThemeManager::InitializeThemes() { AddTheme(std::make_unique(GetTheme(darkThemeId), themeJson, true)); } else { // Load pure QSS Themes - QDirIterator stylesheetFileIterator(dir.absoluteFilePath(""), {"*.qss", "*.css"}, QDir::Files); + QDirIterator stylesheetFileIterator(dir.absoluteFilePath(""), { "*.qss", "*.css" }, QDir::Files); while (stylesheetFileIterator.hasNext()) { QFile customThemeFile(stylesheetFileIterator.next()); QFileInfo customThemeFileInfo(customThemeFile); @@ -121,7 +124,8 @@ void ThemeManager::setIconTheme(const QString& name) QIcon::setThemeName(name); } -void ThemeManager::applyCurrentlySelectedTheme() { +void ThemeManager::applyCurrentlySelectedTheme() +{ setIconTheme(APPLICATION->settings()->get("IconTheme").toString()); themeDebugLog() << "<> Icon theme set."; setApplicationTheme(APPLICATION->settings()->get("ApplicationTheme").toString(), true); @@ -132,23 +136,20 @@ void ThemeManager::setApplicationTheme(const QString& name, bool initial) { auto systemPalette = qApp->palette(); auto themeIter = m_themes.find(name); - if(themeIter != m_themes.end()) - { - auto & theme = themeIter->second; + if (themeIter != m_themes.end()) { + auto& theme = themeIter->second; themeDebugLog() << "applying theme" << theme->name(); theme->apply(initial); #ifdef Q_OS_WIN if (m_mainWindow && IsWindows10OrGreater()) { if (QString::compare(theme->id(), "dark") == 0) { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); } else { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); } } #endif - } - else - { + } else { themeWarningLog() << "Tried to set invalid theme:" << name; } } diff --git a/launcher/ui/themes/ThemeManager.h b/launcher/ui/themes/ThemeManager.h index 96088d82d..b85cb7423 100644 --- a/launcher/ui/themes/ThemeManager.h +++ b/launcher/ui/themes/ThemeManager.h @@ -19,18 +19,20 @@ #include -#include "ui/themes/ITheme.h" #include "ui/MainWindow.h" +#include "ui/themes/ITheme.h" -inline auto themeDebugLog() { - return qDebug() << "[Theme]"; +inline auto themeDebugLog() +{ + return qDebug() << "[Theme]"; } -inline auto themeWarningLog() { - return qWarning() << "[Theme]"; +inline auto themeWarningLog() +{ + return qWarning() << "[Theme]"; } class ThemeManager { -public: + public: ThemeManager(MainWindow* mainWindow); // maybe make private? Or put in ctor? @@ -41,11 +43,10 @@ public: void applyCurrentlySelectedTheme(); void setApplicationTheme(const QString& name, bool initial); -private: + private: std::map> m_themes; MainWindow* m_mainWindow; QString AddTheme(std::unique_ptr theme); ITheme* GetTheme(QString themeId); }; - From c6ab9718aea56ef2cfbe23856396fdb46d16ab75 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 19:50:27 +0000 Subject: [PATCH 0100/1149] chore(deps): update hendrikmuhs/ccache-action action to v1.2.5 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c74d8c4fd..ba8f9d38d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,7 @@ jobs: - name: Setup ccache if: runner.os != 'Windows' && inputs.build_type == 'Debug' - uses: hendrikmuhs/ccache-action@v1.2.4 + uses: hendrikmuhs/ccache-action@v1.2.5 with: key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} From c993209b763f1d00e2e003d6ea6fa6c5d1afec02 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:29 +0100 Subject: [PATCH 0101/1149] Fix: Explicitly specify Version.h path MSVC uses a different search mechanism that ends up picking the mete Version.h Signed-off-by: TheLastRar --- launcher/modplatform/ModAPI.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/modplatform/ModAPI.h b/launcher/modplatform/ModAPI.h index c7408835e..703de143b 100644 --- a/launcher/modplatform/ModAPI.h +++ b/launcher/modplatform/ModAPI.h @@ -39,7 +39,7 @@ #include #include -#include "Version.h" +#include "../Version.h" #include "net/NetJob.h" namespace ModPlatform { From fe347262e9785a4706a92d981275eb08b8f9c103 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:30 +0100 Subject: [PATCH 0102/1149] Fix: Using uint8_t in std::uniform_int_distribution is undefined Signed-off-by: TheLastRar --- tests/GZip_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/GZip_test.cpp b/tests/GZip_test.cpp index 1e762b2e6..82503d81d 100644 --- a/tests/GZip_test.cpp +++ b/tests/GZip_test.cpp @@ -24,7 +24,7 @@ slots: QByteArray compressed; QByteArray decompressed; std::default_random_engine eng((std::random_device())()); - std::uniform_int_distribution idis(0, std::numeric_limits::max()); + std::uniform_int_distribution idis(0, std::numeric_limits::max()); // initialize random buffer for(int i = 0; i < size; i++) From e682c3e9b8f75599c89e10b4d7ffa7612d2bd2e9 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Thu, 27 Oct 2022 17:37:30 +0100 Subject: [PATCH 0103/1149] Fix: Correct exclusions for debug QT plugins Signed-off-by: TheLastRar --- launcher/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 0dae47df8..7998f4f5e 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1127,7 +1127,7 @@ if(INSTALL_BUNDLE STREQUAL "full") DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "minimal|linuxfb|offscreen" EXCLUDE - REGEX "d\\." EXCLUDE + REGEX "[^2]d\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) @@ -1148,6 +1148,7 @@ if(INSTALL_BUNDLE STREQUAL "full") DIRECTORY "${QT_PLUGINS_DIR}/tls" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime + REGEX "dd\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) From e2e6d000644053d556347936ae46d1c0885199a4 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 30 Oct 2022 14:43:31 +0000 Subject: [PATCH 0104/1149] CMake: Remove CMP0020 OLD Signed-off-by: TheLastRar --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed83c2055..630cf0cfc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,5 @@ cmake_minimum_required(VERSION 3.15) # minimum version required by QuaZip -if(WIN32) - # In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows - cmake_policy(SET CMP0020 OLD) -endif() - project(Launcher) string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BUILD_DIR}" IS_IN_SOURCE_BUILD) From 6d4efc04434a5aa6e48b537f2fb19f58a02d6161 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:30 +0100 Subject: [PATCH 0105/1149] Libraries: Add zlib Signed-off-by: TheLastRar --- .gitmodules | 3 +++ libraries/zlib | 1 + 2 files changed, 4 insertions(+) create mode 160000 libraries/zlib diff --git a/.gitmodules b/.gitmodules index 8d0343547..68fb28643 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "libraries/libnbtplusplus"] path = libraries/libnbtplusplus url = https://github.com/PrismLauncher/libnbtplusplus.git +[submodule "libraries/zlib"] + path = libraries/zlib + url = https://github.com/madler/zlib.git diff --git a/libraries/zlib b/libraries/zlib new file mode 160000 index 000000000..04f42ceca --- /dev/null +++ b/libraries/zlib @@ -0,0 +1 @@ +Subproject commit 04f42ceca40f73e2978b50e93806c2a18c1281fc From a241d3f187f07cd3049c0d17f711c674fd6e7ccd Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 4 Nov 2022 18:29:19 +0100 Subject: [PATCH 0106/1149] refactor(cmake): use KDEInstallDirs for Linux install paths Signed-off-by: Sefa Eyeoglu --- CMakeLists.txt | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 73b1d5b03..310bc9a87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,8 +205,6 @@ add_subdirectory(program_info) ####################################### Install layout ####################################### -find_package(SharedMimeInfo) - if(NOT (UNIX AND APPLE)) # Install "portable.txt" if selected component is "portable" install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_Portable_File}" DESTINATION "." COMPONENT portable EXCLUDE_FROM_ALL) @@ -249,13 +247,11 @@ if(UNIX AND APPLE) install(FILES ${Launcher_Branding_ICNS} DESTINATION ${RESOURCES_DEST_DIR} RENAME ${Launcher_Name}.icns) elseif(UNIX) + include(KDEInstallDirs) + set(BINARY_DEST_DIR "bin") set(LIBRARY_DEST_DIR "lib${LIB_SUFFIX}") set(JARS_DEST_DIR "share/jars") - set(LAUNCHER_DESKTOP_DEST_DIR "share/applications" CACHE STRING "Path to the desktop file directory") - set(LAUNCHER_METAINFO_DEST_DIR "share/metainfo" CACHE STRING "Path to the metainfo directory") - set(LAUNCHER_ICON_DEST_DIR "share/icons/hicolor/scalable/apps" CACHE STRING "Path to the scalable icon directory") - set(LAUNCHER_MAN_DEST_DIR "share/man/man6" CACHE STRING "Path to the man page directory") # install as bundle with no dependencies included set(INSTALL_BUNDLE "nodeps") @@ -263,13 +259,10 @@ elseif(UNIX) # Set RPATH SET(Launcher_BINARY_RPATH "$ORIGIN/") - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_Desktop} DESTINATION ${LAUNCHER_DESKTOP_DEST_DIR}) - if(SharedMimeInfo_FOUND) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_mrpack_MIMEInfo} DESTINATION ${KDE_INSTALL_MIMEDIR}) - update_xdg_mimetypes(${KDE_INSTALL_MIMEDIR}) - endif(SharedMimeInfo_FOUND) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_MetaInfo} DESTINATION ${LAUNCHER_METAINFO_DEST_DIR}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_SVG} DESTINATION ${LAUNCHER_ICON_DEST_DIR}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_Desktop} DESTINATION ${KDE_INSTALL_APPDIR}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_MetaInfo} DESTINATION ${KDE_INSTALL_METAINFODIR}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_SVG} DESTINATION "${KDE_INSTALL_ICONDIR}/share/icons/hicolor/scalable/apps") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_mrpack_MIMEInfo} DESTINATION ${KDE_INSTALL_MIMEDIR}) if(Launcher_ManPage) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_ManPage} DESTINATION ${LAUNCHER_MAN_DEST_DIR}) From 9f5537d936da565d8c8df615fb7c9db0a5caf847 Mon Sep 17 00:00:00 2001 From: leozamboni Date: Fri, 4 Nov 2022 15:09:57 -0300 Subject: [PATCH 0107/1149] feat: spooky cat for halloween Signed-off-by: leozamboni --- launcher/resources/backgrounds/backgrounds.qrc | 1 + launcher/resources/backgrounds/kitteh-ween.png | Bin 0 -> 94677 bytes launcher/ui/MainWindow.cpp | 9 +++++---- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 launcher/resources/backgrounds/kitteh-ween.png diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index fb4267070..652e70846 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -4,6 +4,7 @@ kitteh.png kitteh-xmas.png kitteh-bday.png + kitteh-ween.png rory.png rory-xmas.png rory-bday.png diff --git a/launcher/resources/backgrounds/kitteh-ween.png b/launcher/resources/backgrounds/kitteh-ween.png new file mode 100644 index 0000000000000000000000000000000000000000..deb0bebbe65f452a93f6147086e44101d56c0514 GIT binary patch literal 94677 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 literal 0 HcmV?d00001 diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 28eaa741b..afbc505ee 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1560,12 +1560,13 @@ void MainWindow::setCatBackground(bool enabled) QDateTime now = QDateTime::currentDateTime(); QDateTime birthday(QDate(now.date().year(), 11, 30), QTime(0, 0)); QDateTime xmas(QDate(now.date().year(), 12, 25), QTime(0, 0)); + QDateTime halloween(QDate(now.date().year(), 10, 31), QTime(0, 0)); QString cat = APPLICATION->settings()->get("BackgroundCat").toString(); - - if(non_stupid_abs(now.daysTo(xmas)) <= 4) { + if (non_stupid_abs(now.daysTo(xmas)) <= 4) { cat += "-xmas"; - } - else if (non_stupid_abs(now.daysTo(birthday)) <= 12) { + } else if (cat == "kitteh" && non_stupid_abs(now.daysTo(halloween)) <= 4) { + cat += "-ween"; + } else if (non_stupid_abs(now.daysTo(birthday)) <= 12) { cat += "-bday"; } view->setStyleSheet(QString(R"( From 653a953d2fee6a2c140e01dbbd204bde5d424be4 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:30 +0100 Subject: [PATCH 0108/1149] CMake: Add zlib Signed-off-by: TheLastRar --- CMakeLists.txt | 18 ++++++++++++++++++ launcher/CMakeLists.txt | 3 --- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 630cf0cfc..3ed4d7722 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,6 +146,10 @@ set(Launcher_BUILD_TIMESTAMP "${TODAY}") ################################ 3rd Party Libs ################################ +if(NOT Launcher_FORCE_BUNDLED_LIBS) + find_package(ZLIB QUIET) +endif() + # Find the required Qt parts include(QtVersionlessBackport) if(Launcher_QT_VERSION_MAJOR EQUAL 5) @@ -306,6 +310,20 @@ add_subdirectory(libraries/systeminfo) # system information library add_subdirectory(libraries/hoedown) # markdown parser add_subdirectory(libraries/launcher) # java based launcher part for Minecraft add_subdirectory(libraries/javacheck) # java compatibility checker +if(NOT ZLIB_FOUND) + message(STATUS "Using bundled zlib") + set(SKIP_INSTALL_ALL ON) + add_subdirectory(libraries/zlib EXCLUDE_FROM_ALL) + + set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib" "${CMAKE_CURRENT_BINARY_DIR}/libraries/zlib") + set_target_properties(zlibstatic PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}") + add_library(ZLIB::ZLIB ALIAS zlibstatic) + set(ZLIB_LIBRARY ZLIB::ZLIB) + set(ZLIB_FOUND true) + find_package(ZLIB REQUIRED) +else() + message(STATUS "Using system zlib") +endif() if (FORCE_BUNDLED_QUAZIP) message(STATUS "Using bundled QuaZip") set(BUILD_SHARED_LIBS 0) # link statically to avoid conflicts. diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 7998f4f5e..a54a25f9b 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -539,9 +539,6 @@ set(ATLAUNCHER_SOURCES ################################ COMPILE ################################ -# we need zlib -find_package(ZLIB REQUIRED) - set(LOGIC_SOURCES ${CORE_SOURCES} ${PATHMATCHER_SOURCES} From 29c1639b1dd0a578046bb9227d6c8d53132a52b1 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Mon, 31 Oct 2022 01:14:25 +0000 Subject: [PATCH 0109/1149] CMake: Force bundled zlib to take our IPO settings Signed-off-by: TheLastRar --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ed4d7722..08727ae2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,6 +312,7 @@ add_subdirectory(libraries/launcher) # java based launcher part for Minecraft add_subdirectory(libraries/javacheck) # java compatibility checker if(NOT ZLIB_FOUND) message(STATUS "Using bundled zlib") + set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) # Suppress cmake warnings and allow INTERPROCEDURAL_OPTIMIZATION for zlib set(SKIP_INSTALL_ALL ON) add_subdirectory(libraries/zlib EXCLUDE_FROM_ALL) From d52868c6c53935f3c12165e470ba3928295d747c Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:30 +0100 Subject: [PATCH 0110/1149] CI: Exclude zlib tests Signed-off-by: TheLastRar --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba8f9d38d..b3c1a6ec8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -223,13 +223,13 @@ jobs: - name: Test if: runner.os != 'Windows' run: | - ctest --test-dir build --output-on-failure + ctest -E "^example64|example$" --test-dir build --output-on-failure - name: Test (Windows) if: runner.os == 'Windows' shell: msys2 {0} run: | - ctest --test-dir build --output-on-failure + ctest -E "^example64|example$" --test-dir build --output-on-failure ## # CODE SCAN From 1d38248194d4633327c22c2220299ebb10d0c495 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:31 +0100 Subject: [PATCH 0111/1149] Libraries: Add ECM Signed-off-by: TheLastRar --- .gitmodules | 3 +++ libraries/extra-cmake-modules | 1 + 2 files changed, 4 insertions(+) create mode 160000 libraries/extra-cmake-modules diff --git a/.gitmodules b/.gitmodules index 68fb28643..95274f150 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "libraries/zlib"] path = libraries/zlib url = https://github.com/madler/zlib.git +[submodule "libraries/extra-cmake-modules"] + path = libraries/extra-cmake-modules + url = https://github.com/KDE/extra-cmake-modules diff --git a/libraries/extra-cmake-modules b/libraries/extra-cmake-modules new file mode 160000 index 000000000..bbcbaff78 --- /dev/null +++ b/libraries/extra-cmake-modules @@ -0,0 +1 @@ +Subproject commit bbcbaff78283270c2beee69afd8d5b91da854af8 From e777c26a14ac4efb0c22557c38ec5cb9f1632368 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Thu, 27 Oct 2022 22:31:51 +0100 Subject: [PATCH 0112/1149] CMake: Add fallback to bundled ECM Signed-off-by: TheLastRar --- CMakeLists.txt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 08727ae2e..d97934858 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,8 +60,20 @@ endif() option(BUILD_TESTING "Build the testing tree." ON) -find_package(ECM REQUIRED NO_MODULE) -set(CMAKE_MODULE_PATH "${ECM_MODULE_PATH};${CMAKE_MODULE_PATH}") +find_package(ECM QUIET NO_MODULE) +if(NOT ECM_FOUND) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/extra-cmake-modules/CMakeLists.txt") + message(STATUS "Using bundled ECM") + set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libraries/extra-cmake-modules/modules;${CMAKE_MODULE_PATH}") + else() + message(FATAL_ERROR + " Could not find ECM\n \n" + " Either install ECM using the system package manager or clone submodules\n" + " Submodules can be cloned with 'git submodule update --init --recursive'") + endif() +else() + set(CMAKE_MODULE_PATH "${ECM_MODULE_PATH};${CMAKE_MODULE_PATH}") +endif() include(CTest) include(ECMAddTests) if(BUILD_TESTING) From 12632ec404cd056c148c1c2ae026a023788b741e Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:30 +0100 Subject: [PATCH 0113/1149] CMake: Build flags for MSVC Signed-off-by: TheLastRar --- CMakeLists.txt | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d97934858..bb0d6974b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,11 +27,37 @@ set(CMAKE_C_STANDARD_REQUIRED true) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) include(GenerateExportHeader) -set(CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}") +if(MSVC) + # Use /W4 as /Wall includes unnesserey warnings such as added padding to structs + # /permissive- specify standards-conforming compiler behavior, also enabled by Qt6, default on with std:c++20 + # /GS Adds buffer security checks, default on but incuded anyway to mirror gcc's fstack-protector flag + set(CMAKE_CXX_FLAGS "/W4 /permissive- /GS ${CMAKE_CXX_FLAGS}") -# ATL's packlist needs more than the default 1 Mib stack on windows -if(WIN32) - set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}") + # LINK accepts /SUBSYSTEM whics sets if we are a WINDOWS (gui) or a CONSOLE programs + # This implicitly selects an entrypoint specific to the subsystem selected + # qtmain/QtEntryPointLib provides the correct entrypoint (wWinMain) for gui programs + # Additinaly LINK autodetects we use a GUI so we can omit /SUBSYSTEM + # This allows tests to still use have console without using seperate linker flags + # /MANIFEST:NO disables generating a manifest file, we instead provide our own + # /STACK sets the stack reserve size, ATL's pack list needs 3-4 MiB as of November 2022, provide 8 MiB + set(CMAKE_EXE_LINKER_FLAGS "/MANIFEST:NO /STACK:8388608 ${CMAKE_EXE_LINKER_FLAGS}") + + # See https://github.com/ccache/ccache/issues/1040 + # Note, CMake 3.25 replaces this with CMAKE_MSVC_DEBUG_INFORMATION_FORMAT + # See https://cmake.org/cmake/help/v3.25/variable/CMAKE_MSVC_DEBUG_INFORMATION_FORMAT.html + foreach(config DEBUG RELWITHDEBINFO) + foreach(lang C CXX) + set(flags_var "CMAKE_${lang}_FLAGS_${config}") + string(REGEX REPLACE "/Z[Ii]" "/Z7" ${flags_var} "${${flags_var}}") + endforeach() + endforeach() +else() + set(CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}") + + # ATL's pack list needs more than the default 1 Mib stack on windows + if(WIN32) + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--stack,8388608 ${CMAKE_EXE_LINKER_FLAGS}") + endif() endif() # Fix build with Qt 5.13 From 372ce588cd2b851f47816ce6c16712ab0f2b522f Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 26 Oct 2022 01:44:31 +0100 Subject: [PATCH 0114/1149] CI: Add MSVC Builds Signed-off-by: TheLastRar --- .github/workflows/build.yml | 94 +++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b3c1a6ec8..109f7ac03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,6 +27,7 @@ jobs: qt_host: linux qt_version: '6.2.4' qt_modules: 'qt5compat qtimageformats' + qt_tools: '' - os: windows-2022 name: "Windows-Legacy" @@ -38,6 +39,24 @@ jobs: msystem: clang64 qt_ver: 6 + - os: windows-2022 + name: "Windows-Legacy-MSVC" + msystem: '' + qt_ver: 5 + qt_host: windows + qt_version: '5.15.2' + qt_modules: '' + qt_tools: 'tools_openssl_x86' + + - os: windows-2022 + name: "Windows-MSVC" + msystem: '' + qt_ver: 6 + qt_host: windows + qt_version: '6.4.0' + qt_modules: 'qt5compat qtimageformats' + qt_tools: '' + - os: macos-12 name: macOS macosx_deployment_target: 10.15 @@ -45,6 +64,7 @@ jobs: qt_host: mac qt_version: '6.3.0' qt_modules: 'qt5compat qtimageformats' + qt_tools: '' - os: macos-12 name: macOS-Legacy @@ -53,6 +73,7 @@ jobs: qt_host: mac qt_version: '5.15.2' qt_modules: '' + qt_tools: '' runs-on: ${{ matrix.os }} @@ -82,7 +103,7 @@ jobs: languages: cpp, java - name: 'Setup MSYS2' - if: runner.os == 'Windows' + if: runner.os == 'Windows' && matrix.msystem != '' uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.msystem }} @@ -102,14 +123,23 @@ jobs: ccache:p ${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }} + - name: 'Setup MSVC for Ninja' + if: runner.os == 'Windows' && matrix.msystem == '' + uses: ilammy/msvc-dev-cmd@v1 + + - name: Force newer ccache + if: runner.os == 'Windows' && matrix.msystem == '' && inputs.build_type == 'Debug' + run: | + choco install ccache --version 4.7.1 + - name: Setup ccache - if: runner.os != 'Windows' && inputs.build_type == 'Debug' + if: (runner.os != 'Windows' || matrix.msystem == '') && inputs.build_type == 'Debug' uses: hendrikmuhs/ccache-action@v1.2.5 with: key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} - - name: Setup ccache (Windows) - if: runner.os == 'Windows' && inputs.build_type == 'Debug' + - name: Setup ccache (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' shell: msys2 {0} run: | ccache --set-config=cache_dir='${{ github.workspace }}\.ccache' @@ -124,8 +154,8 @@ jobs: run: | echo "CCACHE_VAR=ccache" >> $GITHUB_ENV - - name: Retrieve ccache cache (Windows) - if: runner.os == 'Windows' && inputs.build_type == 'Debug' + - name: Retrieve ccache cache (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' uses: actions/cache@v3.0.11 with: path: '${{ github.workspace }}\.ccache' @@ -156,14 +186,15 @@ jobs: run: | sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 - - name: Install Qt (macOS and AppImage) - if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' + - name: Install Qt (macOS, AppImage & Windows MSVC) + if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '') uses: jurplel/install-qt-action@v3 with: version: ${{ matrix.qt_version }} host: ${{ matrix.qt_host }} target: 'desktop' modules: ${{ matrix.qt_modules }} + tools: ${{ matrix.qt_tools }} cache: true cache-key-prefix: ${{ matrix.qt_host }}-${{ matrix.qt_version }}-"${{ matrix.qt_modules }}"-qt_cache @@ -190,12 +221,17 @@ jobs: run: | cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja - - name: Configure CMake (Windows) - if: runner.os == 'Windows' + - name: Configure CMake (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja + - name: Configure CMake (Windows MSVC) + if: runner.os == 'Windows' && matrix.msystem == '' + run: | + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -G Ninja + - name: Configure CMake (Linux) if: runner.os == 'Linux' run: | @@ -206,12 +242,12 @@ jobs: ## - name: Build - if: runner.os != 'Windows' + if: runner.os != 'Windows' || matrix.msystem == '' run: | cmake --build ${{ env.BUILD_DIR }} - - name: Build (Windows) - if: runner.os == 'Windows' + - name: Build (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | cmake --build ${{ env.BUILD_DIR }} @@ -221,12 +257,12 @@ jobs: ## - name: Test - if: runner.os != 'Windows' + if: runner.os != 'Windows' || matrix.msystem == '' run: | ctest -E "^example64|example$" --test-dir build --output-on-failure - - name: Test (Windows) - if: runner.os == 'Windows' + - name: Test (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | ctest -E "^example64|example$" --test-dir build --output-on-failure @@ -273,8 +309,8 @@ jobs: EOF fi - - name: Package (Windows) - if: runner.os == 'Windows' + - name: Package (Windows MinGW-w64) + if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | cmake --install ${{ env.BUILD_DIR }} @@ -284,13 +320,31 @@ jobs: cp /clang32/bin/libcrypto-1_1.dll /clang32/bin/libssl-1_1.dll ./ fi - - name: Package (Windows, portable) - if: runner.os == 'Windows' + - name: Package (Windows MSVC) + if: runner.os == 'Windows' && matrix.msystem == '' + run: | + cmake --install ${{ env.BUILD_DIR }} + + cd ${{ env.INSTALL_DIR }} + if ("${{ matrix.qt_ver }}" -eq "5") + { + Copy-Item D:/a/PrismLauncher/Qt/Tools/OpenSSL/Win_x86/bin/libcrypto-1_1.dll -Destination libcrypto-1_1.dll + Copy-Item D:/a/PrismLauncher/Qt/Tools/OpenSSL/Win_x86/bin/libssl-1_1.dll -Destination libssl-1_1.dll + } + + - name: Package (Windows MinGW-w64, portable) + if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable + - name: Package (Windows MSVC, portable) + if: runner.os == 'Windows' && matrix.msystem == '' + run: | + cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead + cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable + - name: Package (Windows, installer) if: runner.os == 'Windows' run: | From f8ad1a052f78cb201aee3599214faa7ab644ee06 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sat, 29 Oct 2022 16:55:38 +0100 Subject: [PATCH 0115/1149] CMake: Support multi-configuration generators Signed-off-by: TheLastRar --- CMakeLists.txt | 17 +++-- launcher/CMakeLists.txt | 146 ++++++++++++++++++++-------------------- 2 files changed, 84 insertions(+), 79 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb0d6974b..f282c79f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,11 +74,18 @@ if(ENABLE_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT ipo_supported OUTPUT ipo_error) - if(ipo_supported AND (CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")) - message(STATUS "IPO / LTO enabled") - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - elseif(ipo_supported) - message(STATUS "Not enabling IPO / LTO on debug builds") + if(ipo_supported) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE) + if(CMAKE_BUILD_TYPE) + if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + message(STATUS "IPO / LTO enabled") + else() + message(STATUS "Not enabling IPO / LTO on debug builds") + endif() + else() + message(STATUS "IPO / LTO will only be enabled for release builds") + endif() else() message(STATUS "IPO / LTO not supported: <${ipo_error}>") endif() diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index a54a25f9b..fd1dd03bf 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1059,97 +1059,95 @@ if(INSTALL_BUNDLE STREQUAL "full") COMPONENT Runtime ) # Bundle plugins - if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - # Image formats + # Image formats + install( + DIRECTORY "${QT_PLUGINS_DIR}/imageformats" + CONFIGURATIONS Debug RelWithDebInfo + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "tga|tiff|mng" EXCLUDE + ) + install( + DIRECTORY "${QT_PLUGINS_DIR}/imageformats" + CONFIGURATIONS Release MinSizeRel + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "tga|tiff|mng" EXCLUDE + REGEX "d\\." EXCLUDE + REGEX "_debug\\." EXCLUDE + REGEX "\\.dSYM" EXCLUDE + ) + # Icon engines + install( + DIRECTORY "${QT_PLUGINS_DIR}/iconengines" + CONFIGURATIONS Debug RelWithDebInfo + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "fontawesome" EXCLUDE + ) + install( + DIRECTORY "${QT_PLUGINS_DIR}/iconengines" + CONFIGURATIONS Release MinSizeRel + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "fontawesome" EXCLUDE + REGEX "d\\." EXCLUDE + REGEX "_debug\\." EXCLUDE + REGEX "\\.dSYM" EXCLUDE + ) + # Platform plugins + install( + DIRECTORY "${QT_PLUGINS_DIR}/platforms" + CONFIGURATIONS Debug RelWithDebInfo + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "minimal|linuxfb|offscreen" EXCLUDE + ) + install( + DIRECTORY "${QT_PLUGINS_DIR}/platforms" + CONFIGURATIONS Release MinSizeRel + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "minimal|linuxfb|offscreen" EXCLUDE + REGEX "[^2]d\\." EXCLUDE + REGEX "_debug\\." EXCLUDE + REGEX "\\.dSYM" EXCLUDE + ) + # Style plugins + if(EXISTS "${QT_PLUGINS_DIR}/styles") install( - DIRECTORY "${QT_PLUGINS_DIR}/imageformats" + DIRECTORY "${QT_PLUGINS_DIR}/styles" + CONFIGURATIONS Debug RelWithDebInfo DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime - REGEX "tga|tiff|mng" EXCLUDE ) - # Icon engines install( - DIRECTORY "${QT_PLUGINS_DIR}/iconengines" + DIRECTORY "${QT_PLUGINS_DIR}/styles" + CONFIGURATIONS Release MinSizeRel DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime - REGEX "fontawesome" EXCLUDE - ) - # Platform plugins - install( - DIRECTORY "${QT_PLUGINS_DIR}/platforms" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "minimal|linuxfb|offscreen" EXCLUDE - ) - # Style plugins - if(EXISTS "${QT_PLUGINS_DIR}/styles") - install( - DIRECTORY "${QT_PLUGINS_DIR}/styles" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - ) - endif() - # TLS plugins (Qt 6 only) - if(EXISTS "${QT_PLUGINS_DIR}/tls") - install( - DIRECTORY "${QT_PLUGINS_DIR}/tls" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - ) - endif() - else() - # Image formats - install( - DIRECTORY "${QT_PLUGINS_DIR}/imageformats" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "tga|tiff|mng" EXCLUDE REGEX "d\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) - # Icon engines + endif() + # TLS plugins (Qt 6 only) + if(EXISTS "${QT_PLUGINS_DIR}/tls") install( - DIRECTORY "${QT_PLUGINS_DIR}/iconengines" + DIRECTORY "${QT_PLUGINS_DIR}/tls" + CONFIGURATIONS Debug RelWithDebInfo DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime - REGEX "fontawesome" EXCLUDE - REGEX "d\\." EXCLUDE + ) + install( + DIRECTORY "${QT_PLUGINS_DIR}/tls" + CONFIGURATIONS Release MinSizeRel + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "dd\\." EXCLUDE REGEX "_debug\\." EXCLUDE REGEX "\\.dSYM" EXCLUDE ) - # Platform plugins - install( - DIRECTORY "${QT_PLUGINS_DIR}/platforms" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "minimal|linuxfb|offscreen" EXCLUDE - REGEX "[^2]d\\." EXCLUDE - REGEX "_debug\\." EXCLUDE - REGEX "\\.dSYM" EXCLUDE - ) - # Style plugins - if(EXISTS "${QT_PLUGINS_DIR}/styles") - install( - DIRECTORY "${QT_PLUGINS_DIR}/styles" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "d\\." EXCLUDE - REGEX "_debug\\." EXCLUDE - REGEX "\\.dSYM" EXCLUDE - ) - endif() - # TLS plugins (Qt 6 only) - if(EXISTS "${QT_PLUGINS_DIR}/tls") - install( - DIRECTORY "${QT_PLUGINS_DIR}/tls" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "dd\\." EXCLUDE - REGEX "_debug\\." EXCLUDE - REGEX "\\.dSYM" EXCLUDE - ) - endif() endif() configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/install_prereqs.cmake.in" From cc8456ec6bf239b1386796c5a9cb507dace30085 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Fri, 28 Oct 2022 11:51:55 +0100 Subject: [PATCH 0116/1149] CI: Use msbuild generator for msvc builds Signed-off-by: TheLastRar --- .github/workflows/build.yml | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 109f7ac03..a067312ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,10 +123,6 @@ jobs: ccache:p ${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }} - - name: 'Setup MSVC for Ninja' - if: runner.os == 'Windows' && matrix.msystem == '' - uses: ilammy/msvc-dev-cmd@v1 - - name: Force newer ccache if: runner.os == 'Windows' && matrix.msystem == '' && inputs.build_type == 'Debug' run: | @@ -230,7 +226,17 @@ jobs: - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} + # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) + if ("${{ env.CCACHE_VAR }}") + { + Copy-Item C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/ccache.exe -Destination C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/cl.exe + echo "CLToolExe=cl.exe" >> $env:GITHUB_ENV + echo "CLToolPath=C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/" >> $env:GITHUB_ENV + echo "TrackFileAccess=false" >> $env:GITHUB_ENV + } + # Needed for ccache, but also speeds up compile + echo "UseMultiToolTask=true" >> $env:GITHUB_ENV - name: Configure CMake (Linux) if: runner.os == 'Linux' @@ -242,7 +248,7 @@ jobs: ## - name: Build - if: runner.os != 'Windows' || matrix.msystem == '' + if: runner.os != 'Windows' run: | cmake --build ${{ env.BUILD_DIR }} @@ -252,12 +258,17 @@ jobs: run: | cmake --build ${{ env.BUILD_DIR }} + - name: Build (Windows MSVC) + if: runner.os == 'Windows' && matrix.msystem == '' + run: | + cmake --build ${{ env.BUILD_DIR }} --config ${{ inputs.build_type }} + ## # TEST ## - name: Test - if: runner.os != 'Windows' || matrix.msystem == '' + if: runner.os != 'Windows' run: | ctest -E "^example64|example$" --test-dir build --output-on-failure @@ -267,6 +278,11 @@ jobs: run: | ctest -E "^example64|example$" --test-dir build --output-on-failure + - name: Test (Windows MSVC) + if: runner.os == 'Windows' && matrix.msystem == '' + run: | + ctest -E "^example64|example$" --test-dir build --output-on-failure -C ${{ inputs.build_type }} + ## # CODE SCAN ## @@ -323,7 +339,7 @@ jobs: - name: Package (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake --install ${{ env.BUILD_DIR }} + cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build_type }} cd ${{ env.INSTALL_DIR }} if ("${{ matrix.qt_ver }}" -eq "5") From 4f327120ac34a7a530497bf0f6e2268d847fdb12 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sat, 29 Oct 2022 21:58:08 +0100 Subject: [PATCH 0117/1149] CI: Link to release libraries even in debug Signed-off-by: TheLastRar --- .github/workflows/build.yml | 2 +- CMakeLists.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a067312ac..063e3bc12 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -226,7 +226,7 @@ jobs: - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { diff --git a/CMakeLists.txt b/CMakeLists.txt index f282c79f6..00eb19257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,11 @@ if(MSVC) string(REGEX REPLACE "/Z[Ii]" "/Z7" ${flags_var} "${${flags_var}}") endforeach() endforeach() + + if(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDLL") + set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release "") + set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release "") + endif() else() set(CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}") From 3f75e1cb1db7c048207a8c8842489dc35bc2ffd2 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 30 Oct 2022 14:03:40 +0000 Subject: [PATCH 0118/1149] CI: Build MSVC Legacy as 32bit Signed-off-by: TheLastRar --- .github/workflows/build.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 063e3bc12..adaf484b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,7 @@ jobs: - os: ubuntu-20.04 qt_ver: 6 qt_host: linux + qt_arch: '' qt_version: '6.2.4' qt_modules: 'qt5compat qtimageformats' qt_tools: '' @@ -42,8 +43,10 @@ jobs: - os: windows-2022 name: "Windows-Legacy-MSVC" msystem: '' + architecture: 'win32' qt_ver: 5 qt_host: windows + qt_arch: 'win32_msvc2019' qt_version: '5.15.2' qt_modules: '' qt_tools: 'tools_openssl_x86' @@ -51,8 +54,10 @@ jobs: - os: windows-2022 name: "Windows-MSVC" msystem: '' + architecture: 'x64' qt_ver: 6 qt_host: windows + qt_arch: '' qt_version: '6.4.0' qt_modules: 'qt5compat qtimageformats' qt_tools: '' @@ -62,6 +67,7 @@ jobs: macosx_deployment_target: 10.15 qt_ver: 6 qt_host: mac + qt_arch: '' qt_version: '6.3.0' qt_modules: 'qt5compat qtimageformats' qt_tools: '' @@ -189,6 +195,7 @@ jobs: version: ${{ matrix.qt_version }} host: ${{ matrix.qt_host }} target: 'desktop' + arch: ${{ matrix.qt_arch }} modules: ${{ matrix.qt_modules }} tools: ${{ matrix.qt_tools }} cache: true @@ -226,7 +233,7 @@ jobs: - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { From 98444bd8656c396f4dd04721ddf7721910c07b48 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Mon, 31 Oct 2022 14:43:14 +0000 Subject: [PATCH 0119/1149] CI: Add VC variables before packaging on Windows Signed-off-by: TheLastRar --- .github/workflows/build.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index adaf484b8..3cf99760f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,6 +44,7 @@ jobs: name: "Windows-Legacy-MSVC" msystem: '' architecture: 'win32' + vcvars_arch: 'amd64_x86' qt_ver: 5 qt_host: windows qt_arch: 'win32_msvc2019' @@ -55,6 +56,7 @@ jobs: name: "Windows-MSVC" msystem: '' architecture: 'x64' + vcvars_arch: 'amd64' qt_ver: 6 qt_host: windows qt_arch: '' @@ -332,6 +334,12 @@ jobs: EOF fi + - name: Add VC Enviroment Variables + if: runner.os == 'Windows' && matrix.msystem == '' + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: ${{ matrix.vcvars_arch }} + - name: Package (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} From 79a728d7d2a379799a2813b83a418ece1ff1aa3c Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Tue, 1 Nov 2022 13:46:30 +0000 Subject: [PATCH 0120/1149] Fix: Conflicting types for hoedown functions Signed-off-by: TheLastRar --- libraries/hoedown/src/autolink.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/hoedown/src/autolink.c b/libraries/hoedown/src/autolink.c index 3063b1a0d..3592b8e38 100644 --- a/libraries/hoedown/src/autolink.c +++ b/libraries/hoedown/src/autolink.c @@ -150,7 +150,7 @@ hoedown_autolink__www( uint8_t *data, size_t max_rewind, size_t size, - unsigned int flags) + hoedown_autolink_flags flags) { size_t link_end; @@ -186,7 +186,7 @@ hoedown_autolink__email( uint8_t *data, size_t max_rewind, size_t size, - unsigned int flags) + hoedown_autolink_flags flags) { size_t link_end, rewind; int nb = 0, np = 0; @@ -242,7 +242,7 @@ hoedown_autolink__url( uint8_t *data, size_t max_rewind, size_t size, - unsigned int flags) + hoedown_autolink_flags flags) { size_t link_end, rewind = 0, domain_len; From e29259cd5511f25a4559ff1f8a4e9473ad81ee4e Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Tue, 1 Nov 2022 14:04:14 +0000 Subject: [PATCH 0121/1149] Fix: Resolve ambiguous overload errors Clang-cl fails to select the correct function and instead errors Signed-off-by: TheLastRar --- launcher/modplatform/modrinth/ModrinthPackManifest.cpp | 2 +- launcher/net/HttpMetaCache.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp index a4620df9d..96f54067a 100644 --- a/launcher/modplatform/modrinth/ModrinthPackManifest.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackManifest.cpp @@ -140,7 +140,7 @@ auto loadIndexedVersion(QJsonObject &obj) -> ModpackVersion for (auto file_iter : files) { File indexed_file; auto parent = Json::requireObject(file_iter); - auto is_primary = Json::ensureBoolean(parent, "primary", false); + auto is_primary = Json::ensureBoolean(parent, (const QString)QStringLiteral("primary"), false); if (!is_primary) { auto filename = Json::ensureString(parent, "filename"); // Checking suffix here is fine because it's the response from Modrinth, diff --git a/launcher/net/HttpMetaCache.cpp b/launcher/net/HttpMetaCache.cpp index 42198b714..e242dcf45 100644 --- a/launcher/net/HttpMetaCache.cpp +++ b/launcher/net/HttpMetaCache.cpp @@ -242,7 +242,7 @@ void HttpMetaCache::Load() foo->local_changed_timestamp = Json::ensureDouble(element_obj, "last_changed_timestamp"); foo->remote_changed_timestamp = Json::ensureString(element_obj, "remote_changed_timestamp"); - foo->makeEternal(Json::ensureBoolean(element_obj, "eternal", false)); + foo->makeEternal(Json::ensureBoolean(element_obj, (const QString)QStringLiteral("eternal"), false)); if (!foo->isEternal()) { foo->current_age = Json::ensureDouble(element_obj, "current_age"); foo->max_age = Json::ensureDouble(element_obj, "max_age"); From 396a7994f9f485192b13f21a3dcf6710b50356ed Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Tue, 1 Nov 2022 19:59:37 +0000 Subject: [PATCH 0122/1149] Workflow: Add MSVC Builds to release workflow Signed-off-by: TheLastRar --- .github/workflows/trigger_release.yml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index e74e870aa..d415b2b1d 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -47,10 +47,12 @@ jobs: for d in PrismLauncher-Windows-*; do cd "${d}" || continue + MSVC="$(echo -n ${d} | grep -o MSVC || true)" LEGACY="$(echo -n ${d} | grep -o Legacy || true)" INST="$(echo -n ${d} | grep -o Setup || true)" PORT="$(echo -n ${d} | grep -o Portable || true)" NAME="PrismLauncher-Windows" + test -z "${MSVC}" && NAME="${NAME}-MinGW" || NAME="${NAME}-MSVC" test -z "${LEGACY}" || NAME="${NAME}-Legacy" test -z "${PORT}" || NAME="${NAME}-Portable" test -z "${INST}" || mv PrismLauncher-*.exe ../${NAME}-Setup-${{ env.VERSION }}.exe @@ -72,14 +74,20 @@ jobs: PrismLauncher-Linux-${{ env.VERSION }}.tar.gz PrismLauncher-Linux-Portable-${{ env.VERSION }}.tar.gz PrismLauncher-Linux-${{ env.VERSION }}-x86_64.AppImage - PrismLauncher-Windows-Legacy-${{ env.VERSION }}.zip PrismLauncher-Linux-Qt6-${{ env.VERSION }}.tar.gz PrismLauncher-Linux-Qt6-Portable-${{ env.VERSION }}.tar.gz - PrismLauncher-Windows-Legacy-Portable-${{ env.VERSION }}.zip - PrismLauncher-Windows-Legacy-Setup-${{ env.VERSION }}.exe - PrismLauncher-Windows-${{ env.VERSION }}.zip - PrismLauncher-Windows-Portable-${{ env.VERSION }}.zip - PrismLauncher-Windows-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MinGW-Legacy-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-Legacy-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-Legacy-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MinGW-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MSVC-Legacy-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-Legacy-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-Legacy-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MSVC-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-Setup-${{ env.VERSION }}.exe PrismLauncher-macOS-${{ env.VERSION }}.tar.gz PrismLauncher-macOS-Legacy-${{ env.VERSION }}.tar.gz PrismLauncher-${{ env.VERSION }}.tar.gz From 76050880f16bef13ed152f379e72ce52042676a2 Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 3 Nov 2022 16:14:35 -0300 Subject: [PATCH 0123/1149] fix: use unicode variant for marking '.index' hidden Signed-off-by: flow --- launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp index 4b8789189..cc4e252c1 100644 --- a/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModUpdateTask.cpp @@ -36,7 +36,7 @@ LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& } #ifdef Q_OS_WIN32 - SetFileAttributesA(index_dir.path().toStdString().c_str(), FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); + SetFileAttributesW(index_dir.path().toStdWString().c_str(), FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); #endif } From 353b51f11ea406dd027096c30ec9626ee4e2c417 Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 3 Nov 2022 16:41:55 -0300 Subject: [PATCH 0124/1149] refactor: move MMCStrings -> StringUtils General utilities can go in here >:) Signed-off-by: flow --- launcher/CMakeLists.txt | 4 ++-- launcher/JavaCommon.cpp | 2 +- launcher/MMCStrings.h | 8 -------- launcher/{MMCStrings.cpp => StringUtils.cpp} | 4 ++-- launcher/StringUtils.h | 7 +++++++ launcher/java/JavaInstall.cpp | 7 ++++--- launcher/java/JavaInstallList.cpp | 1 - launcher/java/JavaVersion.cpp | 7 ++++--- launcher/launch/LaunchTask.cpp | 1 - launcher/minecraft/MinecraftInstance.cpp | 1 - launcher/ui/dialogs/ExportInstanceDialog.cpp | 9 ++++----- .../ui/pages/modplatform/atlauncher/AtlFilterModel.cpp | 5 +++-- launcher/ui/pages/modplatform/flame/FlameModel.cpp | 1 - launcher/ui/pages/modplatform/ftb/FtbFilterModel.cpp | 5 +++-- launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp | 4 ++-- 15 files changed, 32 insertions(+), 34 deletions(-) delete mode 100644 launcher/MMCStrings.h rename launcher/{MMCStrings.cpp => StringUtils.cpp} (95%) create mode 100644 launcher/StringUtils.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 0dae47df8..577eba4b3 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -24,8 +24,8 @@ set(CORE_SOURCES NullInstance.h MMCZip.h MMCZip.cpp - MMCStrings.h - MMCStrings.cpp + StringUtils.h + StringUtils.cpp RuntimeContext.h # Basic instance manipulation tasks (derived from InstanceTask) diff --git a/launcher/JavaCommon.cpp b/launcher/JavaCommon.cpp index aa4d11233..52cc868a7 100644 --- a/launcher/JavaCommon.cpp +++ b/launcher/JavaCommon.cpp @@ -36,7 +36,7 @@ #include "JavaCommon.h" #include "java/JavaUtils.h" #include "ui/dialogs/CustomMessageBox.h" -#include + #include bool JavaCommon::checkJVMArgs(QString jvmargs, QWidget *parent) diff --git a/launcher/MMCStrings.h b/launcher/MMCStrings.h deleted file mode 100644 index 48052a00e..000000000 --- a/launcher/MMCStrings.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include - -namespace Strings -{ - int naturalCompare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs); -} diff --git a/launcher/MMCStrings.cpp b/launcher/StringUtils.cpp similarity index 95% rename from launcher/MMCStrings.cpp rename to launcher/StringUtils.cpp index dc91c8d6a..5ae586426 100644 --- a/launcher/MMCStrings.cpp +++ b/launcher/StringUtils.cpp @@ -1,4 +1,4 @@ -#include "MMCStrings.h" +#include "StringUtils.h" /// TAKEN FROM Qt, because it doesn't expose it intelligently static inline QChar getNextChar(const QString &s, int location) @@ -7,7 +7,7 @@ static inline QChar getNextChar(const QString &s, int location) } /// TAKEN FROM Qt, because it doesn't expose it intelligently -int Strings::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs) +int StringUtils::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs) { for (int l1 = 0, l2 = 0; l1 <= s1.count() && l2 <= s2.count(); ++l1, ++l2) { diff --git a/launcher/StringUtils.h b/launcher/StringUtils.h new file mode 100644 index 000000000..fbe721171 --- /dev/null +++ b/launcher/StringUtils.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +namespace StringUtils { +int naturalCompare(const QString& s1, const QString& s2, Qt::CaseSensitivity cs); +} // namespace StringUtils diff --git a/launcher/java/JavaInstall.cpp b/launcher/java/JavaInstall.cpp index 5bcf7bcbf..d5932bcb9 100644 --- a/launcher/java/JavaInstall.cpp +++ b/launcher/java/JavaInstall.cpp @@ -1,9 +1,10 @@ #include "JavaInstall.h" -#include + +#include "StringUtils.h" bool JavaInstall::operator<(const JavaInstall &rhs) { - auto archCompare = Strings::naturalCompare(arch, rhs.arch, Qt::CaseInsensitive); + auto archCompare = StringUtils::naturalCompare(arch, rhs.arch, Qt::CaseInsensitive); if(archCompare != 0) return archCompare < 0; if(id < rhs.id) @@ -14,7 +15,7 @@ bool JavaInstall::operator<(const JavaInstall &rhs) { return false; } - return Strings::naturalCompare(path, rhs.path, Qt::CaseInsensitive) < 0; + return StringUtils::naturalCompare(path, rhs.path, Qt::CaseInsensitive) < 0; } bool JavaInstall::operator==(const JavaInstall &rhs) diff --git a/launcher/java/JavaInstallList.cpp b/launcher/java/JavaInstallList.cpp index 0249bd22e..d2bfde05a 100644 --- a/launcher/java/JavaInstallList.cpp +++ b/launcher/java/JavaInstallList.cpp @@ -41,7 +41,6 @@ #include "java/JavaInstallList.h" #include "java/JavaCheckerJob.h" #include "java/JavaUtils.h" -#include "MMCStrings.h" #include "minecraft/VersionFilterData.h" JavaInstallList::JavaInstallList(QObject *parent) : BaseVersionList(parent) diff --git a/launcher/java/JavaVersion.cpp b/launcher/java/JavaVersion.cpp index 179ccd8d9..0e4fc1d3c 100644 --- a/launcher/java/JavaVersion.cpp +++ b/launcher/java/JavaVersion.cpp @@ -1,5 +1,6 @@ #include "JavaVersion.h" -#include + +#include "StringUtils.h" #include #include @@ -98,12 +99,12 @@ bool JavaVersion::operator<(const JavaVersion &rhs) else if(thisPre && rhsPre) { // both are prereleases - use natural compare... - return Strings::naturalCompare(m_prerelease, rhs.m_prerelease, Qt::CaseSensitive) < 0; + return StringUtils::naturalCompare(m_prerelease, rhs.m_prerelease, Qt::CaseSensitive) < 0; } // neither is prerelease, so they are the same -> this cannot be less than rhs return false; } - else return Strings::naturalCompare(m_string, rhs.m_string, Qt::CaseSensitive) < 0; + else return StringUtils::naturalCompare(m_string, rhs.m_string, Qt::CaseSensitive) < 0; } bool JavaVersion::operator==(const JavaVersion &rhs) diff --git a/launcher/launch/LaunchTask.cpp b/launcher/launch/LaunchTask.cpp index 28fcc4f42..9e1794b34 100644 --- a/launcher/launch/LaunchTask.cpp +++ b/launcher/launch/LaunchTask.cpp @@ -37,7 +37,6 @@ #include "launch/LaunchTask.h" #include "MessageLevel.h" -#include "MMCStrings.h" #include "java/JavaChecker.h" #include "tasks/Task.h" #include diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 3a820951b..de22b365b 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -43,7 +43,6 @@ #include "settings/SettingsObject.h" #include "Application.h" -#include "MMCStrings.h" #include "pathmatcher/RegexpMatcher.h" #include "pathmatcher/MultiMatcher.h" #include "FileSystem.h" diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 9f32dd8e4..88552b239 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -39,13 +39,12 @@ #include #include #include -#include +#include #include #include -#include #include -#include "MMCStrings.h" +#include "StringUtils.h" #include "SeparatorPrefixTree.h" #include "Application.h" #include @@ -85,7 +84,7 @@ public: // sort and proxy model breaks the original model... if (sortColumn() == 0) { - return Strings::naturalCompare(leftFileInfo.fileName(), rightFileInfo.fileName(), + return StringUtils::naturalCompare(leftFileInfo.fileName(), rightFileInfo.fileName(), Qt::CaseInsensitive) < 0; } if (sortColumn() == 1) @@ -94,7 +93,7 @@ public: auto rightSize = rightFileInfo.size(); if ((leftSize == rightSize) || (leftFileInfo.isDir() && rightFileInfo.isDir())) { - return Strings::naturalCompare(leftFileInfo.fileName(), + return StringUtils::naturalCompare(leftFileInfo.fileName(), rightFileInfo.fileName(), Qt::CaseInsensitive) < 0 ? asc diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlFilterModel.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlFilterModel.cpp index c1ab166bc..0887ebeef 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlFilterModel.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlFilterModel.cpp @@ -20,7 +20,8 @@ #include #include -#include + +#include "StringUtils.h" namespace Atl { @@ -86,7 +87,7 @@ bool FilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) co return lv < rv; } else if (currentSorting == ByName) { - return Strings::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; + return StringUtils::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; } // Invalid sorting set, somehow... diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index 9f8605eb3..debae8c32 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -3,7 +3,6 @@ #include "Application.h" #include "ui/widgets/ProjectItem.h" -#include #include #include diff --git a/launcher/ui/pages/modplatform/ftb/FtbFilterModel.cpp b/launcher/ui/pages/modplatform/ftb/FtbFilterModel.cpp index cbf347fcb..e2b548f2d 100644 --- a/launcher/ui/pages/modplatform/ftb/FtbFilterModel.cpp +++ b/launcher/ui/pages/modplatform/ftb/FtbFilterModel.cpp @@ -19,7 +19,8 @@ #include #include "modplatform/modpacksch/FTBPackManifest.h" -#include + +#include "StringUtils.h" namespace Ftb { @@ -81,7 +82,7 @@ bool FilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) co return leftPack.installs < rightPack.installs; } else if (currentSorting == ByName) { - return Strings::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; + return StringUtils::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; } // Invalid sorting set, somehow... diff --git a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp index 2d135e597..6f11cc955 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp @@ -36,7 +36,7 @@ #include "ListModel.h" #include "Application.h" -#include +#include "StringUtils.h" #include #include @@ -66,7 +66,7 @@ bool FilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) co return lv < rv; } else if(currentSorting == Sorting::ByName) { - return Strings::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; + return StringUtils::naturalCompare(leftPack.name, rightPack.name, Qt::CaseSensitive) >= 0; } //UHM, some inavlid value set?! From ab6c7244fc472de0bed761cf29700a96dd89e8ad Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 3 Nov 2022 16:44:23 -0300 Subject: [PATCH 0125/1149] refactor: move FS's toStdString to StringUtils This is so that anyone can use it :) Signed-off-by: flow --- launcher/FileSystem.cpp | 26 ++++++-------------------- launcher/StringUtils.h | 13 +++++++++++++ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4026d6c16..1cbb538c6 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -44,7 +44,9 @@ #include #include #include + #include "DesktopServices.h" +#include "StringUtils.h" #if defined Q_OS_WIN32 #include @@ -79,22 +81,6 @@ namespace fs = std::filesystem; namespace fs = ghc::filesystem; #endif -#if defined Q_OS_WIN32 - -std::wstring toStdString(QString s) -{ - return s.toStdWString(); -} - -#else - -std::string toStdString(QString s) -{ - return s.toStdString(); -} - -#endif - namespace FS { void ensureExists(const QDir& dir) @@ -191,7 +177,7 @@ bool copy::operator()(const QString& offset) auto dst_path = PathCombine(dst, relative_dst_path); ensureFilePathExists(dst_path); - fs::copy(toStdString(src_path), toStdString(dst_path), opt, err); + fs::copy(StringUtils::toStdString(src_path), StringUtils::toStdString(dst_path), opt, err); if (err) { qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); qDebug() << "Source file:" << src_path; @@ -213,7 +199,7 @@ bool copy::operator()(const QString& offset) } // If the root src is not a directory, the previous iterator won't run. - if (!fs::is_directory(toStdString(src))) + if (!fs::is_directory(StringUtils::toStdString(src))) copy_file(src, ""); return err.value() == 0; @@ -223,7 +209,7 @@ bool deletePath(QString path) { std::error_code err; - fs::remove_all(toStdString(path), err); + fs::remove_all(StringUtils::toStdString(path), err); if (err) { qWarning() << "Failed to remove files:" << QString::fromStdString(err.message()); @@ -414,7 +400,7 @@ bool overrideFolder(QString overwritten_path, QString override_path) fs::copy_options opt = copy_opts::recursive | copy_opts::overwrite_existing; // FIXME: hello traveller! Apparently std::copy does NOT overwrite existing files on GNU libstdc++ on Windows? - fs::copy(toStdString(override_path), toStdString(overwritten_path), opt, err); + fs::copy(StringUtils::toStdString(override_path), StringUtils::toStdString(overwritten_path), opt, err); if (err) { qCritical() << QString("Failed to apply override from %1 to %2").arg(override_path, overwritten_path); diff --git a/launcher/StringUtils.h b/launcher/StringUtils.h index fbe721171..d7706b0f1 100644 --- a/launcher/StringUtils.h +++ b/launcher/StringUtils.h @@ -3,5 +3,18 @@ #include namespace StringUtils { + +#if defined Q_OS_WIN32 +inline std::wstring toStdString(QString s) +{ + return s.toStdWString(); +} +#else +inline std::string toStdString(QString s) +{ + return s.toStdString(); +} +#endif + int naturalCompare(const QString& s1, const QString& s2, Qt::CaseSensitivity cs); } // namespace StringUtils From dff5fea9760383984c2e60949341ebdc07eaab5a Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 3 Nov 2022 16:59:03 -0300 Subject: [PATCH 0126/1149] feat: add more separation between types of std::string in StringUtils Signed-off-by: flow --- launcher/StringUtils.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/launcher/StringUtils.h b/launcher/StringUtils.h index d7706b0f1..1799605b3 100644 --- a/launcher/StringUtils.h +++ b/launcher/StringUtils.h @@ -5,15 +5,27 @@ namespace StringUtils { #if defined Q_OS_WIN32 -inline std::wstring toStdString(QString s) +using string = std::wstring; + +inline string toStdString(QString s) { return s.toStdWString(); } +inline QString fromStdString(string s) +{ + return QString::fromStdWString(s); +} #else -inline std::string toStdString(QString s) +using string = std::string; + +inline string toStdString(QString s) { return s.toStdString(); } +inline QString fromStdString(string s) +{ + return QString::fromStdString(s); +} #endif int naturalCompare(const QString& s1, const QString& s2, Qt::CaseSensitivity cs); From d35c2db41e4a1cd9364c2160adb16ddcc4928dce Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 3 Nov 2022 16:59:50 -0300 Subject: [PATCH 0127/1149] fix: separate types of std::string in Packwiz Signed-off-by: flow --- launcher/modplatform/packwiz/Packwiz.cpp | 26 +++++++++++++++--------- launcher/modplatform/packwiz/Packwiz.h | 4 ---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/launcher/modplatform/packwiz/Packwiz.cpp b/launcher/modplatform/packwiz/Packwiz.cpp index b1fe963e2..0ed29311b 100644 --- a/launcher/modplatform/packwiz/Packwiz.cpp +++ b/launcher/modplatform/packwiz/Packwiz.cpp @@ -22,10 +22,14 @@ #include #include -#include +#include "FileSystem.h" +#include "StringUtils.h" + #include "minecraft/mod/Mod.h" #include "modplatform/ModIndex.h" +#include + namespace Packwiz { auto getRealIndexName(QDir& index_dir, QString normalized_fname, bool should_find_match) -> QString @@ -63,22 +67,22 @@ static inline auto indexFileName(QString const& mod_slug) -> QString static ModPlatform::ProviderCapabilities ProviderCaps; // Helper functions for extracting data from the TOML file -auto stringEntry(toml::table table, const std::string entry_name) -> QString +auto stringEntry(toml::table table, QString entry_name) -> QString { - auto node = table[entry_name]; + auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << QString::fromStdString("Failed to read str property '" + entry_name + "' in mod metadata."); + qCritical() << "Failed to read str property '" + entry_name + "' in mod metadata."; return {}; } - return QString::fromStdString(node.value_or("")); + return node.value_or(""); } -auto intEntry(toml::table table, const std::string entry_name) -> int +auto intEntry(toml::table table, QString entry_name) -> int { - auto node = table[entry_name]; + auto node = table[StringUtils::toStdString(entry_name)]; if (!node) { - qCritical() << QString::fromStdString("Failed to read int property '" + entry_name + "' in mod metadata."); + qCritical() << "Failed to read int property '" + entry_name + "' in mod metadata."; return {}; } @@ -145,6 +149,8 @@ void V1::updateModIndex(QDir& index_dir, Mod& mod) // they want to do! if (index_file.exists()) { index_file.remove(); + } else { + FS::ensureFilePathExists(index_file.fileName()); } if (!index_file.open(QIODevice::ReadWrite)) { @@ -228,14 +234,14 @@ auto V1::getIndexForMod(QDir& index_dir, QString slug) -> Mod toml::table table; #if TOML_EXCEPTIONS try { - table = toml::parse_file(index_dir.absoluteFilePath(real_fname).toStdString()); + table = toml::parse_file(StringUtils::toStdString(index_dir.absoluteFilePath(real_fname))); } catch (const toml::parse_error& err) { qWarning() << QString("Could not open file %1!").arg(normalized_fname); qWarning() << "Reason: " << QString(err.what()); return {}; } #else - table = toml::parse_file(index_dir.absoluteFilePath(real_fname).toStdString()); + table = toml::parse_file(StringUtils::toStdString(index_dir.absoluteFilePath(real_fname))); if (!table) { qWarning() << QString("Could not open file %1!").arg(normalized_fname); qWarning() << "Reason: " << QString(table.error().what()); diff --git a/launcher/modplatform/packwiz/Packwiz.h b/launcher/modplatform/packwiz/Packwiz.h index 3ec803771..9754e5c43 100644 --- a/launcher/modplatform/packwiz/Packwiz.h +++ b/launcher/modplatform/packwiz/Packwiz.h @@ -24,7 +24,6 @@ #include #include -struct toml_table_t; class QDir; // Mod from launcher/minecraft/mod/Mod.h @@ -34,9 +33,6 @@ namespace Packwiz { auto getRealIndexName(QDir& index_dir, QString normalized_index_name, bool should_match = false) -> QString; -auto stringEntry(toml_table_t* parent, const char* entry_name) -> QString; -auto intEntry(toml_table_t* parent, const char* entry_name) -> int; - class V1 { public: struct Mod { From 67c99369ab257481064200760c5b7cfb0818a4f2 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 4 Nov 2022 23:43:18 +0100 Subject: [PATCH 0128/1149] fix: use KDEInstallDirs for manpage Signed-off-by: Sefa Eyeoglu --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 727562921..7f1aa1065 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -270,7 +270,7 @@ elseif(UNIX) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_mrpack_MIMEInfo} DESTINATION ${KDE_INSTALL_MIMEDIR}) if(Launcher_ManPage) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_ManPage} DESTINATION ${LAUNCHER_MAN_DEST_DIR}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_ManPage} DESTINATION "${KDE_INSTALL_MANDIR}/man6") endif() # Install basic runner script if component "portable" is selected From f8ea6212c73bc420e9a1c328d2510f32adde4acf Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 5 Nov 2022 10:42:44 +0100 Subject: [PATCH 0129/1149] fix: fix icon install path Signed-off-by: Sefa Eyeoglu --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f1aa1065..807f6a555 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,7 +266,7 @@ elseif(UNIX) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_Desktop} DESTINATION ${KDE_INSTALL_APPDIR}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${Launcher_MetaInfo} DESTINATION ${KDE_INSTALL_METAINFODIR}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_SVG} DESTINATION "${KDE_INSTALL_ICONDIR}/share/icons/hicolor/scalable/apps") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_SVG} DESTINATION "${KDE_INSTALL_ICONDIR}/hicolor/scalable/apps") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${Launcher_mrpack_MIMEInfo} DESTINATION ${KDE_INSTALL_MIMEDIR}) if(Launcher_ManPage) From bdac2a5f4d8b3a87a103fb008b9e790671c0b930 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 5 Nov 2022 11:09:35 +0100 Subject: [PATCH 0130/1149] fix: add missing newline Signed-off-by: Sefa Eyeoglu --- .gitignore | 2 +- snap/snapcraft.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b9a793d2e..010bc3235 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ result/ flatbuild # Snap -*.snap \ No newline at end of file +*.snap diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index f64e5b0a5..8e647eea1 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -52,4 +52,4 @@ apps: - opengl - network - network-bind - - audio-playback \ No newline at end of file + - audio-playback From bfc5a6488bd3a8e0ad2210ae30d20ad2ecaa39cb Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 5 Nov 2022 19:16:56 +0800 Subject: [PATCH 0131/1149] fix(docs): use new format for adaptive images in README Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 57f1e30a3..b718f94ac 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@

-Prism Launcher logo -Prism Launcher logo + + + + Prism Launcher +

From 2999afe7815d0c2a557e95c7518e192650fdc652 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 5 Nov 2022 19:20:08 +0800 Subject: [PATCH 0132/1149] fix: width="50%" Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b718f94ac..8ebc4fb44 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ - Prism Launcher + Prism Launcher

From 016b3448e81105b60c8c7b42cd41b760eb4b60ed Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sat, 5 Nov 2022 13:34:02 +0100 Subject: [PATCH 0133/1149] chore: bump to 6.0 Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22692dae4..0db05f98a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL th set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") ######## Set version numbers ######## -set(Launcher_VERSION_MAJOR 5) +set(Launcher_VERSION_MAJOR 6) set(Launcher_VERSION_MINOR 0) set(Launcher_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}") From 7b1e68bfa8cf9d46e0c810cfa0f077427cfc707a Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Wed, 19 Oct 2022 21:53:57 +0800 Subject: [PATCH 0134/1149] initial support for add to PATH action Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/FileSystem.cpp | 13 +++++++++++++ launcher/FileSystem.h | 5 +++++ launcher/ui/MainWindow.cpp | 29 +++++++++++++++++++++++++++++ launcher/ui/MainWindow.h | 2 ++ 4 files changed, 49 insertions(+) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4026d6c16..13bb95d99 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -163,6 +163,19 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } +bool symlink(const QString& source, const QString& target) +{ + std::error_code err; + + fs::create_symlink(toStdString(source), toStdString(target)); + + if (err) { + qWarning() << "Failed to symlink files:" << QString::fromStdString(err.message()); + } + + return err.value() == 0; +} + bool copy::operator()(const QString& offset) { using copy_opts = fs::copy_options; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index b46f32812..2d4dfb560 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -53,6 +53,11 @@ class FileSystemException : public ::Exception { */ void write(const QString& filename, const QByteArray& data); +/** + * create a symlink + */ +bool symlink(const QString& target, const QString& link); + /** * read data from a file safely\ */ diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index afbc505ee..80d212e97 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -253,6 +254,7 @@ public: QMenu * helpMenu = nullptr; TranslatedToolButton helpMenuButton; TranslatedAction actionClearMetadata; + TranslatedAction actionAddToPATH; TranslatedAction actionReportBug; TranslatedAction actionDISCORD; TranslatedAction actionMATRIX; @@ -348,6 +350,14 @@ public: actionClearMetadata.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Clear cached metadata")); all_actions.append(&actionClearMetadata); + #ifdef Q_OS_MAC + actionAddToPATH = TranslatedAction(MainWindow); + actionAddToPATH->setObjectName(QStringLiteral("actionAddToPATH")); + actionAddToPATH.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Add to &PATH")); + actionAddToPATH.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add the prism binary to PATH.")); + all_actions.append(&actionAddToPATH); + #endif + if (!BuildConfig.BUG_TRACKER_URL.isEmpty()) { actionReportBug = TranslatedAction(MainWindow); actionReportBug->setObjectName(QStringLiteral("actionReportBug")); @@ -448,6 +458,10 @@ public: helpMenu->addAction(actionClearMetadata); + #ifdef Q_OS_MAC + helpMenu->addAction(actionAddToPATH); + #endif + if (!BuildConfig.BUG_TRACKER_URL.isEmpty()) { helpMenu->addAction(actionReportBug); } @@ -533,6 +547,9 @@ public: helpMenu = menuBar->addMenu(tr("&Help")); helpMenu->setSeparatorsCollapsible(false); helpMenu->addAction(actionClearMetadata); + #ifdef Q_OS_MAC + helpMenu->addAction(actionAddToPATH); + #endif helpMenu->addSeparator(); helpMenu->addAction(actionAbout); helpMenu->addAction(actionOpenWiki); @@ -1902,6 +1919,18 @@ void MainWindow::on_actionClearMetadata_triggered() APPLICATION->metacache()->evictAll(); } +void MainWindow::on_actionAddToPATH_triggered() { + auto binaryPath = APPLICATION->arguments().first(); + + auto outcome = FS::symlink(binaryPath, "/usr/local/bin/prism"); + + if (!outcome) { + QMessageBox::critical(this, tr("Failed to add Prism to PATH"), tr("")); + } else { + QMessageBox::information(this, tr("Added Prism to PATH"), tr("Prism was successfully added to your PATH.")); + } +} + void MainWindow::on_actionOpenWiki_triggered() { DesktopServices::openUrl(QUrl(BuildConfig.HELP_URL.arg(""))); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index cb8cb4aa1..097b09837 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -128,6 +128,8 @@ private slots: void on_actionClearMetadata_triggered(); + void on_actionAddToPATH_triggered(); + void on_actionOpenWiki_triggered(); void on_actionMoreNews_triggered(); From cf3aad9c414782996b11cb0779a9c3d7252b5420 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 5 Nov 2022 22:15:31 +0800 Subject: [PATCH 0135/1149] fix: use `osascript` to get admin privileges inspired from VSCode's approach Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 80d212e97..beb73c816 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1920,14 +1920,15 @@ void MainWindow::on_actionClearMetadata_triggered() } void MainWindow::on_actionAddToPATH_triggered() { - auto binaryPath = APPLICATION->arguments().first(); + auto binaryPath = APPLICATION->applicationFilePath(); - auto outcome = FS::symlink(binaryPath, "/usr/local/bin/prism"); + qDebug() << "Symlinking" << binaryPath << "to /usr/local/bin/prism"; + auto outcome = QProcess::execute("/usr/bin/osascript", QStringList()<< "-e" << tr("do shell script \"mkdir -p /usr/local/bin && ln -sf '%1' '/usr/local/bin/prismlauncher'\" with administrator privileges").arg(binaryPath)); if (!outcome) { - QMessageBox::critical(this, tr("Failed to add Prism to PATH"), tr("")); + QMessageBox::information(this, tr("Added Prism to PATH"), tr("Prism was successfully added to your PATH. You can now run it with `prismlauncher` in your Terminal. Enjoy!")); } else { - QMessageBox::information(this, tr("Added Prism to PATH"), tr("Prism was successfully added to your PATH.")); + QMessageBox::critical(this, tr("Failed to add Prism to PATH"), tr("Failed to add Prism to PATH :(")); } } From f1d3481a2907cbc72d99321f645c4a827ed436d2 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 5 Nov 2022 22:25:22 +0800 Subject: [PATCH 0136/1149] fix: remove dumb `FS::symlink` function Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/FileSystem.cpp | 13 ------------- launcher/FileSystem.h | 5 ----- 2 files changed, 18 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 13bb95d99..4026d6c16 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -163,19 +163,6 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } -bool symlink(const QString& source, const QString& target) -{ - std::error_code err; - - fs::create_symlink(toStdString(source), toStdString(target)); - - if (err) { - qWarning() << "Failed to symlink files:" << QString::fromStdString(err.message()); - } - - return err.value() == 0; -} - bool copy::operator()(const QString& offset) { using copy_opts = fs::copy_options; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index 2d4dfb560..b46f32812 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -53,11 +53,6 @@ class FileSystemException : public ::Exception { */ void write(const QString& filename, const QByteArray& data); -/** - * create a symlink - */ -bool symlink(const QString& target, const QString& link); - /** * read data from a file safely\ */ From 3df31579a1b305c9e976f8a21e156a0dd349f40d Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 5 Nov 2022 22:31:07 +0800 Subject: [PATCH 0137/1149] fix: @timoreo22 Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 ++++ launcher/ui/MainWindow.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index beb73c816..c376f4ec4 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -254,7 +254,9 @@ public: QMenu * helpMenu = nullptr; TranslatedToolButton helpMenuButton; TranslatedAction actionClearMetadata; + #ifdef Q_OS_MAC TranslatedAction actionAddToPATH; + #endif TranslatedAction actionReportBug; TranslatedAction actionDISCORD; TranslatedAction actionMATRIX; @@ -1919,6 +1921,7 @@ void MainWindow::on_actionClearMetadata_triggered() APPLICATION->metacache()->evictAll(); } +#ifdef Q_OS_MAC void MainWindow::on_actionAddToPATH_triggered() { auto binaryPath = APPLICATION->applicationFilePath(); @@ -1931,6 +1934,7 @@ void MainWindow::on_actionAddToPATH_triggered() { QMessageBox::critical(this, tr("Failed to add Prism to PATH"), tr("Failed to add Prism to PATH :(")); } } +#endif void MainWindow::on_actionOpenWiki_triggered() { diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index 097b09837..c9ab8bfb9 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -128,7 +128,9 @@ private slots: void on_actionClearMetadata_triggered(); + #ifdef Q_OS_MAC void on_actionAddToPATH_triggered(); + #endif void on_actionOpenWiki_triggered(); From c05f744ec211a211b4a3d0f47f0cdf3efa30fd32 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 23 Oct 2022 06:49:46 -0700 Subject: [PATCH 0138/1149] windows file association is *hard* new macros! Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/win_install.nsi.in | 160 ++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index 0cd7ea118..070d5c7c2 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -110,6 +110,135 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "@Launcher_Copyright@" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "@Launcher_VERSION_NAME4@" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@" + +;-------------------------------- +; Shell Associate Macros + +!macro APP_SETUP DESCRIPTION ICON APP_ID APP_NAME APP_EXE COMMANDTEXT COMMAND ; VERB APP_COMPANY + ; setup APP_ID + WriteRegStr ShCtx "Software\Classes\${APP_ID}" "" `${DESCRIPTION}` + WriteRegStr ShCtx "Software\Classes\${APP_ID}\DefaultIcon" "" `${ICON}` + ; default open verb + WriteRegStr ShCtx "Software\Classes\${APP_ID}\shell" "" "open" + WriteRegStr ShCtx "Software\Classes\${APP_ID}\shell\open" "" `${COMMANDTEXT}` + WriteRegStr ShCtx "Software\Classes\${APP_ID}\shell\open\command" "" `${COMMAND}` + + ; if you want the app to use it's own implementation of a verb + ;WriteRegStr ShCtx "Software\Classes\${APP_ID}\shell\${VERB}" "" "${DESCRIPTION}" + ;WriteRegStr ShCtx "Software\Classes\${APP_ID}\shell\${VERB}\command" "" `${COMMAND}` + + WriteRegStr ShCtx "Software\Classes\Applications\${APP_EXE}\shell\open\command" "" `${COMMAND}` + WriteRegStr ShCtx "Software\Classes\Applications\${APP_EXE}" "FriendlyAppName" `${APP_NAME}` ; [Optional] + ;WriteRegStr ShCtx "Software\Classes\Applications\${APP_EXE}" "ApplicationCompany" `${APP_COMPANY}` ; [Optional] + ;WriteRegNone ShCtx "Software\Classes\Applications\${APP_EXE}\SupportedTypes" ".${EXT}" ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+ + + # Register "Default Programs" [Optional] + !ifdef REGISTER_DEFAULTPROGRAMS + WriteRegStr ShCtx "Software\Classes\Applications\${APP_EXE}\Capabilities" "ApplicationDescription" `${DESCRIPTION}` + WriteRegStr ShCtx "Software\RegisteredApplications" `${APP_NAME}` "Software\Classes\Applications\${APP_EXE}\Capabilities" + !endif + +!macroend + +!macro APP_ASSOCIATE EXT APP_ID APP_EXE + ; Backup the previously associated file class + ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" "" + WriteRegStr ShCtx "Software\Classes\${EXT}" "${APP_ID}_backup" "$R0" + + WriteRegStr ShCtx "Software\Classes\${EXT}" "" "${APP_ID}" + WriteRegNone ShCtx "Software\Classes\${EXT}\OpenWithList" "${APP_EXE}" ; Win2000+ + WriteRegNone ShCtx "Software\Classes\${EXT}\OpenWithProgids" "${APP_ID}" ; WinXP+ + + # Register "Default Programs" [Optional] + !ifdef REGISTER_DEFAULTPROGRAMS + WriteRegStr ShCtx "Software\Classes\Applications\${APP_EXE}\Capabilities\FileAssociations" "${EXT}" "${APP_ID}" + !endif + +!macroend + +!macro APP_UNASSOCIATE EXT APP_ID + + # Unregister file type + ClearErrors + ; restore backup + ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" `${APP_ID}_backup` + WriteRegStr ShCtx "Software\Classes\${EXT}" "" "$R0" + + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${APP_ID}" + ${IfNot} ${Errors} + ${AndIf} $R0 == "${APP_ID}" + DeleteRegValue ShCtx "Software\Classes\${EXT}" "" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${EXT}" + ${EndIf} + + DeleteRegValue ShCtx "Software\Classes\${EXT}\OpenWithList" "${APP_EXE}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${EXT}\OpenWithList" + DeleteRegValue ShCtx "Software\Classes\${EXT}\OpenWithProgids" "${APP_ID}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${EXT}" + + # Attempt to clean up junk left behind by the Windows shell + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "${APP_ID}_${EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "Applications\${APP_EXE}_${EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${EXT}\OpenWithProgids" "${APP_ID}" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${EXT}\OpenWithList" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\.${EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\.${EXT}" + +!macroend + +!macro APP_TEARDOWN APP_ID APP_NAME APP_EXE + + # Unregister file type + ClearErrors + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${APP_ID}\shell" + ${IfNot} ${Errors} + DeleteRegKey ShCtx "Software\Classes\${APP_ID}\DefaultIcon" + ${EndIf} + + # Unregister "Open With" + DeleteRegKey ShCtx "Software\Classes\Applications\${APP_EXE}" + + # Unregister "Default Programs" + !ifdef REGISTER_DEFAULTPROGRAMS + DeleteRegValue ShCtx "Software\RegisteredApplications" `${APP_NAME}` + DeleteRegKey ShCtx "Software\Classes\Applications\${APP_EXE}\Capabilities" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\Applications\${APP_EXE}" + !endif + + DeleteRegKey ShCtx `Software\Classes\${APP_ID}` + DeleteRegKey ShCtx "Software\Classes\Applications\${APP_EXE}" + + # Attempt to clean up junk left behind by the Windows shell + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "$INSTDIR\${APP_EXE}" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$INSTDIR\${APP_EXE}.FriendlyAppName" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$INSTDIR\${APP_EXE}.ApplicationCompany" + DeleteRegValue HKCU "Software\Microsoft\Windows\ShellNoRoam\MUICache" "$INSTDIR\${APP_EXE}" ; WinXP + DeleteRegValue HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store" "$INSTDIR\${APP_EXE}" + +!macroend + +; !defines for use with SHChangeNotify +!ifdef SHCNE_ASSOCCHANGED +!undef SHCNE_ASSOCCHANGED +!endif +!define SHCNE_ASSOCCHANGED 0x08000000 +!ifdef SHCNF_FLUSH +!undef SHCNF_FLUSH +!endif +!define SHCNF_FLUSH 0x1000 + + +# ensure this is called at the end of any section that changes shell keys +!macro NotifyShell_AssocChanged +; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we +; can update the shell. + System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)" +!macroend + + ;-------------------------------- ; The stuff to install @@ -171,6 +300,27 @@ Section /o "Desktop Shortcut" DESKTOP_SHORTCUTS SectionEnd + +!define APP_ID "@Launcher_CommonName@.App" +!define APP_EXE "@Launcher_APP_BINARY_NAME@.exe" +!define APP_ICON "$INSTDIR\${APP_EXE},0" +!define APP_DESCRIPTION "@Launcher_DisplayName@" +!define APP_NAME "@Launcher_DisplayName@" +!define APP_CMD_TEXT "Prism Launcher instance" + +;!define REGISTER_DEFAULTPROGRAMS "on" ; value doesn't matter + +Section -ShellAssoc + + !insertmacro APP_SETUP `${APP_DESCRIPTION}` `${APP_ICON}` `${APP_ID}` `${APP_CMD_TEXT}` `${APP_EXE}` `${APP_CMD_TEXT}` '$INSTDIR\${APP_EXE} "%1"' + + !insertmacro APP_ASSOCIATE ".zip" `${APP_ID}` `${APP_EXE}` + !insertmacro APP_ASSOCIATE ".mrpack" `${APP_ID}` `${APP_EXE}` + + !insertmacro NotifyShell_AssocChanged +SectionEnd + + ;-------------------------------- ; Uninstaller @@ -202,6 +352,16 @@ Section "Uninstall" SectionEnd +Section -un.ShellAssoc + + !insertmacro APP_TEARDOWN `${APP_ID}` `${APP_NAME}` `${APP_EXE}` + + !insertmacro APP_UNASSOCIATE ".zip" `${APP_ID}` + !insertmacro APP_UNASSOCIATE ".mrpack" `${APP_ID}` + + !insertmacro NotifyShell_AssocChanged +SectionEnd + ;-------------------------------- ; Extra command line parameters From 96008d3bb25399231a84af8fc863b6d9f3a69007 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 23 Oct 2022 08:44:15 -0700 Subject: [PATCH 0139/1149] add -I import flag & don't clobber .zip assoc Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/win_install.nsi.in | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index 070d5c7c2..7bef0fafa 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -140,12 +140,14 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ !macroend -!macro APP_ASSOCIATE EXT APP_ID APP_EXE +!macro APP_ASSOCIATE EXT APP_ID APP_EXE OVERWIRTE ; Backup the previously associated file class + ${If} ${OVERWIRTE} == true ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" "" WriteRegStr ShCtx "Software\Classes\${EXT}" "${APP_ID}_backup" "$R0" - WriteRegStr ShCtx "Software\Classes\${EXT}" "" "${APP_ID}" + ${EndIf} + WriteRegNone ShCtx "Software\Classes\${EXT}\OpenWithList" "${APP_EXE}" ; Win2000+ WriteRegNone ShCtx "Software\Classes\${EXT}\OpenWithProgids" "${APP_ID}" ; WinXP+ @@ -161,8 +163,13 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ # Unregister file type ClearErrors ; restore backup - ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" `${APP_ID}_backup` - WriteRegStr ShCtx "Software\Classes\${EXT}" "" "$R0" + ReadRegStr $R1 ShCtx "Software\Classes\${EXT}" "" + ${If} $R1 == "${APP_ID}" + ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" `${APP_ID}_backup` + WriteRegStr ShCtx "Software\Classes\${EXT}" "" "$R0" + ${Else} + ReadRegStr $R0 ShCtx "Software\Classes\${EXT}" "" + ${EndIf} DeleteRegKey /IfEmpty ShCtx "Software\Classes\${APP_ID}" ${IfNot} ${Errors} @@ -308,14 +315,14 @@ SectionEnd !define APP_NAME "@Launcher_DisplayName@" !define APP_CMD_TEXT "Prism Launcher instance" -;!define REGISTER_DEFAULTPROGRAMS "on" ; value doesn't matter +!define REGISTER_DEFAULTPROGRAMS ; value doesn't matter Section -ShellAssoc - !insertmacro APP_SETUP `${APP_DESCRIPTION}` `${APP_ICON}` `${APP_ID}` `${APP_CMD_TEXT}` `${APP_EXE}` `${APP_CMD_TEXT}` '$INSTDIR\${APP_EXE} "%1"' + !insertmacro APP_SETUP `${APP_DESCRIPTION}` `${APP_ICON}` `${APP_ID}` `${APP_CMD_TEXT}` `${APP_EXE}` `${APP_CMD_TEXT}` '$INSTDIR\${APP_EXE} -I "%1"' - !insertmacro APP_ASSOCIATE ".zip" `${APP_ID}` `${APP_EXE}` - !insertmacro APP_ASSOCIATE ".mrpack" `${APP_ID}` `${APP_EXE}` + !insertmacro APP_ASSOCIATE ".zip" `${APP_ID}` `${APP_EXE}` false + !insertmacro APP_ASSOCIATE ".mrpack" `${APP_ID}` `${APP_EXE}` true !insertmacro NotifyShell_AssocChanged SectionEnd From 9f462dcc27a614fc9098184137dfad443958b883 Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 5 Nov 2022 16:28:54 -0300 Subject: [PATCH 0140/1149] fix: update tomlplusplus submodule This fixes an issue with Windows TOML file parsing with non-latin characters. Signed-off-by: flow --- libraries/tomlplusplus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tomlplusplus b/libraries/tomlplusplus index 4b166b69f..cc741c9f5 160000 --- a/libraries/tomlplusplus +++ b/libraries/tomlplusplus @@ -1 +1 @@ -Subproject commit 4b166b69f28e70a416a1a04a98f365d2aeb90de8 +Subproject commit cc741c9f5f2a62856a2a2e9e275f61eb0591c09c From 0938f80b4148cfc1734636e15da5ddb8b9a7bdfb Mon Sep 17 00:00:00 2001 From: leo78913 Date: Sat, 5 Nov 2022 18:10:36 -0300 Subject: [PATCH 0141/1149] Update launcher/ui/MainWindow.cpp Co-authored-by: flow Signed-off-by: leo78913 --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index ef056fcb1..7bbc1bde2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -930,7 +930,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow { bool toolbarsLocked = APPLICATION->settings()->get("ToolbarsLocked").toBool(); ui->actionLockToolbars->setChecked(toolbarsLocked); - connect(ui->actionLockToolbars.operator->(), SIGNAL(toggled(bool)), SLOT(lockToolbars(bool))); + connect(ui->actionLockToolbars, &QAction::toggled, this, &MainWindow::lockToolbars); lockToolbars(toolbarsLocked); } // start instance when double-clicked From 369419870e6d241e4e21bae2ef243dc6a12ac7d4 Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Sat, 5 Nov 2022 23:55:43 +0100 Subject: [PATCH 0142/1149] add: Spooky Rory Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- launcher/resources/backgrounds/backgrounds.qrc | 2 ++ .../resources/backgrounds/rory-flat-spooky.png | Bin 0 -> 66906 bytes launcher/resources/backgrounds/rory-spooky.png | Bin 0 -> 95940 bytes 3 files changed, 2 insertions(+) create mode 100644 launcher/resources/backgrounds/rory-flat-spooky.png create mode 100644 launcher/resources/backgrounds/rory-spooky.png diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index 652e70846..edfa44c0e 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -8,8 +8,10 @@ rory.png rory-xmas.png rory-bday.png + rory-spooky.png rory-flat.png rory-flat-xmas.png rory-flat-bday.png + rory-flat-spooky.png diff --git a/launcher/resources/backgrounds/rory-flat-spooky.png b/launcher/resources/backgrounds/rory-flat-spooky.png new file mode 100644 index 0000000000000000000000000000000000000000..6360c612fc2108e300cd6243be36d4530388d78d GIT binary patch literal 66906 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%0AD-#QC14AnVB=z|z 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

* Changing field and method declarations without further testing is not recommended. */ public final class Launcher extends Applet implements AppletStub { @@ -47,6 +48,7 @@ public final class Launcher extends Applet implements AppletStub { } public Launcher(Applet applet, URL documentBase) { + super(); this.setLayout(new BorderLayout()); this.add(applet, "Center"); @@ -153,6 +155,7 @@ public final class Launcher extends Applet implements AppletStub { active = false; } + @Override public void destroy() { wrappedApplet.destroy(); } @@ -163,15 +166,17 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public void setVisible(boolean b) { - super.setVisible(b); + public void setVisible(boolean visible) { + super.setVisible(visible); - wrappedApplet.setVisible(b); + wrappedApplet.setVisible(visible); } + @Override public void paint(Graphics paramGraphics) { } + @Override public void update(Graphics paramGraphics) { } From e86fbc697f819345cd42db7008509e89cfdddd73 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 09:47:09 +0100 Subject: [PATCH 0160/1149] Fix formatting Signed-off-by: TheKodeToad --- .../launcher/net/minecraft/Launcher.java | 80 +++++++++---------- .../org/prismlauncher/EntryPoint.java | 58 +++++++------- .../org/prismlauncher/launcher/Launcher.java | 3 +- .../launcher/LauncherFactory.java | 13 ++- .../launcher/LauncherProvider.java | 4 +- .../launcher/impl/AbstractLauncher.java | 18 ++--- .../launcher/impl/LegacyLauncher.java | 7 +- .../org/prismlauncher/utils/LegacyUtils.java | 14 ++-- 8 files changed, 94 insertions(+), 103 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 8928dbbe1..77050d90c 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -16,7 +16,6 @@ package net.minecraft; - import java.applet.Applet; import java.applet.AppletStub; import java.awt.BorderLayout; @@ -27,40 +26,39 @@ import java.net.URL; import java.util.Map; import java.util.TreeMap; - /** * WARNING: This class is reflectively accessed by legacy Forge versions. *

* Changing field and method declarations without further testing is not recommended. */ public final class Launcher extends Applet implements AppletStub { - + private final Map params = new TreeMap<>(); - + private Applet wrappedApplet; - + private final URL documentBase; - + private boolean active = false; - + public Launcher(Applet applet) { this(applet, null); } - + public Launcher(Applet applet, URL documentBase) { super(); this.setLayout(new BorderLayout()); - + this.add(applet, "Center"); - + this.wrappedApplet = applet; - + try { if (documentBase != null) { this.documentBase = documentBase; } else if (applet.getClass().getPackage().getName().startsWith("com.mojang")) { // Special case only for Classic versions - + // TODO: 2022-10-27 Can this be changed to https this.documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); } else { @@ -71,35 +69,35 @@ public final class Launcher extends Applet implements AppletStub { throw new RuntimeException(e); } } - + public void replace(Applet applet) { this.wrappedApplet = applet; - + applet.setStub(this); applet.setSize(getWidth(), getHeight()); - + this.setLayout(new BorderLayout()); this.add(applet, "Center"); - + applet.init(); - + active = true; - + applet.start(); - + validate(); } - + @Override public boolean isActive() { return active; } - + @Override public URL getDocumentBase() { return documentBase; } - + @Override public URL getCodeBase() { try { @@ -109,79 +107,79 @@ public final class Launcher extends Applet implements AppletStub { throw new RuntimeException(e); } } - + @Override public String getParameter(String name) { String param = params.get(name); - + if (param != null) return param; - + try { return super.getParameter(name); } catch (Exception ignored) { } - + return null; } - + @Override public void resize(int width, int height) { wrappedApplet.resize(width, height); } - + @Override public void resize(Dimension d) { wrappedApplet.resize(d); } - + @Override public void init() { if (wrappedApplet != null) wrappedApplet.init(); } - + @Override public void start() { wrappedApplet.start(); - + active = true; } - + @Override public void stop() { wrappedApplet.stop(); - + active = false; } - + @Override public void destroy() { wrappedApplet.destroy(); } - + @Override public void appletResize(int width, int height) { wrappedApplet.resize(width, height); } - + @Override public void setVisible(boolean visible) { super.setVisible(visible); - + wrappedApplet.setVisible(visible); } - + @Override public void paint(Graphics paramGraphics) { } - + @Override public void update(Graphics paramGraphics) { } - + public void setParameter(String name, String value) { params.put(name, value); } - + } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index b1464f594..cb68b8fd6 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -52,7 +52,6 @@ package org.prismlauncher; - import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherFactory; @@ -65,37 +64,37 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; - public final class EntryPoint { + private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - + private final Parameters params = new Parameters(); - + public static void main(String[] args) { EntryPoint listener = new EntryPoint(); - + ExitCode exitCode = listener.listen(); - + if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); - + System.exit(exitCode.numericalCode); } } - + private static PreLaunchAction parseLine(String inData, Parameters params) throws ParseException { if (inData.isEmpty()) throw new ParseException("Unexpected empty string!"); - + String first = inData; String second = null; int splitPoint = inData.indexOf(' '); - + if (splitPoint != -1) { first = first.substring(0, splitPoint); second = inData.substring(splitPoint + 1); } - + switch (first) { case "launch": return PreLaunchAction.LAUNCH; @@ -104,22 +103,22 @@ public final class EntryPoint { default: if (second == null || second.isEmpty()) throw new ParseException("Error while parsing:" + inData); - + params.add(first, second); - + return PreLaunchAction.PROCEED; } } - + public ExitCode listen() { PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; - + try (BufferedReader reader = new BufferedReader(new InputStreamReader( System.in, StandardCharsets.UTF_8 ))) { String line; - + while (preLaunchAction == PreLaunchAction.PROCEED) { if ((line = reader.readLine()) != null) { preLaunchAction = parseLine(line, this.params); @@ -129,50 +128,49 @@ public final class EntryPoint { } } catch (IOException | ParseException e) { LOGGER.log(Level.SEVERE, "Launcher abort due to exception:", e); - + return ExitCode.ERROR; } - + // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { LOGGER.info("Launch aborted by the launcher."); - + return ExitCode.ERROR; } - + try { Launcher launcher = LauncherFactory.createLauncher(params); - + launcher.launch(); - + return ExitCode.NORMAL; } catch (IllegalArgumentException e) { LOGGER.log(Level.SEVERE, "Wrong argument.", e); - + return ExitCode.ERROR; } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Exception caught from launcher.", e); - + return ExitCode.ERROR; } } - + private enum PreLaunchAction { PROCEED, LAUNCH, ABORT } - - + private enum ExitCode { NORMAL(0), ERROR(1); - + private final int numericalCode; - + ExitCode(int numericalCode) { this.numericalCode = numericalCode; } } - + } diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index 1cea255c8..6f5c17b8b 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -16,7 +16,8 @@ package org.prismlauncher.launcher; - public interface Launcher { + void launch() throws Throwable; + } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 6c6011711..761a4595b 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -35,7 +35,6 @@ package org.prismlauncher.launcher; - import org.prismlauncher.launcher.impl.LegacyLauncher; import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.utils.Parameters; @@ -43,10 +42,10 @@ import org.prismlauncher.utils.Parameters; import java.util.HashMap; import java.util.Map; - public final class LauncherFactory { + private static final Map launcherRegistry = new HashMap<>(); - + static { launcherRegistry.put("standard", new LauncherProvider() { @Override @@ -63,15 +62,15 @@ public final class LauncherFactory { } private LauncherFactory() { } - + public static Launcher createLauncher(Parameters parameters) { String name = parameters.getString("launcher"); - + LauncherProvider launcherProvider = launcherRegistry.get(name); - + if (launcherProvider == null) throw new IllegalArgumentException("Invalid launcher type: " + name); - + return launcherProvider.provide(parameters); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java index b6d1caabc..9b453c7be 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java @@ -35,10 +35,10 @@ package org.prismlauncher.launcher; - import org.prismlauncher.utils.Parameters; - public interface LauncherProvider { + Launcher provide(Parameters parameters); + } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 637c5da78..5aab40ffb 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -15,7 +15,6 @@ package org.prismlauncher.launcher.impl; - import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; @@ -26,9 +25,8 @@ import java.lang.invoke.MethodType; import java.util.ArrayList; import java.util.List; - public abstract class AbstractLauncher implements Launcher { - + private static final int DEFAULT_WINDOW_WIDTH = 854; private static final int DEFAULT_WINDOW_HEIGHT = 480; @@ -44,21 +42,21 @@ public abstract class AbstractLauncher implements Launcher { protected final String serverAddress, serverPort; protected final ClassLoader classLoader; - + protected AbstractLauncher(Parameters params) { classLoader = ClassLoader.getSystemClassLoader(); - + mcParams = params.getList("param", new ArrayList()); mainClass = params.getString("mainClass", "net.minecraft.client.Minecraft"); - + serverAddress = params.getString("serverAddress", null); serverPort = params.getString("serverPort", null); - + String windowParams = params.getString("windowParams", null); - + if ("max".equals(windowParams) || windowParams == null) { maximize = windowParams != null; - + width = DEFAULT_WINDOW_WIDTH; height = DEFAULT_WINDOW_HEIGHT; } else { @@ -82,7 +80,7 @@ public abstract class AbstractLauncher implements Launcher { protected Class loadMain() throws ClassNotFoundException { return classLoader.loadClass(mainClass); } - + protected void loadAndInvokeMain() throws Throwable { invokeMain(loadMain()); } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java index 181156c6d..57e296050 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -15,7 +15,6 @@ package org.prismlauncher.launcher.impl; - import org.prismlauncher.applet.LegacyFrame; import org.prismlauncher.utils.LegacyUtils; import org.prismlauncher.utils.Parameters; @@ -45,15 +44,15 @@ public final class LegacyLauncher extends AbstractLauncher { public LegacyLauncher(Parameters params) { super(params); - + user = params.getString("userName"); session = params.getString("sessionId"); title = params.getString("windowTitle", "Minecraft"); appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); - + List traits = params.getList("traits", Collections.emptyList()); noApplet = traits.contains("noapplet"); - + cwd = System.getProperty("user.dir"); } diff --git a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java index 7607d7314..ca6480125 100644 --- a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java @@ -16,17 +16,15 @@ package org.prismlauncher.utils; - import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Modifier; - public final class LegacyUtils { - + private LegacyUtils() { } - + /** * Finds a field that looks like a Minecraft base folder in a supplied class * @@ -39,16 +37,16 @@ public final class LegacyUtils { // Has to be File if (field.getType() != File.class) continue; - + // And Private Static. if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) continue; - + return field; } - + return null; } - + } From c0b8c53e6960de48c6a43796b413d1780f681a3a Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 15:05:43 +0100 Subject: [PATCH 0161/1149] Attempt to sort out copyright headers Signed-off-by: TheKodeToad --- .../launcher/net/minecraft/Launcher.java | 58 ++++++++++--- .../org/prismlauncher/EntryPoint.java | 4 +- .../org/prismlauncher/applet/LegacyFrame.java | 60 +++++++++++--- .../exception/ParameterNotFoundException.java | 58 ++++++++++--- .../exception/ParseException.java | 58 ++++++++++--- .../org/prismlauncher/launcher/Launcher.java | 61 +++++++++++--- .../launcher/LauncherFactory.java | 26 +++++- .../launcher/LauncherProvider.java | 20 ++++- .../launcher/impl/AbstractLauncher.java | 60 +++++++++++--- .../launcher/impl/LegacyLauncher.java | 60 +++++++++++--- .../launcher/impl/StandardLauncher.java | 59 ++++++++++--- .../org/prismlauncher/utils/LegacyUtils.java | 58 ++++++++++--- .../org/prismlauncher/utils/Parameters.java | 82 ++++++++++++++----- 13 files changed, 548 insertions(+), 116 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 77050d90c..2f8a51c96 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -1,17 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package net.minecraft; diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index cb68b8fd6..40494b7cf 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -1,7 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only /* * PolyMC - Minecraft Launcher - * Copyright (C) 2022 icelimetea, + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * * 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/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java index f3359fcae..20ec25035 100644 --- a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java @@ -1,17 +1,57 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 flow + * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 TheKodeToad * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.applet; diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index 641e0c995..c083e02a3 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -1,17 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Samisafool * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.exception; diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 51d25a623..8904f9ee0 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -1,17 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Samisafool * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.exception; diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index 6f5c17b8b..a41e4af6b 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -1,19 +1,58 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ - package org.prismlauncher.launcher; public interface Launcher { diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 761a4595b..e6de35faf 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -1,7 +1,11 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - Minecraft Launcher - * Copyright (C) 2022 icelimetea, + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * * 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 @@ -31,6 +35,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.launcher; @@ -73,4 +94,5 @@ public final class LauncherFactory { return launcherProvider.provide(parameters); } + } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java index 9b453c7be..66d23c0f6 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* * PolyMC - Minecraft Launcher - * Copyright (C) 2022 solonovamax, + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 solonovamax * * 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 @@ -31,6 +32,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.launcher; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 5aab40ffb..7a622b1b5 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -1,16 +1,56 @@ -/* Copyright 2012-2021 MultiMC Contributors +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.launcher.impl; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java index 57e296050..fb1540bf7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -1,16 +1,56 @@ -/* Copyright 2012-2021 MultiMC Contributors +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 flow + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.launcher.impl; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index c1d33958a..5c884e999 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -1,16 +1,55 @@ -/* Copyright 2012-2021 MultiMC Contributors +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.launcher.impl; diff --git a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java index ca6480125..8e7cbb744 100644 --- a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java @@ -1,17 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.utils; diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 00b0701f0..5596e88a5 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -1,17 +1,57 @@ +// SPDX-License-Identifier: GPL-3.0-only /* - * Copyright 2012-2021 MultiMC Contributors + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 icelimetea + * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 solonovamax * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * 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. * - * http://www.apache.org/licenses/LICENSE-2.0 + * 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. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.utils; @@ -41,37 +81,37 @@ public final class Parameters { public List getList(String key) throws ParameterNotFoundException { List params = map.get(key); - + if (params == null) throw new ParameterNotFoundException(key); - + return params; } - + public List getList(String key, List def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params; } - + public String getString(String key) throws ParameterNotFoundException { List list = getList(key); - + if (list.isEmpty()) throw new ParameterNotFoundException(key); - + return list.get(0); } - + public String getString(String key, String def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params.get(0); } From a7b1700d4232cc055c50286a57d627db23d6b4cd Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 15:20:27 +0100 Subject: [PATCH 0162/1149] Better variable naming Signed-off-by: TheKodeToad --- .../launcher/net/minecraft/Launcher.java | 9 ++- .../org/prismlauncher/applet/LegacyFrame.java | 55 +++++++++---------- .../org/prismlauncher/launcher/Launcher.java | 1 + .../launcher/impl/LegacyLauncher.java | 4 +- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 2f8a51c96..aef09ca92 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -84,7 +84,6 @@ public final class Launcher extends Applet implements AppletStub { } public Launcher(Applet applet, URL documentBase) { - super(); this.setLayout(new BorderLayout()); this.add(applet, "Center"); @@ -167,8 +166,8 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public void resize(Dimension d) { - wrappedApplet.resize(d); + public void resize(Dimension size) { + wrappedApplet.resize(size); } @Override @@ -209,11 +208,11 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public void paint(Graphics paramGraphics) { + public void paint(Graphics graphics) { } @Override - public void update(Graphics paramGraphics) { + public void update(Graphics graphics) { } public void setParameter(String name, String value) { diff --git a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java index 20ec25035..581251603 100644 --- a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java @@ -74,19 +74,18 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -@SuppressWarnings("removal") public final class LegacyFrame extends Frame { private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); - private final Launcher appletWrap; + private final Launcher launcher; - public LegacyFrame(String title, Applet mcApplet) { + public LegacyFrame(String title, Applet applet) { super(title); - appletWrap = new Launcher(mcApplet); + launcher = new Launcher(applet); - mcApplet.setStub(appletWrap); + applet.setStub(launcher); try { setIconImage(ImageIO.read(new File("icon.png"))); @@ -100,8 +99,8 @@ public final class LegacyFrame extends Frame { public void start ( String user, String session, - int winSizeW, - int winSizeH, + int width, + int height, boolean maximize, String serverAddress, String serverPort, @@ -130,9 +129,9 @@ public final class LegacyFrame extends Frame { LOGGER.warning("Mpticket file is corrupted!"); } else { // Assumes parameters are valid and in the correct order - appletWrap.setParameter("server", lines.get(0)); - appletWrap.setParameter("port", lines.get(1)); - appletWrap.setParameter("mppass", lines.get(2)); + launcher.setParameter("server", lines.get(0)); + launcher.setParameter("port", lines.get(1)); + launcher.setParameter("mppass", lines.get(2)); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Unable to read mpticket file!", e); @@ -140,20 +139,20 @@ public final class LegacyFrame extends Frame { } if (serverAddress != null) { - appletWrap.setParameter("server", serverAddress); - appletWrap.setParameter("port", serverPort); + launcher.setParameter("server", serverAddress); + launcher.setParameter("port", serverPort); } - appletWrap.setParameter("username", user); - appletWrap.setParameter("sessionid", session); - appletWrap.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? - appletWrap.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. - appletWrap.setParameter("demo", isDemo ? "true" : "false"); - appletWrap.setParameter("fullscreen", "false"); + launcher.setParameter("username", user); + launcher.setParameter("sessionid", session); + launcher.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? + launcher.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. + launcher.setParameter("demo", isDemo ? "true" : "false"); + launcher.setParameter("fullscreen", "false"); - add(appletWrap); + add(launcher); - appletWrap.setPreferredSize(new Dimension(winSizeW, winSizeH)); + launcher.setPreferredSize(new Dimension(width, height)); pack(); @@ -165,8 +164,8 @@ public final class LegacyFrame extends Frame { validate(); - appletWrap.init(); - appletWrap.start(); + launcher.init(); + launcher.start(); setVisible(true); } @@ -174,14 +173,14 @@ public final class LegacyFrame extends Frame { private final class ForceExitHandler extends WindowAdapter { @Override - public void windowClosing(WindowEvent e) { + public void windowClosing(WindowEvent event) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(30000L); - } catch (InterruptedException localInterruptedException) { - localInterruptedException.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); } LOGGER.info("Forcing exit!"); @@ -190,9 +189,9 @@ public final class LegacyFrame extends Frame { } }).start(); - if (appletWrap != null) { - appletWrap.stop(); - appletWrap.destroy(); + if (launcher != null) { + launcher.stop(); + launcher.destroy(); } // old minecraft versions can hang without this >_< diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index a41e4af6b..7bf9ba0d7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -53,6 +53,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.prismlauncher.launcher; public interface Launcher { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java index fb1540bf7..ed12cdf6c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -70,7 +70,9 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -@SuppressWarnings("removal") +/** + * Used to launch old versions that support applets. + */ public final class LegacyLauncher extends AbstractLauncher { private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); From ade7526f5fb1d9b8cc5f8b90904192474ba145b6 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 15:22:24 +0100 Subject: [PATCH 0163/1149] Remove the need for LegacyUtils Signed-off-by: TheKodeToad --- .../launcher/impl/LegacyLauncher.java | 27 +++++- .../org/prismlauncher/utils/LegacyUtils.java | 90 ------------------- 2 files changed, 25 insertions(+), 92 deletions(-) delete mode 100644 libraries/launcher/org/prismlauncher/utils/LegacyUtils.java diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java index ed12cdf6c..c249c714d 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -56,7 +56,6 @@ package org.prismlauncher.launcher.impl; import org.prismlauncher.applet.LegacyFrame; -import org.prismlauncher.utils.LegacyUtils; import org.prismlauncher.utils.Parameters; import java.applet.Applet; @@ -65,6 +64,7 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.Collections; import java.util.List; import java.util.logging.Level; @@ -101,7 +101,7 @@ public final class LegacyLauncher extends AbstractLauncher { @Override public void launch() throws Throwable { Class main = loadMain(); - Field gameDirField = LegacyUtils.getMinecraftGameDirField(main); + Field gameDirField = getMinecraftGameDirField(main); if (gameDirField == null) { LOGGER.warning("Could not find Mineraft path field."); @@ -143,4 +143,27 @@ public final class LegacyLauncher extends AbstractLauncher { invokeMain(main); } + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * @param clazz the class to scan + * @return The found field. + */ + private static Field getMinecraftGameDirField(Class clazz) { + // Field we're looking for is always + // private static File obfuscatedName = null; + for (Field field : clazz.getDeclaredFields()) { + // Has to be File + if (field.getType() != File.class) + continue; + + // And Private Static. + if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) + continue; + + return field; + } + + return null; + } + } diff --git a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java deleted file mode 100644 index 8e7cbb744..000000000 --- a/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * PolyMC - Minecraft Launcher - * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 TheKodeToad - * Copyright (C) 2022 solonovamax - * - * 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. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.utils; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; - -public final class LegacyUtils { - - private LegacyUtils() { - } - - /** - * Finds a field that looks like a Minecraft base folder in a supplied class - * - * @param clazz the class to scan - */ - public static Field getMinecraftGameDirField(Class clazz) { - // Field we're looking for is always - // private static File obfuscatedName = null; - for (Field field : clazz.getDeclaredFields()) { - // Has to be File - if (field.getType() != File.class) - continue; - - // And Private Static. - if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) - continue; - - return field; - } - - return null; - } - -} - From 0cd1d7aa7e6580eaed5e32c53538678bbcdd6abc Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 15:24:55 +0100 Subject: [PATCH 0164/1149] Excessive safety Signed-off-by: TheKodeToad --- libraries/launcher/net/minecraft/Launcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index aef09ca92..147c727e1 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -93,7 +93,7 @@ public final class Launcher extends Applet implements AppletStub { try { if (documentBase != null) { this.documentBase = documentBase; - } else if (applet.getClass().getPackage().getName().startsWith("com.mojang")) { + } else if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) { // Special case only for Classic versions // TODO: 2022-10-27 Can this be changed to https From 35d200356fdeb2d54c0ad0537c9c3b4cd9a8eb4d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 29 Oct 2022 15:31:41 +0100 Subject: [PATCH 0165/1149] Create launcher.impl.legacy Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 5 ++--- .../launcher/org/prismlauncher/launcher/LauncherFactory.java | 2 +- .../{applet => launcher/impl/legacy}/LegacyFrame.java | 2 +- .../launcher/impl/{ => legacy}/LegacyLauncher.java | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) rename libraries/launcher/org/prismlauncher/{applet => launcher/impl/legacy}/LegacyFrame.java (99%) rename libraries/launcher/org/prismlauncher/launcher/impl/{ => legacy}/LegacyLauncher.java (98%) diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index d74c36413..f85c23541 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -11,14 +11,13 @@ set(SRC org/prismlauncher/launcher/Launcher.java org/prismlauncher/launcher/LauncherFactory.java org/prismlauncher/launcher/LauncherProvider.java + org/prismlauncher/launcher/impl/legacy/LegacyFrame.java + org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java org/prismlauncher/launcher/impl/AbstractLauncher.java - org/prismlauncher/launcher/impl/LegacyLauncher.java org/prismlauncher/launcher/impl/StandardLauncher.java - org/prismlauncher/applet/LegacyFrame.java org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java - org/prismlauncher/utils/LegacyUtils.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index e6de35faf..22e926323 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -56,8 +56,8 @@ package org.prismlauncher.launcher; -import org.prismlauncher.launcher.impl.LegacyLauncher; import org.prismlauncher.launcher.impl.StandardLauncher; +import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; import java.util.HashMap; diff --git a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java similarity index 99% rename from libraries/launcher/org/prismlauncher/applet/LegacyFrame.java rename to libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 581251603..12196fd4b 100644 --- a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -54,7 +54,7 @@ * limitations under the License. */ -package org.prismlauncher.applet; +package org.prismlauncher.launcher.impl.legacy; import net.minecraft.Launcher; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java similarity index 98% rename from libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java rename to libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index c249c714d..d7a98352f 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -53,9 +53,9 @@ * limitations under the License. */ -package org.prismlauncher.launcher.impl; +package org.prismlauncher.launcher.impl.legacy; -import org.prismlauncher.applet.LegacyFrame; +import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; import java.applet.Applet; From 609b30110ba93c2cb3863bd3c857be7af23275cc Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 30 Oct 2022 15:27:24 +0000 Subject: [PATCH 0166/1149] Make main static Signed-off-by: TheKodeToad Inline local variable Signed-off-by: TheKodeToad --- .../launcher/org/prismlauncher/EntryPoint.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 40494b7cf..aab7d1103 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -70,12 +70,8 @@ public final class EntryPoint { private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - private final Parameters params = new Parameters(); - public static void main(String[] args) { - EntryPoint listener = new EntryPoint(); - - ExitCode exitCode = listener.listen(); + ExitCode exitCode = listen(); if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); @@ -112,7 +108,8 @@ public final class EntryPoint { } } - public ExitCode listen() { + private static ExitCode listen() { + Parameters parameters = new Parameters(); PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; try (BufferedReader reader = new BufferedReader(new InputStreamReader( @@ -123,7 +120,7 @@ public final class EntryPoint { while (preLaunchAction == PreLaunchAction.PROCEED) { if ((line = reader.readLine()) != null) { - preLaunchAction = parseLine(line, this.params); + preLaunchAction = parseLine(line, parameters); } else { preLaunchAction = PreLaunchAction.ABORT; } @@ -142,7 +139,7 @@ public final class EntryPoint { } try { - Launcher launcher = LauncherFactory.createLauncher(params); + Launcher launcher = LauncherFactory.createLauncher(parameters); launcher.launch(); From ac5b74301e7be057bf08aa78cf0cfbece27cd1c1 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Mon, 31 Oct 2022 15:56:53 -0400 Subject: [PATCH 0167/1149] Cleanup splitting string into a pair Signed-off-by: solonovamax --- .../org/prismlauncher/EntryPoint.java | 90 +++++++++---------- .../launcher/impl/AbstractLauncher.java | 13 +-- .../org/prismlauncher/utils/StringUtils.java | 15 ++++ 3 files changed, 63 insertions(+), 55 deletions(-) create mode 100644 libraries/launcher/org/prismlauncher/utils/StringUtils.java diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index aab7d1103..987dcc121 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -54,10 +54,12 @@ package org.prismlauncher; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherFactory; import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.StringUtils; import java.io.BufferedReader; import java.io.IOException; @@ -66,58 +68,47 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; + public final class EntryPoint { - private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - + public static void main(String[] args) { ExitCode exitCode = listen(); - + if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); - + System.exit(exitCode.numericalCode); } } - - private static PreLaunchAction parseLine(String inData, Parameters params) throws ParseException { - if (inData.isEmpty()) + + private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { + if (input.isEmpty()) throw new ParseException("Unexpected empty string!"); - - String first = inData; - String second = null; - int splitPoint = inData.indexOf(' '); - - if (splitPoint != -1) { - first = first.substring(0, splitPoint); - second = inData.substring(splitPoint + 1); - } - - switch (first) { - case "launch": - return PreLaunchAction.LAUNCH; - case "abort": - return PreLaunchAction.ABORT; - default: - if (second == null || second.isEmpty()) - throw new ParseException("Error while parsing:" + inData); - - params.add(first, second); - - return PreLaunchAction.PROCEED; + + + if ("launch".equalsIgnoreCase(input)) { + return PreLaunchAction.LAUNCH; + } else if ("abort".equalsIgnoreCase(input)) { + return PreLaunchAction.ABORT; + } else { + String[] pair = StringUtils.splitStringPair(' ', input); + if (pair == null) + throw new ParseException("Error while parsing:" + input); + + params.add(pair[0], pair[1]); + + return PreLaunchAction.PROCEED; } } - + private static ExitCode listen() { Parameters parameters = new Parameters(); PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; - - try (BufferedReader reader = new BufferedReader(new InputStreamReader( - System.in, - StandardCharsets.UTF_8 - ))) { + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) { String line; - + while (preLaunchAction == PreLaunchAction.PROCEED) { if ((line = reader.readLine()) != null) { preLaunchAction = parseLine(line, parameters); @@ -127,49 +118,50 @@ public final class EntryPoint { } } catch (IOException | ParseException e) { LOGGER.log(Level.SEVERE, "Launcher abort due to exception:", e); - + return ExitCode.ERROR; } - + // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { LOGGER.info("Launch aborted by the launcher."); - + return ExitCode.ERROR; } - + try { Launcher launcher = LauncherFactory.createLauncher(parameters); - + launcher.launch(); - + return ExitCode.NORMAL; } catch (IllegalArgumentException e) { LOGGER.log(Level.SEVERE, "Wrong argument.", e); - + return ExitCode.ERROR; } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Exception caught from launcher.", e); - + return ExitCode.ERROR; } } - + private enum PreLaunchAction { PROCEED, LAUNCH, ABORT } - + + private enum ExitCode { NORMAL(0), ERROR(1); - + private final int numericalCode; - + ExitCode(int numericalCode) { this.numericalCode = numericalCode; } } - + } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 7a622b1b5..c572db10c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -58,6 +58,7 @@ package org.prismlauncher.launcher.impl; import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.StringUtils; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -101,13 +102,13 @@ public abstract class AbstractLauncher implements Launcher { height = DEFAULT_WINDOW_HEIGHT; } else { maximize = false; - - int byIndex = windowParams.indexOf('x'); - - if (byIndex != -1) { + + String[] sizePair = StringUtils.splitStringPair('x', windowParams); + + if (sizePair != null) { try { - width = Integer.parseInt(windowParams.substring(0, byIndex)); - height = Integer.parseInt(windowParams.substring(byIndex + 1)); + width = Integer.parseInt(sizePair[0]); + height = Integer.parseInt(sizePair[1]); return; } catch (NumberFormatException ignored) { } diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java new file mode 100644 index 000000000..9058e4b36 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -0,0 +1,15 @@ +package org.prismlauncher.utils; + + +public final class StringUtils { + private StringUtils() { + } + + public static String[] splitStringPair(char splitChar, String input) { + int splitPoint = input.indexOf(splitChar); + if (splitPoint == -1) + return null; + + return new String[]{ input.substring(0, splitPoint), input.substring(splitPoint + 1) }; + } +} From 9b8096c6993df68ac99c5c24483e169fbec60979 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 1 Nov 2022 11:27:31 -0400 Subject: [PATCH 0168/1149] Get rid of gross HashMap being used by `LauncherFactory` and instead use *fancy* enum Signed-off-by: solonovamax --- .../launcher/LauncherFactory.java | 49 +++++++-------- .../launcher/impl/StandardLauncher.java | 23 +++++-- .../launcher/impl/legacy/LegacyLauncher.java | 62 ++++++++++++------- 3 files changed, 84 insertions(+), 50 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 22e926323..6f9be63c4 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -56,43 +56,42 @@ package org.prismlauncher.launcher; + import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; -import java.util.HashMap; -import java.util.Map; public final class LauncherFactory { - - private static final Map launcherRegistry = new HashMap<>(); - - static { - launcherRegistry.put("standard", new LauncherProvider() { - @Override - public Launcher provide(Parameters parameters) { - return new StandardLauncher(parameters); - } - }); - launcherRegistry.put("legacy", new LauncherProvider() { - @Override - public Launcher provide(Parameters parameters) { - return new LegacyLauncher(parameters); - } - }); - } private LauncherFactory() { } - public static Launcher createLauncher(Parameters parameters) { - String name = parameters.getString("launcher"); + public static Launcher createLauncher(String launcherType, Parameters parameters) { + return createLauncher(LauncherType.valueOf(launcherType.toUpperCase()), parameters); + } - LauncherProvider launcherProvider = launcherRegistry.get(name); - - if (launcherProvider == null) - throw new IllegalArgumentException("Invalid launcher type: " + name); + public static Launcher createLauncher(LauncherType launcherType, Parameters parameters) { + LauncherProvider launcherProvider = launcherType.getLauncherProvider(); return launcherProvider.provide(parameters); } + public static Launcher createLauncher(Parameters parameters) { + return createLauncher(parameters.getString("launcher"), parameters); + } + + public enum LauncherType { + STANDARD(StandardLauncher.getProvider()), + LEGACY(LegacyLauncher.getProvider()); + + private final LauncherProvider launcherProvider; + + LauncherType(LauncherProvider launcherProvider) { + this.launcherProvider = launcherProvider; + } + + public LauncherProvider getLauncherProvider() { + return launcherProvider; + } + } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 5c884e999..24b12c951 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -54,15 +54,23 @@ package org.prismlauncher.launcher.impl; + +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.utils.Parameters; + public final class StandardLauncher extends AbstractLauncher { - public StandardLauncher(Parameters params) { - super(params); - } + public StandardLauncher(Parameters params) { + super(params); + } - @Override + public static LauncherProvider getProvider() { + return new StandardLauncherProvider(); + } + + @Override public void launch() throws Throwable { // window size, title and state @@ -87,4 +95,11 @@ public final class StandardLauncher extends AbstractLauncher { loadAndInvokeMain(); } + + private static class StandardLauncherProvider implements LauncherProvider { + @Override + public Launcher provide(Parameters parameters) { + return new StandardLauncher(parameters); + } + } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index d7a98352f..e342e788e 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -55,6 +55,9 @@ package org.prismlauncher.launcher.impl.legacy; + +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; @@ -70,6 +73,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; + /** * Used to launch old versions that support applets. */ @@ -78,10 +82,13 @@ public final class LegacyLauncher extends AbstractLauncher { private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); private final String user, session; + private final String title; + private final String appletClass; private final boolean noApplet; + private final String cwd; public LegacyLauncher(Parameters params) { @@ -98,6 +105,35 @@ public final class LegacyLauncher extends AbstractLauncher { cwd = System.getProperty("user.dir"); } + public static LauncherProvider getProvider() { + return new LegacyLauncherProvider(); + } + + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * + * @param clazz the class to scan + * + * @return The found field. + */ + private static Field getMinecraftGameDirField(Class clazz) { + // Field we're looking for is always + // private static File obfuscatedName = null; + for (Field field : clazz.getDeclaredFields()) { + // Has to be File + if (field.getType() != File.class) + continue; + + // And Private Static. + if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) + continue; + + return field; + } + + return null; + } + @Override public void launch() throws Throwable { Class main = loadMain(); @@ -130,7 +166,7 @@ public final class LegacyLauncher extends AbstractLauncher { serverAddress, serverPort, mcParams.contains("--demo") - ); + ); return; } catch (Throwable e) { @@ -143,27 +179,11 @@ public final class LegacyLauncher extends AbstractLauncher { invokeMain(main); } - /** - * Finds a field that looks like a Minecraft base folder in a supplied class - * @param clazz the class to scan - * @return The found field. - */ - private static Field getMinecraftGameDirField(Class clazz) { - // Field we're looking for is always - // private static File obfuscatedName = null; - for (Field field : clazz.getDeclaredFields()) { - // Has to be File - if (field.getType() != File.class) - continue; - // And Private Static. - if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) - continue; - - return field; + private static class LegacyLauncherProvider implements LauncherProvider { + @Override + public Launcher provide(Parameters parameters) { + return new LegacyLauncher(parameters); } - - return null; } - } From dabb84f62a35ea67793425f9118ea6a5bca96e00 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 1 Nov 2022 12:27:04 -0400 Subject: [PATCH 0169/1149] Cleanup launcher classes Cleanup a bunch of the code in launcher classes - Migrate the majority of the reflection to ReflectionUtils - Decrease logic in AbstractLauncher - Add logging to launcher classes at FINE level - make mcParams in AbstractLauncher an immutable list to prevent runtime manipulation - StandardLauncher instead copies the list to modify it Signed-off-by: solonovamax --- libraries/launcher/CMakeLists.txt | 1 + .../exception/ParameterNotFoundException.java | 22 ++- .../exception/ParseException.java | 21 +++ .../launcher/impl/AbstractLauncher.java | 67 ++++----- .../launcher/impl/StandardLauncher.java | 36 +++-- .../launcher/impl/legacy/LegacyLauncher.java | 80 +++-------- .../org/prismlauncher/utils/Parameters.java | 4 +- .../prismlauncher/utils/ReflectionUtils.java | 131 ++++++++++++++++++ 8 files changed, 248 insertions(+), 114 deletions(-) create mode 100644 libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index f85c23541..45a43b935 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -18,6 +18,7 @@ set(SRC org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java + org/prismlauncher/utils/ReflectionUtils.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index c083e02a3..3dd6efc3a 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -54,10 +54,28 @@ package org.prismlauncher.exception; + +@SuppressWarnings("serial") public final class ParameterNotFoundException extends IllegalArgumentException { - public ParameterNotFoundException(String key) { - super("Unknown parameter name: " + key); + public ParameterNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public ParameterNotFoundException(Throwable cause) { + super(cause); + } + + public ParameterNotFoundException(String message) { + super(message); + } + + public ParameterNotFoundException() { + super(); + } + + public static ParameterNotFoundException forParameterName(String parameterName) { + return new ParameterNotFoundException(String.format("Unknown parameter name '%s'", parameterName)); } } diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 8904f9ee0..2243f23ff 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -54,10 +54,31 @@ package org.prismlauncher.exception; + +@SuppressWarnings({ "serial", "unused" }) public final class ParseException extends IllegalArgumentException { public ParseException(String message) { super(message); } + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public ParseException(Throwable cause) { + super(cause); + } + + public ParseException() { + super(); + } + + public static ParseException forInputString(String inputString) { + return new ParseException(String.format("Could not parse input string '%s'", inputString)); + } + + public static ParseException forInputString(String inputString, Throwable cause) { + return new ParseException(String.format("Could not parse input string '%s'", inputString), cause); + } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index c572db10c..9dd7df102 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -55,81 +55,66 @@ package org.prismlauncher.launcher.impl; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.util.ArrayList; +import java.util.Collections; import java.util.List; + public abstract class AbstractLauncher implements Launcher { private static final int DEFAULT_WINDOW_WIDTH = 854; + private static final int DEFAULT_WINDOW_HEIGHT = 480; // parameters, separated from ParamBucket protected final List mcParams; - private final String mainClass; // secondary parameters protected final int width; + protected final int height; + protected final boolean maximize; - protected final String serverAddress, serverPort; + protected final String serverAddress; - protected final ClassLoader classLoader; + protected final String serverPort; + + protected final String mainClassName; protected AbstractLauncher(Parameters params) { - classLoader = ClassLoader.getSystemClassLoader(); + this.mcParams = Collections.unmodifiableList(params.getList("param", new ArrayList())); + this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); - mcParams = params.getList("param", new ArrayList()); - mainClass = params.getString("mainClass", "net.minecraft.client.Minecraft"); - - serverAddress = params.getString("serverAddress", null); - serverPort = params.getString("serverPort", null); + this.serverAddress = params.getString("serverAddress", null); + this.serverPort = params.getString("serverPort", null); String windowParams = params.getString("windowParams", null); - if ("max".equals(windowParams) || windowParams == null) { - maximize = windowParams != null; + this.maximize = "max".equalsIgnoreCase(windowParams); - width = DEFAULT_WINDOW_WIDTH; - height = DEFAULT_WINDOW_HEIGHT; - } else { - maximize = false; - + if (windowParams != null && !"max".equalsIgnoreCase(windowParams)) { String[] sizePair = StringUtils.splitStringPair('x', windowParams); - + if (sizePair != null) { try { - width = Integer.parseInt(sizePair[0]); - height = Integer.parseInt(sizePair[1]); - return; - } catch (NumberFormatException ignored) { + this.width = Integer.parseInt(sizePair[0]); + this.height = Integer.parseInt(sizePair[1]); + } catch (NumberFormatException e) { + throw new ParseException(String.format("Could not parse window parameters from '%s'", windowParams), e); } + } else { + throw new ParseException(String.format("Invalid window size parameters '%s'. Format: [height]x[width]", windowParams)); } - - throw new ParseException("Invalid window size parameter value: " + windowParams); + } else { + this.width = DEFAULT_WINDOW_WIDTH; + this.height = DEFAULT_WINDOW_HEIGHT; } } - - protected Class loadMain() throws ClassNotFoundException { - return classLoader.loadClass(mainClass); - } - - protected void loadAndInvokeMain() throws Throwable { - invokeMain(loadMain()); - } - - protected void invokeMain(Class mainClass) throws Throwable { - MethodHandle method = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); - - method.invokeExact(mcParams.toArray(new String[0])); - } - } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 24b12c951..fc0c98233 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -58,9 +58,17 @@ package org.prismlauncher.launcher.impl; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.ReflectionUtils; + +import java.lang.invoke.MethodHandle; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; public final class StandardLauncher extends AbstractLauncher { + private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); + public StandardLauncher(Parameters params) { super(params); @@ -78,21 +86,27 @@ public final class StandardLauncher extends AbstractLauncher { // the following often breaks linux screen setups // mcparams.add("--fullscreen"); - if (!maximize) { - mcParams.add("--width"); - mcParams.add(Integer.toString(width)); - mcParams.add("--height"); - mcParams.add(Integer.toString(height)); + List launchParameters = new ArrayList<>(this.mcParams); + + if (!this.maximize) { + launchParameters.add("--width"); + launchParameters.add(Integer.toString(width)); + launchParameters.add("--height"); + launchParameters.add(Integer.toString(height)); } - if (serverAddress != null) { - mcParams.add("--server"); - mcParams.add(serverAddress); - mcParams.add("--port"); - mcParams.add(serverPort); + if (this.serverAddress != null) { + launchParameters.add("--server"); + launchParameters.add(serverAddress); + launchParameters.add("--port"); + launchParameters.add(serverPort); } - loadAndInvokeMain(); + LOGGER.info("Launching minecraft using the main class entrypoint"); + + MethodHandle method = ReflectionUtils.findMainEntrypoint(this.mainClassName); + + method.invokeExact((Object[]) launchParameters.toArray(new String[0])); } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index e342e788e..0ce3c57b1 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -60,14 +60,11 @@ import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.ReflectionUtils; -import java.applet.Applet; import java.io.File; import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.Collections; import java.util.List; import java.util.logging.Level; @@ -87,7 +84,7 @@ public final class LegacyLauncher extends AbstractLauncher { private final String appletClass; - private final boolean noApplet; + private final boolean usesApplet; private final String cwd; @@ -100,8 +97,9 @@ public final class LegacyLauncher extends AbstractLauncher { appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); List traits = params.getList("traits", Collections.emptyList()); - noApplet = traits.contains("noapplet"); + usesApplet = !traits.contains("noapplet"); + //noinspection AccessOfSystemProperties cwd = System.getProperty("user.dir"); } @@ -109,74 +107,40 @@ public final class LegacyLauncher extends AbstractLauncher { return new LegacyLauncherProvider(); } - /** - * Finds a field that looks like a Minecraft base folder in a supplied class - * - * @param clazz the class to scan - * - * @return The found field. - */ - private static Field getMinecraftGameDirField(Class clazz) { - // Field we're looking for is always - // private static File obfuscatedName = null; - for (Field field : clazz.getDeclaredFields()) { - // Has to be File - if (field.getType() != File.class) - continue; - - // And Private Static. - if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) - continue; - - return field; - } - - return null; - } - @Override public void launch() throws Throwable { - Class main = loadMain(); - Field gameDirField = getMinecraftGameDirField(main); + Class main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); + Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); if (gameDirField == null) { - LOGGER.warning("Could not find Mineraft path field."); + LOGGER.warning("Could not find Minecraft path field"); } else { gameDirField.setAccessible(true); - gameDirField.set(null, new File(cwd)); + gameDirField.set(null /* field is static, so instance is null */, new File(cwd)); } - if (!noApplet) { - LOGGER.info("Launching with applet wrapper..."); + if (this.usesApplet) { + LOGGER.info("Launching legacy minecraft using applet wrapper..."); try { - Class appletClass = classLoader.loadClass(this.appletClass); - - MethodHandle constructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); - Applet applet = (Applet) constructor.invoke(); - - LegacyFrame window = new LegacyFrame(title, applet); + LegacyFrame window = new LegacyFrame(title, ReflectionUtils.createAppletClass(this.appletClass)); window.start( - user, - session, - width, - height, - maximize, - serverAddress, - serverPort, - mcParams.contains("--demo") + this.user, + this.session, + this.width, this.height, this.maximize, + this.serverAddress, this.serverPort, + this.mcParams.contains("--demo") ); - - return; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Applet wrapper failed:", e); - - LOGGER.warning("Falling back to using main class."); + LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception", e); } - } + } else { + LOGGER.info("Launching legacy minecraft using the main class entrypoint"); + MethodHandle method = ReflectionUtils.findMainEntrypoint(main); - invokeMain(main); + method.invokeExact((Object[]) mcParams.toArray(new String[0])); + } } diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 5596e88a5..6fbd0ef15 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -83,7 +83,7 @@ public final class Parameters { List params = map.get(key); if (params == null) - throw new ParameterNotFoundException(key); + throw ParameterNotFoundException.forParameterName(key); return params; } @@ -101,7 +101,7 @@ public final class Parameters { List list = getList(key); if (list.isEmpty()) - throw new ParameterNotFoundException(key); + throw ParameterNotFoundException.forParameterName(key); return list.get(0); } diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java new file mode 100644 index 000000000..484e0d8a9 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -0,0 +1,131 @@ +package org.prismlauncher.utils; + + +import java.applet.Applet; +import java.io.File; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.logging.Level; +import java.util.logging.Logger; + + +public final class ReflectionUtils { + private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); + + private ReflectionUtils() { + } + + /** + * Instantiate an applet class by name + * + * @param appletClassName The name of the applet class to resolve + * + * @return The instantiated applet class + * + * @throws ClassNotFoundException if the provided class name cannot be found + * @throws NoSuchMethodException if the no-args constructor cannot be found + * @throws IllegalAccessException if the constructor cannot be accessed via method handles + * @throws Throwable any exceptions from the class's constructor + */ + public static Applet createAppletClass(String appletClassName) throws Throwable { + Class appletClass = ClassLoader.getSystemClassLoader().loadClass(appletClassName); + + MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); + return (Applet) appletConstructor.invoke(); + } + + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * + * @param minecraftMainClass the class to scan + * + * @return The found field. + */ + public static Field getMinecraftGameDirField(Class minecraftMainClass) { + LOGGER.fine("Resolving minecraft game directory field"); + // Field we're looking for is always + // private static File obfuscatedName = null; + for (Field field : minecraftMainClass.getDeclaredFields()) { + // Has to be File + if (field.getType() != File.class) { + continue; + } + + int fieldModifiers = field.getModifiers(); + + + // Must be static + if (!Modifier.isStatic(fieldModifiers)) { + LOGGER.log(Level.FINE, "Rejecting field {0} because it is not static", field.getName()); + continue; + } + + // Must be private + if (!Modifier.isPrivate(fieldModifiers)) { + LOGGER.log(Level.FINE, "Rejecting field {0} because it is not private", field.getName()); + continue; + } + + // Must not be final + if (Modifier.isFinal(fieldModifiers)) { + LOGGER.log(Level.FINE, "Rejecting field {0} because it is final", field.getName()); + continue; + } + + LOGGER.log(Level.FINE, "Identified field {0} to match conditions for minecraft game directory field", field.getName()); + + return field; + } + + return null; + } + + /** + * Resolve main entrypoint and returns method handle for it. + *

+ * Resolves a method that matches the following signature + * + * public static void main(String[] args) { + *

+ * } + * + * + * @param entrypointClass The entrypoint class to resolve the method from + * + * @return The method handle for the resolved entrypoint + * + * @throws NoSuchMethodException If no method matching the correct signature can be found + * @throws IllegalAccessException If method handles cannot access the entrypoint + */ + public static MethodHandle findMainEntrypoint(Class entrypointClass) throws NoSuchMethodException, IllegalAccessException { + return MethodHandles.lookup().findStatic(entrypointClass, "main", MethodType.methodType(void.class, String[].class)); + } + + /** + * Resolve main entrypoint and returns method handle for it. + *

+ * Resolves a method that matches the following signature + * + * public static void main(String[] args) { + *

+ * } + * + * + * @param entrypointClassName The name of the entrypoint class to resolve the method from + * + * @return The method handle for the resolved entrypoint + * + * @throws ClassNotFoundException If a class cannot be found with the provided name + * @throws NoSuchMethodException If no method matching the correct signature can be found + * @throws IllegalAccessException If method handles cannot access the entrypoint + */ + public static MethodHandle findMainEntrypoint(String entrypointClassName) throws + ClassNotFoundException, + NoSuchMethodException, + IllegalAccessException { + return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); + } +} From e899e31745e2f10fdd404127750b6ee22364d405 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 1 Nov 2022 12:34:13 -0400 Subject: [PATCH 0170/1149] More informative exceptions in entrypoint Signed-off-by: solonovamax --- .../org/prismlauncher/EntryPoint.java | 83 +++++++++++-------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 987dcc121..07af4e551 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -71,22 +71,26 @@ import java.util.logging.Logger; public final class EntryPoint { private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - + + private EntryPoint() { + } + public static void main(String[] args) { ExitCode exitCode = listen(); - + if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); - + + //noinspection CallToSystemExit System.exit(exitCode.numericalCode); } } - + private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { - if (input.isEmpty()) - throw new ParseException("Unexpected empty string!"); - - + if (input.isEmpty()) // TODO: 2022-11-01 Should we just ignore this? + throw new ParseException("Unexpected empty string! You should not pass empty newlines to stdin."); + + if ("launch".equalsIgnoreCase(input)) { return PreLaunchAction.LAUNCH; } else if ("abort".equalsIgnoreCase(input)) { @@ -94,22 +98,26 @@ public final class EntryPoint { } else { String[] pair = StringUtils.splitStringPair(' ', input); if (pair == null) - throw new ParseException("Error while parsing:" + input); - + throw new ParseException(String.format( + "Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or " + + "in the format '[param name] [param]'.", + input)); + params.add(pair[0], pair[1]); - + return PreLaunchAction.PROCEED; } } - + private static ExitCode listen() { Parameters parameters = new Parameters(); PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; - + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) { String line; - + while (preLaunchAction == PreLaunchAction.PROCEED) { + //noinspection NestedAssignment if ((line = reader.readLine()) != null) { preLaunchAction = parseLine(line, parameters); } else { @@ -117,51 +125,58 @@ public final class EntryPoint { } } } catch (IOException | ParseException e) { - LOGGER.log(Level.SEVERE, "Launcher abort due to exception:", e); - - return ExitCode.ERROR; + LOGGER.log(Level.SEVERE, "Launcher abort due to exception", e); + + return ExitCode.ILLEGAL_ARGUMENT; } - + // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { LOGGER.info("Launch aborted by the launcher."); - - return ExitCode.ERROR; + + return ExitCode.ABORT; } - + try { Launcher launcher = LauncherFactory.createLauncher(parameters); - + launcher.launch(); - + return ExitCode.NORMAL; } catch (IllegalArgumentException e) { LOGGER.log(Level.SEVERE, "Wrong argument.", e); - - return ExitCode.ERROR; + + return ExitCode.ILLEGAL_ARGUMENT; + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { + LOGGER.log(Level.SEVERE, "Caught reflection exception from launcher", e); + + return ExitCode.REFLECTION_EXCEPTION; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Exception caught from launcher.", e); - + LOGGER.log(Level.SEVERE, "Exception caught from launcher", e); + return ExitCode.ERROR; } } - + private enum PreLaunchAction { PROCEED, LAUNCH, ABORT } - - + + private enum ExitCode { NORMAL(0), - ERROR(1); - + ABORT(1), + ERROR(2), + ILLEGAL_ARGUMENT(3), + REFLECTION_EXCEPTION(4); + private final int numericalCode; - + ExitCode(int numericalCode) { this.numericalCode = numericalCode; } } - + } From afe088dba18b83ae1ea79e3b31ef5026f68b7b6d Mon Sep 17 00:00:00 2001 From: solonovamax Date: Wed, 2 Nov 2022 15:10:05 -0400 Subject: [PATCH 0171/1149] Fix license headers - Update license headers in several files to remove multimc apache reference, when unneeded - LauncherFactory: we've entirely rewritten this class at this point, so it's fully under GPL code - Launcher: this interface contains zero logic, and only a single method named `launch`, so I doubt you can actually copyright that - LauncherProvider: same as above - ParseException, ParameterNotFoundException: same as above; this class contains almost no logic (And the logic that was added is under GPL) - ReflectionUtils, StringUtils: add license header - Everything else: modify the program name in the license header from "PolyMC - Minecraft Launcher" to "Prism Launcher" Signed-off-by: solonovamax --- .../launcher/net/minecraft/Launcher.java | 3 +- .../org/prismlauncher/EntryPoint.java | 3 +- .../exception/ParameterNotFoundException.java | 20 +--------- .../exception/ParseException.java | 20 +--------- .../org/prismlauncher/launcher/Launcher.java | 20 +--------- .../launcher/LauncherFactory.java | 20 +--------- .../launcher/LauncherProvider.java | 20 +--------- .../launcher/impl/AbstractLauncher.java | 3 +- .../launcher/impl/StandardLauncher.java | 3 +- .../launcher/impl/legacy/LegacyFrame.java | 7 +++- .../launcher/impl/legacy/LegacyLauncher.java | 3 +- .../org/prismlauncher/utils/Parameters.java | 3 +- .../prismlauncher/utils/ReflectionUtils.java | 38 ++++++++++++++++++ .../org/prismlauncher/utils/StringUtils.java | 40 ++++++++++++++++++- 14 files changed, 103 insertions(+), 100 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 147c727e1..8dff56923 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 07af4e551..444e665ff 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index 3dd6efc3a..48bf9f4c8 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool @@ -33,23 +34,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package org.prismlauncher.exception; diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 2243f23ff..0d5f3c101 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool @@ -33,23 +34,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package org.prismlauncher.exception; diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index 7bf9ba0d7..d54cfd5c7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool @@ -35,23 +36,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package org.prismlauncher.launcher; diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 6f9be63c4..03a76d296 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool @@ -35,23 +36,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package org.prismlauncher.launcher; diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java index 66d23c0f6..73d0cdc56 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 solonovamax * @@ -32,23 +33,6 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. */ package org.prismlauncher.launcher; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 9dd7df102..ac7a6223c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index fc0c98233..61709bf77 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 12196fd4b..391aa7023 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 flow @@ -56,11 +57,13 @@ package org.prismlauncher.launcher.impl.legacy; + import net.minecraft.Launcher; import javax.imageio.ImageIO; import java.applet.Applet; -import java.awt.*; +import java.awt.Dimension; +import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 0ce3c57b1..17cdeb08c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 flow * Copyright (C) 2022 TheKodeToad diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 6fbd0ef15..d019aa410 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher + * * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 484e0d8a9..b0eefec7a 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -1,3 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * + * Copyright (C) 2022 solonovamax + * Copyright (C) 2022 TheKodeToad + * Copyright (C) 2022 icelimetea + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package org.prismlauncher.utils; diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java index 9058e4b36..d470624c1 100644 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -1,15 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher + * + * Copyright (C) 2022 solonovamax + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package org.prismlauncher.utils; public final class StringUtils { private StringUtils() { } - + public static String[] splitStringPair(char splitChar, String input) { int splitPoint = input.indexOf(splitChar); if (splitPoint == -1) return null; - + return new String[]{ input.substring(0, splitPoint), input.substring(splitPoint + 1) }; } } From 8ce78dcc54a8ed3e6292a8650692fa9c520a993d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 16:40:23 +0000 Subject: [PATCH 0172/1149] Try to improve consistency - Makes code formatting more consistent with the C++ codebase. Probably removes some trailing whitespace. Maybe it would be best to commit an Eclipse or IntelliJ code format preferences file? - Removes obscure suppressions. I personally think it's better to only suppress warnings that javac complains about. Suppressing a lot of non-standardised warnings (many of them turned off by default even in IntelliJ) just creates needless clutter. - Fixes some trivial warnings instead of suppressing them. serialVersionUID is sort of stupid, but I'd rather mentally ignore it or just fix it if it's really that annoying. Signed-off-by: TheKodeToad --- libraries/launcher/net/minecraft/Launcher.java | 12 ++++++------ .../launcher/org/prismlauncher/EntryPoint.java | 14 +++++--------- .../exception/ParameterNotFoundException.java | 7 ++++--- .../prismlauncher/exception/ParseException.java | 7 +++++-- .../prismlauncher/launcher/LauncherFactory.java | 4 ++-- .../launcher/impl/AbstractLauncher.java | 14 +++----------- .../launcher/impl/StandardLauncher.java | 9 +++------ .../launcher/impl/legacy/LegacyFrame.java | 5 ++--- .../launcher/impl/legacy/LegacyLauncher.java | 13 +++---------- .../org/prismlauncher/utils/ReflectionUtils.java | 9 ++++----- .../org/prismlauncher/utils/StringUtils.java | 5 +++-- 11 files changed, 40 insertions(+), 59 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 8dff56923..796e48293 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -72,12 +72,12 @@ import java.util.TreeMap; */ public final class Launcher extends Applet implements AppletStub { + private static final long serialVersionUID = 1L; + private final Map params = new TreeMap<>(); private Applet wrappedApplet; - private final URL documentBase; - private boolean active = false; public Launcher(Applet applet) { @@ -85,11 +85,11 @@ public final class Launcher extends Applet implements AppletStub { } public Launcher(Applet applet, URL documentBase) { - this.setLayout(new BorderLayout()); + setLayout(new BorderLayout()); this.add(applet, "Center"); - this.wrappedApplet = applet; + wrappedApplet = applet; try { if (documentBase != null) { @@ -109,12 +109,12 @@ public final class Launcher extends Applet implements AppletStub { } public void replace(Applet applet) { - this.wrappedApplet = applet; + wrappedApplet = applet; applet.setStub(this); applet.setSize(getWidth(), getHeight()); - this.setLayout(new BorderLayout()); + setLayout(new BorderLayout()); this.add(applet, "Center"); applet.init(); diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 444e665ff..be180d6a8 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -55,7 +55,6 @@ package org.prismlauncher; - import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherFactory; @@ -69,7 +68,6 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; - public final class EntryPoint { private static final Logger LOGGER = Logger.getLogger("EntryPoint"); @@ -92,11 +90,11 @@ public final class EntryPoint { throw new ParseException("Unexpected empty string! You should not pass empty newlines to stdin."); - if ("launch".equalsIgnoreCase(input)) { + if ("launch".equalsIgnoreCase(input)) return PreLaunchAction.LAUNCH; - } else if ("abort".equalsIgnoreCase(input)) { + else if ("abort".equalsIgnoreCase(input)) return PreLaunchAction.ABORT; - } else { + else { String[] pair = StringUtils.splitStringPair(' ', input); if (pair == null) throw new ParseException(String.format( @@ -119,11 +117,10 @@ public final class EntryPoint { while (preLaunchAction == PreLaunchAction.PROCEED) { //noinspection NestedAssignment - if ((line = reader.readLine()) != null) { + if ((line = reader.readLine()) != null) preLaunchAction = parseLine(line, parameters); - } else { + else preLaunchAction = PreLaunchAction.ABORT; - } } } catch (IOException | ParseException e) { LOGGER.log(Level.SEVERE, "Launcher abort due to exception", e); @@ -165,7 +162,6 @@ public final class EntryPoint { ABORT } - private enum ExitCode { NORMAL(0), ABORT(1), diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index 48bf9f4c8..ad973ace1 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -5,6 +5,8 @@ * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 solonovamax + * Copyright (C) 2022 TheKodeToad * * 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 @@ -38,10 +40,10 @@ package org.prismlauncher.exception; - -@SuppressWarnings("serial") public final class ParameterNotFoundException extends IllegalArgumentException { + private static final long serialVersionUID = 1L; + public ParameterNotFoundException(String message, Throwable cause) { super(message, cause); } @@ -55,7 +57,6 @@ public final class ParameterNotFoundException extends IllegalArgumentException { } public ParameterNotFoundException() { - super(); } public static ParameterNotFoundException forParameterName(String parameterName) { diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 0d5f3c101..2fd693e79 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -5,6 +5,8 @@ * Copyright (C) 2022 icelimetea * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Samisafool + * Copyright (C) 2022 solonovamax + * Copyright (C) 2022 TheKodeToad * * 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 @@ -38,10 +40,10 @@ package org.prismlauncher.exception; - -@SuppressWarnings({ "serial", "unused" }) public final class ParseException extends IllegalArgumentException { + private static final long serialVersionUID = 1L; + public ParseException(String message) { super(message); } @@ -65,4 +67,5 @@ public final class ParseException extends IllegalArgumentException { public static ParseException forInputString(String inputString, Throwable cause) { return new ParseException(String.format("Could not parse input string '%s'", inputString), cause); } + } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 03a76d296..4844a774d 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -40,13 +40,12 @@ package org.prismlauncher.launcher; - import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; - public final class LauncherFactory { + private LauncherFactory() { } @@ -78,4 +77,5 @@ public final class LauncherFactory { return launcherProvider; } } + } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index ac7a6223c..8aec7c289 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -56,7 +56,6 @@ package org.prismlauncher.launcher.impl; - import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; @@ -66,26 +65,18 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - public abstract class AbstractLauncher implements Launcher { private static final int DEFAULT_WINDOW_WIDTH = 854; - private static final int DEFAULT_WINDOW_HEIGHT = 480; // parameters, separated from ParamBucket protected final List mcParams; // secondary parameters - protected final int width; - - protected final int height; - + protected final int width, height; protected final boolean maximize; - - protected final String serverAddress; - - protected final String serverPort; + protected final String serverAddress, serverPort; protected final String mainClassName; @@ -118,4 +109,5 @@ public abstract class AbstractLauncher implements Launcher { this.height = DEFAULT_WINDOW_HEIGHT; } } + } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 61709bf77..a3ea2f4a9 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -55,7 +55,6 @@ package org.prismlauncher.launcher.impl; - import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.utils.Parameters; @@ -66,10 +65,9 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; - public final class StandardLauncher extends AbstractLauncher { - private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); + private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); public StandardLauncher(Parameters params) { super(params); @@ -105,16 +103,15 @@ public final class StandardLauncher extends AbstractLauncher { LOGGER.info("Launching minecraft using the main class entrypoint"); - MethodHandle method = ReflectionUtils.findMainEntrypoint(this.mainClassName); - + MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); method.invokeExact((Object[]) launchParameters.toArray(new String[0])); } - private static class StandardLauncherProvider implements LauncherProvider { @Override public Launcher provide(Parameters parameters) { return new StandardLauncher(parameters); } } + } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 391aa7023..96b422b2c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -57,7 +57,6 @@ package org.prismlauncher.launcher.impl.legacy; - import net.minecraft.Launcher; import javax.imageio.ImageIO; @@ -77,7 +76,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -public final class LegacyFrame extends Frame { +public final class LegacyFrame extends Frame /* TODO consider JFrame */ { private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); @@ -163,7 +162,7 @@ public final class LegacyFrame extends Frame { setResizable(true); if (maximize) - this.setExtendedState(MAXIMIZED_BOTH); + setExtendedState(MAXIMIZED_BOTH); validate(); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 17cdeb08c..71e4bc8df 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -56,7 +56,6 @@ package org.prismlauncher.launcher.impl.legacy; - import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.launcher.impl.AbstractLauncher; @@ -71,7 +70,6 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; - /** * Used to launch old versions that support applets. */ @@ -80,13 +78,9 @@ public final class LegacyLauncher extends AbstractLauncher { private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); private final String user, session; - private final String title; - private final String appletClass; - private final boolean usesApplet; - private final String cwd; public LegacyLauncher(Parameters params) { @@ -100,7 +94,6 @@ public final class LegacyLauncher extends AbstractLauncher { List traits = params.getList("traits", Collections.emptyList()); usesApplet = !traits.contains("noapplet"); - //noinspection AccessOfSystemProperties cwd = System.getProperty("user.dir"); } @@ -113,9 +106,9 @@ public final class LegacyLauncher extends AbstractLauncher { Class main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); - if (gameDirField == null) { + if (gameDirField == null) LOGGER.warning("Could not find Minecraft path field"); - } else { + else { gameDirField.setAccessible(true); gameDirField.set(null /* field is static, so instance is null */, new File(cwd)); } @@ -144,11 +137,11 @@ public final class LegacyLauncher extends AbstractLauncher { } } - private static class LegacyLauncherProvider implements LauncherProvider { @Override public Launcher provide(Parameters parameters) { return new LegacyLauncher(parameters); } } + } diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index b0eefec7a..ad9e57fd7 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -49,8 +49,8 @@ import java.lang.reflect.Modifier; import java.util.logging.Level; import java.util.logging.Logger; - public final class ReflectionUtils { + private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); private ReflectionUtils() { @@ -160,10 +160,9 @@ public final class ReflectionUtils { * @throws NoSuchMethodException If no method matching the correct signature can be found * @throws IllegalAccessException If method handles cannot access the entrypoint */ - public static MethodHandle findMainEntrypoint(String entrypointClassName) throws - ClassNotFoundException, - NoSuchMethodException, - IllegalAccessException { + public static MethodHandle findMainMethod(String entrypointClassName) + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException { return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); } + } diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java index d470624c1..a371b0cba 100644 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -36,8 +36,8 @@ package org.prismlauncher.utils; - public final class StringUtils { + private StringUtils() { } @@ -46,6 +46,7 @@ public final class StringUtils { if (splitPoint == -1) return null; - return new String[]{ input.substring(0, splitPoint), input.substring(splitPoint + 1) }; + return new String[] { input.substring(0, splitPoint), input.substring(splitPoint + 1) }; } + } From cae1ba7cd8d447bb15df5a820c5d8e3665bb489d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:04:16 +0000 Subject: [PATCH 0173/1149] Less needless verbosity, and return fallback Needlessly verbose commit message ik. Signed-off-by: TheKodeToad --- .../prismlauncher/launcher/impl/StandardLauncher.java | 4 ---- .../launcher/impl/legacy/LegacyLauncher.java | 10 ++++------ 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index a3ea2f4a9..485f65ee4 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -67,8 +67,6 @@ import java.util.logging.Logger; public final class StandardLauncher extends AbstractLauncher { - private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); - public StandardLauncher(Parameters params) { super(params); } @@ -101,8 +99,6 @@ public final class StandardLauncher extends AbstractLauncher { launchParameters.add(serverPort); } - LOGGER.info("Launching minecraft using the main class entrypoint"); - MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); method.invokeExact((Object[]) launchParameters.toArray(new String[0])); } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 71e4bc8df..00f55095d 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -127,14 +127,12 @@ public final class LegacyLauncher extends AbstractLauncher { this.mcParams.contains("--demo") ); } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception", e); + LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); } - } else { - LOGGER.info("Launching legacy minecraft using the main class entrypoint"); - MethodHandle method = ReflectionUtils.findMainEntrypoint(main); - - method.invokeExact((Object[]) mcParams.toArray(new String[0])); } + + MethodHandle method = ReflectionUtils.findMainEntrypoint(main); + method.invokeExact((Object[]) mcParams.toArray(new String[0])); } private static class LegacyLauncherProvider implements LauncherProvider { From 779bc2c63df131fce0d230401a5a891eb2eb8794 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:11:14 +0000 Subject: [PATCH 0174/1149] Fix WrongMethodTypeException. Invoke exact don't work like that Signed-off-by: TheKodeToad --- .../org/prismlauncher/launcher/impl/StandardLauncher.java | 3 +-- .../prismlauncher/launcher/impl/legacy/LegacyLauncher.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 485f65ee4..d5b7961af 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -63,7 +63,6 @@ import org.prismlauncher.utils.ReflectionUtils; import java.lang.invoke.MethodHandle; import java.util.ArrayList; import java.util.List; -import java.util.logging.Logger; public final class StandardLauncher extends AbstractLauncher { @@ -100,7 +99,7 @@ public final class StandardLauncher extends AbstractLauncher { } MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); - method.invokeExact((Object[]) launchParameters.toArray(new String[0])); + method.invokeExact(launchParameters.toArray(new String[0])); } private static class StandardLauncherProvider implements LauncherProvider { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 00f55095d..b71099624 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -125,14 +125,14 @@ public final class LegacyLauncher extends AbstractLauncher { this.width, this.height, this.maximize, this.serverAddress, this.serverPort, this.mcParams.contains("--demo") - ); + ); } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); } } MethodHandle method = ReflectionUtils.findMainEntrypoint(main); - method.invokeExact((Object[]) mcParams.toArray(new String[0])); + method.invokeExact(mcParams.toArray(new String[0])); } private static class LegacyLauncherProvider implements LauncherProvider { From 5b9bfe8891f007a9dcec1a4754df6bc62e0396eb Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:30:13 +0000 Subject: [PATCH 0175/1149] Attempt to mimic clang-format Signed-off-by: TheKodeToad --- libraries/launcher/formatting-profile.xml | 399 ++++++++++++++++++ .../launcher/net/minecraft/Launcher.java | 65 ++- .../org/prismlauncher/EntryPoint.java | 35 +- .../launcher/LauncherFactory.java | 29 +- .../launcher/impl/AbstractLauncher.java | 9 +- .../launcher/impl/StandardLauncher.java | 15 +- .../launcher/impl/legacy/LegacyFrame.java | 40 +- .../launcher/impl/legacy/LegacyLauncher.java | 23 +- .../org/prismlauncher/utils/Parameters.java | 15 +- .../prismlauncher/utils/ReflectionUtils.java | 50 ++- .../org/prismlauncher/utils/StringUtils.java | 6 +- 11 files changed, 529 insertions(+), 157 deletions(-) create mode 100644 libraries/launcher/formatting-profile.xml diff --git a/libraries/launcher/formatting-profile.xml b/libraries/launcher/formatting-profile.xml new file mode 100644 index 000000000..bebc783e5 --- /dev/null +++ b/libraries/launcher/formatting-profile.xml @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 796e48293..ce9b59d40 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -68,7 +68,8 @@ import java.util.TreeMap; /** * WARNING: This class is reflectively accessed by legacy Forge versions. *

- * Changing field and method declarations without further testing is not recommended. + * Changing field and method declarations without further testing is not + * recommended. */ public final class Launcher extends Applet implements AppletStub { @@ -80,11 +81,10 @@ public final class Launcher extends Applet implements AppletStub { private final URL documentBase; private boolean active = false; - public Launcher(Applet applet) { - this(applet, null); - } + public Launcher(Applet applet) { this(applet, null); } - public Launcher(Applet applet, URL documentBase) { + public Launcher(Applet applet, URL documentBase) + { setLayout(new BorderLayout()); this.add(applet, "Center"); @@ -108,7 +108,8 @@ public final class Launcher extends Applet implements AppletStub { } } - public void replace(Applet applet) { + public void replace(Applet applet) + { wrappedApplet = applet; applet.setStub(this); @@ -127,17 +128,14 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public boolean isActive() { - return active; - } + public boolean isActive() { return active; } @Override - public URL getDocumentBase() { - return documentBase; - } + public URL getDocumentBase() { return documentBase; } @Override - public URL getCodeBase() { + public URL getCodeBase() + { try { // TODO: 2022-10-27 Can this be changed to https? return new URL("http://www.minecraft.net/game/"); @@ -147,7 +145,8 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public String getParameter(String name) { + public String getParameter(String name) + { String param = params.get(name); if (param != null) @@ -162,62 +161,54 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public void resize(int width, int height) { - wrappedApplet.resize(width, height); - } + public void resize(int width, int height) { wrappedApplet.resize(width, height); } @Override - public void resize(Dimension size) { - wrappedApplet.resize(size); - } + public void resize(Dimension size) { wrappedApplet.resize(size); } @Override - public void init() { + public void init() + { if (wrappedApplet != null) wrappedApplet.init(); } @Override - public void start() { + public void start() + { wrappedApplet.start(); active = true; } @Override - public void stop() { + public void stop() + { wrappedApplet.stop(); active = false; } @Override - public void destroy() { - wrappedApplet.destroy(); - } + public void destroy() { wrappedApplet.destroy(); } @Override - public void appletResize(int width, int height) { - wrappedApplet.resize(width, height); - } + public void appletResize(int width, int height) { wrappedApplet.resize(width, height); } @Override - public void setVisible(boolean visible) { + public void setVisible(boolean visible) + { super.setVisible(visible); wrappedApplet.setVisible(visible); } @Override - public void paint(Graphics graphics) { - } + public void paint(Graphics graphics) {} @Override - public void update(Graphics graphics) { - } + public void update(Graphics graphics) {} - public void setParameter(String name, String value) { - params.put(name, value); - } + public void setParameter(String name, String value) { params.put(name, value); } } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index be180d6a8..88d5d8beb 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -71,25 +71,25 @@ import java.util.logging.Logger; public final class EntryPoint { private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - private EntryPoint() { - } + private EntryPoint() {} - public static void main(String[] args) { + public static void main(String[] args) + { ExitCode exitCode = listen(); if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); - //noinspection CallToSystemExit + // noinspection CallToSystemExit System.exit(exitCode.numericalCode); } } - private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { + private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException + { if (input.isEmpty()) // TODO: 2022-11-01 Should we just ignore this? throw new ParseException("Unexpected empty string! You should not pass empty newlines to stdin."); - if ("launch".equalsIgnoreCase(input)) return PreLaunchAction.LAUNCH; else if ("abort".equalsIgnoreCase(input)) @@ -98,8 +98,8 @@ public final class EntryPoint { String[] pair = StringUtils.splitStringPair(' ', input); if (pair == null) throw new ParseException(String.format( - "Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or " + - "in the format '[param name] [param]'.", + "Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or " + + "in the format '[param name] [param]'.", input)); params.add(pair[0], pair[1]); @@ -108,7 +108,8 @@ public final class EntryPoint { } } - private static ExitCode listen() { + private static ExitCode listen() + { Parameters parameters = new Parameters(); PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; @@ -116,7 +117,7 @@ public final class EntryPoint { String line; while (preLaunchAction == PreLaunchAction.PROCEED) { - //noinspection NestedAssignment + // noinspection NestedAssignment if ((line = reader.readLine()) != null) preLaunchAction = parseLine(line, parameters); else @@ -157,23 +158,15 @@ public final class EntryPoint { } private enum PreLaunchAction { - PROCEED, - LAUNCH, - ABORT + PROCEED, LAUNCH, ABORT } private enum ExitCode { - NORMAL(0), - ABORT(1), - ERROR(2), - ILLEGAL_ARGUMENT(3), - REFLECTION_EXCEPTION(4); + NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(3), REFLECTION_EXCEPTION(4); private final int numericalCode; - ExitCode(int numericalCode) { - this.numericalCode = numericalCode; - } + ExitCode(int numericalCode) { this.numericalCode = numericalCode; } } } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 4844a774d..1f7ea91b7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -46,36 +46,31 @@ import org.prismlauncher.utils.Parameters; public final class LauncherFactory { - private LauncherFactory() { - } + private LauncherFactory() + {} - public static Launcher createLauncher(String launcherType, Parameters parameters) { - return createLauncher(LauncherType.valueOf(launcherType.toUpperCase()), parameters); - } + public static Launcher createLauncher(String launcherType, Parameters parameters) + { return createLauncher(LauncherType.valueOf(launcherType.toUpperCase()), parameters); } - public static Launcher createLauncher(LauncherType launcherType, Parameters parameters) { + public static Launcher createLauncher(LauncherType launcherType, Parameters parameters) + { LauncherProvider launcherProvider = launcherType.getLauncherProvider(); return launcherProvider.provide(parameters); } - public static Launcher createLauncher(Parameters parameters) { - return createLauncher(parameters.getString("launcher"), parameters); - } + public static Launcher createLauncher(Parameters parameters) + { return createLauncher(parameters.getString("launcher"), parameters); } public enum LauncherType { - STANDARD(StandardLauncher.getProvider()), - LEGACY(LegacyLauncher.getProvider()); + STANDARD(StandardLauncher.getProvider()), LEGACY(LegacyLauncher.getProvider()); private final LauncherProvider launcherProvider; - LauncherType(LauncherProvider launcherProvider) { - this.launcherProvider = launcherProvider; - } + LauncherType(LauncherProvider launcherProvider) { this.launcherProvider = launcherProvider; } + + public LauncherProvider getLauncherProvider() { return launcherProvider; } - public LauncherProvider getLauncherProvider() { - return launcherProvider; - } } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 8aec7c289..9eda8caf7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -80,7 +80,8 @@ public abstract class AbstractLauncher implements Launcher { protected final String mainClassName; - protected AbstractLauncher(Parameters params) { + protected AbstractLauncher(Parameters params) + { this.mcParams = Collections.unmodifiableList(params.getList("param", new ArrayList())); this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); @@ -99,10 +100,12 @@ public abstract class AbstractLauncher implements Launcher { this.width = Integer.parseInt(sizePair[0]); this.height = Integer.parseInt(sizePair[1]); } catch (NumberFormatException e) { - throw new ParseException(String.format("Could not parse window parameters from '%s'", windowParams), e); + throw new ParseException(String.format("Could not parse window parameters from '%s'", windowParams), + e); } } else { - throw new ParseException(String.format("Invalid window size parameters '%s'. Format: [height]x[width]", windowParams)); + throw new ParseException( + String.format("Invalid window size parameters '%s'. Format: [height]x[width]", windowParams)); } } else { this.width = DEFAULT_WINDOW_WIDTH; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index d5b7961af..e7b4599b5 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -66,16 +66,13 @@ import java.util.List; public final class StandardLauncher extends AbstractLauncher { - public StandardLauncher(Parameters params) { - super(params); - } + public StandardLauncher(Parameters params) { super(params); } - public static LauncherProvider getProvider() { - return new StandardLauncherProvider(); - } + public static LauncherProvider getProvider() { return new StandardLauncherProvider(); } @Override - public void launch() throws Throwable { + public void launch() throws Throwable + { // window size, title and state // FIXME: there is no good way to maximize the minecraft window from here. @@ -104,9 +101,7 @@ public final class StandardLauncher extends AbstractLauncher { private static class StandardLauncherProvider implements LauncherProvider { @Override - public Launcher provide(Parameters parameters) { - return new StandardLauncher(parameters); - } + public Launcher provide(Parameters parameters) { return new StandardLauncher(parameters); } } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 96b422b2c..3cc102383 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -82,7 +82,8 @@ public final class LegacyFrame extends Frame /* TODO consider JFrame */ { private final Launcher launcher; - public LegacyFrame(String title, Applet applet) { + public LegacyFrame(String title, Applet applet) + { super(title); launcher = new Launcher(applet); @@ -98,35 +99,24 @@ public final class LegacyFrame extends Frame /* TODO consider JFrame */ { addWindowListener(new ForceExitHandler()); } - public void start ( - String user, - String session, - int width, - int height, - boolean maximize, - String serverAddress, - String serverPort, - boolean isDemo - ) { - // Implements support for launching in to multiplayer on classic servers using a mpticket - // file generated by an external program and stored in the instance's root folder. + public void start(String user, String session, int width, int height, boolean maximize, String serverAddress, + String serverPort, boolean isDemo) + { + // Implements support for launching in to multiplayer on classic servers using a + // mpticket + // file generated by an external program and stored in the instance's root + // folder. - Path mpticketFile = - Paths.get(System.getProperty("user.dir"), "..", "mpticket"); + Path mpticketFile = Paths.get(System.getProperty("user.dir"), "..", "mpticket"); - Path mpticketFileCorrupt = - Paths.get(System.getProperty("user.dir"), "..", "mpticket.corrupt"); + Path mpticketFileCorrupt = Paths.get(System.getProperty("user.dir"), "..", "mpticket.corrupt"); if (Files.exists(mpticketFile)) { try { List lines = Files.readAllLines(mpticketFile, StandardCharsets.UTF_8); if (lines.size() < 3) { - Files.move( - mpticketFile, - mpticketFileCorrupt, - StandardCopyOption.REPLACE_EXISTING - ); + Files.move(mpticketFile, mpticketFileCorrupt, StandardCopyOption.REPLACE_EXISTING); LOGGER.warning("Mpticket file is corrupted!"); } else { @@ -175,10 +165,12 @@ public final class LegacyFrame extends Frame /* TODO consider JFrame */ { private final class ForceExitHandler extends WindowAdapter { @Override - public void windowClosing(WindowEvent event) { + public void windowClosing(WindowEvent event) + { new Thread(new Runnable() { @Override - public void run() { + public void run() + { try { Thread.sleep(30000L); } catch (InterruptedException e) { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index b71099624..5395acecc 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -83,7 +83,8 @@ public final class LegacyLauncher extends AbstractLauncher { private final boolean usesApplet; private final String cwd; - public LegacyLauncher(Parameters params) { + public LegacyLauncher(Parameters params) + { super(params); user = params.getString("userName"); @@ -97,12 +98,11 @@ public final class LegacyLauncher extends AbstractLauncher { cwd = System.getProperty("user.dir"); } - public static LauncherProvider getProvider() { - return new LegacyLauncherProvider(); - } + public static LauncherProvider getProvider() { return new LegacyLauncherProvider(); } @Override - public void launch() throws Throwable { + public void launch() throws Throwable + { Class main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); @@ -119,13 +119,8 @@ public final class LegacyLauncher extends AbstractLauncher { try { LegacyFrame window = new LegacyFrame(title, ReflectionUtils.createAppletClass(this.appletClass)); - window.start( - this.user, - this.session, - this.width, this.height, this.maximize, - this.serverAddress, this.serverPort, - this.mcParams.contains("--demo") - ); + window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, + this.serverPort, this.mcParams.contains("--demo")); } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); } @@ -137,9 +132,7 @@ public final class LegacyLauncher extends AbstractLauncher { private static class LegacyLauncherProvider implements LauncherProvider { @Override - public Launcher provide(Parameters parameters) { - return new LegacyLauncher(parameters); - } + public Launcher provide(Parameters parameters) { return new LegacyLauncher(parameters); } } } diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index d019aa410..3378775fc 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -68,7 +68,8 @@ public final class Parameters { private final Map> map = new HashMap<>(); - public void add(String key, String value) { + public void add(String key, String value) + { List params = map.get(key); if (params == null) { @@ -80,7 +81,8 @@ public final class Parameters { params.add(value); } - public List getList(String key) throws ParameterNotFoundException { + public List getList(String key) throws ParameterNotFoundException + { List params = map.get(key); if (params == null) @@ -89,7 +91,8 @@ public final class Parameters { return params; } - public List getList(String key, List def) { + public List getList(String key, List def) + { List params = map.get(key); if (params == null || params.isEmpty()) @@ -98,7 +101,8 @@ public final class Parameters { return params; } - public String getString(String key) throws ParameterNotFoundException { + public String getString(String key) throws ParameterNotFoundException + { List list = getList(key); if (list.isEmpty()) @@ -107,7 +111,8 @@ public final class Parameters { return list.get(0); } - public String getString(String key, String def) { + public String getString(String key, String def) + { List params = map.get(key); if (params == null || params.isEmpty()) diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index ad9e57fd7..6e8823876 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -38,7 +38,6 @@ package org.prismlauncher.utils; - import java.applet.Applet; import java.io.File; import java.lang.invoke.MethodHandle; @@ -53,8 +52,7 @@ public final class ReflectionUtils { private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); - private ReflectionUtils() { - } + private ReflectionUtils() {} /** * Instantiate an applet class by name @@ -65,13 +63,16 @@ public final class ReflectionUtils { * * @throws ClassNotFoundException if the provided class name cannot be found * @throws NoSuchMethodException if the no-args constructor cannot be found - * @throws IllegalAccessException if the constructor cannot be accessed via method handles + * @throws IllegalAccessException if the constructor cannot be accessed via + * method handles * @throws Throwable any exceptions from the class's constructor */ - public static Applet createAppletClass(String appletClassName) throws Throwable { + public static Applet createAppletClass(String appletClassName) throws Throwable + { Class appletClass = ClassLoader.getSystemClassLoader().loadClass(appletClassName); - MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); + MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, + MethodType.methodType(void.class)); return (Applet) appletConstructor.invoke(); } @@ -82,7 +83,8 @@ public final class ReflectionUtils { * * @return The found field. */ - public static Field getMinecraftGameDirField(Class minecraftMainClass) { + public static Field getMinecraftGameDirField(Class minecraftMainClass) + { LOGGER.fine("Resolving minecraft game directory field"); // Field we're looking for is always // private static File obfuscatedName = null; @@ -94,7 +96,6 @@ public final class ReflectionUtils { int fieldModifiers = field.getModifiers(); - // Must be static if (!Modifier.isStatic(fieldModifiers)) { LOGGER.log(Level.FINE, "Rejecting field {0} because it is not static", field.getName()); @@ -113,7 +114,8 @@ public final class ReflectionUtils { continue; } - LOGGER.log(Level.FINE, "Identified field {0} to match conditions for minecraft game directory field", field.getName()); + LOGGER.log(Level.FINE, "Identified field {0} to match conditions for minecraft game directory field", + field.getName()); return field; } @@ -124,8 +126,7 @@ public final class ReflectionUtils { /** * Resolve main entrypoint and returns method handle for it. *

- * Resolves a method that matches the following signature - * + * Resolves a method that matches the following signature * public static void main(String[] args) { *

* } @@ -135,34 +136,39 @@ public final class ReflectionUtils { * * @return The method handle for the resolved entrypoint * - * @throws NoSuchMethodException If no method matching the correct signature can be found + * @throws NoSuchMethodException If no method matching the correct signature + * can be found * @throws IllegalAccessException If method handles cannot access the entrypoint */ - public static MethodHandle findMainEntrypoint(Class entrypointClass) throws NoSuchMethodException, IllegalAccessException { - return MethodHandles.lookup().findStatic(entrypointClass, "main", MethodType.methodType(void.class, String[].class)); + public static MethodHandle findMainEntrypoint(Class entrypointClass) + throws NoSuchMethodException, IllegalAccessException + { + return MethodHandles.lookup().findStatic(entrypointClass, "main", + MethodType.methodType(void.class, String[].class)); } /** * Resolve main entrypoint and returns method handle for it. *

- * Resolves a method that matches the following signature - * + * Resolves a method that matches the following signature * public static void main(String[] args) { *

* } * * - * @param entrypointClassName The name of the entrypoint class to resolve the method from + * @param entrypointClassName The name of the entrypoint class to resolve the + * method from * * @return The method handle for the resolved entrypoint * - * @throws ClassNotFoundException If a class cannot be found with the provided name - * @throws NoSuchMethodException If no method matching the correct signature can be found + * @throws ClassNotFoundException If a class cannot be found with the provided + * name + * @throws NoSuchMethodException If no method matching the correct signature + * can be found * @throws IllegalAccessException If method handles cannot access the entrypoint */ public static MethodHandle findMainMethod(String entrypointClassName) - throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException { - return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); - } + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException + { return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); } } diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java index a371b0cba..08e6770e9 100644 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -38,10 +38,10 @@ package org.prismlauncher.utils; public final class StringUtils { - private StringUtils() { - } + private StringUtils() {} - public static String[] splitStringPair(char splitChar, String input) { + public static String[] splitStringPair(char splitChar, String input) + { int splitPoint = input.indexOf(splitChar); if (splitPoint == -1) return null; From 404796d4b25902bf5312202e2ecbb97729b4c480 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:33:21 +0000 Subject: [PATCH 0176/1149] Sorry for reverting a lot but copying a list just hurts me Signed-off-by: TheKodeToad --- .../launcher/impl/AbstractLauncher.java | 2 +- .../launcher/impl/StandardLauncher.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 9eda8caf7..391f71a98 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -82,7 +82,7 @@ public abstract class AbstractLauncher implements Launcher { protected AbstractLauncher(Parameters params) { - this.mcParams = Collections.unmodifiableList(params.getList("param", new ArrayList())); + this.mcParams = params.getList("param", new ArrayList()); this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); this.serverAddress = params.getString("serverAddress", null); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index e7b4599b5..8ecfffb4b 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -79,24 +79,22 @@ public final class StandardLauncher extends AbstractLauncher { // the following often breaks linux screen setups // mcparams.add("--fullscreen"); - List launchParameters = new ArrayList<>(this.mcParams); - if (!this.maximize) { - launchParameters.add("--width"); - launchParameters.add(Integer.toString(width)); - launchParameters.add("--height"); - launchParameters.add(Integer.toString(height)); + mcParams.add("--width"); + mcParams.add(Integer.toString(width)); + mcParams.add("--height"); + mcParams.add(Integer.toString(height)); } if (this.serverAddress != null) { - launchParameters.add("--server"); - launchParameters.add(serverAddress); - launchParameters.add("--port"); - launchParameters.add(serverPort); + mcParams.add("--server"); + mcParams.add(serverAddress); + mcParams.add("--port"); + mcParams.add(serverPort); } MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); - method.invokeExact(launchParameters.toArray(new String[0])); + method.invokeExact(mcParams.toArray(new String[0])); } private static class StandardLauncherProvider implements LauncherProvider { From fb677a7489201163de7d8ad1960ba8404a8f8a10 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:45:37 +0000 Subject: [PATCH 0177/1149] So turns out we can have nice things Signed-off-by: TheKodeToad --- .../org/prismlauncher/launcher/impl/AbstractLauncher.java | 1 - .../org/prismlauncher/launcher/impl/StandardLauncher.java | 2 -- .../org/prismlauncher/launcher/impl/legacy/LegacyFrame.java | 4 +++- .../prismlauncher/launcher/impl/legacy/LegacyLauncher.java | 2 ++ 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 391f71a98..7677df56d 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -62,7 +62,6 @@ import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public abstract class AbstractLauncher implements Launcher { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 8ecfffb4b..40a354730 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -61,8 +61,6 @@ import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; import java.lang.invoke.MethodHandle; -import java.util.ArrayList; -import java.util.List; public final class StandardLauncher extends AbstractLauncher { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 3cc102383..8f468cf68 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -60,6 +60,8 @@ package org.prismlauncher.launcher.impl.legacy; import net.minecraft.Launcher; import javax.imageio.ImageIO; +import javax.swing.JFrame; + import java.applet.Applet; import java.awt.Dimension; import java.awt.Frame; @@ -76,7 +78,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -public final class LegacyFrame extends Frame /* TODO consider JFrame */ { +public final class LegacyFrame extends JFrame { private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 5395acecc..4defa8f39 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -121,6 +121,8 @@ public final class LegacyLauncher extends AbstractLauncher { window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, this.serverPort, this.mcParams.contains("--demo")); + + return; } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); } From 1da834f6507a8c494d38159208471afd5c9a877e Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 17:50:54 +0000 Subject: [PATCH 0178/1149] *opinionated change* Remove LauncherFactory Factories in OOP are a classic example of over-enginneering. When you only have two launchers I personally think that it's not very useful. Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 2 - .../org/prismlauncher/EntryPoint.java | 17 ++++- .../launcher/LauncherFactory.java | 76 ------------------- .../launcher/LauncherProvider.java | 46 ----------- .../launcher/impl/StandardLauncher.java | 9 --- .../launcher/impl/legacy/LegacyFrame.java | 1 - .../launcher/impl/legacy/LegacyLauncher.java | 9 --- 7 files changed, 15 insertions(+), 145 deletions(-) delete mode 100644 libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java delete mode 100644 libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index 45a43b935..297ea27f6 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -9,8 +9,6 @@ set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7 -Xlint:deprecation -Xlint:unche set(SRC org/prismlauncher/EntryPoint.java org/prismlauncher/launcher/Launcher.java - org/prismlauncher/launcher/LauncherFactory.java - org/prismlauncher/launcher/LauncherProvider.java org/prismlauncher/launcher/impl/legacy/LegacyFrame.java org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java org/prismlauncher/launcher/impl/AbstractLauncher.java diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 88d5d8beb..c33ab983a 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -57,7 +57,8 @@ package org.prismlauncher; import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; -import org.prismlauncher.launcher.LauncherFactory; +import org.prismlauncher.launcher.impl.StandardLauncher; +import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; @@ -137,7 +138,19 @@ public final class EntryPoint { } try { - Launcher launcher = LauncherFactory.createLauncher(parameters); + Launcher launcher; + String type = parameters.getString("launcher"); + + switch (type) { + case "standard": + launcher = new StandardLauncher(parameters); + break; + case "legacy": + launcher = new LegacyLauncher(parameters); + break; + default: + throw new IllegalArgumentException("Invalid launcher type: " + type); + } launcher.launch(); diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java deleted file mode 100644 index 1f7ea91b7..000000000 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - * - * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Samisafool - * Copyright (C) 2022 TheKodeToad - * Copyright (C) 2022 solonovamax - * - * 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. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.prismlauncher.launcher; - -import org.prismlauncher.launcher.impl.StandardLauncher; -import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; -import org.prismlauncher.utils.Parameters; - -public final class LauncherFactory { - - private LauncherFactory() - {} - - public static Launcher createLauncher(String launcherType, Parameters parameters) - { return createLauncher(LauncherType.valueOf(launcherType.toUpperCase()), parameters); } - - public static Launcher createLauncher(LauncherType launcherType, Parameters parameters) - { - LauncherProvider launcherProvider = launcherType.getLauncherProvider(); - - return launcherProvider.provide(parameters); - } - - public static Launcher createLauncher(Parameters parameters) - { return createLauncher(parameters.getString("launcher"), parameters); } - - public enum LauncherType { - STANDARD(StandardLauncher.getProvider()), LEGACY(LegacyLauncher.getProvider()); - - private final LauncherProvider launcherProvider; - - LauncherType(LauncherProvider launcherProvider) { this.launcherProvider = launcherProvider; } - - public LauncherProvider getLauncherProvider() { return launcherProvider; } - - } - -} diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java deleted file mode 100644 index 73d0cdc56..000000000 --- a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - * - * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 solonovamax - * - * 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. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.prismlauncher.launcher; - -import org.prismlauncher.utils.Parameters; - -public interface LauncherProvider { - - Launcher provide(Parameters parameters); - -} diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 40a354730..43d706d60 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -55,8 +55,6 @@ package org.prismlauncher.launcher.impl; -import org.prismlauncher.launcher.Launcher; -import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; @@ -66,8 +64,6 @@ public final class StandardLauncher extends AbstractLauncher { public StandardLauncher(Parameters params) { super(params); } - public static LauncherProvider getProvider() { return new StandardLauncherProvider(); } - @Override public void launch() throws Throwable { @@ -95,9 +91,4 @@ public final class StandardLauncher extends AbstractLauncher { method.invokeExact(mcParams.toArray(new String[0])); } - private static class StandardLauncherProvider implements LauncherProvider { - @Override - public Launcher provide(Parameters parameters) { return new StandardLauncher(parameters); } - } - } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 8f468cf68..198fb61a7 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -64,7 +64,6 @@ import javax.swing.JFrame; import java.applet.Applet; import java.awt.Dimension; -import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 4defa8f39..aa899a61c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -56,8 +56,6 @@ package org.prismlauncher.launcher.impl.legacy; -import org.prismlauncher.launcher.Launcher; -import org.prismlauncher.launcher.LauncherProvider; import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; @@ -98,8 +96,6 @@ public final class LegacyLauncher extends AbstractLauncher { cwd = System.getProperty("user.dir"); } - public static LauncherProvider getProvider() { return new LegacyLauncherProvider(); } - @Override public void launch() throws Throwable { @@ -132,9 +128,4 @@ public final class LegacyLauncher extends AbstractLauncher { method.invokeExact(mcParams.toArray(new String[0])); } - private static class LegacyLauncherProvider implements LauncherProvider { - @Override - public Launcher provide(Parameters parameters) { return new LegacyLauncher(parameters); } - } - } From 9931c9a286c1746c1fb290da50ab31c9d7c7d228 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 18:11:42 +0000 Subject: [PATCH 0179/1149] Remove arguments being passed twice Passing the classpath into stdin has no effect. Java is already provided the classpath with -cp, which pretty much takes up the largest part of the arguments anyway, which leads me to wonder, what's the point of stdin arguments at all? Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 15 --------------- .../launcher/org/prismlauncher/EntryPoint.java | 2 +- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 5a5245ed1..39a7198c3 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -629,21 +629,6 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftS launchScript += "sessionId " + session->session + "\n"; } - // libraries and class path. - { - QStringList jars, nativeJars; - profile->getLibraryFiles(runtimeContext(), jars, nativeJars, getLocalLibraryPath(), binRoot()); - for(auto file: jars) - { - launchScript += "cp " + file + "\n"; - } - for(auto file: nativeJars) - { - launchScript += "ext " + file + "\n"; - } - launchScript += "natives " + getNativePath() + "\n"; - } - for (auto trait : profile->getTraits()) { launchScript += "traits " + trait + "\n"; diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index c33ab983a..368311798 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -81,7 +81,6 @@ public final class EntryPoint { if (exitCode != ExitCode.NORMAL) { LOGGER.warning("Exiting with " + exitCode); - // noinspection CallToSystemExit System.exit(exitCode.numericalCode); } } @@ -97,6 +96,7 @@ public final class EntryPoint { return PreLaunchAction.ABORT; else { String[] pair = StringUtils.splitStringPair(' ', input); + if (pair == null) throw new ParseException(String.format( "Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or " From 5912ef3b452b2c28693630249052fe23c790f6fb Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 18:17:11 +0000 Subject: [PATCH 0180/1149] Just ignore empty lines Signed-off-by: TheKodeToad --- libraries/launcher/org/prismlauncher/EntryPoint.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 368311798..06c6c79ca 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -87,8 +87,8 @@ public final class EntryPoint { private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { - if (input.isEmpty()) // TODO: 2022-11-01 Should we just ignore this? - throw new ParseException("Unexpected empty string! You should not pass empty newlines to stdin."); + if (input.isEmpty()) + return PreLaunchAction.PROCEED; if ("launch".equalsIgnoreCase(input)) return PreLaunchAction.LAUNCH; From 4abf3a20c6fe3763e57b76ec873cc2355d067b90 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 3 Nov 2022 18:39:34 +0000 Subject: [PATCH 0181/1149] More standard code formatting profile Signed-off-by: TheKodeToad --- libraries/launcher/formatting-profile.xml | 6 +- .../launcher/net/minecraft/Launcher.java | 62 +++++++++++-------- .../org/prismlauncher/EntryPoint.java | 17 ++--- .../launcher/impl/AbstractLauncher.java | 3 +- .../launcher/impl/StandardLauncher.java | 7 ++- .../launcher/impl/legacy/LegacyFrame.java | 12 ++-- .../launcher/impl/legacy/LegacyLauncher.java | 6 +- .../org/prismlauncher/utils/Parameters.java | 15 ++--- .../prismlauncher/utils/ReflectionUtils.java | 17 +++-- .../org/prismlauncher/utils/StringUtils.java | 6 +- 10 files changed, 75 insertions(+), 76 deletions(-) diff --git a/libraries/launcher/formatting-profile.xml b/libraries/launcher/formatting-profile.xml index bebc783e5..1b3348382 100644 --- a/libraries/launcher/formatting-profile.xml +++ b/libraries/launcher/formatting-profile.xml @@ -246,11 +246,11 @@ - + - + @@ -262,7 +262,7 @@ - + diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index ce9b59d40..3bd38e77f 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -81,10 +81,11 @@ public final class Launcher extends Applet implements AppletStub { private final URL documentBase; private boolean active = false; - public Launcher(Applet applet) { this(applet, null); } + public Launcher(Applet applet) { + this(applet, null); + } - public Launcher(Applet applet, URL documentBase) - { + public Launcher(Applet applet, URL documentBase) { setLayout(new BorderLayout()); this.add(applet, "Center"); @@ -108,8 +109,7 @@ public final class Launcher extends Applet implements AppletStub { } } - public void replace(Applet applet) - { + public void replace(Applet applet) { wrappedApplet = applet; applet.setStub(this); @@ -128,14 +128,17 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public boolean isActive() { return active; } + public boolean isActive() { + return active; + } @Override - public URL getDocumentBase() { return documentBase; } + public URL getDocumentBase() { + return documentBase; + } @Override - public URL getCodeBase() - { + public URL getCodeBase() { try { // TODO: 2022-10-27 Can this be changed to https? return new URL("http://www.minecraft.net/game/"); @@ -145,8 +148,7 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public String getParameter(String name) - { + public String getParameter(String name) { String param = params.get(name); if (param != null) @@ -161,54 +163,62 @@ public final class Launcher extends Applet implements AppletStub { } @Override - public void resize(int width, int height) { wrappedApplet.resize(width, height); } + public void resize(int width, int height) { + wrappedApplet.resize(width, height); + } @Override - public void resize(Dimension size) { wrappedApplet.resize(size); } + public void resize(Dimension size) { + wrappedApplet.resize(size); + } @Override - public void init() - { + public void init() { if (wrappedApplet != null) wrappedApplet.init(); } @Override - public void start() - { + public void start() { wrappedApplet.start(); active = true; } @Override - public void stop() - { + public void stop() { wrappedApplet.stop(); active = false; } @Override - public void destroy() { wrappedApplet.destroy(); } + public void destroy() { + wrappedApplet.destroy(); + } @Override - public void appletResize(int width, int height) { wrappedApplet.resize(width, height); } + public void appletResize(int width, int height) { + wrappedApplet.resize(width, height); + } @Override - public void setVisible(boolean visible) - { + public void setVisible(boolean visible) { super.setVisible(visible); wrappedApplet.setVisible(visible); } @Override - public void paint(Graphics graphics) {} + public void paint(Graphics graphics) { + } @Override - public void update(Graphics graphics) {} + public void update(Graphics graphics) { + } - public void setParameter(String name, String value) { params.put(name, value); } + public void setParameter(String name, String value) { + params.put(name, value); + } } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 06c6c79ca..5332bfc7c 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -72,10 +72,10 @@ import java.util.logging.Logger; public final class EntryPoint { private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - private EntryPoint() {} + private EntryPoint() { + } - public static void main(String[] args) - { + public static void main(String[] args) { ExitCode exitCode = listen(); if (exitCode != ExitCode.NORMAL) { @@ -85,8 +85,7 @@ public final class EntryPoint { } } - private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException - { + private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { if (input.isEmpty()) return PreLaunchAction.PROCEED; @@ -109,8 +108,7 @@ public final class EntryPoint { } } - private static ExitCode listen() - { + private static ExitCode listen() { Parameters parameters = new Parameters(); PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; @@ -179,7 +177,10 @@ public final class EntryPoint { private final int numericalCode; - ExitCode(int numericalCode) { this.numericalCode = numericalCode; } + ExitCode(int numericalCode) { + this.numericalCode = numericalCode; + } + } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 7677df56d..938e34030 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -79,8 +79,7 @@ public abstract class AbstractLauncher implements Launcher { protected final String mainClassName; - protected AbstractLauncher(Parameters params) - { + protected AbstractLauncher(Parameters params) { this.mcParams = params.getList("param", new ArrayList()); this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 43d706d60..0652cbaee 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -62,11 +62,12 @@ import java.lang.invoke.MethodHandle; public final class StandardLauncher extends AbstractLauncher { - public StandardLauncher(Parameters params) { super(params); } + public StandardLauncher(Parameters params) { + super(params); + } @Override - public void launch() throws Throwable - { + public void launch() throws Throwable { // window size, title and state // FIXME: there is no good way to maximize the minecraft window from here. diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 198fb61a7..d2496fa90 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -83,8 +83,7 @@ public final class LegacyFrame extends JFrame { private final Launcher launcher; - public LegacyFrame(String title, Applet applet) - { + public LegacyFrame(String title, Applet applet) { super(title); launcher = new Launcher(applet); @@ -101,8 +100,7 @@ public final class LegacyFrame extends JFrame { } public void start(String user, String session, int width, int height, boolean maximize, String serverAddress, - String serverPort, boolean isDemo) - { + String serverPort, boolean isDemo) { // Implements support for launching in to multiplayer on classic servers using a // mpticket // file generated by an external program and stored in the instance's root @@ -166,12 +164,10 @@ public final class LegacyFrame extends JFrame { private final class ForceExitHandler extends WindowAdapter { @Override - public void windowClosing(WindowEvent event) - { + public void windowClosing(WindowEvent event) { new Thread(new Runnable() { @Override - public void run() - { + public void run() { try { Thread.sleep(30000L); } catch (InterruptedException e) { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index aa899a61c..953f83d97 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -81,8 +81,7 @@ public final class LegacyLauncher extends AbstractLauncher { private final boolean usesApplet; private final String cwd; - public LegacyLauncher(Parameters params) - { + public LegacyLauncher(Parameters params) { super(params); user = params.getString("userName"); @@ -97,8 +96,7 @@ public final class LegacyLauncher extends AbstractLauncher { } @Override - public void launch() throws Throwable - { + public void launch() throws Throwable { Class main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 3378775fc..d019aa410 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -68,8 +68,7 @@ public final class Parameters { private final Map> map = new HashMap<>(); - public void add(String key, String value) - { + public void add(String key, String value) { List params = map.get(key); if (params == null) { @@ -81,8 +80,7 @@ public final class Parameters { params.add(value); } - public List getList(String key) throws ParameterNotFoundException - { + public List getList(String key) throws ParameterNotFoundException { List params = map.get(key); if (params == null) @@ -91,8 +89,7 @@ public final class Parameters { return params; } - public List getList(String key, List def) - { + public List getList(String key, List def) { List params = map.get(key); if (params == null || params.isEmpty()) @@ -101,8 +98,7 @@ public final class Parameters { return params; } - public String getString(String key) throws ParameterNotFoundException - { + public String getString(String key) throws ParameterNotFoundException { List list = getList(key); if (list.isEmpty()) @@ -111,8 +107,7 @@ public final class Parameters { return list.get(0); } - public String getString(String key, String def) - { + public String getString(String key, String def) { List params = map.get(key); if (params == null || params.isEmpty()) diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 6e8823876..99df70c38 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -52,7 +52,8 @@ public final class ReflectionUtils { private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); - private ReflectionUtils() {} + private ReflectionUtils() { + } /** * Instantiate an applet class by name @@ -67,8 +68,7 @@ public final class ReflectionUtils { * method handles * @throws Throwable any exceptions from the class's constructor */ - public static Applet createAppletClass(String appletClassName) throws Throwable - { + public static Applet createAppletClass(String appletClassName) throws Throwable { Class appletClass = ClassLoader.getSystemClassLoader().loadClass(appletClassName); MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, @@ -83,8 +83,7 @@ public final class ReflectionUtils { * * @return The found field. */ - public static Field getMinecraftGameDirField(Class minecraftMainClass) - { + public static Field getMinecraftGameDirField(Class minecraftMainClass) { LOGGER.fine("Resolving minecraft game directory field"); // Field we're looking for is always // private static File obfuscatedName = null; @@ -141,8 +140,7 @@ public final class ReflectionUtils { * @throws IllegalAccessException If method handles cannot access the entrypoint */ public static MethodHandle findMainEntrypoint(Class entrypointClass) - throws NoSuchMethodException, IllegalAccessException - { + throws NoSuchMethodException, IllegalAccessException { return MethodHandles.lookup().findStatic(entrypointClass, "main", MethodType.methodType(void.class, String[].class)); } @@ -168,7 +166,8 @@ public final class ReflectionUtils { * @throws IllegalAccessException If method handles cannot access the entrypoint */ public static MethodHandle findMainMethod(String entrypointClassName) - throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException - { return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); } + throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException { + return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); + } } diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java index 08e6770e9..a371b0cba 100644 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -38,10 +38,10 @@ package org.prismlauncher.utils; public final class StringUtils { - private StringUtils() {} + private StringUtils() { + } - public static String[] splitStringPair(char splitChar, String input) - { + public static String[] splitStringPair(char splitChar, String input) { int splitPoint = input.indexOf(splitChar); if (splitPoint == -1) return null; From 56d5035c63fc3146832b1159fe4686d552da763d Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 10:31:31 +0000 Subject: [PATCH 0182/1149] Fix the warnings properly Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 2 +- libraries/launcher/org/prismlauncher/EntryPoint.java | 2 +- .../org/prismlauncher/launcher/impl/legacy/LegacyFrame.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index 297ea27f6..7aabefa1b 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -4,7 +4,7 @@ find_package(Java 1.7 REQUIRED COMPONENTS Development) include(UseJava) set(CMAKE_JAVA_JAR_ENTRY_POINT org.prismlauncher.EntryPoint) -set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7 -Xlint:deprecation -Xlint:unchecked) +set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7) set(SRC org/prismlauncher/EntryPoint.java diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 5332bfc7c..eab31cb18 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -70,6 +70,7 @@ import java.util.logging.Level; import java.util.logging.Logger; public final class EntryPoint { + private static final Logger LOGGER = Logger.getLogger("EntryPoint"); private EntryPoint() { @@ -116,7 +117,6 @@ public final class EntryPoint { String line; while (preLaunchAction == PreLaunchAction.PROCEED) { - // noinspection NestedAssignment if ((line = reader.readLine()) != null) preLaunchAction = parseLine(line, parameters); else diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index d2496fa90..5b43f7b24 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -80,6 +80,7 @@ import java.util.logging.Logger; public final class LegacyFrame extends JFrame { private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); + private static final long serialVersionUID = 1L; private final Launcher launcher; From 922220c11e3081c6d3aaa6c664379ea398f1d67f Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 11:00:20 +0000 Subject: [PATCH 0183/1149] More consistent logging text Signed-off-by: TheKodeToad --- libraries/launcher/org/prismlauncher/EntryPoint.java | 4 ++-- .../org/prismlauncher/launcher/impl/legacy/LegacyFrame.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index eab31cb18..875c14cd2 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -130,7 +130,7 @@ public final class EntryPoint { // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { - LOGGER.info("Launch aborted by the launcher."); + LOGGER.info("Launch aborted by the launcher"); return ExitCode.ABORT; } @@ -154,7 +154,7 @@ public final class EntryPoint { return ExitCode.NORMAL; } catch (IllegalArgumentException e) { - LOGGER.log(Level.SEVERE, "Wrong argument.", e); + LOGGER.log(Level.SEVERE, "Wrong argument", e); return ExitCode.ILLEGAL_ARGUMENT; } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 5b43f7b24..f27405b51 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -94,7 +94,7 @@ public final class LegacyFrame extends JFrame { try { setIconImage(ImageIO.read(new File("icon.png"))); } catch (IOException e) { - LOGGER.log(Level.WARNING, "Unable to read Minecraft icon!", e); + LOGGER.log(Level.WARNING, "Unable to read Minecraft icon", e); } addWindowListener(new ForceExitHandler()); From 4a2df30f92262304c63876c6428c81b70a2f4558 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 16:11:43 +0000 Subject: [PATCH 0184/1149] Try to use more standard exit codes Signed-off-by: TheKodeToad --- libraries/launcher/org/prismlauncher/EntryPoint.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 875c14cd2..0fa3691d1 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -160,7 +160,7 @@ public final class EntryPoint { } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { LOGGER.log(Level.SEVERE, "Caught reflection exception from launcher", e); - return ExitCode.REFLECTION_EXCEPTION; + return ExitCode.ERROR; } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Exception caught from launcher", e); @@ -173,7 +173,7 @@ public final class EntryPoint { } private enum ExitCode { - NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(3), REFLECTION_EXCEPTION(4); + NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(65); private final int numericalCode; From 1ea2e854156820ee5ba3c59d0c99fe4465566b9c Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 16:29:19 +0000 Subject: [PATCH 0185/1149] Implicit is generally prefered Signed-off-by: TheKodeToad --- libraries/launcher/org/prismlauncher/EntryPoint.java | 2 +- .../launcher/org/prismlauncher/exception/ParseException.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 0fa3691d1..512b01a9a 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -157,7 +157,7 @@ public final class EntryPoint { LOGGER.log(Level.SEVERE, "Wrong argument", e); return ExitCode.ILLEGAL_ARGUMENT; - } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { + } catch (ReflectiveOperationException e) { LOGGER.log(Level.SEVERE, "Caught reflection exception from launcher", e); return ExitCode.ERROR; diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 2fd693e79..49f5b0064 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -57,7 +57,6 @@ public final class ParseException extends IllegalArgumentException { } public ParseException() { - super(); } public static ParseException forInputString(String inputString) { From 745c331311837471971152ef75f3ac12809217b6 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 17:10:45 +0000 Subject: [PATCH 0186/1149] Remove last case of printStackTrace Signed-off-by: TheKodeToad --- .../org/prismlauncher/launcher/impl/legacy/LegacyFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index f27405b51..28f85aa2c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -172,7 +172,7 @@ public final class LegacyFrame extends JFrame { try { Thread.sleep(30000L); } catch (InterruptedException e) { - e.printStackTrace(); + LOGGER.log(Level.SEVERE, "Thread interrupted", e); } LOGGER.info("Forcing exit!"); From e6dc34fe102f183e6857744283ee86c620091d08 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 17:18:17 +0000 Subject: [PATCH 0187/1149] More license fixing Signed-off-by: TheKodeToad --- .../exception/ParameterNotFoundException.java | 2 -- .../exception/ParseException.java | 2 -- .../org/prismlauncher/launcher/Launcher.java | 2 -- .../launcher/impl/AbstractLauncher.java | 1 - .../launcher/impl/legacy/LegacyFrame.java | 2 -- .../org/prismlauncher/utils/Parameters.java | 2 -- .../prismlauncher/utils/ReflectionUtils.java | 19 ++++++++++++++++++- 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index ad973ace1..52c2a3689 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -3,8 +3,6 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Samisafool * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad * diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 49f5b0064..80709c560 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -3,8 +3,6 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Samisafool * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad * diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index d54cfd5c7..1a6577e0c 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -3,8 +3,6 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Samisafool * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax * diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 938e34030..7ae7568c6 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -3,7 +3,6 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax * diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 28f85aa2c..15da03716 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -3,9 +3,7 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 flow - * Copyright (C) 2022 Samisafool * Copyright (C) 2022 TheKodeToad * * This program is free software: you can redistribute it and/or modify diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index d019aa410..8286bd70b 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -3,8 +3,6 @@ * Prism Launcher * * Copyright (C) 2022 icelimetea - * Copyright (C) 2022 Sefa Eyeoglu - * Copyright (C) 2022 Samisafool * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax * diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 99df70c38..1d2383a48 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -2,9 +2,9 @@ /* * Prism Launcher * + * Copyright (C) 2022 icelimetea * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad - * Copyright (C) 2022 icelimetea * * 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 @@ -34,6 +34,23 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * This file incorporates work covered by the following copyright and + * permission notice: + * + * Copyright 2013-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package org.prismlauncher.utils; From d90eff64d06a668e730e8af33cec325a5bac94de Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Fri, 4 Nov 2022 17:45:33 +0000 Subject: [PATCH 0188/1149] Add StringUtils to CMakeLists.txt Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index 7aabefa1b..d176b1d4c 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -17,6 +17,7 @@ set(SRC org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java org/prismlauncher/utils/ReflectionUtils.java + org/prismlauncher/utils/StringUtils.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) From 50d40257fe8631338f9b6c278cc18c8ca9cab1a1 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 5 Nov 2022 09:10:52 +0000 Subject: [PATCH 0189/1149] Always use this for consistency Signed-off-by: TheKodeToad --- .../launcher/net/minecraft/Launcher.java | 36 ++++++------- .../launcher/impl/StandardLauncher.java | 18 +++---- .../launcher/impl/legacy/LegacyFrame.java | 54 +++++++++---------- .../launcher/impl/legacy/LegacyLauncher.java | 18 +++---- .../org/prismlauncher/utils/Parameters.java | 12 ++--- 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 3bd38e77f..b895d5b78 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -113,28 +113,28 @@ public final class Launcher extends Applet implements AppletStub { wrappedApplet = applet; applet.setStub(this); - applet.setSize(getWidth(), getHeight()); + applet.setSize(this.getWidth(), this.getHeight()); setLayout(new BorderLayout()); this.add(applet, "Center"); applet.init(); - active = true; + this.active = true; applet.start(); - validate(); + this.validate(); } @Override public boolean isActive() { - return active; + return this.active; } @Override public URL getDocumentBase() { - return documentBase; + return this.documentBase; } @Override @@ -149,7 +149,7 @@ public final class Launcher extends Applet implements AppletStub { @Override public String getParameter(String name) { - String param = params.get(name); + String param = this.params.get(name); if (param != null) return param; @@ -164,49 +164,49 @@ public final class Launcher extends Applet implements AppletStub { @Override public void resize(int width, int height) { - wrappedApplet.resize(width, height); + this.wrappedApplet.resize(width, height); } @Override public void resize(Dimension size) { - wrappedApplet.resize(size); + this.wrappedApplet.resize(size); } @Override public void init() { - if (wrappedApplet != null) - wrappedApplet.init(); + if (this.wrappedApplet != null) + this.wrappedApplet.init(); } @Override public void start() { - wrappedApplet.start(); + this.wrappedApplet.start(); - active = true; + this.active = true; } @Override public void stop() { - wrappedApplet.stop(); + this.wrappedApplet.stop(); - active = false; + this.active = false; } @Override public void destroy() { - wrappedApplet.destroy(); + this.wrappedApplet.destroy(); } @Override public void appletResize(int width, int height) { - wrappedApplet.resize(width, height); + this.wrappedApplet.resize(width, height); } @Override public void setVisible(boolean visible) { super.setVisible(visible); - wrappedApplet.setVisible(visible); + this.wrappedApplet.setVisible(visible); } @Override @@ -218,7 +218,7 @@ public final class Launcher extends Applet implements AppletStub { } public void setParameter(String name, String value) { - params.put(name, value); + this.params.put(name, value); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 0652cbaee..0f6fcf349 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -75,21 +75,21 @@ public final class StandardLauncher extends AbstractLauncher { // mcparams.add("--fullscreen"); if (!this.maximize) { - mcParams.add("--width"); - mcParams.add(Integer.toString(width)); - mcParams.add("--height"); - mcParams.add(Integer.toString(height)); + this.mcParams.add("--width"); + this.mcParams.add(Integer.toString(this.width)); + this.mcParams.add("--height"); + this.mcParams.add(Integer.toString(this.height)); } if (this.serverAddress != null) { - mcParams.add("--server"); - mcParams.add(serverAddress); - mcParams.add("--port"); - mcParams.add(serverPort); + this.mcParams.add("--server"); + this.mcParams.add(this.serverAddress); + this.mcParams.add("--port"); + this.mcParams.add(this.serverPort); } MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); - method.invokeExact(mcParams.toArray(new String[0])); + method.invokeExact(this.mcParams.toArray(new String[0])); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 15da03716..eafc984a1 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -85,17 +85,17 @@ public final class LegacyFrame extends JFrame { public LegacyFrame(String title, Applet applet) { super(title); - launcher = new Launcher(applet); + this.launcher = new Launcher(applet); - applet.setStub(launcher); + applet.setStub(this.launcher); try { - setIconImage(ImageIO.read(new File("icon.png"))); + this.setIconImage(ImageIO.read(new File("icon.png"))); } catch (IOException e) { LOGGER.log(Level.WARNING, "Unable to read Minecraft icon", e); } - addWindowListener(new ForceExitHandler()); + this.addWindowListener(new ForceExitHandler()); } public void start(String user, String session, int width, int height, boolean maximize, String serverAddress, @@ -119,9 +119,9 @@ public final class LegacyFrame extends JFrame { LOGGER.warning("Mpticket file is corrupted!"); } else { // Assumes parameters are valid and in the correct order - launcher.setParameter("server", lines.get(0)); - launcher.setParameter("port", lines.get(1)); - launcher.setParameter("mppass", lines.get(2)); + this.launcher.setParameter("server", lines.get(0)); + this.launcher.setParameter("port", lines.get(1)); + this.launcher.setParameter("mppass", lines.get(2)); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Unable to read mpticket file!", e); @@ -129,35 +129,35 @@ public final class LegacyFrame extends JFrame { } if (serverAddress != null) { - launcher.setParameter("server", serverAddress); - launcher.setParameter("port", serverPort); + this.launcher.setParameter("server", serverAddress); + this.launcher.setParameter("port", serverPort); } - launcher.setParameter("username", user); - launcher.setParameter("sessionid", session); - launcher.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? - launcher.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. - launcher.setParameter("demo", isDemo ? "true" : "false"); - launcher.setParameter("fullscreen", "false"); + this.launcher.setParameter("username", user); + this.launcher.setParameter("sessionid", session); + this.launcher.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? + this.launcher.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. + this.launcher.setParameter("demo", isDemo ? "true" : "false"); + this.launcher.setParameter("fullscreen", "false"); - add(launcher); + this.add(this.launcher); - launcher.setPreferredSize(new Dimension(width, height)); + this.launcher.setPreferredSize(new Dimension(width, height)); - pack(); + this.pack(); - setLocationRelativeTo(null); - setResizable(true); + this.setLocationRelativeTo(null); + this.setResizable(true); if (maximize) setExtendedState(MAXIMIZED_BOTH); - validate(); + this.validate(); - launcher.init(); - launcher.start(); + this.launcher.init(); + this.launcher.start(); - setVisible(true); + this.setVisible(true); } private final class ForceExitHandler extends WindowAdapter { @@ -179,9 +179,9 @@ public final class LegacyFrame extends JFrame { } }).start(); - if (launcher != null) { - launcher.stop(); - launcher.destroy(); + if (LegacyFrame.this.launcher != null) { + LegacyFrame.this.launcher.stop(); + LegacyFrame.this.launcher.destroy(); } // old minecraft versions can hang without this >_< diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 953f83d97..9f76944f8 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -84,15 +84,15 @@ public final class LegacyLauncher extends AbstractLauncher { public LegacyLauncher(Parameters params) { super(params); - user = params.getString("userName"); - session = params.getString("sessionId"); - title = params.getString("windowTitle", "Minecraft"); - appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); + this.user = params.getString("userName"); + this.session = params.getString("sessionId"); + this.title = params.getString("windowTitle", "Minecraft"); + this.appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); List traits = params.getList("traits", Collections.emptyList()); - usesApplet = !traits.contains("noapplet"); + this.usesApplet = !traits.contains("noapplet"); - cwd = System.getProperty("user.dir"); + this.cwd = System.getProperty("user.dir"); } @Override @@ -104,14 +104,14 @@ public final class LegacyLauncher extends AbstractLauncher { LOGGER.warning("Could not find Minecraft path field"); else { gameDirField.setAccessible(true); - gameDirField.set(null /* field is static, so instance is null */, new File(cwd)); + gameDirField.set(null /* field is static, so instance is null */, new File(this.cwd)); } if (this.usesApplet) { LOGGER.info("Launching legacy minecraft using applet wrapper..."); try { - LegacyFrame window = new LegacyFrame(title, ReflectionUtils.createAppletClass(this.appletClass)); + LegacyFrame window = new LegacyFrame(this.title, ReflectionUtils.createAppletClass(this.appletClass)); window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, this.serverPort, this.mcParams.contains("--demo")); @@ -123,7 +123,7 @@ public final class LegacyLauncher extends AbstractLauncher { } MethodHandle method = ReflectionUtils.findMainEntrypoint(main); - method.invokeExact(mcParams.toArray(new String[0])); + method.invokeExact(this.mcParams.toArray(new String[0])); } } diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 8286bd70b..7af3c5e8e 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -67,19 +67,19 @@ public final class Parameters { private final Map> map = new HashMap<>(); public void add(String key, String value) { - List params = map.get(key); + List params = this.map.get(key); if (params == null) { params = new ArrayList<>(); - map.put(key, params); + this.map.put(key, params); } params.add(value); } public List getList(String key) throws ParameterNotFoundException { - List params = map.get(key); + List params = this.map.get(key); if (params == null) throw ParameterNotFoundException.forParameterName(key); @@ -88,7 +88,7 @@ public final class Parameters { } public List getList(String key, List def) { - List params = map.get(key); + List params = this.map.get(key); if (params == null || params.isEmpty()) return def; @@ -97,7 +97,7 @@ public final class Parameters { } public String getString(String key) throws ParameterNotFoundException { - List list = getList(key); + List list = this.getList(key); if (list.isEmpty()) throw ParameterNotFoundException.forParameterName(key); @@ -106,7 +106,7 @@ public final class Parameters { } public String getString(String key, String def) { - List params = map.get(key); + List params = this.map.get(key); if (params == null || params.isEmpty()) return def; From f2ca9a6b319ad0ade04837f6830e682bc86c01a2 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 5 Nov 2022 17:14:12 +0000 Subject: [PATCH 0190/1149] Revert switch to JUL for better colours Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 2 + .../org/prismlauncher/EntryPoint.java | 30 ++-- .../launcher/impl/legacy/LegacyFrame.java | 16 +-- .../launcher/impl/legacy/LegacyLauncher.java | 12 +- .../prismlauncher/utils/ReflectionUtils.java | 17 +-- .../prismlauncher/utils/logging/Level.java | 54 +++++++ .../org/prismlauncher/utils/logging/Log.java | 134 ++++++++++++++++++ 7 files changed, 223 insertions(+), 42 deletions(-) create mode 100644 libraries/launcher/org/prismlauncher/utils/logging/Level.java create mode 100644 libraries/launcher/org/prismlauncher/utils/logging/Log.java diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index d176b1d4c..90adcd3df 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -18,6 +18,8 @@ set(SRC org/prismlauncher/utils/Parameters.java org/prismlauncher/utils/ReflectionUtils.java org/prismlauncher/utils/StringUtils.java + org/prismlauncher/utils/logging/Level.java + org/prismlauncher/utils/logging/Log.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 512b01a9a..34e65672d 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -55,24 +55,21 @@ package org.prismlauncher; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.prismlauncher.utils.logging.Log; public final class EntryPoint { - private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - private EntryPoint() { } @@ -80,7 +77,7 @@ public final class EntryPoint { ExitCode exitCode = listen(); if (exitCode != ExitCode.NORMAL) { - LOGGER.warning("Exiting with " + exitCode); + Log.fatal("Exiting with " + exitCode); System.exit(exitCode.numericalCode); } @@ -123,14 +120,14 @@ public final class EntryPoint { preLaunchAction = PreLaunchAction.ABORT; } } catch (IOException | ParseException e) { - LOGGER.log(Level.SEVERE, "Launcher abort due to exception", e); + Log.fatal("Launcher abort due to exception", e); return ExitCode.ILLEGAL_ARGUMENT; } // Main loop if (preLaunchAction == PreLaunchAction.ABORT) { - LOGGER.info("Launch aborted by the launcher"); + Log.fatal("Launch aborted by the launcher"); return ExitCode.ABORT; } @@ -150,19 +147,22 @@ public final class EntryPoint { throw new IllegalArgumentException("Invalid launcher type: " + type); } + Log.launcher("Using " + type + " launcher"); + Log.blankLine(); + launcher.launch(); return ExitCode.NORMAL; } catch (IllegalArgumentException e) { - LOGGER.log(Level.SEVERE, "Wrong argument", e); + Log.fatal("Wrong argument", e); return ExitCode.ILLEGAL_ARGUMENT; } catch (ReflectiveOperationException e) { - LOGGER.log(Level.SEVERE, "Caught reflection exception from launcher", e); + Log.fatal("Caught reflection exception from launcher", e); return ExitCode.ERROR; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Exception caught from launcher", e); + Log.fatal("Exception caught from launcher", e); return ExitCode.ERROR; } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index eafc984a1..8ff64ced8 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -60,6 +60,8 @@ import net.minecraft.Launcher; import javax.imageio.ImageIO; import javax.swing.JFrame; +import org.prismlauncher.utils.logging.Log; + import java.applet.Applet; import java.awt.Dimension; import java.awt.event.WindowAdapter; @@ -72,12 +74,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; public final class LegacyFrame extends JFrame { - private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); private static final long serialVersionUID = 1L; private final Launcher launcher; @@ -92,7 +91,7 @@ public final class LegacyFrame extends JFrame { try { this.setIconImage(ImageIO.read(new File("icon.png"))); } catch (IOException e) { - LOGGER.log(Level.WARNING, "Unable to read Minecraft icon", e); + Log.error("Unable to read Minecraft icon", e); } this.addWindowListener(new ForceExitHandler()); @@ -116,7 +115,7 @@ public final class LegacyFrame extends JFrame { if (lines.size() < 3) { Files.move(mpticketFile, mpticketFileCorrupt, StandardCopyOption.REPLACE_EXISTING); - LOGGER.warning("Mpticket file is corrupted!"); + Log.warning("Mpticket file is corrupted!"); } else { // Assumes parameters are valid and in the correct order this.launcher.setParameter("server", lines.get(0)); @@ -124,7 +123,7 @@ public final class LegacyFrame extends JFrame { this.launcher.setParameter("mppass", lines.get(2)); } } catch (IOException e) { - LOGGER.log(Level.WARNING, "Unable to read mpticket file!", e); + Log.error("Unable to read mpticket file", e); } } @@ -170,11 +169,10 @@ public final class LegacyFrame extends JFrame { try { Thread.sleep(30000L); } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, "Thread interrupted", e); + Log.error("Thread interrupted", e); } - LOGGER.info("Forcing exit!"); - + Log.warning("Forcing exit"); System.exit(0); } }).start(); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 9f76944f8..5ffa9ec54 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -59,22 +59,19 @@ package org.prismlauncher.launcher.impl.legacy; import org.prismlauncher.launcher.impl.AbstractLauncher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; +import org.prismlauncher.utils.logging.Log; import java.io.File; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; import java.util.Collections; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; /** * Used to launch old versions that support applets. */ public final class LegacyLauncher extends AbstractLauncher { - private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); - private final String user, session; private final String title; private final String appletClass; @@ -101,24 +98,23 @@ public final class LegacyLauncher extends AbstractLauncher { Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); if (gameDirField == null) - LOGGER.warning("Could not find Minecraft path field"); + Log.warning("Could not find Minecraft path field"); else { gameDirField.setAccessible(true); gameDirField.set(null /* field is static, so instance is null */, new File(this.cwd)); } if (this.usesApplet) { - LOGGER.info("Launching legacy minecraft using applet wrapper..."); + Log.launcher("Launching with applet wrapper..."); try { LegacyFrame window = new LegacyFrame(this.title, ReflectionUtils.createAppletClass(this.appletClass)); window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, this.serverPort, this.mcParams.contains("--demo")); - return; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Running applet wrapper failed with exception; falling back to main class", e); + Log.error("Running applet wrapper failed with exception; falling back to main class", e); } } diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 1d2383a48..3b299615c 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -62,13 +62,11 @@ import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.logging.Level; -import java.util.logging.Logger; + +import org.prismlauncher.utils.logging.Log; public final class ReflectionUtils { - private static final Logger LOGGER = Logger.getLogger("ReflectionUtils"); - private ReflectionUtils() { } @@ -101,7 +99,7 @@ public final class ReflectionUtils { * @return The found field. */ public static Field getMinecraftGameDirField(Class minecraftMainClass) { - LOGGER.fine("Resolving minecraft game directory field"); + Log.debug("Resolving minecraft game directory field"); // Field we're looking for is always // private static File obfuscatedName = null; for (Field field : minecraftMainClass.getDeclaredFields()) { @@ -114,24 +112,23 @@ public final class ReflectionUtils { // Must be static if (!Modifier.isStatic(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is not static", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is not static"); continue; } // Must be private if (!Modifier.isPrivate(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is not private", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is not private"); continue; } // Must not be final if (Modifier.isFinal(fieldModifiers)) { - LOGGER.log(Level.FINE, "Rejecting field {0} because it is final", field.getName()); + Log.debug("Rejecting field " + field.getName() + " because it is final"); continue; } - LOGGER.log(Level.FINE, "Identified field {0} to match conditions for minecraft game directory field", - field.getName()); + Log.debug("Identified field " + field.getName() + " to match conditions for minecraft game directory field"); return field; } diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Level.java b/libraries/launcher/org/prismlauncher/utils/logging/Level.java new file mode 100644 index 000000000..330cec28f --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/logging/Level.java @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 TheKodeToad + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.utils.logging; + +public enum Level { + LAUNCHER("Launcher"), DEBUG("Debug"), INFO("Info"), MESSAGE("Message"), + WARNING("Warning"), ERROR("Error", true), FATAL("Fatal", true); + + String name; + boolean stderr; + + Level(String name) { + this(name, false); + } + + Level(String name, boolean stderr) { + this.name = name; + this.stderr = stderr; + } + +} diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Log.java b/libraries/launcher/org/prismlauncher/utils/logging/Log.java new file mode 100644 index 000000000..e19619910 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/logging/Log.java @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 TheKodeToad + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.utils.logging; + +import java.io.PrintStream; + +/** + * Used to print messages with different levels used to colourise the output. + * Used instead of a logging framework, as the launcher knows how to parse these + * messages. + */ +public final class Log { + + private static final PrintStream ERROR_PREFIX = new PrintStream(System.err) { + @Override + public void println(String x) { + error(x); + } + + @Override + public void println(Object x) { + error(String.valueOf(x)); + } + }, FATAL_PREFIX = new PrintStream(System.err) { + @Override + public void println(String x) { + fatal(x); + } + + @Override + public void println(Object x) { + fatal(String.valueOf(x)); + } + }; + + private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug"); + + private Log() { + } + + public static void blankLine() { + System.out.println(); + } + + public static void launcher(String message) { + log(message, Level.LAUNCHER); + } + + public static void error(String message) { + log(message, Level.ERROR); + } + + public static void debug(String message) { + if (!DEBUG) + return; + + log(message, Level.DEBUG); + } + + public static void info(String message) { + log(message, Level.INFO); + } + + public static void warning(String message) { + log(message, Level.WARNING); + } + + public static void error(String message, Throwable e) { + error(message); + e.printStackTrace(ERROR_PREFIX); + } + + public static void fatal(String message) { + log(message, Level.FATAL); + } + + public static void fatal(String message, Throwable e) { + fatal(message); + e.printStackTrace(FATAL_PREFIX); + } + + /** + * Logs a message with the prefix !![LEVEL]!. + * + * @param message The message + * @param level The level + */ + public static void log(String message, Level level) { + String prefix = "!![" + level.name + "]!"; + // prefix first line + message = prefix + message; + // prefix subsequent lines + message = message.replace("\n", "\n" + prefix); + + if (level.stderr) + System.err.println(message); + else + System.out.println(message); + } + +} From 32c2ad2bbd087b83fe5e1cfe03926410ec95bcca Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 8 Nov 2022 17:51:18 +0000 Subject: [PATCH 0191/1149] A lot more cleanup Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 25 +- launcher/minecraft/MinecraftInstance.h | 4 +- libraries/README.md | 66 +-- libraries/launcher/CMakeLists.txt | 4 +- libraries/launcher/formatting-profile.xml | 399 ------------------ .../launcher/net/minecraft/Launcher.java | 87 ++-- .../org/prismlauncher/EntryPoint.java | 105 +++-- .../exception/ParameterNotFoundException.java | 22 +- .../exception/ParseException.java | 26 +- .../org/prismlauncher/launcher/Launcher.java | 3 +- .../launcher/impl/AbstractLauncher.java | 48 +-- .../launcher/impl/StandardLauncher.java | 38 +- .../launcher/impl/legacy/LegacyFrame.java | 99 +++-- .../launcher/impl/legacy/LegacyLauncher.java | 53 +-- .../org/prismlauncher/utils/Parameters.java | 23 +- .../prismlauncher/utils/ReflectionUtils.java | 103 ++--- .../org/prismlauncher/utils/StringUtils.java | 11 +- .../prismlauncher/utils/logging/Level.java | 11 +- .../org/prismlauncher/utils/logging/Log.java | 52 +-- .../utils/logging/LogPrintStream.java | 99 +++++ 20 files changed, 417 insertions(+), 861 deletions(-) delete mode 100644 libraries/launcher/formatting-profile.xml create mode 100644 libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 39a7198c3..a5b19f09d 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Jamie Mansfield * Copyright (C) 2022 TheKodeToad @@ -438,6 +438,17 @@ QStringList MinecraftInstance::javaArguments() return args; } +QString MinecraftInstance::getLauncher() +{ + auto profile = m_components->getProfile(); + + // use legacy launcher if the traits are set + if (profile->getTraits().contains("legacyLaunch") || profile->getTraits().contains("alphaLaunch")) + return "legacy"; + + return "standard"; +} + QMap MinecraftInstance::getVariables() { QMap out; @@ -634,15 +645,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftS launchScript += "traits " + trait + "\n"; } - launchScript += "launcher "; - - // use legacy launcher if the traits are set - if (profile->getTraits().contains("legacyLaunch") || profile->getTraits().contains("alphaLaunch")) - launchScript += "legacy"; - else - launchScript += "standard"; - - launchScript += "\n"; + launchScript += "launcher " + getLauncher() + "\n"; // qDebug() << "Generated launch script:" << launchScript; return launchScript; @@ -779,6 +782,8 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr out << "Window size: " + QString::number(width) + " x " + QString::number(height); } out << ""; + out << "Launcher: " + getLauncher(); + out << ""; return out; } diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h index 1895d1879..1bbd7b832 100644 --- a/launcher/minecraft/MinecraftInstance.h +++ b/launcher/minecraft/MinecraftInstance.h @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 @@ -130,6 +131,7 @@ public: QString createLaunchScript(AuthSessionPtr session, MinecraftServerTargetPtr serverToJoin); /// get arguments passed to java QStringList javaArguments(); + QString getLauncher(); /// get variables for launch command variable substitution/environment QMap getVariables() override; diff --git a/libraries/README.md b/libraries/README.md index 2971e32b6..ac5a36184 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -42,19 +42,20 @@ MIT licensed. Java launcher part for Minecraft. -It: +It does the following: -- Starts a process -- Waits for a launch script on stdin -- Consumes the launch script you feed it -- Proceeds with launch when it gets the `launcher` command +- Waits for a launch script on stdin. +- Consumes the launch script you feed it. +- Proceeds with launch when it gets the `launcher` command. + +If "abort" is sent, the process will exit. This means the process is essentially idle until the final command is sent. You can, for example, attach a profiler before you send it. -A `legacy` and `standard` launchers are available. +The `standard` and `legacy` launchers are available. -- `legacy` is intended for use with Minecraft versions < 1.6 and is deprecated. - `standard` can handle launching any Minecraft version, at the cost of some extra features `legacy` enables (custom window icon and title). +- `legacy` is intended for use with Minecraft versions < 1.6 and is deprecated. Example (some parts have been censored): @@ -64,7 +65,7 @@ mainClass net.minecraft.launchwrapper.Launch param --username param CENSORED param --version -param MultiMC5 +param Prism Launcher param --gameDir param /home/peterix/minecraft/FTB/17ForgeTest/minecraft param --assetsDir @@ -81,57 +82,10 @@ param --userType param mojang param --tweakClass param cpw.mods.fml.common.launcher.FMLTweaker -windowTitle MultiMC: 172ForgeTest +windowTitle Prism Launcher: 172ForgeTest windowParams 854x480 userName CENSORED sessionId token:CENSORED:CENSORED -cp /home/peterix/minecraft/FTB/libraries/com/mojang/realms/1.3.5/realms-1.3.5.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar -cp /home/peterix/minecraft/FTB/libraries/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar -cp /home/peterix/minecraft/FTB/libraries/java3d/vecmath/1.3.1/vecmath-1.3.1.jar -cp /home/peterix/minecraft/FTB/libraries/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar -cp /home/peterix/minecraft/FTB/libraries/com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar -cp /home/peterix/minecraft/FTB/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar -cp /home/peterix/minecraft/FTB/libraries/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar -cp /home/peterix/minecraft/FTB/libraries/com/paulscode/codecwav/20101023/codecwav-20101023.jar -cp /home/peterix/minecraft/FTB/libraries/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar -cp /home/peterix/minecraft/FTB/libraries/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar -cp /home/peterix/minecraft/FTB/libraries/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar -cp /home/peterix/minecraft/FTB/libraries/io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar -cp /home/peterix/minecraft/FTB/libraries/com/google/guava/guava/16.0/guava-16.0.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/commons/commons-lang3/3.2.1/commons-lang3-3.2.1.jar -cp /home/peterix/minecraft/FTB/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar -cp /home/peterix/minecraft/FTB/libraries/commons-codec/commons-codec/1.9/commons-codec-1.9.jar -cp /home/peterix/minecraft/FTB/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar -cp /home/peterix/minecraft/FTB/libraries/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar -cp /home/peterix/minecraft/FTB/libraries/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar -cp /home/peterix/minecraft/FTB/libraries/com/mojang/authlib/1.5.16/authlib-1.5.16.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar -cp /home/peterix/minecraft/FTB/libraries/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar -cp /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar -cp /home/peterix/minecraft/FTB/libraries/tv/twitch/twitch/5.16/twitch-5.16.jar -cp /home/peterix/minecraft/FTB/libraries/net/minecraftforge/forge/1.7.10-10.13.0.1178/forge-1.7.10-10.13.0.1178.jar -cp /home/peterix/minecraft/FTB/libraries/net/minecraft/launchwrapper/1.9/launchwrapper-1.9.jar -cp /home/peterix/minecraft/FTB/libraries/org/ow2/asm/asm-all/4.1/asm-all-4.1.jar -cp /home/peterix/minecraft/FTB/libraries/com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar -cp /home/peterix/minecraft/FTB/libraries/com/typesafe/config/1.2.1/config-1.2.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-actors-migration_2.11/1.1.0/scala-actors-migration_2.11-1.1.0.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/plugins/scala-continuations-library_2.11/1.0.2/scala-continuations-library_2.11-1.0.2.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/plugins/scala-continuations-plugin_2.11.1/1.0.2/scala-continuations-plugin_2.11.1-1.0.2.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-parser-combinators_2.11/1.0.1/scala-parser-combinators_2.11-1.0.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-swing_2.11/1.0.1/scala-swing_2.11-1.0.1.jar -cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.jar -cp /home/peterix/minecraft/FTB/libraries/lzma/lzma/0.0.1/lzma-0.0.1.jar -ext /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar -ext /home/peterix/minecraft/FTB/libraries/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar -natives /home/peterix/minecraft/FTB/17ForgeTest/natives -cp /home/peterix/minecraft/FTB/versions/1.7.10/1.7.10.jar launcher standard ``` diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index 90adcd3df..1d22a93ea 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -9,10 +9,10 @@ set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7) set(SRC org/prismlauncher/EntryPoint.java org/prismlauncher/launcher/Launcher.java - org/prismlauncher/launcher/impl/legacy/LegacyFrame.java - org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java org/prismlauncher/launcher/impl/AbstractLauncher.java org/prismlauncher/launcher/impl/StandardLauncher.java + org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java + org/prismlauncher/launcher/impl/legacy/LegacyFrame.java org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java diff --git a/libraries/launcher/formatting-profile.xml b/libraries/launcher/formatting-profile.xml deleted file mode 100644 index 1b3348382..000000000 --- a/libraries/launcher/formatting-profile.xml +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index b895d5b78..a721495ae 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax @@ -62,8 +61,10 @@ import java.awt.Dimension; import java.awt.Graphics; import java.net.MalformedURLException; import java.net.URL; +import java.util.HashMap; import java.util.Map; -import java.util.TreeMap; + +import org.prismlauncher.utils.logging.Log; /** * WARNING: This class is reflectively accessed by legacy Forge versions. @@ -75,7 +76,7 @@ public final class Launcher extends Applet implements AppletStub { private static final long serialVersionUID = 1L; - private final Map params = new TreeMap<>(); + private final Map params = new HashMap<>(); private Applet wrappedApplet; private final URL documentBase; @@ -88,75 +89,75 @@ public final class Launcher extends Applet implements AppletStub { public Launcher(Applet applet, URL documentBase) { setLayout(new BorderLayout()); - this.add(applet, "Center"); + add(applet, "Center"); wrappedApplet = applet; try { - if (documentBase != null) { - this.documentBase = documentBase; - } else if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) { - // Special case only for Classic versions - - // TODO: 2022-10-27 Can this be changed to https - this.documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); - } else { - // TODO: 2022-10-27 Can this be changed to https? - this.documentBase = new URL("http://www.minecraft.net/game/"); + if (documentBase == null) { + if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) { + // Special case only for Classic versions + documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); + } else { + documentBase = new URL("http://www.minecraft.net/game/"); + } } } catch (MalformedURLException e) { - throw new RuntimeException(e); + // handle gracefully - it won't happen, but Java requires that it is caught + Log.error("Failed to parse document base URL", e); } + + this.documentBase = documentBase; } public void replace(Applet applet) { wrappedApplet = applet; applet.setStub(this); - applet.setSize(this.getWidth(), this.getHeight()); + applet.setSize(getWidth(), getHeight()); setLayout(new BorderLayout()); - this.add(applet, "Center"); + add(applet, "Center"); applet.init(); - this.active = true; + active = true; applet.start(); - this.validate(); + validate(); } @Override public boolean isActive() { - return this.active; + return active; } @Override public URL getDocumentBase() { - return this.documentBase; + return documentBase; } @Override public URL getCodeBase() { try { - // TODO: 2022-10-27 Can this be changed to https? return new URL("http://www.minecraft.net/game/"); } catch (MalformedURLException e) { - throw new RuntimeException(e); + Log.error("Failed to parse codebase URL", e); + return null; } } @Override - public String getParameter(String name) { - String param = this.params.get(name); + public String getParameter(String key) { + String param = params.get(key); if (param != null) return param; try { - return super.getParameter(name); - } catch (Exception ignored) { + return super.getParameter(key); + } catch (Throwable ignored) { } return null; @@ -164,49 +165,49 @@ public final class Launcher extends Applet implements AppletStub { @Override public void resize(int width, int height) { - this.wrappedApplet.resize(width, height); + wrappedApplet.resize(width, height); } @Override public void resize(Dimension size) { - this.wrappedApplet.resize(size); + wrappedApplet.resize(size); } @Override public void init() { - if (this.wrappedApplet != null) - this.wrappedApplet.init(); + if (wrappedApplet != null) + wrappedApplet.init(); } @Override public void start() { - this.wrappedApplet.start(); + wrappedApplet.start(); - this.active = true; + active = true; } @Override public void stop() { - this.wrappedApplet.stop(); + wrappedApplet.stop(); - this.active = false; + active = false; } @Override public void destroy() { - this.wrappedApplet.destroy(); + wrappedApplet.destroy(); } @Override public void appletResize(int width, int height) { - this.wrappedApplet.resize(width, height); + wrappedApplet.resize(width, height); } @Override public void setVisible(boolean visible) { super.setVisible(visible); - this.wrappedApplet.setVisible(visible); + wrappedApplet.setVisible(visible); } @Override @@ -217,8 +218,12 @@ public final class Launcher extends Applet implements AppletStub { public void update(Graphics graphics) { } - public void setParameter(String name, String value) { - this.params.put(name, value); + public void setParameter(String key, String value) { + params.put(key, value); + } + + public void setParameter(String key, boolean value) { + setParameter(key, value ? "true" : "false"); } } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 34e65672d..f65674683 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax @@ -56,7 +55,6 @@ package org.prismlauncher; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; @@ -70,63 +68,40 @@ import org.prismlauncher.utils.logging.Log; public final class EntryPoint { - private EntryPoint() { - } - public static void main(String[] args) { - ExitCode exitCode = listen(); + ExitCode code = listen(); - if (exitCode != ExitCode.NORMAL) { - Log.fatal("Exiting with " + exitCode); + if (code != ExitCode.NORMAL) { + Log.fatal("Exiting with " + code); - System.exit(exitCode.numericalCode); - } - } - - private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { - if (input.isEmpty()) - return PreLaunchAction.PROCEED; - - if ("launch".equalsIgnoreCase(input)) - return PreLaunchAction.LAUNCH; - else if ("abort".equalsIgnoreCase(input)) - return PreLaunchAction.ABORT; - else { - String[] pair = StringUtils.splitStringPair(' ', input); - - if (pair == null) - throw new ParseException(String.format( - "Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or " - + "in the format '[param name] [param]'.", - input)); - - params.add(pair[0], pair[1]); - - return PreLaunchAction.PROCEED; + System.exit(code.numeric); } } private static ExitCode listen() { - Parameters parameters = new Parameters(); - PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; + Parameters params = new Parameters(); + PreLaunchAction action = PreLaunchAction.PROCEED; try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) { String line; - while (preLaunchAction == PreLaunchAction.PROCEED) { + while (action == PreLaunchAction.PROCEED) { if ((line = reader.readLine()) != null) - preLaunchAction = parseLine(line, parameters); + action = parseLine(line, params); else - preLaunchAction = PreLaunchAction.ABORT; + action = PreLaunchAction.ABORT; } - } catch (IOException | ParseException e) { - Log.fatal("Launcher abort due to exception", e); + } catch (IllegalArgumentException e) { + Log.fatal("Aborting due to wrong argument", e); return ExitCode.ILLEGAL_ARGUMENT; + } catch (Throwable e) { + Log.fatal("Aborting due to exception", e); + + return ExitCode.ABORT; } - // Main loop - if (preLaunchAction == PreLaunchAction.ABORT) { + if (action == PreLaunchAction.ABORT) { Log.fatal("Launch aborted by the launcher"); return ExitCode.ABORT; @@ -134,33 +109,28 @@ public final class EntryPoint { try { Launcher launcher; - String type = parameters.getString("launcher"); + String type = params.getString("launcher"); switch (type) { case "standard": - launcher = new StandardLauncher(parameters); + launcher = new StandardLauncher(params); break; + case "legacy": - launcher = new LegacyLauncher(parameters); + launcher = new LegacyLauncher(params); break; + default: throw new IllegalArgumentException("Invalid launcher type: " + type); } - Log.launcher("Using " + type + " launcher"); - Log.blankLine(); - launcher.launch(); return ExitCode.NORMAL; } catch (IllegalArgumentException e) { - Log.fatal("Wrong argument", e); + Log.fatal("Illegal argument", e); return ExitCode.ILLEGAL_ARGUMENT; - } catch (ReflectiveOperationException e) { - Log.fatal("Caught reflection exception from launcher", e); - - return ExitCode.ERROR; } catch (Throwable e) { Log.fatal("Exception caught from launcher", e); @@ -168,6 +138,29 @@ public final class EntryPoint { } } + private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException { + switch (input) { + case "": + break; + + case "launch": + return PreLaunchAction.LAUNCH; + + case "abort": + return PreLaunchAction.ABORT; + + default: + String[] pair = StringUtils.splitStringPair(' ', input); + + if (pair == null) + throw new ParseException(input, "[key] [value]"); + + params.add(pair[0], pair[1]); + } + + return PreLaunchAction.PROCEED; + } + private enum PreLaunchAction { PROCEED, LAUNCH, ABORT } @@ -175,10 +168,10 @@ public final class EntryPoint { private enum ExitCode { NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(65); - private final int numericalCode; + private final int numeric; - ExitCode(int numericalCode) { - this.numericalCode = numericalCode; + ExitCode(int numeric) { + this.numeric = numeric; } } diff --git a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java index 52c2a3689..524076ff7 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParameterNotFoundException.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad @@ -42,23 +41,8 @@ public final class ParameterNotFoundException extends IllegalArgumentException { private static final long serialVersionUID = 1L; - public ParameterNotFoundException(String message, Throwable cause) { - super(message, cause); - } - - public ParameterNotFoundException(Throwable cause) { - super(cause); - } - - public ParameterNotFoundException(String message) { - super(message); - } - - public ParameterNotFoundException() { - } - - public static ParameterNotFoundException forParameterName(String parameterName) { - return new ParameterNotFoundException(String.format("Unknown parameter name '%s'", parameterName)); + public ParameterNotFoundException(String key) { + super(String.format("Required parameter '%s' was not found", key)); } } diff --git a/libraries/launcher/org/prismlauncher/exception/ParseException.java b/libraries/launcher/org/prismlauncher/exception/ParseException.java index 80709c560..4608fdd17 100644 --- a/libraries/launcher/org/prismlauncher/exception/ParseException.java +++ b/libraries/launcher/org/prismlauncher/exception/ParseException.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad @@ -42,27 +41,8 @@ public final class ParseException extends IllegalArgumentException { private static final long serialVersionUID = 1L; - public ParseException(String message) { - super(message); - } - - public ParseException(String message, Throwable cause) { - super(message, cause); - } - - public ParseException(Throwable cause) { - super(cause); - } - - public ParseException() { - } - - public static ParseException forInputString(String inputString) { - return new ParseException(String.format("Could not parse input string '%s'", inputString)); - } - - public static ParseException forInputString(String inputString, Throwable cause) { - return new ParseException(String.format("Could not parse input string '%s'", inputString), cause); + public ParseException(String input, String format) { + super(String.format("For input '%s' - should match '%s'", input, format)); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java index 1a6577e0c..049a83d84 100644 --- a/libraries/launcher/org/prismlauncher/launcher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 7ae7568c6..585d55f1a 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax @@ -55,21 +54,20 @@ package org.prismlauncher.launcher.impl; +import java.util.ArrayList; +import java.util.List; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.StringUtils; -import java.util.ArrayList; -import java.util.List; - public abstract class AbstractLauncher implements Launcher { - private static final int DEFAULT_WINDOW_WIDTH = 854; - private static final int DEFAULT_WINDOW_HEIGHT = 480; + private static final int DEFAULT_WINDOW_WIDTH = 854, DEFAULT_WINDOW_HEIGHT = 480; // parameters, separated from ParamBucket - protected final List mcParams; + protected final List gameArgs; // secondary parameters protected final int width, height; @@ -79,34 +77,34 @@ public abstract class AbstractLauncher implements Launcher { protected final String mainClassName; protected AbstractLauncher(Parameters params) { - this.mcParams = params.getList("param", new ArrayList()); - this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); + gameArgs = params.getList("param", new ArrayList()); + mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); - this.serverAddress = params.getString("serverAddress", null); - this.serverPort = params.getString("serverPort", null); + serverAddress = params.getString("serverAddress", null); + serverPort = params.getString("serverPort", null); String windowParams = params.getString("windowParams", null); - this.maximize = "max".equalsIgnoreCase(windowParams); + if ("max".equals(windowParams) || windowParams == null) { + maximize = windowParams != null; + + width = DEFAULT_WINDOW_WIDTH; + height = DEFAULT_WINDOW_HEIGHT; + } else { + maximize = false; - if (windowParams != null && !"max".equalsIgnoreCase(windowParams)) { String[] sizePair = StringUtils.splitStringPair('x', windowParams); if (sizePair != null) { try { - this.width = Integer.parseInt(sizePair[0]); - this.height = Integer.parseInt(sizePair[1]); - } catch (NumberFormatException e) { - throw new ParseException(String.format("Could not parse window parameters from '%s'", windowParams), - e); + width = Integer.parseInt(sizePair[0]); + height = Integer.parseInt(sizePair[1]); + return; + } catch (NumberFormatException ignored) { } - } else { - throw new ParseException( - String.format("Invalid window size parameters '%s'. Format: [height]x[width]", windowParams)); } - } else { - this.width = DEFAULT_WINDOW_WIDTH; - this.height = DEFAULT_WINDOW_HEIGHT; + + throw new ParseException(windowParams, "[width]x[height]"); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index 0f6fcf349..9436ff15e 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax @@ -55,11 +54,11 @@ package org.prismlauncher.launcher.impl; +import java.lang.invoke.MethodHandle; + import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.ReflectionUtils; -import java.lang.invoke.MethodHandle; - public final class StandardLauncher extends AbstractLauncher { public StandardLauncher(Parameters params) { @@ -69,27 +68,24 @@ public final class StandardLauncher extends AbstractLauncher { @Override public void launch() throws Throwable { // window size, title and state - - // FIXME: there is no good way to maximize the minecraft window from here. - // the following often breaks linux screen setups - // mcparams.add("--fullscreen"); - - if (!this.maximize) { - this.mcParams.add("--width"); - this.mcParams.add(Integer.toString(this.width)); - this.mcParams.add("--height"); - this.mcParams.add(Integer.toString(this.height)); + // FIXME doesn't support maximisation + if (!maximize) { + gameArgs.add("--width"); + gameArgs.add(Integer.toString(width)); + gameArgs.add("--height"); + gameArgs.add(Integer.toString(height)); } - if (this.serverAddress != null) { - this.mcParams.add("--server"); - this.mcParams.add(this.serverAddress); - this.mcParams.add("--port"); - this.mcParams.add(this.serverPort); + if (serverAddress != null) { + gameArgs.add("--server"); + gameArgs.add(serverAddress); + gameArgs.add("--port"); + gameArgs.add(serverPort); } - MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); - method.invokeExact(this.mcParams.toArray(new String[0])); + // find and invoke the main method + MethodHandle method = ReflectionUtils.findMainMethod(mainClassName); + method.invokeExact(gameArgs.toArray(new String[0])); } } diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java index 8ff64ced8..c215e7fe0 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyFrame.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 flow * Copyright (C) 2022 TheKodeToad @@ -55,13 +54,6 @@ package org.prismlauncher.launcher.impl.legacy; -import net.minecraft.Launcher; - -import javax.imageio.ImageIO; -import javax.swing.JFrame; - -import org.prismlauncher.utils.logging.Log; - import java.applet.Applet; import java.awt.Dimension; import java.awt.event.WindowAdapter; @@ -75,6 +67,13 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.List; +import javax.imageio.ImageIO; +import javax.swing.JFrame; + +import org.prismlauncher.utils.logging.Log; + +import net.minecraft.Launcher; + public final class LegacyFrame extends JFrame { private static final long serialVersionUID = 1L; @@ -84,85 +83,85 @@ public final class LegacyFrame extends JFrame { public LegacyFrame(String title, Applet applet) { super(title); - this.launcher = new Launcher(applet); + launcher = new Launcher(applet); - applet.setStub(this.launcher); + applet.setStub(launcher); try { - this.setIconImage(ImageIO.read(new File("icon.png"))); + setIconImage(ImageIO.read(new File("icon.png"))); } catch (IOException e) { - Log.error("Unable to read Minecraft icon", e); + Log.error("Failed to read window icon", e); } - this.addWindowListener(new ForceExitHandler()); + addWindowListener(new ForceExitHandler()); } public void start(String user, String session, int width, int height, boolean maximize, String serverAddress, - String serverPort, boolean isDemo) { + String serverPort, boolean demo) { // Implements support for launching in to multiplayer on classic servers using a - // mpticket - // file generated by an external program and stored in the instance's root - // folder. + // mpticket file generated by an external program and stored in the instance's + // root folder. + Path instanceFolder = Paths.get(".."); + Path mpticket = instanceFolder.resolve("mpticket"); + Path mpticketCorrupt = instanceFolder.resolve("mpticket.corrupt"); - Path mpticketFile = Paths.get(System.getProperty("user.dir"), "..", "mpticket"); - - Path mpticketFileCorrupt = Paths.get(System.getProperty("user.dir"), "..", "mpticket.corrupt"); - - if (Files.exists(mpticketFile)) { + if (Files.exists(mpticket)) { try { - List lines = Files.readAllLines(mpticketFile, StandardCharsets.UTF_8); + List lines = Files.readAllLines(mpticket, StandardCharsets.UTF_8); if (lines.size() < 3) { - Files.move(mpticketFile, mpticketFileCorrupt, StandardCopyOption.REPLACE_EXISTING); + Files.move(mpticket, mpticketCorrupt, StandardCopyOption.REPLACE_EXISTING); - Log.warning("Mpticket file is corrupted!"); + Log.warning("mpticket file is corrupted"); } else { // Assumes parameters are valid and in the correct order - this.launcher.setParameter("server", lines.get(0)); - this.launcher.setParameter("port", lines.get(1)); - this.launcher.setParameter("mppass", lines.get(2)); + launcher.setParameter("server", lines.get(0)); + launcher.setParameter("port", lines.get(1)); + launcher.setParameter("mppass", lines.get(2)); } } catch (IOException e) { - Log.error("Unable to read mpticket file", e); + Log.error("Failed to read mpticket file", e); } } if (serverAddress != null) { - this.launcher.setParameter("server", serverAddress); - this.launcher.setParameter("port", serverPort); + launcher.setParameter("server", serverAddress); + launcher.setParameter("port", serverPort); } - this.launcher.setParameter("username", user); - this.launcher.setParameter("sessionid", session); - this.launcher.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? - this.launcher.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. - this.launcher.setParameter("demo", isDemo ? "true" : "false"); - this.launcher.setParameter("fullscreen", "false"); + launcher.setParameter("username", user); + launcher.setParameter("sessionid", session); + launcher.setParameter("stand-alone", true); // Show the quit button. TODO: why won't this work? + launcher.setParameter("haspaid", true); // Some old versions need this for world saves to work. + launcher.setParameter("demo", demo); + launcher.setParameter("fullscreen", false); - this.add(this.launcher); + add(launcher); - this.launcher.setPreferredSize(new Dimension(width, height)); + launcher.setPreferredSize(new Dimension(width, height)); - this.pack(); + pack(); - this.setLocationRelativeTo(null); - this.setResizable(true); + setLocationRelativeTo(null); + setResizable(true); if (maximize) setExtendedState(MAXIMIZED_BOTH); - this.validate(); + validate(); - this.launcher.init(); - this.launcher.start(); + launcher.init(); + launcher.start(); - this.setVisible(true); + setVisible(true); } private final class ForceExitHandler extends WindowAdapter { @Override public void windowClosing(WindowEvent event) { + // FIXME better solution + new Thread(new Runnable() { @Override public void run() { @@ -177,9 +176,9 @@ public final class LegacyFrame extends JFrame { } }).start(); - if (LegacyFrame.this.launcher != null) { - LegacyFrame.this.launcher.stop(); - LegacyFrame.this.launcher.destroy(); + if (launcher != null) { + launcher.stop(); + launcher.destroy(); } // old minecraft versions can hang without this >_< diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java index 5ffa9ec54..d349177b2 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 flow * Copyright (C) 2022 TheKodeToad @@ -56,17 +55,17 @@ package org.prismlauncher.launcher.impl.legacy; -import org.prismlauncher.launcher.impl.AbstractLauncher; -import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.ReflectionUtils; -import org.prismlauncher.utils.logging.Log; - import java.io.File; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; import java.util.Collections; import java.util.List; +import org.prismlauncher.launcher.impl.AbstractLauncher; +import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.ReflectionUtils; +import org.prismlauncher.utils.logging.Log; + /** * Used to launch old versions that support applets. */ @@ -75,51 +74,53 @@ public final class LegacyLauncher extends AbstractLauncher { private final String user, session; private final String title; private final String appletClass; - private final boolean usesApplet; - private final String cwd; + private final boolean useApplet; + private final String gameDir; public LegacyLauncher(Parameters params) { super(params); - this.user = params.getString("userName"); - this.session = params.getString("sessionId"); - this.title = params.getString("windowTitle", "Minecraft"); - this.appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); + user = params.getString("userName"); + session = params.getString("sessionId"); + title = params.getString("windowTitle", "Minecraft"); + appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); List traits = params.getList("traits", Collections.emptyList()); - this.usesApplet = !traits.contains("noapplet"); + useApplet = !traits.contains("noapplet"); - this.cwd = System.getProperty("user.dir"); + gameDir = System.getProperty("user.dir"); } @Override public void launch() throws Throwable { - Class main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); - Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); + Class main = ClassLoader.getSystemClassLoader().loadClass(mainClassName); + Field gameDirField = ReflectionUtils.findMinecraftGameDirField(main); if (gameDirField == null) - Log.warning("Could not find Minecraft path field"); + Log.warning("Could not find Minecraft folder field"); else { gameDirField.setAccessible(true); - gameDirField.set(null /* field is static, so instance is null */, new File(this.cwd)); + gameDirField.set(null, new File(gameDir)); } - if (this.usesApplet) { - Log.launcher("Launching with applet wrapper..."); + if (useApplet) { + System.setProperty("minecraft.applet.TargetDirectory", gameDir); try { - LegacyFrame window = new LegacyFrame(this.title, ReflectionUtils.createAppletClass(this.appletClass)); + LegacyFrame window = new LegacyFrame(title, ReflectionUtils.createAppletClass(appletClass)); - window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, - this.serverPort, this.mcParams.contains("--demo")); + window.start(user, session, width, height, maximize, serverAddress, serverPort, + gameArgs.contains("--demo")); return; } catch (Throwable e) { Log.error("Running applet wrapper failed with exception; falling back to main class", e); } } - MethodHandle method = ReflectionUtils.findMainEntrypoint(main); - method.invokeExact(this.mcParams.toArray(new String[0])); + // find and invoke the main method, this time without size parameters + // in all versions that support applets, these are ignored + MethodHandle method = ReflectionUtils.findMainMethod(main); + method.invokeExact(gameArgs.toArray(new String[0])); } } diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 7af3c5e8e..6365753e2 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 TheKodeToad * Copyright (C) 2022 solonovamax @@ -55,40 +54,40 @@ package org.prismlauncher.utils; -import org.prismlauncher.exception.ParameterNotFoundException; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.prismlauncher.exception.ParameterNotFoundException; + public final class Parameters { private final Map> map = new HashMap<>(); public void add(String key, String value) { - List params = this.map.get(key); + List params = map.get(key); if (params == null) { params = new ArrayList<>(); - this.map.put(key, params); + map.put(key, params); } params.add(value); } public List getList(String key) throws ParameterNotFoundException { - List params = this.map.get(key); + List params = map.get(key); if (params == null) - throw ParameterNotFoundException.forParameterName(key); + throw new ParameterNotFoundException(key); return params; } public List getList(String key, List def) { - List params = this.map.get(key); + List params = map.get(key); if (params == null || params.isEmpty()) return def; @@ -97,16 +96,16 @@ public final class Parameters { } public String getString(String key) throws ParameterNotFoundException { - List list = this.getList(key); + List list = getList(key); if (list.isEmpty()) - throw ParameterNotFoundException.forParameterName(key); + throw new ParameterNotFoundException(key); return list.get(0); } public String getString(String key, String def) { - List params = this.map.get(key); + List params = map.get(key); if (params == null || params.isEmpty()) return def; diff --git a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java index 3b299615c..dd212ef93 100644 --- a/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/ReflectionUtils.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea * Copyright (C) 2022 solonovamax * Copyright (C) 2022 TheKodeToad @@ -67,68 +66,57 @@ import org.prismlauncher.utils.logging.Log; public final class ReflectionUtils { - private ReflectionUtils() { - } + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static final ClassLoader LOADER = ClassLoader.getSystemClassLoader(); /** - * Instantiate an applet class by name + * Construct a Java applet by its class name. * - * @param appletClassName The name of the applet class to resolve - * - * @return The instantiated applet class - * - * @throws ClassNotFoundException if the provided class name cannot be found - * @throws NoSuchMethodException if the no-args constructor cannot be found - * @throws IllegalAccessException if the constructor cannot be accessed via - * method handles - * @throws Throwable any exceptions from the class's constructor + * @param clazz The class name + * @return The applet instance + * @throws Throwable */ - public static Applet createAppletClass(String appletClassName) throws Throwable { - Class appletClass = ClassLoader.getSystemClassLoader().loadClass(appletClassName); + public static Applet createAppletClass(String clazz) throws Throwable { + Class appletClass = LOADER.loadClass(clazz); - MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, - MethodType.methodType(void.class)); + MethodHandle appletConstructor = LOOKUP.findConstructor(appletClass, MethodType.methodType(void.class)); return (Applet) appletConstructor.invoke(); } /** - * Finds a field that looks like a Minecraft base folder in a supplied class + * Best guess of the game directory field within net.minecraft.client.Minecraft. + * Designed for legacy versions - newer versions do not use a static field. * - * @param minecraftMainClass the class to scan - * - * @return The found field. + * @param clazz The class + * @return The first field matching criteria */ - public static Field getMinecraftGameDirField(Class minecraftMainClass) { + public static Field findMinecraftGameDirField(Class clazz) { Log.debug("Resolving minecraft game directory field"); - // Field we're looking for is always - // private static File obfuscatedName = null; - for (Field field : minecraftMainClass.getDeclaredFields()) { - // Has to be File + + // search for private static File + for (Field field : clazz.getDeclaredFields()) { if (field.getType() != File.class) { continue; } int fieldModifiers = field.getModifiers(); - // Must be static if (!Modifier.isStatic(fieldModifiers)) { Log.debug("Rejecting field " + field.getName() + " because it is not static"); continue; } - // Must be private if (!Modifier.isPrivate(fieldModifiers)) { Log.debug("Rejecting field " + field.getName() + " because it is not private"); continue; } - // Must not be final if (Modifier.isFinal(fieldModifiers)) { Log.debug("Rejecting field " + field.getName() + " because it is final"); continue; } - Log.debug("Identified field " + field.getName() + " to match conditions for minecraft game directory field"); + Log.debug("Identified field " + field.getName() + " to match conditions for game directory field"); return field; } @@ -137,51 +125,30 @@ public final class ReflectionUtils { } /** - * Resolve main entrypoint and returns method handle for it. - *

- * Resolves a method that matches the following signature - * public static void main(String[] args) { - *

- * } - * + * Gets the main method within a class. * - * @param entrypointClass The entrypoint class to resolve the method from - * - * @return The method handle for the resolved entrypoint - * - * @throws NoSuchMethodException If no method matching the correct signature - * can be found - * @throws IllegalAccessException If method handles cannot access the entrypoint + * @param clazz The class + * @return A method matching the descriptor of a main method + * @throws ClassNotFoundException + * @throws NoSuchMethodException + * @throws IllegalAccessException */ - public static MethodHandle findMainEntrypoint(Class entrypointClass) - throws NoSuchMethodException, IllegalAccessException { - return MethodHandles.lookup().findStatic(entrypointClass, "main", - MethodType.methodType(void.class, String[].class)); + public static MethodHandle findMainMethod(Class clazz) throws NoSuchMethodException, IllegalAccessException { + return LOOKUP.findStatic(clazz, "main", MethodType.methodType(void.class, String[].class)); } /** - * Resolve main entrypoint and returns method handle for it. - *

- * Resolves a method that matches the following signature - * public static void main(String[] args) { - *

- * } - * + * Gets the main method within a class by its name. * - * @param entrypointClassName The name of the entrypoint class to resolve the - * method from - * - * @return The method handle for the resolved entrypoint - * - * @throws ClassNotFoundException If a class cannot be found with the provided - * name - * @throws NoSuchMethodException If no method matching the correct signature - * can be found - * @throws IllegalAccessException If method handles cannot access the entrypoint + * @param clazz The class name + * @return A method matching the descriptor of a main method + * @throws ClassNotFoundException + * @throws NoSuchMethodException + * @throws IllegalAccessException */ - public static MethodHandle findMainMethod(String entrypointClassName) + public static MethodHandle findMainMethod(String clazz) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException { - return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); + return findMainMethod(LOADER.loadClass(clazz)); } } diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java index a371b0cba..dfd1634bc 100644 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ b/libraries/launcher/org/prismlauncher/utils/StringUtils.java @@ -1,7 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * Prism Launcher - * + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 solonovamax * * This program is free software: you can redistribute it and/or modify @@ -38,15 +37,13 @@ package org.prismlauncher.utils; public final class StringUtils { - private StringUtils() { - } + public static String[] splitStringPair(char splitChar, String str) { + int splitPoint = str.indexOf(splitChar); - public static String[] splitStringPair(char splitChar, String input) { - int splitPoint = input.indexOf(splitChar); if (splitPoint == -1) return null; - return new String[] { input.substring(0, splitPoint), input.substring(splitPoint + 1) }; + return new String[] { str.substring(0, splitPoint), str.substring(splitPoint + 1) }; } } diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Level.java b/libraries/launcher/org/prismlauncher/utils/logging/Level.java index 330cec28f..552b0b55e 100644 --- a/libraries/launcher/org/prismlauncher/utils/logging/Level.java +++ b/libraries/launcher/org/prismlauncher/utils/logging/Level.java @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 TheKodeToad * * This program is free software: you can redistribute it and/or modify @@ -36,8 +36,13 @@ package org.prismlauncher.utils.logging; public enum Level { - LAUNCHER("Launcher"), DEBUG("Debug"), INFO("Info"), MESSAGE("Message"), - WARNING("Warning"), ERROR("Error", true), FATAL("Fatal", true); + LAUNCHER("Launcher"), + DEBUG("Debug"), + INFO("Info"), + MESSAGE("Message"), + WARNING("Warning"), + ERROR("Error", true), + FATAL("Fatal", true); String name; boolean stderr; diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Log.java b/libraries/launcher/org/prismlauncher/utils/logging/Log.java index e19619910..374a8107b 100644 --- a/libraries/launcher/org/prismlauncher/utils/logging/Log.java +++ b/libraries/launcher/org/prismlauncher/utils/logging/Log.java @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 TheKodeToad * * This program is free software: you can redistribute it and/or modify @@ -44,37 +44,12 @@ import java.io.PrintStream; */ public final class Log { - private static final PrintStream ERROR_PREFIX = new PrintStream(System.err) { - @Override - public void println(String x) { - error(x); - } - - @Override - public void println(Object x) { - error(String.valueOf(x)); - } - }, FATAL_PREFIX = new PrintStream(System.err) { - @Override - public void println(String x) { - fatal(x); - } - - @Override - public void println(Object x) { - fatal(String.valueOf(x)); - } - }; - + // original before overridden + private static final PrintStream OUT = new PrintStream(System.out), ERR = new PrintStream(System.err); + private static final PrintStream ERROR_PREFIX = new LogPrintStream(System.err, Level.ERROR), + FATAL_PREFIX = new LogPrintStream(System.err, Level.FATAL); private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug"); - private Log() { - } - - public static void blankLine() { - System.out.println(); - } - public static void launcher(String message) { log(message, Level.LAUNCHER); } @@ -84,16 +59,9 @@ public final class Log { } public static void debug(String message) { - if (!DEBUG) - return; - log(message, Level.DEBUG); } - public static void info(String message) { - log(message, Level.INFO); - } - public static void warning(String message) { log(message, Level.WARNING); } @@ -113,12 +81,16 @@ public final class Log { } /** - * Logs a message with the prefix !![LEVEL]!. + * Logs a message with the prefix !![LEVEL]!. This is picked up by + * the log viewer to give it nice colours. * * @param message The message * @param level The level */ public static void log(String message, Level level) { + if (!DEBUG && level == Level.DEBUG) + return; + String prefix = "!![" + level.name + "]!"; // prefix first line message = prefix + message; @@ -126,9 +98,9 @@ public final class Log { message = message.replace("\n", "\n" + prefix); if (level.stderr) - System.err.println(message); + ERR.println(message); else - System.out.println(message); + OUT.println(message); } } diff --git a/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java b/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java new file mode 100644 index 000000000..8a1828178 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * Prism Launcher - Minecraft Launcher + * Copyright (C) 2022 TheKodeToad + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.utils.logging; + +import java.io.OutputStream; +import java.io.PrintStream; + +/** + * Used to create a print stream that redirects to Log. + */ +final class LogPrintStream extends PrintStream { + + private final Level level; + + public LogPrintStream(OutputStream out, Level level) { + super(out); + + this.level = level; + } + + @Override + public void println(String x) { + Log.log(x, level); + } + + @Override + public void println(Object x) { + println(String.valueOf(x)); + } + + @Override + public void println(boolean x) { + println(String.valueOf(x)); + } + + @Override + public void println(char x) { + println(String.valueOf(x)); + } + + @Override + public void println(int x) { + println(String.valueOf(x)); + } + + @Override + public void println(long x) { + println(String.valueOf(x)); + } + + @Override + public void println(float x) { + println(String.valueOf(x)); + } + + @Override + public void println(double x) { + println(String.valueOf(x)); + } + + @Override + public void println(char[] x) { + println(String.valueOf(x)); + } + +} \ No newline at end of file From 9ad6eb11a37815f7aab89163184d519a2183f4f2 Mon Sep 17 00:00:00 2001 From: flow Date: Wed, 9 Nov 2022 14:14:25 -0300 Subject: [PATCH 0192/1149] refactor: fix CodeQL warnings in StringUtils::naturalCompare I have no idea why this function exists, so better to just let it exist. =D Signed-off-by: flow --- launcher/StringUtils.cpp | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/launcher/StringUtils.cpp b/launcher/StringUtils.cpp index 5ae586426..0f3c3669f 100644 --- a/launcher/StringUtils.cpp +++ b/launcher/StringUtils.cpp @@ -1,26 +1,28 @@ #include "StringUtils.h" +/// If you're wondering where these came from exactly, then know you're not the only one =D + /// TAKEN FROM Qt, because it doesn't expose it intelligently -static inline QChar getNextChar(const QString &s, int location) +static inline QChar getNextChar(const QString& s, int location) { return (location < s.length()) ? s.at(location) : QChar(); } /// TAKEN FROM Qt, because it doesn't expose it intelligently -int StringUtils::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs) +int StringUtils::naturalCompare(const QString& s1, const QString& s2, Qt::CaseSensitivity cs) { - for (int l1 = 0, l2 = 0; l1 <= s1.count() && l2 <= s2.count(); ++l1, ++l2) - { + int l1 = 0, l2 = 0; + while (l1 <= s1.count() && l2 <= s2.count()) { // skip spaces, tabs and 0's QChar c1 = getNextChar(s1, l1); while (c1.isSpace()) c1 = getNextChar(s1, ++l1); + QChar c2 = getNextChar(s2, l2); while (c2.isSpace()) c2 = getNextChar(s2, ++l2); - if (c1.isDigit() && c2.isDigit()) - { + if (c1.isDigit() && c2.isDigit()) { while (c1.digitValue() == 0) c1 = getNextChar(s1, ++l1); while (c2.digitValue() == 0) @@ -30,11 +32,8 @@ int StringUtils::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSe int lookAheadLocation2 = l2; int currentReturnValue = 0; // find the last digit, setting currentReturnValue as we go if it isn't equal - for (QChar lookAhead1 = c1, lookAhead2 = c2; - (lookAheadLocation1 <= s1.length() && lookAheadLocation2 <= s2.length()); - lookAhead1 = getNextChar(s1, ++lookAheadLocation1), - lookAhead2 = getNextChar(s2, ++lookAheadLocation2)) - { + for (QChar lookAhead1 = c1, lookAhead2 = c2; (lookAheadLocation1 <= s1.length() && lookAheadLocation2 <= s2.length()); + lookAhead1 = getNextChar(s1, ++lookAheadLocation1), lookAhead2 = getNextChar(s2, ++lookAheadLocation2)) { bool is1ADigit = !lookAhead1.isNull() && lookAhead1.isDigit(); bool is2ADigit = !lookAhead2.isNull() && lookAhead2.isDigit(); if (!is1ADigit && !is2ADigit) @@ -43,14 +42,10 @@ int StringUtils::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSe return -1; if (!is2ADigit) return 1; - if (currentReturnValue == 0) - { - if (lookAhead1 < lookAhead2) - { + if (currentReturnValue == 0) { + if (lookAhead1 < lookAhead2) { currentReturnValue = -1; - } - else if (lookAhead1 > lookAhead2) - { + } else if (lookAhead1 > lookAhead2) { currentReturnValue = 1; } } @@ -58,19 +53,24 @@ int StringUtils::naturalCompare(const QString &s1, const QString &s2, Qt::CaseSe if (currentReturnValue != 0) return currentReturnValue; } - if (cs == Qt::CaseInsensitive) - { + + if (cs == Qt::CaseInsensitive) { if (!c1.isLower()) c1 = c1.toLower(); if (!c2.isLower()) c2 = c2.toLower(); } + int r = QString::localeAwareCompare(c1, c2); if (r < 0) return -1; if (r > 0) return 1; + + l1 += 1; + l2 += 1; } + // The two strings are the same (02 == 2) so fall back to the normal sort return QString::compare(s1, s2, cs); } From 99ed0b6c2ca67733a574a13cd215ec5c46c4dcfa Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Thu, 10 Nov 2022 11:14:58 +0000 Subject: [PATCH 0193/1149] Implement flowln's suggestions Signed-off-by: TheKodeToad --- launcher/ui/pages/modplatform/ModPage.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 2f5f95bfc..234f9f36f 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -40,10 +40,10 @@ #include #include +#include #include #include -#include #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" @@ -246,6 +246,10 @@ void ModPage::onModSelected() ui->packView->adjustSize(); } +static const QRegularExpression modrinth(QRegularExpression::anchoredPattern("(?:www\\.)?modrinth\\.com\\/mod\\/([^\\/]+)\\/?")); +static const QRegularExpression curseForge(QRegularExpression::anchoredPattern("(?:www\\.)?curseforge\\.com\\/minecraft\\/mc-mods\\/([^\\/]+)\\/?")); +static const QRegularExpression curseForgeOld(QRegularExpression::anchoredPattern("minecraft\\.curseforge\\.com\\/projects\\/([^\\/]+)\\/?")); + void ModPage::openUrl(const QUrl& url) { // do not allow other url schemes for security reasons @@ -255,19 +259,22 @@ void ModPage::openUrl(const QUrl& url) } // detect mod URLs and search instead - static const QRegularExpression modrinth(QRegularExpression::anchoredPattern("(?:www\\.)?modrinth\\.com\\/mod\\/([^\\/]+)\\/?")), - curseForge(QRegularExpression::anchoredPattern("(?:www\\.)?curseforge\\.com\\/minecraft\\/mc-mods\\/([^\\/]+)\\/?")), - curseForgeOld(QRegularExpression::anchoredPattern("minecraft\\.curseforge\\.com\\/projects\\/([^\\/]+)\\/?")); const QString address = url.host() + url.path(); QRegularExpressionMatch match; const char* page; - if ((match = modrinth.match(address)).hasMatch()) + match = modrinth.match(address); + if (match.hasMatch()) page = "modrinth"; - else if (APPLICATION->capabilities() & Application::SupportsFlame && - ((match = curseForge.match(address)).hasMatch() || (match = curseForgeOld.match(address)).hasMatch())) - page = "curseforge"; + else if (APPLICATION->capabilities() & Application::SupportsFlame) { + match = curseForge.match(address); + if (!match.hasMatch()) + match = curseForgeOld.match(address); + + if (match.hasMatch()) + page = "curseforge"; + } if (match.hasMatch()) { const QString slug = match.captured(1); From 2f10fa8b61dac5af5866e7ad8e72cf702f15a130 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 05:41:32 -0700 Subject: [PATCH 0194/1149] add some extra debug logs for CF blocked mods Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/modplatform/flame/FlameInstanceCreationTask.cpp | 1 + launcher/modplatform/modpacksch/FTBPackInstallTask.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index f86e9335d..f0fbdc965 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -399,6 +399,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) message_dialog->setModal(true); if (message_dialog->exec()) { + qDebug() << "Post dialog blocked mods list: " << blocked_mods; copyBlockedMods(blocked_mods); setupDownloadJob(loop); } else { diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 70ef75716..40aee82b1 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -216,7 +216,7 @@ void PackInstallTask::onResolveModsSucceeded() m_blocked_mods); if (message_dialog->exec() == QDialog::Accepted) { - qDebug() << "Post dialog mods list: " << m_blocked_mods; + qDebug() << "Post dialog blocked mods list: " << m_blocked_mods; createInstance(); } else { From bb8ac9b99a3ffe33d2d8cf8939c54940a66cc0d6 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 05:46:41 -0700 Subject: [PATCH 0195/1149] changed name of file type association Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- program_info/win_install.nsi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index 7bef0fafa..42a9e762a 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -313,7 +313,7 @@ SectionEnd !define APP_ICON "$INSTDIR\${APP_EXE},0" !define APP_DESCRIPTION "@Launcher_DisplayName@" !define APP_NAME "@Launcher_DisplayName@" -!define APP_CMD_TEXT "Prism Launcher instance" +!define APP_CMD_TEXT "Minecraft Modpack" !define REGISTER_DEFAULTPROGRAMS ; value doesn't matter From 5ee4fb3522ea2bb66ad49e1cdd91140b8d5c6a00 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 11 Nov 2022 15:02:08 +0100 Subject: [PATCH 0196/1149] feat: validate maximum memory allocation Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/global/JavaPage.cpp | 25 +++- launcher/ui/pages/global/JavaPage.h | 3 + launcher/ui/pages/global/JavaPage.ui | 54 ++++---- .../pages/instance/InstanceSettingsPage.cpp | 26 +++- .../ui/pages/instance/InstanceSettingsPage.h | 3 + .../ui/pages/instance/InstanceSettingsPage.ui | 119 ++++++++++-------- 6 files changed, 151 insertions(+), 79 deletions(-) diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 2cee15bf1..00c06cff9 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -58,9 +58,8 @@ JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage) ui->setupUi(this); ui->tabWidget->tabBar()->hide(); - auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; - ui->maxMemSpinBox->setMaximum(sysMiB); loadSettings(); + updateThresholds(); } JavaPage::~JavaPage() @@ -177,6 +176,11 @@ void JavaPage::on_javaTestBtn_clicked() checker->run(); } +void JavaPage::on_maxMemSpinBox_valueChanged(int i) +{ + updateThresholds(); +} + void JavaPage::checkerFinished() { checker.reset(); @@ -186,3 +190,20 @@ void JavaPage::retranslate() { ui->retranslateUi(this); } + +void JavaPage::updateThresholds() +{ + auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; + unsigned int maxMem = ui->maxMemSpinBox->value(); + + if (maxMem >= sysMiB) { + ui->labelMaxMemIcon->setText(u8"✘"); + ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); + } else if (maxMem > (sysMiB * 0.9)) { + ui->labelMaxMemIcon->setText(u8"⚠"); + ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); + } else { + ui->labelMaxMemIcon->setText(u8"✔"); + ui->labelMaxMemIcon->setToolTip(""); + } +} diff --git a/launcher/ui/pages/global/JavaPage.h b/launcher/ui/pages/global/JavaPage.h index 64d4098e5..2ef6d7493 100644 --- a/launcher/ui/pages/global/JavaPage.h +++ b/launcher/ui/pages/global/JavaPage.h @@ -76,6 +76,8 @@ public: bool apply() override; void retranslate() override; + void updateThresholds(); + private: void applySettings(); void loadSettings(); @@ -85,6 +87,7 @@ slots: void on_javaDetectBtn_clicked(); void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); + void on_maxMemSpinBox_valueChanged(int i); void checkerFinished(); private: diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 6ccffed4d..19e23eba9 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -44,8 +44,8 @@ Memory - - + + The maximum amount of memory Minecraft is allowed to use. @@ -67,27 +67,17 @@ - - + + - &Minimum memory allocation: + &PermGen: - minMemSpinBox + permGenSpinBox - - - - Ma&ximum memory allocation: - - - maxMemSpinBox - - - - + The amount of memory Minecraft is started with. @@ -109,17 +99,27 @@ - - + + - &PermGen: + Ma&ximum memory allocation: - permGenSpinBox + maxMemSpinBox - + + + + &Minimum memory allocation: + + + minMemSpinBox + + + + The amount of memory available to store loaded Java classes. @@ -141,6 +141,16 @@ + + + + + + + maxMemSpinBox + + + diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 5da7f19f5..50039e879 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -59,12 +59,12 @@ InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent) { m_settings = inst->settings(); ui->setupUi(this); - auto sysMB = Sys::getSystemRam() / Sys::mebibyte; - ui->maxMemSpinBox->setMaximum(sysMB); + connect(ui->openGlobalJavaSettingsButton, &QCommandLinkButton::clicked, this, &InstanceSettingsPage::globalSettingsButtonClicked); connect(APPLICATION, &Application::globalSettingsAboutToOpen, this, &InstanceSettingsPage::applySettings); connect(APPLICATION, &Application::globalSettingsClosed, this, &InstanceSettingsPage::loadSettings); loadSettings(); + updateThresholds(); } bool InstanceSettingsPage::shouldDisplay() const @@ -437,6 +437,11 @@ void InstanceSettingsPage::on_javaTestBtn_clicked() checker->run(); } +void InstanceSettingsPage::on_maxMemSpinBox_valueChanged(int i) +{ + updateThresholds(); +} + void InstanceSettingsPage::checkerFinished() { checker.reset(); @@ -447,3 +452,20 @@ void InstanceSettingsPage::retranslate() ui->retranslateUi(this); ui->customCommands->retranslate(); // TODO: why is this seperate from the others? } + +void InstanceSettingsPage::updateThresholds() +{ + auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; + unsigned int maxMem = ui->maxMemSpinBox->value(); + + if (maxMem >= sysMiB) { + ui->labelMaxMemIcon->setText(u8"✘"); + ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); + } else if (maxMem > (sysMiB * 0.9)) { + ui->labelMaxMemIcon->setText(u8"⚠"); + ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); + } else { + ui->labelMaxMemIcon->setText(u8"✔"); + ui->labelMaxMemIcon->setToolTip(""); + } +} diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.h b/launcher/ui/pages/instance/InstanceSettingsPage.h index 97d1296fe..7450188d5 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.h +++ b/launcher/ui/pages/instance/InstanceSettingsPage.h @@ -77,10 +77,13 @@ public: virtual bool shouldDisplay() const override; void retranslate() override; + void updateThresholds(); + private slots: void on_javaDetectBtn_clicked(); void on_javaTestBtn_clicked(); void on_javaBrowseBtn_clicked(); + void on_maxMemSpinBox_valueChanged(int i); void applySettings(); void loadSettings(); diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 8b3c33702..43488aa2c 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -112,59 +112,29 @@ false - - - + + + - Minimum memory allocation: + PermGen: - - - - The maximum amount of memory Minecraft is allowed to use. - - - MiB - - - 128 - - - 65536 - - - 128 - - - 1024 + + + + Maximum memory allocation: - - - - The amount of memory Minecraft is started with. - - - MiB - - - 128 - - - 65536 - - - 128 - - - 256 + + + + Note: Permgen is set automatically by Java 8 and later - + The amount of memory available to store loaded Java classes. @@ -186,24 +156,67 @@ - - - - PermGen: + + + + The maximum amount of memory Minecraft is allowed to use. + + + MiB + + + 128 + + + 65536 + + + 128 + + + 1024 - - + + - Maximum memory allocation: + Minimum memory allocation: - - + + + + The amount of memory Minecraft is started with. + + + MiB + + + 128 + + + 65536 + + + 128 + + + 256 + + + + + - Note: Permgen is set automatically by Java 8 and later + + + + Qt::AlignCenter + + + maxMemSpinBox From 863a168cb5cb7332ae9782c3967d563f7f98316d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 11 Nov 2022 15:04:18 +0100 Subject: [PATCH 0197/1149] feat: raise memory limits to 1TiB Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/global/JavaPage.ui | 4 ++-- launcher/ui/pages/instance/InstanceSettingsPage.ui | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 19e23eba9..734612375 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -57,7 +57,7 @@ 128 - 65536 + 1048576 128 @@ -89,7 +89,7 @@ 128 - 65536 + 1048576 128 diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 43488aa2c..2063dc559 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -168,7 +168,7 @@ 128 - 65536 + 1048576 128 @@ -197,7 +197,7 @@ 128 - 65536 + 1048576 128 From cabd887866929103f635a2640589ce95570f8573 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 11 Nov 2022 15:22:16 +0100 Subject: [PATCH 0198/1149] feat: use icons to show memory allocation state Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/global/JavaPage.cpp | 15 ++++++++++++--- .../ui/pages/instance/InstanceSettingsPage.cpp | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/launcher/ui/pages/global/JavaPage.cpp b/launcher/ui/pages/global/JavaPage.cpp index 00c06cff9..81dd4cc12 100644 --- a/launcher/ui/pages/global/JavaPage.cpp +++ b/launcher/ui/pages/global/JavaPage.cpp @@ -196,14 +196,23 @@ void JavaPage::updateThresholds() auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; unsigned int maxMem = ui->maxMemSpinBox->value(); + QString iconName; + if (maxMem >= sysMiB) { - ui->labelMaxMemIcon->setText(u8"✘"); + iconName = "status-bad"; ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); } else if (maxMem > (sysMiB * 0.9)) { - ui->labelMaxMemIcon->setText(u8"⚠"); + iconName = "status-yellow"; ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); } else { - ui->labelMaxMemIcon->setText(u8"✔"); + iconName = "status-good"; ui->labelMaxMemIcon->setToolTip(""); } + + { + auto height = ui->labelMaxMemIcon->fontInfo().pixelSize(); + QIcon icon = APPLICATION->getThemedIcon(iconName); + QPixmap pix = icon.pixmap(height, height); + ui->labelMaxMemIcon->setPixmap(pix); + } } diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.cpp b/launcher/ui/pages/instance/InstanceSettingsPage.cpp index 50039e879..af2ba7c80 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.cpp +++ b/launcher/ui/pages/instance/InstanceSettingsPage.cpp @@ -458,14 +458,23 @@ void InstanceSettingsPage::updateThresholds() auto sysMiB = Sys::getSystemRam() / Sys::mebibyte; unsigned int maxMem = ui->maxMemSpinBox->value(); + QString iconName; + if (maxMem >= sysMiB) { - ui->labelMaxMemIcon->setText(u8"✘"); + iconName = "status-bad"; ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); } else if (maxMem > (sysMiB * 0.9)) { - ui->labelMaxMemIcon->setText(u8"⚠"); + iconName = "status-yellow"; ui->labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); } else { - ui->labelMaxMemIcon->setText(u8"✔"); + iconName = "status-good"; ui->labelMaxMemIcon->setToolTip(""); } + + { + auto height = ui->labelMaxMemIcon->fontInfo().pixelSize(); + QIcon icon = APPLICATION->getThemedIcon(iconName); + QPixmap pix = icon.pixmap(height, height); + ui->labelMaxMemIcon->setPixmap(pix); + } } From b57fee1a444bef22f6a0f8f268dc1d11be31a0db Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 11 Nov 2022 15:24:14 +0100 Subject: [PATCH 0199/1149] fix: swap spin box and state icon Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/global/JavaPage.ui | 68 +++++------ .../ui/pages/instance/InstanceSettingsPage.ui | 106 +++++++++--------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/launcher/ui/pages/global/JavaPage.ui b/launcher/ui/pages/global/JavaPage.ui index 734612375..6749cbe41 100644 --- a/launcher/ui/pages/global/JavaPage.ui +++ b/launcher/ui/pages/global/JavaPage.ui @@ -44,26 +44,14 @@ Memory - - - - - The maximum amount of memory Minecraft is allowed to use. + + + + + Ma&ximum memory allocation: - - MiB - - - 128 - - - 1048576 - - - 128 - - - 1024 + + maxMemSpinBox @@ -77,6 +65,16 @@ + + + + &Minimum memory allocation: + + + minMemSpinBox + + + @@ -99,23 +97,25 @@ - - - - Ma&ximum memory allocation: + + + + The maximum amount of memory Minecraft is allowed to use. - - maxMemSpinBox + + MiB - - - - - - &Minimum memory allocation: + + 128 - - minMemSpinBox + + 1048576 + + + 128 + + + 1024 @@ -141,7 +141,7 @@ - + diff --git a/launcher/ui/pages/instance/InstanceSettingsPage.ui b/launcher/ui/pages/instance/InstanceSettingsPage.ui index 2063dc559..b064367d1 100644 --- a/launcher/ui/pages/instance/InstanceSettingsPage.ui +++ b/launcher/ui/pages/instance/InstanceSettingsPage.ui @@ -112,7 +112,7 @@ false - + @@ -120,6 +120,13 @@ + + + + Minimum memory allocation: + + + @@ -134,57 +141,6 @@ - - - - The amount of memory available to store loaded Java classes. - - - MiB - - - 64 - - - 999999999 - - - 8 - - - 64 - - - - - - - The maximum amount of memory Minecraft is allowed to use. - - - MiB - - - 128 - - - 1048576 - - - 128 - - - 1024 - - - - - - - Minimum memory allocation: - - - @@ -207,7 +163,51 @@ - + + + + The maximum amount of memory Minecraft is allowed to use. + + + MiB + + + 128 + + + 1048576 + + + 128 + + + 1024 + + + + + + + The amount of memory available to store loaded Java classes. + + + MiB + + + 64 + + + 999999999 + + + 8 + + + 64 + + + + From 5909af9878d67f2900c92e8d1dd3eec7a53a840a Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 14:10:45 -0700 Subject: [PATCH 0200/1149] drag&drop + add folder to watch Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../flame/FlameInstanceCreationTask.cpp | 8 +- .../modpacksch/FTBPackInstallTask.cpp | 6 +- launcher/ui/dialogs/BlockedModsDialog.cpp | 82 +++++++++++++++++-- launcher/ui/dialogs/BlockedModsDialog.h | 8 ++ 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index f0fbdc965..eff729ebf 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -393,8 +393,12 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) qWarning() << "Blocked mods found, displaying mod list"; auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked mods found"), - tr("The following mods were blocked on third party launchers.
" - "You will need to manually download them and add them to the modpack"), + tr("The following files are not available for download in third party launchers.
" + "You will need to manually download them and add them to the instance.

" + "Your configured global mods folder and default downloads folder
" + "are automatically checked for the downloaded mods.
" + "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" + "if you did not download the mods to a default location."), blocked_mods); message_dialog->setModal(true); diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 40aee82b1..d74faf08f 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -212,7 +212,11 @@ void PackInstallTask::onResolveModsSucceeded() auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"), tr("The following files are not available for download in third party launchers.
" - "You will need to manually download them and add them to the instance."), + "You will need to manually download them and add them to the instance.

" + "Your configured global mods folder and default downloads folder
" + "are automatically checked for the downloaded mods.
" + "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" + "if you did not download the mods to a default location."), m_blocked_mods); if (message_dialog->exec() == QDialog::Accepted) { diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 2cf942500..ca757cbca 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -5,20 +5,29 @@ #include "Application.h" #include "ui_BlockedModsDialog.h" + #include #include +#include +#include +#include BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList& mods) : QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) { + hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); + ui->setupUi(this); auto openAllButton = ui->buttonBox->addButton(tr("Open All"), QDialogButtonBox::ActionRole); connect(openAllButton, &QPushButton::clicked, this, &BlockedModsDialog::openAll); + auto downloadFolderButton = ui->buttonBox->addButton(tr("Add Download Folder"), QDialogButtonBox::ActionRole); + connect(downloadFolderButton, &QPushButton::clicked, this, &BlockedModsDialog::addDownloadFolder); + connect(&watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); - hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); + qDebug() << "Mods List: " << mods; @@ -28,6 +37,9 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons this->setWindowTitle(title); ui->label->setText(text); ui->labelModsFound->setText(tr("Please download the missing mods.")); + + setAcceptDrops(true); + update(); } @@ -36,6 +48,22 @@ BlockedModsDialog::~BlockedModsDialog() delete ui; } +void BlockedModsDialog::dragEnterEvent(QDragEnterEvent *e) { + if (e->mimeData()->hasUrls()) { + e->acceptProposedAction(); + } +} + +void BlockedModsDialog::dropEvent(QDropEvent *e) +{ + foreach (const QUrl &url, e->mimeData()->urls()) { + QString file = url.toLocalFile(); + qDebug() << "Dropped file:" << file; + addHashTask(file); + } + hashing_task->start(); +} + void BlockedModsDialog::openAll() { for (auto& mod : mods) { @@ -43,6 +71,16 @@ void BlockedModsDialog::openAll() } } +void BlockedModsDialog::addDownloadFolder() { + QString dir = QFileDialog::getExistingDirectory( + this, + tr("Select directory where you downloaded the mods"), + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation), + QFileDialog::ShowDirsOnly); + watcher.addPath(dir); + scanPath(dir); +} + /// @brief update UI with current status of the blocked mod detection void BlockedModsDialog::update() { @@ -74,6 +112,7 @@ void BlockedModsDialog::update() void BlockedModsDialog::directoryChanged(QString path) { qDebug() << "Directory changed: " << path; + validateMatchedMods(); scanPath(path); } @@ -108,19 +147,26 @@ void BlockedModsDialog::scanPath(QString path) continue; } - auto hash_task = Hashing::createBlockedModHasher(file, ModPlatform::Provider::FLAME, "sha1"); - - qDebug() << "Creating Hash task for path: " << file; - - connect(hash_task.get(), &Task::succeeded, [this, hash_task, file] { checkMatchHash(hash_task->getResult(), file); }); - connect(hash_task.get(), &Task::failed, [file] { qDebug() << "Failed to hash path: " << file; }); - - hashing_task->addTask(hash_task); + addHashTask(file); } hashing_task->start(); } +/// @brief add a hashing task for the file located at path and connect it to check that hash against +/// our blocked mods list +/// @param path the path to the local file being hashed +void BlockedModsDialog::addHashTask(QString path) { + auto hash_task = Hashing::createBlockedModHasher(path, ModPlatform::Provider::FLAME, "sha1"); + + qDebug() << "Creating Hash task for path: " << path; + + connect(hash_task.get(), &Task::succeeded, [this, hash_task, path] { checkMatchHash(hash_task->getResult(), path); }); + connect(hash_task.get(), &Task::failed, [path] { qDebug() << "Failed to hash path: " << path; }); + + hashing_task->addTask(hash_task); +} + /// @brief check if the computed hash for the provided path matches a blocked /// mod we are looking for /// @param hash the computed hash for the provided path @@ -174,6 +220,24 @@ bool BlockedModsDialog::allModsMatched() return std::all_of(mods.begin(), mods.end(), [](auto const& mod) { return mod.matched; }); } +/// @brief ensure matched file paths still exist +void BlockedModsDialog::validateMatchedMods() { + bool changed = false; + for (auto& mod : mods) { + if (mod.matched) { + QFileInfo file = QFileInfo(mod.localPath); + if (!file.exists() || !file.isFile()) { + mod.localPath = ""; + mod.matched = false; + changed = true; + } + } + } + if (changed) { + update(); + } +} + /// qDebug print support for the BlockedMod struct QDebug operator<<(QDebug debug, const BlockedMod& m) { diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index 0a5c90db0..d683c54db 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -31,6 +31,11 @@ public: ~BlockedModsDialog() override; +protected: + void dragEnterEvent(QDragEnterEvent *event) override; + // void dragMoveEvent(QDragMoveEvent *event) override; + // void dragLeaveEvent(QDragLeaveEvent *event) override; + void dropEvent(QDropEvent *event) override; private: Ui::BlockedModsDialog *ui; @@ -39,12 +44,15 @@ private: shared_qobject_ptr hashing_task; void openAll(); + void addDownloadFolder(); void update(); void directoryChanged(QString path); void setupWatch(); void scanPaths(); void scanPath(QString path); + void addHashTask(QString path); void checkMatchHash(QString hash, QString path); + void validateMatchedMods(); bool checkValidPath(QString path); bool allModsMatched(); From 3f6cc178188a28e551755219bfa0a441ad8cfdcf Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 15:45:40 -0700 Subject: [PATCH 0201/1149] properly handle a currently running hashing task Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../flame/FlameInstanceCreationTask.cpp | 2 +- .../modpacksch/FTBPackInstallTask.cpp | 2 +- launcher/ui/dialogs/BlockedModsDialog.cpp | 113 +++++++++++++----- launcher/ui/dialogs/BlockedModsDialog.h | 13 +- 4 files changed, 94 insertions(+), 36 deletions(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index eff729ebf..4b9e7b860 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -396,7 +396,7 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) tr("The following files are not available for download in third party launchers.
" "You will need to manually download them and add them to the instance.

" "Your configured global mods folder and default downloads folder
" - "are automatically checked for the downloaded mods.
" + "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" "if you did not download the mods to a default location."), blocked_mods); diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index d74faf08f..26d0c5a1b 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -214,7 +214,7 @@ void PackInstallTask::onResolveModsSucceeded() tr("The following files are not available for download in third party launchers.
" "You will need to manually download them and add them to the instance.

" "Your configured global mods folder and default downloads folder
" - "are automatically checked for the downloaded mods.
" + "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" "if you did not download the mods to a default location."), m_blocked_mods); diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index ca757cbca..a1941cb87 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,4 +1,5 @@ #include "BlockedModsDialog.h" +#include #include #include #include @@ -13,9 +14,10 @@ #include BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList& mods) - : QDialog(parent), ui(new Ui::BlockedModsDialog), mods(mods) + : QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods) { - hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); + m_hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); + connect(m_hashing_task.get(), &Task::finished, this, &BlockedModsDialog::hashTaskFinished); ui->setupUi(this); @@ -25,11 +27,11 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons auto downloadFolderButton = ui->buttonBox->addButton(tr("Add Download Folder"), QDialogButtonBox::ActionRole); connect(downloadFolderButton, &QPushButton::clicked, this, &BlockedModsDialog::addDownloadFolder); - connect(&watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); + connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); - qDebug() << "Mods List: " << mods; + qDebug() << "[Blocked Mods Dialog] Mods List: " << mods; setupWatch(); scanPaths(); @@ -57,16 +59,23 @@ void BlockedModsDialog::dragEnterEvent(QDragEnterEvent *e) { void BlockedModsDialog::dropEvent(QDropEvent *e) { foreach (const QUrl &url, e->mimeData()->urls()) { - QString file = url.toLocalFile(); - qDebug() << "Dropped file:" << file; - addHashTask(file); + QString filePath = url.toLocalFile(); + qDebug() << "[Blocked Mods Dialog] Dropped file:" << filePath; + addHashTask(filePath); + + // watch for changes + QFileInfo file = QFileInfo(filePath); + QString path = file.dir().absolutePath(); + qDebug() << "[Blocked Mods Dialog] Adding watch path:" << path; + m_watcher.addPath(path); } - hashing_task->start(); + scanPaths(); + update(); } void BlockedModsDialog::openAll() { - for (auto& mod : mods) { + for (auto& mod : m_mods) { QDesktopServices::openUrl(mod.websiteUrl); } } @@ -77,8 +86,10 @@ void BlockedModsDialog::addDownloadFolder() { tr("Select directory where you downloaded the mods"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation), QFileDialog::ShowDirsOnly); - watcher.addPath(dir); - scanPath(dir); + qDebug() << "[Blocked Mods Dialog] Adding watch path:" << dir; + m_watcher.addPath(dir); + scanPath(dir, true); + update(); } /// @brief update UI with current status of the blocked mod detection @@ -87,7 +98,7 @@ void BlockedModsDialog::update() QString text; QString span; - for (auto& mod : mods) { + for (auto& mod : m_mods) { if (mod.matched) { // ✔ -> html for HEAVY CHECK MARK : ✔ span = QString(tr(" ✔ Found at %1 ")).arg(mod.localPath); @@ -111,9 +122,9 @@ void BlockedModsDialog::update() /// @param path the path to the changed directory void BlockedModsDialog::directoryChanged(QString path) { - qDebug() << "Directory changed: " << path; + qDebug() << "[Blocked Mods Dialog] Directory changed: " << path; validateMatchedMods(); - scanPath(path); + scanPath(path, true); } /// @brief add the user downloads folder and the global mods folder to the filesystem watcher @@ -121,22 +132,23 @@ void BlockedModsDialog::setupWatch() { const QString downloadsFolder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); const QString modsFolder = APPLICATION->settings()->get("CentralModsDir").toString(); - watcher.addPath(downloadsFolder); - watcher.addPath(modsFolder); + m_watcher.addPath(downloadsFolder); + m_watcher.addPath(modsFolder); } /// @brief scan all watched folder void BlockedModsDialog::scanPaths() { - for (auto& dir : watcher.directories()) { - scanPath(dir); + for (auto& dir : m_watcher.directories()) { + scanPath(dir, false); } + runHashTask(); } /// @brief Scan the directory at path, skip paths that do not contain a file name /// of a blocked mod we are looking for /// @param path the directory to scan -void BlockedModsDialog::scanPath(QString path) +void BlockedModsDialog::scanPath(QString path, bool start_task) { QDir scan_dir(path); QDirIterator scan_it(path, QDir::Filter::Files | QDir::Filter::Hidden, QDirIterator::NoIteratorFlags); @@ -150,21 +162,35 @@ void BlockedModsDialog::scanPath(QString path) addHashTask(file); } - hashing_task->start(); + if (start_task) { + runHashTask(); + } + +} + +/// @brief add a hashing task for the file located at path, add the path to the pending set if the hasing task is already running +/// @param path the path to the local file being hashed +void BlockedModsDialog::addHashTask(QString path) { + if (m_hashing_task->isRunning()) { + qDebug() << "[Blocked Mods Dialog] adding a Hash task for" << path << "to the pending set."; + m_pending_hash_paths.insert(path); + } else { + buildHashTask(path); + } } /// @brief add a hashing task for the file located at path and connect it to check that hash against /// our blocked mods list /// @param path the path to the local file being hashed -void BlockedModsDialog::addHashTask(QString path) { +void BlockedModsDialog::buildHashTask(QString path) { auto hash_task = Hashing::createBlockedModHasher(path, ModPlatform::Provider::FLAME, "sha1"); - qDebug() << "Creating Hash task for path: " << path; + qDebug() << "[Blocked Mods Dialog] Creating Hash task for path: " << path; connect(hash_task.get(), &Task::succeeded, [this, hash_task, path] { checkMatchHash(hash_task->getResult(), path); }); connect(hash_task.get(), &Task::failed, [path] { qDebug() << "Failed to hash path: " << path; }); - hashing_task->addTask(hash_task); + m_hashing_task->addTask(hash_task); } /// @brief check if the computed hash for the provided path matches a blocked @@ -175,9 +201,9 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) { bool match = false; - qDebug() << "Checking for match on hash: " << hash << "| From path:" << path; + qDebug() << "[Blocked Mods Dialog] Checking for match on hash: " << hash << "| From path:" << path; - for (auto& mod : mods) { + for (auto& mod : m_mods) { if (mod.matched) { continue; } @@ -186,7 +212,7 @@ void BlockedModsDialog::checkMatchHash(QString hash, QString path) mod.localPath = path; match = true; - qDebug() << "Hash match found:" << mod.name << hash << "| From path:" << path; + qDebug() << "[Blocked Mods Dialog] Hash match found:" << mod.name << hash << "| From path:" << path; break; } @@ -205,9 +231,9 @@ bool BlockedModsDialog::checkValidPath(QString path) QFileInfo file = QFileInfo(path); QString filename = file.fileName(); - for (auto& mod : mods) { + for (auto& mod : m_mods) { if (mod.name.compare(filename, Qt::CaseInsensitive) == 0) { - qDebug() << "Name match found:" << mod.name << "| From path:" << path; + qDebug() << "[Blocked Mods Dialog] Name match found:" << mod.name << "| From path:" << path; return true; } } @@ -217,13 +243,13 @@ bool BlockedModsDialog::checkValidPath(QString path) bool BlockedModsDialog::allModsMatched() { - return std::all_of(mods.begin(), mods.end(), [](auto const& mod) { return mod.matched; }); + return std::all_of(m_mods.begin(), m_mods.end(), [](auto const& mod) { return mod.matched; }); } /// @brief ensure matched file paths still exist void BlockedModsDialog::validateMatchedMods() { bool changed = false; - for (auto& mod : mods) { + for (auto& mod : m_mods) { if (mod.matched) { QFileInfo file = QFileInfo(mod.localPath); if (!file.exists() || !file.isFile()) { @@ -238,6 +264,33 @@ void BlockedModsDialog::validateMatchedMods() { } } +/// @brief run hast task or mark a pending run if it is already runing +void BlockedModsDialog::runHashTask() { + if (!m_hashing_task->isRunning()) { + m_rehash_pending = false; + m_hashing_task->start(); + } else { + qDebug() << "[Blocked Mods Dialog] queueing another run of the hashing task"; + qDebug() << "[Blocked Mods Dialog] pending hash tasks:" << m_pending_hash_paths; + m_rehash_pending = true; + } +} + +void BlockedModsDialog::hashTaskFinished() { + qDebug() << "[Blocked Mods Dialog] All hash tasks finished"; + if (m_rehash_pending) { + qDebug() << "[Blocked Mods Dialog] there was a pending rehash, building and running tasks"; + + auto path = m_pending_hash_paths.begin(); + while (path != m_pending_hash_paths.end()) { + buildHashTask(*path); + path = m_pending_hash_paths.erase(path); + } + + runHashTask(); + } +} + /// qDebug print support for the BlockedMod struct QDebug operator<<(QDebug debug, const BlockedMod& m) { diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index d683c54db..ee1e6a095 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -39,9 +39,11 @@ protected: private: Ui::BlockedModsDialog *ui; - QList &mods; - QFileSystemWatcher watcher; - shared_qobject_ptr hashing_task; + QList &m_mods; + QFileSystemWatcher m_watcher; + shared_qobject_ptr m_hashing_task; + QSet m_pending_hash_paths; + bool m_rehash_pending; void openAll(); void addDownloadFolder(); @@ -49,10 +51,13 @@ private: void directoryChanged(QString path); void setupWatch(); void scanPaths(); - void scanPath(QString path); + void scanPath(QString path, bool start_task); void addHashTask(QString path); + void buildHashTask(QString path); void checkMatchHash(QString hash, QString path); void validateMatchedMods(); + void runHashTask(); + void hashTaskFinished(); bool checkValidPath(QString path); bool allModsMatched(); From b9e2c3524ce39769396d1b4d6a2bf1b50a9f0996 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:07:57 -0700 Subject: [PATCH 0202/1149] chore: clang format & cleanup Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/BlockedModsDialog.cpp | 45 ++++++++++++----------- launcher/ui/dialogs/BlockedModsDialog.h | 2 - 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index a1941cb87..04d37963e 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -6,19 +6,18 @@ #include "Application.h" #include "ui_BlockedModsDialog.h" - #include -#include #include #include #include +#include BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList& mods) : QDialog(parent), ui(new Ui::BlockedModsDialog), m_mods(mods) { m_hashing_task = shared_qobject_ptr(new ConcurrentTask(this, "MakeHashesTask", 10)); connect(m_hashing_task.get(), &Task::finished, this, &BlockedModsDialog::hashTaskFinished); - + ui->setupUi(this); auto openAllButton = ui->buttonBox->addButton(tr("Open All"), QDialogButtonBox::ActionRole); @@ -29,8 +28,6 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &BlockedModsDialog::directoryChanged); - - qDebug() << "[Blocked Mods Dialog] Mods List: " << mods; setupWatch(); @@ -50,15 +47,16 @@ BlockedModsDialog::~BlockedModsDialog() delete ui; } -void BlockedModsDialog::dragEnterEvent(QDragEnterEvent *e) { +void BlockedModsDialog::dragEnterEvent(QDragEnterEvent* e) +{ if (e->mimeData()->hasUrls()) { e->acceptProposedAction(); } } -void BlockedModsDialog::dropEvent(QDropEvent *e) +void BlockedModsDialog::dropEvent(QDropEvent* e) { - foreach (const QUrl &url, e->mimeData()->urls()) { + foreach (const QUrl& url, e->mimeData()->urls()) { QString filePath = url.toLocalFile(); qDebug() << "[Blocked Mods Dialog] Dropped file:" << filePath; addHashTask(filePath); @@ -80,12 +78,11 @@ void BlockedModsDialog::openAll() } } -void BlockedModsDialog::addDownloadFolder() { - QString dir = QFileDialog::getExistingDirectory( - this, - tr("Select directory where you downloaded the mods"), - QStandardPaths::writableLocation(QStandardPaths::DownloadLocation), - QFileDialog::ShowDirsOnly); +void BlockedModsDialog::addDownloadFolder() +{ + QString dir = + QFileDialog::getExistingDirectory(this, tr("Select directory where you downloaded the mods"), + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation), QFileDialog::ShowDirsOnly); qDebug() << "[Blocked Mods Dialog] Adding watch path:" << dir; m_watcher.addPath(dir); scanPath(dir, true); @@ -165,12 +162,12 @@ void BlockedModsDialog::scanPath(QString path, bool start_task) if (start_task) { runHashTask(); } - } /// @brief add a hashing task for the file located at path, add the path to the pending set if the hasing task is already running /// @param path the path to the local file being hashed -void BlockedModsDialog::addHashTask(QString path) { +void BlockedModsDialog::addHashTask(QString path) +{ if (m_hashing_task->isRunning()) { qDebug() << "[Blocked Mods Dialog] adding a Hash task for" << path << "to the pending set."; m_pending_hash_paths.insert(path); @@ -179,10 +176,11 @@ void BlockedModsDialog::addHashTask(QString path) { } } -/// @brief add a hashing task for the file located at path and connect it to check that hash against +/// @brief add a hashing task for the file located at path and connect it to check that hash against /// our blocked mods list /// @param path the path to the local file being hashed -void BlockedModsDialog::buildHashTask(QString path) { +void BlockedModsDialog::buildHashTask(QString path) +{ auto hash_task = Hashing::createBlockedModHasher(path, ModPlatform::Provider::FLAME, "sha1"); qDebug() << "[Blocked Mods Dialog] Creating Hash task for path: " << path; @@ -247,7 +245,8 @@ bool BlockedModsDialog::allModsMatched() } /// @brief ensure matched file paths still exist -void BlockedModsDialog::validateMatchedMods() { +void BlockedModsDialog::validateMatchedMods() +{ bool changed = false; for (auto& mod : m_mods) { if (mod.matched) { @@ -264,8 +263,9 @@ void BlockedModsDialog::validateMatchedMods() { } } -/// @brief run hast task or mark a pending run if it is already runing -void BlockedModsDialog::runHashTask() { +/// @brief run hash task or mark a pending run if it is already runing +void BlockedModsDialog::runHashTask() +{ if (!m_hashing_task->isRunning()) { m_rehash_pending = false; m_hashing_task->start(); @@ -276,7 +276,8 @@ void BlockedModsDialog::runHashTask() { } } -void BlockedModsDialog::hashTaskFinished() { +void BlockedModsDialog::hashTaskFinished() +{ qDebug() << "[Blocked Mods Dialog] All hash tasks finished"; if (m_rehash_pending) { qDebug() << "[Blocked Mods Dialog] there was a pending rehash, building and running tasks"; diff --git a/launcher/ui/dialogs/BlockedModsDialog.h b/launcher/ui/dialogs/BlockedModsDialog.h index ee1e6a095..dac43cbad 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.h +++ b/launcher/ui/dialogs/BlockedModsDialog.h @@ -33,8 +33,6 @@ public: protected: void dragEnterEvent(QDragEnterEvent *event) override; - // void dragMoveEvent(QDragMoveEvent *event) override; - // void dragLeaveEvent(QDragLeaveEvent *event) override; void dropEvent(QDropEvent *event) override; private: From 51c27e2748cca3d772cdd9656325b748a819f3c9 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:33:52 -0700 Subject: [PATCH 0203/1149] always use the pending path set to avoid task duplication. Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/BlockedModsDialog.cpp | 32 ++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 04d37963e..ff3316174 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -168,12 +168,8 @@ void BlockedModsDialog::scanPath(QString path, bool start_task) /// @param path the path to the local file being hashed void BlockedModsDialog::addHashTask(QString path) { - if (m_hashing_task->isRunning()) { - qDebug() << "[Blocked Mods Dialog] adding a Hash task for" << path << "to the pending set."; - m_pending_hash_paths.insert(path); - } else { - buildHashTask(path); - } + qDebug() << "[Blocked Mods Dialog] adding a Hash task for" << path << "to the pending set."; + m_pending_hash_paths.insert(path); } /// @brief add a hashing task for the file located at path and connect it to check that hash against @@ -252,6 +248,8 @@ void BlockedModsDialog::validateMatchedMods() if (mod.matched) { QFileInfo file = QFileInfo(mod.localPath); if (!file.exists() || !file.isFile()) { + qDebug() << "[Blocked Mods Dialog] File" << mod.localPath << "for mod" << mod.name + << "has vanshed! marking as not matched."; mod.localPath = ""; mod.matched = false; changed = true; @@ -268,7 +266,18 @@ void BlockedModsDialog::runHashTask() { if (!m_hashing_task->isRunning()) { m_rehash_pending = false; - m_hashing_task->start(); + + if (!m_pending_hash_paths.isEmpty()) { + qDebug() << "[Blocked Mods Dialog] there are pending hash tasks, building and running tasks"; + + auto path = m_pending_hash_paths.begin(); + while (path != m_pending_hash_paths.end()) { + buildHashTask(*path); + path = m_pending_hash_paths.erase(path); + } + + m_hashing_task->start(); + } } else { qDebug() << "[Blocked Mods Dialog] queueing another run of the hashing task"; qDebug() << "[Blocked Mods Dialog] pending hash tasks:" << m_pending_hash_paths; @@ -280,14 +289,7 @@ void BlockedModsDialog::hashTaskFinished() { qDebug() << "[Blocked Mods Dialog] All hash tasks finished"; if (m_rehash_pending) { - qDebug() << "[Blocked Mods Dialog] there was a pending rehash, building and running tasks"; - - auto path = m_pending_hash_paths.begin(); - while (path != m_pending_hash_paths.end()) { - buildHashTask(*path); - path = m_pending_hash_paths.erase(path); - } - + qDebug() << "[Blocked Mods Dialog] task finished with a rehash pending, rerunning"; runHashTask(); } } From 9af1b00df52d974a53925345efcd5c047b7d041c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 18:05:19 -0700 Subject: [PATCH 0204/1149] feat: add list of watched folders move explanation text into dialog class and it's own label Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .../flame/FlameInstanceCreationTask.cpp | 11 ++-- .../modpacksch/FTBPackInstallTask.cpp | 15 ++--- launcher/ui/dialogs/BlockedModsDialog.cpp | 27 +++++++-- launcher/ui/dialogs/BlockedModsDialog.ui | 58 ++++++++++++++++++- 4 files changed, 86 insertions(+), 25 deletions(-) diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 4b9e7b860..91554b587 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -393,13 +393,10 @@ void FlameCreationTask::idResolverSucceeded(QEventLoop& loop) qWarning() << "Blocked mods found, displaying mod list"; auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked mods found"), - tr("The following files are not available for download in third party launchers.
" - "You will need to manually download them and add them to the instance.

" - "Your configured global mods folder and default downloads folder
" - "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" - "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" - "if you did not download the mods to a default location."), - blocked_mods); + tr("The following files are not available for download in third party launchers.
" + "You will need to manually download them and add them to the instance."), + blocked_mods); + message_dialog->setModal(true); if (message_dialog->exec()) { diff --git a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp index 26d0c5a1b..4c7b7a4fe 100644 --- a/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp +++ b/launcher/modplatform/modpacksch/FTBPackInstallTask.cpp @@ -211,22 +211,17 @@ void PackInstallTask::onResolveModsSucceeded() qDebug() << "Blocked files found, displaying file list"; auto message_dialog = new BlockedModsDialog(m_parent, tr("Blocked files found"), - tr("The following files are not available for download in third party launchers.
" - "You will need to manually download them and add them to the instance.

" - "Your configured global mods folder and default downloads folder
" - "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" - "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch
" - "if you did not download the mods to a default location."), - m_blocked_mods); + tr("The following files are not available for download in third party launchers.
" + "You will need to manually download them and add them to the instance."), + m_blocked_mods); if (message_dialog->exec() == QDialog::Accepted) { qDebug() << "Post dialog blocked mods list: " << m_blocked_mods; createInstance(); - } - else { + } else { abort(); } - + } else { createInstance(); } diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index ff3316174..7f6b377b1 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,5 +1,4 @@ #include "BlockedModsDialog.h" -#include #include #include #include @@ -34,7 +33,16 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons scanPaths(); this->setWindowTitle(title); - ui->label->setText(text); + ui->labelDescription->setText(text); + ui->labelExplain->setText( + QString(tr("Your configured global mods folder and default downloads folder " + "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" + "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch " + "if you did not download the mods to a default location.

" + "Global Mods Folder: %1
" + "Default Downloads Folder: %2")) + .arg(APPLICATION->settings()->get("CentralModsDir").toString(), + QStandardPaths::writableLocation(QStandardPaths::DownloadLocation))); ui->labelModsFound->setText(tr("Please download the missing mods.")); setAcceptDrops(true); @@ -56,7 +64,7 @@ void BlockedModsDialog::dragEnterEvent(QDragEnterEvent* e) void BlockedModsDialog::dropEvent(QDropEvent* e) { - foreach (const QUrl& url, e->mimeData()->urls()) { + for (const QUrl& url : e->mimeData()->urls()) { QString filePath = url.toLocalFile(); qDebug() << "[Blocked Mods Dialog] Dropped file:" << filePath; addHashTask(filePath); @@ -106,7 +114,14 @@ void BlockedModsDialog::update() text += QString(tr("%1: %2

Hash: %3 %4


")).arg(mod.name, mod.websiteUrl, mod.hash, span); } - ui->textBrowser->setText(text); + ui->textBrowserModsListing->setText(text); + + QString watching; + for (auto& dir : m_watcher.directories()) { + watching += QString("%1
").arg(dir); + } + + ui->textBrowserWatched->setText(watching); if (allModsMatched()) { ui->labelModsFound->setText(tr("All mods found ✔")); @@ -181,8 +196,8 @@ void BlockedModsDialog::buildHashTask(QString path) qDebug() << "[Blocked Mods Dialog] Creating Hash task for path: " << path; - connect(hash_task.get(), &Task::succeeded, [this, hash_task, path] { checkMatchHash(hash_task->getResult(), path); }); - connect(hash_task.get(), &Task::failed, [path] { qDebug() << "Failed to hash path: " << path; }); + connect(hash_task.get(), &Task::succeeded, this, [this, hash_task, path] { checkMatchHash(hash_task->getResult(), path); }); + connect(hash_task.get(), &Task::failed, this, [path] { qDebug() << "Failed to hash path: " << path; }); m_hashing_task->addTask(hash_task); } diff --git a/launcher/ui/dialogs/BlockedModsDialog.ui b/launcher/ui/dialogs/BlockedModsDialog.ui index 371549cf4..fb1036b77 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.ui +++ b/launcher/ui/dialogs/BlockedModsDialog.ui @@ -15,17 +15,36 @@ - + Qt::RichText + + true + - + + + + + + true + + + + + + + + 0 + 165 + + true @@ -34,6 +53,41 @@ + + + + + 0 + 1 + + + + Watched Folders: + + + + + + + + 0 + 0 + + + + + 0 + 16 + + + + + 0 + 12 + + + + From 25b306b7e1c83ecdeb135c8100c3089d9147cde7 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Fri, 11 Nov 2022 18:32:11 -0700 Subject: [PATCH 0205/1149] feat: mark folder paths as links Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/BlockedModsDialog.cpp | 9 ++++++--- launcher/ui/dialogs/BlockedModsDialog.ui | 9 +++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index 7f6b377b1..a0dd1a103 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -39,12 +39,15 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch " "if you did not download the mods to a default location.

" - "Global Mods Folder: %1
" - "Default Downloads Folder: %2")) + "Global Mods Folder: %1
" + "Default Downloads Folder: %2")) .arg(APPLICATION->settings()->get("CentralModsDir").toString(), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation))); ui->labelModsFound->setText(tr("Please download the missing mods.")); + // force all URL handeling as external + connect(ui->textBrowserWatched, &QTextBrowser::anchorClicked, this, [](const QUrl url) { QDesktopServices::openUrl(url); }); + setAcceptDrops(true); update(); @@ -118,7 +121,7 @@ void BlockedModsDialog::update() QString watching; for (auto& dir : m_watcher.directories()) { - watching += QString("%1
").arg(dir); + watching += QString("%1
").arg(dir); } ui->textBrowserWatched->setText(watching); diff --git a/launcher/ui/dialogs/BlockedModsDialog.ui b/launcher/ui/dialogs/BlockedModsDialog.ui index fb1036b77..88105178b 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.ui +++ b/launcher/ui/dialogs/BlockedModsDialog.ui @@ -35,6 +35,9 @@ true + + true +

5njbxIHz?DEZJV~-UdQmidv~$%Ow|?P)cv!xu54 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 NJYD@<);T3K0RTZfZl?eM literal 0 HcmV?d00001 From a0580946dcac871b74e670e354921842bcf07aa6 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 6 Nov 2022 00:04:43 +0100 Subject: [PATCH 0143/1149] fix: allow -ween variants for all cats Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index afbc505ee..8cf2bde70 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1564,7 +1564,7 @@ void MainWindow::setCatBackground(bool enabled) QString cat = APPLICATION->settings()->get("BackgroundCat").toString(); if (non_stupid_abs(now.daysTo(xmas)) <= 4) { cat += "-xmas"; - } else if (cat == "kitteh" && non_stupid_abs(now.daysTo(halloween)) <= 4) { + } else if (non_stupid_abs(now.daysTo(halloween)) <= 4) { cat += "-ween"; } else if (non_stupid_abs(now.daysTo(birthday)) <= 12) { cat += "-bday"; From 4708ce4226e7b23046b8a099dd033192e68f8fd5 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 6 Nov 2022 00:47:33 +0100 Subject: [PATCH 0144/1149] refactor: rename halloween cats to -spooky Signed-off-by: Sefa Eyeoglu --- launcher/resources/backgrounds/backgrounds.qrc | 2 +- .../{kitteh-ween.png => kitteh-spooky.png} | Bin launcher/ui/MainWindow.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename launcher/resources/backgrounds/{kitteh-ween.png => kitteh-spooky.png} (100%) diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc index edfa44c0e..e55faf15e 100644 --- a/launcher/resources/backgrounds/backgrounds.qrc +++ b/launcher/resources/backgrounds/backgrounds.qrc @@ -4,7 +4,7 @@ kitteh.png kitteh-xmas.png kitteh-bday.png - kitteh-ween.png + kitteh-spooky.png rory.png rory-xmas.png rory-bday.png diff --git a/launcher/resources/backgrounds/kitteh-ween.png b/launcher/resources/backgrounds/kitteh-spooky.png similarity index 100% rename from launcher/resources/backgrounds/kitteh-ween.png rename to launcher/resources/backgrounds/kitteh-spooky.png diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 8cf2bde70..f6b9888f2 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1565,7 +1565,7 @@ void MainWindow::setCatBackground(bool enabled) if (non_stupid_abs(now.daysTo(xmas)) <= 4) { cat += "-xmas"; } else if (non_stupid_abs(now.daysTo(halloween)) <= 4) { - cat += "-ween"; + cat += "-spooky"; } else if (non_stupid_abs(now.daysTo(birthday)) <= 12) { cat += "-bday"; } From d5d224d89a6d1fccacbf8ffe8d0981cec32e89fb Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 6 Nov 2022 01:05:10 +0100 Subject: [PATCH 0145/1149] fix: save metacache after clearing If the user closes the launcher right after clearing, it probably didn't actually clear the cache yet. Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 28eaa741b..bbaf28272 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1899,6 +1899,7 @@ void MainWindow::on_actionReportBug_triggered() void MainWindow::on_actionClearMetadata_triggered() { APPLICATION->metacache()->evictAll(); + APPLICATION->metacache()->SaveNow(); } void MainWindow::on_actionOpenWiki_triggered() From 38e1d44dbb60aa6180a29c4a747d73395d3ed79b Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Sun, 6 Nov 2022 03:42:51 +0100 Subject: [PATCH 0146/1149] Update README.md Add copr Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ebc4fb44..611f8566e 100644 --- a/README.md +++ b/README.md @@ -27,16 +27,17 @@ There are development builds available [here](https://github.com/PrismLauncher/P Portable builds are provided for Linux, Windows, and macOS. -For Arch, Debian and Gentoo, respectively, you can use these packages to get compiled development versions: +For Arch, Debian, Fedora or Opensuse and Gentoo, respectively, you can use these packages to get compiled development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square)](https://packages.gentoo.org/packages/games-action/prismlauncher) -## Help & Support +## Community & Support Feel free to create an issue if you need help. +We have multiple communities that can help you. #### Join our Discord server: -[![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner3)](https://discord.gg/prismlauncher) +[![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner2)](https://discord.gg/prismlauncher) #### Join our Matrix space: [![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge)](https://matrix.to/#/#prismlauncher:matrix.org) From 16e3b786fc04ffd8d510bfb2a60157648825954f Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sun, 6 Nov 2022 10:08:54 +0000 Subject: [PATCH 0147/1149] Implement Scrumplex's suggestions Signed-off-by: TheKodeToad --- launcher/ui/dialogs/ModDownloadDialog.cpp | 4 +- launcher/ui/dialogs/ModDownloadDialog.h | 2 +- launcher/ui/pages/modplatform/ModPage.cpp | 46 ++++++++----------- .../pages/modplatform/flame/FlameModPage.cpp | 5 +- .../ui/pages/modplatform/flame/FlameModPage.h | 2 +- 5 files changed, 27 insertions(+), 32 deletions(-) diff --git a/launcher/ui/dialogs/ModDownloadDialog.cpp b/launcher/ui/dialogs/ModDownloadDialog.cpp index 0a0e61e36..24d23ba98 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.cpp +++ b/launcher/ui/dialogs/ModDownloadDialog.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * @@ -199,4 +199,4 @@ bool ModDownloadDialog::selectPage(QString pageId) ModPage* ModDownloadDialog::getSelectedPage() { return m_selectedPage; -} \ No newline at end of file +} diff --git a/launcher/ui/dialogs/ModDownloadDialog.h b/launcher/ui/dialogs/ModDownloadDialog.h index 29bdcf82d..fcf6f4fc2 100644 --- a/launcher/ui/dialogs/ModDownloadDialog.h +++ b/launcher/ui/dialogs/ModDownloadDialog.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index ec6f488fb..2f5f95bfc 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * @@ -43,6 +43,7 @@ #include #include +#include #include "minecraft/MinecraftInstance.h" #include "minecraft/PackProfile.h" @@ -254,32 +255,25 @@ void ModPage::openUrl(const QUrl& url) } // detect mod URLs and search instead - int prefixLength = 0; + static const QRegularExpression modrinth(QRegularExpression::anchoredPattern("(?:www\\.)?modrinth\\.com\\/mod\\/([^\\/]+)\\/?")), + curseForge(QRegularExpression::anchoredPattern("(?:www\\.)?curseforge\\.com\\/minecraft\\/mc-mods\\/([^\\/]+)\\/?")), + curseForgeOld(QRegularExpression::anchoredPattern("minecraft\\.curseforge\\.com\\/projects\\/([^\\/]+)\\/?")); + + const QString address = url.host() + url.path(); + QRegularExpressionMatch match; const char* page; - if ((url.host() == "modrinth.com" || url.host() == "www.modrinth.com") && url.path().startsWith("/mod/")) { - prefixLength = 5; + if ((match = modrinth.match(address)).hasMatch()) page = "modrinth"; - } else if (APPLICATION->capabilities() & Application::SupportsFlame && - (url.host() == "curseforge.com" || url.host().endsWith(".curseforge.com"))) { - if (url.path().toLower().startsWith("/minecraft/mc-mods/")) - prefixLength = 19; - else if (url.path().toLower().startsWith("/projects/")) - prefixLength = 10; + else if (APPLICATION->capabilities() & Application::SupportsFlame && + ((match = curseForge.match(address)).hasMatch() || (match = curseForgeOld.match(address)).hasMatch())) page = "curseforge"; - } - if (prefixLength != 0) { - QString slug = url.path().mid(prefixLength); + if (match.hasMatch()) { + const QString slug = match.captured(1); - // remove trailing slash(es) - while (slug.endsWith('/')) - slug.remove(slug.length() - 1, 1); - - // ensure that the path doesn't contain any further slashes, - // and the user isn't opening the same mod; they probably - // intended to view in their web browser - if (!slug.isEmpty() && !slug.contains('/') && slug != current.slug) { + // ensure the user isn't opening the same mod + if (slug != current.slug) { dialog->selectPage(page); ModPage* newPage = dialog->getSelectedPage(); @@ -290,8 +284,8 @@ void ModPage::openUrl(const QUrl& url) auto jump = [url, slug, model, view] { for (int row = 0; row < model->rowCount({}); row++) { - QModelIndex index = model->index(row); - auto pack = model->data(index, Qt::UserRole).value(); + const QModelIndex index = model->index(row); + const auto pack = model->data(index, Qt::UserRole).value(); if (pack.slug == slug) { view->setCurrentIndex(index); @@ -306,10 +300,10 @@ void ModPage::openUrl(const QUrl& url) searchEdit->setText(slug); newPage->triggerSearch(); - if (!model->activeJob()) - jump(); - else + if (model->activeJob()) connect(model->activeJob(), &Task::finished, jump); + else + jump(); return; } diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp index faf12cea1..bad78c97d 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * @@ -84,6 +84,7 @@ void FlameModPage::openUrl(const QUrl& url) { if (url.scheme().isEmpty()) { QString query = url.query(QUrl::FullyDecoded); + if (query.startsWith("remoteUrl=")) { // attempt to resolve url from warning page query.remove(0, 10); @@ -93,4 +94,4 @@ void FlameModPage::openUrl(const QUrl& url) } ModPage::openUrl(url); -} \ No newline at end of file +} diff --git a/launcher/ui/pages/modplatform/flame/FlameModPage.h b/launcher/ui/pages/modplatform/flame/FlameModPage.h index da4fcdffb..58479ab94 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModPage.h +++ b/launcher/ui/pages/modplatform/flame/FlameModPage.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 TheKodeToad * From 456999eee678cb2e59ca7d27d04bdb01eb0d7ede Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 6 Nov 2022 14:23:18 +0000 Subject: [PATCH 0148/1149] Fix: Configuration-less config for Qt Install Signed-off-by: TheLastRar --- launcher/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index f92375fb1..09a310ca1 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -1066,7 +1066,7 @@ if(INSTALL_BUNDLE STREQUAL "full") # Image formats install( DIRECTORY "${QT_PLUGINS_DIR}/imageformats" - CONFIGURATIONS Debug RelWithDebInfo + CONFIGURATIONS Debug RelWithDebInfo "" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "tga|tiff|mng" EXCLUDE @@ -1084,7 +1084,7 @@ if(INSTALL_BUNDLE STREQUAL "full") # Icon engines install( DIRECTORY "${QT_PLUGINS_DIR}/iconengines" - CONFIGURATIONS Debug RelWithDebInfo + CONFIGURATIONS Debug RelWithDebInfo "" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "fontawesome" EXCLUDE @@ -1102,7 +1102,7 @@ if(INSTALL_BUNDLE STREQUAL "full") # Platform plugins install( DIRECTORY "${QT_PLUGINS_DIR}/platforms" - CONFIGURATIONS Debug RelWithDebInfo + CONFIGURATIONS Debug RelWithDebInfo "" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime REGEX "minimal|linuxfb|offscreen" EXCLUDE @@ -1121,7 +1121,7 @@ if(INSTALL_BUNDLE STREQUAL "full") if(EXISTS "${QT_PLUGINS_DIR}/styles") install( DIRECTORY "${QT_PLUGINS_DIR}/styles" - CONFIGURATIONS Debug RelWithDebInfo + CONFIGURATIONS Debug RelWithDebInfo "" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime ) @@ -1139,7 +1139,7 @@ if(INSTALL_BUNDLE STREQUAL "full") if(EXISTS "${QT_PLUGINS_DIR}/tls") install( DIRECTORY "${QT_PLUGINS_DIR}/tls" - CONFIGURATIONS Debug RelWithDebInfo + CONFIGURATIONS Debug RelWithDebInfo "" DESTINATION ${PLUGIN_DEST_DIR} COMPONENT Runtime ) From 89aaac3a706f495994f87e4550be3609bb08f907 Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Sun, 6 Nov 2022 21:56:02 +0100 Subject: [PATCH 0149/1149] Update README.md Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 611f8566e..64fb8701d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Prism Launcher is a custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once. -This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. +This is a **fork** of the MultiMC Launcher and is not endorsed by MultiMC. ## Installation @@ -18,32 +18,31 @@ This is a **fork** of the MultiMC Launcher and not endorsed by MultiMC. Packaging status -- All downloads and instructions for Prism Launcher can be found [on our website](https://prismlauncher.org/download/). -- Last build status can be found [here](https://github.com/PrismLauncher/PrismLauncher/actions). +- All downloads and instructions for Prism Launcher can be found on our [Website](https://prismlauncher.org/download/). +- Last build status can be found in the [GitHub Actions](https://github.com/PrismLauncher/PrismLauncher/actions). ### Development Builds There are development builds available [here](https://github.com/PrismLauncher/PrismLauncher/actions). These have debug information in the binaries, so their file sizes are relatively larger. -Portable builds are provided for Linux, Windows, and macOS. +Portable builds are provided for **Linux**, **Windows**, and **macOS**. -For Arch, Debian, Fedora or Opensuse and Gentoo, respectively, you can use these packages to get compiled development versions: +For **Arch**, **Debian**, **Fedora** or **OpenSUSE** and **Gentoo**, respectively, you can use these packages for the latest development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=archlinux)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=archlinux)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=debian)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square&logo=fedora)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=gentoo)](https://packages.gentoo.org/packages/games-action/prismlauncher) ## Community & Support -Feel free to create an issue if you need help. -We have multiple communities that can help you. +Feel free to create a GitHub issue if you find a bug etc. We have multiple communities that can help you. #### Join our Discord server: [![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner2)](https://discord.gg/prismlauncher) #### Join our Matrix space: -[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge)](https://matrix.to/#/#prismlauncher:matrix.org) +[![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge&logo=matrix)](https://matrix.to/#/#prismlauncher:matrix.org) #### Join our SubReddit: -[![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge)](https://www.reddit.com/r/PrismLauncher/) +[![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge&logo=reddit)](https://www.reddit.com/r/PrismLauncher/) ## Building From 9ac6114b6379ba001785e76b5f9c10ddc2194d4a Mon Sep 17 00:00:00 2001 From: Tayou Date: Mon, 7 Nov 2022 14:33:37 +0100 Subject: [PATCH 0150/1149] Fix warning in main function main could according to the compiler end up not returning. of course it will always return, but I satisfied the compiler by adding a default case. Signed-off-by: Tayou --- launcher/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/launcher/main.cpp b/launcher/main.cpp index e2116f384..df5964493 100644 --- a/launcher/main.cpp +++ b/launcher/main.cpp @@ -91,5 +91,7 @@ int main(int argc, char *argv[]) return 1; case Application::Succeeded: return 0; + default: + return -1; } } From 380e76a2e373e1b8e62561b052eeabead855c36a Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Mon, 7 Nov 2022 17:14:16 +0100 Subject: [PATCH 0151/1149] Add Tumbleweed Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 64fb8701d..07b852843 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ There are development builds available [here](https://github.com/PrismLauncher/P Portable builds are provided for **Linux**, **Windows**, and **macOS**. -For **Arch**, **Debian**, **Fedora** or **OpenSUSE** and **Gentoo**, respectively, you can use these packages for the latest development versions: +For **Arch**, **Debian**, **Fedora**, **OpenSUSE** and **Gentoo**, respectively, you can use these packages for the latest development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=archlinux)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=archlinux)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=debian)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square&logo=fedora)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=gentoo)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=debian)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-brightgreen?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) ## Community & Support From 589d160515b7b9185bd09fc4aff5ae2c4abb4243 Mon Sep 17 00:00:00 2001 From: flow Date: Mon, 7 Nov 2022 14:04:48 -0300 Subject: [PATCH 0152/1149] fix: use cross-platform toStdString in FlameHasher Almost the same issue from toml++ :p Signed-off-by: flow --- launcher/modplatform/helpers/HashUtils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/modplatform/helpers/HashUtils.cpp b/launcher/modplatform/helpers/HashUtils.cpp index a7bbaba50..b18c87af9 100644 --- a/launcher/modplatform/helpers/HashUtils.cpp +++ b/launcher/modplatform/helpers/HashUtils.cpp @@ -4,6 +4,7 @@ #include #include "FileSystem.h" +#include "StringUtils.h" #include @@ -66,7 +67,7 @@ void FlameHasher::executeTask() // CF-specific auto should_filter_out = [](char c) { return (c == 9 || c == 10 || c == 13 || c == 32); }; - std::ifstream file_stream(m_path.toStdString(), std::ifstream::binary); + std::ifstream file_stream(StringUtils::toStdString(m_path), std::ifstream::binary); // TODO: This is very heavy work, but apparently QtConcurrent can't use move semantics, so we can't boop this to another thread. // How do we make this non-blocking then? m_hash = QString::number(MurmurHash2(std::move(file_stream), 4 * MiB, should_filter_out)); From 245928a0647036ca94c69a0b6ea15a271944fffa Mon Sep 17 00:00:00 2001 From: Adrien <66513643+AshtakaOOf@users.noreply.github.com> Date: Mon, 7 Nov 2022 20:33:09 +0100 Subject: [PATCH 0153/1149] Update README.md Signed-off-by: Adrien <66513643+AshtakaOOf@users.noreply.github.com> --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 07b852843..cfb7a4af2 100644 --- a/README.md +++ b/README.md @@ -25,20 +25,20 @@ This is a **fork** of the MultiMC Launcher and is not endorsed by MultiMC. There are development builds available [here](https://github.com/PrismLauncher/PrismLauncher/actions). These have debug information in the binaries, so their file sizes are relatively larger. -Portable builds are provided for **Linux**, **Windows**, and **macOS**. +Prebuilt Development builds are provided for **Linux**, **Windows** and **macOS**. For **Arch**, **Debian**, **Fedora**, **OpenSUSE** and **Gentoo**, respectively, you can use these packages for the latest development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-blue?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-blue?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-orange?style=flat-square&logo=debian)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-blue?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-brightgreen?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-purple?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-A80030?style=flat-square&logo=debian&logoColor=white)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-51A2DA?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-3AB6A9?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-4D4270?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) ## Community & Support -Feel free to create a GitHub issue if you find a bug etc. We have multiple communities that can help you. +Feel free to create a GitHub issue if you find a bug or want to suggest a new feature. We have multiple communities that can also help you. #### Join our Discord server: [![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner2)](https://discord.gg/prismlauncher) -#### Join our Matrix space: +#### Join our Matrix space (Will be opened at a later date): [![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge&logo=matrix)](https://matrix.to/#/#prismlauncher:matrix.org) #### Join our SubReddit: @@ -46,7 +46,7 @@ Feel free to create a GitHub issue if you find a bug etc. We have multiple commu ## Building -If you want to build Prism Launcher yourself, check [Build Instructions](https://prismlauncher.org/wiki/development/build-instructions/) for build instructions. +If you want to build Prism Launcher yourself, check the [Build Instructions](https://prismlauncher.org/wiki/development/build-instructions/). ## Translations @@ -97,6 +97,6 @@ Thanks to the awesome people over at [MacStadium](https://www.macstadium.com/), All launcher code is available under the GPL-3.0-only license. -![https://github.com/PrismLauncher/PrismLauncher/blob/develop/LICENSE](https://img.shields.io/github/license/PrismLauncher/PrismLauncher?style=for-the-badge) +![https://github.com/PrismLauncher/PrismLauncher/blob/develop/LICENSE](https://img.shields.io/github/license/PrismLauncher/PrismLauncher?style=for-the-badge&logo=gnu&color=C4282D) The logo and related assets are under the CC BY-SA 4.0 license. From ce2df4b36f91fd8a293504143670e046453eed19 Mon Sep 17 00:00:00 2001 From: txtsd Date: Tue, 8 Nov 2022 17:24:00 +0530 Subject: [PATCH 0154/1149] chore(readme): Specify openSUSE Tumbleweed Signed-off-by: txtsd --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cfb7a4af2..f8ea2e841 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ There are development builds available [here](https://github.com/PrismLauncher/P Prebuilt Development builds are provided for **Linux**, **Windows** and **macOS**. -For **Arch**, **Debian**, **Fedora**, **OpenSUSE** and **Gentoo**, respectively, you can use these packages for the latest development versions: +For **Arch**, **Debian**, **Fedora**, **OpenSUSE (Tumbleweed)** and **Gentoo**, respectively, you can use these packages for the latest development versions: [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-A80030?style=flat-square&logo=debian&logoColor=white)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-51A2DA?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-3AB6A9?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-4D4270?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) From e68dcea6bcb5830659d17db40fc9a83a4eca9cc0 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Mon, 24 Oct 2022 18:21:26 +0100 Subject: [PATCH 0155/1149] Various tweaks to the Java component of the launcher Signed-off-by: TheKodeToad --- launcher/minecraft/MinecraftInstance.cpp | 13 +- libraries/README.md | 6 +- libraries/launcher/CMakeLists.txt | 4 +- .../org/prismlauncher/EntryPoint.java | 52 ++--- .../launcher/org/prismlauncher/Launcher.java | 2 +- .../org/prismlauncher/LauncherFactory.java | 19 +- .../org/prismlauncher/applet/LegacyFrame.java | 3 +- .../prismlauncher/impl/AbstractLauncher.java | 95 +++++++++ .../prismlauncher/impl/LegacyLauncher.java | 104 ++++++++++ .../prismlauncher/impl/OneSixLauncher.java | 190 ------------------ .../prismlauncher/impl/StandardLauncher.java | 51 +++++ .../org/prismlauncher/utils/Parameters.java | 12 +- .../org/prismlauncher/utils/Utils.java | 2 +- 13 files changed, 316 insertions(+), 237 deletions(-) create mode 100644 libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java delete mode 100644 libraries/launcher/org/prismlauncher/impl/OneSixLauncher.java create mode 100644 libraries/launcher/org/prismlauncher/impl/StandardLauncher.java diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 3a820951b..5a5245ed1 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -3,6 +3,7 @@ * PolyMC - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu * Copyright (C) 2022 Jamie Mansfield + * Copyright (C) 2022 TheKodeToad * * 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 @@ -647,7 +648,17 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftS { launchScript += "traits " + trait + "\n"; } - launchScript += "launcher onesix\n"; + + launchScript += "launcher "; + + // use legacy launcher if the traits are set + if (profile->getTraits().contains("legacyLaunch") || profile->getTraits().contains("alphaLaunch")) + launchScript += "legacy"; + else + launchScript += "standard"; + + launchScript += "\n"; + // qDebug() << "Generated launch script:" << launchScript; return launchScript; } diff --git a/libraries/README.md b/libraries/README.md index dc38477b0..2971e32b6 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -51,10 +51,10 @@ It: This means the process is essentially idle until the final command is sent. You can, for example, attach a profiler before you send it. -A `legacy` and `onesix` launchers are available. +A `legacy` and `standard` launchers are available. - `legacy` is intended for use with Minecraft versions < 1.6 and is deprecated. -- `onesix` can handle launching any Minecraft version, at the cost of some extra features `legacy` enables (custom window icon and title). +- `standard` can handle launching any Minecraft version, at the cost of some extra features `legacy` enables (custom window icon and title). Example (some parts have been censored): @@ -132,7 +132,7 @@ ext /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/l ext /home/peterix/minecraft/FTB/libraries/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar natives /home/peterix/minecraft/FTB/17ForgeTest/natives cp /home/peterix/minecraft/FTB/versions/1.7.10/1.7.10.jar -launcher onesix +launcher standard ``` Available under `GPL-3.0-only` (with classpath exception), sublicensed from its original `Apache-2.0` codebase diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index df25414f7..ee88d0f90 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -10,7 +10,9 @@ set(SRC org/prismlauncher/EntryPoint.java org/prismlauncher/Launcher.java org/prismlauncher/LauncherFactory.java - org/prismlauncher/impl/OneSixLauncher.java + org/prismlauncher/impl/AbstractLauncher.java + org/prismlauncher/impl/LegacyLauncher.java + org/prismlauncher/impl/StandardLauncher.java org/prismlauncher/applet/LegacyFrame.java org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParseException.java diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 9144e1f1b..73ff97534 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -81,33 +81,35 @@ public final class EntryPoint { } private Action parseLine(String inData) throws ParseException { - String[] tokens = inData.split("\\s+", 2); - - if (tokens.length == 0) + if (inData.length() == 0) throw new ParseException("Unexpected empty string!"); - switch (tokens[0]) { - case "launch": { - return Action.Launch; - } + String first = inData; + String second = null; + int splitPoint = inData.indexOf(' '); - case "abort": { - return Action.Abort; - } + if (splitPoint != -1) { + first = first.substring(0, splitPoint); + second = inData.substring(splitPoint + 1); + } - default: { - if (tokens.length != 2) + switch (first) { + case "launch": + return Action.LAUNCH; + case "abort": + return Action.ABORT; + default: + if (second == null || second.isEmpty()) throw new ParseException("Error while parsing:" + inData); - params.add(tokens[0], tokens[1]); + params.add(first, second); - return Action.Proceed; - } + return Action.PROCEED; } } public int listen() { - Action action = Action.Proceed; + Action action = Action.PROCEED; try (BufferedReader reader = new BufferedReader(new InputStreamReader( System.in, @@ -115,21 +117,21 @@ public final class EntryPoint { ))) { String line; - while (action == Action.Proceed) { + while (action == Action.PROCEED) { if ((line = reader.readLine()) != null) { action = parseLine(line); } else { - action = Action.Abort; + action = Action.ABORT; } } } catch (IOException | ParseException e) { - LOGGER.log(Level.SEVERE, "Launcher ABORT due to exception:", e); + LOGGER.log(Level.SEVERE, "Launcher abort due to exception:", e); return 1; } // Main loop - if (action == Action.Abort) { + if (action == Action.ABORT) { LOGGER.info("Launch aborted by the launcher."); return 1; @@ -138,7 +140,7 @@ public final class EntryPoint { try { Launcher launcher = LauncherFactory - .getInstance() + .INSTANCE .createLauncher(params); launcher.launch(); @@ -148,7 +150,7 @@ public final class EntryPoint { LOGGER.log(Level.SEVERE, "Wrong argument.", e); return 1; - } catch (Exception e) { + } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Exception caught from launcher.", e); return 1; @@ -156,9 +158,9 @@ public final class EntryPoint { } private enum Action { - Proceed, - Launch, - Abort + PROCEED, + LAUNCH, + ABORT } } diff --git a/libraries/launcher/org/prismlauncher/Launcher.java b/libraries/launcher/org/prismlauncher/Launcher.java index 7f25717b2..50c2c9c8f 100644 --- a/libraries/launcher/org/prismlauncher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/Launcher.java @@ -18,6 +18,6 @@ package org.prismlauncher; public interface Launcher { - void launch() throws Exception; + void launch() throws Throwable; } diff --git a/libraries/launcher/org/prismlauncher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/LauncherFactory.java index 98f2bbba7..354ad1f01 100644 --- a/libraries/launcher/org/prismlauncher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/LauncherFactory.java @@ -35,7 +35,8 @@ package org.prismlauncher; -import org.prismlauncher.impl.OneSixLauncher; +import org.prismlauncher.impl.LegacyLauncher; +import org.prismlauncher.impl.StandardLauncher; import org.prismlauncher.utils.Parameters; import java.util.HashMap; @@ -43,15 +44,21 @@ import java.util.Map; public final class LauncherFactory { - private static final LauncherFactory INSTANCE = new LauncherFactory(); + public static final LauncherFactory INSTANCE = new LauncherFactory(); private final Map launcherRegistry = new HashMap<>(); private LauncherFactory() { - launcherRegistry.put("onesix", new LauncherProvider() { + launcherRegistry.put("standard", new LauncherProvider() { @Override public Launcher provide(Parameters parameters) { - return new OneSixLauncher(parameters); + return new StandardLauncher(parameters); + } + }); + launcherRegistry.put("legacy", new LauncherProvider() { + @Override + public Launcher provide(Parameters parameters) { + return new LegacyLauncher(parameters); } }); } @@ -67,10 +74,6 @@ public final class LauncherFactory { return launcherProvider.provide(parameters); } - public static LauncherFactory getInstance() { - return INSTANCE; - } - public interface LauncherProvider { Launcher provide(Parameters parameters); diff --git a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java index 4413efa8c..f3359fcae 100644 --- a/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java +++ b/libraries/launcher/org/prismlauncher/applet/LegacyFrame.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +@SuppressWarnings("removal") public final class LegacyFrame extends Frame { private static final Logger LOGGER = Logger.getLogger("LegacyFrame"); @@ -105,7 +106,7 @@ public final class LegacyFrame extends Frame { appletWrap.setParameter("username", user); appletWrap.setParameter("sessionid", session); - appletWrap.setParameter("stand-alone", "true"); // Show the quit button. + appletWrap.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? appletWrap.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. appletWrap.setParameter("demo", isDemo ? "true" : "false"); appletWrap.setParameter("fullscreen", "false"); diff --git a/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java new file mode 100644 index 000000000..49a984f52 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java @@ -0,0 +1,95 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.impl; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.prismlauncher.Launcher; +import org.prismlauncher.exception.ParseException; +import org.prismlauncher.utils.Parameters; + +public abstract class AbstractLauncher implements Launcher { + + private static final int DEFAULT_WINDOW_WIDTH = 854; + private static final int DEFAULT_WINDOW_HEIGHT = 480; + + // parameters, separated from ParamBucket + protected final List mcParams; + private final String mainClass; + + // secondary parameters + protected final int width; + protected final int height; + protected final boolean maximize; + + protected final String serverAddress, serverPort; + + protected final ClassLoader classLoader; + + public AbstractLauncher(Parameters params) { + classLoader = ClassLoader.getSystemClassLoader(); + + mcParams = params.allSafe("param", new ArrayList()); + mainClass = params.firstSafe("mainClass", "net.minecraft.client.Minecraft"); + + serverAddress = params.firstSafe("serverAddress", null); + serverPort = params.firstSafe("serverPort", null); + + String windowParams = params.firstSafe("windowParams", null); + + if ("max".equals(windowParams) || windowParams == null) { + maximize = windowParams != null; + + width = DEFAULT_WINDOW_WIDTH; + height = DEFAULT_WINDOW_HEIGHT; + } else { + maximize = false; + + int byIndex = windowParams.indexOf('x'); + + if (byIndex != -1) { + try { + width = Integer.parseInt(windowParams.substring(0, byIndex)); + height = Integer.parseInt(windowParams.substring(byIndex + 1)); + return; + } catch(NumberFormatException pass) { + } + } + + throw new ParseException("Invalid window size parameter value: " + windowParams); + } + } + + protected Class loadMain() throws ClassNotFoundException { + return classLoader.loadClass(mainClass); + } + + protected void loadAndInvokeMain() throws Throwable, ClassNotFoundException { + invokeMain(loadMain()); + } + + protected void invokeMain(Class mainClass) throws Throwable { + MethodHandle method = MethodHandles.lookup().findStatic(mainClass, "main", MethodType.methodType(void.class, String[].class)); + + method.invokeExact(mcParams.toArray(new String[0])); + } + +} diff --git a/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java new file mode 100644 index 000000000..30a4dba79 --- /dev/null +++ b/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java @@ -0,0 +1,104 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.impl; + +import java.applet.Applet; +import java.io.File; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.prismlauncher.applet.LegacyFrame; +import org.prismlauncher.utils.Parameters; +import org.prismlauncher.utils.Utils; + +@SuppressWarnings("removal") +public final class LegacyLauncher extends AbstractLauncher { + + private static final Logger LOGGER = Logger.getLogger("LegacyLauncher"); + + private final String user, session; + private final String title; + private final String appletClass; + + private final boolean noApplet; + private final String cwd; + + public LegacyLauncher(Parameters params) { + super(params); + + user = params.first("userName"); + session = params.first("sessionId"); + title = params.firstSafe("windowTitle", "Minecraft"); + appletClass = params.firstSafe("appletClass", "net.minecraft.client.MinecraftApplet"); + + List traits = params.allSafe("traits", Collections.emptyList()); + noApplet = traits.contains("noapplet"); + + cwd = System.getProperty("user.dir"); + } + + @Override + public void launch() throws Throwable { + Class main = loadMain(); + Field gameDirField = Utils.getMinecraftGameDirField(main); + + if (gameDirField == null) { + LOGGER.warning("Could not find Mineraft path field."); + } else { + gameDirField.setAccessible(true); + gameDirField.set(null, new File(cwd)); + } + + if (!noApplet) { + LOGGER.info("Launching with applet wrapper..."); + + try { + Class appletClass = classLoader.loadClass(this.appletClass); + + MethodHandle constructor = MethodHandles.lookup().findConstructor(appletClass, MethodType.methodType(void.class)); + Applet applet = (Applet) constructor.invoke(); + + LegacyFrame window = new LegacyFrame(title, applet); + + window.start( + user, + session, + width, + height, + maximize, + serverAddress, + serverPort, + mcParams.contains("--demo") + ); + + return; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Applet wrapper failed:", e); + + LOGGER.warning("Falling back to using main class."); + } + } + + invokeMain(main); + } + +} diff --git a/libraries/launcher/org/prismlauncher/impl/OneSixLauncher.java b/libraries/launcher/org/prismlauncher/impl/OneSixLauncher.java deleted file mode 100644 index d64438266..000000000 --- a/libraries/launcher/org/prismlauncher/impl/OneSixLauncher.java +++ /dev/null @@ -1,190 +0,0 @@ -/* Copyright 2012-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.prismlauncher.impl; - -import org.prismlauncher.Launcher; -import org.prismlauncher.applet.LegacyFrame; -import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.Utils; - -import java.applet.Applet; -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.List; -import java.util.ArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; - -public final class OneSixLauncher implements Launcher { - - private static final int DEFAULT_WINDOW_WIDTH = 854; - private static final int DEFAULT_WINDOW_HEIGHT = 480; - - private static final Logger LOGGER = Logger.getLogger("OneSixLauncher"); - - // parameters, separated from ParamBucket - private final List mcParams; - private final List traits; - private final String appletClass; - private final String mainClass; - private final String userName, sessionId; - private final String windowTitle; - - // secondary parameters - private final int winSizeW; - private final int winSizeH; - private final boolean maximize; - private final String cwd; - - private final String serverAddress; - private final String serverPort; - - private final ClassLoader classLoader; - - public OneSixLauncher(Parameters params) { - classLoader = ClassLoader.getSystemClassLoader(); - - mcParams = params.allSafe("param", new ArrayList()); - mainClass = params.firstSafe("mainClass", "net.minecraft.client.Minecraft"); - appletClass = params.firstSafe("appletClass", "net.minecraft.client.MinecraftApplet"); - traits = params.allSafe("traits", new ArrayList()); - - userName = params.first("userName"); - sessionId = params.first("sessionId"); - windowTitle = params.firstSafe("windowTitle", "Minecraft"); - - serverAddress = params.firstSafe("serverAddress", null); - serverPort = params.firstSafe("serverPort", null); - - cwd = System.getProperty("user.dir"); - - String windowParams = params.firstSafe("windowParams", null); - - if (windowParams != null) { - String[] dimStrings = windowParams.split("x"); - - if (windowParams.equalsIgnoreCase("max")) { - maximize = true; - - winSizeW = DEFAULT_WINDOW_WIDTH; - winSizeH = DEFAULT_WINDOW_HEIGHT; - } else if (dimStrings.length == 2) { - maximize = false; - - winSizeW = Integer.parseInt(dimStrings[0]); - winSizeH = Integer.parseInt(dimStrings[1]); - } else { - throw new IllegalArgumentException("Unexpected window size parameter value: " + windowParams); - } - } else { - maximize = false; - - winSizeW = DEFAULT_WINDOW_WIDTH; - winSizeH = DEFAULT_WINDOW_HEIGHT; - } - } - - private void invokeMain(Class mainClass) throws Exception { - Method method = mainClass.getMethod("main", String[].class); - - method.invoke(null, (Object) mcParams.toArray(new String[0])); - } - - private void legacyLaunch() throws Exception { - // Get the Minecraft Class and set the base folder - Class minecraftClass = classLoader.loadClass(mainClass); - - Field baseDirField = Utils.getMinecraftBaseDirField(minecraftClass); - - if (baseDirField == null) { - LOGGER.warning("Could not find Minecraft path field."); - } else { - baseDirField.setAccessible(true); - - baseDirField.set(null, new File(cwd)); - } - - System.setProperty("minecraft.applet.TargetDirectory", cwd); - - if (!traits.contains("noapplet")) { - LOGGER.info("Launching with applet wrapper..."); - - try { - Class mcAppletClass = classLoader.loadClass(appletClass); - - Applet mcApplet = (Applet) mcAppletClass.getConstructor().newInstance(); - - LegacyFrame mcWindow = new LegacyFrame(windowTitle, mcApplet); - - mcWindow.start( - userName, - sessionId, - winSizeW, - winSizeH, - maximize, - serverAddress, - serverPort, - mcParams.contains("--demo") - ); - - return; - } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Applet wrapper failed: ", e); - - LOGGER.warning("Falling back to using main class."); - } - } - - invokeMain(minecraftClass); - } - - private void launchWithMainClass() throws Exception { - // window size, title and state, onesix - - // FIXME: there is no good way to maximize the minecraft window in onesix. - // the following often breaks linux screen setups - // mcparams.add("--fullscreen"); - - if (!maximize) { - mcParams.add("--width"); - mcParams.add(Integer.toString(winSizeW)); - mcParams.add("--height"); - mcParams.add(Integer.toString(winSizeH)); - } - - if (serverAddress != null) { - mcParams.add("--server"); - mcParams.add(serverAddress); - mcParams.add("--port"); - mcParams.add(serverPort); - } - - invokeMain(classLoader.loadClass(mainClass)); - } - - @Override - public void launch() throws Exception { - if (traits.contains("legacyLaunch") || traits.contains("alphaLaunch")) { - // legacy launch uses the applet wrapper - legacyLaunch(); - } else { - // normal launch just calls main() - launchWithMainClass(); - } - } - -} diff --git a/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java new file mode 100644 index 000000000..c651b060a --- /dev/null +++ b/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java @@ -0,0 +1,51 @@ +/* Copyright 2012-2021 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.prismlauncher.impl; + +import org.prismlauncher.utils.Parameters; + +public final class StandardLauncher extends AbstractLauncher { + + public StandardLauncher(Parameters params) { + super(params); + } + + @Override + public void launch() throws Throwable { + // window size, title and state + + // FIXME: there is no good way to maximize the minecraft window from here. + // the following often breaks linux screen setups + // mcparams.add("--fullscreen"); + + if (!maximize) { + mcParams.add("--width"); + mcParams.add(Integer.toString(width)); + mcParams.add("--height"); + mcParams.add(Integer.toString(height)); + } + + if (serverAddress != null) { + mcParams.add("--server"); + mcParams.add(serverAddress); + mcParams.add("--port"); + mcParams.add(serverPort); + } + + loadAndInvokeMain(); + } + +} diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index 98a40c28d..dcaba18d1 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -25,22 +25,22 @@ import java.util.Map; public final class Parameters { - private final Map> paramsMap = new HashMap<>(); + private final Map> map = new HashMap<>(); public void add(String key, String value) { - List params = paramsMap.get(key); + List params = map.get(key); if (params == null) { params = new ArrayList<>(); - paramsMap.put(key, params); + map.put(key, params); } params.add(value); } public List all(String key) throws ParameterNotFoundException { - List params = paramsMap.get(key); + List params = map.get(key); if (params == null) throw new ParameterNotFoundException(key); @@ -49,7 +49,7 @@ public final class Parameters { } public List allSafe(String key, List def) { - List params = paramsMap.get(key); + List params = map.get(key); if (params == null || params.isEmpty()) return def; @@ -67,7 +67,7 @@ public final class Parameters { } public String firstSafe(String key, String def) { - List params = paramsMap.get(key); + List params = map.get(key); if (params == null || params.isEmpty()) return def; diff --git a/libraries/launcher/org/prismlauncher/utils/Utils.java b/libraries/launcher/org/prismlauncher/utils/Utils.java index ae9a4de20..79f5367b6 100644 --- a/libraries/launcher/org/prismlauncher/utils/Utils.java +++ b/libraries/launcher/org/prismlauncher/utils/Utils.java @@ -29,7 +29,7 @@ public final class Utils { * * @param clazz the class to scan */ - public static Field getMinecraftBaseDirField(Class clazz) { + public static Field getMinecraftGameDirField(Class clazz) { for (Field f : clazz.getDeclaredFields()) { // Has to be File if (f.getType() != File.class) From 9062d28704f8508a031612f102c27a63b3655e0a Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 27 Oct 2022 18:01:17 -0400 Subject: [PATCH 0156/1149] Get rid of singleton, and refactor LauncherFactory to be a static class Signed-off-by: solonovamax --- .../org/prismlauncher/EntryPoint.java | 5 +-- .../org/prismlauncher/LauncherFactory.java | 31 ++++++++++--------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 73ff97534..37db6a5da 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -138,10 +138,7 @@ public final class EntryPoint { } try { - Launcher launcher = - LauncherFactory - .INSTANCE - .createLauncher(params); + Launcher launcher = LauncherFactory.createLauncher(params); launcher.launch(); diff --git a/libraries/launcher/org/prismlauncher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/LauncherFactory.java index 354ad1f01..5b18cc5f6 100644 --- a/libraries/launcher/org/prismlauncher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/LauncherFactory.java @@ -35,6 +35,7 @@ package org.prismlauncher; + import org.prismlauncher.impl.LegacyLauncher; import org.prismlauncher.impl.StandardLauncher; import org.prismlauncher.utils.Parameters; @@ -42,13 +43,11 @@ import org.prismlauncher.utils.Parameters; import java.util.HashMap; import java.util.Map; + public final class LauncherFactory { - - public static final LauncherFactory INSTANCE = new LauncherFactory(); - - private final Map launcherRegistry = new HashMap<>(); - - private LauncherFactory() { + private static final Map launcherRegistry = new HashMap<>(); + + static { launcherRegistry.put("standard", new LauncherProvider() { @Override public Launcher provide(Parameters parameters) { @@ -62,22 +61,24 @@ public final class LauncherFactory { } }); } - - public Launcher createLauncher(Parameters parameters) { + private LauncherFactory() { + } + + public static Launcher createLauncher(Parameters parameters) { String name = parameters.first("launcher"); - + LauncherProvider launcherProvider = launcherRegistry.get(name); - + if (launcherProvider == null) throw new IllegalArgumentException("Invalid launcher type: " + name); - + return launcherProvider.provide(parameters); } - + public interface LauncherProvider { - + Launcher provide(Parameters parameters); - + } - + } From 107fa6b4f73c4b9178e5055995500fa9ad75da27 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 27 Oct 2022 19:52:09 -0400 Subject: [PATCH 0157/1149] Code refactors - Refactor LauncherFactory.LauncherProvider to LauncherFactory - Refactor all launcher related components to launcher package - some basic code cleanup - Rename all, allSafe -> getList and first, firstSafe -> getString - Rename Utils -> LegacyUtils Signed-off-by: solonovamax --- libraries/launcher/CMakeLists.txt | 13 +- .../launcher/net/minecraft/Launcher.java | 182 +++++++++--------- .../org/prismlauncher/EntryPoint.java | 4 +- .../{ => launcher}/Launcher.java | 5 +- .../{ => launcher}/LauncherFactory.java | 17 +- .../launcher/LauncherProvider.java | 44 +++++ .../{ => launcher}/impl/AbstractLauncher.java | 43 +++-- .../{ => launcher}/impl/LegacyLauncher.java | 29 +-- .../{ => launcher}/impl/StandardLauncher.java | 2 +- .../utils/{Utils.java => LegacyUtils.java} | 27 +-- .../org/prismlauncher/utils/Parameters.java | 32 +-- 11 files changed, 227 insertions(+), 171 deletions(-) rename libraries/launcher/org/prismlauncher/{ => launcher}/Launcher.java (94%) rename libraries/launcher/org/prismlauncher/{ => launcher}/LauncherFactory.java (89%) create mode 100644 libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java rename libraries/launcher/org/prismlauncher/{ => launcher}/impl/AbstractLauncher.java (80%) rename libraries/launcher/org/prismlauncher/{ => launcher}/impl/LegacyLauncher.java (86%) rename libraries/launcher/org/prismlauncher/{ => launcher}/impl/StandardLauncher.java (97%) rename libraries/launcher/org/prismlauncher/utils/{Utils.java => LegacyUtils.java} (71%) diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index ee88d0f90..d74c36413 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -8,16 +8,17 @@ set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7 -Xlint:deprecation -Xlint:unche set(SRC org/prismlauncher/EntryPoint.java - org/prismlauncher/Launcher.java - org/prismlauncher/LauncherFactory.java - org/prismlauncher/impl/AbstractLauncher.java - org/prismlauncher/impl/LegacyLauncher.java - org/prismlauncher/impl/StandardLauncher.java + org/prismlauncher/launcher/Launcher.java + org/prismlauncher/launcher/LauncherFactory.java + org/prismlauncher/launcher/LauncherProvider.java + org/prismlauncher/launcher/impl/AbstractLauncher.java + org/prismlauncher/launcher/impl/LegacyLauncher.java + org/prismlauncher/launcher/impl/StandardLauncher.java org/prismlauncher/applet/LegacyFrame.java org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java - org/prismlauncher/utils/Utils.java + org/prismlauncher/utils/LegacyUtils.java net/minecraft/Launcher.java ) add_jar(NewLaunch ${SRC}) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index 6bf671bec..f9fd0a976 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -16,157 +16,167 @@ package net.minecraft; + import java.applet.Applet; import java.applet.AppletStub; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Graphics; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import java.util.TreeMap; + /* * WARNING: This class is reflectively accessed by legacy Forge versions. * Changing field and method declarations without further testing is not recommended. */ public final class Launcher extends Applet implements AppletStub { - + private final Map params = new TreeMap<>(); - + private Applet wrappedApplet; - - private URL documentBase; - + + private final URL documentBase; + private boolean active = false; - + public Launcher(Applet applet) { this(applet, null); } - + public Launcher(Applet applet, URL documentBase) { this.setLayout(new BorderLayout()); - + this.add(applet, "Center"); - + this.wrappedApplet = applet; - + try { if (documentBase != null) { this.documentBase = documentBase; } else if (applet.getClass().getPackage().getName().startsWith("com.mojang")) { // Special case only for Classic versions - + + // TODO: 2022-10-27 Can this be changed to https this.documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); } else { + // TODO: 2022-10-27 Can this be changed to https? this.documentBase = new URL("http://www.minecraft.net/game/"); } } catch (MalformedURLException e) { throw new RuntimeException(e); } } - + public void replace(Applet applet) { this.wrappedApplet = applet; - + applet.setStub(this); applet.setSize(getWidth(), getHeight()); - + this.setLayout(new BorderLayout()); this.add(applet, "Center"); - + applet.init(); - + active = true; - + applet.start(); - + validate(); } - - public void setParameter(String name, String value) { - params.put(name, value); - } - - @Override - public String getParameter(String name) { - String param = params.get(name); - - if (param != null) - return param; - - try { - return super.getParameter(name); - } catch (Exception ignored) {} - - return null; - } - + @Override public boolean isActive() { return active; } - + @Override - public void appletResize(int width, int height) { - wrappedApplet.resize(width, height); + public URL getDocumentBase() { + return documentBase; } - - @Override - public void resize(int width, int height) { - wrappedApplet.resize(width, height); - } - - @Override - public void resize(Dimension d) { - wrappedApplet.resize(d); - } - - @Override - public void init() { - if (wrappedApplet != null) - wrappedApplet.init(); - } - - @Override - public void start() { - wrappedApplet.start(); - - active = true; - } - - @Override - public void stop() { - wrappedApplet.stop(); - - active = false; - } - - public void destroy() { - wrappedApplet.destroy(); - } - + @Override public URL getCodeBase() { try { + // TODO: 2022-10-27 Can this be changed to https? return new URL("http://www.minecraft.net/game/"); } catch (MalformedURLException e) { throw new RuntimeException(e); } } - + @Override - public URL getDocumentBase() { - return documentBase; + public String getParameter(String name) { + String param = params.get(name); + + if (param != null) + return param; + + try { + return super.getParameter(name); + } catch (Exception ignored) { + } + + return null; } - + + @Override + public void resize(int width, int height) { + wrappedApplet.resize(width, height); + } + + @Override + public void resize(Dimension d) { + wrappedApplet.resize(d); + } + + @Override + public void init() { + if (wrappedApplet != null) + wrappedApplet.init(); + } + + @Override + public void start() { + wrappedApplet.start(); + + active = true; + } + + @Override + public void stop() { + wrappedApplet.stop(); + + active = false; + } + + public void destroy() { + wrappedApplet.destroy(); + } + + @Override + public void appletResize(int width, int height) { + wrappedApplet.resize(width, height); + } + @Override public void setVisible(boolean b) { super.setVisible(b); - + wrappedApplet.setVisible(b); } - - public void update(Graphics paramGraphics) {} - - public void paint(Graphics paramGraphics) {} - + + public void paint(Graphics paramGraphics) { + } + + public void update(Graphics paramGraphics) { + } + + public void setParameter(String name, String value) { + params.put(name, value); + } + } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 37db6a5da..44e947b1a 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -53,6 +53,8 @@ package org.prismlauncher; import org.prismlauncher.exception.ParseException; +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.launcher.LauncherFactory; import org.prismlauncher.utils.Parameters; import java.io.BufferedReader; @@ -81,7 +83,7 @@ public final class EntryPoint { } private Action parseLine(String inData) throws ParseException { - if (inData.length() == 0) + if (inData.isEmpty()) throw new ParseException("Unexpected empty string!"); String first = inData; diff --git a/libraries/launcher/org/prismlauncher/Launcher.java b/libraries/launcher/org/prismlauncher/launcher/Launcher.java similarity index 94% rename from libraries/launcher/org/prismlauncher/Launcher.java rename to libraries/launcher/org/prismlauncher/launcher/Launcher.java index 50c2c9c8f..1cea255c8 100644 --- a/libraries/launcher/org/prismlauncher/Launcher.java +++ b/libraries/launcher/org/prismlauncher/launcher/Launcher.java @@ -14,10 +14,9 @@ * limitations under the License. */ -package org.prismlauncher; +package org.prismlauncher.launcher; + public interface Launcher { - void launch() throws Throwable; - } diff --git a/libraries/launcher/org/prismlauncher/LauncherFactory.java b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java similarity index 89% rename from libraries/launcher/org/prismlauncher/LauncherFactory.java rename to libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java index 5b18cc5f6..6c6011711 100644 --- a/libraries/launcher/org/prismlauncher/LauncherFactory.java +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherFactory.java @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 icelimetea, * * This program is free software: you can redistribute it and/or modify @@ -33,11 +33,11 @@ * along with this program. If not, see . */ -package org.prismlauncher; +package org.prismlauncher.launcher; -import org.prismlauncher.impl.LegacyLauncher; -import org.prismlauncher.impl.StandardLauncher; +import org.prismlauncher.launcher.impl.LegacyLauncher; +import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.utils.Parameters; import java.util.HashMap; @@ -65,7 +65,7 @@ public final class LauncherFactory { } public static Launcher createLauncher(Parameters parameters) { - String name = parameters.first("launcher"); + String name = parameters.getString("launcher"); LauncherProvider launcherProvider = launcherRegistry.get(name); @@ -74,11 +74,4 @@ public final class LauncherFactory { return launcherProvider.provide(parameters); } - - public interface LauncherProvider { - - Launcher provide(Parameters parameters); - - } - } diff --git a/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java new file mode 100644 index 000000000..b6d1caabc --- /dev/null +++ b/libraries/launcher/org/prismlauncher/launcher/LauncherProvider.java @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0-only +/* + * PolyMC - Minecraft Launcher + * Copyright (C) 2022 solonovamax, + * + * 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. + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give + * you permission to link this library with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also meet, + * for each linked independent module, the terms and conditions of the + * license of that module. An independent module is a module which is + * not derived from or based on this library. If you modify this + * library, you may extend this exception to your version of the + * library, but you are not obliged to do so. If you do not wish to do + * so, delete this exception statement from your version. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.prismlauncher.launcher; + + +import org.prismlauncher.utils.Parameters; + + +public interface LauncherProvider { + Launcher provide(Parameters parameters); +} diff --git a/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java similarity index 80% rename from libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java rename to libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 49a984f52..637c5da78 100644 --- a/libraries/launcher/org/prismlauncher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -13,21 +13,22 @@ * limitations under the License. */ -package org.prismlauncher.impl; +package org.prismlauncher.launcher.impl; + + +import org.prismlauncher.exception.ParseException; +import org.prismlauncher.launcher.Launcher; +import org.prismlauncher.utils.Parameters; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import org.prismlauncher.Launcher; -import org.prismlauncher.exception.ParseException; -import org.prismlauncher.utils.Parameters; public abstract class AbstractLauncher implements Launcher { - + private static final int DEFAULT_WINDOW_WIDTH = 854; private static final int DEFAULT_WINDOW_HEIGHT = 480; @@ -43,21 +44,21 @@ public abstract class AbstractLauncher implements Launcher { protected final String serverAddress, serverPort; protected final ClassLoader classLoader; - - public AbstractLauncher(Parameters params) { + + protected AbstractLauncher(Parameters params) { classLoader = ClassLoader.getSystemClassLoader(); - - mcParams = params.allSafe("param", new ArrayList()); - mainClass = params.firstSafe("mainClass", "net.minecraft.client.Minecraft"); - - serverAddress = params.firstSafe("serverAddress", null); - serverPort = params.firstSafe("serverPort", null); - - String windowParams = params.firstSafe("windowParams", null); - + + mcParams = params.getList("param", new ArrayList()); + mainClass = params.getString("mainClass", "net.minecraft.client.Minecraft"); + + serverAddress = params.getString("serverAddress", null); + serverPort = params.getString("serverPort", null); + + String windowParams = params.getString("windowParams", null); + if ("max".equals(windowParams) || windowParams == null) { maximize = windowParams != null; - + width = DEFAULT_WINDOW_WIDTH; height = DEFAULT_WINDOW_HEIGHT; } else { @@ -70,7 +71,7 @@ public abstract class AbstractLauncher implements Launcher { width = Integer.parseInt(windowParams.substring(0, byIndex)); height = Integer.parseInt(windowParams.substring(byIndex + 1)); return; - } catch(NumberFormatException pass) { + } catch (NumberFormatException ignored) { } } @@ -81,8 +82,8 @@ public abstract class AbstractLauncher implements Launcher { protected Class loadMain() throws ClassNotFoundException { return classLoader.loadClass(mainClass); } - - protected void loadAndInvokeMain() throws Throwable, ClassNotFoundException { + + protected void loadAndInvokeMain() throws Throwable { invokeMain(loadMain()); } diff --git a/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java similarity index 86% rename from libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java rename to libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java index 30a4dba79..181156c6d 100644 --- a/libraries/launcher/org/prismlauncher/impl/LegacyLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/LegacyLauncher.java @@ -13,7 +13,12 @@ * limitations under the License. */ -package org.prismlauncher.impl; +package org.prismlauncher.launcher.impl; + + +import org.prismlauncher.applet.LegacyFrame; +import org.prismlauncher.utils.LegacyUtils; +import org.prismlauncher.utils.Parameters; import java.applet.Applet; import java.io.File; @@ -26,10 +31,6 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import org.prismlauncher.applet.LegacyFrame; -import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.Utils; - @SuppressWarnings("removal") public final class LegacyLauncher extends AbstractLauncher { @@ -44,22 +45,22 @@ public final class LegacyLauncher extends AbstractLauncher { public LegacyLauncher(Parameters params) { super(params); - - user = params.first("userName"); - session = params.first("sessionId"); - title = params.firstSafe("windowTitle", "Minecraft"); - appletClass = params.firstSafe("appletClass", "net.minecraft.client.MinecraftApplet"); - - List traits = params.allSafe("traits", Collections.emptyList()); + + user = params.getString("userName"); + session = params.getString("sessionId"); + title = params.getString("windowTitle", "Minecraft"); + appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); + + List traits = params.getList("traits", Collections.emptyList()); noApplet = traits.contains("noapplet"); - + cwd = System.getProperty("user.dir"); } @Override public void launch() throws Throwable { Class main = loadMain(); - Field gameDirField = Utils.getMinecraftGameDirField(main); + Field gameDirField = LegacyUtils.getMinecraftGameDirField(main); if (gameDirField == null) { LOGGER.warning("Could not find Mineraft path field."); diff --git a/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java similarity index 97% rename from libraries/launcher/org/prismlauncher/impl/StandardLauncher.java rename to libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java index c651b060a..c1d33958a 100644 --- a/libraries/launcher/org/prismlauncher/impl/StandardLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/StandardLauncher.java @@ -13,7 +13,7 @@ * limitations under the License. */ -package org.prismlauncher.impl; +package org.prismlauncher.launcher.impl; import org.prismlauncher.utils.Parameters; diff --git a/libraries/launcher/org/prismlauncher/utils/Utils.java b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java similarity index 71% rename from libraries/launcher/org/prismlauncher/utils/Utils.java rename to libraries/launcher/org/prismlauncher/utils/LegacyUtils.java index 79f5367b6..7607d7314 100644 --- a/libraries/launcher/org/prismlauncher/utils/Utils.java +++ b/libraries/launcher/org/prismlauncher/utils/LegacyUtils.java @@ -16,34 +16,39 @@ package org.prismlauncher.utils; + import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -public final class Utils { - - private Utils() {} +public final class LegacyUtils { + + private LegacyUtils() { + } + /** * Finds a field that looks like a Minecraft base folder in a supplied class * * @param clazz the class to scan */ public static Field getMinecraftGameDirField(Class clazz) { - for (Field f : clazz.getDeclaredFields()) { + // Field we're looking for is always + // private static File obfuscatedName = null; + for (Field field : clazz.getDeclaredFields()) { // Has to be File - if (f.getType() != File.class) + if (field.getType() != File.class) continue; - + // And Private Static. - if (!Modifier.isStatic(f.getModifiers()) || !Modifier.isPrivate(f.getModifiers())) + if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isPrivate(field.getModifiers())) continue; - - return f; + + return field; } - + return null; } - + } diff --git a/libraries/launcher/org/prismlauncher/utils/Parameters.java b/libraries/launcher/org/prismlauncher/utils/Parameters.java index dcaba18d1..00b0701f0 100644 --- a/libraries/launcher/org/prismlauncher/utils/Parameters.java +++ b/libraries/launcher/org/prismlauncher/utils/Parameters.java @@ -39,39 +39,39 @@ public final class Parameters { params.add(value); } - public List all(String key) throws ParameterNotFoundException { + public List getList(String key) throws ParameterNotFoundException { List params = map.get(key); - + if (params == null) throw new ParameterNotFoundException(key); - + return params; } - - public List allSafe(String key, List def) { + + public List getList(String key, List def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params; } - - public String first(String key) throws ParameterNotFoundException { - List list = all(key); - + + public String getString(String key) throws ParameterNotFoundException { + List list = getList(key); + if (list.isEmpty()) throw new ParameterNotFoundException(key); - + return list.get(0); } - - public String firstSafe(String key, String def) { + + public String getString(String key, String def) { List params = map.get(key); - + if (params == null || params.isEmpty()) return def; - + return params.get(0); } From 99d9868116c14418cdcf5c033be7eed0d0cffd98 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 27 Oct 2022 20:12:39 -0400 Subject: [PATCH 0158/1149] Cleanup EntryPoint code - Don't return an int from listen(). An enum is preferred. - Make parseLine() static, and pass Parameters to it. Signed-off-by: solonovamax --- .../org/prismlauncher/EntryPoint.java | 103 ++++++++++-------- 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index 44e947b1a..b1464f594 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -52,6 +52,7 @@ package org.prismlauncher; + import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.LauncherFactory; @@ -64,102 +65,114 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; + public final class EntryPoint { - private static final Logger LOGGER = Logger.getLogger("EntryPoint"); - + private final Parameters params = new Parameters(); - + public static void main(String[] args) { EntryPoint listener = new EntryPoint(); - - int retCode = listener.listen(); - - if (retCode != 0) { - LOGGER.info("Exiting with " + retCode); - - System.exit(retCode); + + ExitCode exitCode = listener.listen(); + + if (exitCode != ExitCode.NORMAL) { + LOGGER.warning("Exiting with " + exitCode); + + System.exit(exitCode.numericalCode); } } - - private Action parseLine(String inData) throws ParseException { + + private static PreLaunchAction parseLine(String inData, Parameters params) throws ParseException { if (inData.isEmpty()) throw new ParseException("Unexpected empty string!"); - + String first = inData; String second = null; int splitPoint = inData.indexOf(' '); - + if (splitPoint != -1) { first = first.substring(0, splitPoint); second = inData.substring(splitPoint + 1); } - + switch (first) { case "launch": - return Action.LAUNCH; + return PreLaunchAction.LAUNCH; case "abort": - return Action.ABORT; + return PreLaunchAction.ABORT; default: if (second == null || second.isEmpty()) throw new ParseException("Error while parsing:" + inData); - + params.add(first, second); - - return Action.PROCEED; + + return PreLaunchAction.PROCEED; } } - - public int listen() { - Action action = Action.PROCEED; - + + public ExitCode listen() { + PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; + try (BufferedReader reader = new BufferedReader(new InputStreamReader( System.in, StandardCharsets.UTF_8 ))) { String line; - - while (action == Action.PROCEED) { + + while (preLaunchAction == PreLaunchAction.PROCEED) { if ((line = reader.readLine()) != null) { - action = parseLine(line); + preLaunchAction = parseLine(line, this.params); } else { - action = Action.ABORT; + preLaunchAction = PreLaunchAction.ABORT; } } } catch (IOException | ParseException e) { LOGGER.log(Level.SEVERE, "Launcher abort due to exception:", e); - - return 1; + + return ExitCode.ERROR; } - + // Main loop - if (action == Action.ABORT) { + if (preLaunchAction == PreLaunchAction.ABORT) { LOGGER.info("Launch aborted by the launcher."); - - return 1; + + return ExitCode.ERROR; } - + try { Launcher launcher = LauncherFactory.createLauncher(params); - + launcher.launch(); - - return 0; + + return ExitCode.NORMAL; } catch (IllegalArgumentException e) { LOGGER.log(Level.SEVERE, "Wrong argument.", e); - - return 1; + + return ExitCode.ERROR; } catch (Throwable e) { LOGGER.log(Level.SEVERE, "Exception caught from launcher.", e); - - return 1; + + return ExitCode.ERROR; } } - - private enum Action { + + private enum PreLaunchAction { PROCEED, LAUNCH, ABORT } - + + + private enum ExitCode { + NORMAL(0), + ERROR(1); + + private final int numericalCode; + + ExitCode(int numericalCode) { + this.numericalCode = numericalCode; + } + } + } From e5622ce824cf94074ced947ed7277886b2756ba9 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 27 Oct 2022 20:16:08 -0400 Subject: [PATCH 0159/1149] Code cleanup to net.minecraft.Launcher No code logic has been changed, only: - add @Override annotatons - change setVisible(boolean b) -> setVisible(boolean visible) - Change block commend on class -> javadoc comment Signed-off-by: solonovamax --- libraries/launcher/net/minecraft/Launcher.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index f9fd0a976..8928dbbe1 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -28,8 +28,9 @@ import java.util.Map; import java.util.TreeMap; -/* +/** * WARNING: This class is reflectively accessed by legacy Forge versions. + *

@@ -86,6 +89,12 @@ 12 + + true + + + false + From 30b266622c9457a825d38ba084c9391437a2c87a Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 22 Oct 2022 15:39:53 +0300 Subject: [PATCH 0206/1149] Add 'Create shortcut' button to instance toolbar Implemented on Windows only rn! Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 86 ++++++++++++++++++++++++++++++++++++++ launcher/ui/MainWindow.h | 2 + 2 files changed, 88 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 85b00b677..419bb9bd3 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -237,6 +237,7 @@ public: TranslatedAction actionLaunchInstanceOffline; TranslatedAction actionLaunchInstanceDemo; TranslatedAction actionExportInstance; + TranslatedAction actionCreateInstanceShortcut; QVector all_actions; LabeledToolButton *renameButton = nullptr; @@ -597,6 +598,7 @@ public: actionExportInstance->setEnabled(enabled); actionDeleteInstance->setEnabled(enabled); actionCopyInstance->setEnabled(enabled); + actionCreateInstanceShortcut->setEnabled(enabled); } void createStatusBar(QMainWindow *MainWindow) @@ -735,6 +737,14 @@ public: actionCopyInstance->setIcon(APPLICATION->getThemedIcon("copy")); all_actions.append(&actionCopyInstance); + actionCreateInstanceShortcut = TranslatedAction(MainWindow); + actionCreateInstanceShortcut->setObjectName(QStringLiteral("actionCreateInstanceShortcut")); + actionCreateInstanceShortcut.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Create shortcut")); + actionCreateInstanceShortcut.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Creates a shortcut on your desktop to launch the selected instance.")); + actionCreateInstanceShortcut->setShortcut(QKeySequence(tr("Ctrl+D"))); + //actionCreateInstanceShortcut->setIcon(APPLICATION->getThemedIcon("copy")); // TODO + all_actions.append(&actionCreateInstanceShortcut); + setInstanceActionsEnabled(false); } @@ -783,6 +793,8 @@ public: } } + instanceToolBar->addAction(actionCreateInstanceShortcut); + all_toolbars.append(&instanceToolBar); MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); } @@ -2075,6 +2087,80 @@ void MainWindow::on_actionKillInstance_triggered() } } +#ifdef Q_OS_WIN +#define WIN32_LEAN_AND_MEAN +#include "windows.h" +#include "winnls.h" +#include "shobjidl.h" +#include "objbase.h" +#include "objidl.h" +#include "shlguid.h" +#endif + +void MainWindow::on_actionCreateInstanceShortcut_triggered() +{ + if (m_selectedInstance) + { + auto desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + if (desktopDir.isEmpty()) { + // TODO come up with an alternative solution (open "save file" dialog) + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find desktop!")); + return; + } + +#if defined(Q_OS_WIN) + // Windows + WCHAR wsz[MAX_PATH]; + + // ...yes, you need to initialize the entire COM stack to make a shortcut in Windows. + // I hate it. + CoInitialize(nullptr); + + HRESULT hres; + IShellLink* psl; + + hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); + if (SUCCEEDED(hres)) + { + IPersistFile* ppf; + + QApplication::applicationFilePath().left(MAX_PATH - 1).toWCharArray(wsz); + psl->SetPath(wsz); + + wmemset(wsz, 0, MAX_PATH); + QStringLiteral("--launch %1").arg(m_selectedInstance->id()).left(MAX_PATH - 1).toWCharArray(wsz); + psl->SetArguments(wsz); + + // TODO set icon + + hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); + + if (SUCCEEDED(hres)) + { + wmemset(wsz, 0, MAX_PATH); + + desktopDir + .append('/') + .append(QStringLiteral("%1.lnk").arg(m_selectedInstance->name())) + .left(MAX_PATH - 1).toWCharArray(wsz); + + hres = ppf->Save(wsz, TRUE); + ppf->Release(); + } + psl->Release(); + } + + CoUninitialize(); +#elif defined(Q_OS_LINUX) + // Linux +#elif defined(Q_OS_MACOS) + // macOSX + // TODO actually write this path + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOSX yet!")); +#endif + } +} + void MainWindow::taskEnd() { QObject *sender = QObject::sender(); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index f9d1f1c73..b23ba1460 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -157,6 +157,8 @@ private slots: void on_actionEditInstance_triggered(); + void on_actionCreateInstanceShortcut_triggered(); + void taskEnd(); /** From 70768189bae0f4d5cfb24b57347cf7207dfc5496 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 22 Oct 2022 17:56:27 +0300 Subject: [PATCH 0207/1149] Windows: implement FS::createShortcut Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 145 +++++++++++++++++++++++++++++++------ launcher/FileSystem.h | 5 ++ launcher/ui/MainWindow.cpp | 88 +++++++--------------- 3 files changed, 154 insertions(+), 84 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4a8f4bd3d..90f0313f6 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -49,6 +49,7 @@ #include "StringUtils.h" #if defined Q_OS_WIN32 +#define WIN32_LEAN_AND_MEAN #include #include #include @@ -339,12 +340,12 @@ QString getDesktopDir() } // Cross-platform Shortcut creation -bool createShortCut(QString location, QString dest, QStringList args, QString name, QString icon) +bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) { #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - location = PathCombine(location, name + ".desktop"); + destination = PathCombine(destination, name + ".desktop"); - QFile f(location); + QFile f(destination); f.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream stream(&f); @@ -356,10 +357,13 @@ bool createShortCut(QString location, QString dest, QStringList args, QString na << "\n"; stream << "Type=Application" << "\n"; - stream << "TryExec=" << dest.toLocal8Bit() << "\n"; - stream << "Exec=" << dest.toLocal8Bit() << argstring.toLocal8Bit() << "\n"; + stream << "TryExec=" << target.toLocal8Bit() << "\n"; + stream << "Exec=" << target.toLocal8Bit() << argstring.toLocal8Bit() << "\n"; stream << "Name=" << name.toLocal8Bit() << "\n"; - stream << "Icon=" << icon.toLocal8Bit() << "\n"; + if (!icon.isEmpty()) + { + stream << "Icon=" << icon.toLocal8Bit() << "\n"; + } stream.flush(); f.close(); @@ -368,24 +372,121 @@ bool createShortCut(QString location, QString dest, QStringList args, QString na return true; #elif defined Q_OS_WIN - // TODO: Fix - // QFile file(PathCombine(location, name + ".lnk")); - // WCHAR *file_w; - // WCHAR *dest_w; - // WCHAR *args_w; - // file.fileName().toWCharArray(file_w); - // dest.toWCharArray(dest_w); + QFileInfo targetInfo(target); - // QString argStr; - // for (int i = 0; i < args.count(); i++) - // { - // argStr.append(args[i]); - // argStr.append(" "); - // } - // argStr.toWCharArray(args_w); + if (!targetInfo.exists()) + { + qWarning() << "Target file does not exist!"; + return false; + } - // return SUCCEEDED(CreateLink(file_w, dest_w, args_w)); - return false; + target = targetInfo.absoluteFilePath(); + + if (target.length() >= MAX_PATH) + { + qWarning() << "Target file path is too long!"; + return false; + } + + if (!icon.isEmpty() && icon.length() >= MAX_PATH) + { + qWarning() << "Icon path is too long!"; + return false; + } + + destination += ".lnk"; + + if (destination.length() >= MAX_PATH) + { + qWarning() << "Destination path is too long!"; + return false; + } + + QString argStr; + int argCount = args.count(); + for (int i = 0; i < argCount; i++) + { + if (args[i].contains(' ')) + { + argStr.append('"').append(args[i]).append('"'); + } + else + { + argStr.append(args[i]); + } + + if (i < argCount - 1) + { + argStr.append(" "); + } + } + + if (argStr.length() >= MAX_PATH) + { + qWarning() << "Arguments string is too long!"; + return false; + } + + WCHAR wsz[MAX_PATH]; + + // ...yes, you need to initialize the entire COM stack to make a shortcut in Windows + CoInitialize(nullptr); + + HRESULT hres; + IShellLink* psl; + + hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); + if (SUCCEEDED(hres)) + { + wmemset(wsz, 0, MAX_PATH); + target.toWCharArray(wsz); + psl->SetPath(wsz); + + wmemset(wsz, 0, MAX_PATH); + argStr.toWCharArray(wsz); + psl->SetArguments(wsz); + + wmemset(wsz, 0, MAX_PATH); + targetInfo.absolutePath().toWCharArray(wsz); + psl->SetWorkingDirectory(wsz); + + if (!icon.isEmpty()) + { + wmemset(wsz, 0, MAX_PATH); + icon.toWCharArray(wsz); + psl->SetIconLocation(wsz, 0); + } + + IPersistFile* ppf; + hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); + if (SUCCEEDED(hres)) + { + wmemset(wsz, 0, MAX_PATH); + destination.toWCharArray(wsz); + hres = ppf->Save(wsz, TRUE); + if (FAILED(hres)) + { + qWarning() << "IPresistFile->Save() failed"; + qWarning() << "hres = " << hres; + } + ppf->Release(); + } + else + { + qWarning() << "Failed to query IPersistFile interface from IShellLink instance"; + qWarning() << "hres = " << hres; + } + psl->Release(); + } + else + { + qWarning() << "Failed to create IShellLink instance"; + qWarning() << "hres = " << hres; + } + + CoUninitialize(); + + return SUCCEEDED(hres); #else qWarning("Desktop Shortcuts not supported on your platform!"); return false; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index b7e175fdf..23cc575b8 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -156,4 +156,9 @@ QString getDesktopDir(); // Overrides one folder with the contents of another, preserving items exclusive to the first folder // Equivalent to doing QDir::rename, but allowing for overrides bool overrideFolder(QString overwritten_path, QString override_path); + +/** + * Creates a shortcut to the specified target file at the specified destination path. + */ +bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon); } diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 419bb9bd3..1ad9713a9 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -39,6 +39,7 @@ #include "Application.h" #include "BuildConfig.h" +#include "FileSystem.h" #include "MainWindow.h" @@ -739,9 +740,9 @@ public: actionCreateInstanceShortcut = TranslatedAction(MainWindow); actionCreateInstanceShortcut->setObjectName(QStringLiteral("actionCreateInstanceShortcut")); - actionCreateInstanceShortcut.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Create shortcut")); + actionCreateInstanceShortcut.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Create Shortcut")); actionCreateInstanceShortcut.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Creates a shortcut on your desktop to launch the selected instance.")); - actionCreateInstanceShortcut->setShortcut(QKeySequence(tr("Ctrl+D"))); + //actionCreateInstanceShortcut->setShortcut(QKeySequence(tr("Ctrl+D"))); // TODO //actionCreateInstanceShortcut->setIcon(APPLICATION->getThemedIcon("copy")); // TODO all_actions.append(&actionCreateInstanceShortcut); @@ -793,7 +794,7 @@ public: } } - instanceToolBar->addAction(actionCreateInstanceShortcut); + instanceToolBar->addAction(actionCreateInstanceShortcut); // TODO find better position for this all_toolbars.append(&instanceToolBar); MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); @@ -2087,76 +2088,39 @@ void MainWindow::on_actionKillInstance_triggered() } } -#ifdef Q_OS_WIN -#define WIN32_LEAN_AND_MEAN -#include "windows.h" -#include "winnls.h" -#include "shobjidl.h" -#include "objbase.h" -#include "objidl.h" -#include "shlguid.h" -#endif - void MainWindow::on_actionCreateInstanceShortcut_triggered() { if (m_selectedInstance) { - auto desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); - if (desktopDir.isEmpty()) { + auto desktopPath = FS::getDesktopDir(); + if (desktopPath.isEmpty()) { // TODO come up with an alternative solution (open "save file" dialog) - QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find desktop!")); + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Couldn't find desktop?!")); return; } -#if defined(Q_OS_WIN) - // Windows - WCHAR wsz[MAX_PATH]; - - // ...yes, you need to initialize the entire COM stack to make a shortcut in Windows. - // I hate it. - CoInitialize(nullptr); - - HRESULT hres; - IShellLink* psl; - - hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); - if (SUCCEEDED(hres)) - { - IPersistFile* ppf; - - QApplication::applicationFilePath().left(MAX_PATH - 1).toWCharArray(wsz); - psl->SetPath(wsz); - - wmemset(wsz, 0, MAX_PATH); - QStringLiteral("--launch %1").arg(m_selectedInstance->id()).left(MAX_PATH - 1).toWCharArray(wsz); - psl->SetArguments(wsz); - - // TODO set icon - - hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); - - if (SUCCEEDED(hres)) - { - wmemset(wsz, 0, MAX_PATH); - - desktopDir - .append('/') - .append(QStringLiteral("%1.lnk").arg(m_selectedInstance->name())) - .left(MAX_PATH - 1).toWCharArray(wsz); - - hres = ppf->Save(wsz, TRUE); - ppf->Release(); - } - psl->Release(); - } - - CoUninitialize(); -#elif defined(Q_OS_LINUX) - // Linux -#elif defined(Q_OS_MACOS) +#if defined(Q_OS_MACOS) // macOSX // TODO actually write this path QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOSX yet!")); +#else + QString iconPath; + +#if defined(Q_OS_WIN) + // TODO + // need to convert icon to ICO format and save it somewhere... + iconPath = ""; +#elif defined(Q_OS_UNIX) + iconPath = ""; // TODO get instance icon path +#endif + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), + QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), iconPath)) { + QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); + } + else + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + } #endif } } From f12117c532de4bdbf74968cf173d1c288a7e426a Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Tue, 25 Oct 2022 17:37:30 +0300 Subject: [PATCH 0208/1149] [UNTESTED] Linux: add icons to shortcuts Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 1ad9713a9..8f2196f2f 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2104,6 +2104,8 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // TODO actually write this path QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOSX yet!")); #else + auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); + QString iconPath; #if defined(Q_OS_WIN) @@ -2111,7 +2113,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // need to convert icon to ICO format and save it somewhere... iconPath = ""; #elif defined(Q_OS_UNIX) - iconPath = ""; // TODO get instance icon path + iconPath = icon->getFilePath(); #endif if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), iconPath)) { From 6ae3b183fdb1f6e4887617fc7230d52c803e63fd Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Tue, 25 Oct 2022 21:18:53 +0300 Subject: [PATCH 0209/1149] Remove unnessecary "is defined" check Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 8f2196f2f..34c51ec67 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2112,7 +2112,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // TODO // need to convert icon to ICO format and save it somewhere... iconPath = ""; -#elif defined(Q_OS_UNIX) +#else iconPath = icon->getFilePath(); #endif if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), From b83f9be1bd65f784bbed603e550fbe9f650b0367 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Fri, 28 Oct 2022 15:46:54 +0300 Subject: [PATCH 0210/1149] Add missing fail check for CoInitialize Add a few comments Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 90f0313f6..587753a0e 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -427,14 +427,21 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri return false; } + HRESULT hres; + + // ...yes, you need to initialize the entire COM stack just to make a shortcut + hres = CoInitialize(nullptr); + if (FAILED(hres)) + { + qWarning() << "Failed to initialize COM!"; + return false; + } + WCHAR wsz[MAX_PATH]; - // ...yes, you need to initialize the entire COM stack to make a shortcut in Windows - CoInitialize(nullptr); - - HRESULT hres; IShellLink* psl; + // create an IShellLink instance - this stores the shortcut's attributes hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); if (SUCCEEDED(hres)) { @@ -448,7 +455,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri wmemset(wsz, 0, MAX_PATH); targetInfo.absolutePath().toWCharArray(wsz); - psl->SetWorkingDirectory(wsz); + psl->SetWorkingDirectory(wsz); // "Starts in" attribute if (!icon.isEmpty()) { @@ -457,6 +464,8 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri psl->SetIconLocation(wsz, 0); } + // query an IPersistFile interface from our IShellLink instance + // this is the interface that will actually let us save the shortcut to disk! IPersistFile* ppf; hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); if (SUCCEEDED(hres)) @@ -484,6 +493,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri qWarning() << "hres = " << hres; } + // go away COM, nobody likes you CoUninitialize(); return SUCCEEDED(hres); From 4d4dfab38869bca82626e171336cbe8f7c89a1a1 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Fri, 28 Oct 2022 17:42:29 +0300 Subject: [PATCH 0211/1149] Windows: add instance icon to shortcut Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 34c51ec67..9743c8224 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2107,11 +2107,28 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); QString iconPath; + bool iconGenerated = false; #if defined(Q_OS_WIN) - // TODO - // need to convert icon to ICO format and save it somewhere... - iconPath = ""; + iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); + + QFile iconFile(iconPath); + if (!iconFile.open(QFile::WriteOnly)) + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + return; + } + + if (!icon->icon().pixmap(64, 64).save(&iconFile, "ICO")) + { + iconFile.close(); + iconFile.remove(); + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + return; + } + + iconFile.close(); + iconGenerated = true; #else iconPath = icon->getFilePath(); #endif @@ -2121,6 +2138,10 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } else { + if (iconGenerated) + { + QFile::remove(iconPath); + } QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } #endif From cc5f82bfac162becf55dfcb015f55be3c833bc32 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Fri, 28 Oct 2022 21:11:51 +0300 Subject: [PATCH 0212/1149] Windows: fix window icon being replaced Dunno why it happens but the fix was literally 2 lines, so whatever I guess Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 9743c8224..a87da3621 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2112,6 +2112,10 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() #if defined(Q_OS_WIN) iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); + // part of fix for weird bug involving the window icon being replaced + // dunno why it happens, but this 2-line fix seems to be enough, so w/e + auto appIcon = QGuiApplication::windowIcon(); + QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) { @@ -2129,6 +2133,9 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() iconFile.close(); iconGenerated = true; + + // restore original window icon + QGuiApplication::setWindowIcon(appIcon); #else iconPath = icon->getFilePath(); #endif From 487e352642c4430f57643b53a8e9cd3d04edfeb8 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Fri, 4 Nov 2022 22:04:42 +0200 Subject: [PATCH 0213/1149] Fix nested #if directive Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index a87da3621..15fdd6f2c 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2103,7 +2103,8 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // macOSX // TODO actually write this path QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOSX yet!")); -#else + return; +#endif auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); QString iconPath; @@ -2151,7 +2152,6 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } -#endif } } From 6043444e4e11801e45ad888182c99d6f4e4e5ddc Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:02:40 +0200 Subject: [PATCH 0214/1149] Apply suggestions from code review Co-authored-by: Sefa Eyeoglu Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 2 +- launcher/ui/MainWindow.cpp | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 587753a0e..5a5390935 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -342,7 +342,7 @@ QString getDesktopDir() // Cross-platform Shortcut creation bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) { -#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) +#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) destination = PathCombine(destination, name + ".desktop"); QFile f(destination); diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 15fdd6f2c..cd3c1b5b0 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2099,23 +2099,21 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() return; } -#if defined(Q_OS_MACOS) - // macOSX - // TODO actually write this path - QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOSX yet!")); - return; +#ifdef Q_OS_MACOS + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOS yet!")); + return; #endif auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); QString iconPath; bool iconGenerated = false; -#if defined(Q_OS_WIN) +#ifdef Q_OS_WIN iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); // part of fix for weird bug involving the window icon being replaced // dunno why it happens, but this 2-line fix seems to be enough, so w/e - auto appIcon = QGuiApplication::windowIcon(); + auto appIcon = Application::getThemedIcon("logo"); QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) From 9be48f1dc44dc764d2131c559780624908ff636d Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:55:13 +0200 Subject: [PATCH 0215/1149] this ain't static, falco Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index cd3c1b5b0..ff1982ce8 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2113,7 +2113,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // part of fix for weird bug involving the window icon being replaced // dunno why it happens, but this 2-line fix seems to be enough, so w/e - auto appIcon = Application::getThemedIcon("logo"); + auto appIcon = APPLICATION->getThemedIcon("logo"); QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) @@ -2121,20 +2121,22 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); return; } + bool success = icon->icon().pixmap(64, 64).save(&iconFile, "ICO"); + iconFile.close(); - if (!icon->icon().pixmap(64, 64).save(&iconFile, "ICO")) + // restore original window icon + QGuiApplication::setWindowIcon(appIcon); + + if (success) + { + iconGenerated = true; + } + else { - iconFile.close(); iconFile.remove(); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); return; } - - iconFile.close(); - iconGenerated = true; - - // restore original window icon - QGuiApplication::setWindowIcon(appIcon); #else iconPath = icon->getFilePath(); #endif From dbe0553b4a6100d8269f749cc4eb372e5a30cb3b Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:56:46 +0200 Subject: [PATCH 0216/1149] Move addAction call above left-align loop Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index ff1982ce8..0a846b59b 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -784,6 +784,8 @@ public: instanceToolBar->addAction(actionCopyInstance); instanceToolBar->addAction(actionDeleteInstance); + instanceToolBar->addAction(actionCreateInstanceShortcut); // TODO find better position for this + QLayout * lay = instanceToolBar->layout(); for(int i = 0; i < lay->count(); i++) { @@ -794,8 +796,6 @@ public: } } - instanceToolBar->addAction(actionCreateInstanceShortcut); // TODO find better position for this - all_toolbars.append(&instanceToolBar); MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); } From 7e5076b06891f28c1b2e27befd33005d400c49c9 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:13:59 +0200 Subject: [PATCH 0217/1149] Linux: fix path shortcut is written to Co-authored-by: flow Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 5a5390935..ddd1a6e55 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -343,7 +343,7 @@ QString getDesktopDir() bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) { #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) - destination = PathCombine(destination, name + ".desktop"); + destination += ".desktop"; QFile f(destination); f.open(QIODevice::WriteOnly | QIODevice::Text); From f7d7d76ee879c3bdd539e5c8c956cbd2c7328bf0 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:36:49 +0200 Subject: [PATCH 0218/1149] Mac: now supported! [UNTESTED] Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 26 +++++++++++++++++++++++++- launcher/ui/MainWindow.cpp | 15 ++++++++++++++- libraries/tomlplusplus | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index ddd1a6e55..221395bed 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -342,7 +342,31 @@ QString getDesktopDir() // Cross-platform Shortcut creation bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) { -#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) +#if defined(Q_OS_MACOS) + destination += ".sh"; + + QFile f(destination); + f.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream stream(&f); + + QString argstring; + if (!args.empty()) + argstring = " \"" + args.join("\" \"") + "\""; + + stream << "#!/bin/bash" + << "\n"; + stream << target + << " " + << argstring + << "\n"; + + stream.flush(); + f.close(); + + f.setPermissions(f.permissions() | QFileDevice::ExeOwner | QFileDevice::ExeGroup | QFileDevice::ExeOther); + + return true; +#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) destination += ".desktop"; QFile f(destination); diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 0a846b59b..02f602335 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2100,7 +2100,20 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } #ifdef Q_OS_MACOS - QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on macOS yet!")); + // handle macOS bundle weirdness + QFileInfo appFileInfo(QApplication::applicationFilePath())); + QString appName = appFileInfo.baseName(); + QString exeName = FS::PathCombine(appFileInfo.filePath(), "Contents/MacOS/" + appName); + + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), + exeName, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { + QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); + } + else + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + } + return; #endif auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); diff --git a/libraries/tomlplusplus b/libraries/tomlplusplus index cc741c9f5..4b166b69f 160000 --- a/libraries/tomlplusplus +++ b/libraries/tomlplusplus @@ -1 +1 @@ -Subproject commit cc741c9f5f2a62856a2a2e9e275f61eb0591c09c +Subproject commit 4b166b69f28e70a416a1a04a98f365d2aeb90de8 From b813c867b505f0c1ec8125fde9916d6252cd4485 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:41:52 +0200 Subject: [PATCH 0219/1149] refactor #if checks Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 2 +- launcher/ui/MainWindow.cpp | 46 ++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 221395bed..7a1861e73 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -395,7 +395,7 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri f.setPermissions(f.permissions() | QFileDevice::ExeOwner | QFileDevice::ExeGroup | QFileDevice::ExeOther); return true; -#elif defined Q_OS_WIN +#elif defined(Q_OS_WIN) QFileInfo targetInfo(target); if (!targetInfo.exists()) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 02f602335..8e8a7c56a 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2099,13 +2099,13 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() return; } -#ifdef Q_OS_MACOS +#if defined(Q_OS_MACOS) // handle macOS bundle weirdness QFileInfo appFileInfo(QApplication::applicationFilePath())); QString appName = appFileInfo.baseName(); QString exeName = FS::PathCombine(appFileInfo.filePath(), "Contents/MacOS/" + appName); - if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), exeName, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } @@ -2113,17 +2113,22 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() { QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } - - return; -#endif +#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); - - QString iconPath; - bool iconGenerated = false; - -#ifdef Q_OS_WIN - iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); - + + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), + QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), icon->getFilePath())) { + QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); + } + else + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + } +#elif defined(Q_OS_WIN) + auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); + + QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); + // part of fix for weird bug involving the window icon being replaced // dunno why it happens, but this 2-line fix seems to be enough, so w/e auto appIcon = APPLICATION->getThemedIcon("logo"); @@ -2140,31 +2145,24 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() // restore original window icon QGuiApplication::setWindowIcon(appIcon); - if (success) - { - iconGenerated = true; - } - else + if (!success) { iconFile.remove(); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); return; } -#else - iconPath = icon->getFilePath(); -#endif + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), iconPath)) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } else { - if (iconGenerated) - { - QFile::remove(iconPath); - } QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } +#else + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Not supported on your platform!")); +#endif } } From 45ce72593ac29e54311219e71d47b044eda14b14 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:43:58 +0200 Subject: [PATCH 0220/1149] Windows: remove icon if shortcut creation fails Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 8e8a7c56a..3f99ac99d 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2158,6 +2158,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } else { + iconFile.remove(); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } #else From 5322155b19e68b44e879512cf46ee152045dc1b1 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:48:21 +0200 Subject: [PATCH 0221/1149] Mac: fix build Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 3f99ac99d..aedd9e4f5 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2101,7 +2101,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() #if defined(Q_OS_MACOS) // handle macOS bundle weirdness - QFileInfo appFileInfo(QApplication::applicationFilePath())); + QFileInfo appFileInfo(QApplication::applicationFilePath()); QString appName = appFileInfo.baseName(); QString exeName = FS::PathCombine(appFileInfo.filePath(), "Contents/MacOS/" + appName); From ddfb449b28fb24f1c3e4ed3802ee4415206f96f1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 20:01:39 +0200 Subject: [PATCH 0222/1149] fix: remove PolyMC data paths Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 45cd94227..e2fdcd631 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -301,22 +301,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) dataPath = foo.absolutePath(); adjustedBy = "Persistent data path"; - QDir polymcData(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), "PolyMC")); - if (polymcData.exists()) { - dataPath = polymcData.absolutePath(); - adjustedBy = "PolyMC data path"; - } - -#ifdef Q_OS_LINUX - // TODO: this should be removed in a future version - // TODO: provide a migration path similar to macOS migration - QDir bar(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation), "polymc")); - if (bar.exists()) { - dataPath = bar.absolutePath(); - adjustedBy = "Legacy data path"; - } -#endif - #ifndef Q_OS_MACOS if (QFile::exists(FS::PathCombine(m_rootPath, "portable.txt"))) { dataPath = m_rootPath; From e048bce13ea4bd56ef96ba7a1a4699142d09600a Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 23:25:14 +0200 Subject: [PATCH 0223/1149] refactor: allow copy operation with whitelist Signed-off-by: Sefa Eyeoglu --- launcher/FileSystem.cpp | 2 +- launcher/FileSystem.h | 12 +++++++++--- launcher/InstanceCopyTask.cpp | 2 +- tests/FileSystem_test.cpp | 37 ++++++++++++++++++++++++++++++++++- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 4a8f4bd3d..a3b9fe1f9 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -174,7 +174,7 @@ bool copy::operator()(const QString& offset) // Function that'll do the actual copying auto copy_file = [&](QString src_path, QString relative_dst_path) { - if (m_blacklist && m_blacklist->matches(relative_dst_path)) + if (m_matcher && (m_matcher->matches(relative_dst_path) == !m_whitelist)) return; auto dst_path = PathCombine(dst, relative_dst_path); diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index b7e175fdf..e239984ea 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -88,9 +88,14 @@ class copy { m_followSymlinks = follow; return *this; } - copy& blacklist(const IPathMatcher* filter) + copy& matcher(const IPathMatcher* filter) { - m_blacklist = filter; + m_matcher = filter; + return *this; + } + copy& whitelist(bool whitelist) + { + m_whitelist = whitelist; return *this; } bool operator()() { return operator()(QString()); } @@ -100,7 +105,8 @@ class copy { private: bool m_followSymlinks = true; - const IPathMatcher* m_blacklist = nullptr; + const IPathMatcher* m_matcher = nullptr; + bool m_whitelist = false; QDir m_src; QDir m_dst; }; diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index a4ea947d2..fb1183533 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -26,7 +26,7 @@ void InstanceCopyTask::executeTask() setStatus(tr("Copying instance %1").arg(m_origInstance->name())); FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath); - folderCopy.followSymlinks(false).blacklist(m_matcher.get()); + folderCopy.followSymlinks(false).matcher(m_matcher.get()); m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), folderCopy); connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &InstanceCopyTask::copyFinished); diff --git a/tests/FileSystem_test.cpp b/tests/FileSystem_test.cpp index 21270f6f6..3a5c38d04 100644 --- a/tests/FileSystem_test.cpp +++ b/tests/FileSystem_test.cpp @@ -126,7 +126,7 @@ slots: qDebug() << tempDir.path(); qDebug() << target_dir.path(); FS::copy c(folder, target_dir.path()); - c.blacklist(new RegexpMatcher("[.]?mcmeta")); + c.matcher(new RegexpMatcher("[.]?mcmeta")); c(); for(auto entry: target_dir.entryList()) @@ -147,6 +147,41 @@ slots: f(); } + void test_copy_with_whitelist() + { + QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder"); + auto f = [&folder]() + { + QTemporaryDir tempDir; + tempDir.setAutoRemove(true); + qDebug() << "From:" << folder << "To:" << tempDir.path(); + + QDir target_dir(FS::PathCombine(tempDir.path(), "test_folder")); + qDebug() << tempDir.path(); + qDebug() << target_dir.path(); + FS::copy c(folder, target_dir.path()); + c.matcher(new RegexpMatcher("[.]?mcmeta")); + c.whitelist(true); + c(); + + for(auto entry: target_dir.entryList()) + { + qDebug() << entry; + } + QVERIFY(target_dir.entryList().contains("pack.mcmeta")); + QVERIFY(!target_dir.entryList().contains("assets")); + }; + + // first try variant without trailing / + QVERIFY(!folder.endsWith('/')); + f(); + + // then variant with trailing / + folder.append('/'); + QVERIFY(folder.endsWith('/')); + f(); + } + void test_copy_with_dot_hidden() { QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder"); From 15aaff7c1ce8d709c444d891bf640ee39494d10e Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 23:36:47 +0200 Subject: [PATCH 0224/1149] feat: add dryRun to copy operation Signed-off-by: Sefa Eyeoglu --- launcher/FileSystem.cpp | 10 ++++++---- launcher/FileSystem.h | 18 ++++++++++++++---- launcher/InstanceCopyTask.cpp | 4 +++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index a3b9fe1f9..06691fbf6 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -152,9 +152,10 @@ bool ensureFolderPathExists(QString foldernamepath) /// @brief Copies a directory and it's contents from src to dest /// @param offset subdirectory form src to copy to dest /// @return if there was an error during the filecopy -bool copy::operator()(const QString& offset) +bool copy::operator()(const QString& offset, bool dryRun) { using copy_opts = fs::copy_options; + m_copied = 0; // reset counter // NOTE always deep copy on windows. the alternatives are too messy. #if defined Q_OS_WIN32 @@ -178,9 +179,10 @@ bool copy::operator()(const QString& offset) return; auto dst_path = PathCombine(dst, relative_dst_path); - ensureFilePathExists(dst_path); - - fs::copy(StringUtils::toStdString(src_path), StringUtils::toStdString(dst_path), opt, err); + if (!dryRun) { + ensureFilePathExists(dst_path); + fs::copy(StringUtils::toStdString(src_path), StringUtils::toStdString(dst_path), opt, err); + } if (err) { qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); qDebug() << "Source file:" << src_path; diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h index e239984ea..a9a81123a 100644 --- a/launcher/FileSystem.h +++ b/launcher/FileSystem.h @@ -40,6 +40,7 @@ #include #include +#include namespace FS { @@ -76,9 +77,10 @@ bool ensureFilePathExists(QString filenamepath); bool ensureFolderPathExists(QString filenamepath); /// @brief Copies a directory and it's contents from src to dest -class copy { +class copy : public QObject { + Q_OBJECT public: - copy(const QString& src, const QString& dst) + copy(const QString& src, const QString& dst, QObject* parent = nullptr) : QObject(parent) { m_src.setPath(src); m_dst.setPath(dst); @@ -98,10 +100,17 @@ class copy { m_whitelist = whitelist; return *this; } - bool operator()() { return operator()(QString()); } + + bool operator()(bool dryRun = false) { return operator()(QString(), dryRun); } + + int totalCopied() { return m_copied; } + + signals: + void fileCopied(const QString& relativeName); + // TODO: maybe add a "shouldCopy" signal in the future? private: - bool operator()(const QString& offset); + bool operator()(const QString& offset, bool dryRun = false); private: bool m_followSymlinks = true; @@ -109,6 +118,7 @@ class copy { bool m_whitelist = false; QDir m_src; QDir m_dst; + int m_copied; }; /** diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp index fb1183533..0a83ed9ce 100644 --- a/launcher/InstanceCopyTask.cpp +++ b/launcher/InstanceCopyTask.cpp @@ -28,7 +28,9 @@ void InstanceCopyTask::executeTask() FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath); folderCopy.followSymlinks(false).matcher(m_matcher.get()); - m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), folderCopy); + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&folderCopy]{ + return folderCopy(); + }); connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &InstanceCopyTask::copyFinished); connect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &InstanceCopyTask::copyAborted); m_copyFutureWatcher.setFuture(m_copyFuture); From bd7065eece443de59adbe47dd7d9bd16e1d35ff5 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 23 Oct 2022 00:44:57 +0200 Subject: [PATCH 0225/1149] feat: add SimplePrefixMatcher Signed-off-by: Sefa Eyeoglu --- launcher/CMakeLists.txt | 1 + launcher/pathmatcher/SimplePrefixMatcher.h | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 launcher/pathmatcher/SimplePrefixMatcher.h diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8db934298..45d197efe 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -97,6 +97,7 @@ set(PATHMATCHER_SOURCES pathmatcher/IPathMatcher.h pathmatcher/MultiMatcher.h pathmatcher/RegexpMatcher.h + pathmatcher/SimplePrefixMatcher.h ) set(NET_SOURCES diff --git a/launcher/pathmatcher/SimplePrefixMatcher.h b/launcher/pathmatcher/SimplePrefixMatcher.h new file mode 100644 index 000000000..191d010cb --- /dev/null +++ b/launcher/pathmatcher/SimplePrefixMatcher.h @@ -0,0 +1,21 @@ +#include +#include "IPathMatcher.h" + +class SimplePrefixMatcher : public IPathMatcher { + public: + virtual ~SimplePrefixMatcher(){}; + SimplePrefixMatcher(const QString& prefix) + { + m_prefix = prefix; + m_isPrefix = prefix.endsWith('/'); + } + + virtual bool matches(const QString& string) const override + { + if (m_isPrefix) + return string.startsWith(m_prefix); + return string == m_prefix; + } + QString m_prefix; + bool m_isPrefix = false; +}; From 086304f7f24e70bfa35b26a7406930b0840f699b Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 23 Oct 2022 01:45:32 +0200 Subject: [PATCH 0226/1149] feat: add initial Migration dialog Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 99 ++++++++++++++++++++++++++++++++++ launcher/Application.h | 1 + launcher/CMakeLists.txt | 2 + launcher/DataMigrationTask.cpp | 79 +++++++++++++++++++++++++++ launcher/DataMigrationTask.h | 38 +++++++++++++ 5 files changed, 219 insertions(+) create mode 100644 launcher/DataMigrationTask.cpp create mode 100644 launcher/DataMigrationTask.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index e2fdcd631..2a7d6f220 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -38,10 +38,14 @@ #include "Application.h" #include "BuildConfig.h" +#include "DataMigrationTask.h" #include "net/PasteUpload.h" +#include "pathmatcher/MultiMatcher.h" +#include "pathmatcher/SimplePrefixMatcher.h" #include "ui/MainWindow.h" #include "ui/InstanceWindow.h" +#include "ui/dialogs/ProgressDialog.h" #include "ui/instanceview/AccessibleInstanceView.h" #include "ui/pages/BasePageProvider.h" @@ -423,6 +427,15 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) qDebug() << "<> Log initialized."; } + { + bool migrated = false; + + if (!migrated) + migrated = handleDataMigration(dataPath, FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), "../../PolyMC"), "PolyMC", "polymc.cfg"); + if (!migrated) + migrated = handleDataMigration(dataPath, FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), "../../multimc"), "MultiMC", "multimc.cfg"); + } + { qDebug() << BuildConfig.LAUNCHER_DISPLAYNAME << ", (c) 2013-2021 " << BuildConfig.LAUNCHER_COPYRIGHT; @@ -1589,3 +1602,89 @@ int Application::suitableMaxMem() return maxMemoryAlloc; } + +bool Application::handleDataMigration(const QString& currentData, + const QString& oldData, + const QString& name, + const QString& configFile) const +{ + QString nomigratePath = FS::PathCombine(oldData, BuildConfig.LAUNCHER_NAME + "_nomigrate.txt"); + QStringList configPaths = { FS::PathCombine(oldData, configFile), FS::PathCombine(oldData, BuildConfig.LAUNCHER_CONFIGFILE) }; + + QDir dir; // helper for QDir::exists + QLocale locale; + + // Is there a valid config at the old location? + bool configExists = false; + for (QString configPath : configPaths) { + configExists |= QFileInfo::exists(configPath); + } + + if (!configExists || QFileInfo::exists(nomigratePath)) { + qDebug() << "<> No migration needed from" << name; + return false; + } + + QString message; + bool currentExists = QFileInfo::exists(FS::PathCombine(currentData, BuildConfig.LAUNCHER_CONFIGFILE)); + + if (currentExists) { + message = tr("Old data from %1 was found, but you already have existing data for %2. Sadly you will need to migrate yourself. Do " + "you want to be reminded of the pending data migration next time you start %2?") + .arg(name, BuildConfig.LAUNCHER_DISPLAYNAME); + } else { + message = tr("It looks like you used %1 before. Do you want to migrate your data to the new location of %2?") + .arg(name, BuildConfig.LAUNCHER_DISPLAYNAME); + + QFileInfo logInfo(FS::PathCombine(oldData, name + "-0.log")); + if (logInfo.exists()) { + QString lastModified = logInfo.lastModified().toString(locale.dateFormat()); + message = tr("It looks like you used %1 on %2 before. Do you want to migrate your data to the new location of %3?") + .arg(name, lastModified, BuildConfig.LAUNCHER_DISPLAYNAME); + } + } + + QMessageBox::StandardButton askMoveDialogue = + QMessageBox::question(nullptr, BuildConfig.LAUNCHER_DISPLAYNAME, message, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + + auto setDoNotMigrate = [&nomigratePath] { + QFile file(nomigratePath); + file.open(QIODevice::WriteOnly); + }; + + // create no-migrate file if user doesn't want to migrate + if (askMoveDialogue != QMessageBox::Yes) { + qDebug() << "<> Migration declined for" << name; + setDoNotMigrate(); + return currentExists; // cancel further migrations, if we already have a data directory + } + + if (!currentExists) { + // Migrate! + auto matcher = std::make_shared(); + matcher->add(std::make_shared(configFile)); + matcher->add(std::make_shared( + BuildConfig.LAUNCHER_CONFIGFILE)); // it's possible that we already used that directory before + matcher->add(std::make_shared("accounts.json")); + matcher->add(std::make_shared("accounts/")); + matcher->add(std::make_shared("assets/")); + matcher->add(std::make_shared("icons/")); + matcher->add(std::make_shared("instances/")); + matcher->add(std::make_shared("libraries/")); + matcher->add(std::make_shared("mods/")); + matcher->add(std::make_shared("themes/")); + + ProgressDialog diag = ProgressDialog(); + DataMigrationTask task(nullptr, oldData, currentData, matcher); + if (diag.execWithTask(&task)) { + qDebug() << "<> Migration succeeded"; + setDoNotMigrate(); + } else { + QString reason = task.failReason(); + QMessageBox::critical(nullptr, BuildConfig.LAUNCHER_DISPLAYNAME, tr("Migration failed! Reason: %1").arg(reason)); + } + } else { + qWarning() << "<> Migration was skipped, due to existing data"; + } + return true; +} diff --git a/launcher/Application.h b/launcher/Application.h index 4c2f62d4c..7884227a1 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -231,6 +231,7 @@ private slots: void setupWizardFinished(int status); private: + bool handleDataMigration(const QString & currentData, const QString & oldData, const QString & name, const QString & configFile) const; bool createSetupWizard(); void performMainStartupAction(); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 45d197efe..7a5779355 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -576,6 +576,8 @@ SET(LAUNCHER_SOURCES # Application base Application.h Application.cpp + DataMigrationTask.h + DataMigrationTask.cpp UpdateController.cpp UpdateController.h ApplicationMessage.h diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp new file mode 100644 index 000000000..8e7f45795 --- /dev/null +++ b/launcher/DataMigrationTask.cpp @@ -0,0 +1,79 @@ +#include "DataMigrationTask.h" + +#include "FileSystem.h" + +#include +#include +#include + +#include + +DataMigrationTask::DataMigrationTask(QObject* parent, + const QString& sourcePath, + const QString& targetPath, + const IPathMatcher::Ptr pathMatcher) + : Task(parent), m_sourcePath(sourcePath), m_targetPath(targetPath), m_pathMatcher(pathMatcher), m_copy(sourcePath, targetPath) +{ + m_copy.matcher(m_pathMatcher.get()).whitelist(true); +} + +void DataMigrationTask::executeTask() +{ + setStatus(tr("Scanning files...")); + + // 1. Scan + // Check how many files we gotta copy + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&] { + return m_copy(true); // dry run to collect amount of files + }); + connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::dryRunFinished); + connect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::dryRunAborted); + m_copyFutureWatcher.setFuture(m_copyFuture); +} + +void DataMigrationTask::dryRunFinished() +{ + disconnect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::dryRunFinished); + disconnect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::dryRunAborted); + + if (!m_copyFuture.result()) { + emitFailed("Some error"); // FIXME + return; + } + + setStatus(tr("Migrating...")); + + // 2. Copy + // Actually copy all files now. + m_toCopy = m_copy.totalCopied(); + connect(&m_copy, &FS::copy::fileCopied, [&, this] { setProgress(m_copy.totalCopied(), m_toCopy); }); + m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&] { + return m_copy(false); // actually copy now + }); + connect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::copyFinished); + connect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::copyAborted); + m_copyFutureWatcher.setFuture(m_copyFuture); +} + +void DataMigrationTask::dryRunAborted() +{ + emitFailed(tr("Aborted")); +} + +void DataMigrationTask::copyFinished() +{ + disconnect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::copyFinished); + disconnect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::copyAborted); + + if (!m_copyFuture.result()) { + emitFailed("Some paths could not be copied!"); + return; + } + + emitSucceeded(); +} + +void DataMigrationTask::copyAborted() +{ + emitFailed(tr("Aborted")); +} diff --git a/launcher/DataMigrationTask.h b/launcher/DataMigrationTask.h new file mode 100644 index 000000000..105a94939 --- /dev/null +++ b/launcher/DataMigrationTask.h @@ -0,0 +1,38 @@ +#pragma once + +#include "FileSystem.h" +#include "pathmatcher/IPathMatcher.h" +#include "tasks/Task.h" + +#include +#include + +/* + * Migrate existing data from other MMC-like launchers. + */ + +class DataMigrationTask : public Task { + Q_OBJECT + public: + explicit DataMigrationTask(QObject* parent, const QString& sourcePath, const QString& targetPath, const IPathMatcher::Ptr pathmatcher); + ~DataMigrationTask() override = default; + + protected: + virtual void executeTask() override; + + protected slots: + void dryRunFinished(); + void dryRunAborted(); + void copyFinished(); + void copyAborted(); + + private: + const QString& m_sourcePath; + const QString& m_targetPath; + const IPathMatcher::Ptr m_pathMatcher; + + FS::copy m_copy; + int m_toCopy = 0; + QFuture m_copyFuture; + QFutureWatcher m_copyFutureWatcher; +}; From bbb7e9f5c722039ba8b4fbd00fba78f65613b0a9 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 23 Oct 2022 14:24:11 +0200 Subject: [PATCH 0227/1149] feat: show current copy operation in migration dialog Signed-off-by: Sefa Eyeoglu --- launcher/DataMigrationTask.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index 8e7f45795..fb2907fb6 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -41,12 +41,17 @@ void DataMigrationTask::dryRunFinished() return; } - setStatus(tr("Migrating...")); - // 2. Copy // Actually copy all files now. m_toCopy = m_copy.totalCopied(); - connect(&m_copy, &FS::copy::fileCopied, [&, this] { setProgress(m_copy.totalCopied(), m_toCopy); }); + connect(&m_copy, &FS::copy::fileCopied, [&, this](const QString& relativeName) { + QString shortenedName = relativeName; + // shorten the filename to hopefully fit into one line + if (shortenedName.length() > 50) + shortenedName = relativeName.left(20) + "…" + relativeName.right(29); + setProgress(m_copy.totalCopied(), m_toCopy); + setStatus(tr("Copying %1…").arg(shortenedName)); + }); m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), [&] { return m_copy(false); // actually copy now }); From 335bec68fb803f0a06400585b1dc4c2341951c7c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 23 Oct 2022 14:27:46 +0200 Subject: [PATCH 0228/1149] fix: prevent abort for un-abortable tasks Signed-off-by: Sefa Eyeoglu --- launcher/ui/dialogs/ProgressDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/ProgressDialog.cpp b/launcher/ui/dialogs/ProgressDialog.cpp index 05269f623..da73a4492 100644 --- a/launcher/ui/dialogs/ProgressDialog.cpp +++ b/launcher/ui/dialogs/ProgressDialog.cpp @@ -44,7 +44,8 @@ void ProgressDialog::setSkipButton(bool present, QString label) void ProgressDialog::on_skipButton_clicked(bool checked) { Q_UNUSED(checked); - task->abort(); + if (ui->skipButton->isEnabled()) // prevent other triggers from aborting + task->abort(); } ProgressDialog::~ProgressDialog() From 173aed7fd8e73b9e6a6055981ce284ea9cf5d33a Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 24 Oct 2022 21:50:35 +0200 Subject: [PATCH 0229/1149] chore: add REUSE headers Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 5 ++++- launcher/DataMigrationTask.cpp | 4 ++++ launcher/DataMigrationTask.h | 4 ++++ launcher/pathmatcher/SimplePrefixMatcher.h | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 2a7d6f220..8955e2970 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1,4 +1,7 @@ -// SPDX-License-Identifier: GPL-3.0-only +// SPDX-FileCopyrightText: 2022 Sefa Eyeoglu +// +// SPDX-License-Identifier: GPL-3.0-only AND Apache-2.0 + /* * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index fb2907fb6..8de3158e6 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Sefa Eyeoglu +// +// SPDX-License-Identifier: GPL-3.0-only + #include "DataMigrationTask.h" #include "FileSystem.h" diff --git a/launcher/DataMigrationTask.h b/launcher/DataMigrationTask.h index 105a94939..6cc23b1a8 100644 --- a/launcher/DataMigrationTask.h +++ b/launcher/DataMigrationTask.h @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Sefa Eyeoglu +// +// SPDX-License-Identifier: GPL-3.0-only + #pragma once #include "FileSystem.h" diff --git a/launcher/pathmatcher/SimplePrefixMatcher.h b/launcher/pathmatcher/SimplePrefixMatcher.h index 191d010cb..fc1f5cede 100644 --- a/launcher/pathmatcher/SimplePrefixMatcher.h +++ b/launcher/pathmatcher/SimplePrefixMatcher.h @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2022 Sefa Eyeoglu +// +// SPDX-License-Identifier: GPL-3.0-only + #include #include "IPathMatcher.h" From fe94c3609ef875166b71b9f6c540c45eff97a5ab Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 10 Nov 2022 19:04:42 +0100 Subject: [PATCH 0230/1149] fix: implement code review suggestions Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 5 ++--- launcher/DataMigrationTask.cpp | 12 ++++++++++-- launcher/FileSystem.cpp | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 8955e2970..537e39038 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1611,10 +1611,9 @@ bool Application::handleDataMigration(const QString& currentData, const QString& name, const QString& configFile) const { - QString nomigratePath = FS::PathCombine(oldData, BuildConfig.LAUNCHER_NAME + "_nomigrate.txt"); + QString nomigratePath = FS::PathCombine(currentData, name + "_nomigrate.txt"); QStringList configPaths = { FS::PathCombine(oldData, configFile), FS::PathCombine(oldData, BuildConfig.LAUNCHER_CONFIGFILE) }; - QDir dir; // helper for QDir::exists QLocale locale; // Is there a valid config at the old location? @@ -1677,7 +1676,7 @@ bool Application::handleDataMigration(const QString& currentData, matcher->add(std::make_shared("mods/")); matcher->add(std::make_shared("themes/")); - ProgressDialog diag = ProgressDialog(); + ProgressDialog diag; DataMigrationTask task(nullptr, oldData, currentData, matcher); if (diag.execWithTask(&task)) { qDebug() << "<> Migration succeeded"; diff --git a/launcher/DataMigrationTask.cpp b/launcher/DataMigrationTask.cpp index 8de3158e6..27ce5f01b 100644 --- a/launcher/DataMigrationTask.cpp +++ b/launcher/DataMigrationTask.cpp @@ -40,8 +40,12 @@ void DataMigrationTask::dryRunFinished() disconnect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::dryRunFinished); disconnect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::dryRunAborted); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + if (!m_copyFuture.isValid() || !m_copyFuture.result()) { +#else if (!m_copyFuture.result()) { - emitFailed("Some error"); // FIXME +#endif + emitFailed(tr("Failed to scan source path.")); return; } @@ -74,8 +78,12 @@ void DataMigrationTask::copyFinished() disconnect(&m_copyFutureWatcher, &QFutureWatcher::finished, this, &DataMigrationTask::copyFinished); disconnect(&m_copyFutureWatcher, &QFutureWatcher::canceled, this, &DataMigrationTask::copyAborted); +#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) + if (!m_copyFuture.isValid() || !m_copyFuture.result()) { +#else if (!m_copyFuture.result()) { - emitFailed("Some paths could not be copied!"); +#endif + emitFailed(tr("Some paths could not be copied!")); return; } diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 06691fbf6..0c6527b1d 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -175,7 +175,7 @@ bool copy::operator()(const QString& offset, bool dryRun) // Function that'll do the actual copying auto copy_file = [&](QString src_path, QString relative_dst_path) { - if (m_matcher && (m_matcher->matches(relative_dst_path) == !m_whitelist)) + if (m_matcher && (m_matcher->matches(relative_dst_path) != m_whitelist)) return; auto dst_path = PathCombine(dst, relative_dst_path); From 577069cfb4982735c038607c06245e6939d7be79 Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 12 Nov 2022 19:23:57 -0300 Subject: [PATCH 0231/1149] fix: don't have the clear button on instance page filters This thing is otherworldly unoptimized. o.O Signed-off-by: flow --- launcher/ui/pages/instance/ExternalResourcesPage.ui | 6 +----- launcher/ui/pages/instance/VersionPage.ui | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.ui b/launcher/ui/pages/instance/ExternalResourcesPage.ui index 76f8ec183..33a033366 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.ui +++ b/launcher/ui/pages/instance/ExternalResourcesPage.ui @@ -27,11 +27,7 @@ - - - true - - + diff --git a/launcher/ui/pages/instance/VersionPage.ui b/launcher/ui/pages/instance/VersionPage.ui index fcba5598d..14b7cd9f9 100644 --- a/launcher/ui/pages/instance/VersionPage.ui +++ b/launcher/ui/pages/instance/VersionPage.ui @@ -48,11 +48,7 @@ - - - true - - + From 69bbb2932848fe7509f91623bac2a648ce594ad7 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 15:47:37 +0200 Subject: [PATCH 0232/1149] Mac: attempt 2 - create .command files instead of .sh - fix shortcuts not working if path to Prism Launcher contains spaces - fix path to executable in shortcutss - add check for running from extracted folder (prevents creating shortcuts) Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 7 ++++--- launcher/ui/MainWindow.cpp | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 7a1861e73..80715498b 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -343,7 +343,7 @@ QString getDesktopDir() bool createShortcut(QString destination, QString target, QStringList args, QString name, QString icon) { #if defined(Q_OS_MACOS) - destination += ".sh"; + destination += ".command"; QFile f(destination); f.open(QIODevice::WriteOnly | QIODevice::Text); @@ -355,8 +355,9 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri stream << "#!/bin/bash" << "\n"; - stream << target - << " " + stream << "\"" + << target + << "\" " << argstring << "\n"; diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index aedd9e4f5..17371149c 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2100,13 +2100,14 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } #if defined(Q_OS_MACOS) - // handle macOS bundle weirdness - QFileInfo appFileInfo(QApplication::applicationFilePath()); - QString appName = appFileInfo.baseName(); - QString exeName = FS::PathCombine(appFileInfo.filePath(), "Contents/MacOS/" + appName); + QString appPath = QApplication::applicationFilePath(); + if (appPath.startsWith("/private/var")) { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts.")); + return; + } if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), - exeName, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { + appPath, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } else From 43b9d9484da280fc209a0c9f195b0ca338eacdb9 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 15:49:28 +0200 Subject: [PATCH 0233/1149] tabs -> spaces Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 17371149c..c7de46c71 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2101,10 +2101,10 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() #if defined(Q_OS_MACOS) QString appPath = QApplication::applicationFilePath(); - if (appPath.startsWith("/private/var")) { + if (appPath.startsWith("/private/var")) { QMessageBox::critical(this, tr("Create instance shortcut"), tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts.")); return; - } + } if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), appPath, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { From b0269e6dfc685cd002340e95e80942410f1b1fc5 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 17:51:29 +0200 Subject: [PATCH 0234/1149] Linux: fixes - Fix shortcut icons - Possibly fix shortcut creation on AppImages - Fix shortcut not working if path to launcher contains spaces Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 4 ++-- launcher/ui/MainWindow.cpp | 48 +++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 80715498b..e1059ca95 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -382,8 +382,8 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri << "\n"; stream << "Type=Application" << "\n"; - stream << "TryExec=" << target.toLocal8Bit() << "\n"; - stream << "Exec=" << target.toLocal8Bit() << argstring.toLocal8Bit() << "\n"; + stream << "TryExec=\"" << target.toLocal8Bit() << "\"\n"; + stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n"; stream << "Name=" << name.toLocal8Bit() << "\n"; if (!icon.isEmpty()) { diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index c7de46c71..4dbac967d 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2101,13 +2101,14 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() #if defined(Q_OS_MACOS) QString appPath = QApplication::applicationFilePath(); - if (appPath.startsWith("/private/var")) { + if (appPath.startsWith("/private/var/")) { QMessageBox::critical(this, tr("Create instance shortcut"), tr("The launcher is in the folder it was extracted from, therefore it cannot create shortcuts.")); return; } if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), - appPath, { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), "")) { + appPath, { "--launch", m_selectedInstance->id() }, + m_selectedInstance->name(), "")) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } else @@ -2115,14 +2116,48 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } #elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) + QString appPath = QApplication::applicationFilePath(); + if (appPath.startsWith("/tmp/.mount_")) { + // AppImage! + appPath = QProcessEnvironment::systemEnvironment().value(QStringLiteral("APPIMAGE")); + if (appPath.isEmpty()) + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Launcher is running as misconfigured AppImage? ($APPIMAGE environment variable is missing)")); + } + else if (appPath.endsWith("/")) + { + appPath.chop(1); + } + } + auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); + QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.png"); + + QFile iconFile(iconPath); + if (!iconFile.open(QFile::WriteOnly)) + { + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); + return; + } + bool success = icon->icon().pixmap(64, 64).save(&iconFile, "PNG"); + iconFile.close(); + + if (!success) + { + iconFile.remove(); + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); + return; + } + if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), - QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), icon->getFilePath())) { + appPath, { "--launch", m_selectedInstance->id() }, + m_selectedInstance->name(), iconPath)) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } else { + iconFile.remove(); QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); } #elif defined(Q_OS_WIN) @@ -2137,7 +2172,7 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() QFile iconFile(iconPath); if (!iconFile.open(QFile::WriteOnly)) { - QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); return; } bool success = icon->icon().pixmap(64, 64).save(&iconFile, "ICO"); @@ -2149,12 +2184,13 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() if (!success) { iconFile.remove(); - QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create instance shortcut!")); + QMessageBox::critical(this, tr("Create instance shortcut"), tr("Failed to create icon for shortcut.")); return; } if (FS::createShortcut(FS::PathCombine(desktopPath, m_selectedInstance->name()), - QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, m_selectedInstance->name(), iconPath)) { + QApplication::applicationFilePath(), { "--launch", m_selectedInstance->id() }, + m_selectedInstance->name(), iconPath)) { QMessageBox::information(this, tr("Create instance shortcut"), tr("Created a shortcut to this instance on your desktop!")); } else From c4cfec1e94d1665dc3c1ccd44966a34f349698ea Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 18:00:18 +0200 Subject: [PATCH 0235/1149] Undo accidental tomlplusplus downgrade Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- libraries/tomlplusplus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tomlplusplus b/libraries/tomlplusplus index 4b166b69f..cc741c9f5 160000 --- a/libraries/tomlplusplus +++ b/libraries/tomlplusplus @@ -1 +1 @@ -Subproject commit 4b166b69f28e70a416a1a04a98f365d2aeb90de8 +Subproject commit cc741c9f5f2a62856a2a2e9e275f61eb0591c09c From acd50969e0fcb172cf5f62e5ced4d10c6a9cbbe6 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 19:50:27 +0200 Subject: [PATCH 0236/1149] Linux: remove TryExec entry from .desktop files Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/FileSystem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index e1059ca95..9d911fa0e 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -382,7 +382,6 @@ bool createShortcut(QString destination, QString target, QStringList args, QStri << "\n"; stream << "Type=Application" << "\n"; - stream << "TryExec=\"" << target.toLocal8Bit() << "\"\n"; stream << "Exec=\"" << target.toLocal8Bit() << "\"" << argstring.toLocal8Bit() << "\n"; stream << "Name=" << name.toLocal8Bit() << "\n"; if (!icon.isEmpty()) From 07392d493cf7b1a0cb0e0f11838986935a4d2379 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 9 Nov 2022 19:52:00 +0100 Subject: [PATCH 0237/1149] fix: disable building snaps on release the snap infra should already be able to deal with it, i think Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3225cf1e4..6104109dd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -510,10 +510,10 @@ jobs: echo "VERSION=$ver_short" >> $GITHUB_ENV - name: Package Snap (Linux) id: snapcraft - if: runner.os == 'Linux' && matrix.qt_ver != 5 + if: runner.os == 'Linux' && inputs.build_type == 'Debug' uses: snapcore/action-build@v1 - name: Upload Snap (Linux) - if: runner.os == 'Linux' && matrix.qt_ver != 5 + if: runner.os == 'Linux' && inputs.build_type == 'Debug' uses: actions/upload-artifact@v3 with: name: prismlauncher_${{ env.VERSION }}_amd64.snap From 841c2e9166e01a8ecff61c96a05b3bdef64fe969 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 9 Nov 2022 19:56:38 +0100 Subject: [PATCH 0238/1149] fix: disable caching Qt on release it's good practice to not cache on release builds Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 7 +++++-- .github/workflows/trigger_builds.yml | 1 + .github/workflows/trigger_release.yml | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6104109dd..f5d98f90f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,10 @@ on: description: Type of build (Debug, Release, RelWithDebInfo, MinSizeRel) type: string default: Debug + is_qt_cached: + description: Enable Qt caching or not + type: string + default: true secrets: SPARKLE_ED25519_KEY: description: Private key for signing Sparkle updates @@ -200,8 +204,7 @@ jobs: arch: ${{ matrix.qt_arch }} modules: ${{ matrix.qt_modules }} tools: ${{ matrix.qt_tools }} - cache: true - cache-key-prefix: ${{ matrix.qt_host }}-${{ matrix.qt_version }}-"${{ matrix.qt_modules }}"-qt_cache + cache: ${{ inputs.is_qt_cached }} - name: Prepare AppImage (Linux) if: runner.os == 'Linux' && matrix.qt_ver != 5 diff --git a/.github/workflows/trigger_builds.yml b/.github/workflows/trigger_builds.yml index 8adaa5e52..44751fbc1 100644 --- a/.github/workflows/trigger_builds.yml +++ b/.github/workflows/trigger_builds.yml @@ -30,5 +30,6 @@ jobs: uses: ./.github/workflows/build.yml with: build_type: Debug + is_qt_cached: true secrets: SPARKLE_ED25519_KEY: ${{ secrets.SPARKLE_ED25519_KEY }} diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index d415b2b1d..8baa9693a 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -12,6 +12,7 @@ jobs: uses: ./.github/workflows/build.yml with: build_type: Release + is_qt_cached: false secrets: SPARKLE_ED25519_KEY: ${{ secrets.SPARKLE_ED25519_KEY }} From dcfc15a0a16c3b0d64086621cec8ef8ffc722832 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 9 Nov 2022 20:10:37 +0100 Subject: [PATCH 0239/1149] feat+fix: move codeql to its own workflow i think it's better practice, it should slightly improve linux qt6 build times and i noticed ccache? is messing up with it because alerts get randomly fixed Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 16 ---------------- .github/workflows/codeql.yml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f5d98f90f..61fd9b4cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -106,14 +106,6 @@ jobs: with: submodules: 'true' - - name: Initialize CodeQL - if: runner.os == 'Linux' && matrix.qt_ver == 6 - uses: github/codeql-action/init@v2 - with: - config-file: ./.github/codeql/codeql-config.yml - queries: security-and-quality - languages: cpp, java - - name: 'Setup MSYS2' if: runner.os == 'Windows' && matrix.msystem != '' uses: msys2/setup-msys2@v2 @@ -295,14 +287,6 @@ jobs: run: | ctest -E "^example64|example$" --test-dir build --output-on-failure -C ${{ inputs.build_type }} - ## - # CODE SCAN - ## - - - name: Perform CodeQL Analysis - if: runner.os == 'Linux' && matrix.qt_ver == 6 - uses: github/codeql-action/analyze@v2 - ## # PACKAGE BUILDS ## diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..0cd1f6e40 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,35 @@ +name: "CodeQL Code Scanning" + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + CodeQL: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + config-file: ./.github/codeql/codeql-config.yml + queries: security-and-quality + languages: cpp, java + + - name: Install Dependencies + run: + sudo apt-get -y update + + sudo apt-get -y install ninja-build extra-cmake-modules scdoc qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 + + - name: Configure and Build + run: | + cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DLauncher_QT_VERSION_MAJOR=5 -G Ninja + + cmake --build build + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 From 0a04c3a2a77bda4e60d04f651c7ab5006ee02449 Mon Sep 17 00:00:00 2001 From: txtsd Date: Sun, 13 Nov 2022 19:08:37 +0530 Subject: [PATCH 0240/1149] fix: Fix the error that CodeQL caught Signed-off-by: txtsd --- launcher/minecraft/mod/tasks/LocalModParseTask.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp index a694e7b22..774f61145 100644 --- a/launcher/minecraft/mod/tasks/LocalModParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalModParseTask.cpp @@ -121,7 +121,7 @@ ModDetails ReadMCModTOML(QByteArray contents) return {}; } auto modsTable = tomlModsTable0->as_table(); - if (!tomlModsTable0) { + if (!modsTable) { qWarning() << "Corrupted mods.toml? [[mods]] was not a table!"; return {}; } From 5be8545edcf53cd410d0ea14168b5675150106fc Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 13 Nov 2022 20:18:51 +0200 Subject: [PATCH 0241/1149] Windows, Linux: prevent segfault on missing icon Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 4dbac967d..4e6ce82cd 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2131,7 +2131,11 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); - + if (icon == nullptr) + { + icon = APPLICATION->icons()->icon("grass"); + } + QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.png"); QFile iconFile(iconPath); @@ -2162,7 +2166,11 @@ void MainWindow::on_actionCreateInstanceShortcut_triggered() } #elif defined(Q_OS_WIN) auto icon = APPLICATION->icons()->icon(m_selectedInstance->iconKey()); - + if (icon == nullptr) + { + icon = APPLICATION->icons()->icon("grass"); + } + QString iconPath = FS::PathCombine(m_selectedInstance->instanceRoot(), "icon.ico"); // part of fix for weird bug involving the window icon being replaced From 97a7af855f8a96a0e73181c5e32a15bbd2cb67f2 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Mon, 14 Nov 2022 19:21:47 +0800 Subject: [PATCH 0242/1149] slight reword: "install to PATH" Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index c376f4ec4..7140831b1 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -355,8 +355,8 @@ public: #ifdef Q_OS_MAC actionAddToPATH = TranslatedAction(MainWindow); actionAddToPATH->setObjectName(QStringLiteral("actionAddToPATH")); - actionAddToPATH.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Add to &PATH")); - actionAddToPATH.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add the prism binary to PATH.")); + actionAddToPATH.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Install to &PATH")); + actionAddToPATH.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Install a prismlauncher symlink to /usr/local/bin")); all_actions.append(&actionAddToPATH); #endif From e14b998da3850e43abf2606064d6b0ddebbf0025 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 14 Nov 2022 18:37:24 +0100 Subject: [PATCH 0243/1149] refactor: improve readability Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 9375039b9..e1ac95515 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1949,16 +1949,24 @@ void MainWindow::on_actionClearMetadata_triggered() } #ifdef Q_OS_MAC -void MainWindow::on_actionAddToPATH_triggered() { +void MainWindow::on_actionAddToPATH_triggered() +{ auto binaryPath = APPLICATION->applicationFilePath(); + auto targetPath = QString("/usr/local/bin/%1").arg(BuildConfig.LAUNCHER_APP_BINARY_NAME); + qDebug() << "Symlinking" << binaryPath << "to" << targetPath; - qDebug() << "Symlinking" << binaryPath << "to /usr/local/bin/prism"; - auto outcome = QProcess::execute("/usr/bin/osascript", QStringList()<< "-e" << tr("do shell script \"mkdir -p /usr/local/bin && ln -sf '%1' '/usr/local/bin/prismlauncher'\" with administrator privileges").arg(binaryPath)); - + QStringList args; + args << "-e"; + args << QString("do shell script \"mkdir -p /usr/local/bin && ln -sf '%1' '%2'\" with administrator privileges") + .arg(binaryPath, targetPath); + auto outcome = QProcess::execute("/usr/bin/osascript", args); if (!outcome) { - QMessageBox::information(this, tr("Added Prism to PATH"), tr("Prism was successfully added to your PATH. You can now run it with `prismlauncher` in your Terminal. Enjoy!")); + QMessageBox::information(this, tr("Successfully added %1 to PATH").arg(BuildConfig.LAUNCHER_DISPLAYNAME), + tr("%1 was successfully added to your PATH. You can now start it by running `%2`.") + .arg(BuildConfig.LAUNCHER_DISPLAYNAME, BuildConfig.LAUNCHER_APP_BINARY_NAME)); } else { - QMessageBox::critical(this, tr("Failed to add Prism to PATH"), tr("Failed to add Prism to PATH :(")); + QMessageBox::critical(this, tr("Failed to add %1 to PATH").arg(BuildConfig.LAUNCHER_DISPLAYNAME), + tr("An error occurred while trying to add %1 to PATH").arg(BuildConfig.LAUNCHER_DISPLAYNAME)); } } #endif From ce892c9e777f13de6e6298806d9fdb5c92f77af6 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Mon, 14 Nov 2022 21:02:31 +0200 Subject: [PATCH 0244/1149] Add icon NOTE: Currently missing on Legacy, Flat and Flat (White) Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/resources/OSX/OSX.qrc | 4 +- launcher/resources/OSX/scalable/shortcut.svg | 14 +++++++ launcher/resources/iOS/iOS.qrc | 4 +- launcher/resources/iOS/scalable/shortcut.svg | 13 ++++++ launcher/resources/pe_blue/pe_blue.qrc | 4 +- .../resources/pe_blue/scalable/shortcut.svg | 41 +++++++++++++++++++ launcher/resources/pe_colored/pe_colored.qrc | 4 +- .../pe_colored/scalable/shortcut.svg | 13 ++++++ launcher/resources/pe_dark/pe_dark.qrc | 4 +- .../resources/pe_dark/scalable/shortcut.svg | 41 +++++++++++++++++++ launcher/resources/pe_light/pe_light.qrc | 4 +- .../resources/pe_light/scalable/shortcut.svg | 41 +++++++++++++++++++ launcher/ui/MainWindow.cpp | 3 +- 13 files changed, 177 insertions(+), 13 deletions(-) create mode 100644 launcher/resources/OSX/scalable/shortcut.svg create mode 100644 launcher/resources/iOS/scalable/shortcut.svg create mode 100644 launcher/resources/pe_blue/scalable/shortcut.svg create mode 100644 launcher/resources/pe_colored/scalable/shortcut.svg create mode 100644 launcher/resources/pe_dark/scalable/shortcut.svg create mode 100644 launcher/resources/pe_light/scalable/shortcut.svg diff --git a/launcher/resources/OSX/OSX.qrc b/launcher/resources/OSX/OSX.qrc index 19fe312b6..3f50d6cf4 100644 --- a/launcher/resources/OSX/OSX.qrc +++ b/launcher/resources/OSX/OSX.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/OSX/scalable/shortcut.svg b/launcher/resources/OSX/scalable/shortcut.svg new file mode 100644 index 000000000..a2b7488e1 --- /dev/null +++ b/launcher/resources/OSX/scalable/shortcut.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/launcher/resources/iOS/iOS.qrc b/launcher/resources/iOS/iOS.qrc index aa08d811a..d7044fbb3 100644 --- a/launcher/resources/iOS/iOS.qrc +++ b/launcher/resources/iOS/iOS.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/iOS/scalable/shortcut.svg b/launcher/resources/iOS/scalable/shortcut.svg new file mode 100644 index 000000000..16e9fa488 --- /dev/null +++ b/launcher/resources/iOS/scalable/shortcut.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/launcher/resources/pe_blue/pe_blue.qrc b/launcher/resources/pe_blue/pe_blue.qrc index 3121ffe6b..dc40103a3 100644 --- a/launcher/resources/pe_blue/pe_blue.qrc +++ b/launcher/resources/pe_blue/pe_blue.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/pe_blue/scalable/shortcut.svg b/launcher/resources/pe_blue/scalable/shortcut.svg new file mode 100644 index 000000000..45b734966 --- /dev/null +++ b/launcher/resources/pe_blue/scalable/shortcut.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/pe_colored/pe_colored.qrc b/launcher/resources/pe_colored/pe_colored.qrc index ce5ad8e21..bd1af6ff4 100644 --- a/launcher/resources/pe_colored/pe_colored.qrc +++ b/launcher/resources/pe_colored/pe_colored.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/pe_colored/scalable/shortcut.svg b/launcher/resources/pe_colored/scalable/shortcut.svg new file mode 100644 index 000000000..1469674f6 --- /dev/null +++ b/launcher/resources/pe_colored/scalable/shortcut.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/launcher/resources/pe_dark/pe_dark.qrc b/launcher/resources/pe_dark/pe_dark.qrc index 156d8f8b4..05ef7e932 100644 --- a/launcher/resources/pe_dark/pe_dark.qrc +++ b/launcher/resources/pe_dark/pe_dark.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/pe_dark/scalable/shortcut.svg b/launcher/resources/pe_dark/scalable/shortcut.svg new file mode 100644 index 000000000..29b45f26c --- /dev/null +++ b/launcher/resources/pe_dark/scalable/shortcut.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/pe_light/pe_light.qrc b/launcher/resources/pe_light/pe_light.qrc index d8e4a1bd7..6acca230d 100644 --- a/launcher/resources/pe_light/pe_light.qrc +++ b/launcher/resources/pe_light/pe_light.qrc @@ -1,5 +1,4 @@ - - + index.theme scalable/about.svg @@ -39,5 +38,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/shortcut.svg diff --git a/launcher/resources/pe_light/scalable/shortcut.svg b/launcher/resources/pe_light/scalable/shortcut.svg new file mode 100644 index 000000000..4d232bcf1 --- /dev/null +++ b/launcher/resources/pe_light/scalable/shortcut.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 4e6ce82cd..0c6066603 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -743,7 +743,8 @@ public: actionCreateInstanceShortcut.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Create Shortcut")); actionCreateInstanceShortcut.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Creates a shortcut on your desktop to launch the selected instance.")); //actionCreateInstanceShortcut->setShortcut(QKeySequence(tr("Ctrl+D"))); // TODO - //actionCreateInstanceShortcut->setIcon(APPLICATION->getThemedIcon("copy")); // TODO + // FIXME missing on Legacy, Flat and Flat (White) + actionCreateInstanceShortcut->setIcon(APPLICATION->getThemedIcon("shortcut")); all_actions.append(&actionCreateInstanceShortcut); setInstanceActionsEnabled(false); From 472d931b4b5cedcf570153c4ba40cddbc611040a Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 9 Nov 2022 20:57:54 +0000 Subject: [PATCH 0245/1149] Prefix member variables in HttpMetaCache MSVC warns about shadowing variables Signed-off-by: TheLastRar --- launcher/net/HttpMetaCache.cpp | 72 +++++++++++++++++----------------- launcher/net/HttpMetaCache.h | 54 ++++++++++++------------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/launcher/net/HttpMetaCache.cpp b/launcher/net/HttpMetaCache.cpp index e242dcf45..0d7ca7691 100644 --- a/launcher/net/HttpMetaCache.cpp +++ b/launcher/net/HttpMetaCache.cpp @@ -47,7 +47,7 @@ auto MetaEntry::getFullPath() -> QString { // FIXME: make local? - return FS::PathCombine(basePath, relativePath); + return FS::PathCombine(m_basePath, m_relativePath); } HttpMetaCache::HttpMetaCache(QString path) : QObject(), m_index_file(path) @@ -99,7 +99,7 @@ auto HttpMetaCache::resolveEntry(QString base, QString resource_path, QString ex return staleEntry(base, resource_path); } - if (!expected_etag.isEmpty() && expected_etag != entry->etag) { + if (!expected_etag.isEmpty() && expected_etag != entry->m_etag) { // if the etag doesn't match expected, we disown the entry selected_base.entry_list.remove(resource_path); return staleEntry(base, resource_path); @@ -107,17 +107,17 @@ auto HttpMetaCache::resolveEntry(QString base, QString resource_path, QString ex // if the file changed, check md5sum qint64 file_last_changed = finfo.lastModified().toUTC().toMSecsSinceEpoch(); - if (file_last_changed != entry->local_changed_timestamp) { + if (file_last_changed != entry->m_local_changed_timestamp) { QFile input(real_path); input.open(QIODevice::ReadOnly); QString md5sum = QCryptographicHash::hash(input.readAll(), QCryptographicHash::Md5).toHex().constData(); - if (entry->md5sum != md5sum) { + if (entry->m_md5sum != md5sum) { selected_base.entry_list.remove(resource_path); return staleEntry(base, resource_path); } // md5sums matched... keep entry and save the new state to file - entry->local_changed_timestamp = file_last_changed; + entry->m_local_changed_timestamp = file_last_changed; SaveEventually(); } @@ -130,23 +130,23 @@ auto HttpMetaCache::resolveEntry(QString base, QString resource_path, QString ex } // entry passed all the checks we cared about. - entry->basePath = getBasePath(base); + entry->m_basePath = getBasePath(base); return entry; } auto HttpMetaCache::updateEntry(MetaEntryPtr stale_entry) -> bool { - if (!m_entries.contains(stale_entry->baseId)) { - qCritical() << "Cannot add entry with unknown base: " << stale_entry->baseId.toLocal8Bit(); + if (!m_entries.contains(stale_entry->m_baseId)) { + qCritical() << "Cannot add entry with unknown base: " << stale_entry->m_baseId.toLocal8Bit(); return false; } - if (stale_entry->stale) { + if (stale_entry->m_stale) { qCritical() << "Cannot add stale entry: " << stale_entry->getFullPath().toLocal8Bit(); return false; } - m_entries[stale_entry->baseId].entry_list[stale_entry->relativePath] = stale_entry; + m_entries[stale_entry->m_baseId].entry_list[stale_entry->m_relativePath] = stale_entry; SaveEventually(); return true; @@ -157,7 +157,7 @@ auto HttpMetaCache::evictEntry(MetaEntryPtr entry) -> bool if (!entry) return false; - entry->stale = true; + entry->m_stale = true; SaveEventually(); return true; } @@ -169,7 +169,7 @@ void HttpMetaCache::evictAll() qDebug() << "Evicting base" << base; for (MetaEntryPtr entry : map.entry_list) { if (!evictEntry(entry)) - qWarning() << "Unexpected missing cache entry" << entry->basePath; + qWarning() << "Unexpected missing cache entry" << entry->m_basePath; } } } @@ -177,10 +177,10 @@ void HttpMetaCache::evictAll() auto HttpMetaCache::staleEntry(QString base, QString resource_path) -> MetaEntryPtr { auto foo = new MetaEntry(); - foo->baseId = base; - foo->basePath = getBasePath(base); - foo->relativePath = resource_path; - foo->stale = true; + foo->m_baseId = base; + foo->m_basePath = getBasePath(base); + foo->m_relativePath = resource_path; + foo->m_stale = true; return MetaEntryPtr(foo); } @@ -235,23 +235,23 @@ void HttpMetaCache::Load() auto& entrymap = m_entries[base]; auto foo = new MetaEntry(); - foo->baseId = base; - foo->relativePath = Json::ensureString(element_obj, "path"); - foo->md5sum = Json::ensureString(element_obj, "md5sum"); - foo->etag = Json::ensureString(element_obj, "etag"); - foo->local_changed_timestamp = Json::ensureDouble(element_obj, "last_changed_timestamp"); - foo->remote_changed_timestamp = Json::ensureString(element_obj, "remote_changed_timestamp"); + foo->m_baseId = base; + foo->m_relativePath = Json::ensureString(element_obj, "path"); + foo->m_md5sum = Json::ensureString(element_obj, "md5sum"); + foo->m_etag = Json::ensureString(element_obj, "etag"); + foo->m_local_changed_timestamp = Json::ensureDouble(element_obj, "last_changed_timestamp"); + foo->m_remote_changed_timestamp = Json::ensureString(element_obj, "remote_changed_timestamp"); foo->makeEternal(Json::ensureBoolean(element_obj, (const QString)QStringLiteral("eternal"), false)); if (!foo->isEternal()) { - foo->current_age = Json::ensureDouble(element_obj, "current_age"); - foo->max_age = Json::ensureDouble(element_obj, "max_age"); + foo->m_current_age = Json::ensureDouble(element_obj, "current_age"); + foo->m_max_age = Json::ensureDouble(element_obj, "max_age"); } // presumed innocent until closer examination - foo->stale = false; + foo->m_stale = false; - entrymap.entry_list[foo->relativePath] = MetaEntryPtr(foo); + entrymap.entry_list[foo->m_relativePath] = MetaEntryPtr(foo); } } @@ -276,23 +276,23 @@ void HttpMetaCache::SaveNow() for (auto group : m_entries) { for (auto entry : group.entry_list) { // do not save stale entries. they are dead. - if (entry->stale) { + if (entry->m_stale) { continue; } QJsonObject entryObj; - Json::writeString(entryObj, "base", entry->baseId); - Json::writeString(entryObj, "path", entry->relativePath); - Json::writeString(entryObj, "md5sum", entry->md5sum); - Json::writeString(entryObj, "etag", entry->etag); - entryObj.insert("last_changed_timestamp", QJsonValue(double(entry->local_changed_timestamp))); - if (!entry->remote_changed_timestamp.isEmpty()) - entryObj.insert("remote_changed_timestamp", QJsonValue(entry->remote_changed_timestamp)); + Json::writeString(entryObj, "base", entry->m_baseId); + Json::writeString(entryObj, "path", entry->m_relativePath); + Json::writeString(entryObj, "md5sum", entry->m_md5sum); + Json::writeString(entryObj, "etag", entry->m_etag); + entryObj.insert("last_changed_timestamp", QJsonValue(double(entry->m_local_changed_timestamp))); + if (!entry->m_remote_changed_timestamp.isEmpty()) + entryObj.insert("remote_changed_timestamp", QJsonValue(entry->m_remote_changed_timestamp)); if (entry->isEternal()) { entryObj.insert("eternal", true); } else { - entryObj.insert("current_age", QJsonValue(double(entry->current_age))); - entryObj.insert("max_age", QJsonValue(double(entry->max_age))); + entryObj.insert("current_age", QJsonValue(double(entry->m_current_age))); + entryObj.insert("max_age", QJsonValue(double(entry->m_max_age))); } entriesArr.append(entryObj); } diff --git a/launcher/net/HttpMetaCache.h b/launcher/net/HttpMetaCache.h index 2a07d65a5..37f4b49a2 100644 --- a/launcher/net/HttpMetaCache.h +++ b/launcher/net/HttpMetaCache.h @@ -49,47 +49,47 @@ class MetaEntry { MetaEntry() = default; public: - auto isStale() -> bool { return stale; } - void setStale(bool stale) { this->stale = stale; } + auto isStale() -> bool { return m_stale; } + void setStale(bool stale) { m_stale = stale; } auto getFullPath() -> QString; - auto getRemoteChangedTimestamp() -> QString { return remote_changed_timestamp; } - void setRemoteChangedTimestamp(QString remote_changed_timestamp) { this->remote_changed_timestamp = remote_changed_timestamp; } - void setLocalChangedTimestamp(qint64 timestamp) { local_changed_timestamp = timestamp; } + auto getRemoteChangedTimestamp() -> QString { return m_remote_changed_timestamp; } + void setRemoteChangedTimestamp(QString remote_changed_timestamp) { m_remote_changed_timestamp = remote_changed_timestamp; } + void setLocalChangedTimestamp(qint64 timestamp) { m_local_changed_timestamp = timestamp; } - auto getETag() -> QString { return etag; } - void setETag(QString etag) { this->etag = etag; } + auto getETag() -> QString { return m_etag; } + void setETag(QString etag) { m_etag = etag; } - auto getMD5Sum() -> QString { return md5sum; } - void setMD5Sum(QString md5sum) { this->md5sum = md5sum; } + auto getMD5Sum() -> QString { return m_md5sum; } + void setMD5Sum(QString md5sum) { m_md5sum = md5sum; } /* Whether the entry expires after some time (false) or not (true). */ - void makeEternal(bool eternal) { is_eternal = eternal; } - [[nodiscard]] bool isEternal() const { return is_eternal; } + void makeEternal(bool eternal) { m_is_eternal = eternal; } + [[nodiscard]] bool isEternal() const { return m_is_eternal; } - auto getCurrentAge() -> qint64 { return current_age; } - void setCurrentAge(qint64 age) { current_age = age; } + auto getCurrentAge() -> qint64 { return m_current_age; } + void setCurrentAge(qint64 age) { m_current_age = age; } - auto getMaximumAge() -> qint64 { return max_age; } - void setMaximumAge(qint64 age) { max_age = age; } + auto getMaximumAge() -> qint64 { return m_max_age; } + void setMaximumAge(qint64 age) { m_max_age = age; } - bool isExpired(qint64 offset) { return !is_eternal && (current_age >= max_age - offset); }; + bool isExpired(qint64 offset) { return !m_is_eternal && (m_current_age >= m_max_age - offset); }; protected: - QString baseId; - QString basePath; - QString relativePath; - QString md5sum; - QString etag; + QString m_baseId; + QString m_basePath; + QString m_relativePath; + QString m_md5sum; + QString m_etag; - qint64 local_changed_timestamp = 0; - QString remote_changed_timestamp; // QString for now, RFC 2822 encoded time - qint64 current_age = 0; - qint64 max_age = 0; - bool is_eternal = false; + qint64 m_local_changed_timestamp = 0; + QString m_remote_changed_timestamp; // QString for now, RFC 2822 encoded time + qint64 m_current_age = 0; + qint64 m_max_age = 0; + bool m_is_eternal = false; - bool stale = true; + bool m_stale = true; }; using MetaEntryPtr = std::shared_ptr; From 55c7b291e1dc5ef903dfbbea18d3f48fd968df38 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 9 Nov 2022 21:11:34 +0000 Subject: [PATCH 0246/1149] Remove unused qhash function Signed-off-by: TheLastRar --- launcher/meta/JsonFormat.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/launcher/meta/JsonFormat.h b/launcher/meta/JsonFormat.h index 93217b7e0..63128a4e6 100644 --- a/launcher/meta/JsonFormat.h +++ b/launcher/meta/JsonFormat.h @@ -60,11 +60,6 @@ struct Require QString suggests; }; -inline Q_DECL_PURE_FUNCTION uint qHash(const Require &key, uint seed = 0) Q_DECL_NOTHROW -{ - return qHash(key.uid, seed); -} - using RequireSet = std::set; void parseIndex(const QJsonObject &obj, Index *ptr); From b8d7aedb2ca38a64e84aad4955044c778ca4163d Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 9 Nov 2022 21:15:35 +0000 Subject: [PATCH 0247/1149] Mark paramater line as unused in guessLevel() The base method doesn't use this variable, but classes overriding this method do Signed-off-by: TheLastRar --- launcher/BaseInstance.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/BaseInstance.h b/launcher/BaseInstance.h index 307240e0d..a2a4f8246 100644 --- a/launcher/BaseInstance.h +++ b/launcher/BaseInstance.h @@ -151,7 +151,7 @@ public: void copyManagedPack(BaseInstance& other); /// guess log level from a line of game log - virtual MessageLevel::Enum guessLevel(const QString &line, MessageLevel::Enum level) + virtual MessageLevel::Enum guessLevel([[maybe_unused]] const QString &line, MessageLevel::Enum level) { return level; }; From 3cba359d38a5587506a1535c06ef7e8399e079d5 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Wed, 9 Nov 2022 21:18:34 +0000 Subject: [PATCH 0248/1149] Mark paramater runtimeContext as unused Base class uses variable, but ImplicitRule does not Signed-off-by: TheLastRar --- launcher/minecraft/Rule.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/Rule.h b/launcher/minecraft/Rule.h index 236f9a878..846e8e428 100644 --- a/launcher/minecraft/Rule.h +++ b/launcher/minecraft/Rule.h @@ -104,7 +104,7 @@ public: class ImplicitRule : public Rule { protected: - virtual bool applies(const Library *, const RuntimeContext & runtimeContext) + virtual bool applies(const Library *, [[maybe_unused]] const RuntimeContext & runtimeContext) { return true; } From f8a137a26e2fbff287b2d15d897f1dea88df4c38 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Nov 2022 00:52:24 +0000 Subject: [PATCH 0249/1149] Mark loadExtraPackInfo abstract All classes that inherit from ModModel override this method Signed-off-by: TheLastRar --- launcher/ui/pages/modplatform/ModModel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index d2636d87e..5bc31cc31 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -41,7 +41,7 @@ class ListModel : public QAbstractListModel { void requestModVersions(const ModPlatform::IndexedPack& current, QModelIndex index); virtual void loadIndexedPack(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0; - virtual void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) {}; + virtual void loadExtraPackInfo(ModPlatform::IndexedPack& m, QJsonObject& obj) = 0; virtual void loadIndexedPackVersions(ModPlatform::IndexedPack& m, QJsonArray& arr) = 0; void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); From 08f8623cb700cc51d6953b573d432f4553a5c736 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Nov 2022 00:54:37 +0000 Subject: [PATCH 0250/1149] Mark paramaters of onParseFailed as unused Signed-off-by: TheLastRar --- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 25095a456..846df4d01 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -176,7 +176,7 @@ class ResourceFolderModel : public QAbstractListModel { * if the resource is complex and has more stuff to parse. */ virtual void onParseSucceeded(int ticket, QString resource_id); - virtual void onParseFailed(int ticket, QString resource_id) {} + virtual void onParseFailed([[maybe_unused]] int ticket, [[maybe_unused]] QString resource_id) {} protected: // Represents the relationship between a column's index (represented by the list index), and it's sorting key. From 5558f3d2ccde1f1a043fbb82c0856ae3241dc20f Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Nov 2022 14:33:25 +0000 Subject: [PATCH 0251/1149] Mark paramaters of dropMimeData as unused Signed-off-by: TheLastRar --- launcher/icons/IconList.cpp | 2 +- launcher/minecraft/WorldList.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index 3a223d1b6..a1f77cc3f 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -242,7 +242,7 @@ Qt::DropActions IconList::supportedDropActions() const return Qt::CopyAction; } -bool IconList::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +bool IconList::dropMimeData(const QMimeData *data, Qt::DropAction action, [[maybe_unused]] int row, [[maybe_unused]] int column, [[maybe_unused]] const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; diff --git a/launcher/minecraft/WorldList.cpp b/launcher/minecraft/WorldList.cpp index aee7be358..3634d144e 100644 --- a/launcher/minecraft/WorldList.cpp +++ b/launcher/minecraft/WorldList.cpp @@ -398,8 +398,8 @@ void WorldList::installWorld(QFileInfo filename) w.install(m_dir.absolutePath()); } -bool WorldList::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, - const QModelIndex &parent) +bool WorldList::dropMimeData(const QMimeData *data, Qt::DropAction action, [[maybe_unused]] int row, [[maybe_unused]] int column, + [[maybe_unused]] const QModelIndex &parent) { if (action == Qt::IgnoreAction) return true; From fce323b945d5e8365c64c61e3ba592cb2b7446c4 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Nov 2022 14:35:55 +0000 Subject: [PATCH 0252/1149] Check parent in rowCount/columnCount/canFetchMore Signed-off-by: TheLastRar --- launcher/BaseVersionList.cpp | 4 ++-- launcher/VersionProxyModel.cpp | 4 ++-- launcher/icons/IconList.cpp | 2 +- launcher/meta/Index.cpp | 4 ++-- launcher/minecraft/PackProfile.cpp | 4 ++-- launcher/minecraft/WorldList.cpp | 2 +- launcher/minecraft/WorldList.h | 2 +- launcher/minecraft/auth/AccountList.cpp | 8 ++++---- launcher/minecraft/mod/ModFolderModel.cpp | 2 +- launcher/minecraft/mod/ResourceFolderModel.h | 4 ++-- launcher/minecraft/mod/ResourcePackFolderModel.cpp | 2 +- launcher/ui/pages/instance/ServersPage.cpp | 4 ++-- launcher/ui/pages/modplatform/ModModel.h | 6 +++--- launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp | 4 ++-- .../pages/modplatform/atlauncher/AtlOptionalModDialog.cpp | 4 ++-- launcher/ui/pages/modplatform/flame/FlameModel.cpp | 4 ++-- launcher/ui/pages/modplatform/ftb/FtbListModel.cpp | 4 ++-- launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp | 4 ++-- launcher/ui/pages/modplatform/modrinth/ModrinthModel.h | 6 +++--- launcher/ui/pages/modplatform/technic/TechnicModel.cpp | 8 ++++---- 20 files changed, 41 insertions(+), 41 deletions(-) diff --git a/launcher/BaseVersionList.cpp b/launcher/BaseVersionList.cpp index 4ed826123..dc95e7ea5 100644 --- a/launcher/BaseVersionList.cpp +++ b/launcher/BaseVersionList.cpp @@ -95,12 +95,12 @@ BaseVersionList::RoleList BaseVersionList::providesRoles() const int BaseVersionList::rowCount(const QModelIndex &parent) const { // Return count - return count(); + return parent.isValid() ? 0 : count(); } int BaseVersionList::columnCount(const QModelIndex &parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QHash BaseVersionList::roleNames() const diff --git a/launcher/VersionProxyModel.cpp b/launcher/VersionProxyModel.cpp index 032f21f94..6aba268d8 100644 --- a/launcher/VersionProxyModel.cpp +++ b/launcher/VersionProxyModel.cpp @@ -311,14 +311,14 @@ QModelIndex VersionProxyModel::index(int row, int column, const QModelIndex &par int VersionProxyModel::columnCount(const QModelIndex &parent) const { - return m_columns.size(); + return parent.isValid() ? 0 : m_columns.size(); } int VersionProxyModel::rowCount(const QModelIndex &parent) const { if(sourceModel()) { - return sourceModel()->rowCount(); + return sourceModel()->rowCount(parent); } return 0; } diff --git a/launcher/icons/IconList.cpp b/launcher/icons/IconList.cpp index a1f77cc3f..01043ad20 100644 --- a/launcher/icons/IconList.cpp +++ b/launcher/icons/IconList.cpp @@ -302,7 +302,7 @@ QVariant IconList::data(const QModelIndex &index, int role) const int IconList::rowCount(const QModelIndex &parent) const { - return icons.size(); + return parent.isValid() ? 0 : icons.size(); } void IconList::installIcons(const QStringList &iconFiles) diff --git a/launcher/meta/Index.cpp b/launcher/meta/Index.cpp index eec1b329b..242aad9f9 100644 --- a/launcher/meta/Index.cpp +++ b/launcher/meta/Index.cpp @@ -58,11 +58,11 @@ QVariant Index::data(const QModelIndex &index, int role) const } int Index::rowCount(const QModelIndex &parent) const { - return m_lists.size(); + return parent.isValid() ? 0 : m_lists.size(); } int Index::columnCount(const QModelIndex &parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QVariant Index::headerData(int section, Qt::Orientation orientation, int role) const { diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 1618458f5..89b85d6a6 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -675,12 +675,12 @@ Qt::ItemFlags PackProfile::flags(const QModelIndex &index) const int PackProfile::rowCount(const QModelIndex &parent) const { - return d->components.size(); + return parent.isValid() ? 0 : d->components.size(); } int PackProfile::columnCount(const QModelIndex &parent) const { - return NUM_COLUMNS; + return parent.isValid() ? 0 : NUM_COLUMNS; } void PackProfile::move(const int index, const MoveDirection direction) diff --git a/launcher/minecraft/WorldList.cpp b/launcher/minecraft/WorldList.cpp index 3634d144e..ae29a972f 100644 --- a/launcher/minecraft/WorldList.cpp +++ b/launcher/minecraft/WorldList.cpp @@ -173,7 +173,7 @@ bool WorldList::resetIcon(int row) int WorldList::columnCount(const QModelIndex &parent) const { - return 4; + return parent.isValid()? 0 : 4; } QVariant WorldList::data(const QModelIndex &index, int role) const diff --git a/launcher/minecraft/WorldList.h b/launcher/minecraft/WorldList.h index 5138e5837..082947556 100644 --- a/launcher/minecraft/WorldList.h +++ b/launcher/minecraft/WorldList.h @@ -54,7 +54,7 @@ public: virtual int rowCount(const QModelIndex &parent = QModelIndex()) const { - return size(); + return parent.isValid() ? 0 : static_cast(size()); }; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; diff --git a/launcher/minecraft/auth/AccountList.cpp b/launcher/minecraft/auth/AccountList.cpp index b3b57c742..6ea62a50d 100644 --- a/launcher/minecraft/auth/AccountList.cpp +++ b/launcher/minecraft/auth/AccountList.cpp @@ -408,15 +408,15 @@ QVariant AccountList::headerData(int section, Qt::Orientation orientation, int r } } -int AccountList::rowCount(const QModelIndex &) const +int AccountList::rowCount(const QModelIndex &parent) const { // Return count - return count(); + return parent.isValid() ? 0 : count(); } -int AccountList::columnCount(const QModelIndex &) const +int AccountList::columnCount(const QModelIndex &parent) const { - return NUM_COLUMNS; + return parent.isValid() ? 0 : NUM_COLUMNS; } Qt::ItemFlags AccountList::flags(const QModelIndex &index) const diff --git a/launcher/minecraft/mod/ModFolderModel.cpp b/launcher/minecraft/mod/ModFolderModel.cpp index 66e80f4a5..4ccc5d4d5 100644 --- a/launcher/minecraft/mod/ModFolderModel.cpp +++ b/launcher/minecraft/mod/ModFolderModel.cpp @@ -144,7 +144,7 @@ QVariant ModFolderModel::headerData(int section, Qt::Orientation orientation, in int ModFolderModel::columnCount(const QModelIndex &parent) const { - return NUM_COLUMNS; + return parent.isValid() ? 0 : NUM_COLUMNS; } Task* ModFolderModel::createUpdateTask() diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 846df4d01..74a1b62d4 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -90,8 +90,8 @@ class ResourceFolderModel : public QAbstractListModel { /* Basic columns */ enum Columns { ACTIVE_COLUMN = 0, NAME_COLUMN, DATE_COLUMN, NUM_COLUMNS }; - [[nodiscard]] int rowCount(const QModelIndex& = {}) const override { return size(); } - [[nodiscard]] int columnCount(const QModelIndex& = {}) const override { return NUM_COLUMNS; }; + [[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : static_cast(size()); } + [[nodiscard]] int columnCount(const QModelIndex& parent = {}) const override { return parent.isValid() ? 0 : NUM_COLUMNS; }; [[nodiscard]] Qt::DropActions supportedDropActions() const override; diff --git a/launcher/minecraft/mod/ResourcePackFolderModel.cpp b/launcher/minecraft/mod/ResourcePackFolderModel.cpp index f8a6c1cfb..ebac707da 100644 --- a/launcher/minecraft/mod/ResourcePackFolderModel.cpp +++ b/launcher/minecraft/mod/ResourcePackFolderModel.cpp @@ -137,7 +137,7 @@ QVariant ResourcePackFolderModel::headerData(int section, Qt::Orientation orient int ResourcePackFolderModel::columnCount(const QModelIndex& parent) const { - return NUM_COLUMNS; + return parent.isValid() ? 0 : NUM_COLUMNS; } Task* ResourcePackFolderModel::createUpdateTask() diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index 5e8bd7cca..d64bcb767 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -400,11 +400,11 @@ public: virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override { - return m_servers.size(); + return parent.isValid() ? 0 : m_servers.size(); } int columnCount(const QModelIndex & parent) const override { - return COLUMN_COUNT; + return parent.isValid() ? 0 : COLUMN_COUNT; } Server * at(int index) diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index 5bc31cc31..368406491 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -20,8 +20,8 @@ class ListModel : public QAbstractListModel { ListModel(ModPage* parent); ~ListModel() override; - inline auto rowCount(const QModelIndex& parent) const -> int override { return modpacks.size(); }; - inline auto columnCount(const QModelIndex& parent) const -> int override { return 1; }; + inline auto rowCount(const QModelIndex& parent) const -> int override { return parent.isValid() ? 0 : modpacks.size(); }; + inline auto columnCount(const QModelIndex& parent) const -> int override { return parent.isValid() ? 0 : 1; }; inline auto flags(const QModelIndex& index) const -> Qt::ItemFlags override { return QAbstractListModel::flags(index); }; auto debugName() const -> QString; @@ -46,7 +46,7 @@ class ListModel : public QAbstractListModel { void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); - inline auto canFetchMore(const QModelIndex& parent) const -> bool override { return searchState == CanPossiblyFetchMore; }; + inline auto canFetchMore(const QModelIndex& parent) const -> bool override { return parent.isValid() ? false : searchState == CanPossiblyFetchMore; }; public slots: void searchRequestFinished(QJsonDocument& doc); diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp index ef9a92689..2ce04068b 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlListModel.cpp @@ -32,12 +32,12 @@ ListModel::~ListModel() int ListModel::rowCount(const QModelIndex &parent) const { - return modpacks.size(); + return parent.isValid() ? 0 : modpacks.size(); } int ListModel::columnCount(const QModelIndex &parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QVariant ListModel::data(const QModelIndex &index, int role) const diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp index 9138dcbbb..cdb4532c8 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp @@ -75,12 +75,12 @@ QVector AtlOptionalModListModel::getResult() { } int AtlOptionalModListModel::rowCount(const QModelIndex &parent) const { - return m_mods.size(); + return parent.isValid() ? 0 : m_mods.size(); } int AtlOptionalModListModel::columnCount(const QModelIndex &parent) const { // Enabled, Name, Description - return 3; + return parent.isValid() ? 0 : 3; } QVariant AtlOptionalModListModel::data(const QModelIndex &index, int role) const { diff --git a/launcher/ui/pages/modplatform/flame/FlameModel.cpp b/launcher/ui/pages/modplatform/flame/FlameModel.cpp index debae8c32..127c3de52 100644 --- a/launcher/ui/pages/modplatform/flame/FlameModel.cpp +++ b/launcher/ui/pages/modplatform/flame/FlameModel.cpp @@ -15,12 +15,12 @@ ListModel::~ListModel() {} int ListModel::rowCount(const QModelIndex& parent) const { - return modpacks.size(); + return parent.isValid() ? 0 : modpacks.size(); } int ListModel::columnCount(const QModelIndex& parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QVariant ListModel::data(const QModelIndex& index, int role) const diff --git a/launcher/ui/pages/modplatform/ftb/FtbListModel.cpp b/launcher/ui/pages/modplatform/ftb/FtbListModel.cpp index 3a1499448..ce2b2b181 100644 --- a/launcher/ui/pages/modplatform/ftb/FtbListModel.cpp +++ b/launcher/ui/pages/modplatform/ftb/FtbListModel.cpp @@ -34,12 +34,12 @@ ListModel::~ListModel() int ListModel::rowCount(const QModelIndex &parent) const { - return modpacks.size(); + return parent.isValid() ? 0 : modpacks.size(); } int ListModel::columnCount(const QModelIndex &parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QVariant ListModel::data(const QModelIndex &index, int role) const diff --git a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp index 6f11cc955..6b1f6b899 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp @@ -125,12 +125,12 @@ QString ListModel::translatePackType(PackType type) const int ListModel::rowCount(const QModelIndex &parent) const { - return modpacks.size(); + return parent.isValid() ? 0 : modpacks.size(); } int ListModel::columnCount(const QModelIndex &parent) const { - return 1; + return parent.isValid() ? 0 : 1; } QVariant ListModel::data(const QModelIndex &index, int role) const diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 6f33e11e4..3be377a1d 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -55,8 +55,8 @@ class ModpackListModel : public QAbstractListModel { ModpackListModel(ModrinthPage* parent); ~ModpackListModel() override = default; - inline auto rowCount(const QModelIndex& parent) const -> int override { return modpacks.size(); }; - inline auto columnCount(const QModelIndex& parent) const -> int override { return 1; }; + inline auto rowCount(const QModelIndex& parent) const -> int override { return parent.isValid() ? 0 : modpacks.size(); }; + inline auto columnCount(const QModelIndex& parent) const -> int override { return parent.isValid() ? 0 : 1; }; inline auto flags(const QModelIndex& index) const -> Qt::ItemFlags override { return QAbstractListModel::flags(index); }; auto debugName() const -> QString; @@ -74,7 +74,7 @@ class ModpackListModel : public QAbstractListModel { void getLogo(const QString& logo, const QString& logoUrl, LogoCallback callback); - inline auto canFetchMore(const QModelIndex& parent) const -> bool override { return searchState == CanPossiblyFetchMore; }; + inline auto canFetchMore(const QModelIndex& parent) const -> bool override { return parent.isValid() ? false : searchState == CanPossiblyFetchMore; }; public slots: void searchRequestFinished(QJsonDocument& doc_all); diff --git a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp index 742f4f2a3..b2af1ac0c 100644 --- a/launcher/ui/pages/modplatform/technic/TechnicModel.cpp +++ b/launcher/ui/pages/modplatform/technic/TechnicModel.cpp @@ -80,14 +80,14 @@ QVariant Technic::ListModel::data(const QModelIndex& index, int role) const return QVariant(); } -int Technic::ListModel::columnCount(const QModelIndex&) const +int Technic::ListModel::columnCount(const QModelIndex& parent) const { - return 1; + return parent.isValid() ? 0 : 1; } -int Technic::ListModel::rowCount(const QModelIndex&) const +int Technic::ListModel::rowCount(const QModelIndex& parent) const { - return modpacks.size(); + return parent.isValid() ? 0 : modpacks.size(); } void Technic::ListModel::searchWithTerm(const QString& term) From ac993aa31fcab79473f62c2d958b91e921b6930e Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Sun, 13 Nov 2022 02:10:45 +0000 Subject: [PATCH 0253/1149] Use Q_UNUSED instead of [[maybe_unused]] in onParseFailed Qt5 on Ubuntu cannot handle [[maybe_unused]] in this function Signed-off-by: TheLastRar --- launcher/minecraft/mod/ResourceFolderModel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/ResourceFolderModel.h b/launcher/minecraft/mod/ResourceFolderModel.h index 74a1b62d4..fe283b043 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.h +++ b/launcher/minecraft/mod/ResourceFolderModel.h @@ -176,7 +176,7 @@ class ResourceFolderModel : public QAbstractListModel { * if the resource is complex and has more stuff to parse. */ virtual void onParseSucceeded(int ticket, QString resource_id); - virtual void onParseFailed([[maybe_unused]] int ticket, [[maybe_unused]] QString resource_id) {} + virtual void onParseFailed(int ticket, QString resource_id) { Q_UNUSED(ticket); Q_UNUSED(resource_id); } protected: // Represents the relationship between a column's index (represented by the list index), and it's sorting key. From aef5349aee82922fb7cedab7489bc84766453700 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Mon, 14 Nov 2022 19:04:41 +0000 Subject: [PATCH 0254/1149] Pass index.parent() as parent parameter for rowCount Signed-off-by: TheLastRar --- launcher/minecraft/PackProfile.cpp | 2 +- launcher/minecraft/auth/AccountList.cpp | 2 +- launcher/minecraft/mod/ResourceFolderModel.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 89b85d6a6..6ce525eb1 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -613,7 +613,7 @@ QVariant PackProfile::data(const QModelIndex &index, int role) const bool PackProfile::setData(const QModelIndex& index, const QVariant& value, int role) { - if (!index.isValid() || index.row() < 0 || index.row() >= rowCount(index)) + if (!index.isValid() || index.row() < 0 || index.row() >= rowCount(index.parent())) { return false; } diff --git a/launcher/minecraft/auth/AccountList.cpp b/launcher/minecraft/auth/AccountList.cpp index 6ea62a50d..9e2fd1113 100644 --- a/launcher/minecraft/auth/AccountList.cpp +++ b/launcher/minecraft/auth/AccountList.cpp @@ -421,7 +421,7 @@ int AccountList::columnCount(const QModelIndex &parent) const Qt::ItemFlags AccountList::flags(const QModelIndex &index) const { - if (index.row() < 0 || index.row() >= rowCount(index) || !index.isValid()) + if (index.row() < 0 || index.row() >= rowCount(index.parent()) || !index.isValid()) { return Qt::NoItemFlags; } diff --git a/launcher/minecraft/mod/ResourceFolderModel.cpp b/launcher/minecraft/mod/ResourceFolderModel.cpp index b23563091..0310c8f6e 100644 --- a/launcher/minecraft/mod/ResourceFolderModel.cpp +++ b/launcher/minecraft/mod/ResourceFolderModel.cpp @@ -426,7 +426,7 @@ QVariant ResourceFolderModel::data(const QModelIndex& index, int role) const bool ResourceFolderModel::setData(const QModelIndex& index, const QVariant& value, int role) { int row = index.row(); - if (row < 0 || row >= rowCount(index) || !index.isValid()) + if (row < 0 || row >= rowCount(index.parent()) || !index.isValid()) return false; if (role == Qt::CheckStateRole) From 8d6aecd9447f0740d70f7397a176bb744605c2e3 Mon Sep 17 00:00:00 2001 From: leo78913 Date: Sun, 6 Nov 2022 12:25:11 -0300 Subject: [PATCH 0255/1149] add the missing icons to the legacy icon theme Signed-off-by: leo78913 --- launcher/resources/multimc/multimc.qrc | 8 + .../resources/multimc/scalable/delete.svg | 282 +++++++++++ .../resources/multimc/scalable/export.svg | 466 ++++++++++++++++++ .../resources/multimc/scalable/launch.svg | 96 ++++ .../resources/multimc/scalable/rename.svg | 437 ++++++++++++++++ launcher/resources/multimc/scalable/tag.svg | 398 +++++++++++++++ 6 files changed, 1687 insertions(+) create mode 100644 launcher/resources/multimc/scalable/delete.svg create mode 100644 launcher/resources/multimc/scalable/export.svg create mode 100644 launcher/resources/multimc/scalable/launch.svg create mode 100644 launcher/resources/multimc/scalable/rename.svg create mode 100644 launcher/resources/multimc/scalable/tag.svg diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc index 3f3d22fc1..270dd0099 100644 --- a/launcher/resources/multimc/multimc.qrc +++ b/launcher/resources/multimc/multimc.qrc @@ -312,5 +312,13 @@ scalable/instances/fox.svg scalable/instances/bee.svg scalable/instances/prismlauncher.svg + + + scalable/delete.svg + scalable/tag.svg + scalable/rename.svg + + scalable/export.svg + scalable/launch.svg diff --git a/launcher/resources/multimc/scalable/delete.svg b/launcher/resources/multimc/scalable/delete.svg new file mode 100644 index 000000000..414cbd5c6 --- /dev/null +++ b/launcher/resources/multimc/scalable/delete.svg @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/export.svg b/launcher/resources/multimc/scalable/export.svg new file mode 100644 index 000000000..2605de14e --- /dev/null +++ b/launcher/resources/multimc/scalable/export.svg @@ -0,0 +1,466 @@ + + + + + + + + + + + unsorted + + + + + Open Clip Art Library, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons + + + + + + + + + + + + + + image/svg+xml + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/launch.svg b/launcher/resources/multimc/scalable/launch.svg new file mode 100644 index 000000000..321647a0b --- /dev/null +++ b/launcher/resources/multimc/scalable/launch.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/rename.svg b/launcher/resources/multimc/scalable/rename.svg new file mode 100644 index 000000000..a585e264b --- /dev/null +++ b/launcher/resources/multimc/scalable/rename.svg @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/tag.svg b/launcher/resources/multimc/scalable/tag.svg new file mode 100644 index 000000000..81b5d545c --- /dev/null +++ b/launcher/resources/multimc/scalable/tag.svg @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From be765f8d883697d2284343f9ee6c858987622857 Mon Sep 17 00:00:00 2001 From: Redson Date: Mon, 14 Nov 2022 16:33:25 -0300 Subject: [PATCH 0256/1149] feat: Add empty menu Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 26 ++++++++++++++++++++++++++ launcher/ui/MainWindow.h | 2 ++ 2 files changed, 28 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 85b00b677..31d0f6c28 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -264,6 +264,8 @@ public: TranslatedAction actionLockToolbars; + TranslatedAction actionChangeTheme; + QVector all_toolbuttons; QWidget *centralWidget = nullptr; @@ -428,6 +430,11 @@ public: actionLockToolbars.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Lock Toolbars")); actionLockToolbars->setCheckable(true); all_actions.append(&actionLockToolbars); + + actionChangeTheme = TranslatedAction(MainWindow); + actionChangeTheme->setObjectName(QStringLiteral("actionChangeTheme")); + actionChangeTheme.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Themes")); + all_actions.append(&actionChangeTheme); } void createMainToolbar(QMainWindow *MainWindow) @@ -528,6 +535,8 @@ public: viewMenu = menuBar->addMenu(tr("&View")); viewMenu->setSeparatorsCollapsible(false); + viewMenu->addAction(actionChangeTheme); + viewMenu->addSeparator(); viewMenu->addAction(actionCAT); viewMenu->addSeparator(); @@ -822,6 +831,7 @@ public: createInstanceToolbar(MainWindow); MainWindow->updateToolsMenu(); + MainWindow->updateThemeMenu(); retranslateUi(MainWindow); @@ -1271,6 +1281,22 @@ void MainWindow::updateToolsMenu() ui->actionLaunchInstance->setMenu(launchMenu); } +void MainWindow::updateThemeMenu() +{ + QMenu *themeMenu = ui->actionChangeTheme->menu(); + + if (themeMenu) + { + themeMenu->clear(); + } + else + { + themeMenu = new QMenu(this); + } + + ui->actionChangeTheme->setMenu(themeMenu); +} + void MainWindow::repopulateAccountsMenu() { accountMenu->clear(); diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index f9d1f1c73..47e221b76 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -170,6 +170,8 @@ private slots: void updateToolsMenu(); + void updateThemeMenu(); + void instanceActivated(QModelIndex); void instanceChanged(const QModelIndex ¤t, const QModelIndex &previous); From 5be947291285fc8ed10852b54a647ecd338d645d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 14 Nov 2022 21:20:38 +0100 Subject: [PATCH 0257/1149] fix: fix potentially uninitialized variable Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/modplatform/ModPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/pages/modplatform/ModPage.cpp b/launcher/ui/pages/modplatform/ModPage.cpp index 234f9f36f..677bc4d66 100644 --- a/launcher/ui/pages/modplatform/ModPage.cpp +++ b/launcher/ui/pages/modplatform/ModPage.cpp @@ -262,7 +262,7 @@ void ModPage::openUrl(const QUrl& url) const QString address = url.host() + url.path(); QRegularExpressionMatch match; - const char* page; + QString page; match = modrinth.match(address); if (match.hasMatch()) @@ -276,7 +276,7 @@ void ModPage::openUrl(const QUrl& url) page = "curseforge"; } - if (match.hasMatch()) { + if (!page.isNull()) { const QString slug = match.captured(1); // ensure the user isn't opening the same mod From cca052ccc9d644c84384ceefe97bbce45381a9e2 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Mon, 14 Nov 2022 22:46:41 +0200 Subject: [PATCH 0258/1149] Restore QRC headers Signed-off-by: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> --- launcher/resources/OSX/OSX.qrc | 3 ++- launcher/resources/iOS/iOS.qrc | 3 ++- launcher/resources/pe_blue/pe_blue.qrc | 3 ++- launcher/resources/pe_colored/pe_colored.qrc | 3 ++- launcher/resources/pe_dark/pe_dark.qrc | 3 ++- launcher/resources/pe_light/pe_light.qrc | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/launcher/resources/OSX/OSX.qrc b/launcher/resources/OSX/OSX.qrc index 3f50d6cf4..9d4511d1a 100644 --- a/launcher/resources/OSX/OSX.qrc +++ b/launcher/resources/OSX/OSX.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg diff --git a/launcher/resources/iOS/iOS.qrc b/launcher/resources/iOS/iOS.qrc index d7044fbb3..0b79efb2a 100644 --- a/launcher/resources/iOS/iOS.qrc +++ b/launcher/resources/iOS/iOS.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg diff --git a/launcher/resources/pe_blue/pe_blue.qrc b/launcher/resources/pe_blue/pe_blue.qrc index dc40103a3..639675f0a 100644 --- a/launcher/resources/pe_blue/pe_blue.qrc +++ b/launcher/resources/pe_blue/pe_blue.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg diff --git a/launcher/resources/pe_colored/pe_colored.qrc b/launcher/resources/pe_colored/pe_colored.qrc index bd1af6ff4..fac58da80 100644 --- a/launcher/resources/pe_colored/pe_colored.qrc +++ b/launcher/resources/pe_colored/pe_colored.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg diff --git a/launcher/resources/pe_dark/pe_dark.qrc b/launcher/resources/pe_dark/pe_dark.qrc index 05ef7e932..c0c6ee6cb 100644 --- a/launcher/resources/pe_dark/pe_dark.qrc +++ b/launcher/resources/pe_dark/pe_dark.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg diff --git a/launcher/resources/pe_light/pe_light.qrc b/launcher/resources/pe_light/pe_light.qrc index 6acca230d..bd6a24966 100644 --- a/launcher/resources/pe_light/pe_light.qrc +++ b/launcher/resources/pe_light/pe_light.qrc @@ -1,4 +1,5 @@ - + + index.theme scalable/about.svg From 0e916244f03cd8bd296f6cc4fe2be34a745ecab4 Mon Sep 17 00:00:00 2001 From: leo78913 Date: Mon, 14 Nov 2022 19:59:26 -0300 Subject: [PATCH 0259/1149] feat: Add themes and their logic. Signed-off-by: leo78913 --- launcher/ui/MainWindow.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 8d5e0c83f..cbdb2b8f7 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -106,6 +106,7 @@ #include "ui/dialogs/UpdateDialog.h" #include "ui/dialogs/EditAccountDialog.h" #include "ui/dialogs/ExportInstanceDialog.h" +#include "ui/themes/ITheme.h" #include "UpdateController.h" #include "KonamiCode.h" @@ -1313,6 +1314,25 @@ void MainWindow::updateThemeMenu() themeMenu = new QMenu(this); } + auto themes = APPLICATION->getValidApplicationThemes(); + + QActionGroup* ThemesGroup = new QActionGroup( this ); + + for (int i = 0; i < themes.size(); i++) + { + + auto *theme = themes[i]; + QAction * themeAction = themeMenu->addAction(theme->name()); + + themeAction->setCheckable(true); + themeAction->setActionGroup(ThemesGroup); + + connect(themeAction, &QAction::triggered, [theme]() { + APPLICATION->setApplicationTheme(theme->name().toLower(),false); + + }); + } + ui->actionChangeTheme->setMenu(themeMenu); } From ef53455b6610844a633624fa172b7bf80310651c Mon Sep 17 00:00:00 2001 From: Redson Date: Tue, 15 Nov 2022 05:19:46 -0300 Subject: [PATCH 0260/1149] fix: Build on QT6 Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index cbdb2b8f7..a00fb4025 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -49,7 +49,7 @@ #include #include - +#include #include #include #include From aa3ea79f94887aedc91c52860d5a7b6557900a6f Mon Sep 17 00:00:00 2001 From: Redson Date: Tue, 15 Nov 2022 05:38:31 -0300 Subject: [PATCH 0261/1149] fix: Check the current theme box on startup. Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index a00fb4025..f8a37596f 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1305,12 +1305,9 @@ void MainWindow::updateThemeMenu() { QMenu *themeMenu = ui->actionChangeTheme->menu(); - if (themeMenu) - { + if (themeMenu) { themeMenu->clear(); - } - else - { + } else { themeMenu = new QMenu(this); } @@ -1320,11 +1317,13 @@ void MainWindow::updateThemeMenu() for (int i = 0; i < themes.size(); i++) { - auto *theme = themes[i]; QAction * themeAction = themeMenu->addAction(theme->name()); themeAction->setCheckable(true); + if (APPLICATION->settings()->get("ApplicationTheme").toString() == theme->id()) { + themeAction->setChecked(true); + } themeAction->setActionGroup(ThemesGroup); connect(themeAction, &QAction::triggered, [theme]() { From a12f892841399163fbc12e72c61c7ed6fae882cf Mon Sep 17 00:00:00 2001 From: Redson Date: Tue, 15 Nov 2022 05:46:24 -0300 Subject: [PATCH 0262/1149] fix: Check the box when the theme is changed via settings Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index f8a37596f..e2ab3b466 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1965,6 +1965,7 @@ void MainWindow::globalSettingsClosed() proxymodel->sort(0); updateMainToolBar(); updateToolsMenu(); + updateThemeMenu(); updateStatusCenter(); // This needs to be done to prevent UI elements disappearing in the event the config is changed // but Prism Launcher exits abnormally, causing the window state to never be saved: From 6fe626ab9ad9f76b793f09ceb5e8e8cced3f15ba Mon Sep 17 00:00:00 2001 From: Redson Date: Tue, 15 Nov 2022 06:09:13 -0300 Subject: [PATCH 0263/1149] feat: Make the changes persistent. Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index e2ab3b466..f62d97601 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1327,8 +1327,8 @@ void MainWindow::updateThemeMenu() themeAction->setActionGroup(ThemesGroup); connect(themeAction, &QAction::triggered, [theme]() { - APPLICATION->setApplicationTheme(theme->name().toLower(),false); - + APPLICATION->setApplicationTheme(theme->id(),false); + APPLICATION->settings()->set("ApplicationTheme", theme->id()); }); } From 7439fd6bcba789488c8b67128a7e5d65054a46a0 Mon Sep 17 00:00:00 2001 From: leo78913 Date: Tue, 15 Nov 2022 10:56:41 -0300 Subject: [PATCH 0264/1149] fix: Fix some stuff in the menu bar - Remove duplicated launch actions - Enable the add instance action icon in menus - Remove ugly separator at the end of the help menu if the updater is disabled - Add icons to the help and news menu items Signed-off-by: leo78913 --- launcher/ui/MainWindow.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 85b00b677..6e3b95ff8 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -290,7 +290,6 @@ public: actionAddInstance = TranslatedAction(MainWindow); actionAddInstance->setObjectName(QStringLiteral("actionAddInstance")); actionAddInstance->setIcon(APPLICATION->getThemedIcon("new")); - actionAddInstance->setIconVisibleInMenu(false); actionAddInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Add Instanc&e...")); actionAddInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add a new instance.")); actionAddInstance->setShortcut(QKeySequence::New); @@ -509,8 +508,6 @@ public: fileMenu->setSeparatorsCollapsible(false); fileMenu->addAction(actionAddInstance); fileMenu->addAction(actionLaunchInstance); - fileMenu->addAction(actionLaunchInstanceOffline); - fileMenu->addAction(actionLaunchInstanceDemo); fileMenu->addAction(actionKillInstance); fileMenu->addAction(actionCloseWindow); fileMenu->addSeparator(); @@ -555,10 +552,11 @@ public: helpMenu->addAction(actionDISCORD); if (!BuildConfig.SUBREDDIT_URL.isEmpty()) helpMenu->addAction(actionREDDIT); - helpMenu->addSeparator(); if(BuildConfig.UPDATER_ENABLED) + { + helpMenu->addSeparator(); helpMenu->addAction(actionCheckUpdate); - + } MainWindow->setMenuBar(menuBar); } @@ -576,6 +574,7 @@ public: actionOpenWiki->setObjectName(QStringLiteral("actionOpenWiki")); actionOpenWiki.setTextId(QT_TRANSLATE_NOOP("MainWindow", "%1 &Help")); actionOpenWiki.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the %1 wiki")); + actionOpenWiki->setIcon(APPLICATION->getThemedIcon("help")); connect(actionOpenWiki, &QAction::triggered, MainWindow, &MainWindow::on_actionOpenWiki_triggered); all_actions.append(&actionOpenWiki); @@ -583,6 +582,7 @@ public: actionNewsMenuBar->setObjectName(QStringLiteral("actionNewsMenuBar")); actionNewsMenuBar.setTextId(QT_TRANSLATE_NOOP("MainWindow", "%1 &News")); actionNewsMenuBar.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the %1 wiki")); + actionNewsMenuBar->setIcon(APPLICATION->getThemedIcon("news")); connect(actionNewsMenuBar, &QAction::triggered, MainWindow, &MainWindow::on_actionMoreNews_triggered); all_actions.append(&actionNewsMenuBar); } From 7705f290ca69c0478f698ddf06a5f1edb731e8fc Mon Sep 17 00:00:00 2001 From: flow Date: Tue, 15 Nov 2022 12:07:11 -0300 Subject: [PATCH 0265/1149] fix: don't retry to load RP images that can't fit in the cache Avoids an infinite loop when the image is too big. Signed-off-by: flow --- launcher/minecraft/mod/ResourcePack.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index 3fc10a2fd..b97bedf8d 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -47,6 +47,12 @@ void ResourcePack::setImage(QImage new_image) m_pack_image_cache_key.key = QPixmapCache::insert(QPixmap::fromImage(new_image)); m_pack_image_cache_key.was_ever_used = true; + + // This can happen if the pixmap is too big to fit in the cache :c + if (!m_pack_image_cache_key.key.isValid()) { + qWarning() << "Could not insert a image cache entry! Ignoring it."; + m_pack_image_cache_key.was_ever_used = false; + } } QPixmap ResourcePack::image(QSize size) From 464b9ebc95ca0743dd13337a9db7159aab76292a Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Mon, 14 Nov 2022 17:29:41 +0100 Subject: [PATCH 0266/1149] feat: add flatpak builds to the ci for testing Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 23 +++++- flatpak/org.prismlauncher.PrismLauncher.yml | 83 +++++++++++++++++++++ flatpak/prime-run | 4 + flatpak/prismlauncher | 11 +++ 4 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 flatpak/org.prismlauncher.PrismLauncher.yml create mode 100644 flatpak/prime-run create mode 100644 flatpak/prismlauncher diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 61fd9b4cb..df8aae394 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -492,16 +492,35 @@ jobs: submodules: 'true' - name: Set short version shell: bash + if: inputs.build_type == 'Debug' run: | ver_short=`git rev-parse --short HEAD` echo "VERSION=$ver_short" >> $GITHUB_ENV - name: Package Snap (Linux) id: snapcraft - if: runner.os == 'Linux' && inputs.build_type == 'Debug' + if: inputs.build_type == 'Debug' uses: snapcore/action-build@v1 - name: Upload Snap (Linux) - if: runner.os == 'Linux' && inputs.build_type == 'Debug' + if: inputs.build_type == 'Debug' uses: actions/upload-artifact@v3 with: name: prismlauncher_${{ env.VERSION }}_amd64.snap path: ${{ steps.snapcraft.outputs.snap }} + + flatpak: + runs-on: ubuntu-latest + container: + image: bilelmoussaoui/flatpak-github-actions:kde-5.15-22.08 + options: --privileged + steps: + - name: Checkout + uses: actions/checkout@v3 + if: inputs.build_type == 'Debug' + with: + submodules: 'true' + - name: Build Flatpak (Linux) + if: inputs.build_type == 'Debug' + uses: flatpak/flatpak-github-actions/flatpak-builder@v4 + with: + bundle: "Prism Launcher.flatpak" + manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml new file mode 100644 index 000000000..fca306d78 --- /dev/null +++ b/flatpak/org.prismlauncher.PrismLauncher.yml @@ -0,0 +1,83 @@ +id: org.prismlauncher.PrismLauncher +runtime: org.kde.Platform +runtime-version: "5.15-22.08" +sdk: org.kde.Sdk +sdk-extensions: + - org.freedesktop.Sdk.Extension.openjdk17 + - org.freedesktop.Sdk.Extension.openjdk8 +add-extensions: + com.valvesoftware.Steam.Utility.gamescope: + version: stable + add-ld-path: lib + no-autodownload: true + autodelete: false + directory: utils/gamescope + +command: prismlauncher +finish-args: + - --share=ipc + - --socket=x11 + - --socket=wayland + - --device=all + - --share=network + - --socket=pulseaudio + # for Discord RPC mods + - --filesystem=xdg-run/app/com.discordapp.Discord:create + # Mod drag&drop + - --filesystem=xdg-download:ro + +modules: + - name: prismlauncher + buildsystem: cmake-ninja + config-opts: + - -DLauncher_BUILD_PLATFORM=flatpak + - -DCMAKE_BUILD_TYPE=Debug + build-options: + env: + JAVA_HOME: /usr/lib/sdk/openjdk17/jvm/openjdk-17 + JAVA_COMPILER: /usr/lib/sdk/openjdk17/jvm/openjdk-17/bin/javac + sources: + - type: dir + path: ../ + - name: openjdk + buildsystem: simple + build-commands: + - mkdir -p /app/jdk/ + - /usr/lib/sdk/openjdk17/install.sh + - mv /app/jre /app/jdk/17 + - /usr/lib/sdk/openjdk8/install.sh + - mv /app/jre /app/jdk/8 + cleanup: [/jre] + - name: xrandr + buildsystem: autotools + sources: + - type: archive + url: https://xorg.freedesktop.org/archive/individual/app/xrandr-1.5.1.tar.xz + sha256: 7bc76daf9d72f8aff885efad04ce06b90488a1a169d118dea8a2b661832e8762 + cleanup: [/share/man, /bin/xkeystone] + - name: gamemode + buildsystem: meson + config-opts: + - -Dwith-sd-bus-provider=no-daemon + - -Dwith-examples=false + post-install: + # gamemoderun is installed for users who want to use wrapper commands + # post-install is running inside the build dir, we need it from the source though + - install -Dm755 ../data/gamemoderun -t /app/bin + sources: + - type: git + url: https://github.com/FeralInteractive/gamemode + tag: "1.7" + commit: 4dc99dff76218718763a6b07fc1900fa6d1dafd9 + - name: enhance + buildsystem: simple + build-commands: + - mkdir -p /app/utils/gamescope + - install -Dm755 prime-run /app/bin/prime-run + - mv /app/bin/prismlauncher /app/bin/prismrun + - install -Dm755 prismlauncher /app/bin/prismlauncher + sources: + - type: file + path: ../flatpak/prime-run + - type: file + path: ../flatpak/prismlauncher diff --git a/flatpak/prime-run b/flatpak/prime-run new file mode 100644 index 000000000..946c28dd5 --- /dev/null +++ b/flatpak/prime-run @@ -0,0 +1,4 @@ +#!/bin/sh + +export __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia +exec "$@" diff --git a/flatpak/prismlauncher b/flatpak/prismlauncher new file mode 100644 index 000000000..bb8767113 --- /dev/null +++ b/flatpak/prismlauncher @@ -0,0 +1,11 @@ +#!/bin/bash + +# discord RPC +for i in {0..9}; do + test -S "$XDG_RUNTIME_DIR"/discord-ipc-"$i" || ln -sf {app/com.discordapp.Discord,"$XDG_RUNTIME_DIR"}/discord-ipc-"$i"; +done + +export PATH="${PATH}${PATH:+:}/app/utils/gamescope/bin:/usr/lib/extensions/vulkan/MangoHud/bin" +export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}${LD_LIBRARY_PATH:+:}/usr/lib/extensions/vulkan/MangoHud/\$LIB/" + +exec /app/bin/prismrun "$@" From ee096edfff11ba6773793b9f0bf7aaa8bd273110 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 15 Nov 2022 20:58:05 +0100 Subject: [PATCH 0267/1149] chore: bump tomlplusplus Should fix issues with builds on aarch64 Signed-off-by: Sefa Eyeoglu --- libraries/tomlplusplus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tomlplusplus b/libraries/tomlplusplus index cc741c9f5..0a90913ab 160000 --- a/libraries/tomlplusplus +++ b/libraries/tomlplusplus @@ -1 +1 @@ -Subproject commit cc741c9f5f2a62856a2a2e9e275f61eb0591c09c +Subproject commit 0a90913abf9390b9e08ab6d3b40ac11634553f38 From c1763cc4b0871230a86e58aad07aacaf7b19182c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 15 Nov 2022 21:23:20 +0100 Subject: [PATCH 0268/1149] fix: disable FLOAT16 in toml++ Signed-off-by: Sefa Eyeoglu --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0db05f98a..8fc0d3265 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_NO_DEPRECATED_WARNINGS=Y") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DQT_DISABLE_DEPRECATED_BEFORE=0x050C00") +# Fix aarch64 build for toml++ +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTOML_ENABLE_FLOAT16=0") + # set CXXFLAGS for build targets set(CMAKE_CXX_FLAGS_RELEASE "-O2 -D_FORTIFY_SOURCE=2 ${CMAKE_CXX_FLAGS_RELEASE}") From c4c1e75de8825a4af403046536a7b2acd72a56c3 Mon Sep 17 00:00:00 2001 From: flow Date: Tue, 15 Nov 2022 18:13:15 -0300 Subject: [PATCH 0269/1149] fix: use QPixmapCache only from the main thread It's a required condition. Signed-off-by: flow --- launcher/Application.cpp | 6 ++ launcher/CMakeLists.txt | 2 + launcher/MTPixmapCache.h | 95 +++++++++++++++++++++++++ launcher/minecraft/mod/ResourcePack.cpp | 8 ++- 4 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 launcher/MTPixmapCache.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 45cd94227..c3d624ad0 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -90,6 +90,7 @@ #include #include "InstanceList.h" +#include "MTPixmapCache.h" #include #include "icons/IconList.h" @@ -134,6 +135,8 @@ static const QLatin1String liveCheckFile("live.check"); +PixmapCache* PixmapCache::s_instance = nullptr; + namespace { void appDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { @@ -693,6 +696,9 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) m_globalSettingsProvider->addPage(); m_globalSettingsProvider->addPage(); } + + PixmapCache::setInstance(new PixmapCache(this)); + qDebug() << "<> Settings loaded."; } diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8db934298..0605be239 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -89,6 +89,8 @@ set(CORE_SOURCES # Time MMCTime.h MMCTime.cpp + + MTPixmapCache.h ) set(PATHMATCHER_SOURCES diff --git a/launcher/MTPixmapCache.h b/launcher/MTPixmapCache.h new file mode 100644 index 000000000..57847a0e1 --- /dev/null +++ b/launcher/MTPixmapCache.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include +#include + +#define GET_TYPE() \ + Qt::ConnectionType type; \ + if (QThread::currentThread() != QCoreApplication::instance()->thread()) \ + type = Qt::BlockingQueuedConnection; \ + else \ + type = Qt::DirectConnection; + +#define DEFINE_FUNC_NO_PARAM(NAME, RET_TYPE) \ + static RET_TYPE NAME() \ + { \ + RET_TYPE ret; \ + GET_TYPE() \ + QMetaObject::invokeMethod(s_instance, "_" #NAME, type, Q_RETURN_ARG(RET_TYPE, ret)); \ + return ret; \ + } +#define DEFINE_FUNC_ONE_PARAM(NAME, RET_TYPE, PARAM_1_TYPE) \ + static RET_TYPE NAME(PARAM_1_TYPE p1) \ + { \ + RET_TYPE ret; \ + GET_TYPE() \ + QMetaObject::invokeMethod(s_instance, "_" #NAME, type, Q_RETURN_ARG(RET_TYPE, ret), Q_ARG(PARAM_1_TYPE, p1)); \ + return ret; \ + } +#define DEFINE_FUNC_TWO_PARAM(NAME, RET_TYPE, PARAM_1_TYPE, PARAM_2_TYPE) \ + static RET_TYPE NAME(PARAM_1_TYPE p1, PARAM_2_TYPE p2) \ + { \ + RET_TYPE ret; \ + GET_TYPE() \ + QMetaObject::invokeMethod(s_instance, "_" #NAME, type, Q_RETURN_ARG(RET_TYPE, ret), Q_ARG(PARAM_1_TYPE, p1), \ + Q_ARG(PARAM_2_TYPE, p2)); \ + return ret; \ + } + +/** A wrapper around QPixmapCache with thread affinity with the main thread. + */ +class PixmapCache final : public QObject { + Q_OBJECT + + public: + PixmapCache(QObject* parent) : QObject(parent) {} + ~PixmapCache() override = default; + + static PixmapCache& instance() { return *s_instance; } + static void setInstance(PixmapCache* i) { s_instance = i; } + + public: + DEFINE_FUNC_NO_PARAM(cacheLimit, int) + DEFINE_FUNC_NO_PARAM(clear, bool) + DEFINE_FUNC_TWO_PARAM(find, bool, const QString&, QPixmap*) + DEFINE_FUNC_TWO_PARAM(find, bool, const QPixmapCache::Key&, QPixmap*) + DEFINE_FUNC_TWO_PARAM(insert, bool, const QString&, const QPixmap&) + DEFINE_FUNC_ONE_PARAM(insert, QPixmapCache::Key, const QPixmap&) + DEFINE_FUNC_ONE_PARAM(remove, bool, const QString&) + DEFINE_FUNC_ONE_PARAM(remove, bool, const QPixmapCache::Key&) + DEFINE_FUNC_TWO_PARAM(replace, bool, const QPixmapCache::Key&, const QPixmap&) + DEFINE_FUNC_ONE_PARAM(setCacheLimit, bool, int) + + // NOTE: Every function returns something non-void to simplify the macros. + private slots: + int _cacheLimit() { return QPixmapCache::cacheLimit(); } + bool _clear() + { + QPixmapCache::clear(); + return true; + } + bool _find(const QString& key, QPixmap* pixmap) { return QPixmapCache::find(key, pixmap); } + bool _find(const QPixmapCache::Key& key, QPixmap* pixmap) { return QPixmapCache::find(key, pixmap); } + bool _insert(const QString& key, const QPixmap& pixmap) { return QPixmapCache::insert(key, pixmap); } + QPixmapCache::Key _insert(const QPixmap& pixmap) { return QPixmapCache::insert(pixmap); } + bool _remove(const QString& key) + { + QPixmapCache::remove(key); + return true; + } + bool _remove(const QPixmapCache::Key& key) + { + QPixmapCache::remove(key); + return true; + } + bool _replace(const QPixmapCache::Key& key, const QPixmap& pixmap) { return QPixmapCache::replace(key, pixmap); } + bool _setCacheLimit(int n) + { + QPixmapCache::setCacheLimit(n); + return true; + } + + private: + static PixmapCache* s_instance; +}; diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index b97bedf8d..242fd9fe0 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -1,9 +1,11 @@ #include "ResourcePack.h" +#include #include #include #include +#include "MTPixmapCache.h" #include "Version.h" #include "minecraft/mod/tasks/LocalResourcePackParseTask.h" @@ -43,9 +45,9 @@ void ResourcePack::setImage(QImage new_image) Q_ASSERT(!new_image.isNull()); if (m_pack_image_cache_key.key.isValid()) - QPixmapCache::remove(m_pack_image_cache_key.key); + PixmapCache::instance().remove(m_pack_image_cache_key.key); - m_pack_image_cache_key.key = QPixmapCache::insert(QPixmap::fromImage(new_image)); + m_pack_image_cache_key.key = PixmapCache::instance().insert(QPixmap::fromImage(new_image)); m_pack_image_cache_key.was_ever_used = true; // This can happen if the pixmap is too big to fit in the cache :c @@ -58,7 +60,7 @@ void ResourcePack::setImage(QImage new_image) QPixmap ResourcePack::image(QSize size) { QPixmap cached_image; - if (QPixmapCache::find(m_pack_image_cache_key.key, &cached_image)) { + if (PixmapCache::instance().find(m_pack_image_cache_key.key, &cached_image)) { if (size.isNull()) return cached_image; return cached_image.scaled(size); From 9f30c6d94b3c3fd5dbc5f998c9e9c8083b4d57df Mon Sep 17 00:00:00 2001 From: Fayne Aldan Date: Tue, 15 Nov 2022 18:33:51 -0700 Subject: [PATCH 0270/1149] Add commit hash to `--version` Signed-off-by: Fayne Aldan --- launcher/Application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 45cd94227..883f8968b 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -226,7 +226,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) setOrganizationDomain(BuildConfig.LAUNCHER_DOMAIN); setApplicationName(BuildConfig.LAUNCHER_NAME); setApplicationDisplayName(QString("%1 %2").arg(BuildConfig.LAUNCHER_DISPLAYNAME, BuildConfig.printableVersionString())); - setApplicationVersion(BuildConfig.printableVersionString()); + setApplicationVersion(BuildConfig.printableVersionString() + "\n" + BuildConfig.GIT_COMMIT); setDesktopFileName(BuildConfig.LAUNCHER_DESKTOPFILENAME); startTime = QDateTime::currentDateTime(); From 88feebe499ece4eb065493b84aab4dd5c9b0c32a Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 16 Nov 2022 09:25:11 +0100 Subject: [PATCH 0271/1149] chore: use qt 6.4.1 on Windows-MSVC Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 61fd9b4cb..965d25f34 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -64,7 +64,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: '' - qt_version: '6.4.0' + qt_version: '6.4.1' qt_modules: 'qt5compat qtimageformats' qt_tools: '' From 37a117d2effc21b23b86ada80951bfd23671a64b Mon Sep 17 00:00:00 2001 From: RedsonBr140 Date: Wed, 16 Nov 2022 12:24:28 -0300 Subject: [PATCH 0272/1149] chore: Var definition inside the for loop Co-authored-by: flow Signed-off-by: RedsonBr140 --- launcher/ui/MainWindow.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index f62d97601..1f8444afa 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1315,9 +1315,7 @@ void MainWindow::updateThemeMenu() QActionGroup* ThemesGroup = new QActionGroup( this ); - for (int i = 0; i < themes.size(); i++) - { - auto *theme = themes[i]; + for (auto* theme : themes) { QAction * themeAction = themeMenu->addAction(theme->name()); themeAction->setCheckable(true); From 8aae652be1ee876996bc833fcd74e1de9b1c61dc Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 16 Nov 2022 18:10:54 +0100 Subject: [PATCH 0273/1149] fix: remove unnecessary condition Signed-off-by: Sefa Eyeoglu --- launcher/minecraft/OneSixVersionFormat.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index cec4a55bb..c70e5ec55 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -225,11 +225,10 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc { QJsonObject agentObj = requireObject(agentVal); auto lib = libraryFromJson(*out, agentObj, filename); + QString arg = ""; - if (agentObj.contains("argument")) - { - readString(agentObj, "argument", arg); - } + readString(agentObj, "argument", arg); + AgentPtr agent(new Agent(lib, arg)); out->agents.append(agent); } From 40970a1a87a48f434dae8583f2c71942931c3fe1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 16 Nov 2022 18:11:17 +0100 Subject: [PATCH 0274/1149] fix: serialize metadata extensions Prism has introduced a few extensions to the meta component version format, which were not exported as JSON in the launcher. This caused the `Customize` button on the version page to not write these new properties to the custom component file. Signed-off-by: Sefa Eyeoglu --- launcher/minecraft/MojangVersionFormat.cpp | 9 +++++++++ launcher/minecraft/OneSixVersionFormat.cpp | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/launcher/minecraft/MojangVersionFormat.cpp b/launcher/minecraft/MojangVersionFormat.cpp index 9bbb4adab..9b442d632 100644 --- a/launcher/minecraft/MojangVersionFormat.cpp +++ b/launcher/minecraft/MojangVersionFormat.cpp @@ -306,6 +306,15 @@ void MojangVersionFormat::writeVersionProperties(const VersionFile* in, QJsonObj } out.insert("downloads", downloadsOut); } + if(in->compatibleJavaMajors.size()) + { + QJsonArray compatibleJavaMajorsOut; + for(auto compatibleJavaMajor : in->compatibleJavaMajors) + { + compatibleJavaMajorsOut.append(compatibleJavaMajor); + } + out.insert("compatibleJavaMajors", compatibleJavaMajorsOut); + } } QJsonDocument MojangVersionFormat::versionFileToJson(const VersionFilePtr &patch) diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index c70e5ec55..ac29791b7 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -331,6 +331,20 @@ QJsonDocument OneSixVersionFormat::versionFileToJson(const VersionFilePtr &patch writeString(root, "appletClass", patch->appletClass); writeStringList(root, "+tweakers", patch->addTweakers); writeStringList(root, "+traits", patch->traits.values()); + writeStringList(root, "+jvmArgs", patch->addnJvmArguments); + if (!patch->agents.isEmpty()) + { + QJsonArray array; + for (auto value: patch->agents) + { + QJsonObject agentOut = OneSixVersionFormat::libraryToJson(value->library().get()); + if (!value->argument().isEmpty()) + agentOut.insert("argument", value->argument()); + + array.append(agentOut); + } + root.insert("+agents", array); + } if (!patch->libraries.isEmpty()) { QJsonArray array; From ce958f4ffd8ee73ea14a8748dd63a79623358ee9 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 16 Nov 2022 23:20:31 +0100 Subject: [PATCH 0275/1149] refactor: use isEmpty instead of size for lists Signed-off-by: Sefa Eyeoglu --- launcher/minecraft/MojangVersionFormat.cpp | 10 +++++----- launcher/minecraft/OneSixVersionFormat.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/MojangVersionFormat.cpp b/launcher/minecraft/MojangVersionFormat.cpp index 9b442d632..623dcdfa6 100644 --- a/launcher/minecraft/MojangVersionFormat.cpp +++ b/launcher/minecraft/MojangVersionFormat.cpp @@ -135,7 +135,7 @@ QJsonObject libDownloadInfoToJson(MojangLibraryDownloadInfo::Ptr libinfo) { out.insert("artifact", downloadInfoToJson(libinfo->artifact)); } - if(libinfo->classifiers.size()) + if(!libinfo->classifiers.isEmpty()) { QJsonObject classifiersOut; for(auto iter = libinfo->classifiers.begin(); iter != libinfo->classifiers.end(); iter++) @@ -297,7 +297,7 @@ void MojangVersionFormat::writeVersionProperties(const VersionFile* in, QJsonObj { out.insert("assetIndex", assetIndexToJson(in->mojangAssetIndex)); } - if(in->mojangDownloads.size()) + if(!in->mojangDownloads.isEmpty()) { QJsonObject downloadsOut; for(auto iter = in->mojangDownloads.begin(); iter != in->mojangDownloads.end(); iter++) @@ -306,7 +306,7 @@ void MojangVersionFormat::writeVersionProperties(const VersionFile* in, QJsonObj } out.insert("downloads", downloadsOut); } - if(in->compatibleJavaMajors.size()) + if(!in->compatibleJavaMajors.isEmpty()) { QJsonArray compatibleJavaMajorsOut; for(auto compatibleJavaMajor : in->compatibleJavaMajors) @@ -405,7 +405,7 @@ QJsonObject MojangVersionFormat::libraryToJson(Library *library) iter++; } libRoot.insert("natives", nativeList); - if (library->m_extractExcludes.size()) + if (!library->m_extractExcludes.isEmpty()) { QJsonArray excludes; QJsonObject extract; @@ -417,7 +417,7 @@ QJsonObject MojangVersionFormat::libraryToJson(Library *library) libRoot.insert("extract", extract); } } - if (library->m_rules.size()) + if (!library->m_rules.isEmpty()) { QJsonArray allRules; for (auto &rule : library->m_rules) diff --git a/launcher/minecraft/OneSixVersionFormat.cpp b/launcher/minecraft/OneSixVersionFormat.cpp index ac29791b7..280f6b269 100644 --- a/launcher/minecraft/OneSixVersionFormat.cpp +++ b/launcher/minecraft/OneSixVersionFormat.cpp @@ -63,13 +63,13 @@ LibraryPtr OneSixVersionFormat::libraryFromJson(ProblemContainer & problems, con QJsonObject OneSixVersionFormat::libraryToJson(Library *library) { QJsonObject libRoot = MojangVersionFormat::libraryToJson(library); - if (library->m_absoluteURL.size()) + if (!library->m_absoluteURL.isEmpty()) libRoot.insert("MMC-absoluteUrl", library->m_absoluteURL); - if (library->m_hint.size()) + if (!library->m_hint.isEmpty()) libRoot.insert("MMC-hint", library->m_hint); - if (library->m_filename.size()) + if (!library->m_filename.isEmpty()) libRoot.insert("MMC-filename", library->m_filename); - if (library->m_displayname.size()) + if (!library->m_displayname.isEmpty()) libRoot.insert("MMC-displayname", library->m_displayname); return libRoot; } From bd3a693e700bc0b1ea9bbc72631ccd13ba755277 Mon Sep 17 00:00:00 2001 From: RedsonBr140 Date: Thu, 17 Nov 2022 06:20:53 -0300 Subject: [PATCH 0276/1149] chore: Change var name Co-authored-by: Sefa Eyeoglu Signed-off-by: RedsonBr140 --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 1f8444afa..dcf1be99d 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1313,7 +1313,7 @@ void MainWindow::updateThemeMenu() auto themes = APPLICATION->getValidApplicationThemes(); - QActionGroup* ThemesGroup = new QActionGroup( this ); + QActionGroup* themesGroup = new QActionGroup( this ); for (auto* theme : themes) { QAction * themeAction = themeMenu->addAction(theme->name()); From f72ac94c111a788d197e78fd4e0433513965807a Mon Sep 17 00:00:00 2001 From: Redson Date: Thu, 17 Nov 2022 06:39:05 -0300 Subject: [PATCH 0277/1149] fix: Fix usage below Signed-off-by: Redson --- launcher/ui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index dcf1be99d..e1ea13d31 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1322,7 +1322,7 @@ void MainWindow::updateThemeMenu() if (APPLICATION->settings()->get("ApplicationTheme").toString() == theme->id()) { themeAction->setChecked(true); } - themeAction->setActionGroup(ThemesGroup); + themeAction->setActionGroup(themesGroup); connect(themeAction, &QAction::triggered, [theme]() { APPLICATION->setApplicationTheme(theme->id(),false); From 90376749f07017c85460d6fa31f81e45c6053840 Mon Sep 17 00:00:00 2001 From: Sophie Marie Date: Thu, 17 Nov 2022 12:42:34 -0600 Subject: [PATCH 0278/1149] Fix AUR qt5-git and git having the wrong AUR links Signed-off-by: Sophie Marie --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8ea2e841..cb99f70fc 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Prebuilt Development builds are provided for **Linux**, **Windows** and **macOS* For **Arch**, **Debian**, **Fedora**, **OpenSUSE (Tumbleweed)** and **Gentoo**, respectively, you can use these packages for the latest development versions: -[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-A80030?style=flat-square&logo=debian&logoColor=white)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-51A2DA?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-3AB6A9?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-4D4270?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) +[![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-git/) [![prismlauncher-git](https://img.shields.io/badge/aur-prismlauncher--qt5--git-1793D1?style=flat-square&logo=archlinux&logoColor=white)](https://aur.archlinux.org/packages/prismlauncher-qt5-git/) [![prismlauncher-git](https://img.shields.io/badge/mpr-prismlauncher--git-A80030?style=flat-square&logo=debian&logoColor=white)](https://mpr.makedeb.org/packages/prismlauncher-git) [![prismlauncher-nightly](https://img.shields.io/badge/copr-prismlauncher--nightly-51A2DA?style=flat-square&logo=fedora&logoColor=white)](https://copr.fedorainfracloud.org/coprs/g3tchoo/prismlauncher/) [![prismlauncher-nightly](https://img.shields.io/badge/OBS-prismlauncher--nightly-3AB6A9?style=flat-square&logo=opensuse&logoColor=white)](https://build.opensuse.org/project/show/home:getchoo) [![prismlauncher-9999](https://img.shields.io/badge/gentoo-prismlauncher--9999-4D4270?style=flat-square&logo=gentoo&logoColor=white)](https://packages.gentoo.org/packages/games-action/prismlauncher) ## Community & Support From 52d43f843bceb861c92f8989a27194436924e087 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 17 Nov 2022 11:46:14 -0700 Subject: [PATCH 0279/1149] feat(BlockModsDialog): remove redundant Ui info Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- launcher/ui/dialogs/BlockedModsDialog.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index a0dd1a103..edb4ff7d4 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -38,12 +38,9 @@ BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, cons QString(tr("Your configured global mods folder and default downloads folder " "are automatically checked for the downloaded mods and they will be copied to the instance if found.
" "Optionally, you may drag and drop the downloaded mods onto this dialog or add a folder to watch " - "if you did not download the mods to a default location.

" - "Global Mods Folder: %1
" - "Default Downloads Folder: %2")) + "if you did not download the mods to a default location.")) .arg(APPLICATION->settings()->get("CentralModsDir").toString(), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation))); - ui->labelModsFound->setText(tr("Please download the missing mods.")); // force all URL handeling as external connect(ui->textBrowserWatched, &QTextBrowser::anchorClicked, this, [](const QUrl url) { QDesktopServices::openUrl(url); }); @@ -127,7 +124,7 @@ void BlockedModsDialog::update() ui->textBrowserWatched->setText(watching); if (allModsMatched()) { - ui->labelModsFound->setText(tr("All mods found ✔")); + ui->labelModsFound->setText("" + tr("All mods found")); } else { ui->labelModsFound->setText(tr("Please download the missing mods.")); } From c6d9edb78f3bb6772667d02c0713adcdcaf89e8b Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 18 Nov 2022 22:21:55 +0100 Subject: [PATCH 0280/1149] chore: improve display names of more languages Signed-off-by: Sefa Eyeoglu --- launcher/translations/TranslationsModel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 20aa6d040..84778d326 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -89,6 +89,12 @@ struct Language else if(key == "en@uwu") { result = u8"Cute Engwish"; } + else if(key == "tok") { + result = u8"toki pona"; + } + else if(key == "nan") { + result = u8"閩南語"; // Using traditional Chinese script. Not sure if we should use simplified instead? + } else { result = locale.nativeLanguageName(); } From 669eef92eb426ea500c3bdaf5ec5b07d98e7c637 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 19 Nov 2022 08:54:17 +0000 Subject: [PATCH 0281/1149] Make requested changes and utilise AssertionError Signed-off-by: TheKodeToad --- libraries/launcher/CMakeLists.txt | 1 - .../launcher/net/minecraft/Launcher.java | 10 ++-- .../org/prismlauncher/EntryPoint.java | 5 +- .../launcher/impl/AbstractLauncher.java | 5 +- .../org/prismlauncher/utils/StringUtils.java | 49 ------------------- 5 files changed, 7 insertions(+), 63 deletions(-) delete mode 100644 libraries/launcher/org/prismlauncher/utils/StringUtils.java diff --git a/libraries/launcher/CMakeLists.txt b/libraries/launcher/CMakeLists.txt index 1d22a93ea..55ed58756 100644 --- a/libraries/launcher/CMakeLists.txt +++ b/libraries/launcher/CMakeLists.txt @@ -17,7 +17,6 @@ set(SRC org/prismlauncher/exception/ParseException.java org/prismlauncher/utils/Parameters.java org/prismlauncher/utils/ReflectionUtils.java - org/prismlauncher/utils/StringUtils.java org/prismlauncher/utils/logging/Level.java org/prismlauncher/utils/logging/Log.java net/minecraft/Launcher.java diff --git a/libraries/launcher/net/minecraft/Launcher.java b/libraries/launcher/net/minecraft/Launcher.java index a721495ae..646e2e3ea 100644 --- a/libraries/launcher/net/minecraft/Launcher.java +++ b/libraries/launcher/net/minecraft/Launcher.java @@ -64,8 +64,6 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; -import org.prismlauncher.utils.logging.Log; - /** * WARNING: This class is reflectively accessed by legacy Forge versions. *

@@ -97,14 +95,13 @@ public final class Launcher extends Applet implements AppletStub { if (documentBase == null) { if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) { // Special case only for Classic versions - documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); + documentBase = new URL("http://www.minecraft.net:80/game/"); } else { documentBase = new URL("http://www.minecraft.net/game/"); } } } catch (MalformedURLException e) { - // handle gracefully - it won't happen, but Java requires that it is caught - Log.error("Failed to parse document base URL", e); + throw new AssertionError(e); } this.documentBase = documentBase; @@ -143,8 +140,7 @@ public final class Launcher extends Applet implements AppletStub { try { return new URL("http://www.minecraft.net/game/"); } catch (MalformedURLException e) { - Log.error("Failed to parse codebase URL", e); - return null; + throw new AssertionError(e); } } diff --git a/libraries/launcher/org/prismlauncher/EntryPoint.java b/libraries/launcher/org/prismlauncher/EntryPoint.java index f65674683..78804b3e8 100644 --- a/libraries/launcher/org/prismlauncher/EntryPoint.java +++ b/libraries/launcher/org/prismlauncher/EntryPoint.java @@ -63,7 +63,6 @@ import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.impl.StandardLauncher; import org.prismlauncher.launcher.impl.legacy.LegacyLauncher; import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.StringUtils; import org.prismlauncher.utils.logging.Log; public final class EntryPoint { @@ -150,9 +149,9 @@ public final class EntryPoint { return PreLaunchAction.ABORT; default: - String[] pair = StringUtils.splitStringPair(' ', input); + String[] pair = input.split(" ", 2); - if (pair == null) + if (pair.length != 2) throw new ParseException(input, "[key] [value]"); params.add(pair[0], pair[1]); diff --git a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java index 585d55f1a..0c2153a9d 100644 --- a/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java +++ b/libraries/launcher/org/prismlauncher/launcher/impl/AbstractLauncher.java @@ -60,7 +60,6 @@ import java.util.List; import org.prismlauncher.exception.ParseException; import org.prismlauncher.launcher.Launcher; import org.prismlauncher.utils.Parameters; -import org.prismlauncher.utils.StringUtils; public abstract class AbstractLauncher implements Launcher { @@ -93,9 +92,9 @@ public abstract class AbstractLauncher implements Launcher { } else { maximize = false; - String[] sizePair = StringUtils.splitStringPair('x', windowParams); + String[] sizePair = windowParams.split("x", 2); - if (sizePair != null) { + if (sizePair.length == 2) { try { width = Integer.parseInt(sizePair[0]); height = Integer.parseInt(sizePair[1]); diff --git a/libraries/launcher/org/prismlauncher/utils/StringUtils.java b/libraries/launcher/org/prismlauncher/utils/StringUtils.java deleted file mode 100644 index dfd1634bc..000000000 --- a/libraries/launcher/org/prismlauncher/utils/StringUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (C) 2022 solonovamax - * - * 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. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.prismlauncher.utils; - -public final class StringUtils { - - public static String[] splitStringPair(char splitChar, String str) { - int splitPoint = str.indexOf(splitChar); - - if (splitPoint == -1) - return null; - - return new String[] { str.substring(0, splitPoint), str.substring(splitPoint + 1) }; - } - -} From f7239f7f8a30de55a270a9800ad1eaeba4c17586 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 19 Nov 2022 13:34:01 +0100 Subject: [PATCH 0282/1149] chore: update community links Signed-off-by: Sefa Eyeoglu --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cb99f70fc..f02b56958 100644 --- a/README.md +++ b/README.md @@ -33,15 +33,15 @@ For **Arch**, **Debian**, **Fedora**, **OpenSUSE (Tumbleweed)** and **Gentoo**, ## Community & Support -Feel free to create a GitHub issue if you find a bug or want to suggest a new feature. We have multiple communities that can also help you. +Feel free to create a GitHub issue if you find a bug or want to suggest a new feature. We have multiple community spaces where other community members can help you. #### Join our Discord server: [![Prism Launcher Discord server](https://discordapp.com/api/guilds/1031648380885147709/widget.png?style=banner2)](https://discord.gg/prismlauncher) -#### Join our Matrix space (Will be opened at a later date): +#### Join our Matrix space: [![PrismLauncher Space](https://img.shields.io/matrix/prismlauncher:matrix.org?style=for-the-badge&logo=matrix)](https://matrix.to/#/#prismlauncher:matrix.org) -#### Join our SubReddit: +#### Join our Subreddit: [![r/PrismLauncher](https://img.shields.io/reddit/subreddit-subscribers/prismlauncher?style=for-the-badge&logo=reddit)](https://www.reddit.com/r/PrismLauncher/) ## Building From 70fa92f22ca8d013e7e101645d4ef60a21a52223 Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Sat, 19 Nov 2022 13:58:35 +0000 Subject: [PATCH 0283/1149] Remove dirty printStackTrace hacks Signed-off-by: TheKodeToad --- libraries/launcher/.gitignore | 1 + .../org/prismlauncher/utils/logging/Log.java | 10 +- .../utils/logging/LogPrintStream.java | 99 ------------------- 3 files changed, 5 insertions(+), 105 deletions(-) delete mode 100644 libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java diff --git a/libraries/launcher/.gitignore b/libraries/launcher/.gitignore index cc1c52bf4..dda456e3f 100644 --- a/libraries/launcher/.gitignore +++ b/libraries/launcher/.gitignore @@ -4,3 +4,4 @@ out .classpath .idea .project +bin/ diff --git a/libraries/launcher/org/prismlauncher/utils/logging/Log.java b/libraries/launcher/org/prismlauncher/utils/logging/Log.java index 374a8107b..e3aa538b2 100644 --- a/libraries/launcher/org/prismlauncher/utils/logging/Log.java +++ b/libraries/launcher/org/prismlauncher/utils/logging/Log.java @@ -44,10 +44,8 @@ import java.io.PrintStream; */ public final class Log { - // original before overridden - private static final PrintStream OUT = new PrintStream(System.out), ERR = new PrintStream(System.err); - private static final PrintStream ERROR_PREFIX = new LogPrintStream(System.err, Level.ERROR), - FATAL_PREFIX = new LogPrintStream(System.err, Level.FATAL); + // original before possibly overridden by MC + private static final PrintStream OUT = new PrintStream(System.out), ERR = new PrintStream(System.err); private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug"); public static void launcher(String message) { @@ -68,7 +66,7 @@ public final class Log { public static void error(String message, Throwable e) { error(message); - e.printStackTrace(ERROR_PREFIX); + e.printStackTrace(ERR); } public static void fatal(String message) { @@ -77,7 +75,7 @@ public final class Log { public static void fatal(String message, Throwable e) { fatal(message); - e.printStackTrace(FATAL_PREFIX); + e.printStackTrace(ERR); } /** diff --git a/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java b/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java deleted file mode 100644 index 8a1828178..000000000 --- a/libraries/launcher/org/prismlauncher/utils/logging/LogPrintStream.java +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * Prism Launcher - Minecraft Launcher - * Copyright (C) 2022 TheKodeToad - * - * 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. - * - * Linking this library statically or dynamically with other modules is - * making a combined work based on this library. Thus, the terms and - * conditions of the GNU General Public License cover the whole - * combination. - * - * As a special exception, the copyright holders of this library give - * you permission to link this library with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also meet, - * for each linked independent module, the terms and conditions of the - * license of that module. An independent module is a module which is - * not derived from or based on this library. If you modify this - * library, you may extend this exception to your version of the - * library, but you are not obliged to do so. If you do not wish to do - * so, delete this exception statement from your version. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.prismlauncher.utils.logging; - -import java.io.OutputStream; -import java.io.PrintStream; - -/** - * Used to create a print stream that redirects to Log. - */ -final class LogPrintStream extends PrintStream { - - private final Level level; - - public LogPrintStream(OutputStream out, Level level) { - super(out); - - this.level = level; - } - - @Override - public void println(String x) { - Log.log(x, level); - } - - @Override - public void println(Object x) { - println(String.valueOf(x)); - } - - @Override - public void println(boolean x) { - println(String.valueOf(x)); - } - - @Override - public void println(char x) { - println(String.valueOf(x)); - } - - @Override - public void println(int x) { - println(String.valueOf(x)); - } - - @Override - public void println(long x) { - println(String.valueOf(x)); - } - - @Override - public void println(float x) { - println(String.valueOf(x)); - } - - @Override - public void println(double x) { - println(String.valueOf(x)); - } - - @Override - public void println(char[] x) { - println(String.valueOf(x)); - } - -} \ No newline at end of file From 8dacbafc8ba45ae6c2b770da77cc0d3d632849ba Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 19 Nov 2022 23:04:26 +0800 Subject: [PATCH 0284/1149] feat: initial support for smart resource pack parsing on file handler Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/Application.cpp | 23 ++++++- launcher/CMakeLists.txt | 3 + .../ui/dialogs/ImportResourcePackDialog.cpp | 61 +++++++++++++++++ .../ui/dialogs/ImportResourcePackDialog.h | 24 +++++++ .../ui/dialogs/ImportResourcePackDialog.ui | 67 +++++++++++++++++++ 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 launcher/ui/dialogs/ImportResourcePackDialog.cpp create mode 100644 launcher/ui/dialogs/ImportResourcePackDialog.h create mode 100644 launcher/ui/dialogs/ImportResourcePackDialog.ui diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 883f8968b..71cd009a5 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -66,6 +66,7 @@ #include "ui/setupwizard/PasteWizardPage.h" #include "ui/dialogs/CustomMessageBox.h" +#include "ui/dialogs/ImportResourcePackDialog.h" #include "ui/pagedialog/PageDialog.h" @@ -96,6 +97,10 @@ #include "net/HttpMetaCache.h" #include "java/JavaUtils.h" +#include +#include +#include +#include #include "updater/UpdateChecker.h" @@ -930,7 +935,23 @@ bool Application::event(QEvent* event) { if (event->type() == QEvent::FileOpen) { auto ev = static_cast(event); - m_mainWindow->droppedURLs({ ev->url() }); + + ResourcePack pack{ QFileInfo(ev->file()) }; + + ResourcePackUtils::process(pack); + // + + if (pack.valid()) { + ImportResourcePackDialog dlg(APPLICATION->m_mainWindow); + dlg.exec(); + if (dlg.result() == QDialog::Accepted) { + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->resourcePackList()->installResource(ev->file()); + } + } else { + m_mainWindow->droppedURLs({ ev->url() }); + } } return QApplication::event(event); diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8db934298..58d5d9648 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -791,6 +791,8 @@ SET(LAUNCHER_SOURCES ui/dialogs/ExportInstanceDialog.h ui/dialogs/IconPickerDialog.cpp ui/dialogs/IconPickerDialog.h + ui/dialogs/ImportResourcePackDialog.cpp + ui/dialogs/ImportResourcePackDialog.h ui/dialogs/LoginDialog.cpp ui/dialogs/LoginDialog.h ui/dialogs/MSALoginDialog.cpp @@ -939,6 +941,7 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/SkinUploadDialog.ui ui/dialogs/ExportInstanceDialog.ui ui/dialogs/IconPickerDialog.ui + ui/dialogs/ImportResourcePackDialog.ui ui/dialogs/MSALoginDialog.ui ui/dialogs/OfflineLoginDialog.ui ui/dialogs/AboutDialog.ui diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.cpp b/launcher/ui/dialogs/ImportResourcePackDialog.cpp new file mode 100644 index 000000000..ef76445cf --- /dev/null +++ b/launcher/ui/dialogs/ImportResourcePackDialog.cpp @@ -0,0 +1,61 @@ +#include "ImportResourcePackDialog.h" +#include "ui_ImportResourcePackDialog.h" + +#include +#include + +#include "Application.h" +#include "InstanceList.h" + +#include "ui/instanceview/InstanceDelegate.h" + +ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(parent), ui(new Ui::ImportResourcePackDialog) +{ + ui->setupUi(this); + setWindowModality(Qt::WindowModal); + + auto contentsWidget = ui->instanceView; + contentsWidget->setViewMode(QListView::ListMode); + contentsWidget->setFlow(QListView::LeftToRight); + contentsWidget->setIconSize(QSize(48, 48)); + contentsWidget->setMovement(QListView::Static); + contentsWidget->setResizeMode(QListView::Adjust); + contentsWidget->setSelectionMode(QAbstractItemView::SingleSelection); + contentsWidget->setSpacing(5); + contentsWidget->setWordWrap(false); + contentsWidget->setWrapping(true); + contentsWidget->setUniformItemSizes(true); + contentsWidget->setTextElideMode(Qt::ElideRight); + contentsWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + contentsWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + contentsWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + contentsWidget->setItemDelegate(new ListViewDelegate()); + + contentsWidget->setModel(APPLICATION->instances().get()); + + connect(contentsWidget, SIGNAL(doubleClicked(QModelIndex)), SLOT(activated(QModelIndex))); + connect(contentsWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + SLOT(selectionChanged(QItemSelection, QItemSelection))); +} + +void ImportResourcePackDialog::activated(QModelIndex index) +{ + selectedInstanceKey = index.data(Qt::UserRole).toString(); + accept(); +} + +void ImportResourcePackDialog::selectionChanged(QItemSelection selected, QItemSelection deselected) +{ + if (selected.empty()) + return; + + QString key = selected.first().indexes().first().data(Qt::UserRole).toString(); + if (!key.isEmpty()) { + selectedInstanceKey = key; + } +} + +ImportResourcePackDialog::~ImportResourcePackDialog() +{ + delete ui; +} diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.h b/launcher/ui/dialogs/ImportResourcePackDialog.h new file mode 100644 index 000000000..b077a811b --- /dev/null +++ b/launcher/ui/dialogs/ImportResourcePackDialog.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace Ui { +class ImportResourcePackDialog; +} + +class ImportResourcePackDialog : public QDialog { + Q_OBJECT + + public: + explicit ImportResourcePackDialog(QWidget* parent = 0); + ~ImportResourcePackDialog(); + QString selectedInstanceKey; + + private: + Ui::ImportResourcePackDialog* ui; + + private slots: + void selectionChanged(QItemSelection, QItemSelection); + void activated(QModelIndex); +}; diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.ui b/launcher/ui/dialogs/ImportResourcePackDialog.ui new file mode 100644 index 000000000..2a1de0f9b --- /dev/null +++ b/launcher/ui/dialogs/ImportResourcePackDialog.ui @@ -0,0 +1,67 @@ + + + ImportResourcePackDialog + + + + 0 + 0 + 676 + 555 + + + + Pick icon + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ImportResourcePackDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ImportResourcePackDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + From b1bdc6f745d607af4dc1bb592003a538ee03f058 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 19 Nov 2022 23:38:05 +0800 Subject: [PATCH 0285/1149] fix resource packs and add support for texture packs Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/Application.cpp | 29 ++++++++++++++++++------- launcher/minecraft/mod/ResourcePack.cpp | 5 +++++ launcher/minecraft/mod/ResourcePack.h | 2 ++ launcher/minecraft/mod/TexturePack.cpp | 5 +++++ launcher/minecraft/mod/TexturePack.h | 2 ++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 71cd009a5..9258aec48 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -101,6 +101,9 @@ #include #include #include +#include +#include +#include #include "updater/UpdateChecker.h" @@ -920,13 +923,13 @@ bool Application::createSetupWizard() return false; } -bool Application::event(QEvent* event) { +bool Application::event(QEvent* event) +{ #ifdef Q_OS_MACOS if (event->type() == QEvent::ApplicationStateChange) { auto ev = static_cast(event); - if (m_prevAppState == Qt::ApplicationActive - && ev->applicationState() == Qt::ApplicationActive) { + if (m_prevAppState == Qt::ApplicationActive && ev->applicationState() == Qt::ApplicationActive) { emit clickedOnDock(); } m_prevAppState = ev->applicationState(); @@ -936,19 +939,29 @@ bool Application::event(QEvent* event) { if (event->type() == QEvent::FileOpen) { auto ev = static_cast(event); - ResourcePack pack{ QFileInfo(ev->file()) }; + ResourcePack rp{ QFileInfo(ev->file()) }; + TexturePack tp{ QFileInfo(ev->file()) }; - ResourcePackUtils::process(pack); - // + ImportResourcePackDialog dlg(APPLICATION->m_mainWindow); - if (pack.valid()) { - ImportResourcePackDialog dlg(APPLICATION->m_mainWindow); + if (ResourcePackUtils::process(rp) && rp.valid()) { dlg.exec(); + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); auto instanceButBuffed = std::dynamic_pointer_cast(instance); instanceButBuffed->resourcePackList()->installResource(ev->file()); } + } else if (TexturePackUtils::process(tp) && tp.valid()) { + dlg.exec(); + + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->texturePackList()->installResource(ev->file()); + } } else { m_mainWindow->droppedURLs({ ev->url() }); } diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index 3fc10a2fd..9f46cd2c3 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -114,3 +114,8 @@ bool ResourcePack::applyFilter(QRegularExpression filter) const return Resource::applyFilter(filter); } + +bool ResourcePack::valid() const +{ + return m_pack_format != 0; +} diff --git a/launcher/minecraft/mod/ResourcePack.h b/launcher/minecraft/mod/ResourcePack.h index 031219081..7cb414d83 100644 --- a/launcher/minecraft/mod/ResourcePack.h +++ b/launcher/minecraft/mod/ResourcePack.h @@ -42,6 +42,8 @@ class ResourcePack : public Resource { /** Thread-safe. */ void setImage(QImage new_image); + bool valid() const override; + [[nodiscard]] auto compare(Resource const& other, SortType type) const -> std::pair override; [[nodiscard]] bool applyFilter(QRegularExpression filter) const override; diff --git a/launcher/minecraft/mod/TexturePack.cpp b/launcher/minecraft/mod/TexturePack.cpp index 796eb69d0..99d555843 100644 --- a/launcher/minecraft/mod/TexturePack.cpp +++ b/launcher/minecraft/mod/TexturePack.cpp @@ -62,3 +62,8 @@ QPixmap TexturePack::image(QSize size) TexturePackUtils::process(*this); return image(size); } + +bool TexturePack::valid() const +{ + return m_description != nullptr; +} diff --git a/launcher/minecraft/mod/TexturePack.h b/launcher/minecraft/mod/TexturePack.h index 6aa5e18ef..81bd5c699 100644 --- a/launcher/minecraft/mod/TexturePack.h +++ b/launcher/minecraft/mod/TexturePack.h @@ -48,6 +48,8 @@ class TexturePack : public Resource { /** Thread-safe. */ void setImage(QImage new_image); + bool valid() const override; + protected: mutable QMutex m_data_lock; From f527958cb35b976d88e7037bda62762c1ffe6e13 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 19 Nov 2022 23:42:56 +0800 Subject: [PATCH 0286/1149] fix: check if packFormat is valid for resourcepack parsing Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/mod/ResourcePack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index 9f46cd2c3..1e9db5969 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -117,5 +117,5 @@ bool ResourcePack::applyFilter(QRegularExpression filter) const bool ResourcePack::valid() const { - return m_pack_format != 0; + return s_pack_format_versions.contains(m_pack_format); } From a33b8049238329fa97545c0b2db5bb8c2f7545c6 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 19 Nov 2022 23:47:47 +0800 Subject: [PATCH 0287/1149] fix: add resource pack format for 1.19.3 Co-authored-by: Rachel Powers <508861+Ryex@users.noreply.github.com> Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/mod/ResourcePack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index 1e9db5969..ef0370d02 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -15,7 +15,7 @@ static const QMap> s_pack_format_versions = { { 3, { Version("1.11"), Version("1.12.2") } }, { 4, { Version("1.13"), Version("1.14.4") } }, { 5, { Version("1.15"), Version("1.16.1") } }, { 6, { Version("1.16.2"), Version("1.16.5") } }, { 7, { Version("1.17"), Version("1.17.1") } }, { 8, { Version("1.18"), Version("1.18.2") } }, - { 9, { Version("1.19"), Version("1.19.2") } }, + { 9, { Version("1.19"), Version("1.19.2") } }, { 11, { Version("1.19.3"), Version("1.19.3") } }, }; void ResourcePack::setPackFormat(int new_format_id) From 1f6b8f9d2bddd73e6cfd9d430ef9e37d1910adff Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 19 Nov 2022 23:59:30 +0800 Subject: [PATCH 0288/1149] fix instance IDs and resource pack imports Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp | 2 +- launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp | 2 +- launcher/ui/dialogs/ImportResourcePackDialog.cpp | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index 4f87bc130..d744c5350 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -152,7 +152,7 @@ bool LocalResourcePackParseTask::abort() void LocalResourcePackParseTask::executeTask() { - Q_ASSERT(m_resource_pack.valid()); + // Q_ASSERT(m_resource_pack.valid()); if (!ResourcePackUtils::process(m_resource_pack)) return; diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp index bf1e308fd..f23117ee2 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp @@ -143,7 +143,7 @@ bool LocalTexturePackParseTask::abort() void LocalTexturePackParseTask::executeTask() { - Q_ASSERT(m_texture_pack.valid()); + // Q_ASSERT(m_texture_pack.valid()); if (!TexturePackUtils::process(m_texture_pack)) return; diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.cpp b/launcher/ui/dialogs/ImportResourcePackDialog.cpp index ef76445cf..4fe28540b 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.cpp +++ b/launcher/ui/dialogs/ImportResourcePackDialog.cpp @@ -7,6 +7,7 @@ #include "Application.h" #include "InstanceList.h" +#include #include "ui/instanceview/InstanceDelegate.h" ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(parent), ui(new Ui::ImportResourcePackDialog) @@ -40,7 +41,7 @@ ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(pa void ImportResourcePackDialog::activated(QModelIndex index) { - selectedInstanceKey = index.data(Qt::UserRole).toString(); + selectedInstanceKey = index.data(InstanceList::InstanceIDRole).toString(); accept(); } @@ -49,7 +50,7 @@ void ImportResourcePackDialog::selectionChanged(QItemSelection selected, QItemSe if (selected.empty()) return; - QString key = selected.first().indexes().first().data(Qt::UserRole).toString(); + QString key = selected.first().indexes().first().data(InstanceList::InstanceIDRole).toString(); if (!key.isEmpty()) { selectedInstanceKey = key; } From a99cd16422bb577028a1caaa6e5bde300ac78372 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sun, 20 Nov 2022 00:14:16 +0800 Subject: [PATCH 0289/1149] fix: resource pack import dialog icons and add message Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/dialogs/ImportResourcePackDialog.cpp | 6 +++++- launcher/ui/dialogs/ImportResourcePackDialog.h | 3 +++ launcher/ui/dialogs/ImportResourcePackDialog.ui | 9 ++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.cpp b/launcher/ui/dialogs/ImportResourcePackDialog.cpp index 4fe28540b..2b7466052 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.cpp +++ b/launcher/ui/dialogs/ImportResourcePackDialog.cpp @@ -8,6 +8,7 @@ #include "InstanceList.h" #include +#include "ui/instanceview/InstanceProxyModel.h" #include "ui/instanceview/InstanceDelegate.h" ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(parent), ui(new Ui::ImportResourcePackDialog) @@ -32,7 +33,10 @@ ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(pa contentsWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); contentsWidget->setItemDelegate(new ListViewDelegate()); - contentsWidget->setModel(APPLICATION->instances().get()); + proxyModel = new InstanceProxyModel(this); + proxyModel->setSourceModel(APPLICATION->instances().get()); + proxyModel->sort(0); + contentsWidget->setModel(proxyModel); connect(contentsWidget, SIGNAL(doubleClicked(QModelIndex)), SLOT(activated(QModelIndex))); connect(contentsWidget->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.h b/launcher/ui/dialogs/ImportResourcePackDialog.h index b077a811b..8356f204f 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.h +++ b/launcher/ui/dialogs/ImportResourcePackDialog.h @@ -3,6 +3,8 @@ #include #include +#include "ui/instanceview/InstanceProxyModel.h" + namespace Ui { class ImportResourcePackDialog; } @@ -13,6 +15,7 @@ class ImportResourcePackDialog : public QDialog { public: explicit ImportResourcePackDialog(QWidget* parent = 0); ~ImportResourcePackDialog(); + InstanceProxyModel* proxyModel; QString selectedInstanceKey; private: diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.ui b/launcher/ui/dialogs/ImportResourcePackDialog.ui index 2a1de0f9b..20cb91770 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.ui +++ b/launcher/ui/dialogs/ImportResourcePackDialog.ui @@ -11,9 +11,16 @@ - Pick icon + Choose instance to import + + + + Choose the instance you would like to import this resource pack to. + + + From c27ebde575e4b12aa38da962b18bb261bbe676b4 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sat, 19 Nov 2022 17:14:19 +0100 Subject: [PATCH 0290/1149] fix(actions): fix cache on flatpak currently there's a [bug](https://github.com/flatpak/flatpak-github-actions/issues/80) on the stable version of the flatpak action which causes the cache key to be wrong. this commit work arounds it Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20fe66dd9..c0e5b50a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -487,6 +487,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout + if: inputs.build_type == 'Debug' uses: actions/checkout@v3 with: submodules: 'true' @@ -524,3 +525,4 @@ jobs: with: bundle: "Prism Launcher.flatpak" manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml + cache-key: flatpak-${{ github.sha }}-x86_64 From d1db7a0e23d90546f6b7ee5d1894fb3c60e41ef7 Mon Sep 17 00:00:00 2001 From: jopejoe1 <34899572+jopejoe1@users.noreply.github.com> Date: Sat, 19 Nov 2022 16:28:27 +0000 Subject: [PATCH 0291/1149] Fix New Zealand English display Signed-off-by: jopejoe1 <34899572+jopejoe1@users.noreply.github.com> --- launcher/translations/TranslationsModel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 84778d326..38f482966 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -83,6 +83,9 @@ struct Language else if(key == "es_UY") { result = u8"español de Latinoamérica"; } + else if(key == "en_NZ") { + result = u8"New Zealand English"; // No idea why qt translates this to just english and not to New Zealand English + } else if(key == "en@pirate") { result = u8"Tongue of the High Seas"; } From e0e428ce38ff5662089036a6bbf017a3b39f478f Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sun, 20 Nov 2022 00:28:35 +0800 Subject: [PATCH 0292/1149] fix: add support for CLI and drag and drop Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/Application.cpp | 35 +-------------------------- launcher/ui/MainWindow.cpp | 48 +++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 9258aec48..0fbe4ae2c 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -66,7 +66,6 @@ #include "ui/setupwizard/PasteWizardPage.h" #include "ui/dialogs/CustomMessageBox.h" -#include "ui/dialogs/ImportResourcePackDialog.h" #include "ui/pagedialog/PageDialog.h" @@ -98,12 +97,6 @@ #include "java/JavaUtils.h" #include -#include -#include -#include -#include -#include -#include #include "updater/UpdateChecker.h" @@ -938,33 +931,7 @@ bool Application::event(QEvent* event) if (event->type() == QEvent::FileOpen) { auto ev = static_cast(event); - - ResourcePack rp{ QFileInfo(ev->file()) }; - TexturePack tp{ QFileInfo(ev->file()) }; - - ImportResourcePackDialog dlg(APPLICATION->m_mainWindow); - - if (ResourcePackUtils::process(rp) && rp.valid()) { - dlg.exec(); - - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->resourcePackList()->installResource(ev->file()); - } - } else if (TexturePackUtils::process(tp) && tp.valid()) { - dlg.exec(); - - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->texturePackList()->installResource(ev->file()); - } - } else { - m_mainWindow->droppedURLs({ ev->url() }); - } + m_mainWindow->droppedURLs({ ev->url() }); } return QApplication::event(event); diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 929f2a85c..ed61777e5 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -106,8 +106,16 @@ #include "ui/dialogs/UpdateDialog.h" #include "ui/dialogs/EditAccountDialog.h" #include "ui/dialogs/ExportInstanceDialog.h" +#include "ui/dialogs/ImportResourcePackDialog.h" #include "ui/themes/ITheme.h" +#include +#include +#include +#include +#include +#include + #include "UpdateController.h" #include "KonamiCode.h" @@ -1794,16 +1802,40 @@ void MainWindow::on_actionAddInstance_triggered() void MainWindow::droppedURLs(QList urls) { - for(auto & url:urls) - { - if(url.isLocalFile()) - { - addInstance(url.toLocalFile()); - } - else - { + for (auto& url : urls) { + if (url.isLocalFile()) { + auto localFileName = url.toLocalFile(); + + ResourcePack rp{ QFileInfo(localFileName) }; + TexturePack tp{ QFileInfo(localFileName) }; + + ImportResourcePackDialog dlg(this); + + if (ResourcePackUtils::process(rp) && rp.valid()) { + dlg.exec(); + + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->resourcePackList()->installResource(localFileName); + } + } else if (TexturePackUtils::process(tp) && tp.valid()) { + dlg.exec(); + + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->texturePackList()->installResource(localFileName); + } + } else { + addInstance(localFileName); + } + } else { addInstance(url.toString()); } + // Only process one dropped file... break; } From d92ae530d7c585eb859d852ba1877230a82d867e Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sun, 20 Nov 2022 00:31:58 +0800 Subject: [PATCH 0293/1149] fix: stray include Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/Application.cpp | 1 - launcher/ui/MainWindow.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 0fbe4ae2c..c5594b215 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -96,7 +96,6 @@ #include "net/HttpMetaCache.h" #include "java/JavaUtils.h" -#include #include "updater/UpdateChecker.h" diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index ed61777e5..98fd79be0 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -71,6 +71,7 @@ #include #include +#include #include #include #include From 2367903ac6c6f6778935ed1bbab88fd8342dffa0 Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 19 Nov 2022 11:55:40 -0300 Subject: [PATCH 0294/1149] refactor: clean up WideBar a bit Signed-off-by: flow --- launcher/ui/widgets/WideBar.cpp | 130 +++++++++++++++----------------- launcher/ui/widgets/WideBar.h | 15 ++-- 2 files changed, 68 insertions(+), 77 deletions(-) diff --git a/launcher/ui/widgets/WideBar.cpp b/launcher/ui/widgets/WideBar.cpp index 79f1e0c96..ed5c5bc86 100644 --- a/launcher/ui/widgets/WideBar.cpp +++ b/launcher/ui/widgets/WideBar.cpp @@ -1,19 +1,21 @@ #include "WideBar.h" #include -#include -class ActionButton : public QToolButton -{ +class ActionButton : public QToolButton { Q_OBJECT -public: - ActionButton(QAction * action, QWidget * parent = 0) : QToolButton(parent), m_action(action) { + public: + ActionButton(QAction* action, QWidget* parent = nullptr) : QToolButton(parent), m_action(action) + { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + connect(action, &QAction::changed, this, &ActionButton::actionChanged); connect(this, &ActionButton::clicked, action, &QAction::trigger); + actionChanged(); }; -private slots: - void actionChanged() { + private slots: + void actionChanged() + { setEnabled(m_action->isEnabled()); setChecked(m_action->isChecked()); setCheckable(m_action->isCheckable()); @@ -23,10 +25,10 @@ private slots: setHidden(!m_action->isVisible()); setFocusPolicy(Qt::NoFocus); } -private: - QAction * m_action; -}; + private: + QAction* m_action; +}; WideBar::WideBar(const QString& title, QWidget* parent) : QToolBar(title, parent) { @@ -40,116 +42,102 @@ WideBar::WideBar(QWidget* parent) : QToolBar(parent) setMovable(false); } -struct WideBar::BarEntry { - enum Type { - None, - Action, - Separator, - Spacer - } type = None; - QAction *qAction = nullptr; - QAction *wideAction = nullptr; -}; - - -WideBar::~WideBar() -{ - for(auto *iter: m_entries) { - delete iter; - } -} - void WideBar::addAction(QAction* action) { - auto entry = new BarEntry(); - entry->qAction = addWidget(new ActionButton(action, this)); - entry->wideAction = action; - entry->type = BarEntry::Action; + BarEntry entry; + entry.bar_action = addWidget(new ActionButton(action, this)); + entry.menu_action = action; + entry.type = BarEntry::Type::Action; + m_entries.push_back(entry); } void WideBar::addSeparator() { - auto entry = new BarEntry(); - entry->qAction = QToolBar::addSeparator(); - entry->type = BarEntry::Separator; + BarEntry entry; + entry.bar_action = QToolBar::addSeparator(); + entry.type = BarEntry::Type::Separator; + m_entries.push_back(entry); } -auto WideBar::getMatching(QAction* act) -> QList::iterator +auto WideBar::getMatching(QAction* act) -> QList::iterator { - auto iter = std::find_if(m_entries.begin(), m_entries.end(), [act](BarEntry * entry) { - return entry->wideAction == act; - }); - + auto iter = std::find_if(m_entries.begin(), m_entries.end(), [act](BarEntry const& entry) { return entry.menu_action == act; }); + return iter; } -void WideBar::insertActionBefore(QAction* before, QAction* action){ +void WideBar::insertActionBefore(QAction* before, QAction* action) +{ auto iter = getMatching(before); - if(iter == m_entries.end()) + if (iter == m_entries.end()) return; - auto entry = new BarEntry(); - entry->qAction = insertWidget((*iter)->qAction, new ActionButton(action, this)); - entry->wideAction = action; - entry->type = BarEntry::Action; + BarEntry entry; + entry.bar_action = insertWidget(iter->bar_action, new ActionButton(action, this)); + entry.menu_action = action; + entry.type = BarEntry::Type::Action; + m_entries.insert(iter, entry); } -void WideBar::insertActionAfter(QAction* after, QAction* action){ +void WideBar::insertActionAfter(QAction* after, QAction* action) +{ auto iter = getMatching(after); - if(iter == m_entries.end()) + if (iter == m_entries.end()) return; - auto entry = new BarEntry(); - entry->qAction = insertWidget((*(iter+1))->qAction, new ActionButton(action, this)); - entry->wideAction = action; - entry->type = BarEntry::Action; + BarEntry entry; + entry.bar_action = insertWidget((iter + 1)->bar_action, new ActionButton(action, this)); + entry.menu_action = action; + entry.type = BarEntry::Type::Action; + m_entries.insert(iter + 1, entry); } void WideBar::insertSpacer(QAction* action) { auto iter = getMatching(action); - if(iter == m_entries.end()) + if (iter == m_entries.end()) return; - QWidget* spacer = new QWidget(); + auto* spacer = new QWidget(); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - auto entry = new BarEntry(); - entry->qAction = insertWidget((*iter)->qAction, spacer); - entry->type = BarEntry::Spacer; + BarEntry entry; + entry.bar_action = insertWidget(iter->bar_action, spacer); + entry.type = BarEntry::Type::Spacer; m_entries.insert(iter, entry); } void WideBar::insertSeparator(QAction* before) { auto iter = getMatching(before); - if(iter == m_entries.end()) + if (iter == m_entries.end()) return; - auto entry = new BarEntry(); - entry->qAction = QToolBar::insertSeparator(before); - entry->type = BarEntry::Separator; + BarEntry entry; + entry.bar_action = QToolBar::insertSeparator(before); + entry.type = BarEntry::Type::Separator; + m_entries.insert(iter, entry); } -QMenu * WideBar::createContextMenu(QWidget *parent, const QString & title) +QMenu* WideBar::createContextMenu(QWidget* parent, const QString& title) { - QMenu *contextMenu = new QMenu(title, parent); - for(auto & item: m_entries) { - switch(item->type) { + auto* contextMenu = new QMenu(title, parent); + for (auto& item : m_entries) { + switch (item.type) { default: - case BarEntry::None: + case BarEntry::Type::None: break; - case BarEntry::Separator: - case BarEntry::Spacer: + case BarEntry::Type::Separator: + case BarEntry::Type::Spacer: contextMenu->addSeparator(); break; - case BarEntry::Action: - contextMenu->addAction(item->wideAction); + case BarEntry::Type::Action: + contextMenu->addAction(item.menu_action); break; } } diff --git a/launcher/ui/widgets/WideBar.h b/launcher/ui/widgets/WideBar.h index 8ff62ef24..4a714c80c 100644 --- a/launcher/ui/widgets/WideBar.h +++ b/launcher/ui/widgets/WideBar.h @@ -2,17 +2,16 @@ #include #include +#include #include -class QMenu; - class WideBar : public QToolBar { Q_OBJECT public: explicit WideBar(const QString& title, QWidget* parent = nullptr); explicit WideBar(QWidget* parent = nullptr); - virtual ~WideBar(); + ~WideBar() override = default; void addAction(QAction* action); void addSeparator(); @@ -25,10 +24,14 @@ class WideBar : public QToolBar { QMenu* createContextMenu(QWidget* parent = nullptr, const QString& title = QString()); private: - struct BarEntry; + struct BarEntry { + enum class Type { None, Action, Separator, Spacer } type = Type::None; + QAction* bar_action = nullptr; + QAction* menu_action = nullptr; + }; - auto getMatching(QAction* act) -> QList::iterator; + auto getMatching(QAction* act) -> QList::iterator; private: - QList m_entries; + QList m_entries; }; From 6e1639551bbe98b32e9abef2d816e8abe01789e4 Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 19 Nov 2022 13:39:43 -0300 Subject: [PATCH 0295/1149] feat(WideBar): allow hiding buttons with right-click Signed-off-by: flow --- launcher/ui/widgets/WideBar.cpp | 58 ++++++++++++++++++++++++++++++++- launcher/ui/widgets/WideBar.h | 7 ++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/launcher/ui/widgets/WideBar.cpp b/launcher/ui/widgets/WideBar.cpp index ed5c5bc86..ed7dc5fa0 100644 --- a/launcher/ui/widgets/WideBar.cpp +++ b/launcher/ui/widgets/WideBar.cpp @@ -1,4 +1,6 @@ #include "WideBar.h" + +#include #include class ActionButton : public QToolButton { @@ -13,7 +15,7 @@ class ActionButton : public QToolButton { actionChanged(); }; - private slots: + public slots: void actionChanged() { setEnabled(m_action->isEnabled()); @@ -34,12 +36,16 @@ WideBar::WideBar(const QString& title, QWidget* parent) : QToolBar(title, parent { setFloatable(false); setMovable(false); + + m_bar_menu = std::make_unique(this); } WideBar::WideBar(QWidget* parent) : QToolBar(parent) { setFloatable(false); setMovable(false); + + m_bar_menu = std::make_unique(this); } void WideBar::addAction(QAction* action) @@ -50,6 +56,8 @@ void WideBar::addAction(QAction* action) entry.type = BarEntry::Type::Action; m_entries.push_back(entry); + + m_menu_state = MenuState::Dirty; } void WideBar::addSeparator() @@ -80,6 +88,8 @@ void WideBar::insertActionBefore(QAction* before, QAction* action) entry.type = BarEntry::Type::Action; m_entries.insert(iter, entry); + + m_menu_state = MenuState::Dirty; } void WideBar::insertActionAfter(QAction* after, QAction* action) @@ -94,6 +104,8 @@ void WideBar::insertActionAfter(QAction* after, QAction* action) entry.type = BarEntry::Type::Action; m_entries.insert(iter + 1, entry); + + m_menu_state = MenuState::Dirty; } void WideBar::insertSpacer(QAction* action) @@ -144,4 +156,48 @@ QMenu* WideBar::createContextMenu(QWidget* parent, const QString& title) return contextMenu; } +static void copyAction(QAction* from, QAction* to) +{ + Q_ASSERT(from); + Q_ASSERT(to); + + to->setText(from->text()); + to->setIcon(from->icon()); + to->setToolTip(from->toolTip()); +} + +void WideBar::contextMenuEvent(QContextMenuEvent* event) +{ + if (m_menu_state == MenuState::Dirty) { + for (auto* old_action : m_bar_menu->actions()) + old_action->deleteLater(); + + m_bar_menu->clear(); + + for (auto& entry : m_entries) { + if (entry.type != BarEntry::Type::Action) + continue; + + auto act = new QAction(); + copyAction(entry.menu_action, act); + + act->setCheckable(true); + act->setChecked(entry.bar_action->isVisible()); + + connect(act, &QAction::toggled, entry.bar_action, [this, &entry](bool toggled){ + entry.bar_action->setVisible(toggled); + + // NOTE: This is needed so that disabled actions get reflected on the button when it is made visible. + static_cast(widgetForAction(entry.bar_action))->actionChanged(); + }); + + m_bar_menu->addAction(act); + } + + m_menu_state = MenuState::Fresh; + } + + m_bar_menu->popup(event->globalPos()); +} + #include "WideBar.moc" diff --git a/launcher/ui/widgets/WideBar.h b/launcher/ui/widgets/WideBar.h index 4a714c80c..8421eaf4b 100644 --- a/launcher/ui/widgets/WideBar.h +++ b/launcher/ui/widgets/WideBar.h @@ -5,6 +5,8 @@ #include #include +#include + class WideBar : public QToolBar { Q_OBJECT @@ -22,6 +24,7 @@ class WideBar : public QToolBar { void insertActionAfter(QAction* after, QAction* action); QMenu* createContextMenu(QWidget* parent = nullptr, const QString& title = QString()); + void contextMenuEvent(QContextMenuEvent*) override; private: struct BarEntry { @@ -34,4 +37,8 @@ class WideBar : public QToolBar { private: QList m_entries; + + // Menu to toggle visibility from buttons in the bar + std::unique_ptr m_bar_menu = nullptr; + enum class MenuState { Fresh, Dirty } m_menu_state = MenuState::Dirty; }; From 479843f56b42d7044d3d02278a9cabc2c24e147a Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 19 Nov 2022 17:10:43 -0300 Subject: [PATCH 0296/1149] feat(WideBar): allow loading/unloading visibility via a byte array I really wanted to use a QBitArray :c Signed-off-by: flow --- launcher/ui/widgets/WideBar.cpp | 30 ++++++++++++++++++++++++++++++ launcher/ui/widgets/WideBar.h | 6 ++++++ 2 files changed, 36 insertions(+) diff --git a/launcher/ui/widgets/WideBar.cpp b/launcher/ui/widgets/WideBar.cpp index ed7dc5fa0..2ad2caec7 100644 --- a/launcher/ui/widgets/WideBar.cpp +++ b/launcher/ui/widgets/WideBar.cpp @@ -200,4 +200,34 @@ void WideBar::contextMenuEvent(QContextMenuEvent* event) m_bar_menu->popup(event->globalPos()); } +[[nodiscard]] QByteArray WideBar::getVisibilityState() const +{ + QByteArray state; + + for (auto const& entry : m_entries) { + if (entry.type != BarEntry::Type::Action) + continue; + + state.append(entry.bar_action->isVisible() ? '1' : '0'); + } + + return state; +} + +void WideBar::setVisibilityState(QByteArray&& state) +{ + qsizetype i = 0; + for (auto& entry : m_entries) { + if (entry.type != BarEntry::Type::Action) + continue; + if (i == state.size()) + break; + + entry.bar_action->setVisible(state.at(i++) == '1'); + + // NOTE: This is needed so that disabled actions get reflected on the button when it is made visible. + static_cast(widgetForAction(entry.bar_action))->actionChanged(); + } +} + #include "WideBar.moc" diff --git a/launcher/ui/widgets/WideBar.h b/launcher/ui/widgets/WideBar.h index 8421eaf4b..0d60f8a4a 100644 --- a/launcher/ui/widgets/WideBar.h +++ b/launcher/ui/widgets/WideBar.h @@ -26,6 +26,12 @@ class WideBar : public QToolBar { QMenu* createContextMenu(QWidget* parent = nullptr, const QString& title = QString()); void contextMenuEvent(QContextMenuEvent*) override; + // Ideally we would use a QBitArray for this, but it doesn't support string conversion, + // so using it in settings is very messy. + + [[nodiscard]] QByteArray getVisibilityState() const; + void setVisibilityState(QByteArray&&); + private: struct BarEntry { enum class Type { None, Action, Separator, Spacer } type = Type::None; From 2d69d63efe12a1cfaf391a59cb6b7630a436410e Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 19 Nov 2022 17:12:31 -0300 Subject: [PATCH 0297/1149] feat(InstancePages): save/load wide bar visibility settings Signed-off-by: flow --- .../ui/pages/instance/ExternalResourcesPage.cpp | 10 ++++++++++ .../ui/pages/instance/ExternalResourcesPage.h | 3 +++ launcher/ui/pages/instance/ScreenshotsPage.cpp | 13 +++++++++++++ launcher/ui/pages/instance/ScreenshotsPage.h | 7 ++++++- launcher/ui/pages/instance/ServersPage.cpp | 10 ++++++++++ launcher/ui/pages/instance/ServersPage.h | 4 ++++ launcher/ui/pages/instance/VersionPage.cpp | 15 +++++++++++++++ launcher/ui/pages/instance/VersionPage.h | 5 +++++ launcher/ui/pages/instance/WorldListPage.cpp | 10 ++++++++++ launcher/ui/pages/instance/WorldListPage.h | 4 ++++ 10 files changed, 80 insertions(+), 1 deletion(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index b6c873cc2..381fa30cc 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -70,11 +70,21 @@ void ExternalResourcesPage::ShowContextMenu(const QPoint& pos) void ExternalResourcesPage::openedImpl() { m_model->startWatching(); + + auto const setting_name = QString("WideBarVisibility_%1").arg(id()); + if (!APPLICATION->settings()->contains(setting_name)) + m_wide_bar_setting = APPLICATION->settings()->registerSetting(setting_name); + else + m_wide_bar_setting = APPLICATION->settings()->getSetting(setting_name); + + ui->actionsToolbar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); } void ExternalResourcesPage::closedImpl() { m_model->stopWatching(); + + m_wide_bar_setting->set(ui->actionsToolbar->getVisibilityState()); } void ExternalResourcesPage::retranslate() diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.h b/launcher/ui/pages/instance/ExternalResourcesPage.h index 8e352cef9..b816e742a 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.h +++ b/launcher/ui/pages/instance/ExternalResourcesPage.h @@ -4,6 +4,7 @@ #include #include "Application.h" +#include "settings/Setting.h" #include "minecraft/MinecraftInstance.h" #include "ui/pages/BasePage.h" @@ -71,4 +72,6 @@ class ExternalResourcesPage : public QMainWindow, public BasePage { QString m_viewFilter; bool m_controlsEnabled = true; + + std::shared_ptr m_wide_bar_setting = nullptr; }; diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index c97253e4b..0092aef33 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -537,6 +537,19 @@ void ScreenshotsPage::openedImpl() ui->listView->setModel(nullptr); } } + + auto const setting_name = QString("WideBarVisibility_%1").arg(id()); + if (!APPLICATION->settings()->contains(setting_name)) + m_wide_bar_setting = APPLICATION->settings()->registerSetting(setting_name); + else + m_wide_bar_setting = APPLICATION->settings()->getSetting(setting_name); + + ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); +} + +void ScreenshotsPage::closedImpl() +{ + m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); } #include "ScreenshotsPage.moc" diff --git a/launcher/ui/pages/instance/ScreenshotsPage.h b/launcher/ui/pages/instance/ScreenshotsPage.h index c22706af9..2eb0de04f 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.h +++ b/launcher/ui/pages/instance/ScreenshotsPage.h @@ -40,6 +40,8 @@ #include "ui/pages/BasePage.h" #include +#include "settings/Setting.h" + class QFileSystemModel; class QIdentityProxyModel; namespace Ui @@ -59,7 +61,8 @@ public: explicit ScreenshotsPage(QString path, QWidget *parent = 0); virtual ~ScreenshotsPage(); - virtual void openedImpl() override; + void openedImpl() override; + void closedImpl() override; enum { @@ -110,4 +113,6 @@ private: QString m_folder; bool m_valid = false; bool m_uploadActive = false; + + std::shared_ptr m_wide_bar_setting = nullptr; }; diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index d64bcb767..a625e20b6 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -765,11 +765,21 @@ void ServersPage::updateState() void ServersPage::openedImpl() { m_model->observe(); + + auto const setting_name = QString("WideBarVisibility_%1").arg(id()); + if (!APPLICATION->settings()->contains(setting_name)) + m_wide_bar_setting = APPLICATION->settings()->registerSetting(setting_name); + else + m_wide_bar_setting = APPLICATION->settings()->getSetting(setting_name); + + ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); } void ServersPage::closedImpl() { m_model->unobserve(); + + m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); } void ServersPage::on_actionAdd_triggered() diff --git a/launcher/ui/pages/instance/ServersPage.h b/launcher/ui/pages/instance/ServersPage.h index 37399d49f..548d4d1b1 100644 --- a/launcher/ui/pages/instance/ServersPage.h +++ b/launcher/ui/pages/instance/ServersPage.h @@ -42,6 +42,8 @@ #include "ui/pages/BasePage.h" #include +#include "settings/Setting.h" + namespace Ui { class ServersPage; @@ -112,5 +114,7 @@ private: // data Ui::ServersPage *ui = nullptr; ServersModel * m_model = nullptr; InstancePtr m_inst = nullptr; + + std::shared_ptr m_wide_bar_setting = nullptr; }; diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index a021c633f..84052f373 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -125,6 +125,21 @@ void VersionPage::retranslate() ui->retranslateUi(this); } +void VersionPage::openedImpl() +{ + auto const setting_name = QString("WideBarVisibility_%1").arg(id()); + if (!APPLICATION->settings()->contains(setting_name)) + m_wide_bar_setting = APPLICATION->settings()->registerSetting(setting_name); + else + m_wide_bar_setting = APPLICATION->settings()->getSetting(setting_name); + + ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); +} +void VersionPage::closedImpl() +{ + m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); +} + QMenu * VersionPage::createPopupMenu() { QMenu* filteredMenu = QMainWindow::createPopupMenu(); diff --git a/launcher/ui/pages/instance/VersionPage.h b/launcher/ui/pages/instance/VersionPage.h index 979311fcf..9996e7763 100644 --- a/launcher/ui/pages/instance/VersionPage.h +++ b/launcher/ui/pages/instance/VersionPage.h @@ -69,6 +69,9 @@ public: virtual bool shouldDisplay() const override; void retranslate() override; + void openedImpl() override; + void closedImpl() override; + private slots: void on_actionChange_version_triggered(); void on_actionInstall_Forge_triggered(); @@ -114,6 +117,8 @@ private: int currentIdx = 0; bool controlsEnabled = false; + std::shared_ptr m_wide_bar_setting = nullptr; + public slots: void versionCurrent(const QModelIndex ¤t, const QModelIndex &previous); diff --git a/launcher/ui/pages/instance/WorldListPage.cpp b/launcher/ui/pages/instance/WorldListPage.cpp index 85cc01ff0..93458ce4f 100644 --- a/launcher/ui/pages/instance/WorldListPage.cpp +++ b/launcher/ui/pages/instance/WorldListPage.cpp @@ -113,11 +113,21 @@ WorldListPage::WorldListPage(BaseInstance *inst, std::shared_ptr worl void WorldListPage::openedImpl() { m_worlds->startWatching(); + + auto const setting_name = QString("WideBarVisibility_%1").arg(id()); + if (!APPLICATION->settings()->contains(setting_name)) + m_wide_bar_setting = APPLICATION->settings()->registerSetting(setting_name); + else + m_wide_bar_setting = APPLICATION->settings()->getSetting(setting_name); + + ui->toolBar->setVisibilityState(m_wide_bar_setting->get().toByteArray()); } void WorldListPage::closedImpl() { m_worlds->stopWatching(); + + m_wide_bar_setting->set(ui->toolBar->getVisibilityState()); } WorldListPage::~WorldListPage() diff --git a/launcher/ui/pages/instance/WorldListPage.h b/launcher/ui/pages/instance/WorldListPage.h index 1dc9e53e0..925521bec 100644 --- a/launcher/ui/pages/instance/WorldListPage.h +++ b/launcher/ui/pages/instance/WorldListPage.h @@ -42,6 +42,8 @@ #include #include +#include "settings/Setting.h" + class WorldList; namespace Ui { @@ -102,6 +104,8 @@ private: unique_qobject_ptr m_mceditProcess; bool m_mceditStarting = false; + std::shared_ptr m_wide_bar_setting = nullptr; + private slots: void on_actionCopy_Seed_triggered(); void on_actionMCEdit_triggered(); From bb7a321c6ed91709ff208efbbef19e05d7dfb220 Mon Sep 17 00:00:00 2001 From: Tayou Date: Sun, 20 Nov 2022 02:51:12 +0100 Subject: [PATCH 0298/1149] add breeze themes Signed-off-by: Tayou --- launcher/CMakeLists.txt | 4 ++ launcher/main.cpp | 2 + .../resources/breeze_dark/breeze_dark.qrc | 43 ++++++++++++++ launcher/resources/breeze_dark/index.theme | 11 ++++ .../resources/breeze_dark/scalable/about.svg | 12 ++++ .../breeze_dark/scalable/accounts.svg | 17 ++++++ .../resources/breeze_dark/scalable/bug.svg | 13 +++++ .../breeze_dark/scalable/centralmods.svg | 1 + .../breeze_dark/scalable/checkupdate.svg | 14 +++++ .../resources/breeze_dark/scalable/copy.svg | 11 ++++ .../breeze_dark/scalable/coremods.svg | 1 + .../breeze_dark/scalable/custom-commands.svg | 13 +++++ .../resources/breeze_dark/scalable/delete.svg | 13 +++++ .../breeze_dark/scalable/discord.svg | 1 + .../resources/breeze_dark/scalable/export.svg | 11 ++++ .../breeze_dark/scalable/externaltools.svg | 13 +++++ .../resources/breeze_dark/scalable/help.svg | 13 +++++ .../scalable/instance-settings.svg | 13 +++++ .../breeze_dark/scalable/jarmods.svg | 1 + .../resources/breeze_dark/scalable/java.svg | 10 ++++ .../breeze_dark/scalable/language.svg | 13 +++++ .../resources/breeze_dark/scalable/launch.svg | 8 +++ .../breeze_dark/scalable/launcher.svg | 57 +++++++++++++++++++ .../breeze_dark/scalable/loadermods.svg | 13 +++++ .../resources/breeze_dark/scalable/log.svg | 13 +++++ .../resources/breeze_dark/scalable/matrix.svg | 9 +++ .../breeze_dark/scalable/minecraft.svg | 13 +++++ .../resources/breeze_dark/scalable/new.svg | 18 ++++++ .../resources/breeze_dark/scalable/news.svg | 13 +++++ .../resources/breeze_dark/scalable/notes.svg | 13 +++++ .../breeze_dark/scalable/patreon.svg | 3 + .../resources/breeze_dark/scalable/proxy.svg | 14 +++++ .../breeze_dark/scalable/reddit-alien.svg | 3 + .../breeze_dark/scalable/refresh.svg | 8 +++ .../resources/breeze_dark/scalable/rename.svg | 13 +++++ .../breeze_dark/scalable/resourcepacks.svg | 11 ++++ .../breeze_dark/scalable/screenshots.svg | 13 +++++ .../breeze_dark/scalable/settings.svg | 17 ++++++ .../breeze_dark/scalable/shaderpacks.svg | 13 +++++ .../breeze_dark/scalable/status-bad.svg | 9 +++ .../breeze_dark/scalable/status-good.svg | 10 ++++ .../breeze_dark/scalable/status-yellow.svg | 9 +++ .../resources/breeze_dark/scalable/tag.svg | 17 ++++++ .../breeze_dark/scalable/viewfolder.svg | 13 +++++ .../resources/breeze_dark/scalable/worlds.svg | 16 ++++++ .../resources/breeze_light/breeze_light.qrc | 43 ++++++++++++++ launcher/resources/breeze_light/index.theme | 11 ++++ .../resources/breeze_light/scalable/about.svg | 12 ++++ .../breeze_light/scalable/accounts.svg | 17 ++++++ .../resources/breeze_light/scalable/bug.svg | 13 +++++ .../breeze_light/scalable/centralmods.svg | 1 + .../breeze_light/scalable/checkupdate.svg | 14 +++++ .../resources/breeze_light/scalable/copy.svg | 11 ++++ .../breeze_light/scalable/coremods.svg | 1 + .../breeze_light/scalable/custom-commands.svg | 13 +++++ .../breeze_light/scalable/delete.svg | 13 +++++ .../breeze_light/scalable/discord.svg | 1 + .../breeze_light/scalable/export.svg | 11 ++++ .../breeze_light/scalable/externaltools.svg | 13 +++++ .../resources/breeze_light/scalable/help.svg | 13 +++++ .../scalable/instance-settings.svg | 13 +++++ .../breeze_light/scalable/jarmods.svg | 1 + .../resources/breeze_light/scalable/java.svg | 10 ++++ .../breeze_light/scalable/language.svg | 13 +++++ .../breeze_light/scalable/launch.svg | 8 +++ .../breeze_light/scalable/loadermods.svg | 13 +++++ .../resources/breeze_light/scalable/log.svg | 13 +++++ .../breeze_light/scalable/matrix.svg | 9 +++ .../breeze_light/scalable/minecraft.svg | 13 +++++ .../resources/breeze_light/scalable/new.svg | 18 ++++++ .../resources/breeze_light/scalable/news.svg | 13 +++++ .../resources/breeze_light/scalable/notes.svg | 13 +++++ .../breeze_light/scalable/patreon.svg | 3 + .../resources/breeze_light/scalable/proxy.svg | 14 +++++ .../breeze_light/scalable/reddit-alien.svg | 3 + .../breeze_light/scalable/refresh.svg | 8 +++ .../breeze_light/scalable/rename.svg | 13 +++++ .../breeze_light/scalable/resourcepacks.svg | 11 ++++ .../breeze_light/scalable/screenshots.svg | 13 +++++ .../breeze_light/scalable/settings.svg | 17 ++++++ .../breeze_light/scalable/shaderpacks.svg | 13 +++++ .../breeze_light/scalable/status-bad.svg | 9 +++ .../breeze_light/scalable/status-good.svg | 10 ++++ .../breeze_light/scalable/status-yellow.svg | 9 +++ .../resources/breeze_light/scalable/tag.svg | 17 ++++++ .../breeze_light/scalable/viewfolder.svg | 13 +++++ .../breeze_light/scalable/worlds.svg | 16 ++++++ launcher/ui/pages/global/LauncherPage.cpp | 29 ++++++++-- launcher/ui/pages/global/LauncherPage.ui | 10 ++++ 89 files changed, 1082 insertions(+), 6 deletions(-) create mode 100644 launcher/resources/breeze_dark/breeze_dark.qrc create mode 100644 launcher/resources/breeze_dark/index.theme create mode 100644 launcher/resources/breeze_dark/scalable/about.svg create mode 100644 launcher/resources/breeze_dark/scalable/accounts.svg create mode 100644 launcher/resources/breeze_dark/scalable/bug.svg create mode 100644 launcher/resources/breeze_dark/scalable/centralmods.svg create mode 100644 launcher/resources/breeze_dark/scalable/checkupdate.svg create mode 100644 launcher/resources/breeze_dark/scalable/copy.svg create mode 100644 launcher/resources/breeze_dark/scalable/coremods.svg create mode 100644 launcher/resources/breeze_dark/scalable/custom-commands.svg create mode 100644 launcher/resources/breeze_dark/scalable/delete.svg create mode 100644 launcher/resources/breeze_dark/scalable/discord.svg create mode 100644 launcher/resources/breeze_dark/scalable/export.svg create mode 100644 launcher/resources/breeze_dark/scalable/externaltools.svg create mode 100644 launcher/resources/breeze_dark/scalable/help.svg create mode 100644 launcher/resources/breeze_dark/scalable/instance-settings.svg create mode 100644 launcher/resources/breeze_dark/scalable/jarmods.svg create mode 100644 launcher/resources/breeze_dark/scalable/java.svg create mode 100644 launcher/resources/breeze_dark/scalable/language.svg create mode 100644 launcher/resources/breeze_dark/scalable/launch.svg create mode 100644 launcher/resources/breeze_dark/scalable/launcher.svg create mode 100644 launcher/resources/breeze_dark/scalable/loadermods.svg create mode 100644 launcher/resources/breeze_dark/scalable/log.svg create mode 100644 launcher/resources/breeze_dark/scalable/matrix.svg create mode 100644 launcher/resources/breeze_dark/scalable/minecraft.svg create mode 100644 launcher/resources/breeze_dark/scalable/new.svg create mode 100644 launcher/resources/breeze_dark/scalable/news.svg create mode 100644 launcher/resources/breeze_dark/scalable/notes.svg create mode 100644 launcher/resources/breeze_dark/scalable/patreon.svg create mode 100644 launcher/resources/breeze_dark/scalable/proxy.svg create mode 100644 launcher/resources/breeze_dark/scalable/reddit-alien.svg create mode 100644 launcher/resources/breeze_dark/scalable/refresh.svg create mode 100644 launcher/resources/breeze_dark/scalable/rename.svg create mode 100644 launcher/resources/breeze_dark/scalable/resourcepacks.svg create mode 100644 launcher/resources/breeze_dark/scalable/screenshots.svg create mode 100644 launcher/resources/breeze_dark/scalable/settings.svg create mode 100644 launcher/resources/breeze_dark/scalable/shaderpacks.svg create mode 100644 launcher/resources/breeze_dark/scalable/status-bad.svg create mode 100644 launcher/resources/breeze_dark/scalable/status-good.svg create mode 100644 launcher/resources/breeze_dark/scalable/status-yellow.svg create mode 100644 launcher/resources/breeze_dark/scalable/tag.svg create mode 100644 launcher/resources/breeze_dark/scalable/viewfolder.svg create mode 100644 launcher/resources/breeze_dark/scalable/worlds.svg create mode 100644 launcher/resources/breeze_light/breeze_light.qrc create mode 100644 launcher/resources/breeze_light/index.theme create mode 100644 launcher/resources/breeze_light/scalable/about.svg create mode 100644 launcher/resources/breeze_light/scalable/accounts.svg create mode 100644 launcher/resources/breeze_light/scalable/bug.svg create mode 100644 launcher/resources/breeze_light/scalable/centralmods.svg create mode 100644 launcher/resources/breeze_light/scalable/checkupdate.svg create mode 100644 launcher/resources/breeze_light/scalable/copy.svg create mode 100644 launcher/resources/breeze_light/scalable/coremods.svg create mode 100644 launcher/resources/breeze_light/scalable/custom-commands.svg create mode 100644 launcher/resources/breeze_light/scalable/delete.svg create mode 100644 launcher/resources/breeze_light/scalable/discord.svg create mode 100644 launcher/resources/breeze_light/scalable/export.svg create mode 100644 launcher/resources/breeze_light/scalable/externaltools.svg create mode 100644 launcher/resources/breeze_light/scalable/help.svg create mode 100644 launcher/resources/breeze_light/scalable/instance-settings.svg create mode 100644 launcher/resources/breeze_light/scalable/jarmods.svg create mode 100644 launcher/resources/breeze_light/scalable/java.svg create mode 100644 launcher/resources/breeze_light/scalable/language.svg create mode 100644 launcher/resources/breeze_light/scalable/launch.svg create mode 100644 launcher/resources/breeze_light/scalable/loadermods.svg create mode 100644 launcher/resources/breeze_light/scalable/log.svg create mode 100644 launcher/resources/breeze_light/scalable/matrix.svg create mode 100644 launcher/resources/breeze_light/scalable/minecraft.svg create mode 100644 launcher/resources/breeze_light/scalable/new.svg create mode 100644 launcher/resources/breeze_light/scalable/news.svg create mode 100644 launcher/resources/breeze_light/scalable/notes.svg create mode 100644 launcher/resources/breeze_light/scalable/patreon.svg create mode 100644 launcher/resources/breeze_light/scalable/proxy.svg create mode 100644 launcher/resources/breeze_light/scalable/reddit-alien.svg create mode 100644 launcher/resources/breeze_light/scalable/refresh.svg create mode 100644 launcher/resources/breeze_light/scalable/rename.svg create mode 100644 launcher/resources/breeze_light/scalable/resourcepacks.svg create mode 100644 launcher/resources/breeze_light/scalable/screenshots.svg create mode 100644 launcher/resources/breeze_light/scalable/settings.svg create mode 100644 launcher/resources/breeze_light/scalable/shaderpacks.svg create mode 100644 launcher/resources/breeze_light/scalable/status-bad.svg create mode 100644 launcher/resources/breeze_light/scalable/status-good.svg create mode 100644 launcher/resources/breeze_light/scalable/status-yellow.svg create mode 100644 launcher/resources/breeze_light/scalable/tag.svg create mode 100644 launcher/resources/breeze_light/scalable/viewfolder.svg create mode 100644 launcher/resources/breeze_light/scalable/worlds.svg diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index 8db934298..a92a235dd 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -598,6 +598,8 @@ SET(LAUNCHER_SOURCES resources/pe_light/pe_light.qrc resources/pe_colored/pe_colored.qrc resources/pe_blue/pe_blue.qrc + resources/breeze_dark/breeze_dark.qrc + resources/breeze_light/breeze_light.qrc resources/OSX/OSX.qrc resources/iOS/iOS.qrc resources/flat/flat.qrc @@ -957,6 +959,8 @@ qt_add_resources(LAUNCHER_RESOURCES resources/pe_light/pe_light.qrc resources/pe_colored/pe_colored.qrc resources/pe_blue/pe_blue.qrc + resources/breeze_dark/breeze_dark.qrc + resources/breeze_light/breeze_light.qrc resources/OSX/OSX.qrc resources/iOS/iOS.qrc resources/flat/flat.qrc diff --git a/launcher/main.cpp b/launcher/main.cpp index df5964493..b63f8bfd0 100644 --- a/launcher/main.cpp +++ b/launcher/main.cpp @@ -81,6 +81,8 @@ int main(int argc, char *argv[]) Q_INIT_RESOURCE(pe_light); Q_INIT_RESOURCE(pe_blue); Q_INIT_RESOURCE(pe_colored); + Q_INIT_RESOURCE(breeze_dark); + Q_INIT_RESOURCE(breeze_light); Q_INIT_RESOURCE(OSX); Q_INIT_RESOURCE(iOS); Q_INIT_RESOURCE(flat); diff --git a/launcher/resources/breeze_dark/breeze_dark.qrc b/launcher/resources/breeze_dark/breeze_dark.qrc new file mode 100644 index 000000000..4d7a69b21 --- /dev/null +++ b/launcher/resources/breeze_dark/breeze_dark.qrc @@ -0,0 +1,43 @@ + + + index.theme + scalable/about.svg + scalable/accounts.svg + scalable/bug.svg + scalable/centralmods.svg + scalable/checkupdate.svg + scalable/copy.svg + scalable/coremods.svg + scalable/custom-commands.svg + scalable/discord.svg + scalable/externaltools.svg + scalable/help.svg + scalable/instance-settings.svg + scalable/jarmods.svg + scalable/java.svg + scalable/language.svg + scalable/loadermods.svg + scalable/log.svg + scalable/minecraft.svg + scalable/new.svg + scalable/news.svg + scalable/notes.svg + scalable/proxy.svg + scalable/reddit-alien.svg + scalable/refresh.svg + scalable/resourcepacks.svg + scalable/shaderpacks.svg + scalable/screenshots.svg + scalable/settings.svg + scalable/status-bad.svg + scalable/status-good.svg + scalable/status-yellow.svg + scalable/viewfolder.svg + scalable/worlds.svg + scalable/delete.svg + scalable/tag.svg + scalable/export.svg + scalable/rename.svg + scalable/launch.svg + + diff --git a/launcher/resources/breeze_dark/index.theme b/launcher/resources/breeze_dark/index.theme new file mode 100644 index 000000000..f9f6f4dc0 --- /dev/null +++ b/launcher/resources/breeze_dark/index.theme @@ -0,0 +1,11 @@ +[Icon Theme] +Name=Breeze Dark +Comment=Breeze Dark Icons +Inherits=multimc +Directories=scalable + +[scalable] +Size=48 +Type=Scalable +MinSize=16 +MaxSize=256 diff --git a/launcher/resources/breeze_dark/scalable/about.svg b/launcher/resources/breeze_dark/scalable/about.svg new file mode 100644 index 000000000..856d1b2b8 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/about.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/accounts.svg b/launcher/resources/breeze_dark/scalable/accounts.svg new file mode 100644 index 000000000..fbb519592 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/accounts.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/bug.svg b/launcher/resources/breeze_dark/scalable/bug.svg new file mode 100644 index 000000000..6ddf482f7 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/bug.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/centralmods.svg b/launcher/resources/breeze_dark/scalable/centralmods.svg new file mode 100644 index 000000000..4035e51cb --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/centralmods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_dark/scalable/checkupdate.svg b/launcher/resources/breeze_dark/scalable/checkupdate.svg new file mode 100644 index 000000000..cc5dfc163 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/checkupdate.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/copy.svg b/launcher/resources/breeze_dark/scalable/copy.svg new file mode 100644 index 000000000..fe4a36acd --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/copy.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/coremods.svg b/launcher/resources/breeze_dark/scalable/coremods.svg new file mode 100644 index 000000000..ec4ecea85 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/coremods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_dark/scalable/custom-commands.svg b/launcher/resources/breeze_dark/scalable/custom-commands.svg new file mode 100644 index 000000000..44efd39ef --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/custom-commands.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/delete.svg b/launcher/resources/breeze_dark/scalable/delete.svg new file mode 100644 index 000000000..c7074585b --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/delete.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/discord.svg b/launcher/resources/breeze_dark/scalable/discord.svg new file mode 100644 index 000000000..22ee27ba2 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_dark/scalable/export.svg b/launcher/resources/breeze_dark/scalable/export.svg new file mode 100644 index 000000000..b1fe39d14 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/export.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/externaltools.svg b/launcher/resources/breeze_dark/scalable/externaltools.svg new file mode 100644 index 000000000..dd19fb90f --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/externaltools.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/help.svg b/launcher/resources/breeze_dark/scalable/help.svg new file mode 100644 index 000000000..b273a8bcf --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/help.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/instance-settings.svg b/launcher/resources/breeze_dark/scalable/instance-settings.svg new file mode 100644 index 000000000..c5f0504b6 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/instance-settings.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/jarmods.svg b/launcher/resources/breeze_dark/scalable/jarmods.svg new file mode 100644 index 000000000..49a45d36a --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/jarmods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_dark/scalable/java.svg b/launcher/resources/breeze_dark/scalable/java.svg new file mode 100644 index 000000000..7149981cc --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/java.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/language.svg b/launcher/resources/breeze_dark/scalable/language.svg new file mode 100644 index 000000000..239cdf94e --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/language.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/launch.svg b/launcher/resources/breeze_dark/scalable/launch.svg new file mode 100644 index 000000000..25c5fabc0 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/launch.svg @@ -0,0 +1,8 @@ + + + + diff --git a/launcher/resources/breeze_dark/scalable/launcher.svg b/launcher/resources/breeze_dark/scalable/launcher.svg new file mode 100644 index 000000000..aeee84338 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/launcher.svg @@ -0,0 +1,57 @@ + + + + Prism Launcher Logo + + + + + + + + + + + + + + + + + + + + + + + Prism Launcher Logo + 19/10/2022 + + + Prism Launcher + + + + + AutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zeke + + + https://github.com/PrismLauncher/PrismLauncher + + + Prism Launcher + + + + + + + + + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/loadermods.svg b/launcher/resources/breeze_dark/scalable/loadermods.svg new file mode 100644 index 000000000..7bd871882 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/loadermods.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/log.svg b/launcher/resources/breeze_dark/scalable/log.svg new file mode 100644 index 000000000..fcd83c4d8 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/log.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/matrix.svg b/launcher/resources/breeze_dark/scalable/matrix.svg new file mode 100644 index 000000000..214f57080 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/matrix.svg @@ -0,0 +1,9 @@ + + + Matrix (protocol) logo + + + + + + \ No newline at end of file diff --git a/launcher/resources/breeze_dark/scalable/minecraft.svg b/launcher/resources/breeze_dark/scalable/minecraft.svg new file mode 100644 index 000000000..1d8d01675 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/minecraft.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/new.svg b/launcher/resources/breeze_dark/scalable/new.svg new file mode 100644 index 000000000..9ee910e78 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/new.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/news.svg b/launcher/resources/breeze_dark/scalable/news.svg new file mode 100644 index 000000000..a2ff0c8d1 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/news.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/notes.svg b/launcher/resources/breeze_dark/scalable/notes.svg new file mode 100644 index 000000000..6452d3c8d --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/notes.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/patreon.svg b/launcher/resources/breeze_dark/scalable/patreon.svg new file mode 100644 index 000000000..7f98dd132 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/patreon.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/breeze_dark/scalable/proxy.svg b/launcher/resources/breeze_dark/scalable/proxy.svg new file mode 100644 index 000000000..c6efb1716 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/proxy.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/reddit-alien.svg b/launcher/resources/breeze_dark/scalable/reddit-alien.svg new file mode 100644 index 000000000..00f82bb34 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/reddit-alien.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/breeze_dark/scalable/refresh.svg b/launcher/resources/breeze_dark/scalable/refresh.svg new file mode 100644 index 000000000..7b4864639 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/refresh.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/rename.svg b/launcher/resources/breeze_dark/scalable/rename.svg new file mode 100644 index 000000000..6a844965e --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/rename.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/resourcepacks.svg b/launcher/resources/breeze_dark/scalable/resourcepacks.svg new file mode 100644 index 000000000..0986c2167 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/resourcepacks.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/screenshots.svg b/launcher/resources/breeze_dark/scalable/screenshots.svg new file mode 100644 index 000000000..a10ed713d --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/screenshots.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/settings.svg b/launcher/resources/breeze_dark/scalable/settings.svg new file mode 100644 index 000000000..009d81547 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/settings.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/shaderpacks.svg b/launcher/resources/breeze_dark/scalable/shaderpacks.svg new file mode 100644 index 000000000..b2887947a --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/shaderpacks.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/status-bad.svg b/launcher/resources/breeze_dark/scalable/status-bad.svg new file mode 100644 index 000000000..6fc3137e4 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/status-bad.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/launcher/resources/breeze_dark/scalable/status-good.svg b/launcher/resources/breeze_dark/scalable/status-good.svg new file mode 100644 index 000000000..eb8bc03be --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/status-good.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/launcher/resources/breeze_dark/scalable/status-yellow.svg b/launcher/resources/breeze_dark/scalable/status-yellow.svg new file mode 100644 index 000000000..1dc4d0f51 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/status-yellow.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/launcher/resources/breeze_dark/scalable/tag.svg b/launcher/resources/breeze_dark/scalable/tag.svg new file mode 100644 index 000000000..b54b515fc --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/tag.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/viewfolder.svg b/launcher/resources/breeze_dark/scalable/viewfolder.svg new file mode 100644 index 000000000..0189b9544 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/viewfolder.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_dark/scalable/worlds.svg b/launcher/resources/breeze_dark/scalable/worlds.svg new file mode 100644 index 000000000..0cff82666 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/worlds.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/launcher/resources/breeze_light/breeze_light.qrc b/launcher/resources/breeze_light/breeze_light.qrc new file mode 100644 index 000000000..7d9d99f5e --- /dev/null +++ b/launcher/resources/breeze_light/breeze_light.qrc @@ -0,0 +1,43 @@ + + + index.theme + scalable/about.svg + scalable/accounts.svg + scalable/bug.svg + scalable/centralmods.svg + scalable/checkupdate.svg + scalable/copy.svg + scalable/coremods.svg + scalable/custom-commands.svg + scalable/discord.svg + scalable/externaltools.svg + scalable/help.svg + scalable/instance-settings.svg + scalable/jarmods.svg + scalable/java.svg + scalable/language.svg + scalable/loadermods.svg + scalable/log.svg + scalable/minecraft.svg + scalable/new.svg + scalable/news.svg + scalable/notes.svg + scalable/proxy.svg + scalable/reddit-alien.svg + scalable/refresh.svg + scalable/resourcepacks.svg + scalable/shaderpacks.svg + scalable/screenshots.svg + scalable/settings.svg + scalable/status-bad.svg + scalable/status-good.svg + scalable/status-yellow.svg + scalable/viewfolder.svg + scalable/worlds.svg + scalable/delete.svg + scalable/tag.svg + scalable/export.svg + scalable/rename.svg + scalable/launch.svg + + diff --git a/launcher/resources/breeze_light/index.theme b/launcher/resources/breeze_light/index.theme new file mode 100644 index 000000000..126d42d73 --- /dev/null +++ b/launcher/resources/breeze_light/index.theme @@ -0,0 +1,11 @@ +[Icon Theme] +Name=Breeze Light +Comment=Breeze Light Icons +Inherits=multimc +Directories=scalable + +[scalable] +Size=48 +Type=Scalable +MinSize=16 +MaxSize=256 diff --git a/launcher/resources/breeze_light/scalable/about.svg b/launcher/resources/breeze_light/scalable/about.svg new file mode 100644 index 000000000..ea1dc02cd --- /dev/null +++ b/launcher/resources/breeze_light/scalable/about.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/accounts.svg b/launcher/resources/breeze_light/scalable/accounts.svg new file mode 100644 index 000000000..8a542f369 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/accounts.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/bug.svg b/launcher/resources/breeze_light/scalable/bug.svg new file mode 100644 index 000000000..4f41ad6b8 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/bug.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/centralmods.svg b/launcher/resources/breeze_light/scalable/centralmods.svg new file mode 100644 index 000000000..4035e51cb --- /dev/null +++ b/launcher/resources/breeze_light/scalable/centralmods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_light/scalable/checkupdate.svg b/launcher/resources/breeze_light/scalable/checkupdate.svg new file mode 100644 index 000000000..06b318273 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/checkupdate.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/copy.svg b/launcher/resources/breeze_light/scalable/copy.svg new file mode 100644 index 000000000..2557953b0 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/copy.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/coremods.svg b/launcher/resources/breeze_light/scalable/coremods.svg new file mode 100644 index 000000000..ec4ecea85 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/coremods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_light/scalable/custom-commands.svg b/launcher/resources/breeze_light/scalable/custom-commands.svg new file mode 100644 index 000000000..b2ac78c59 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/custom-commands.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/delete.svg b/launcher/resources/breeze_light/scalable/delete.svg new file mode 100644 index 000000000..f2aea6e84 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/delete.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/discord.svg b/launcher/resources/breeze_light/scalable/discord.svg new file mode 100644 index 000000000..22ee27ba2 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_light/scalable/export.svg b/launcher/resources/breeze_light/scalable/export.svg new file mode 100644 index 000000000..d6314bd70 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/export.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/externaltools.svg b/launcher/resources/breeze_light/scalable/externaltools.svg new file mode 100644 index 000000000..c965b6c37 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/externaltools.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/help.svg b/launcher/resources/breeze_light/scalable/help.svg new file mode 100644 index 000000000..bcd14e054 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/help.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/instance-settings.svg b/launcher/resources/breeze_light/scalable/instance-settings.svg new file mode 100644 index 000000000..69854d738 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/instance-settings.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/jarmods.svg b/launcher/resources/breeze_light/scalable/jarmods.svg new file mode 100644 index 000000000..49a45d36a --- /dev/null +++ b/launcher/resources/breeze_light/scalable/jarmods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/breeze_light/scalable/java.svg b/launcher/resources/breeze_light/scalable/java.svg new file mode 100644 index 000000000..ff86c9ccc --- /dev/null +++ b/launcher/resources/breeze_light/scalable/java.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/language.svg b/launcher/resources/breeze_light/scalable/language.svg new file mode 100644 index 000000000..3d56d33e1 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/language.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/launch.svg b/launcher/resources/breeze_light/scalable/launch.svg new file mode 100644 index 000000000..678fd0988 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/launch.svg @@ -0,0 +1,8 @@ + + + + diff --git a/launcher/resources/breeze_light/scalable/loadermods.svg b/launcher/resources/breeze_light/scalable/loadermods.svg new file mode 100644 index 000000000..4fb0f96d9 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/loadermods.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/log.svg b/launcher/resources/breeze_light/scalable/log.svg new file mode 100644 index 000000000..cf9c9b225 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/log.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/matrix.svg b/launcher/resources/breeze_light/scalable/matrix.svg new file mode 100644 index 000000000..4745efc11 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/matrix.svg @@ -0,0 +1,9 @@ + + + Matrix (protocol) logo + + + + + + \ No newline at end of file diff --git a/launcher/resources/breeze_light/scalable/minecraft.svg b/launcher/resources/breeze_light/scalable/minecraft.svg new file mode 100644 index 000000000..1ffb4565f --- /dev/null +++ b/launcher/resources/breeze_light/scalable/minecraft.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/new.svg b/launcher/resources/breeze_light/scalable/new.svg new file mode 100644 index 000000000..51babd764 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/new.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/news.svg b/launcher/resources/breeze_light/scalable/news.svg new file mode 100644 index 000000000..3e3ebe950 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/news.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/notes.svg b/launcher/resources/breeze_light/scalable/notes.svg new file mode 100644 index 000000000..a8eaf279b --- /dev/null +++ b/launcher/resources/breeze_light/scalable/notes.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/patreon.svg b/launcher/resources/breeze_light/scalable/patreon.svg new file mode 100644 index 000000000..e12f1f8d9 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/patreon.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/breeze_light/scalable/proxy.svg b/launcher/resources/breeze_light/scalable/proxy.svg new file mode 100644 index 000000000..2e67ff6c9 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/proxy.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/reddit-alien.svg b/launcher/resources/breeze_light/scalable/reddit-alien.svg new file mode 100644 index 000000000..93b8eedc9 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/reddit-alien.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/breeze_light/scalable/refresh.svg b/launcher/resources/breeze_light/scalable/refresh.svg new file mode 100644 index 000000000..ecd2b394e --- /dev/null +++ b/launcher/resources/breeze_light/scalable/refresh.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/rename.svg b/launcher/resources/breeze_light/scalable/rename.svg new file mode 100644 index 000000000..18ccc58a8 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/rename.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/resourcepacks.svg b/launcher/resources/breeze_light/scalable/resourcepacks.svg new file mode 100644 index 000000000..913d3c1fa --- /dev/null +++ b/launcher/resources/breeze_light/scalable/resourcepacks.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/screenshots.svg b/launcher/resources/breeze_light/scalable/screenshots.svg new file mode 100644 index 000000000..d984b3307 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/screenshots.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/settings.svg b/launcher/resources/breeze_light/scalable/settings.svg new file mode 100644 index 000000000..19e86e26e --- /dev/null +++ b/launcher/resources/breeze_light/scalable/settings.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/shaderpacks.svg b/launcher/resources/breeze_light/scalable/shaderpacks.svg new file mode 100644 index 000000000..591c6af5c --- /dev/null +++ b/launcher/resources/breeze_light/scalable/shaderpacks.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/status-bad.svg b/launcher/resources/breeze_light/scalable/status-bad.svg new file mode 100644 index 000000000..6fc3137e4 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/status-bad.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/launcher/resources/breeze_light/scalable/status-good.svg b/launcher/resources/breeze_light/scalable/status-good.svg new file mode 100644 index 000000000..eb8bc03be --- /dev/null +++ b/launcher/resources/breeze_light/scalable/status-good.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/launcher/resources/breeze_light/scalable/status-yellow.svg b/launcher/resources/breeze_light/scalable/status-yellow.svg new file mode 100644 index 000000000..1dc4d0f51 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/status-yellow.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/launcher/resources/breeze_light/scalable/tag.svg b/launcher/resources/breeze_light/scalable/tag.svg new file mode 100644 index 000000000..4887d126e --- /dev/null +++ b/launcher/resources/breeze_light/scalable/tag.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/viewfolder.svg b/launcher/resources/breeze_light/scalable/viewfolder.svg new file mode 100644 index 000000000..4a8498ceb --- /dev/null +++ b/launcher/resources/breeze_light/scalable/viewfolder.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/scalable/worlds.svg b/launcher/resources/breeze_light/scalable/worlds.svg new file mode 100644 index 000000000..543cc55e4 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/worlds.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 6661bf0f4..cae0635f0 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -303,21 +303,27 @@ void LauncherPage::applySettings() s->set("IconTheme", "pe_blue"); break; case 4: - s->set("IconTheme", "OSX"); + s->set("IconTheme", "breeze_light"); break; case 5: - s->set("IconTheme", "iOS"); + s->set("IconTheme", "breeze_dark"); break; case 6: - s->set("IconTheme", "flat"); + s->set("IconTheme", "OSX"); break; case 7: - s->set("IconTheme", "flat_white"); + s->set("IconTheme", "iOS"); break; case 8: - s->set("IconTheme", "multimc"); + s->set("IconTheme", "flat"); break; case 9: + s->set("IconTheme", "flat_white"); + break; + case 10: + s->set("IconTheme", "multimc"); + break; + case 11: s->set("IconTheme", "custom"); break; } @@ -397,7 +403,18 @@ void LauncherPage::loadSettings() m_currentUpdateChannel = s->get("UpdateChannel").toString(); //FIXME: make generic auto theme = s->get("IconTheme").toString(); - QStringList iconThemeOptions{"pe_colored", "pe_light", "pe_dark", "pe_blue", "OSX", "iOS", "flat", "flat_white", "multimc", "custom"}; + QStringList iconThemeOptions{"pe_colored", + "pe_light", + "pe_dark", + "pe_blue", + "breeze_light", + "breeze_dark", + "OSX", + "iOS", + "flat", + "flat_white", + "multimc", + "custom"}; ui->themeComboBox->setCurrentIndex(iconThemeOptions.indexOf(theme)); auto cat = s->get("BackgroundCat").toString(); diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index 6de644ee5..c44718a18 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -285,6 +285,16 @@ Simple (Blue Icons) + + + Breeze Light + + + + + Breeze Dark + + OSX From df0f9259c0bf79e10b27ad5b429b53559ffd15f0 Mon Sep 17 00:00:00 2001 From: flow Date: Sun, 20 Nov 2022 11:04:10 -0300 Subject: [PATCH 0299/1149] refactor: move RP/TP validation to their respective utils This makes it easier to validate individual resources, and allows the logic to be used in other places in the future, if we need to. Signed-off-by: flow --- .../mod/tasks/LocalResourcePackParseTask.cpp | 25 +++++++++--- .../mod/tasks/LocalResourcePackParseTask.h | 12 ++++-- .../mod/tasks/LocalTexturePackParseTask.cpp | 25 +++++++++--- .../mod/tasks/LocalTexturePackParseTask.h | 12 ++++-- launcher/ui/MainWindow.cpp | 40 +++++++++---------- 5 files changed, 76 insertions(+), 38 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index d744c5350..f58a0620b 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -28,14 +28,14 @@ namespace ResourcePackUtils { -bool process(ResourcePack& pack) +bool process(ResourcePack& pack, ProcessingLevel level) { switch (pack.type()) { case ResourceType::FOLDER: - ResourcePackUtils::processFolder(pack); + ResourcePackUtils::processFolder(pack, level); return true; case ResourceType::ZIPFILE: - ResourcePackUtils::processZIP(pack); + ResourcePackUtils::processZIP(pack, level); return true; default: qWarning() << "Invalid type for resource pack parse task!"; @@ -43,7 +43,7 @@ bool process(ResourcePack& pack) } } -void processFolder(ResourcePack& pack) +void processFolder(ResourcePack& pack, ProcessingLevel level) { Q_ASSERT(pack.type() == ResourceType::FOLDER); @@ -60,6 +60,9 @@ void processFolder(ResourcePack& pack) mcmeta_file.close(); } + if (level == ProcessingLevel::BasicInfoOnly) + return; + QFileInfo image_file_info(FS::PathCombine(pack.fileinfo().filePath(), "pack.png")); if (image_file_info.isFile()) { QFile mcmeta_file(image_file_info.filePath()); @@ -74,7 +77,7 @@ void processFolder(ResourcePack& pack) } } -void processZIP(ResourcePack& pack) +void processZIP(ResourcePack& pack, ProcessingLevel level) { Q_ASSERT(pack.type() == ResourceType::ZIPFILE); @@ -98,6 +101,11 @@ void processZIP(ResourcePack& pack) file.close(); } + if (level == ProcessingLevel::BasicInfoOnly) { + zip.close(); + return; + } + if (zip.setCurrentFile("pack.png")) { if (!file.open(QIODevice::ReadOnly)) { qCritical() << "Failed to open file in zip."; @@ -138,6 +146,13 @@ void processPackPNG(ResourcePack& pack, QByteArray&& raw_data) qWarning() << "Failed to parse pack.png."; } } + +bool validate(QFileInfo file) +{ + ResourcePack rp{ file }; + return ResourcePackUtils::process(rp, ProcessingLevel::BasicInfoOnly) && rp.valid(); +} + } // namespace ResourcePackUtils LocalResourcePackParseTask::LocalResourcePackParseTask(int token, ResourcePack& rp) diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h index d3c254645..69dbd6ad6 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.h @@ -26,13 +26,19 @@ #include "tasks/Task.h" namespace ResourcePackUtils { -bool process(ResourcePack& pack); -void processZIP(ResourcePack& pack); -void processFolder(ResourcePack& pack); +enum class ProcessingLevel { Full, BasicInfoOnly }; + +bool process(ResourcePack& pack, ProcessingLevel level = ProcessingLevel::Full); + +void processZIP(ResourcePack& pack, ProcessingLevel level = ProcessingLevel::Full); +void processFolder(ResourcePack& pack, ProcessingLevel level = ProcessingLevel::Full); void processMCMeta(ResourcePack& pack, QByteArray&& raw_data); void processPackPNG(ResourcePack& pack, QByteArray&& raw_data); + +/** Checks whether a file is valid as a resource pack or not. */ +bool validate(QFileInfo file); } // namespace ResourcePackUtils class LocalResourcePackParseTask : public Task { diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp index f23117ee2..8da366c1b 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp @@ -28,14 +28,14 @@ namespace TexturePackUtils { -bool process(TexturePack& pack) +bool process(TexturePack& pack, ProcessingLevel level) { switch (pack.type()) { case ResourceType::FOLDER: - TexturePackUtils::processFolder(pack); + TexturePackUtils::processFolder(pack, level); return true; case ResourceType::ZIPFILE: - TexturePackUtils::processZIP(pack); + TexturePackUtils::processZIP(pack, level); return true; default: qWarning() << "Invalid type for resource pack parse task!"; @@ -43,7 +43,7 @@ bool process(TexturePack& pack) } } -void processFolder(TexturePack& pack) +void processFolder(TexturePack& pack, ProcessingLevel level) { Q_ASSERT(pack.type() == ResourceType::FOLDER); @@ -60,6 +60,9 @@ void processFolder(TexturePack& pack) mcmeta_file.close(); } + if (level == ProcessingLevel::BasicInfoOnly) + return; + QFileInfo image_file_info(FS::PathCombine(pack.fileinfo().filePath(), "pack.png")); if (image_file_info.isFile()) { QFile mcmeta_file(image_file_info.filePath()); @@ -74,7 +77,7 @@ void processFolder(TexturePack& pack) } } -void processZIP(TexturePack& pack) +void processZIP(TexturePack& pack, ProcessingLevel level) { Q_ASSERT(pack.type() == ResourceType::ZIPFILE); @@ -98,6 +101,11 @@ void processZIP(TexturePack& pack) file.close(); } + if (level == ProcessingLevel::BasicInfoOnly) { + zip.close(); + return; + } + if (zip.setCurrentFile("pack.png")) { if (!file.open(QIODevice::ReadOnly)) { qCritical() << "Failed to open file in zip."; @@ -129,6 +137,13 @@ void processPackPNG(TexturePack& pack, QByteArray&& raw_data) qWarning() << "Failed to parse pack.png."; } } + +bool validate(QFileInfo file) +{ + TexturePack rp{ file }; + return TexturePackUtils::process(rp, ProcessingLevel::BasicInfoOnly) && rp.valid(); +} + } // namespace TexturePackUtils LocalTexturePackParseTask::LocalTexturePackParseTask(int token, TexturePack& rp) diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.h b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.h index cb0e404a7..9f7aab75f 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.h +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.h @@ -27,13 +27,19 @@ #include "tasks/Task.h" namespace TexturePackUtils { -bool process(TexturePack& pack); -void processZIP(TexturePack& pack); -void processFolder(TexturePack& pack); +enum class ProcessingLevel { Full, BasicInfoOnly }; + +bool process(TexturePack& pack, ProcessingLevel level = ProcessingLevel::Full); + +void processZIP(TexturePack& pack, ProcessingLevel level = ProcessingLevel::Full); +void processFolder(TexturePack& pack, ProcessingLevel level = ProcessingLevel::Full); void processPackTXT(TexturePack& pack, QByteArray&& raw_data); void processPackPNG(TexturePack& pack, QByteArray&& raw_data); + +/** Checks whether a file is valid as a texture pack or not. */ +bool validate(QFileInfo file); } // namespace TexturePackUtils class LocalTexturePackParseTask : public Task { diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 98fd79be0..5d2a07f32 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -110,10 +110,8 @@ #include "ui/dialogs/ImportResourcePackDialog.h" #include "ui/themes/ITheme.h" -#include #include #include -#include #include #include @@ -1806,32 +1804,30 @@ void MainWindow::droppedURLs(QList urls) for (auto& url : urls) { if (url.isLocalFile()) { auto localFileName = url.toLocalFile(); - - ResourcePack rp{ QFileInfo(localFileName) }; - TexturePack tp{ QFileInfo(localFileName) }; + QFileInfo localFileInfo(localFileName); ImportResourcePackDialog dlg(this); - if (ResourcePackUtils::process(rp) && rp.valid()) { - dlg.exec(); + if (ResourcePackUtils::validate(localFileInfo)) { + dlg.exec(); - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->resourcePackList()->installResource(localFileName); - } - } else if (TexturePackUtils::process(tp) && tp.valid()) { - dlg.exec(); + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->resourcePackList()->installResource(localFileName); + } + } else if (TexturePackUtils::validate(localFileInfo)) { + dlg.exec(); - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->texturePackList()->installResource(localFileName); - } + if (dlg.result() == QDialog::Accepted) { + qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; + auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto instanceButBuffed = std::dynamic_pointer_cast(instance); + instanceButBuffed->texturePackList()->installResource(localFileName); + } } else { - addInstance(localFileName); + addInstance(localFileName); } } else { addInstance(url.toString()); From f55fc51e9b372e00ada739cfa679387079ffca2a Mon Sep 17 00:00:00 2001 From: flow Date: Sun, 20 Nov 2022 11:09:24 -0300 Subject: [PATCH 0300/1149] fix: remove commented-out assertions They may not hold true at all times, and that's fine. Signed-off-by: flow --- launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp | 2 -- launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp index f58a0620b..6fd4b0245 100644 --- a/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalResourcePackParseTask.cpp @@ -167,8 +167,6 @@ bool LocalResourcePackParseTask::abort() void LocalResourcePackParseTask::executeTask() { - // Q_ASSERT(m_resource_pack.valid()); - if (!ResourcePackUtils::process(m_resource_pack)) return; diff --git a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp index 8da366c1b..adb19aca9 100644 --- a/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalTexturePackParseTask.cpp @@ -158,8 +158,6 @@ bool LocalTexturePackParseTask::abort() void LocalTexturePackParseTask::executeTask() { - // Q_ASSERT(m_texture_pack.valid()); - if (!TexturePackUtils::process(m_texture_pack)) return; From ffcbf97dcccb2e6cb081282a3e335ecb66d37ca5 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sun, 20 Nov 2022 09:21:43 +0100 Subject: [PATCH 0301/1149] fix: add Breeze copyright notice to COPYING Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- COPYING.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/COPYING.md b/COPYING.md index 3e35c579e..dde3c7273 100644 --- a/COPYING.md +++ b/COPYING.md @@ -398,3 +398,20 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## Breeze icons + + Copyright (C) 2014 Uri Herrera and others + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . From 884fe0d5741de2a8a78f48c5d37274d8f174ba3a Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 20 Nov 2022 18:16:19 +0100 Subject: [PATCH 0302/1149] feat: validate maximum memory allocation in wizard Signed-off-by: Sefa Eyeoglu --- launcher/ui/widgets/JavaSettingsWidget.cpp | 42 ++++++++++++++++++---- launcher/ui/widgets/JavaSettingsWidget.h | 9 +++-- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/launcher/ui/widgets/JavaSettingsWidget.cpp b/launcher/ui/widgets/JavaSettingsWidget.cpp index c7c4dbbd9..159943198 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.cpp +++ b/launcher/ui/widgets/JavaSettingsWidget.cpp @@ -71,6 +71,7 @@ void JavaSettingsWidget::setupUi() m_memoryGroupBox->setObjectName(QStringLiteral("memoryGroupBox")); m_gridLayout_2 = new QGridLayout(m_memoryGroupBox); m_gridLayout_2->setObjectName(QStringLiteral("gridLayout_2")); + m_gridLayout_2->setColumnStretch(0, 1); m_labelMinMem = new QLabel(m_memoryGroupBox); m_labelMinMem->setObjectName(QStringLiteral("labelMinMem")); @@ -80,7 +81,7 @@ void JavaSettingsWidget::setupUi() m_minMemSpinBox->setObjectName(QStringLiteral("minMemSpinBox")); m_minMemSpinBox->setSuffix(QStringLiteral(" MiB")); m_minMemSpinBox->setMinimum(128); - m_minMemSpinBox->setMaximum(m_availableMemory); + m_minMemSpinBox->setMaximum(1048576); m_minMemSpinBox->setSingleStep(128); m_labelMinMem->setBuddy(m_minMemSpinBox); m_gridLayout_2->addWidget(m_minMemSpinBox, 0, 1, 1, 1); @@ -93,11 +94,15 @@ void JavaSettingsWidget::setupUi() m_maxMemSpinBox->setObjectName(QStringLiteral("maxMemSpinBox")); m_maxMemSpinBox->setSuffix(QStringLiteral(" MiB")); m_maxMemSpinBox->setMinimum(128); - m_maxMemSpinBox->setMaximum(m_availableMemory); + m_maxMemSpinBox->setMaximum(1048576); m_maxMemSpinBox->setSingleStep(128); m_labelMaxMem->setBuddy(m_maxMemSpinBox); m_gridLayout_2->addWidget(m_maxMemSpinBox, 1, 1, 1, 1); + m_labelMaxMemIcon = new QLabel(m_memoryGroupBox); + m_labelMaxMemIcon->setObjectName(QStringLiteral("labelMaxMemIcon")); + m_gridLayout_2->addWidget(m_labelMaxMemIcon, 1, 2, 1, 1); + m_labelPermGen = new QLabel(m_memoryGroupBox); m_labelPermGen->setObjectName(QStringLiteral("labelPermGen")); m_labelPermGen->setText(QStringLiteral("PermGen:")); @@ -108,7 +113,7 @@ void JavaSettingsWidget::setupUi() m_permGenSpinBox->setObjectName(QStringLiteral("permGenSpinBox")); m_permGenSpinBox->setSuffix(QStringLiteral(" MiB")); m_permGenSpinBox->setMinimum(64); - m_permGenSpinBox->setMaximum(m_availableMemory); + m_permGenSpinBox->setMaximum(1048576); m_permGenSpinBox->setSingleStep(8); m_gridLayout_2->addWidget(m_permGenSpinBox, 2, 1, 1, 1); m_permGenSpinBox->setVisible(false); @@ -130,6 +135,7 @@ void JavaSettingsWidget::initialize() m_minMemSpinBox->setValue(observedMinMemory); m_maxMemSpinBox->setValue(observedMaxMemory); m_permGenSpinBox->setValue(observedPermGenMemory); + updateThresholds(); } void JavaSettingsWidget::refresh() @@ -210,9 +216,9 @@ int JavaSettingsWidget::permGenSize() const void JavaSettingsWidget::memoryValueChanged(int) { bool actuallyChanged = false; - int min = m_minMemSpinBox->value(); - int max = m_maxMemSpinBox->value(); - int permgen = m_permGenSpinBox->value(); + unsigned int min = m_minMemSpinBox->value(); + unsigned int max = m_maxMemSpinBox->value(); + unsigned int permgen = m_permGenSpinBox->value(); QObject *obj = sender(); if (obj == m_minMemSpinBox && min != observedMinMemory) { @@ -242,6 +248,7 @@ void JavaSettingsWidget::memoryValueChanged(int) if(actuallyChanged) { checkJavaPathOnEdit(m_javaPathTextBox->text()); + updateThresholds(); } } @@ -435,3 +442,26 @@ void JavaSettingsWidget::retranslate() m_permGenSpinBox->setToolTip(tr("The amount of memory available to store loaded Java classes.")); m_javaBrowseBtn->setText(tr("Browse")); } + +void JavaSettingsWidget::updateThresholds() +{ + QString iconName; + + if (observedMaxMemory >= m_availableMemory) { + iconName = "status-bad"; + m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation exceeds your system memory capacity.")); + } else if (observedMaxMemory > (m_availableMemory * 0.9)) { + iconName = "status-yellow"; + m_labelMaxMemIcon->setToolTip(tr("Your maximum memory allocation approaches your system memory capacity.")); + } else { + iconName = "status-good"; + m_labelMaxMemIcon->setToolTip(""); + } + + { + auto height = m_labelMaxMemIcon->fontInfo().pixelSize(); + QIcon icon = APPLICATION->getThemedIcon(iconName); + QPixmap pix = icon.pixmap(height, height); + m_labelMaxMemIcon->setPixmap(pix); + } +} diff --git a/launcher/ui/widgets/JavaSettingsWidget.h b/launcher/ui/widgets/JavaSettingsWidget.h index 5344e2cd1..e4b7c7129 100644 --- a/launcher/ui/widgets/JavaSettingsWidget.h +++ b/launcher/ui/widgets/JavaSettingsWidget.h @@ -56,6 +56,8 @@ public: int maxHeapSize() const; QString javaPath() const; + void updateThresholds(); + protected slots: void memoryValueChanged(int); @@ -85,6 +87,7 @@ private: /* data */ QSpinBox *m_maxMemSpinBox = nullptr; QLabel *m_labelMinMem = nullptr; QLabel *m_labelMaxMem = nullptr; + QLabel *m_labelMaxMemIcon = nullptr; QSpinBox *m_minMemSpinBox = nullptr; QLabel *m_labelPermGen = nullptr; QSpinBox *m_permGenSpinBox = nullptr; @@ -92,9 +95,9 @@ private: /* data */ QIcon yellowIcon; QIcon badIcon; - int observedMinMemory = 0; - int observedMaxMemory = 0; - int observedPermGenMemory = 0; + unsigned int observedMinMemory = 0; + unsigned int observedMaxMemory = 0; + unsigned int observedPermGenMemory = 0; QString queuedCheck; uint64_t m_availableMemory = 0ull; shared_qobject_ptr m_checker; From f601135cc0154236e3b26b2850f0cf633bcef2f8 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 20 Nov 2022 23:49:11 +0100 Subject: [PATCH 0303/1149] refactor(nix): synchronize changes from nixpkgs Signed-off-by: Sefa Eyeoglu --- flake.nix | 4 +-- nix/default.nix | 95 ++++++++++++++++++++++++------------------------- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/flake.nix b/flake.nix index d4a253388..b1e07c910 100644 --- a/flake.nix +++ b/flake.nix @@ -23,8 +23,8 @@ pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system}); packagesFn = pkgs: rec { - prismlauncher = pkgs.libsForQt5.callPackage ./nix { inherit version self libnbtplusplus tomlplusplus; }; - prismlauncher-qt6 = pkgs.qt6Packages.callPackage ./nix { inherit version self libnbtplusplus tomlplusplus; }; + prismlauncher-qt5 = pkgs.libsForQt5.callPackage ./nix { inherit version self libnbtplusplus tomlplusplus; }; + prismlauncher = pkgs.qt6Packages.callPackage ./nix { inherit version self libnbtplusplus tomlplusplus; }; }; in { diff --git a/nix/default.nix b/nix/default.nix index c7fc75769..6050fd37f 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,100 +1,99 @@ -{ stdenv -, lib -, fetchFromGitHub +{ lib +, stdenv , cmake -, ninja , jdk8 , jdk -, ghc_filesystem , zlib , file , wrapQtAppsHook , xorg , libpulseaudio , qtbase -, quazip +, qtsvg +, qtwayland , libGL -, msaClientID ? "" -, extraJDKs ? [ ] +, quazip +, glfw +, openal , extra-cmake-modules +, ghc_filesystem +, msaClientID ? "" +, jdks ? [ jdk jdk8 ] # flake , self , version , libnbtplusplus , tomlplusplus -, enableLTO ? false }: -let - # Libraries required to run Minecraft - libpath = with xorg; lib.makeLibraryPath [ - libX11 - libXext - libXcursor - libXrandr - libXxf86vm - libpulseaudio - libGL - ]; - - # This variable will be passed to Minecraft by Prism Launcher - gameLibraryPath = libpath + ":/run/opengl-driver/lib"; - - javaPaths = lib.makeSearchPath "bin/java" ([ jdk jdk8 ] ++ extraJDKs); -in - stdenv.mkDerivation rec { pname = "prismlauncher"; inherit version; src = lib.cleanSource self; - nativeBuildInputs = [ cmake extra-cmake-modules ninja jdk ghc_filesystem file wrapQtAppsHook ]; - buildInputs = [ qtbase quazip zlib ]; + nativeBuildInputs = [ extra-cmake-modules cmake file jdk wrapQtAppsHook ]; + buildInputs = [ + qtbase + qtsvg + zlib + quazip + ghc_filesystem + ] ++ lib.optional (lib.versionAtLeast qtbase.version "6") qtwayland; + cmakeFlags = lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ] + ++ lib.optionals (lib.versionAtLeast qtbase.version "6") [ "-DLauncher_QT_VERSION_MAJOR=6" ]; dontWrapQtApps = true; postUnpack = '' - # Copy libnbtplusplus rm -rf source/libraries/libnbtplusplus mkdir source/libraries/libnbtplusplus ln -s ${libnbtplusplus}/* source/libraries/libnbtplusplus chmod -R +r+w source/libraries/libnbtplusplus - # Copy tomlplusplus + chown -R $USER: source/libraries/libnbtplusplus rm -rf source/libraries/tomlplusplus mkdir source/libraries/tomlplusplus ln -s ${tomlplusplus}/* source/libraries/tomlplusplus chmod -R +r+w source/libraries/tomlplusplus + chown -R $USER: source/libraries/tomlplusplus ''; - cmakeFlags = [ - "-GNinja" - "-DLauncher_QT_VERSION_MAJOR=${lib.versions.major qtbase.version}" - ] ++ lib.optionals enableLTO [ "-DENABLE_LTO=on" ] - ++ lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ]; + postInstall = + let + libpath = with xorg; + lib.makeLibraryPath [ + libX11 + libXext + libXcursor + libXrandr + libXxf86vm + libpulseaudio + libGL + glfw + openal + stdenv.cc.cc.lib + ]; + in + '' + # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 + wrapQtApp $out/bin/prismlauncher \ + --set LD_LIBRARY_PATH /run/opengl-driver/lib:${libpath} \ + --prefix PRISMLAUNCHER_JAVA_PATHS : ${lib.makeSearchPath "bin/java" jdks} \ + --prefix PATH : ${lib.makeBinPath [xorg.xrandr]} + ''; - # we have to check if the system is NixOS before adding stdenv.cc.cc.lib (#923) - postInstall = '' - # xorg.xrandr needed for LWJGL [2.9.2, 3) https://github.com/LWJGL/lwjgl/issues/128 - wrapQtApp $out/bin/prismlauncher \ - --run '[ -f /etc/NIXOS ] && export LD_LIBRARY_PATH="${stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH"' \ - --prefix LD_LIBRARY_PATH : ${gameLibraryPath} \ - --prefix PRISMLAUNCHER_JAVA_PATHS : ${javaPaths} \ - --prefix PATH : ${lib.makeBinPath [ xorg.xrandr ]} - ''; meta = with lib; { homepage = "https://prismlauncher.org/"; - downloadPage = "https://prismlauncher.org/download/"; - changelog = "https://github.com/PrismLauncher/PrismLauncher/releases"; description = "A free, open source launcher for Minecraft"; longDescription = '' Allows you to have multiple, separate instances of Minecraft (each with their own mods, texture packs, saves, etc) and helps you manage them and their associated options with a simple interface. ''; - platforms = platforms.unix; + platforms = platforms.linux; + changelog = "https://github.com/PrismLauncher/PrismLauncher/releases/tag/${version}"; license = licenses.gpl3Only; maintainers = with maintainers; [ minion3665 Scrumplex ]; }; From 70a11935a85325f0cf896eb301bbc342a6d3e3c8 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 21 Nov 2022 00:02:41 +0100 Subject: [PATCH 0304/1149] feat(actions): add Nix build Signed-off-by: Sefa Eyeoglu --- .github/workflows/build.yml | 33 ++++++++++++++++++++++++++++ .github/workflows/trigger_builds.yml | 1 + 2 files changed, 34 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c0e5b50a5..d41dfdc2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,9 @@ on: SPARKLE_ED25519_KEY: description: Private key for signing Sparkle updates required: false + CACHIX_AUTH_TOKEN: + description: Private token for authenticating against Cachix cache + required: false jobs: build: @@ -526,3 +529,33 @@ jobs: bundle: "Prism Launcher.flatpak" manifest-path: flatpak/org.prismlauncher.PrismLauncher.yml cache-key: flatpak-${{ github.sha }}-x86_64 + + nix: + runs-on: ubuntu-latest + strategy: + matrix: + package: + - prismlauncher + - prismlauncher-qt5 + steps: + - name: Clone repository + if: inputs.build_type == 'Debug' + uses: actions/checkout@v3 + with: + submodules: 'true' + - name: Install nix + if: inputs.build_type == 'Debug' + uses: cachix/install-nix-action@v18 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + experimental-features = nix-command flakes + - uses: cachix/cachix-action@v12 + if: inputs.build_type == 'Debug' + with: + name: prismlauncher + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - name: Build + if: inputs.build_type == 'Debug' + run: nix build .#${{ matrix.package }} --print-build-logs diff --git a/.github/workflows/trigger_builds.yml b/.github/workflows/trigger_builds.yml index 44751fbc1..cf299744f 100644 --- a/.github/workflows/trigger_builds.yml +++ b/.github/workflows/trigger_builds.yml @@ -33,3 +33,4 @@ jobs: is_qt_cached: true secrets: SPARKLE_ED25519_KEY: ${{ secrets.SPARKLE_ED25519_KEY }} + CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }} From 7096f02b88e982df6c770113146a07874a1e9d0f Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Mon, 21 Nov 2022 18:15:03 +0800 Subject: [PATCH 0305/1149] fix: text wrapping Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/dialogs/ImportResourcePackDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.cpp b/launcher/ui/dialogs/ImportResourcePackDialog.cpp index 2b7466052..7a2152b71 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.cpp +++ b/launcher/ui/dialogs/ImportResourcePackDialog.cpp @@ -27,7 +27,7 @@ ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(pa contentsWidget->setWordWrap(false); contentsWidget->setWrapping(true); contentsWidget->setUniformItemSizes(true); - contentsWidget->setTextElideMode(Qt::ElideRight); + contentsWidget->setWordWrap(true); contentsWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); contentsWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); contentsWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); From c1b3a3adb4be8b31c23ded08f51a477bfc36d9a3 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 21 Nov 2022 11:43:46 +0100 Subject: [PATCH 0306/1149] fix(actions): don't ignore nix files Signed-off-by: Sefa Eyeoglu --- .github/workflows/trigger_builds.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/trigger_builds.yml b/.github/workflows/trigger_builds.yml index cf299744f..a08193a06 100644 --- a/.github/workflows/trigger_builds.yml +++ b/.github/workflows/trigger_builds.yml @@ -8,7 +8,6 @@ on: - '**.md' - '**/LICENSE' - 'flake.lock' - - '**.nix' - 'packages/**' - '.github/ISSUE_TEMPLATE/**' - '.markdownlint**' @@ -17,7 +16,6 @@ on: - '**.md' - '**/LICENSE' - 'flake.lock' - - '**.nix' - 'packages/**' - '.github/ISSUE_TEMPLATE/**' - '.markdownlint**' From 4208c2c72a160896f63f44148c74cf24fc30d4b9 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 21 Nov 2022 15:47:15 +0100 Subject: [PATCH 0307/1149] fix: actually emit fileCopied Signed-off-by: Sefa Eyeoglu --- launcher/FileSystem.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 0c6527b1d..987f4e747 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -188,6 +188,8 @@ bool copy::operator()(const QString& offset, bool dryRun) qDebug() << "Source file:" << src_path; qDebug() << "Destination file:" << dst_path; } + m_copied++; + emit fileCopied(relative_dst_path); }; // We can't use copy_opts::recursive because we need to take into account the From fdbd8d9d2b2e04cd68fd800882309b40c05aba2c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 1 Nov 2022 22:45:15 +0100 Subject: [PATCH 0308/1149] refactor: remove old updater Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 68 +-- launcher/Application.h | 12 +- launcher/CMakeLists.txt | 11 - launcher/UpdateController.cpp | 443 ------------------ launcher/UpdateController.h | 44 -- .../minecraft/launch/LauncherPartLaunch.cpp | 1 + launcher/net/MetaCacheSink.cpp | 1 + launcher/net/PasteUpload.cpp | 2 + launcher/ui/GuiUtil.cpp | 1 + launcher/ui/MainWindow.cpp | 90 +--- launcher/ui/MainWindow.h | 10 - launcher/ui/dialogs/BlockedModsDialog.cpp | 12 +- launcher/ui/dialogs/ExportInstanceDialog.cpp | 1 + launcher/ui/dialogs/UpdateDialog.cpp | 217 --------- launcher/ui/dialogs/UpdateDialog.h | 67 --- launcher/ui/dialogs/UpdateDialog.ui | 91 ---- launcher/ui/pages/global/LauncherPage.cpp | 119 +---- launcher/ui/pages/global/LauncherPage.h | 12 - launcher/ui/pages/global/LauncherPage.ui | 28 -- launcher/ui/pages/instance/LogPage.cpp | 2 +- launcher/ui/pages/instance/ScreenshotsPage.h | 1 + launcher/ui/pages/instance/ServersPage.cpp | 1 + launcher/ui/pages/instance/WorldListPage.cpp | 2 +- .../modplatform/legacy_ftb/ListModel.cpp | 2 + .../modplatform/modrinth/ModrinthModel.h | 1 + launcher/updater/DownloadTask.cpp | 177 ------- launcher/updater/DownloadTask.h | 100 ---- launcher/updater/GoUpdate.cpp | 198 -------- launcher/updater/GoUpdate.h | 125 ----- launcher/updater/MacSparkleUpdater.h | 2 - launcher/updater/MacSparkleUpdater.mm | 12 - launcher/updater/UpdateChecker.cpp | 296 ------------ launcher/updater/UpdateChecker.h | 140 ------ 33 files changed, 59 insertions(+), 2230 deletions(-) delete mode 100644 launcher/UpdateController.cpp delete mode 100644 launcher/UpdateController.h delete mode 100644 launcher/ui/dialogs/UpdateDialog.cpp delete mode 100644 launcher/ui/dialogs/UpdateDialog.h delete mode 100644 launcher/ui/dialogs/UpdateDialog.ui delete mode 100644 launcher/updater/DownloadTask.cpp delete mode 100644 launcher/updater/DownloadTask.h delete mode 100644 launcher/updater/GoUpdate.cpp delete mode 100644 launcher/updater/GoUpdate.h delete mode 100644 launcher/updater/UpdateChecker.cpp delete mode 100644 launcher/updater/UpdateChecker.h diff --git a/launcher/Application.cpp b/launcher/Application.cpp index ea8d23261..8fe5a8bff 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -104,7 +104,7 @@ #include "java/JavaUtils.h" -#include "updater/UpdateChecker.h" +#include "updater/ExternalUpdater.h" #include "tools/JProfiler.h" #include "tools/JVisualVM.h" @@ -127,6 +127,10 @@ #include "gamemode_client.h" #endif +#ifdef Q_OS_MAC +#include "updater/MacSparkleUpdater.h" +#endif + #if defined Q_OS_WIN32 #ifndef WIN32_LEAN_AND_MEAN @@ -162,45 +166,6 @@ void appDebugOutput(QtMsgType type, const QMessageLogContext &context, const QSt fflush(stderr); } -QString getIdealPlatform(QString currentPlatform) { - auto info = Sys::getKernelInfo(); - switch(info.kernelType) { - case Sys::KernelType::Darwin: { - if(info.kernelMajor >= 17) { - // macOS 10.13 or newer - return "osx64-5.15.2"; - } - else { - // macOS 10.12 or older - return "osx64"; - } - } - case Sys::KernelType::Windows: { - // FIXME: 5.15.2 is not stable on Windows, due to a large number of completely unpredictable and hard to reproduce issues - break; -/* - if(info.kernelMajor == 6 && info.kernelMinor >= 1) { - // Windows 7 - return "win32-5.15.2"; - } - else if (info.kernelMajor > 6) { - // Above Windows 7 - return "win32-5.15.2"; - } - else { - // Below Windows 7 - return "win32"; - } -*/ - } - case Sys::KernelType::Undetermined: - case Sys::KernelType::Linux: { - break; - } - } - return currentPlatform; -} - } Application::Application(int &argc, char **argv) : QApplication(argc, argv) @@ -490,10 +455,6 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) { // Provide a fallback for migration from PolyMC m_settings.reset(new INISettingsObject({ BuildConfig.LAUNCHER_CONFIGFILE, "polymc.cfg", "multimc.cfg" }, this)); - // Updates - // Multiple channels are separated by spaces - m_settings->registerSetting("UpdateChannel", BuildConfig.VERSION_CHANNEL); - m_settings->registerSetting("AutoUpdate", true); // Theming m_settings->registerSetting("IconTheme", QString("pe_colored")); @@ -724,10 +685,10 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv) // initialize the updater if(BuildConfig.UPDATER_ENABLED) { - auto platform = getIdealPlatform(BuildConfig.BUILD_PLATFORM); - auto channelUrl = BuildConfig.UPDATER_BASE + platform + "/channels.json"; - qDebug() << "Initializing updater with platform: " << platform << " -- " << channelUrl; - m_updateChecker.reset(new UpdateChecker(m_network, channelUrl, BuildConfig.VERSION_CHANNEL)); + qDebug() << "Initializing updater"; +#ifdef Q_OS_MAC + m_updater.reset(new MacSparkleUpdater()); +#endif qDebug() << "<> Updater started."; } @@ -1690,3 +1651,14 @@ bool Application::handleDataMigration(const QString& currentData, } return true; } + +void Application::triggerUpdateCheck() +{ + if (m_updater) { + qDebug() << "Checking for updates."; + m_updater->setBetaAllowed(false); // There are no other channels than stable + m_updater->checkForUpdates(); + } else { + qDebug() << "Updater not available."; + } +} diff --git a/launcher/Application.h b/launcher/Application.h index 7884227a1..23c70e4ce 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -43,7 +43,6 @@ #include #include #include -#include #include @@ -63,7 +62,7 @@ class AccountList; class IconList; class QNetworkAccessManager; class JavaInstallList; -class UpdateChecker; +class ExternalUpdater; class BaseProfilerFactory; class BaseDetachedToolFactory; class TranslationsModel; @@ -124,10 +123,12 @@ public: void setApplicationTheme(const QString& name, bool initial); - shared_qobject_ptr updateChecker() { - return m_updateChecker; + shared_qobject_ptr updater() { + return m_updater; } + void triggerUpdateCheck(); + std::shared_ptr translations(); std::shared_ptr javalist(); @@ -248,7 +249,7 @@ private: shared_qobject_ptr m_network; - shared_qobject_ptr m_updateChecker; + shared_qobject_ptr m_updater; shared_qobject_ptr m_accounts; shared_qobject_ptr m_metacache; @@ -307,4 +308,3 @@ public: QString m_instanceIdToShowWindowOf; std::unique_ptr logFile; }; - diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index e8afa6b8f..528c79906 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -150,12 +150,6 @@ set(LAUNCH_SOURCES # Old update system set(UPDATE_SOURCES - updater/GoUpdate.h - updater/GoUpdate.cpp - updater/UpdateChecker.h - updater/UpdateChecker.cpp - updater/DownloadTask.h - updater/DownloadTask.cpp updater/ExternalUpdater.h ) @@ -578,8 +572,6 @@ SET(LAUNCHER_SOURCES Application.cpp DataMigrationTask.h DataMigrationTask.cpp - UpdateController.cpp - UpdateController.h ApplicationMessage.h ApplicationMessage.cpp @@ -814,8 +806,6 @@ SET(LAUNCHER_SOURCES ui/dialogs/ProgressDialog.h ui/dialogs/ReviewMessageBox.cpp ui/dialogs/ReviewMessageBox.h - ui/dialogs/UpdateDialog.cpp - ui/dialogs/UpdateDialog.h ui/dialogs/VersionSelectDialog.cpp ui/dialogs/VersionSelectDialog.h ui/dialogs/SkinUploadDialog.cpp @@ -937,7 +927,6 @@ qt_wrap_ui(LAUNCHER_UI ui/dialogs/ProfileSetupDialog.ui ui/dialogs/ProgressDialog.ui ui/dialogs/NewInstanceDialog.ui - ui/dialogs/UpdateDialog.ui ui/dialogs/NewComponentDialog.ui ui/dialogs/NewsDialog.ui ui/dialogs/ProfileSelectDialog.ui diff --git a/launcher/UpdateController.cpp b/launcher/UpdateController.cpp deleted file mode 100644 index 9ff448549..000000000 --- a/launcher/UpdateController.cpp +++ /dev/null @@ -1,443 +0,0 @@ -#include -#include -#include -#include -#include "UpdateController.h" -#include -#include -#include -#include - -#include "BuildConfig.h" - - -// from -#ifndef S_IRUSR -#define __S_IREAD 0400 /* Read by owner. */ -#define __S_IWRITE 0200 /* Write by owner. */ -#define __S_IEXEC 0100 /* Execute by owner. */ -#define S_IRUSR __S_IREAD /* Read by owner. */ -#define S_IWUSR __S_IWRITE /* Write by owner. */ -#define S_IXUSR __S_IEXEC /* Execute by owner. */ - -#define S_IRGRP (S_IRUSR >> 3) /* Read by group. */ -#define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ -#define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */ - -#define S_IROTH (S_IRGRP >> 3) /* Read by others. */ -#define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ -#define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */ -#endif -static QFile::Permissions unixModeToPermissions(const int mode) -{ - QFile::Permissions perms; - - if (mode & S_IRUSR) - { - perms |= QFile::ReadUser; - } - if (mode & S_IWUSR) - { - perms |= QFile::WriteUser; - } - if (mode & S_IXUSR) - { - perms |= QFile::ExeUser; - } - - if (mode & S_IRGRP) - { - perms |= QFile::ReadGroup; - } - if (mode & S_IWGRP) - { - perms |= QFile::WriteGroup; - } - if (mode & S_IXGRP) - { - perms |= QFile::ExeGroup; - } - - if (mode & S_IROTH) - { - perms |= QFile::ReadOther; - } - if (mode & S_IWOTH) - { - perms |= QFile::WriteOther; - } - if (mode & S_IXOTH) - { - perms |= QFile::ExeOther; - } - return perms; -} - -static const QLatin1String liveCheckFile("live.check"); - -UpdateController::UpdateController(QWidget * parent, const QString& root, const QString updateFilesDir, GoUpdate::OperationList operations) -{ - m_parent = parent; - m_root = root; - m_updateFilesDir = updateFilesDir; - m_operations = operations; -} - - -void UpdateController::installUpdates() -{ - qint64 pid = -1; - QStringList args; - bool started = false; - - qDebug() << "Installing updates."; -#ifdef Q_OS_WIN - QString finishCmd = QApplication::applicationFilePath(); -#elif defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined (Q_OS_OPENBSD) - QString finishCmd = FS::PathCombine(m_root, BuildConfig.LAUNCHER_NAME); -#elif defined Q_OS_MAC - QString finishCmd = QApplication::applicationFilePath(); -#else -#error Unsupported operating system. -#endif - - QString backupPath = FS::PathCombine(m_root, "update", "backup"); - QDir origin(m_root); - - // clean up the backup folder. it should be empty before we start - if(!FS::deletePath(backupPath)) - { - qWarning() << "couldn't remove previous backup folder" << backupPath; - } - // and it should exist. - if(!FS::ensureFolderPathExists(backupPath)) - { - qWarning() << "couldn't create folder" << backupPath; - return; - } - - bool useXPHack = false; - QString exePath; - QString exeOrigin; - QString exeBackup; - - // perform the update operations - for(auto op: m_operations) - { - switch(op.type) - { - // replace = move original out to backup, if it exists, move the new file in its place - case GoUpdate::Operation::OP_REPLACE: - { -#ifdef Q_OS_WIN32 - QString windowsExeName = BuildConfig.LAUNCHER_NAME + ".exe"; - // hack for people renaming the .exe because ... reasons :) - if(op.destination == windowsExeName) - { - op.destination = QFileInfo(QApplication::applicationFilePath()).fileName(); - } -#endif - QFileInfo destination (FS::PathCombine(m_root, op.destination)); - if(destination.exists()) - { - QString backupName = op.destination; - backupName.replace('/', '_'); - QString backupFilePath = FS::PathCombine(backupPath, backupName); - if(!QFile::rename(destination.absoluteFilePath(), backupFilePath)) - { - qWarning() << "Couldn't move:" << destination.absoluteFilePath() << "to" << backupFilePath; - m_failedOperationType = Replace; - m_failedFile = op.destination; - fail(); - return; - } - BackupEntry be; - be.original = destination.absoluteFilePath(); - be.backup = backupFilePath; - be.update = op.source; - m_replace_backups.append(be); - } - // make sure the folder we are putting this into exists - if(!FS::ensureFilePathExists(destination.absoluteFilePath())) - { - qWarning() << "REPLACE: Couldn't create folder:" << destination.absoluteFilePath(); - m_failedOperationType = Replace; - m_failedFile = op.destination; - fail(); - return; - } - // now move the new file in - if(!QFile::rename(op.source, destination.absoluteFilePath())) - { - qWarning() << "REPLACE: Couldn't move:" << op.source << "to" << destination.absoluteFilePath(); - m_failedOperationType = Replace; - m_failedFile = op.destination; - fail(); - return; - } - QFile::setPermissions(destination.absoluteFilePath(), unixModeToPermissions(op.destinationMode)); - } - break; - // delete = move original to backup - case GoUpdate::Operation::OP_DELETE: - { - QString destFilePath = FS::PathCombine(m_root, op.destination); - if(QFile::exists(destFilePath)) - { - QString backupName = op.destination; - backupName.replace('/', '_'); - QString trashFilePath = FS::PathCombine(backupPath, backupName); - - if(!QFile::rename(destFilePath, trashFilePath)) - { - qWarning() << "DELETE: Couldn't move:" << op.destination << "to" << trashFilePath; - m_failedFile = op.destination; - m_failedOperationType = Delete; - fail(); - return; - } - BackupEntry be; - be.original = destFilePath; - be.backup = trashFilePath; - m_delete_backups.append(be); - } - } - break; - } - } - - // try to start the new binary - args = qApp->arguments(); - args.removeFirst(); - - // on old Windows, do insane things... no error checking here, this is just to have something. - if(useXPHack) - { - QString script; - auto nativePath = QDir::toNativeSeparators(exePath); - auto nativeOriginPath = QDir::toNativeSeparators(exeOrigin); - auto nativeBackupPath = QDir::toNativeSeparators(exeBackup); - - // so we write this vbscript thing... - QTextStream out(&script); - out << "WScript.Sleep 1000\n"; - out << "Set fso=CreateObject(\"Scripting.FileSystemObject\")\n"; - out << "Set shell=CreateObject(\"WScript.Shell\")\n"; - out << "fso.MoveFile \"" << nativePath << "\", \"" << nativeBackupPath << "\"\n"; - out << "fso.MoveFile \"" << nativeOriginPath << "\", \"" << nativePath << "\"\n"; - out << "shell.Run \"" << nativePath << "\"\n"; - - QString scriptPath = FS::PathCombine(m_root, "update", "update.vbs"); - - // we save it - QFile scriptFile(scriptPath); - scriptFile.open(QIODevice::WriteOnly); - scriptFile.write(script.toLocal8Bit().replace("\n", "\r\n")); - scriptFile.close(); - - // we run it - started = QProcess::startDetached("wscript", {scriptPath}, m_root); - - // and we quit. conscious thought. - qApp->quit(); - return; - } - bool doLiveCheck = true; - bool startFailed = false; - - // remove live check file, if any - if(QFile::exists(liveCheckFile)) - { - if(!QFile::remove(liveCheckFile)) - { - qWarning() << "Couldn't remove the" << liveCheckFile << "file! We will proceed without :("; - doLiveCheck = false; - } - } - - if(doLiveCheck) - { - if(!args.contains("--alive")) - { - args.append("--alive"); - } - } - - // FIXME: reparse args and construct a safe variant from scratch. This is a workaround for GH-1874: - QStringList realargs; - int skip = 0; - for(auto & arg: args) - { - if(skip) - { - skip--; - continue; - } - if(arg == "-l") - { - skip = 1; - continue; - } - realargs.append(arg); - } - - // start the updated application - started = QProcess::startDetached(finishCmd, realargs, QDir::currentPath(), &pid); - // much dumber check - just find out if the call - if(!started || pid == -1) - { - qWarning() << "Couldn't start new process properly!"; - startFailed = true; - } - if(!startFailed && doLiveCheck) - { - int attempts = 0; - while(attempts < 10) - { - attempts++; - QString key; - std::this_thread::sleep_for(std::chrono::milliseconds(250)); - if(!QFile::exists(liveCheckFile)) - { - qWarning() << "Couldn't find the" << liveCheckFile << "file!"; - startFailed = true; - continue; - } - try - { - key = QString::fromUtf8(FS::read(liveCheckFile)); - auto id = ApplicationId::fromRawString(key); - LocalPeer peer(nullptr, id); - if(peer.isClient()) - { - startFailed = false; - qDebug() << "Found process started with key " << key; - break; - } - else - { - startFailed = true; - qDebug() << "Process started with key " << key << "apparently died or is not reponding..."; - break; - } - } - catch (const Exception &e) - { - qWarning() << "Couldn't read the" << liveCheckFile << "file!"; - startFailed = true; - continue; - } - } - } - if(startFailed) - { - m_failedOperationType = Start; - fail(); - return; - } - else - { - origin.rmdir(m_updateFilesDir); - qApp->quit(); - return; - } -} - -void UpdateController::fail() -{ - qWarning() << "Update failed!"; - - QString msg; - bool doRollback = false; - QString failTitle = QObject::tr("Update failed!"); - QString rollFailTitle = QObject::tr("Rollback failed!"); - switch (m_failedOperationType) - { - case Replace: - { - msg = QObject::tr( - "Couldn't replace file %1. Changes will be reverted.\n" - "See the %2 log file for details." - ).arg(m_failedFile, BuildConfig.LAUNCHER_DISPLAYNAME); - doRollback = true; - QMessageBox::critical(m_parent, failTitle, msg); - break; - } - case Delete: - { - msg = QObject::tr( - "Couldn't remove file %1. Changes will be reverted.\n" - "See the %2 log file for details." - ).arg(m_failedFile, BuildConfig.LAUNCHER_DISPLAYNAME); - doRollback = true; - QMessageBox::critical(m_parent, failTitle, msg); - break; - } - case Start: - { - msg = QObject::tr("The new version didn't start or is too old and doesn't respond to startup checks.\n" - "\n" - "Roll back to previous version?"); - auto result = QMessageBox::critical( - m_parent, - failTitle, - msg, - QMessageBox::Yes | QMessageBox::No, - QMessageBox::Yes - ); - doRollback = (result == QMessageBox::Yes); - break; - } - case Nothing: - default: - return; - } - if(doRollback) - { - auto rollbackOK = rollback(); - if(!rollbackOK) - { - msg = QObject::tr("The rollback failed too.\n" - "You will have to repair %1 manually.\n" - "Please let us know why and how this happened.").arg(BuildConfig.LAUNCHER_DISPLAYNAME); - QMessageBox::critical(m_parent, rollFailTitle, msg); - qApp->quit(); - } - } - else - { - qApp->quit(); - } -} - -bool UpdateController::rollback() -{ - bool revertOK = true; - // if the above failed, roll back changes - for(auto backup:m_replace_backups) - { - qWarning() << "restoring" << backup.original << "from" << backup.backup; - if(!QFile::rename(backup.original, backup.update)) - { - revertOK = false; - qWarning() << "moving new" << backup.original << "back to" << backup.update << "failed!"; - continue; - } - - if(!QFile::rename(backup.backup, backup.original)) - { - revertOK = false; - qWarning() << "restoring" << backup.original << "failed!"; - } - } - for(auto backup:m_delete_backups) - { - qWarning() << "restoring" << backup.original << "from" << backup.backup; - if(!QFile::rename(backup.backup, backup.original)) - { - revertOK = false; - qWarning() << "restoring" << backup.original << "failed!"; - } - } - return revertOK; -} diff --git a/launcher/UpdateController.h b/launcher/UpdateController.h deleted file mode 100644 index 715554e53..000000000 --- a/launcher/UpdateController.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include -#include -#include - -class QWidget; - -class UpdateController -{ -public: - UpdateController(QWidget * parent, const QString &root, const QString updateFilesDir, GoUpdate::OperationList operations); - void installUpdates(); - -private: - void fail(); - bool rollback(); - -private: - QString m_root; - QString m_updateFilesDir; - GoUpdate::OperationList m_operations; - QWidget * m_parent; - - struct BackupEntry - { - // path where we got the new file from - QString update; - // path of what is being actually updated - QString original; - // path where the backup of the updated file was placed - QString backup; - }; - QList m_replace_backups; - QList m_delete_backups; - enum Failure - { - Replace, - Delete, - Start, - Nothing - } m_failedOperationType = Nothing; - QString m_failedFile; -}; diff --git a/launcher/minecraft/launch/LauncherPartLaunch.cpp b/launcher/minecraft/launch/LauncherPartLaunch.cpp index 1d8d70833..8ecf715db 100644 --- a/launcher/minecraft/launch/LauncherPartLaunch.cpp +++ b/launcher/minecraft/launch/LauncherPartLaunch.cpp @@ -36,6 +36,7 @@ #include "LauncherPartLaunch.h" #include +#include #include "launch/LaunchTask.h" #include "minecraft/MinecraftInstance.h" diff --git a/launcher/net/MetaCacheSink.cpp b/launcher/net/MetaCacheSink.cpp index 5ae53c1c5..c730fdbf2 100644 --- a/launcher/net/MetaCacheSink.cpp +++ b/launcher/net/MetaCacheSink.cpp @@ -36,6 +36,7 @@ #include "MetaCacheSink.h" #include #include +#include #include "Application.h" namespace Net { diff --git a/launcher/net/PasteUpload.cpp b/launcher/net/PasteUpload.cpp index 76b867437..d9e785c52 100644 --- a/launcher/net/PasteUpload.cpp +++ b/launcher/net/PasteUpload.cpp @@ -41,9 +41,11 @@ #include #include +#include #include #include #include +#include std::array PasteUpload::PasteTypes = { {{"0x0.st", "https://0x0.st", ""}, diff --git a/launcher/ui/GuiUtil.cpp b/launcher/ui/GuiUtil.cpp index 5a62e4d06..b1ea5ee96 100644 --- a/launcher/ui/GuiUtil.cpp +++ b/launcher/ui/GuiUtil.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/CustomMessageBox.h" diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 929f2a85c..0595634fb 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -83,8 +83,7 @@ #include #include #include -#include -#include +#include #include #include "InstanceWindow.h" #include "InstancePageProvider.h" @@ -99,16 +98,13 @@ #include "ui/dialogs/NewsDialog.h" #include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/AboutDialog.h" -#include "ui/dialogs/VersionSelectDialog.h" #include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/IconPickerDialog.h" #include "ui/dialogs/CopyInstanceDialog.h" -#include "ui/dialogs/UpdateDialog.h" #include "ui/dialogs/EditAccountDialog.h" #include "ui/dialogs/ExportInstanceDialog.h" #include "ui/themes/ITheme.h" -#include "UpdateController.h" #include "KonamiCode.h" #include "InstanceImportTask.h" @@ -1039,9 +1035,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow updateNewsLabel(); } - - if(BuildConfig.UPDATER_ENABLED) - { + if (BuildConfig.UPDATER_ENABLED) { bool updatesAllowed = APPLICATION->updatesAreAllowed(); updatesAllowedChanged(updatesAllowed); @@ -1049,21 +1043,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow connect(ui->actionCheckUpdate.operator->(), &QAction::triggered, this, &MainWindow::checkForUpdates); // set up the updater object. - auto updater = APPLICATION->updateChecker(); - connect(updater.get(), &UpdateChecker::updateAvailable, this, &MainWindow::updateAvailable); - connect(updater.get(), &UpdateChecker::noUpdateFound, this, &MainWindow::updateNotAvailable); - // if automatic update checks are allowed, start one. - if (APPLICATION->settings()->get("AutoUpdate").toBool() && updatesAllowed) - { - updater->checkForUpdate(APPLICATION->settings()->get("UpdateChannel").toString(), false); - } + auto updater = APPLICATION->updater(); - if (APPLICATION->updateChecker()->getExternalUpdater()) - { - connect(APPLICATION->updateChecker()->getExternalUpdater(), - &ExternalUpdater::canCheckForUpdatesChanged, - this, - &MainWindow::updatesAllowedChanged); + if (updater) { + connect(updater.get(), &ExternalUpdater::canCheckForUpdatesChanged, this, &MainWindow::updatesAllowedChanged); } } @@ -1541,32 +1524,6 @@ void MainWindow::updateNewsLabel() } } -void MainWindow::updateAvailable(GoUpdate::Status status) -{ - if(!APPLICATION->updatesAreAllowed()) - { - updateNotAvailable(); - return; - } - UpdateDialog dlg(true, this); - UpdateAction action = (UpdateAction)dlg.exec(); - switch (action) - { - case UPDATE_LATER: - qDebug() << "Update will be installed later."; - break; - case UPDATE_NOW: - downloadUpdates(status); - break; - } -} - -void MainWindow::updateNotAvailable() -{ - UpdateDialog dlg(false, this); - dlg.exec(); -} - QList stringToIntList(const QString &string) { #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) @@ -1591,40 +1548,6 @@ QString intListToString(const QList &list) return slist.join(','); } -void MainWindow::downloadUpdates(GoUpdate::Status status) -{ - if(!APPLICATION->updatesAreAllowed()) - { - return; - } - qDebug() << "Downloading updates."; - ProgressDialog updateDlg(this); - status.rootPath = APPLICATION->root(); - - auto dlPath = FS::PathCombine(APPLICATION->root(), "update", "XXXXXX"); - if (!FS::ensureFilePathExists(dlPath)) - { - CustomMessageBox::selectable(this, tr("Error"), tr("Couldn't create folder for update downloads:\n%1").arg(dlPath), QMessageBox::Warning)->show(); - } - GoUpdate::DownloadTask updateTask(APPLICATION->network(), status, dlPath, &updateDlg); - // If the task succeeds, install the updates. - if (updateDlg.execWithTask(&updateTask)) - { - /** - * NOTE: This disables launching instances until the update either succeeds (and this process exits) - * or the update fails (and the control leaves this scope). - */ - APPLICATION->updateIsRunning(true); - UpdateController update(this, APPLICATION->root(), updateTask.updateFilesDir(), updateTask.operations()); - update.installUpdates(); - APPLICATION->updateIsRunning(false); - } - else - { - CustomMessageBox::selectable(this, tr("Error"), updateTask.failReason(), QMessageBox::Warning)->show(); - } -} - void MainWindow::onCatToggled(bool state) { setCatBackground(state); @@ -1941,8 +1864,7 @@ void MainWindow::checkForUpdates() { if(BuildConfig.UPDATER_ENABLED) { - auto updater = APPLICATION->updateChecker(); - updater->checkForUpdate(APPLICATION->settings()->get("UpdateChannel").toString(), true); + APPLICATION->triggerUpdateCheck(); } else { diff --git a/launcher/ui/MainWindow.h b/launcher/ui/MainWindow.h index 0aa01ee2f..53db49192 100644 --- a/launcher/ui/MainWindow.h +++ b/launcher/ui/MainWindow.h @@ -48,7 +48,6 @@ #include "BaseInstance.h" #include "minecraft/auth/MinecraftAccount.h" #include "net/NetJob.h" -#include "updater/GoUpdate.h" class LaunchController; class NewsChecker; @@ -188,10 +187,6 @@ private slots: void startTask(Task *task); - void updateAvailable(GoUpdate::Status status); - - void updateNotAvailable(); - void defaultAccountChanged(); void changeActiveAccount(); @@ -200,10 +195,6 @@ private slots: void updateNewsLabel(); - /*! - * Runs the DownloadTask and installs updates. - */ - void downloadUpdates(GoUpdate::Status status); void konamiTriggered(); @@ -252,4 +243,3 @@ private: // managed by the application object Task *m_versionLoadTask = nullptr; }; - diff --git a/launcher/ui/dialogs/BlockedModsDialog.cpp b/launcher/ui/dialogs/BlockedModsDialog.cpp index edb4ff7d4..eeeeb709f 100644 --- a/launcher/ui/dialogs/BlockedModsDialog.cpp +++ b/launcher/ui/dialogs/BlockedModsDialog.cpp @@ -1,14 +1,18 @@ #include "BlockedModsDialog.h" -#include -#include -#include -#include "Application.h" #include "ui_BlockedModsDialog.h" +#include "Application.h" + #include +#include +#include +#include +#include #include #include #include +#include +#include #include BlockedModsDialog::BlockedModsDialog(QWidget* parent, const QString& title, const QString& text, QList& mods) diff --git a/launcher/ui/dialogs/ExportInstanceDialog.cpp b/launcher/ui/dialogs/ExportInstanceDialog.cpp index 88552b239..f13e36e86 100644 --- a/launcher/ui/dialogs/ExportInstanceDialog.cpp +++ b/launcher/ui/dialogs/ExportInstanceDialog.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include "StringUtils.h" #include "SeparatorPrefixTree.h" #include "Application.h" diff --git a/launcher/ui/dialogs/UpdateDialog.cpp b/launcher/ui/dialogs/UpdateDialog.cpp deleted file mode 100644 index 9e82531ac..000000000 --- a/launcher/ui/dialogs/UpdateDialog.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-only -/* - * PolyMC - Minecraft Launcher - * Copyright (C) 2022 Sefa Eyeoglu - * - * 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 . - * - * This file incorporates work covered by the following copyright and - * permission notice: - * - * Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "UpdateDialog.h" -#include "ui_UpdateDialog.h" -#include -#include "Application.h" -#include -#include - -#include "BuildConfig.h" -#include "HoeDown.h" - -UpdateDialog::UpdateDialog(bool hasUpdate, QWidget *parent) : QDialog(parent), ui(new Ui::UpdateDialog) -{ - ui->setupUi(this); - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - if(hasUpdate) - { - ui->label->setText(tr("A new %1 update is available!").arg(channel)); - } - else - { - ui->label->setText(tr("No %1 updates found. You are running the latest version.").arg(channel)); - ui->btnUpdateNow->setHidden(true); - ui->btnUpdateLater->setText(tr("Close")); - } - ui->changelogBrowser->setHtml(tr("

Loading changelog...

")); - loadChangelog(); - restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get("UpdateDialogGeometry").toByteArray())); -} - -UpdateDialog::~UpdateDialog() -{ -} - -void UpdateDialog::loadChangelog() -{ - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - dljob = new NetJob("Changelog", APPLICATION->network()); - QString url; - if(channel == "stable") - { - url = QString("https://raw.githubusercontent.com/PrismLauncher/PrismLauncher/%1/changelog.md").arg(channel); - m_changelogType = CHANGELOG_MARKDOWN; - } - else - { - url = QString("https://api.github.com/repos/PrismLauncher/PrismLauncher/compare/%1...%2").arg(BuildConfig.GIT_COMMIT, channel); - m_changelogType = CHANGELOG_COMMITS; - } - dljob->addNetAction(Net::Download::makeByteArray(QUrl(url), &changelogData)); - connect(dljob.get(), &NetJob::succeeded, this, &UpdateDialog::changelogLoaded); - connect(dljob.get(), &NetJob::failed, this, &UpdateDialog::changelogFailed); - dljob->start(); -} - -QString reprocessMarkdown(QByteArray markdown) -{ - HoeDown hoedown; - QString output = hoedown.process(markdown); - - // HACK: easier than customizing hoedown - output.replace(QRegularExpression("GH-([0-9]+)"), "GH-\\1"); - qDebug() << output; - return output; -} - -QString reprocessCommits(QByteArray json) -{ - auto channel = APPLICATION->settings()->get("UpdateChannel").toString(); - try - { - QString result; - auto document = Json::requireDocument(json); - auto rootobject = Json::requireObject(document); - auto status = Json::requireString(rootobject, "status"); - auto diff_url = Json::requireString(rootobject, "html_url"); - - auto print_commits = [&]() - { - result += ""; - auto commitarray = Json::requireArray(rootobject, "commits"); - for(int i = commitarray.size() - 1; i >= 0; i--) - { - const auto & commitval = commitarray[i]; - auto commitobj = Json::requireObject(commitval); - auto parents_info = Json::ensureArray(commitobj, "parents"); - // NOTE: this ignores merge commits, because they have more than one parent - if(parents_info.size() > 1) - { - continue; - } - auto commit_url = Json::requireString(commitobj, "html_url"); - auto commit_info = Json::requireObject(commitobj, "commit"); - auto commit_message = Json::requireString(commit_info, "message"); - auto lines = commit_message.split('\n'); - QRegularExpression regexp("(?(GH-(?[0-9]+))|(NOISSUE)|(SCRATCH))? *(?.*) *"); - auto match = regexp.match(lines.takeFirst(), 0, QRegularExpression::NormalMatch); - auto issuenr = match.captured("issuenr"); - auto prefix = match.captured("prefix"); - auto rest = match.captured("rest"); - result += ""; - lines.prepend(rest); - result += ""; - } - result += "
"; - if(issuenr.length()) - { - result += QString("GH-%2").arg(issuenr, issuenr); - } - else if(prefix.length()) - { - result += QString("%2").arg(commit_url, prefix); - } - else - { - result += QString("NOISSUE").arg(commit_url); - } - result += "

" + lines.join("
") + "

"; - }; - - if(status == "identical") - { - return QObject::tr("

There are no code changes between your current version and latest %1.

").arg(channel); - } - else if(status == "ahead") - { - result += QObject::tr("

Following commits were added since last update:

"); - print_commits(); - } - else if(status == "diverged") - { - auto commit_ahead = Json::requireInteger(rootobject, "ahead_by"); - auto commit_behind = Json::requireInteger(rootobject, "behind_by"); - result += QObject::tr("

The update removes %1 commits and adds the following %2:

").arg(commit_behind).arg(commit_ahead); - print_commits(); - } - result += QObject::tr("

You can look at the changes on github.

").arg(diff_url); - return result; - } - catch (const JSONValidationError &e) - { - qWarning() << "Got an unparseable commit log from github:" << e.what(); - qDebug() << json; - } - return QString(); -} - -void UpdateDialog::changelogLoaded() -{ - QString result; - switch(m_changelogType) - { - case CHANGELOG_COMMITS: - result = reprocessCommits(changelogData); - break; - case CHANGELOG_MARKDOWN: - result = reprocessMarkdown(changelogData); - break; - } - changelogData.clear(); - ui->changelogBrowser->setHtml(result); -} - -void UpdateDialog::changelogFailed(QString reason) -{ - ui->changelogBrowser->setHtml(tr("

Failed to fetch changelog... Error: %1

").arg(reason)); -} - -void UpdateDialog::on_btnUpdateLater_clicked() -{ - reject(); -} - -void UpdateDialog::on_btnUpdateNow_clicked() -{ - done(UPDATE_NOW); -} - -void UpdateDialog::closeEvent(QCloseEvent* evt) -{ - APPLICATION->settings()->set("UpdateDialogGeometry", saveGeometry().toBase64()); - QDialog::closeEvent(evt); -} diff --git a/launcher/ui/dialogs/UpdateDialog.h b/launcher/ui/dialogs/UpdateDialog.h deleted file mode 100644 index 07cbe09f1..000000000 --- a/launcher/ui/dialogs/UpdateDialog.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include "net/NetJob.h" - -namespace Ui -{ -class UpdateDialog; -} - -enum UpdateAction -{ - UPDATE_LATER = QDialog::Rejected, - UPDATE_NOW = QDialog::Accepted, -}; - -enum ChangelogType -{ - CHANGELOG_MARKDOWN, - CHANGELOG_COMMITS -}; - -class UpdateDialog : public QDialog -{ - Q_OBJECT - -public: - explicit UpdateDialog(bool hasUpdate = true, QWidget *parent = 0); - ~UpdateDialog(); - -public slots: - void on_btnUpdateNow_clicked(); - void on_btnUpdateLater_clicked(); - - /// Starts loading the changelog - void loadChangelog(); - - /// Slot for when the chengelog loads successfully. - void changelogLoaded(); - - /// Slot for when the chengelog fails to load... - void changelogFailed(QString reason); - -protected: - void closeEvent(QCloseEvent * ) override; - -private: - Ui::UpdateDialog *ui; - QByteArray changelogData; - NetJob::Ptr dljob; - ChangelogType m_changelogType = CHANGELOG_MARKDOWN; -}; diff --git a/launcher/ui/dialogs/UpdateDialog.ui b/launcher/ui/dialogs/UpdateDialog.ui deleted file mode 100644 index 5eb9d88ac..000000000 --- a/launcher/ui/dialogs/UpdateDialog.ui +++ /dev/null @@ -1,91 +0,0 @@ - - - UpdateDialog - - - - 0 - 0 - 657 - 673 - - - - Launcher Update - - - - :/icons/toolbar/checkupdate:/icons/toolbar/checkupdate - - - - - - - - - 14 - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - changelogBrowser - - - - - - - - - true - - - - - - - - - - 0 - 0 - - - - Update now - - - - - - - - 0 - 0 - - - - Don't update yet - - - - - - - - - changelogBrowser - btnUpdateNow - btnUpdateLater - - - - - - diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index cae0635f0..a4c2755c7 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -44,14 +44,13 @@ #include #include -#include "updater/UpdateChecker.h" - #include "settings/SettingsObject.h" #include #include "Application.h" #include "BuildConfig.h" #include "DesktopServices.h" #include "ui/themes/ITheme.h" +#include "updater/ExternalUpdater.h" #include #include @@ -80,30 +79,8 @@ LauncherPage::LauncherPage(QWidget *parent) : QWidget(parent), ui(new Ui::Launch m_languageModel = APPLICATION->translations(); loadSettings(); - if(BuildConfig.UPDATER_ENABLED) - { - QObject::connect(APPLICATION->updateChecker().get(), &UpdateChecker::channelListLoaded, this, &LauncherPage::refreshUpdateChannelList); + ui->updateSettingsBox->setHidden(!APPLICATION->updater()); - if (APPLICATION->updateChecker()->hasChannels()) - { - refreshUpdateChannelList(); - } - else - { - APPLICATION->updateChecker()->updateChanList(false); - } - - if (APPLICATION->updateChecker()->getExternalUpdater()) - { - ui->updateChannelComboBox->setVisible(false); - ui->updateChannelDescLabel->setVisible(false); - ui->updateChannelLabel->setVisible(false); - } - } - else - { - ui->updateSettingsBox->setHidden(true); - } connect(ui->fontSizeBox, SIGNAL(valueChanged(int)), SLOT(refreshFontPreview())); connect(ui->consoleFont, SIGNAL(currentFontChanged(QFont)), SLOT(refreshFontPreview())); } @@ -198,94 +175,16 @@ void LauncherPage::on_metadataDisableBtn_clicked() ui->metadataWarningLabel->setHidden(!ui->metadataDisableBtn->isChecked()); } -void LauncherPage::refreshUpdateChannelList() -{ - // Stop listening for selection changes. It's going to change a lot while we update it and - // we don't need to update the - // description label constantly. - QObject::disconnect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this, - SLOT(updateChannelSelectionChanged(int))); - - QList channelList = APPLICATION->updateChecker()->getChannelList(); - ui->updateChannelComboBox->clear(); - int selection = -1; - for (int i = 0; i < channelList.count(); i++) - { - UpdateChecker::ChannelListEntry entry = channelList.at(i); - - // When it comes to selection, we'll rely on the indexes of a channel entry being the - // same in the - // combo box as it is in the update checker's channel list. - // This probably isn't very safe, but the channel list doesn't change often enough (or - // at all) for - // this to be a big deal. Hope it doesn't break... - ui->updateChannelComboBox->addItem(entry.name); - - // If the update channel we just added was the selected one, set the current index in - // the combo box to it. - if (entry.id == m_currentUpdateChannel) - { - qDebug() << "Selected index" << i << "channel id" << m_currentUpdateChannel; - selection = i; - } - } - - ui->updateChannelComboBox->setCurrentIndex(selection); - - // Start listening for selection changes again and update the description label. - QObject::connect(ui->updateChannelComboBox, SIGNAL(currentIndexChanged(int)), this, - SLOT(updateChannelSelectionChanged(int))); - refreshUpdateChannelDesc(); - - // Now that we've updated the channel list, we can enable the combo box. - // It starts off disabled so that if the channel list hasn't been loaded, it will be - // disabled. - ui->updateChannelComboBox->setEnabled(true); -} - -void LauncherPage::updateChannelSelectionChanged(int index) -{ - refreshUpdateChannelDesc(); -} - -void LauncherPage::refreshUpdateChannelDesc() -{ - // Get the channel list. - QList channelList = APPLICATION->updateChecker()->getChannelList(); - int selectedIndex = ui->updateChannelComboBox->currentIndex(); - if (selectedIndex < 0) - { - return; - } - if (selectedIndex < channelList.count()) - { - // Find the channel list entry with the given index. - UpdateChecker::ChannelListEntry selected = channelList.at(selectedIndex); - - // Set the description text. - ui->updateChannelDescLabel->setText(selected.description); - - // Set the currently selected channel ID. - m_currentUpdateChannel = selected.id; - } -} - void LauncherPage::applySettings() { auto s = APPLICATION->settings(); // Updates - if (BuildConfig.UPDATER_ENABLED && APPLICATION->updateChecker()->getExternalUpdater()) + if (APPLICATION->updater()) { - APPLICATION->updateChecker()->getExternalUpdater()->setAutomaticallyChecksForUpdates( - ui->autoUpdateCheckBox->isChecked()); - } - else - { - s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked()); + APPLICATION->updater()->setAutomaticallyChecksForUpdates(ui->autoUpdateCheckBox->isChecked()); } - s->set("UpdateChannel", m_currentUpdateChannel); auto original = s->get("IconTheme").toString(); //FIXME: make generic switch (ui->themeComboBox->currentIndex()) @@ -390,17 +289,11 @@ void LauncherPage::loadSettings() { auto s = APPLICATION->settings(); // Updates - if (BuildConfig.UPDATER_ENABLED && APPLICATION->updateChecker()->getExternalUpdater()) + if (APPLICATION->updater()) { - ui->autoUpdateCheckBox->setChecked( - APPLICATION->updateChecker()->getExternalUpdater()->getAutomaticallyChecksForUpdates()); - } - else - { - ui->autoUpdateCheckBox->setChecked(s->get("AutoUpdate").toBool()); + ui->autoUpdateCheckBox->setChecked(APPLICATION->updater()->getAutomaticallyChecksForUpdates()); } - m_currentUpdateChannel = s->get("UpdateChannel").toString(); //FIXME: make generic auto theme = s->get("IconTheme").toString(); QStringList iconThemeOptions{"pe_colored", diff --git a/launcher/ui/pages/global/LauncherPage.h b/launcher/ui/pages/global/LauncherPage.h index f38c922e2..c60156c2c 100644 --- a/launcher/ui/pages/global/LauncherPage.h +++ b/launcher/ui/pages/global/LauncherPage.h @@ -90,23 +90,11 @@ slots: void on_iconsDirBrowseBtn_clicked(); void on_metadataDisableBtn_clicked(); - /*! - * Updates the list of update channels in the combo box. - */ - void refreshUpdateChannelList(); - - /*! - * Updates the channel description label. - */ - void refreshUpdateChannelDesc(); - /*! * Updates the font preview */ void refreshFontPreview(); - void updateChannelSelectionChanged(int index); - private: Ui::LauncherPage *ui; diff --git a/launcher/ui/pages/global/LauncherPage.ui b/launcher/ui/pages/global/LauncherPage.ui index c44718a18..fb36608d0 100644 --- a/launcher/ui/pages/global/LauncherPage.ui +++ b/launcher/ui/pages/global/LauncherPage.ui @@ -58,33 +58,6 @@
- - - - Up&date Channel: - - - updateChannelComboBox - - - - - - - false - - - - - - - No channel selected. - - - true - - -
@@ -573,7 +546,6 @@ tabWidget autoUpdateCheckBox - updateChannelComboBox instDirTextBox instDirBrowseBtn modsDirTextBox diff --git a/launcher/ui/pages/instance/LogPage.cpp b/launcher/ui/pages/instance/LogPage.cpp index 31c3e925d..9985f426e 100644 --- a/launcher/ui/pages/instance/LogPage.cpp +++ b/launcher/ui/pages/instance/LogPage.cpp @@ -39,7 +39,7 @@ #include "Application.h" -#include +#include #include #include diff --git a/launcher/ui/pages/instance/ScreenshotsPage.h b/launcher/ui/pages/instance/ScreenshotsPage.h index c22706af9..cdd53cc95 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.h +++ b/launcher/ui/pages/instance/ScreenshotsPage.h @@ -42,6 +42,7 @@ class QFileSystemModel; class QIdentityProxyModel; +class QItemSelection; namespace Ui { class ScreenshotsPage; diff --git a/launcher/ui/pages/instance/ServersPage.cpp b/launcher/ui/pages/instance/ServersPage.cpp index d64bcb767..a4f9f3309 100644 --- a/launcher/ui/pages/instance/ServersPage.cpp +++ b/launcher/ui/pages/instance/ServersPage.cpp @@ -48,6 +48,7 @@ #include #include +#include static const int COLUMN_COUNT = 2; // 3 , TBD: latency and other nice things. diff --git a/launcher/ui/pages/instance/WorldListPage.cpp b/launcher/ui/pages/instance/WorldListPage.cpp index 85cc01ff0..7819d0779 100644 --- a/launcher/ui/pages/instance/WorldListPage.cpp +++ b/launcher/ui/pages/instance/WorldListPage.cpp @@ -43,9 +43,9 @@ #include #include #include +#include #include #include -#include #include #include "tools/MCEditTool.h" diff --git a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp index 6b1f6b899..2343b79f2 100644 --- a/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp +++ b/launcher/ui/pages/modplatform/legacy_ftb/ListModel.cpp @@ -35,6 +35,8 @@ #include "ListModel.h" #include "Application.h" +#include "net/HttpMetaCache.h" +#include "net/NetJob.h" #include "StringUtils.h" #include diff --git a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h index 3be377a1d..6e6be4b9e 100644 --- a/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h +++ b/launcher/ui/pages/modplatform/modrinth/ModrinthModel.h @@ -38,6 +38,7 @@ #include #include "modplatform/modrinth/ModrinthPackManifest.h" +#include "net/NetJob.h" #include "ui/pages/modplatform/modrinth/ModrinthPage.h" class ModPage; diff --git a/launcher/updater/DownloadTask.cpp b/launcher/updater/DownloadTask.cpp deleted file mode 100644 index 48fe767a6..000000000 --- a/launcher/updater/DownloadTask.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "DownloadTask.h" - -#include "updater/UpdateChecker.h" -#include "GoUpdate.h" -#include "net/NetJob.h" - -#include -#include -#include - -namespace GoUpdate -{ - -DownloadTask::DownloadTask( - shared_qobject_ptr network, - Status status, - QString target, - QObject *parent -) : Task(parent), m_updateFilesDir(target), m_network(network) -{ - m_status = status; - - m_updateFilesDir.setAutoRemove(false); -} - -void DownloadTask::executeTask() -{ - loadVersionInfo(); -} - -void DownloadTask::loadVersionInfo() -{ - setStatus(tr("Loading version information...")); - - NetJob *netJob = new NetJob("Version Info", m_network); - - // Find the index URL. - QUrl newIndexUrl = QUrl(m_status.newRepoUrl).resolved(QString::number(m_status.newVersionId) + ".json"); - qDebug() << m_status.newRepoUrl << " turns into " << newIndexUrl; - - netJob->addNetAction(m_newVersionFileListDownload = Net::Download::makeByteArray(newIndexUrl, &newVersionFileListData)); - - // If we have a current version URL, get that one too. - if (!m_status.currentRepoUrl.isEmpty()) - { - QUrl cIndexUrl = QUrl(m_status.currentRepoUrl).resolved(QString::number(m_status.currentVersionId) + ".json"); - netJob->addNetAction(m_currentVersionFileListDownload = Net::Download::makeByteArray(cIndexUrl, ¤tVersionFileListData)); - qDebug() << m_status.currentRepoUrl << " turns into " << cIndexUrl; - } - - // connect signals and start the job - connect(netJob, &NetJob::succeeded, this, &DownloadTask::processDownloadedVersionInfo); - connect(netJob, &NetJob::failed, this, &DownloadTask::vinfoDownloadFailed); - m_vinfoNetJob.reset(netJob); - netJob->start(); -} - -void DownloadTask::vinfoDownloadFailed() -{ - // Something failed. We really need the second download (current version info), so parse - // downloads anyways as long as the first one succeeded. - if (m_newVersionFileListDownload->wasSuccessful()) - { - processDownloadedVersionInfo(); - return; - } - - // TODO: Give a more detailed error message. - qCritical() << "Failed to download version info files."; - emitFailed(tr("Failed to download version info files.")); -} - -void DownloadTask::processDownloadedVersionInfo() -{ - VersionFileList m_currentVersionFileList; - VersionFileList m_newVersionFileList; - - setStatus(tr("Reading file list for new version...")); - qDebug() << "Reading file list for new version..."; - QString error; - if (!parseVersionInfo(newVersionFileListData, m_newVersionFileList, error)) - { - qCritical() << error; - emitFailed(error); - return; - } - - // if we have the current version info, use it. - if (m_currentVersionFileListDownload && m_currentVersionFileListDownload->wasSuccessful()) - { - setStatus(tr("Reading file list for current version...")); - qDebug() << "Reading file list for current version..."; - // if this fails, it's not a complete loss. - QString error; - if(!parseVersionInfo( currentVersionFileListData, m_currentVersionFileList, error)) - { - qDebug() << error << "This is not a fatal error."; - } - } - - // We don't need this any more. - m_currentVersionFileListDownload.reset(); - m_newVersionFileListDownload.reset(); - m_vinfoNetJob.reset(); - - setStatus(tr("Processing file lists - figuring out how to install the update...")); - - // make a new netjob for the actual update files - NetJob::Ptr netJob = new NetJob("Update Files", m_network); - - // fill netJob and operationList - if (!processFileLists(m_currentVersionFileList, m_newVersionFileList, m_status.rootPath, m_updateFilesDir.path(), netJob, m_operations)) - { - emitFailed(tr("Failed to process update lists...")); - return; - } - - // Now start the download. - QObject::connect(netJob.get(), &NetJob::succeeded, this, &DownloadTask::fileDownloadFinished); - QObject::connect(netJob.get(), &NetJob::progress, this, &DownloadTask::fileDownloadProgressChanged); - QObject::connect(netJob.get(), &NetJob::failed, this, &DownloadTask::fileDownloadFailed); - - if(netJob->size() == 1) // Translation issues... see https://github.com/MultiMC/Launcher/issues/1701 - { - setStatus(tr("Downloading one update file.")); - } - else - { - setStatus(tr("Downloading %1 update files.").arg(QString::number(netJob->size()))); - } - qDebug() << "Begin downloading update files to" << m_updateFilesDir.path(); - m_filesNetJob = netJob; - m_filesNetJob->start(); -} - -void DownloadTask::fileDownloadFinished() -{ - emitSucceeded(); -} - -void DownloadTask::fileDownloadFailed(QString reason) -{ - qCritical() << "Failed to download update files:" << reason; - emitFailed(tr("Failed to download update files: %1").arg(reason)); -} - -void DownloadTask::fileDownloadProgressChanged(qint64 current, qint64 total) -{ - setProgress(current, total); -} - -QString DownloadTask::updateFilesDir() -{ - return m_updateFilesDir.path(); -} - -OperationList DownloadTask::operations() -{ - return m_operations; -} - -} diff --git a/launcher/updater/DownloadTask.h b/launcher/updater/DownloadTask.h deleted file mode 100644 index 19a6265cf..000000000 --- a/launcher/updater/DownloadTask.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "tasks/Task.h" -#include "net/NetJob.h" -#include "GoUpdate.h" - -namespace GoUpdate -{ -/*! - * The DownloadTask is a task that takes a given version ID and repository URL, - * downloads that version's files from the repository, and prepares to install them. - */ -class DownloadTask : public Task -{ - Q_OBJECT - -public: - /** - * Create a download task - * - * target is a template - XXXXXX at the end will be replaced with a random generated string, ensuring uniqueness - */ - explicit DownloadTask(shared_qobject_ptr network, Status status, QString target, QObject* parent = 0); - virtual ~DownloadTask() {}; - - /// Get the directory that will contain the update files. - QString updateFilesDir(); - - /// Get the list of operations that should be done - OperationList operations(); - - /// set updater download behavior - void setUseLocalUpdater(bool useLocal); - -protected: - //! Entry point for tasks. - virtual void executeTask() override; - - /*! - * Downloads the version info files from the repository. - * The files for both the current build, and the build that we're updating to need to be downloaded. - * If the current version's info file can't be found, Prism Launcher will not delete files that - * were removed between versions. It will still replace files that have changed, however. - * Note that although the repository URL for the current version is not given to the update task, - * the task will attempt to look it up in the UpdateChecker's channel list. - * If an error occurs here, the function will call emitFailed and return false. - */ - void loadVersionInfo(); - - NetJob::Ptr m_vinfoNetJob; - QByteArray currentVersionFileListData; - QByteArray newVersionFileListData; - Net::Download::Ptr m_currentVersionFileListDownload; - Net::Download::Ptr m_newVersionFileListDownload; - - NetJob::Ptr m_filesNetJob; - - Status m_status; - - OperationList m_operations; - - /*! - * Temporary directory to store update files in. - * This will be set to not auto delete. Task will fail if this fails to be created. - */ - QTemporaryDir m_updateFilesDir; - -protected slots: - /*! - * This function is called when version information is finished downloading - * and at least the new file list download succeeded - */ - void processDownloadedVersionInfo(); - void vinfoDownloadFailed(); - - void fileDownloadFinished(); - void fileDownloadFailed(QString reason); - void fileDownloadProgressChanged(qint64 current, qint64 total); - -private: - shared_qobject_ptr m_network; -}; - -} - diff --git a/launcher/updater/GoUpdate.cpp b/launcher/updater/GoUpdate.cpp deleted file mode 100644 index 4bc7dfa99..000000000 --- a/launcher/updater/GoUpdate.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include "GoUpdate.h" -#include -#include -#include -#include - -#include "net/Download.h" -#include "net/ChecksumValidator.h" - -namespace GoUpdate -{ - -bool parseVersionInfo(const QByteArray &data, VersionFileList &list, QString &error) -{ - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); - if (jsonError.error != QJsonParseError::NoError) - { - error = QString("Failed to parse version info JSON: %1 at %2") - .arg(jsonError.errorString()) - .arg(jsonError.offset); - qCritical() << error; - return false; - } - - QJsonObject json = jsonDoc.object(); - - qDebug() << data; - qDebug() << "Loading version info from JSON."; - QJsonArray filesArray = json.value("Files").toArray(); - for (QJsonValue fileValue : filesArray) - { - QJsonObject fileObj = fileValue.toObject(); - - QString file_path = fileObj.value("Path").toString(); - - VersionFileEntry file{file_path, fileObj.value("Perms").toVariant().toInt(), - FileSourceList(), fileObj.value("MD5").toString(), }; - qDebug() << "File" << file.path << "with perms" << file.mode; - - QJsonArray sourceArray = fileObj.value("Sources").toArray(); - for (QJsonValue val : sourceArray) - { - QJsonObject sourceObj = val.toObject(); - - QString type = sourceObj.value("SourceType").toString(); - if (type == "http") - { - file.sources.append(FileSource("http", sourceObj.value("Url").toString())); - } - else - { - qWarning() << "Unknown source type" << type << "ignored."; - } - } - - qDebug() << "Loaded info for" << file.path; - - list.append(file); - } - - return true; -} - -bool processFileLists -( - const VersionFileList ¤tVersion, - const VersionFileList &newVersion, - const QString &rootPath, - const QString &tempPath, - NetJob::Ptr job, - OperationList &ops -) -{ - // First, if we've loaded the current version's file list, we need to iterate through it and - // delete anything in the current one version's list that isn't in the new version's list. - for (VersionFileEntry entry : currentVersion) - { - QFileInfo toDelete(FS::PathCombine(rootPath, entry.path)); - if (!toDelete.exists()) - { - qCritical() << "Expected file " << toDelete.absoluteFilePath() - << " doesn't exist!"; - } - bool keep = false; - - // - for (VersionFileEntry newEntry : newVersion) - { - if (newEntry.path == entry.path) - { - qDebug() << "Not deleting" << entry.path - << "because it is still present in the new version."; - keep = true; - break; - } - } - - // If the loop reaches the end and we didn't find a match, delete the file. - if (!keep) - { - if (toDelete.exists()) - ops.append(Operation::DeleteOp(entry.path)); - } - } - - // Next, check each file in Prism Launcher's folder and see if we need to update them. - for (VersionFileEntry entry : newVersion) - { - // TODO: Let's not MD5sum a ton of files on the GUI thread. We should probably find a - // way to do this in the background. - QString fileMD5; - QString realEntryPath = FS::PathCombine(rootPath, entry.path); - QFile entryFile(realEntryPath); - QFileInfo entryInfo(realEntryPath); - - bool needs_upgrade = false; - if (!entryFile.exists()) - { - needs_upgrade = true; - } - else - { - bool pass = true; - if (!entryInfo.isReadable()) - { - qCritical() << "File " << realEntryPath << " is not readable."; - pass = false; - } - if (!entryInfo.isWritable()) - { - qCritical() << "File " << realEntryPath << " is not writable."; - pass = false; - } - if (!entryFile.open(QFile::ReadOnly)) - { - qCritical() << "File " << realEntryPath << " cannot be opened for reading."; - pass = false; - } - if (!pass) - { - ops.clear(); - return false; - } - } - - if(!needs_upgrade) - { - QCryptographicHash hash(QCryptographicHash::Md5); - auto foo = entryFile.readAll(); - - hash.addData(foo); - fileMD5 = hash.result().toHex(); - if ((fileMD5 != entry.md5)) - { - qDebug() << "MD5Sum does not match!"; - qDebug() << "Expected:'" << entry.md5 << "'"; - qDebug() << "Got: '" << fileMD5 << "'"; - needs_upgrade = true; - } - } - - // skip file. it doesn't need an upgrade. - if (!needs_upgrade) - { - qDebug() << "File" << realEntryPath << " does not need updating."; - continue; - } - - // yep. this file actually needs an upgrade. PROCEED. - qDebug() << "Found file" << realEntryPath << " that needs updating."; - - // Go through the sources list and find one to use. - // TODO: Make a NetAction that takes a source list and tries each of them until one - // works. For now, we'll just use the first http one. - for (FileSource source : entry.sources) - { - if (source.type != "http") - continue; - - qDebug() << "Will download" << entry.path << "from" << source.url; - - // Download it to updatedir/- where filepath is the file's - // path with slashes replaced by underscores. - QString dlPath = FS::PathCombine(tempPath, QString(entry.path).replace("/", "_")); - - // We need to download the file to the updatefiles folder and add a task - // to copy it to its install path. - auto download = Net::Download::makeFile(source.url, dlPath); - auto rawMd5 = QByteArray::fromHex(entry.md5.toLatin1()); - download->addValidator(new Net::ChecksumValidator(QCryptographicHash::Md5, rawMd5)); - job->addNetAction(download); - ops.append(Operation::CopyOp(dlPath, entry.path, entry.mode)); - } - } - return true; -} -} diff --git a/launcher/updater/GoUpdate.h b/launcher/updater/GoUpdate.h deleted file mode 100644 index 46a679efe..000000000 --- a/launcher/updater/GoUpdate.h +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include -#include - -namespace GoUpdate -{ - -/** - * A temporary object exchanged between updated checker and the actual update task - */ -struct Status -{ - bool updateAvailable = false; - - int newVersionId = -1; - QString newRepoUrl; - - int currentVersionId = -1; - QString currentRepoUrl; - - // path to the root of the application - QString rootPath; -}; - -/** - * Struct that describes an entry in a VersionFileEntry's `Sources` list. - */ -struct FileSource -{ - FileSource(QString type, QString url, QString compression="") - { - this->type = type; - this->url = url; - this->compressionType = compression; - } - - bool operator==(const FileSource &f2) const - { - return type == f2.type && url == f2.url && compressionType == f2.compressionType; - } - - QString type; - QString url; - QString compressionType; -}; -typedef QList FileSourceList; - -/** - * Structure that describes an entry in a GoUpdate version's `Files` list. - */ -struct VersionFileEntry -{ - QString path; - int mode; - FileSourceList sources; - QString md5; - bool operator==(const VersionFileEntry &v2) const - { - return path == v2.path && mode == v2.mode && sources == v2.sources && md5 == v2.md5; - } -}; -typedef QList VersionFileList; - -/** - * Structure that describes an operation to perform when installing updates. - */ -struct Operation -{ - static Operation CopyOp(QString from, QString to, int fmode=0644) - { - return Operation{OP_REPLACE, from, to, fmode}; - } - static Operation DeleteOp(QString file) - { - return Operation{OP_DELETE, QString(), file, 0644}; - } - - // FIXME: for some types, some of the other fields are irrelevant! - bool operator==(const Operation &u2) const - { - return type == u2.type && - source == u2.source && - destination == u2.destination && - destinationMode == u2.destinationMode; - } - - //! Specifies the type of operation that this is. - enum Type - { - OP_REPLACE, - OP_DELETE, - } type; - - //! The source file, if any - QString source; - - //! The destination file. - QString destination; - - //! The mode to change the destination file to. - int destinationMode; -}; -typedef QList OperationList; - -/** - * Loads the file list from the given version info JSON object into the given list. - */ -bool parseVersionInfo(const QByteArray &data, VersionFileList& list, QString &error); - -/*! - * Takes a list of file entries for the current version's files and the new version's files - * and populates the downloadList and operationList with information about how to download and install the update. - */ -bool processFileLists -( - const VersionFileList ¤tVersion, - const VersionFileList &newVersion, - const QString &rootPath, - const QString &tempPath, - NetJob::Ptr job, - OperationList &ops -); - -} -Q_DECLARE_METATYPE(GoUpdate::Status) diff --git a/launcher/updater/MacSparkleUpdater.h b/launcher/updater/MacSparkleUpdater.h index d50dbd685..cee19f7c7 100644 --- a/launcher/updater/MacSparkleUpdater.h +++ b/launcher/updater/MacSparkleUpdater.h @@ -119,8 +119,6 @@ private: class Private; Private *priv; - - void loadChannelsFromSettings(); }; #endif //LAUNCHER_MACSPARKLEUPDATER_H diff --git a/launcher/updater/MacSparkleUpdater.mm b/launcher/updater/MacSparkleUpdater.mm index ca6da55af..07337176d 100644 --- a/launcher/updater/MacSparkleUpdater.mm +++ b/launcher/updater/MacSparkleUpdater.mm @@ -106,8 +106,6 @@ MacSparkleUpdater::MacSparkleUpdater() priv->updaterObserver.callback = ^(bool canCheck) { emit canCheckForUpdatesChanged(canCheck); }; - - loadChannelsFromSettings(); } MacSparkleUpdater::~MacSparkleUpdater() @@ -165,7 +163,6 @@ void MacSparkleUpdater::setUpdateCheckInterval(double seconds) void MacSparkleUpdater::clearAllowedChannels() { priv->updaterDelegate.allowedChannels = [NSSet set]; - APPLICATION->settings()->set("UpdateChannel", ""); } void MacSparkleUpdater::setAllowedChannel(const QString &channel) @@ -178,7 +175,6 @@ void MacSparkleUpdater::setAllowedChannel(const QString &channel) NSSet *nsChannels = [NSSet setWithObject:channel.toNSString()]; priv->updaterDelegate.allowedChannels = nsChannels; - APPLICATION->settings()->set("UpdateChannel", channel); } void MacSparkleUpdater::setAllowedChannels(const QSet &channels) @@ -199,7 +195,6 @@ void MacSparkleUpdater::setAllowedChannels(const QSet &channels) } priv->updaterDelegate.allowedChannels = nsChannels; - APPLICATION->settings()->set("UpdateChannel", channelsConfig.trimmed()); } void MacSparkleUpdater::setBetaAllowed(bool allowed) @@ -213,10 +208,3 @@ void MacSparkleUpdater::setBetaAllowed(bool allowed) clearAllowedChannels(); } } - -void MacSparkleUpdater::loadChannelsFromSettings() -{ - QStringList channelList = APPLICATION->settings()->get("UpdateChannel").toString().split(" "); - QSet channels(channelList.begin(), channelList.end()); - setAllowedChannels(channels); -} diff --git a/launcher/updater/UpdateChecker.cpp b/launcher/updater/UpdateChecker.cpp deleted file mode 100644 index 78d979ff1..000000000 --- a/launcher/updater/UpdateChecker.cpp +++ /dev/null @@ -1,296 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "UpdateChecker.h" - -#include -#include -#include -#include - -#define API_VERSION 0 -#define CHANLIST_FORMAT 0 - -#include "BuildConfig.h" - -UpdateChecker::UpdateChecker(shared_qobject_ptr nam, QString channelUrl, QString currentChannel) -{ - m_network = nam; - m_channelUrl = channelUrl; - m_currentChannel = currentChannel; - -#ifdef Q_OS_MAC - m_externalUpdater = new MacSparkleUpdater(); -#endif -} - -QList UpdateChecker::getChannelList() const -{ - return m_channels; -} - -bool UpdateChecker::hasChannels() const -{ - return !m_channels.isEmpty(); -} - -ExternalUpdater* UpdateChecker::getExternalUpdater() -{ - return m_externalUpdater; -} - -void UpdateChecker::checkForUpdate(const QString& updateChannel, bool notifyNoUpdate) -{ - if (m_externalUpdater) - { - m_externalUpdater->setBetaAllowed(updateChannel == "beta"); - if (notifyNoUpdate) - { - qDebug() << "Checking for updates."; - m_externalUpdater->checkForUpdates(); - } else - { - // The updater library already handles automatic update checks. - return; - } - } - else - { - qDebug() << "Checking for updates."; - // If the channel list hasn't loaded yet, load it and defer checking for updates until - // later. - if (!m_chanListLoaded) - { - qDebug() << "Channel list isn't loaded yet. Loading channel list and deferring update check."; - m_checkUpdateWaiting = true; - m_deferredUpdateChannel = updateChannel; - updateChanList(notifyNoUpdate); - return; - } - - if (m_updateChecking) - { - qDebug() << "Ignoring update check request. Already checking for updates."; - return; - } - - // Find the desired channel within the channel list and get its repo URL. If if cannot be - // found, error. - QString stableUrl; - m_newRepoUrl = ""; - for (ChannelListEntry entry: m_channels) - { - qDebug() << "channelEntry = " << entry.id; - if (entry.id == "stable") - { - stableUrl = entry.url; - } - if (entry.id == updateChannel) - { - m_newRepoUrl = entry.url; - qDebug() << "is intended update channel: " << entry.id; - } - if (entry.id == m_currentChannel) - { - m_currentRepoUrl = entry.url; - qDebug() << "is current update channel: " << entry.id; - } - } - - qDebug() << "m_repoUrl = " << m_newRepoUrl; - - if (m_newRepoUrl.isEmpty()) - { - qWarning() << "m_repoUrl was empty. defaulting to 'stable': " << stableUrl; - m_newRepoUrl = stableUrl; - } - - // If nothing applies, error - if (m_newRepoUrl.isEmpty()) - { - qCritical() << "failed to select any update repository for: " << updateChannel; - emit updateCheckFailed(); - return; - } - - m_updateChecking = true; - - QUrl indexUrl = QUrl(m_newRepoUrl).resolved(QUrl("index.json")); - - indexJob = new NetJob("GoUpdate Repository Index", m_network); - indexJob->addNetAction(Net::Download::makeByteArray(indexUrl, &indexData)); - connect(indexJob.get(), &NetJob::succeeded, [this, notifyNoUpdate]() { updateCheckFinished(notifyNoUpdate); }); - connect(indexJob.get(), &NetJob::failed, this, &UpdateChecker::updateCheckFailed); - indexJob->start(); - } -} - -void UpdateChecker::updateCheckFinished(bool notifyNoUpdate) -{ - qDebug() << "Finished downloading repo index. Checking for new versions."; - - QJsonParseError jsonError; - indexJob.reset(); - - QJsonDocument jsonDoc = QJsonDocument::fromJson(indexData, &jsonError); - indexData.clear(); - if (jsonError.error != QJsonParseError::NoError || !jsonDoc.isObject()) - { - qCritical() << "Failed to parse GoUpdate repository index. JSON error" - << jsonError.errorString() << "at offset" << jsonError.offset; - m_updateChecking = false; - return; - } - - QJsonObject object = jsonDoc.object(); - - bool success = false; - int apiVersion = object.value("ApiVersion").toVariant().toInt(&success); - if (apiVersion != API_VERSION || !success) - { - qCritical() << "Failed to check for updates. API version mismatch. We're using" - << API_VERSION << "server has" << apiVersion; - m_updateChecking = false; - return; - } - - qDebug() << "Processing repository version list."; - QJsonObject newestVersion; - QJsonArray versions = object.value("Versions").toArray(); - for (QJsonValue versionVal : versions) - { - QJsonObject version = versionVal.toObject(); - if (newestVersion.value("Id").toVariant().toInt() < - version.value("Id").toVariant().toInt()) - { - newestVersion = version; - } - } - - // We've got the version with the greatest ID number. Now compare it to our current build - // number and update if they're different. - int newBuildNumber = newestVersion.value("Id").toVariant().toInt(); - if (newBuildNumber != m_currentBuild) - { - qDebug() << "Found newer version with ID" << newBuildNumber; - // Update! - GoUpdate::Status updateStatus; - updateStatus.updateAvailable = true; - updateStatus.currentVersionId = m_currentBuild; - updateStatus.currentRepoUrl = m_currentRepoUrl; - updateStatus.newVersionId = newBuildNumber; - updateStatus.newRepoUrl = m_newRepoUrl; - emit updateAvailable(updateStatus); - } - else if (notifyNoUpdate) - { - emit noUpdateFound(); - } - m_updateChecking = false; -} - -void UpdateChecker::updateCheckFailed() -{ - qCritical() << "Update check failed for reasons unknown."; -} - -void UpdateChecker::updateChanList(bool notifyNoUpdate) -{ - qDebug() << "Loading the channel list."; - - if (m_chanListLoading) - { - qDebug() << "Ignoring channel list update request. Already grabbing channel list."; - return; - } - - m_chanListLoading = true; - chanListJob = new NetJob("Update System Channel List", m_network); - chanListJob->addNetAction(Net::Download::makeByteArray(QUrl(m_channelUrl), &chanlistData)); - connect(chanListJob.get(), &NetJob::succeeded, [this, notifyNoUpdate]() { chanListDownloadFinished(notifyNoUpdate); }); - connect(chanListJob.get(), &NetJob::failed, this, &UpdateChecker::chanListDownloadFailed); - chanListJob->start(); -} - -void UpdateChecker::chanListDownloadFinished(bool notifyNoUpdate) -{ - chanListJob.reset(); - - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(chanlistData, &jsonError); - chanlistData.clear(); - if (jsonError.error != QJsonParseError::NoError) - { - // TODO: Report errors to the user. - qCritical() << "Failed to parse channel list JSON:" << jsonError.errorString() << "at" << jsonError.offset; - m_chanListLoading = false; - return; - } - - QJsonObject object = jsonDoc.object(); - - bool success = false; - int formatVersion = object.value("format_version").toVariant().toInt(&success); - if (formatVersion != CHANLIST_FORMAT || !success) - { - qCritical() - << "Failed to check for updates. Channel list format version mismatch. We're using" - << CHANLIST_FORMAT << "server has" << formatVersion; - m_chanListLoading = false; - return; - } - - // Load channels into a temporary array. - QList loadedChannels; - QJsonArray channelArray = object.value("channels").toArray(); - for (QJsonValue chanVal : channelArray) - { - QJsonObject channelObj = chanVal.toObject(); - ChannelListEntry entry { - channelObj.value("id").toVariant().toString(), - channelObj.value("name").toVariant().toString(), - channelObj.value("description").toVariant().toString(), - channelObj.value("url").toVariant().toString() - }; - if (entry.id.isEmpty() || entry.name.isEmpty() || entry.url.isEmpty()) - { - qCritical() << "Channel list entry with empty ID, name, or URL. Skipping."; - continue; - } - loadedChannels.append(entry); - } - - // Swap the channel list we just loaded into the object's channel list. - m_channels.swap(loadedChannels); - - m_chanListLoading = false; - m_chanListLoaded = true; - qDebug() << "Successfully loaded UpdateChecker channel list."; - - // If we're waiting to check for updates, do that now. - if (m_checkUpdateWaiting) { - checkForUpdate(m_deferredUpdateChannel, notifyNoUpdate); - } - - emit channelListLoaded(); -} - -void UpdateChecker::chanListDownloadFailed(QString reason) -{ - m_chanListLoading = false; - qCritical() << QString("Failed to download channel list: %1").arg(reason); - emit channelListLoaded(); -} - diff --git a/launcher/updater/UpdateChecker.h b/launcher/updater/UpdateChecker.h deleted file mode 100644 index 42ef318bb..000000000 --- a/launcher/updater/UpdateChecker.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright 2013-2021 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "net/NetJob.h" -#include "GoUpdate.h" -#include "ExternalUpdater.h" - -#ifdef Q_OS_MAC -#include "MacSparkleUpdater.h" -#endif - -class UpdateChecker : public QObject -{ - Q_OBJECT - -public: - UpdateChecker(shared_qobject_ptr nam, QString channelUrl, QString currentChannel); - void checkForUpdate(const QString& updateChannel, bool notifyNoUpdate); - - /*! - * Causes the update checker to download the channel list from the URL specified in config.h (generated by CMake). - * If this isn't called before checkForUpdate(), it will automatically be called. - */ - void updateChanList(bool notifyNoUpdate); - - /*! - * An entry in the channel list. - */ - struct ChannelListEntry - { - QString id; - QString name; - QString description; - QString url; - }; - - /*! - * Returns a the current channel list. - * If the channel list hasn't been loaded, this list will be empty. - */ - QList getChannelList() const; - - /*! - * Returns false if the channel list is empty. - */ - bool hasChannels() const; - - /*! - * Returns a pointer to an object that controls the external updater, or nullptr if an external updater is not used. - */ - ExternalUpdater *getExternalUpdater(); - -signals: - //! Signal emitted when an update is available. Passes the URL for the repo and the ID and name for the version. - void updateAvailable(GoUpdate::Status status); - - //! Signal emitted when the channel list finishes loading or fails to load. - void channelListLoaded(); - - void noUpdateFound(); - -private slots: - void updateCheckFinished(bool notifyNoUpdate); - void updateCheckFailed(); - - void chanListDownloadFinished(bool notifyNoUpdate); - void chanListDownloadFailed(QString reason); - -private: - friend class UpdateCheckerTest; - - shared_qobject_ptr m_network; - - NetJob::Ptr indexJob; - QByteArray indexData; - NetJob::Ptr chanListJob; - QByteArray chanlistData; - - QString m_channelUrl; - - QList m_channels; - - /*! - * True while the system is checking for updates. - * If checkForUpdate is called while this is true, it will be ignored. - */ - bool m_updateChecking = false; - - /*! - * True if the channel list has loaded. - * If this is false, trying to check for updates will call updateChanList first. - */ - bool m_chanListLoaded = false; - - /*! - * Set to true while the channel list is currently loading. - */ - bool m_chanListLoading = false; - - /*! - * Set to true when checkForUpdate is called while the channel list isn't loaded. - * When the channel list finishes loading, if this is true, the update checker will check for updates. - */ - bool m_checkUpdateWaiting = false; - - /*! - * if m_checkUpdateWaiting, this is the last used update channel - */ - QString m_deferredUpdateChannel; - - int m_currentBuild = -1; - QString m_currentChannel; - QString m_currentRepoUrl; - - QString m_newRepoUrl; - - /*! - * If not a nullptr, then the updater here will be used instead of the old updater that uses GoUpdate when - * checking for updates. - * - * As a result, signals from this class won't be emitted, and most of the functions in this class other - * than checkForUpdate are not useful. Call functions from this external updater object instead. - */ - ExternalUpdater *m_externalUpdater = nullptr; -}; - From 66f9fed2f2fccfb00ee3086637a667eca60213aa Mon Sep 17 00:00:00 2001 From: Trisave <42098407+Protrikk@users.noreply.github.com> Date: Tue, 22 Nov 2022 18:30:21 +0100 Subject: [PATCH 0309/1149] Remove blue-ish tint from flat white icons Signed-off-by: Trisave <42098407+Protrikk@users.noreply.github.com> --- launcher/resources/flat_white/scalable/about.svg | 4 ++-- launcher/resources/flat_white/scalable/accounts.svg | 4 ++-- launcher/resources/flat_white/scalable/bug.svg | 4 ++-- launcher/resources/flat_white/scalable/cat.svg | 4 ++-- launcher/resources/flat_white/scalable/centralmods.svg | 4 ++-- launcher/resources/flat_white/scalable/checkupdate.svg | 4 ++-- launcher/resources/flat_white/scalable/copy.svg | 4 ++-- launcher/resources/flat_white/scalable/coremods.svg | 4 ++-- .../resources/flat_white/scalable/custom-commands.svg | 2 +- launcher/resources/flat_white/scalable/delete.svg | 6 +++--- launcher/resources/flat_white/scalable/discord.svg | 4 ++-- launcher/resources/flat_white/scalable/export.svg | 4 ++-- launcher/resources/flat_white/scalable/externaltools.svg | 4 ++-- launcher/resources/flat_white/scalable/help.svg | 2 +- .../resources/flat_white/scalable/instance-settings.svg | 4 ++-- launcher/resources/flat_white/scalable/jarmods.svg | 4 ++-- launcher/resources/flat_white/scalable/java.svg | 4 ++-- launcher/resources/flat_white/scalable/language.svg | 2 +- launcher/resources/flat_white/scalable/launch.svg | 2 +- launcher/resources/flat_white/scalable/launcher.svg | 2 +- launcher/resources/flat_white/scalable/loadermods.svg | 4 ++-- launcher/resources/flat_white/scalable/log.svg | 4 ++-- launcher/resources/flat_white/scalable/minecraft.svg | 4 ++-- launcher/resources/flat_white/scalable/multimc.svg | 4 ++-- launcher/resources/flat_white/scalable/new.svg | 4 ++-- launcher/resources/flat_white/scalable/news.svg | 4 ++-- launcher/resources/flat_white/scalable/notes.svg | 4 ++-- launcher/resources/flat_white/scalable/packages.svg | 4 ++-- launcher/resources/flat_white/scalable/patreon.svg | 4 ++-- launcher/resources/flat_white/scalable/proxy.svg | 4 ++-- launcher/resources/flat_white/scalable/quickmods.svg | 4 ++-- launcher/resources/flat_white/scalable/reddit-alien.svg | 4 ++-- launcher/resources/flat_white/scalable/refresh.svg | 4 ++-- launcher/resources/flat_white/scalable/rename.svg | 4 ++-- launcher/resources/flat_white/scalable/resourcepacks.svg | 4 ++-- .../flat_white/scalable/screenshot-placeholder.svg | 4 ++-- launcher/resources/flat_white/scalable/screenshots.svg | 4 ++-- launcher/resources/flat_white/scalable/settings.svg | 4 ++-- launcher/resources/flat_white/scalable/shaderpacks.svg | 8 ++++---- launcher/resources/flat_white/scalable/star.svg | 4 ++-- launcher/resources/flat_white/scalable/status-bad.svg | 4 ++-- launcher/resources/flat_white/scalable/status-good.svg | 4 ++-- launcher/resources/flat_white/scalable/status-running.svg | 4 ++-- launcher/resources/flat_white/scalable/status-yellow.svg | 4 ++-- launcher/resources/flat_white/scalable/tag.svg | 6 +++--- launcher/resources/flat_white/scalable/viewfolder.svg | 4 ++-- launcher/resources/flat_white/scalable/worlds.svg | 4 ++-- 47 files changed, 93 insertions(+), 93 deletions(-) diff --git a/launcher/resources/flat_white/scalable/about.svg b/launcher/resources/flat_white/scalable/about.svg index e42ca9481..e2071c84f 100644 --- a/launcher/resources/flat_white/scalable/about.svg +++ b/launcher/resources/flat_white/scalable/about.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/accounts.svg b/launcher/resources/flat_white/scalable/accounts.svg index e714bde13..0b413e2ac 100644 --- a/launcher/resources/flat_white/scalable/accounts.svg +++ b/launcher/resources/flat_white/scalable/accounts.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/bug.svg b/launcher/resources/flat_white/scalable/bug.svg index 3122702e3..1e270acdb 100644 --- a/launcher/resources/flat_white/scalable/bug.svg +++ b/launcher/resources/flat_white/scalable/bug.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/cat.svg b/launcher/resources/flat_white/scalable/cat.svg index 18da097a7..93470c4ff 100644 --- a/launcher/resources/flat_white/scalable/cat.svg +++ b/launcher/resources/flat_white/scalable/cat.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/centralmods.svg b/launcher/resources/flat_white/scalable/centralmods.svg index d8d10f2f5..277fe1115 100644 --- a/launcher/resources/flat_white/scalable/centralmods.svg +++ b/launcher/resources/flat_white/scalable/centralmods.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/checkupdate.svg b/launcher/resources/flat_white/scalable/checkupdate.svg index 0fa66fc2f..78db2b0cc 100644 --- a/launcher/resources/flat_white/scalable/checkupdate.svg +++ b/launcher/resources/flat_white/scalable/checkupdate.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/copy.svg b/launcher/resources/flat_white/scalable/copy.svg index 1aaed97b1..abcb2b696 100644 --- a/launcher/resources/flat_white/scalable/copy.svg +++ b/launcher/resources/flat_white/scalable/copy.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/coremods.svg b/launcher/resources/flat_white/scalable/coremods.svg index 32c343839..f3132a5fd 100644 --- a/launcher/resources/flat_white/scalable/coremods.svg +++ b/launcher/resources/flat_white/scalable/coremods.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/custom-commands.svg b/launcher/resources/flat_white/scalable/custom-commands.svg index 3d67d8f10..fe1cf9987 100644 --- a/launcher/resources/flat_white/scalable/custom-commands.svg +++ b/launcher/resources/flat_white/scalable/custom-commands.svg @@ -1,6 +1,6 @@ - + - - \ No newline at end of file + + diff --git a/launcher/resources/flat_white/scalable/discord.svg b/launcher/resources/flat_white/scalable/discord.svg index ee07ed25e..6a07d2289 100644 --- a/launcher/resources/flat_white/scalable/discord.svg +++ b/launcher/resources/flat_white/scalable/discord.svg @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/export.svg b/launcher/resources/flat_white/scalable/export.svg index a28bb2540..095952118 100644 --- a/launcher/resources/flat_white/scalable/export.svg +++ b/launcher/resources/flat_white/scalable/export.svg @@ -1,5 +1,5 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/externaltools.svg b/launcher/resources/flat_white/scalable/externaltools.svg index e7c0930c9..d641f4f21 100644 --- a/launcher/resources/flat_white/scalable/externaltools.svg +++ b/launcher/resources/flat_white/scalable/externaltools.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/help.svg b/launcher/resources/flat_white/scalable/help.svg index 82b413fe5..31e8c092b 100644 --- a/launcher/resources/flat_white/scalable/help.svg +++ b/launcher/resources/flat_white/scalable/help.svg @@ -10,7 +10,7 @@ width="24" viewBox="0 0 24 24" height="24" - fill="#D8DEE9"> + fill="#eeeeee"> diff --git a/launcher/resources/flat_white/scalable/instance-settings.svg b/launcher/resources/flat_white/scalable/instance-settings.svg index 7dac7b141..95a0a8026 100644 --- a/launcher/resources/flat_white/scalable/instance-settings.svg +++ b/launcher/resources/flat_white/scalable/instance-settings.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/jarmods.svg b/launcher/resources/flat_white/scalable/jarmods.svg index f0f298f32..603a8ae9a 100644 --- a/launcher/resources/flat_white/scalable/jarmods.svg +++ b/launcher/resources/flat_white/scalable/jarmods.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/java.svg b/launcher/resources/flat_white/scalable/java.svg index 56bb481f2..db81128e0 100644 --- a/launcher/resources/flat_white/scalable/java.svg +++ b/launcher/resources/flat_white/scalable/java.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/language.svg b/launcher/resources/flat_white/scalable/language.svg index 18c22efb5..4aef29468 100644 --- a/launcher/resources/flat_white/scalable/language.svg +++ b/launcher/resources/flat_white/scalable/language.svg @@ -7,7 +7,7 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - fill="#D8DEE9" + fill="#eeeeee" height="24" viewBox="0 0 24 24" width="24" diff --git a/launcher/resources/flat_white/scalable/launch.svg b/launcher/resources/flat_white/scalable/launch.svg index 9e7594318..ddd6d5f2c 100644 --- a/launcher/resources/flat_white/scalable/launch.svg +++ b/launcher/resources/flat_white/scalable/launch.svg @@ -1,6 +1,6 @@ - + diff --git a/launcher/resources/flat_white/scalable/loadermods.svg b/launcher/resources/flat_white/scalable/loadermods.svg index 100f7a93e..95c72084a 100644 --- a/launcher/resources/flat_white/scalable/loadermods.svg +++ b/launcher/resources/flat_white/scalable/loadermods.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/log.svg b/launcher/resources/flat_white/scalable/log.svg index 69b7c1dcc..a40139d36 100644 --- a/launcher/resources/flat_white/scalable/log.svg +++ b/launcher/resources/flat_white/scalable/log.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/minecraft.svg b/launcher/resources/flat_white/scalable/minecraft.svg index a0348e797..94aaebd13 100644 --- a/launcher/resources/flat_white/scalable/minecraft.svg +++ b/launcher/resources/flat_white/scalable/minecraft.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/multimc.svg b/launcher/resources/flat_white/scalable/multimc.svg index 3dce2699b..9afe68d96 100644 --- a/launcher/resources/flat_white/scalable/multimc.svg +++ b/launcher/resources/flat_white/scalable/multimc.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/new.svg b/launcher/resources/flat_white/scalable/new.svg index 46dc3361a..22c6a6fe3 100644 --- a/launcher/resources/flat_white/scalable/new.svg +++ b/launcher/resources/flat_white/scalable/new.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/news.svg b/launcher/resources/flat_white/scalable/news.svg index 414e54540..76623f341 100644 --- a/launcher/resources/flat_white/scalable/news.svg +++ b/launcher/resources/flat_white/scalable/news.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/notes.svg b/launcher/resources/flat_white/scalable/notes.svg index 4ce5f6f19..18a1265de 100644 --- a/launcher/resources/flat_white/scalable/notes.svg +++ b/launcher/resources/flat_white/scalable/notes.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/packages.svg b/launcher/resources/flat_white/scalable/packages.svg index 909ad0b27..d2c879557 100644 --- a/launcher/resources/flat_white/scalable/packages.svg +++ b/launcher/resources/flat_white/scalable/packages.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/patreon.svg b/launcher/resources/flat_white/scalable/patreon.svg index b745765b4..d5385eac1 100644 --- a/launcher/resources/flat_white/scalable/patreon.svg +++ b/launcher/resources/flat_white/scalable/patreon.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/proxy.svg b/launcher/resources/flat_white/scalable/proxy.svg index a86703f45..30e27e8a4 100644 --- a/launcher/resources/flat_white/scalable/proxy.svg +++ b/launcher/resources/flat_white/scalable/proxy.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/quickmods.svg b/launcher/resources/flat_white/scalable/quickmods.svg index 9e0045b20..599bd2bf3 100644 --- a/launcher/resources/flat_white/scalable/quickmods.svg +++ b/launcher/resources/flat_white/scalable/quickmods.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/reddit-alien.svg b/launcher/resources/flat_white/scalable/reddit-alien.svg index be22148ca..291b12e0e 100644 --- a/launcher/resources/flat_white/scalable/reddit-alien.svg +++ b/launcher/resources/flat_white/scalable/reddit-alien.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/refresh.svg b/launcher/resources/flat_white/scalable/refresh.svg index 08c63bdf7..e8c6c44b3 100644 --- a/launcher/resources/flat_white/scalable/refresh.svg +++ b/launcher/resources/flat_white/scalable/refresh.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/rename.svg b/launcher/resources/flat_white/scalable/rename.svg index f2067c16b..e7d6634a2 100644 --- a/launcher/resources/flat_white/scalable/rename.svg +++ b/launcher/resources/flat_white/scalable/rename.svg @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/resourcepacks.svg b/launcher/resources/flat_white/scalable/resourcepacks.svg index 9dd73c3af..272af76b7 100644 --- a/launcher/resources/flat_white/scalable/resourcepacks.svg +++ b/launcher/resources/flat_white/scalable/resourcepacks.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/screenshot-placeholder.svg b/launcher/resources/flat_white/scalable/screenshot-placeholder.svg index 41eb6fcfc..162b78040 100644 --- a/launcher/resources/flat_white/scalable/screenshot-placeholder.svg +++ b/launcher/resources/flat_white/scalable/screenshot-placeholder.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/screenshots.svg b/launcher/resources/flat_white/scalable/screenshots.svg index 68cf89696..ae1c876df 100644 --- a/launcher/resources/flat_white/scalable/screenshots.svg +++ b/launcher/resources/flat_white/scalable/screenshots.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/settings.svg b/launcher/resources/flat_white/scalable/settings.svg index 7dac7b141..95a0a8026 100644 --- a/launcher/resources/flat_white/scalable/settings.svg +++ b/launcher/resources/flat_white/scalable/settings.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/shaderpacks.svg b/launcher/resources/flat_white/scalable/shaderpacks.svg index ccae221c1..bfd8b8332 100644 --- a/launcher/resources/flat_white/scalable/shaderpacks.svg +++ b/launcher/resources/flat_white/scalable/shaderpacks.svg @@ -1,6 +1,6 @@ diff --git a/launcher/resources/flat_white/scalable/star.svg b/launcher/resources/flat_white/scalable/star.svg index 116f952eb..2a573ca30 100644 --- a/launcher/resources/flat_white/scalable/star.svg +++ b/launcher/resources/flat_white/scalable/star.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/status-bad.svg b/launcher/resources/flat_white/scalable/status-bad.svg index 5a121c09c..b6b42a968 100644 --- a/launcher/resources/flat_white/scalable/status-bad.svg +++ b/launcher/resources/flat_white/scalable/status-bad.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/status-good.svg b/launcher/resources/flat_white/scalable/status-good.svg index ccb732ab8..aee4c5234 100644 --- a/launcher/resources/flat_white/scalable/status-good.svg +++ b/launcher/resources/flat_white/scalable/status-good.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/status-running.svg b/launcher/resources/flat_white/scalable/status-running.svg index aa2d5fbff..d4d551944 100644 --- a/launcher/resources/flat_white/scalable/status-running.svg +++ b/launcher/resources/flat_white/scalable/status-running.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/status-yellow.svg b/launcher/resources/flat_white/scalable/status-yellow.svg index 772699d32..00737f515 100644 --- a/launcher/resources/flat_white/scalable/status-yellow.svg +++ b/launcher/resources/flat_white/scalable/status-yellow.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/tag.svg b/launcher/resources/flat_white/scalable/tag.svg index f91fb0b42..0d7661e0d 100644 --- a/launcher/resources/flat_white/scalable/tag.svg +++ b/launcher/resources/flat_white/scalable/tag.svg @@ -1,4 +1,4 @@ - - - \ No newline at end of file + + + diff --git a/launcher/resources/flat_white/scalable/viewfolder.svg b/launcher/resources/flat_white/scalable/viewfolder.svg index 145f86248..b13c8eb36 100644 --- a/launcher/resources/flat_white/scalable/viewfolder.svg +++ b/launcher/resources/flat_white/scalable/viewfolder.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + diff --git a/launcher/resources/flat_white/scalable/worlds.svg b/launcher/resources/flat_white/scalable/worlds.svg index cea30cf81..d7aaef1d5 100644 --- a/launcher/resources/flat_white/scalable/worlds.svg +++ b/launcher/resources/flat_white/scalable/worlds.svg @@ -1,3 +1,3 @@ - + - \ No newline at end of file + From 20c281d6f8d5f25573a8c4c930a961ea9ab45380 Mon Sep 17 00:00:00 2001 From: flow Date: Tue, 22 Nov 2022 14:30:54 -0300 Subject: [PATCH 0310/1149] fix: reset wide bar settings when the list of actions changes This prevents changes to the actions to cause non-intuitive issues in the Wide bar, hiding items that previously weren't hidden. Signed-off-by: flow --- launcher/ui/widgets/WideBar.cpp | 35 +++++++++++++++++++++++++++++++-- launcher/ui/widgets/WideBar.h | 4 ++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/launcher/ui/widgets/WideBar.cpp b/launcher/ui/widgets/WideBar.cpp index 2ad2caec7..81c445cb1 100644 --- a/launcher/ui/widgets/WideBar.cpp +++ b/launcher/ui/widgets/WideBar.cpp @@ -1,6 +1,7 @@ #include "WideBar.h" #include +#include #include class ActionButton : public QToolButton { @@ -211,23 +212,53 @@ void WideBar::contextMenuEvent(QContextMenuEvent* event) state.append(entry.bar_action->isVisible() ? '1' : '0'); } + state.append(','); + state.append(getHash()); + return state; } void WideBar::setVisibilityState(QByteArray&& state) { + auto split = state.split(','); + + auto bits = split.first(); + auto hash = split.last(); + + // If the actions changed, we better not try to load the old one to avoid unwanted hiding + if (!checkHash(hash)) + return; + qsizetype i = 0; for (auto& entry : m_entries) { if (entry.type != BarEntry::Type::Action) continue; - if (i == state.size()) + if (i == bits.size()) break; - entry.bar_action->setVisible(state.at(i++) == '1'); + entry.bar_action->setVisible(bits.at(i++) == '1'); // NOTE: This is needed so that disabled actions get reflected on the button when it is made visible. static_cast(widgetForAction(entry.bar_action))->actionChanged(); } } +QByteArray WideBar::getHash() const +{ + QCryptographicHash hash(QCryptographicHash::Sha1); + for (auto const& entry : m_entries) { + if (entry.type != BarEntry::Type::Action) + continue; + hash.addData(entry.menu_action->text().toLatin1()); + } + + return hash.result().toBase64(); +} + +bool WideBar::checkHash(QByteArray const& old_hash) const +{ + return old_hash == getHash(); +} + + #include "WideBar.moc" diff --git a/launcher/ui/widgets/WideBar.h b/launcher/ui/widgets/WideBar.h index 0d60f8a4a..ed4cb3c71 100644 --- a/launcher/ui/widgets/WideBar.h +++ b/launcher/ui/widgets/WideBar.h @@ -41,6 +41,10 @@ class WideBar : public QToolBar { auto getMatching(QAction* act) -> QList::iterator; + /** Used to distinguish between versions of the WideBar with different actions */ + [[nodiscard]] QByteArray getHash() const; + [[nodiscard]] bool checkHash(QByteArray const&) const; + private: QList m_entries; From 980f03dd206d9e15ceb111839ebc615a493c790f Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Tue, 22 Nov 2022 19:17:16 +0000 Subject: [PATCH 0311/1149] Fix: Launcher_FORCE_BUNDLED_LIBS Failing to find bundled zlib Signed-off-by: TheLastRar --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fc0d3265..f04b733be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -368,11 +368,11 @@ if(NOT ZLIB_FOUND) set(SKIP_INSTALL_ALL ON) add_subdirectory(libraries/zlib EXCLUDE_FROM_ALL) - set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib" "${CMAKE_CURRENT_BINARY_DIR}/libraries/zlib") + set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libraries/zlib" "${CMAKE_CURRENT_BINARY_DIR}/libraries/zlib" CACHE STRING "") set_target_properties(zlibstatic PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}") add_library(ZLIB::ZLIB ALIAS zlibstatic) - set(ZLIB_LIBRARY ZLIB::ZLIB) - set(ZLIB_FOUND true) + set(ZLIB_LIBRARY ZLIB::ZLIB CACHE STRING "zlib library name") + find_package(ZLIB REQUIRED) else() message(STATUS "Using system zlib") From 96e8217b0034a7d73c7a37881955c51d3b248dca Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 8 Nov 2022 11:20:13 +0000 Subject: [PATCH 0312/1149] Button to add agent Signed-off-by: TheKodeToad --- launcher/minecraft/Agent.h | 2 +- launcher/minecraft/PackProfile.cpp | 72 ++++++++++++++++++++-- launcher/minecraft/PackProfile.h | 7 ++- launcher/ui/pages/instance/VersionPage.cpp | 16 ++++- launcher/ui/pages/instance/VersionPage.h | 4 +- launcher/ui/pages/instance/VersionPage.ui | 9 +++ 6 files changed, 101 insertions(+), 9 deletions(-) diff --git a/launcher/minecraft/Agent.h b/launcher/minecraft/Agent.h index 01109dafa..374e6e94e 100644 --- a/launcher/minecraft/Agent.h +++ b/launcher/minecraft/Agent.h @@ -10,7 +10,7 @@ typedef std::shared_ptr AgentPtr; class Agent { public: - Agent(LibraryPtr library, QString &argument) + Agent(LibraryPtr library, const QString &argument) { m_library = library; m_argument = argument; diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index 6ce525eb1..bbdf51d88 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 @@ -47,7 +48,6 @@ #include "Exception.h" #include "minecraft/OneSixVersionFormat.h" #include "FileSystem.h" -#include "meta/Index.h" #include "minecraft/MinecraftInstance.h" #include "Json.h" @@ -55,7 +55,6 @@ #include "PackProfile_p.h" #include "ComponentUpdateTask.h" -#include "Application.h" #include "modplatform/ModAPI.h" static const QMap modloaderMapping{ @@ -738,6 +737,11 @@ void PackProfile::installCustomJar(QString selectedFile) installCustomJar_internal(selectedFile); } +void PackProfile::installAgents(QStringList selectedFiles) +{ + installAgents_internal(selectedFiles); +} + bool PackProfile::installEmpty(const QString& uid, const QString& name) { QString patchDir = FS::PathCombine(d->m_instance->instanceRoot(), "patches"); @@ -832,8 +836,7 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) for(auto filepath:filepaths) { QFileInfo sourceInfo(filepath); - auto uuid = QUuid::createUuid(); - QString id = uuid.toString().remove('{').remove('}'); + QString id = QUuid::createUuid().toString(QUuid::WithoutBraces); QString target_filename = id + ".jar"; QString target_id = "org.multimc.jarmod." + id; QString target_name = sourceInfo.completeBaseName() + " (jar mod)"; @@ -939,6 +942,65 @@ bool PackProfile::installCustomJar_internal(QString filepath) return true; } +bool PackProfile::installAgents_internal(QStringList filepaths) +{ + // FIXME code duplication + const QString patchDir = FS::PathCombine(d->m_instance->instanceRoot(), "patches"); + if (!FS::ensureFolderPathExists(patchDir)) + return false; + + const QString libDir = d->m_instance->getLocalLibraryPath(); + if (!FS::ensureFolderPathExists(libDir)) + return false; + + for (const QString& source : filepaths) { + const QFileInfo sourceInfo(source); + const QString id = QUuid::createUuid().toString(QUuid::WithoutBraces); + const QString targetBaseName = id + ".jar"; + const QString targetId = "org.prismlauncher.agent." + id; + const QString targetName = sourceInfo.completeBaseName() + " (agent)"; + const QString target = FS::PathCombine(d->m_instance->getLocalLibraryPath(), targetBaseName); + + const QFileInfo targetInfo(target); + if (targetInfo.exists()) + return false; + + if (!QFile::copy(source, target)) + return false; + + auto versionFile = std::make_shared(); + + auto agent = std::make_shared(); + + agent->setRawName("org.prismlauncher.agents:" + id + ":1"); + agent->setFilename(targetBaseName); + agent->setDisplayName(sourceInfo.completeBaseName()); + agent->setHint("local"); + + versionFile->agents.append(std::make_shared(agent, QString())); + + versionFile->name = targetName; + versionFile->uid = targetId; + + QFile patchFile(FS::PathCombine(patchDir, targetId + ".json")); + + if (!patchFile.open(QFile::WriteOnly)) { + qCritical() << "Error opening" << patchFile.fileName() << "for reading:" << patchFile.errorString(); + return false; + } + + patchFile.write(OneSixVersionFormat::versionFileToJson(versionFile).toJson()); + patchFile.close(); + + appendComponent(new Component(this, versionFile->uid, versionFile)); + } + + scheduleSave(); + invalidateLaunchProfile(); + + return true; +} + std::shared_ptr PackProfile::getProfile() const { if(!d->m_profile) diff --git a/launcher/minecraft/PackProfile.h b/launcher/minecraft/PackProfile.h index 807511a26..2330cca1c 100644 --- a/launcher/minecraft/PackProfile.h +++ b/launcher/minecraft/PackProfile.h @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 @@ -85,6 +86,9 @@ public: /// install a jar/zip as a replacement for the main jar void installCustomJar(QString selectedFile); + /// install Java agent files + void installAgents(QStringList selectedFiles); + enum MoveDirection { MoveUp, MoveDown }; /// move component file # up or down the list void move(const int index, const MoveDirection direction); @@ -167,6 +171,7 @@ private: bool load(); bool installJarMods_internal(QStringList filepaths); bool installCustomJar_internal(QString filepath); + bool installAgents_internal(QStringList filepaths); bool removeComponent_internal(ComponentPtr patch); private: /* data */ diff --git a/launcher/ui/pages/instance/VersionPage.cpp b/launcher/ui/pages/instance/VersionPage.cpp index a021c633f..7f98cba2d 100644 --- a/launcher/ui/pages/instance/VersionPage.cpp +++ b/launcher/ui/pages/instance/VersionPage.cpp @@ -1,8 +1,9 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 Jamie Mansfield * Copyright (C) 2022 Sefa Eyeoglu + * Copyright (C) 2022 TheKodeToad * * 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 @@ -270,6 +271,7 @@ void VersionPage::updateButtons(int row) ui->actionInstall_mods->setEnabled(controlsEnabled); ui->actionReplace_Minecraft_jar->setEnabled(controlsEnabled); ui->actionAdd_to_Minecraft_jar->setEnabled(controlsEnabled); + ui->actionAdd_Agents->setEnabled(controlsEnabled); } bool VersionPage::reloadPackProfile() @@ -342,6 +344,18 @@ void VersionPage::on_actionReplace_Minecraft_jar_triggered() updateButtons(); } + +void VersionPage::on_actionAdd_Agents_triggered() +{ + QStringList list = GuiUtil::BrowseForFiles("agent", tr("Select agents"), tr("Java agents (*.jar)"), + APPLICATION->settings()->get("CentralModsDir").toString(), this->parentWidget()); + + if (!list.isEmpty()) + m_profile->installAgents(list); + + updateButtons(); +} + void VersionPage::on_actionMove_up_triggered() { try diff --git a/launcher/ui/pages/instance/VersionPage.h b/launcher/ui/pages/instance/VersionPage.h index 979311fcf..23d2a1b3d 100644 --- a/launcher/ui/pages/instance/VersionPage.h +++ b/launcher/ui/pages/instance/VersionPage.h @@ -1,7 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (c) 2022 Jamie Mansfield + * Copyright (C) 2022 TheKodeToad * * 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 @@ -82,6 +83,7 @@ private slots: void on_actionMove_down_triggered(); void on_actionAdd_to_Minecraft_jar_triggered(); void on_actionReplace_Minecraft_jar_triggered(); + void on_actionAdd_Agents_triggered(); void on_actionRevert_triggered(); void on_actionEdit_triggered(); void on_actionInstall_mods_triggered(); diff --git a/launcher/ui/pages/instance/VersionPage.ui b/launcher/ui/pages/instance/VersionPage.ui index 14b7cd9f9..74b9568a4 100644 --- a/launcher/ui/pages/instance/VersionPage.ui +++ b/launcher/ui/pages/instance/VersionPage.ui @@ -109,6 +109,7 @@ + @@ -226,6 +227,14 @@ Replace Minecraft.jar + + + Add Agents + + + Add Java agents. + + Add Empty From 6a51eda36171d58cff9d66f4c7a2172f32fa2314 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 23 Nov 2022 19:53:55 +0100 Subject: [PATCH 0313/1149] fix: force bundled libs on win msvc Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c0e5b50a5..4dfb45d47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -230,7 +230,7 @@ jobs: - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}} -DLauncher_FORCE_BUNDLED_LIBS=ON # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix) if ("${{ env.CCACHE_VAR }}") { From 4a1d08261408b63308dc1164c687e53c4f1fd08e Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 25 Nov 2022 09:33:05 -0300 Subject: [PATCH 0314/1149] reafctor(WideBar): connect to signal instead of overriding menu method This makes stuff more standard and closer to what we do in other places in the codebase. Signed-off-by: flow --- launcher/ui/widgets/WideBar.cpp | 13 +++++++++---- launcher/ui/widgets/WideBar.h | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/launcher/ui/widgets/WideBar.cpp b/launcher/ui/widgets/WideBar.cpp index 81c445cb1..428be563b 100644 --- a/launcher/ui/widgets/WideBar.cpp +++ b/launcher/ui/widgets/WideBar.cpp @@ -38,7 +38,8 @@ WideBar::WideBar(const QString& title, QWidget* parent) : QToolBar(title, parent setFloatable(false); setMovable(false); - m_bar_menu = std::make_unique(this); + setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); + connect(this, &QToolBar::customContextMenuRequested, this, &WideBar::showVisibilityMenu); } WideBar::WideBar(QWidget* parent) : QToolBar(parent) @@ -46,7 +47,8 @@ WideBar::WideBar(QWidget* parent) : QToolBar(parent) setFloatable(false); setMovable(false); - m_bar_menu = std::make_unique(this); + setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); + connect(this, &QToolBar::customContextMenuRequested, this, &WideBar::showVisibilityMenu); } void WideBar::addAction(QAction* action) @@ -167,8 +169,11 @@ static void copyAction(QAction* from, QAction* to) to->setToolTip(from->toolTip()); } -void WideBar::contextMenuEvent(QContextMenuEvent* event) +void WideBar::showVisibilityMenu(QPoint const& position) { + if (!m_bar_menu) + m_bar_menu = std::make_unique(this); + if (m_menu_state == MenuState::Dirty) { for (auto* old_action : m_bar_menu->actions()) old_action->deleteLater(); @@ -198,7 +203,7 @@ void WideBar::contextMenuEvent(QContextMenuEvent* event) m_menu_state = MenuState::Fresh; } - m_bar_menu->popup(event->globalPos()); + m_bar_menu->popup(mapToGlobal(position)); } [[nodiscard]] QByteArray WideBar::getVisibilityState() const diff --git a/launcher/ui/widgets/WideBar.h b/launcher/ui/widgets/WideBar.h index ed4cb3c71..a0a7896cb 100644 --- a/launcher/ui/widgets/WideBar.h +++ b/launcher/ui/widgets/WideBar.h @@ -24,7 +24,7 @@ class WideBar : public QToolBar { void insertActionAfter(QAction* after, QAction* action); QMenu* createContextMenu(QWidget* parent = nullptr, const QString& title = QString()); - void contextMenuEvent(QContextMenuEvent*) override; + void showVisibilityMenu(const QPoint&); // Ideally we would use a QBitArray for this, but it doesn't support string conversion, // so using it in settings is very messy. From cbf4159c7e21c0dc70e36db5bbcc4162c72f31b5 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 25 Nov 2022 13:54:13 +0100 Subject: [PATCH 0315/1149] fix: add missing shortcut icons Signed-off-by: Sefa Eyeoglu --- .../resources/breeze_dark/breeze_dark.qrc | 1 + .../breeze_dark/scalable/shortcut.svg | 15 ++ .../resources/breeze_light/breeze_light.qrc | 1 + .../breeze_light/scalable/shortcut.svg | 15 ++ launcher/resources/flat/flat.qrc | 1 + launcher/resources/flat/scalable/shortcut.svg | 3 + launcher/resources/flat_white/flat_white.qrc | 1 + .../flat_white/scalable/shortcut.svg | 3 + launcher/resources/multimc/multimc.qrc | 3 +- .../resources/multimc/scalable/shortcut.svg | 157 ++++++++++++++++++ 10 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 launcher/resources/breeze_dark/scalable/shortcut.svg create mode 100644 launcher/resources/breeze_light/scalable/shortcut.svg create mode 100644 launcher/resources/flat/scalable/shortcut.svg create mode 100644 launcher/resources/flat_white/scalable/shortcut.svg create mode 100644 launcher/resources/multimc/scalable/shortcut.svg diff --git a/launcher/resources/breeze_dark/breeze_dark.qrc b/launcher/resources/breeze_dark/breeze_dark.qrc index 4d7a69b21..97434abc4 100644 --- a/launcher/resources/breeze_dark/breeze_dark.qrc +++ b/launcher/resources/breeze_dark/breeze_dark.qrc @@ -27,6 +27,7 @@ scalable/refresh.svg scalable/resourcepacks.svg scalable/shaderpacks.svg + scalable/shortcut.svg scalable/screenshots.svg scalable/settings.svg scalable/status-bad.svg diff --git a/launcher/resources/breeze_dark/scalable/shortcut.svg b/launcher/resources/breeze_dark/scalable/shortcut.svg new file mode 100644 index 000000000..2f24b8c08 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/shortcut.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/launcher/resources/breeze_light/breeze_light.qrc b/launcher/resources/breeze_light/breeze_light.qrc index 7d9d99f5e..6d868b183 100644 --- a/launcher/resources/breeze_light/breeze_light.qrc +++ b/launcher/resources/breeze_light/breeze_light.qrc @@ -27,6 +27,7 @@ scalable/refresh.svg scalable/resourcepacks.svg scalable/shaderpacks.svg + scalable/shortcut.svg scalable/screenshots.svg scalable/settings.svg scalable/status-bad.svg diff --git a/launcher/resources/breeze_light/scalable/shortcut.svg b/launcher/resources/breeze_light/scalable/shortcut.svg new file mode 100644 index 000000000..96def1f8c --- /dev/null +++ b/launcher/resources/breeze_light/scalable/shortcut.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/launcher/resources/flat/flat.qrc b/launcher/resources/flat/flat.qrc index 508e0a9f5..a846bd2dc 100644 --- a/launcher/resources/flat/flat.qrc +++ b/launcher/resources/flat/flat.qrc @@ -35,6 +35,7 @@ scalable/screenshot-placeholder.svg scalable/screenshots.svg scalable/settings.svg + scalable/shortcut.svg scalable/star.svg scalable/status-bad.svg scalable/status-good.svg diff --git a/launcher/resources/flat/scalable/shortcut.svg b/launcher/resources/flat/scalable/shortcut.svg new file mode 100644 index 000000000..83878d19f --- /dev/null +++ b/launcher/resources/flat/scalable/shortcut.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index e11d63165..b0759d8fd 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -35,6 +35,7 @@ scalable/screenshot-placeholder.svg scalable/screenshots.svg scalable/settings.svg + scalable/shortcut.svg scalable/star.svg scalable/status-bad.svg scalable/status-good.svg diff --git a/launcher/resources/flat_white/scalable/shortcut.svg b/launcher/resources/flat_white/scalable/shortcut.svg new file mode 100644 index 000000000..b419a77d4 --- /dev/null +++ b/launcher/resources/flat_white/scalable/shortcut.svg @@ -0,0 +1,3 @@ + + + diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc index 270dd0099..9741267c2 100644 --- a/launcher/resources/multimc/multimc.qrc +++ b/launcher/resources/multimc/multimc.qrc @@ -313,10 +313,11 @@ scalable/instances/bee.svg scalable/instances/prismlauncher.svg - + scalable/delete.svg scalable/tag.svg scalable/rename.svg + scalable/shortcut.svg scalable/export.svg scalable/launch.svg diff --git a/launcher/resources/multimc/scalable/shortcut.svg b/launcher/resources/multimc/scalable/shortcut.svg new file mode 100644 index 000000000..549c37246 --- /dev/null +++ b/launcher/resources/multimc/scalable/shortcut.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + From bae0a0530bd5334a2f41ed234a20a064b5245232 Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 25 Nov 2022 11:51:08 -0300 Subject: [PATCH 0316/1149] fix(RPImportDialog): allow changing item size to accomodate wrapped text Signed-off-by: flow --- launcher/ui/dialogs/ImportResourcePackDialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/ui/dialogs/ImportResourcePackDialog.cpp b/launcher/ui/dialogs/ImportResourcePackDialog.cpp index 7a2152b71..e807e9265 100644 --- a/launcher/ui/dialogs/ImportResourcePackDialog.cpp +++ b/launcher/ui/dialogs/ImportResourcePackDialog.cpp @@ -24,10 +24,10 @@ ImportResourcePackDialog::ImportResourcePackDialog(QWidget* parent) : QDialog(pa contentsWidget->setResizeMode(QListView::Adjust); contentsWidget->setSelectionMode(QAbstractItemView::SingleSelection); contentsWidget->setSpacing(5); - contentsWidget->setWordWrap(false); - contentsWidget->setWrapping(true); - contentsWidget->setUniformItemSizes(true); contentsWidget->setWordWrap(true); + contentsWidget->setWrapping(true); + // NOTE: We can't have uniform sizes because the text may wrap if it's too long. If we set this, it will cut off the wrapped text. + contentsWidget->setUniformItemSizes(false); contentsWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); contentsWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); contentsWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); From 81d84b8d0209e771fc55bbcff696d61c7cfb3cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Sat, 22 Oct 2022 15:43:53 -0300 Subject: [PATCH 0317/1149] initial icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/resources/instance_icons.svg | 1411 +++++++++++++++++ .../multimc/128x128/instances/chicken.png | Bin 6369 -> 0 bytes .../multimc/128x128/instances/creeper.png | Bin 9046 -> 0 bytes .../multimc/128x128/instances/enderpearl.png | Bin 21425 -> 0 bytes .../multimc/128x128/instances/flame.png | Bin 6226 -> 0 bytes .../multimc/128x128/instances/ftb_glow.png | Bin 12708 -> 0 bytes .../multimc/128x128/instances/ftb_logo.png | Bin 7883 -> 0 bytes .../multimc/128x128/instances/gear.png | Bin 18321 -> 0 bytes .../multimc/128x128/instances/herobrine.png | Bin 4937 -> 0 bytes .../multimc/128x128/instances/infinity.png | Bin 8012 -> 0 bytes .../multimc/128x128/instances/magitech.png | Bin 23097 -> 0 bytes .../multimc/128x128/instances/meat.png | Bin 10583 -> 0 bytes .../multimc/128x128/instances/netherstar.png | Bin 14062 -> 0 bytes .../multimc/128x128/instances/skeleton.png | Bin 3673 -> 0 bytes .../128x128/instances/squarecreeper.png | Bin 9136 -> 0 bytes .../multimc/128x128/instances/steve.png | Bin 4312 -> 0 bytes .../multimc/32x32/instances/brick.png | Bin 2388 -> 0 bytes .../multimc/32x32/instances/chicken.png | Bin 1181 -> 0 bytes .../multimc/32x32/instances/creeper.png | Bin 1524 -> 0 bytes .../multimc/32x32/instances/diamond.png | Bin 2444 -> 0 bytes .../multimc/32x32/instances/dirt.png | Bin 482 -> 0 bytes .../multimc/32x32/instances/enderpearl.png | Bin 2120 -> 0 bytes .../multimc/32x32/instances/ftb_glow.png | Bin 1747 -> 0 bytes .../multimc/32x32/instances/ftb_logo.png | Bin 1607 -> 0 bytes .../multimc/32x32/instances/gear.png | Bin 2414 -> 0 bytes .../multimc/32x32/instances/gold.png | Bin 2366 -> 0 bytes .../multimc/32x32/instances/grass.png | Bin 618 -> 0 bytes .../multimc/32x32/instances/herobrine.png | Bin 1034 -> 0 bytes .../multimc/32x32/instances/infinity.png | Bin 1714 -> 0 bytes .../multimc/32x32/instances/iron.png | Bin 1772 -> 0 bytes .../multimc/32x32/instances/magitech.png | Bin 2646 -> 0 bytes .../multimc/32x32/instances/meat.png | Bin 1514 -> 0 bytes .../multimc/32x32/instances/netherstar.png | Bin 1942 -> 0 bytes .../multimc/32x32/instances/planks.png | Bin 2299 -> 0 bytes .../multimc/32x32/instances/skeleton.png | Bin 696 -> 0 bytes .../multimc/32x32/instances/squarecreeper.png | Bin 1623 -> 0 bytes .../multimc/32x32/instances/steve.png | Bin 969 -> 0 bytes .../multimc/32x32/instances/stone.png | Bin 1866 -> 0 bytes .../resources/multimc/32x32/instances/tnt.png | Bin 378 -> 0 bytes .../multimc/50x50/instances/enderman.png | Bin 2429 -> 0 bytes launcher/resources/multimc/index.theme | 2 +- launcher/resources/multimc/multimc.qrc | 74 +- .../multimc/scalable/instances/bee.svg | 253 ++- .../multimc/scalable/instances/brick.svg | 37 + .../multimc/scalable/instances/chicken.svg | 102 ++ .../multimc/scalable/instances/creeper.svg | 37 + .../multimc/scalable/instances/diamond.svg | 30 + .../multimc/scalable/instances/dirt.svg | 46 + .../multimc/scalable/instances/enderman.svg | 60 + .../multimc/scalable/instances/enderpearl.svg | 43 + .../multimc/scalable/instances/flame.svg | 30 + .../multimc/scalable/instances/fox.svg | 397 ++--- .../multimc/scalable/instances/ftb_logo.svg | 36 + .../multimc/scalable/instances/gear.svg | 90 ++ .../multimc/scalable/instances/gold.svg | 30 + .../multimc/scalable/instances/grass.svg | 52 + .../multimc/scalable/instances/herobrine.svg | 96 ++ .../multimc/scalable/instances/iron.svg | 30 + .../multimc/scalable/instances/magitech.svg | 55 + .../multimc/scalable/instances/meat.svg | 56 + .../multimc/scalable/instances/modrinth.svg | 45 +- .../multimc/scalable/instances/netherstar.svg | 33 + .../multimc/scalable/instances/planks.svg | 30 + .../multimc/scalable/instances/skeleton.svg | 69 + .../scalable/instances/squarecreeper.svg | 49 + .../multimc/scalable/instances/steve.svg | 108 ++ .../multimc/scalable/instances/stone.svg | 30 + .../multimc/scalable/instances/tnt.svg | 95 ++ 68 files changed, 2928 insertions(+), 498 deletions(-) create mode 100644 launcher/resources/instance_icons.svg delete mode 100644 launcher/resources/multimc/128x128/instances/chicken.png delete mode 100644 launcher/resources/multimc/128x128/instances/creeper.png delete mode 100644 launcher/resources/multimc/128x128/instances/enderpearl.png delete mode 100644 launcher/resources/multimc/128x128/instances/flame.png delete mode 100644 launcher/resources/multimc/128x128/instances/ftb_glow.png delete mode 100644 launcher/resources/multimc/128x128/instances/ftb_logo.png delete mode 100644 launcher/resources/multimc/128x128/instances/gear.png delete mode 100644 launcher/resources/multimc/128x128/instances/herobrine.png delete mode 100644 launcher/resources/multimc/128x128/instances/infinity.png delete mode 100644 launcher/resources/multimc/128x128/instances/magitech.png delete mode 100644 launcher/resources/multimc/128x128/instances/meat.png delete mode 100644 launcher/resources/multimc/128x128/instances/netherstar.png delete mode 100644 launcher/resources/multimc/128x128/instances/skeleton.png delete mode 100644 launcher/resources/multimc/128x128/instances/squarecreeper.png delete mode 100644 launcher/resources/multimc/128x128/instances/steve.png delete mode 100644 launcher/resources/multimc/32x32/instances/brick.png delete mode 100644 launcher/resources/multimc/32x32/instances/chicken.png delete mode 100644 launcher/resources/multimc/32x32/instances/creeper.png delete mode 100644 launcher/resources/multimc/32x32/instances/diamond.png delete mode 100644 launcher/resources/multimc/32x32/instances/dirt.png delete mode 100644 launcher/resources/multimc/32x32/instances/enderpearl.png delete mode 100644 launcher/resources/multimc/32x32/instances/ftb_glow.png delete mode 100644 launcher/resources/multimc/32x32/instances/ftb_logo.png delete mode 100644 launcher/resources/multimc/32x32/instances/gear.png delete mode 100644 launcher/resources/multimc/32x32/instances/gold.png delete mode 100644 launcher/resources/multimc/32x32/instances/grass.png delete mode 100644 launcher/resources/multimc/32x32/instances/herobrine.png delete mode 100644 launcher/resources/multimc/32x32/instances/infinity.png delete mode 100644 launcher/resources/multimc/32x32/instances/iron.png delete mode 100644 launcher/resources/multimc/32x32/instances/magitech.png delete mode 100644 launcher/resources/multimc/32x32/instances/meat.png delete mode 100644 launcher/resources/multimc/32x32/instances/netherstar.png delete mode 100644 launcher/resources/multimc/32x32/instances/planks.png delete mode 100644 launcher/resources/multimc/32x32/instances/skeleton.png delete mode 100644 launcher/resources/multimc/32x32/instances/squarecreeper.png delete mode 100644 launcher/resources/multimc/32x32/instances/steve.png delete mode 100644 launcher/resources/multimc/32x32/instances/stone.png delete mode 100644 launcher/resources/multimc/32x32/instances/tnt.png delete mode 100644 launcher/resources/multimc/50x50/instances/enderman.png create mode 100644 launcher/resources/multimc/scalable/instances/brick.svg create mode 100644 launcher/resources/multimc/scalable/instances/chicken.svg create mode 100644 launcher/resources/multimc/scalable/instances/creeper.svg create mode 100644 launcher/resources/multimc/scalable/instances/diamond.svg create mode 100644 launcher/resources/multimc/scalable/instances/dirt.svg create mode 100644 launcher/resources/multimc/scalable/instances/enderman.svg create mode 100644 launcher/resources/multimc/scalable/instances/enderpearl.svg create mode 100644 launcher/resources/multimc/scalable/instances/flame.svg create mode 100644 launcher/resources/multimc/scalable/instances/ftb_logo.svg create mode 100644 launcher/resources/multimc/scalable/instances/gear.svg create mode 100644 launcher/resources/multimc/scalable/instances/gold.svg create mode 100644 launcher/resources/multimc/scalable/instances/grass.svg create mode 100644 launcher/resources/multimc/scalable/instances/herobrine.svg create mode 100644 launcher/resources/multimc/scalable/instances/iron.svg create mode 100644 launcher/resources/multimc/scalable/instances/magitech.svg create mode 100644 launcher/resources/multimc/scalable/instances/meat.svg create mode 100644 launcher/resources/multimc/scalable/instances/netherstar.svg create mode 100644 launcher/resources/multimc/scalable/instances/planks.svg create mode 100644 launcher/resources/multimc/scalable/instances/skeleton.svg create mode 100644 launcher/resources/multimc/scalable/instances/squarecreeper.svg create mode 100644 launcher/resources/multimc/scalable/instances/steve.svg create mode 100644 launcher/resources/multimc/scalable/instances/stone.svg create mode 100644 launcher/resources/multimc/scalable/instances/tnt.svg diff --git a/launcher/resources/instance_icons.svg b/launcher/resources/instance_icons.svg new file mode 100644 index 000000000..0c2b9e202 --- /dev/null +++ b/launcher/resources/instance_icons.svg @@ -0,0 +1,1411 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism LauncherTODOTODOTODOTODOTODOTODO?TODOTODO diff --git a/launcher/resources/multimc/128x128/instances/chicken.png b/launcher/resources/multimc/128x128/instances/chicken.png deleted file mode 100644 index 71f6dedc54f470a6f8219a427bbabbae1f025a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6369 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 Xlbl-wZ*(y*Ffe$!`njxgN@xNAtADtW diff --git a/launcher/resources/multimc/128x128/instances/creeper.png b/launcher/resources/multimc/128x128/instances/creeper.png deleted file mode 100644 index 41b7d07dbfcc841eb6dded16284b1a49fe4e8b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9046 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

& zA9ud~G>TlK@cYWs_ni0VoIf=Ex*O*JA(aRI;m= z{;ZJ3rM=TEe-u7kCSTLUu*d(?ecvAr+qgSE1h(Wqziav9=RT7!lbsTcMGds~WTd!V zoBQkW2l->Ne;*t^rM|oE&=1AywZ6gs!hZB6?T>5H&*M9(=TO@O1b(RHJ|nU0(3hv_w>H+#m#NcW zK5>Y>NYLRx`~R>e{>pXiHA~jLgnm}XvnRQ3X69-1 zuYE9ipWOk`P48Xn78ov4_%HIX{VSv0&E?z*pa1V@kUY+~$zO(T{-W@ZsKzxMr8x%_ zx;9ULxP0{_m1H;d8gWtGUq3QW@1Osnc&~#QlZ)l8hnF3G=<&oyCV%wTnt1*z*Zdeh zPk$|24kxaa+d~-M7t*aXR2#!jJ%t0)9gIIr{r<$}k?x-zI@)1O-)*-Z^xs}k zddU3lk$v9rP49oK=KQGp;qfe|o%^m$bqEV!Ia#~tqrz=}u?P2gS^4hnv}UnO{I7f? z;D<_#ZR2_;hD~h&ahzY~OYOTO<)kF_rMW)bCWE1-pyctoM&4+NsyxN)_@~o9Fb7Ef zyT}*s%C>Yy&Z`~KWysw{@o2o;M+Ir)G3aI%erTtUE%g^cRGXJmGXn`)-~FBe*X?xH!WdE z{c+L3>cQ%Z-~Xvuu6Vtp3Ix<{SN zns$NFUT~4~{FZyaH6Oiah(9&A{l3eFe;?X!ySlPBw+I_NKV zt)*rD{PNHBonbo)lSF&Mk5u&TH)dVR)4X0eg8xU5#O*e%Qyav8s<)kwWiR<>_QT<0 zTEH3I!?jHF+YUa@3=!DWwdr%=(&vnF$FDCvuleeP2zzzZIhj8{jufsrkoPa-Yqy!N zR{fk$N9|4bzHZU)nd%(YEi?D>fy_hd`b%Q=^*&fsBhgXOQoo70&!7YKaY`#e5&zt$(1uibn|IbtVzn@AeV#iYO^X@;#Dd|CJ(G@NH zoJC1L*xoVxILJ|Ts9fQSp4k-p!+di&*)u*|cawekfLoPYVDH1*t+ETG?Y^f!+LhtL zm9cT>O}&PPpWo;G_!hyo�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 diff --git a/launcher/resources/multimc/128x128/instances/flame.png b/launcher/resources/multimc/128x128/instances/flame.png deleted file mode 100644 index 6482975c494e02522f34a10894bb434f1ccc7194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6226 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 AZ~y=R diff --git a/launcher/resources/multimc/128x128/instances/ftb_logo.png b/launcher/resources/multimc/128x128/instances/ftb_logo.png deleted file mode 100644 index e725b7fe4da31e42ff795a39a8b41a373f96a1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7883 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+Sc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<|FJUm?-Ln`LHjjf&$<2v>K-0I!cRdSV+T3A{H3~QFq1CJ+%V*kuDDl=!ES-t!H z+RgQMqHAAYTMIJx*q1k7e(wAAtMqm0tMKK1bBkBanju*#wKwJMTed5i?}KC+7SDOb zAn`PW{eZ@DD+V{qtBeMxR`N9j`js;D6s=-Tm=a8?k}LP}4kTn=JXM^p{z3j1+lE(1 zAIrb#ug6~lQM|tCH5jH|f7E5kkW;b9QSHZi7nhjsNeM?79Qf=Q96nr(NebHdU~69a z!)pEbeUBXfY;`^$KcV%seWm)NPe!|@&;PJIn~|YdE&BMKf-8TnJb5#H&6HBJhPETW zBsMcHdAL?4iz!QjMVXCZQs1AiD}8zFL=0vhj@rMP^~_GfNzQ%z+|iR9>tJ>9zDN_y(8g4?HT z_4TX%L|5Ot^R=?<2w!sCp(mNo{pNG|2Q7K%s~4*NVRumUuLB(n4NfkageKTfxsrHdJ6F`E3;WMNRW5Mwx$8uV#pr8J|-x_v)>PT!_?_e15w9c}_WbN9c0 z_<>QtQS9 z?t2F|Pja{OWytv4fA7}2C*0!l1qavsP7L($^zlD)hHXR8w6+y`0mUYdR2U@OThrD) z-nRGm<PGzQ&es)4hA4F=4}1#&A~yh6w^Z zru7y(TV61@ef!GrrZjwA#f}S;>!Z)+r>^}j{i*Ghd{`Q9Q96_!|2lSH z+rR%>QOv<6J5$g7*yvSV@-nd4WD>7YCf?aVc$^HI>Pfm%%k!?M(a8Gww#l zF6U~0z15Ddl{{%|ZxqcavZr&N0&CN!kh_jd-qSTK8Fub7o$HiHtVP|V8aK9Q5f;l?I+hK$>LrLQqWu=}rC#SnNqy4WOW8pEag=XbxE z_gElq`O|Mcc|V^#Sk2%Wzz|u*th(}F&DXs;{&(e8d0tz&c%|CZ1B#Ow4sTf|$RP85 z=26M)Usq1*MFy|+sR~<_dB-wr)x#@>lhb5&E`Ka*dHCwVf&~(}e>TL{0U$4*X{$qYVC@-r8kO=Fa)c$V6}F7i{axxhW9SIzqDEDR60++^;z7WCd6S+S|6VO%U~t(g5d(&qVQIM z^K1X#I373i=MmwZ0{hz-L_`@IB4v)rFge_r%sF33o8!6W#e>f>+0U|mkUFFkDPI#A zQ^?toU;1*I*|Q=sb2Go|x4r*8pCA+R`cf$WUfF}sbs9Js(th2apUU{+?d#X^m6trf zi?{6f+-gvR{(raLf6ts{^lZ=0ty-hY_I$Z< zHqTqQ(`niqug;ul9oTuj%c$vzfZA#`1XCT*Q@sY|I?r9&9yFn^Dp_> znXMgt8C%w5bKE$8!%e}y{^q7yL59%l%3UQg39**-|Gxa)baVfCfw|d&x*jj;b|?IM z)bxCQeT?>MC50(04kx6RFHK%w|0(`W$+POh%DaaSoYjx7Ki1neKS|s6%jWC8lGd-A zpD!`$o!*$?cBi;bbI;F>)pi@6F1`Q0Ns=MUpq*9W>%VrpDI5*G^J4?W7^WD#73CJU z6E}}IGbjGTA@1Lb5wpI;woX)I{&L~t@%Vcgk=G9u>(4%Mmb38Q$J5j8GqkqL2u#_{ zdu4l~7{lzld#3JKd+K>kg`2cwjAHHEnLD<8Ys@d-_i3(i{kC`g+jVrle7|$J>2d6i z1gZKb?avioarJH8t3Ipo^c)i|ejSEw9*-K$IX0cwk{1fLo?w^w^HcS`H?OP?izWs8 z+$?K*5q`SQ_FIX>p8ltA&ImCs5M5AqhiyXALp7!Yh1{7f%{tNotSz&;_LuMZClXfk z{jvGmdmnBskJz#M(W?_ZGj}jtWSDS6p@-`YgWEKT9|_h@0W}jk8?M!x-ddp|e=dG+ z)!DPJug!hNvC($fpORyn>Z*<_w)?nT`5hs|^3;Q&_M5o%d#iPZR^}5Jm@`|Lb*`Q} zt}3d+n_d4iKY!caUq@OGmG1H_4Y0E2zo@amg3}@O7t^VSo(xQV{3c&j8>C{QvV>j) zZF;z{ukX&UdGn+ntBU(ur(Ieioxs=S$>OLw%^`M6lnz&?Z26oCEElFXiZn5LXL`1U znlfZmJohip$*F#N(fej;^%tu(KHoT0+LKo2vUmUZ*7d|Rc&dgXL&uVU;`KhUOsfJ9 zFI)0ivH0GrtM%_n?}`?dE@{}TUiDOJX@U&LDkE0z>#AZ*8&95GF2IsL>qv=AvS;Nv zwh49LKkmN&?%t1IvQ@GTrkSVy^vh>x+}B{WP*iZSE{N*tdaCw{;a+i8!^+HtJ^z~-6tjY4{Kl)lR=SZhT z$hCjJW~p=6#%h19I(F9Tna2@k1(!UhfDBGqhwFE`Yd+}ucnUe#t23;fU-Ui6%hm4A zzRJ(>vd``oe)aKQ?(h4cIgmw#so|`W;fFrXf<=4>4mmZrDM-{v?g`X#T~mE~-roPe zby|djSdRP8?cTuA%YDQnjA`<8hPmuT2{BXjg133kWyqS-D3>qs{K}(yPKmKGw!YhH zxwLF%hMW`6(i8d z@^1`kTyXr}%7x*~r=I`$weuh;djR)4?iEr&|O%b4clJg!_*SQ-{GJ0@xGeB2l$niipO z&CBo*OVgaomoMJ_d9Aq7$>oa0*B|H4IV><)x&G;GMy+V3E{B9?6|NByl?jiUJK445 zKQVlI-0`h*_44zjtwgpLsUiCMkS-hG~sn|aHvC#X}qoRvRw>Lj}^|EwM zEJxb@DGaM(Rh*jdvi%ZLs1$F=Xz88zg?Y-dn+v;+PEfh=>&o8k-0J(CcjWo6$~<(? z%RSlmP-lZ~JUhqUFpW^3nt-WZmt8bJEoyvmVMkS&DA!t!+reJ*{G@zbCVW}P=%mth zc1E;~(6*@u9){a)lIU645b<^TZM)Lh|E#AtzK!~xlzsjCIlH_6b-vu68j@4IXoh|? zLrYNwgNNRvt?PX>*RdY0tF8U@rBLj1$z^B0&-3JS@BcGdPW|q+UNg z=m1Mo0w=@qL+g8D8!Y1&yqA!U^AmIoycg{noX+s)!<(DxOBz1=o(^fOeC`{)&8Fp& z_X4X-h7e8$MVC!1E9P{}Or7nsBJ?Y>EJKz>S4 zd{oT=#+hml+6y=TudlA2zU5hwQQU=;sQ#s^7B>l(HaK>Ku*p9-9ikw~vTLGe+{HAm zJsLql0U47_ymK}SJWyn7SmJK?p>Z19qTi7nk!|yj?rLn5kNNv^*N{_DMatN+!Wo+kRC$G)(6K1WmHR0fUucwdGD^Q|!fI{G`- zIBuQ4S~e(o2P@MC56(m$9^btDooBDE_@cKUr>f#u&qrQf-umxH&dd~Nwm5qwPW;BV zlJM(G%eQUKbt`c33tOJIv~-^9tkA7|3A__oES}7-D-~(pr=7mAKC-!|HF&B+Y1`}l zFVBg6wS52ZNbUm#Rfj`D3L}4 zk(LcNFUT?G+<$EG{qF61|8}QWSIMx5C;hZ{Z%R&fRQPGIM@S)(eF3w5{p%Sar}w>I zT=L6g+najU;$<_gmZ~y5Su;(&;Y#FMx0|c19OrmjMy5+HIq*%^urNh-ieJ6nzDtXa z7{C8NBV42*eOK)FrMGY2p1%Iw+pQ0dMwlqpNO^v8-nwGeIggeVS`0g!4)`Txq@7ZH zF8}B1(&y8)+!xvEEWXjSXREQm_f5vHru9#KU$TC7p0q^KQc(@ghE*MnJH;+cS3EV} zD(%d)t9$q6a#&aWIj*EvHd&fTer{J zr}DIR+4k?ZM2gR;No8zV^G|KT{)3y?q;jp(qr(z-!5sy8dwt(&iVb8oeD(@lN$=w9Uu{Hw$!-@5jS;epY{xdz!Sw{=@CyDBg$ zu}x&?I9big?CWB}+P0(op_SO7?|+V2nksFU3EU!n&_IU4!-$pnz@u&3o^q_4{_^wW z`t-oU334n4!hPpjrIx7`I|*N0DY@u;qlfI`5bleS^X2US33Jby{r-1a_G|rb7JX6) zi>vsqsw!-&yvoqPGHL38n%~RZxBY*(YyR)KZ-XcC6bT$qx%FRuy`80L*{5=cYZs05 z*>^Ko9{41(PVbfQ_nn*8ell-!m@_$PL$%q%T}%Dky%$fF`=Yrtc%%IGZQIHiD`XB# z4)>k+XL9AuH@v*lO1r}5l{VzY7roz-d0hA9t6jfNzI&(J;U+w@q``xK^=^3wg`2yd zWqw*!8PwLHxl(!S*X{B38?&E27GL%8{|CK1GuFUkg;sgj+V{)Ms%Y?VRXug(w|u#U zn;UOBqsg6H_x3$)`hIWslDmb|W}M1ZvHG*9@bSC9F5ahIGRhSdYr>4K)K6X2&E@9Q zV=K-WZsXWou%mdzz>KQFsH@hJCMZ#RirH-kS z7>-WJpDP~VFoD@Fs zL)^-Y`{Ay+8`gYuYFTppLB_`=nVDX586TLW=`bbESIJk%@!8^+x$CmkO3i+m_0JeL z&e<*{U#m@4=7==7M97RtAg5 zUcB|oMYVTD9;b#Pqey$-8gKR{JLQ~*PxkEo!MfT<MaMsFzBFGmw4Al7Rjco@(!wv1F@I`apPO6%uIz63qgONCN=_e|CYCAN zGpA4L&A|yv=Bby*RZCsmD)md7`{8^xxiyLRl$DsKUkE(qRadCNcu0uhLhct&#|2d> z1sU=GbK>vcE&M8A@c7WPXQu^Yt&(rso;jz$=pwlO*e*|H{y%QJ4(-lh|L{)oQgEco zM7EV)tN>cDmBy5AGq)WeFixfXe^aj|S%cG5SfazXpi z)oOW{C#`(Nv66k)?(1{z-MEn{+-n|s#i!)xQem|}-;VDt-@p2*cIDw$GeYGBCW#1& zRGMZRTMvZqddFW{hU&AdC{P)A@BM|jzv7>4~06~9&WXNLIenkzhL<-VVB zc-~nj{>?#>uVzkYb&#TTiaxVhCx|cZmO7y1e(EJ$K{7(~b-bj1A>G-kd+WDD0sdQs z7&><|)XVle@9+BKz|?ZvO+)bEWQSi5Rx5?FIxe}%ao#DEXZ7vXNhO-hPg|zEKHZRM zX|mP!(Z%S=r*-WQ^zHWM@?ie_(9<;bCpOI|eniDG$ zFBJK{UTOE^)q)iXmmL$hwtnN%*vs7^u}VO8j*49Cl*9MGeBJxhNLv3)LfVoU{4*!} z`8#~^sB&pv$;FV@Ioq&>qfx<6Fr+czN=;x}e6-?S;}uN~qCeG6F8O^iwazI-P{*iv z!fl7(F6L&wrY3EdH(M>wFfwhZ&EoWTO24`ki77Vz&LN zeT{9g%&aYik^AJl1E!htYTOnO32)1^USrka)3&H7;hkSri1Fv&4?Gz}uLO1KN^M@X zjYX}JIr-bC!WZf+5ASI)>{)dtJ9VeR1@?UlrmWU(T4uXjbB|U`#ZTdbSH3-ZU@U(4 zVB>}*liupy^Pdy)T<)1&i|^T8Da-~eUJ61|3$KWnXP5Gda`3mznOWpED`vK*vA4WW zV_LcbSHeYBIyVBy~I>9bVCizhXOsf2Sp z$p0>GU~_lVI-gr*-;CDZePZ#~;~)QF#S4rxGCTU(UTREVpOx(ErTkjRV=_~f+*Y61 zon6`fbIvJ!-ngdR;>3IZjk4QK&E?aK=T8o~9d^A|@Z#M5z(=9_jFYAu_{85PviZcM zg`HYYzZaD=DCUX>$}Ya6x%#^7&)gl;7}m-$HEcX{z3|YtyNp)Td3bEPe!R`@SapY0 zC7Oxd)ALkpM%uAP|JkO$rmdRAwz~3g+X5{v-S&0tZ&vp9ZWsC-=~=o~_|ZQz{U0Xh z=E^Z0+~Cz9bo_8>SI5;Q&%HWhd?)KIzvFnhU>-L^!|vlfH`PNmbXY&TPqw;na?hK0 zG4C$6xMxK(NoOewYyY^Gwqw$M)LhC%$y5);+e&?R*`rX9LZ+puRq2-sw8!PXt zL~}Eg7~211KE89cwL#8H>*)~!Q@-{qHatsd!FV z{yp=)w8E_`Z+E@-@mkJ3x#5h(Gq>55NnIIwjP8vuG7S9nm+La!*zDLL{a)x%WJTbS zOcwFfCxS9AFI#^aaD}rl{C;dc*EJ=UCt+fIV(O7aldbPtpO5{vIJL^zz=@%N|6<9u zx33v$L=OD^<|Zw1W83V?ll5F5FG%&b8?A7as$P=p%i8ega<-|&awF#n0y{c9=0v*Q zJ}!JIIjK(COf^^Ir0-HbWktO|(&49>B3?7-mkR6t=D%LM>~i$Jr=fp}9x!fZznF4t z-3&CB^UU0Z^b7{Oq?x*A_+gVn;mScMCbSl5aX7#-ug=2cn4w4haZH}#Vo!E9& zi-V_T!n|!fO%~24+jR~F`Yt=X(9&h^oT6(l62EMc`^qx0X8pasM+!S4x5_uZnBKs# z^QyO3gHWK^(>w0Vo80=>7~cH4Q%to{@mj#%RqN(_?$)}0MZoyyUM_~Ok(Vc0T|Ldt zQZvQK zDE#+m7R-2C^|SE!iAiktOCIl9^~Lqu)2X)@OG;)bWk3BFyw6-Q+HL2mK&@A@_FFw( zz0o)QF^N6PhFSSe{nfu~nGck7dG))8EM30pOKYCEdk<4YSVV=-jLBNR9woiG!uIN8 zsoIAXf~&XsSaFo3a|?WMY@2=ZeTm(P0`tB1e|=h{wpHirUa7qG|GqbAPEd7u>cO!0 z@~`q&2TuR4`T9b-lsD*fZ?t~)%pO0{mUJb7h^J5Tmu)bs{X6~s%RParOXTh-Rj$tZ z^GnuI@oc?@AKS}iZjuQHIrvOgoPQ;FU@A-56{(kRul{CdVP5p7qw}kp*B{eg z@%3dxk-)R{ayvs}CY3(jCB*RJ)ZAUqLoTj3eq-h9DK%<#`|?sIaMexTVtiC;RZaKS zv)U<>der{CZubc(SebM`!rzi1K-cP3!Ym#CtmR*AtS-ALafGC;YF=O0cUx%lH2cg1 zpVQs5{HHG1mC_mU`^oCe?718asvDegTSU}@P6kR&+_LO-uYXp7?j$?Gkh8H`o3hp@ z3a~c3tX*mK^}L$rB$ZI1TAinQjLXh#{#3h@D|RK{l$;Ou7R=~mV0n9u*Wszgwy7mS z)5Vra%1Kt-{HC(%hzQS&?T%ARqH@>#+P7rIDpsQi=BL?0{B23q((1N8r#)P4)|kjK z7?f|jv^M4{@BQc{jSltmzr?DBba5`b&wh0OCPoGcM+1?N9EY|1`<5g=a$YKubS_u&5g6WE;C)Qkk{erQwkhA4e05Cy%3! zaYLK&-Ob;^?#9NRzWr`*<-dOg_gAl4w{F$CSMwIK-0AB1{_5WEcV}(>Pkx><&*u3O z&qvZ94UC-`w%@j6X0B}(I<;@&t*cG@7TWsTW!f;#u}d|-^XJF1|Ni+O4;-H_>hHJD z{$q=p{?E3gwtNXTgEJ1o7v?uyUf!$h-m~*Lk6h!snbSDqb{QnLv76aG{P}hLcRBI% z4Bz#;rf%91m=gcbNiq#FjQ-JmShR3UN!YpW*5Ih*mVAcH52a@rviHtY z@4dYImRx;_;+!|KoQI#sb!Mj3d(18TkSHrse0c}wnMO9{=17S?GXp32AWa7Etvda3 zr(Pt^sE&#KG)ej8)tlVsw3iy&zn5Ox_~V!AqwBiNG3<8BdzOnIJ~>q>thoK~ipWzz zxrUnOcgZeV&$D=wl7?IGUH%J>3-b=HpZ(1^waM_=%nwTf`fVfBc|VF=+HvyPC$;FD zOJ^p=eSUPv`<&pM;{`u{r8T{=FJaAl8o@6ASd+<}vpn?k#`-A{;l9@-MJk1Z@)n+3 zZIxDe^X!w*BRUa0j=sraJhP5O1A?O@)xfwW)LCqB+&S z-M={J_a}>kp%FhiDq`|x)Y=*yygrv@huoj#Ozz@`V!e+{oE|B9ta4_cNuyG>(@dsT z^HRaonIC+Vv@{damZYfUA7{~=c~oN-+nqZ$I~QKDC^cBWXz41++ZNh6HgeZO{USvd zKYjM-;iiSvrW-%>RQwVC_tiq}$F4~XuP^UWSGWBivLn0Gf+IBUxQ_nokg(+UE>Gub zMLHa_CRm*th`l)-wuAV(lvt;8k zZw}Qw*1(;U(k&R53Y_Ul5WB0(+B}6}vWL+W2i|~YH?hkTX4!O{k>a1Jc}3aynGx86 zTaFL3Y`!h2-)nfVUV!a}!m;xD9G3qte;OxPVt#awq7c=$bIW-o_zbzdFn)vT5|qx{m2-4?6P z_pVntwXyhLi$!Txmd&l5wae$tyz@Qa_s)YCSn_R*_dMj;aBa$2v0cX-mOt-tZ%99% zz=5(<*nlp zeCj*rMltWsher8J>$Evl9_j@c1)dI-lsaV^;I-OuU(?al%BaGhS$Wsiw>=JwYhU#u zE>CaS%_FBA56)-GZ(ALHd)r-Z9lfphpMUS3u9j<6;TmJB^3G!Uw8D88t&D3z^0yrQ z$eY~YTUOb8na#Z?UHlO9(KV)#*JrIU*w1=S?9>#zb#FbV@(H!Q_Y00s z^eCDv6`-1)bBV#U_GDPo^3)V>ud`j%F=vyFSFAEQw`P^`do^j^rB@pZCHCAm=50G> zlVOl|dk4!k&D6b(hc;+SughvY_OONd+|J@hx5ekC%U2!N?aSw2j!B@2TNnJJor%_1>xc@ktRW?uU8zf)wvRHmYGm)uz%jY}9mi5@gs zqIz;#(k9X6uhPZb9w!FhF1Wf@XX(cqC%iB3FzR%;8gu@EtJ>=9nJ3rk^QX>xv}69d zb5lD1$}Fkn-e!&>HXWz@ip6bnp4+a z$DVnij;?|!7e$U8%UGrwq~6KcvZ}PPkWlWqRn?+WSE)RJE@Y!JnJ8e zy+5r}l0E62!djuWUE+gArNMC(pHHT24W2W57$-K%9F|$CAUI)yi$I^|#S03vRQx5^ zRjrvY^SW45|EpPkTE3Ew?;JNd^e`?nYgf@qX}f)*#%HolrR=8*Z(c9AdhAs^weavk zBSZW5HlKSwU+hoHZ&0a-m3+{)^48_=?UUQX9-S%@UH#MMb*!hP>%{gor;bI0rHFB| zWO4V{1U!4&>}DFF7qa`|Dx0chD^|Vfuxj0NVw1=#qbnPkGY_%6vMAvQI~6+P#KFz0 z`TzCqZ%x?S@%mr;>;Lyd_-y|6|I05nx0IMPTYZk(1(zUY8`EAvXW`c_$t>rSw%iK7 zVsTVQfHz95$lO@cH#@KG)@z;YMNY||R!s}<>z}*J%3=Mf^+mjKE#1IV$vYgvIjN|9GC9utv6f=WPERmUXuR*P0kATSOZ8 zN3>YE`Uol?@0{Vfr*ns-SOW`V{-m8VudA)rO%~CXZ=bjH=U&*(s7HmRy!;GneovA4vJ&X?@GUNvYEJipcr@^K3BvapdAbqt!t(#oZ)zr^q=ScX}apO>wE;w4;Zl^(Ul9 zra7KGY$ZG+$Yau(LjTAhFE38zg>2cOm1%*p<)vqw1cS6>P8X&|aA^3lRo^lCFt-xtsb6-cTlAE~n&6{rq;*O?SGKq7E$jQh z6w;8Y#A0*w8k10l?naKC%0kaLBbAoAbodo*7FeV$`u5g3ubWdYba}bVQ8=8(UBmcp z;aqVgRU_v-ze7_~EP9&~Tg~4&=4nQXeGseB*}fnqPjX#{&W)6`e(x1qO)c!qZXR$w z{y|AHazg8|$*CK+v>6s_CZ}FFaAwiLn$J~+2X&1P_&w;K+GP}YBw?=A%Ji`BA8si3 z$9~@B-m%ntir5t8(=l=etUQx^q#Cl^oCJ?GBl>W`ef4rn8Sq zXY}qDn^{-vX5BwkZgQEHf~#X%kYaIUw(*Gr(#F$wvmZ8AezGXk^WC(^^CY<*9K1M1 zGj&2tmQRoGJwdJB36q1Kx$#_4)Qob=>vc1mUKIApaz^BnuSreO(-~&7)s*YbjePwx zbx}v?<+aJzOix!m``W`=WwNsUDBmZ($TPZ;eS(GkZ$nNSm>=FVmsNdw)6ShT;YO3K zizacrYn$Bo^hEcACq|20T1>8P-Og#J%dAk~^!l5kXP>I#8J|;voct192{RvCPMCdS zqLJs!00!32VOm@L7nz!Q%1-wx7VS%CyEv(RNy5ZiLKiok$(S{3r%BRM%{L&|B{f{z zvpaFi|3_Zd4`yqARtj`m6C8cbbbgb3wZ_>Uk=N(+^&GlW?5OsgL$N{n#FoOd2M$bX ziF%+a;p3e0;M1-JTa)&K9oLI#BVaK~i*A%Ywd!NuiOqUfmpr%LyY2bv zY&Xr#F%#H3lw38X{C+%a{{Lg|ef!_i^&i)t`*TiP-s-=z{pJNTZ}pV5p1az2_{rM0 zw;XzT4o`4jqR?S%rn9g9pRv0Ajo+_q^Y!EQz3!{|_~30r|AW)~{};cnsx+y8yK?F8 z_}@RZ`S<>M`SiE=#HO83Jg%)`agMOQ6mBAT+mKl>+=1)&VU7P!Zr8oLxc#f1yv4ll zyZ=9UvparXAL|t%#Z$IYVk-OwGYuuKZL^;#A|g69#%tQoeS%T*_N(nsnCG~C5!bgZ zVhIUvSH)Ssur_>?cKD}X+=aiS)GkKk;d_A=jwF1U1?gXT&$ZE7A=|P zk@xLzd)=G8_w7GR*BAbpxB2VGaQiQ(j@uPlzFmLoX_T)7$J!tB^ zZ^eSull0p}rU`AEv(#~ahJ@a^fQ$3 z#UiGm_Lt-Izi+Vb+3dgf?U&LA{-^D0K28+3tNS)F+>`0f#F%w$Wt_WGnbKMR%$k#Z z@K2XiY-zHgadb{l)XD6x;hWN2V%F|7xc#Q|Va9u&f?p*M7H<2_&u8jtr(u<-_S%SN z^QoL^$DRizuo)(&#Tvi&2;+Equ*1uoy*}z($np5U7qsR7{yhCPrdcKi_DK%OJKfrTwM}~xGx<{J&UG%^Ps{yXRlQ5>b4YN}V@Jb`(D-USR1o$I(vt#f)IC?1T4j ze15)O{P%6fqGfjfZk6x*azsDIv-oTM?*GC3f6o4luX~daarb)Me}4Xd$2J9gZVj$KYR9_B8%;sG z-WbO8hQ^#K`n5N;SFg{_bb>|gt@{>i51Jo7=}tL)cEbtXvSVAn>+o-`JZrbfK)t5# zSo&S3>pgu-lrHG~dL#PhS1xNkd2QUe(|;T;ZakK@B!_Q{|B>1U#V68LUq^AY zE)6-+ae_(Xjp(1Xr|b7Tc>nj_*YZCPX6DzuWRI)(U3q1l&7&+IyJ->}r zIkH1zd#jE~c(B%V?_zmnpoAJ6+y~cdUyF#goTMz1N%6u>SJht&DRS6Gq zc5`!6+H7`D?NqQy@Pb%we*2mi^Z(3jj_-eP=lYRTizL=`9OU})JITO+t@#_HvGK7p zb8elFoH5fl?OD%Z^#!+Y{`_fP{Xg%Z`-ks-|4!~L`q-?$=k22_KUAhPKP}Q%J*B|a zo@TeL7vD?w+ip{L`JTuAqAdFR+8Hx-q^?>BBz4SFy5~~aA=mMYi-mh~ z>-}zgF2Ap#gF}4Y%qfgBH_Ulr>Bc5}xm>h)*G|Lu!#j(Q zbqeo3JSp0QWof{ccb^k;($XTho}_t+8MHDi%W#{-_)VGp-^c3x?|IqwOCAoNUljLa z(~dn0q#5u3sD1qZcI~!f@#p5Y7mFWBw^x5>chBgs?RUw@ZNahm*Ve5)IKS@y@9(uQ z<#zr!_*~x3erA;0oD)~>b$mPPV%Zr6V2SL-@n`O^r%AX83m`C`Tiy=V^1HC zIbN8juEJ+3$3{qa2z-t^q=vCZEp5?{<2_@kT8F8iPR+4T0O zS=@2E81!RBjy^xS_`QK#&FZbw#{{gr6=hgP*|K2S>4{xx ze05m7?!|KZ%0KV_Jy(C+x;vi#L%8^n<@J{=|99nS9b3ryW1jOdTlR-XY>rs$6f?V% z{<`ekPMK#_=5gLl-QFK=nSQ(#x?_(@-Ou}-?EZ%q=ktq5Up>V8_7?Mx)1Oz%|N682 z@5>@t*(+W1S4MBTwfjtrk^@H)%e3^SwDT7CgqU5{vsgY`suY_5q|T2{DArZ#uO z<_X`z!BzO@lgahptKWBvzuP7ILBA&S&oh5DH|Mf9A0u1X-y7U3Vc|Q!kuxVRWlC&J zH>00SldyYFzTu8tT=7+&HE&Zbst;EFx9*u-enaf-E#)8eUv6-p_PwT8)_u=aRQzfIDf=leK+SU2wdb~txk?r&*} z9sF|DyFdPzZ~V@hZ~nigAK&$J*?x;1SigCt@T>!}$``r*9(%%D@mfxOr)KdgjnnLp zLLVIA+}NI+&tu@ZRP2&sieEzF+RV|MTfduLoui?iUN}dp^6@{(IVssc(cXt}Jx&-Ed5Zvs^uFlajbGcQupz zw^I!L_I8yASKrv@ws3Oghhwh`i;BI|HX2qIMLNCHEB45`xzp4qHt*T1_cd?j|NOc6 z>PGf%*8k@9HXoG4i8 zQu(;fR=YX6+7^xvPNe=n{4c)p^vXX|C-1)aGybRZU4~y%9^_kQ)%;kfd*Ht4g6b>3 z%~P9R&%gfmz((aZ_UP>MWl#V97XMaz|D*WxnH4U|nOc7Y-!2lk^6ZLA{<2^DGiQ~F zT{C(1Q^CM0N9SI?&1av}eQDB>b*Gcv*=E=*{L1ubilKS>7roZ1LbHmCymF@(Sg}SX zU*Wyxp~AT{+N-nAU zmf3^%ZJgVJRd4@MD`_~<$J6j2nZM@cxt(kHCf~fQqIPKVPW75!D_fpyd3SQ!QjsU8 zrm#h>vR#~MRAFjVulC``dsUs`rx`@{{C`}6BpfBev?>u{TI$Ln*q z&7PP4I;(dszg(AL?@8C}{O^O;mmTtT8#Pl^&Oe<}pvZ^(zi<=t&G&=H%+)I^lWHsVACAvz8=e zUfytV%S?-J?Ni_AfB*Mk;@ku7A70j*&U}@t^5V(wYCoy(a(5V8%%v_!&p4a+Z#Ki3 zTi1=Oojqp<$&?r*`|E*tIZ7zv9iVcE1B&lC6`9 zP8w$z7bWIeP1|4o;EQ$MvtwUB$#;KVpQH5b$!A^n?Js^-GhNAhXl}hXpZ~nJT59{u zgAZ%w{O`4nx4EIm;M*|Ws8i;9(7atj#wVWZWbR+W?8Kgwu>bV)pkq1C*OYZjBj#vI zl;&x1uA9wzN8(+n)xE7QF}t{zj_(=Q|5#-3ht`AVtzj?x(6`dUNI ztDmlg%eOwbQU1N|{ay3u8$S=n`$jj_*T~mA@ZHWBl~!=#!HTV#s*4n&Rxdi%wDDlT zhE-(=Ta`ZufA}8NUVEV6^)~<0^~K+3F1D}xc29f5wqM~2s!u%Edfqr=Tm1b{OsjP3 z(vX%XJB2q*Y1=5=W#FZKtUxZJ#rXW8$NlPl^YkHTFwu5-dkK3GZ*Ba zp&Pwd-fVX9&64+F3?;mBJOxRYqNQ&YW*RfbJLIj^Im4T#_I(W(oAj%lm#g!_+B0X` z)w@PF^*=a!_v*Rr@=-H>e{FR>t;U((9$a+h$;_Qaok5EZS1s_-+-$QW-P2HMjj*@$ z(y7xPetRo?KJP5c&9-0LL+xr$?Wixb-N`KcVYcU*`D@r0y05B!ws3Znm74b40JciK zJsYkx>HF_oq9gIJI<5Zw!np_X-9CKD|H=Cx`NKi>9>0CO6Sr$i>VDvF`Br_{>cQx?PwptZUWovyBY2x%LWyMCnJgLf?Y05XZ^Pig|*l+)Cj@@1{w{15Cw#a?Fyf$g; zCAU8<6Rb*?WM45}wx<1OkLDMH(z90$LjQ=^Iw$zWylN zuJ_jY)Usy#;Mamr)?Hd6wX)fGT4ei@zBxiC&UWavO3ZoERQM&&M852}-(5lX{$DAd zxo2-P@Ofo6^YwhQd9fVo(}LFgQhfd8(;l-^YAt=8^D3_~&o9k6_CZqI)+bi{uGz7( z-j=Ky=Hb%+RJs4(Jd^HMcEd91d8__Qwhw0?+*N;D<&@|C;^j|fw)#5eAG7aomwfW} z)seRIujBT3FDTave*M7gsf*>A{i**S@vP&~T;99*%{IdpJMEu#liyGOZIf~Df}&^p z6Dye|&hKP;eDAEkab~I7*If%W3eTU^a}^U?X2x_)f}ufuUc+*6=Do@bXMMe4vUpFJ z)+VcxH79pH`y!NiY+-v1+ePCmrjhC$LA}#0TIbxkWAr5OlgFnY5zn>N%bE7qyT5C)V_D4IF^VkVQac=myL-K^VwYl!rGIO;X@BVy=nl9Vp{FZy)>ldv%J+~CM zoyfEfJMO|B?tf{GXR(^BgH^(d1)a@BvPWi$*C}*Z&OC2%ZQ*mv>6?0#-I=(#*XkJG zez2?f*OrTOw+n}dIR{t0F;P7I)KyD!a`pA(H&Gn1!C9sKR}9yLJYE{GE@9?Eod+{N z>=0X-y{Y_3`um%m8}#cv%>@j)Kb*LGTcFr_?*D(f2kvX1Fc0Qk%sc5-n99K~x2Bab zuD$y9aJzWgM5c8e+RWz*o_eT8aFz(#?o3mCd-!j|lh2c$`P%7UuCx4|VyAp{Zr)o~ z#gsK`Sj5DZ9nN&pPMB}fC$o{gD{}Sj&5FIxl0I4GyJ}Msa#pnaA`>S? zf7XLWlhY4QO*A{ZQrw}<=8mZT_jf16_}{xcn7)74!PZ)*73}@n^`dVJ6@UI2%*gkS z>CfF)|KEBs_k3gcGVSQC!UJXxlq+7J$*No<@!ZE~@&&eQDISvVEY~rGvtKkdQ8w(p z!G25sM*cZF&&?LLq1V11>yF&qb1v)2yp10#cIV#urSQQpBkoO9l0=o*;}u+y8cu#e zj*DFG8Af&ndc-}@%6zB|TMIC)d6RZ|{ge9L3l*zhMd_WqfgU&|=|Y|@gH6_c`AuDQ?RjJV!Bz3a)m zV-t(a4E7}Pi1S>V^?}9a@0L&-SsOXtm0u!Ki~~dG3U7*OnKPm2`-H_)*tf2{;j`g+);fFVJ9hF)+`#0=eDA)bm`tk9)|G(?Lzp03Kot2{OnYX{-XQS(# zw<#M#>YmND|2>cS>5d&MRU%lQZC`o0@9Q?+X2<62ecD#J-ofE^Ki{#LF3Mh{9;AO_ zSJC^FpobTYj!H=KGQH$moK@~OyJWVf)i+`FfHS_Kf>(MLFIqIkXyv)7Q`)ZyOw82% z$S6I@;H_*8i*|Ua?Zk#^zFTKGcL#pIzq$3r{SypL_kW(c`}}?FtNp*%ZhrjtdgFN& z*EKD3W#6rS|LaZt*PHRy_2-YyUe)%m_v=1O;he1S%H;F+g@5SYz1^sEZ&vqH)u2ud z)u~)sDn+5wR<2Sy*}E!g_0?T>-jwO;>fADU<#-0klj;w$nSa=wl(|>;?`pc;pRL)C z&+=){zBT>9r=xEh?ybr>c;)D`!UJ&!+fVK~n6hmFk9vFAs}39W$hJzAss)~n_j(Ff z#4UdIwd?Z@!!1?@PN`f6Pn>-s_eAl;)n!G@i+x|GO}2TqoyV@};Hj@iPA9+KzTeo; ze2TF34igTE1MGF**Vis%t^SlWf5t;KN%wWHUrzok|Km`({o1p+x2|lP9$z+VW&fkR zkgLzKf8NX38ai>=#_26zGas8IPCGiy(rLGUP~feoNxc^{7IV$G@buKAjrsCi7gtDM z-od59dS#39Z?&zva~llL?yQ%7p!~xB?IU5OxfUA^=GUty`RzadR_C97{HwmWmES^z zXYca8qp3D?f6b@=ZF`y3ZXS($bN;IM@x2$n z?68v8zuErsGDw{%eWP~dPRTy)ZMH1?>wlhOz4fGL?ThO!?=QcqU1r^$k$kJdob&gi zQwOiky;ZcqWZw@PbFap^U;dS9IaDvYI_>D*+FM(6bDtat3A+7j%AaGoJqgn70=??Z zEidm?*%iJiSX;j>ru=s04>sml_YHS<7yJ8_ZJWq2`T74NKilJ@um9f1_~7-|e=e?T z8vA$uJ^eX<=ayjUXWWJ|-Pgs+R^0bHvwJej4P9T?+luCIYA>h-#Uz(3NjvnyoUK3a zy=YASt%pgk?ry%8oHKWIo?y+EPKBJq4AEk{hXXY0&?(>w& zkz>BYWPbik%zF9svZoJsKQv!#>J?M(|a&FBAkxb2*B&}z;F zrA-BiD|_$ueB32htjxS-&4p*1mT#@r*2vxS&L`;B(%IerV@)#Bu3h6i&L+CS?abL! z;ll9k6BwlD)gPZ&_x|3wtwp|H@^2Y%t-Jm^ShPHUXO!G|x2Jw@cV63|$5^)byZQFa z#Vj{i*KXUN&tl%ED`m5A6M}WukoX^_GXniXsi#-PFF9Rm+%g zp3C0pT^Id8dB#nVJ(aQN#_k=0Z(=J#b7p(Yk1OxC%FDRC?Tq2P zef8o`+kS8Prs=6>`Hu5qgZYlE1&&!hiVx?l&=PDu@%gOKgTli9f4ja0Ov`FrRK%^~ zt+M$-1Xr)+$+;?@Ih8%`5!rsi_HChova-=Ku66j*UQ%a z)c>=Y|4yWic=YSq?bX)WPgnQ<{jylz?$4*b)7LrX$={T^UuvDR_IvrN?S*^WKj=2{ zZ`oAAWV3aFQ;%V9;jy$3kF7_i=$scid`Giu>vF$kjs8sK0;?)p_40V*Ohb)=n}d2o zoLBIyFO)hy`J~XcOw$7GNAGWF6#mHDu;bd#b<-Jczx;dlNR8v#>+gM?Ht@;Gi2wh0 z*#7H3@9VoB-;cG}_Cr{I|JNY%D<9X-|MC6!y?yUrz4@4QVPmGrWj+OyCjFcbadrmf zlYixw-fKL4OLguxR(a3fho+01q!ioIc&3<`m^j&~9pOstH7!-@JNi?!@Y9ln#j*)c zbx&0UUgZCE;kagZrSPW0qZhPX<)zKsq?AujOg*&Nvhd&0|IghsZmo@S;ab9LUA(JZ zIC10WGqv)6^>esC2$t;5)!J74Jn9h7>f8hO`z8bj{@Qf7HqpDVHumJh7k@VVc~_g> zU;lk?djI<6aS7S$A4)SctmjF%kg+!IyWi$bZ{6PepBBBf@}}7V?}A77_r3l!wXosk zHd9YC$#Tx0CbKhKyU#jYIKJi8rB#xvJL;5poU)FIea;Ga+BwT*+L4LMO=k1EA8>Bm zut2>3T*VvxN}B-l$nC2Zul724JV<8O?-O_34!O4-^AN4b?N$F^ChqZxx5-nXWSyOX zUATP29j-r_m6w?lduKFf=6!hke|@&cD4OeRS!qABU!X{q`Vr{|mqFYbAc|W-=+EylE>0~!yBUhB!cGbzclG~mn9eu*= zZ6+lxx_8+^ow=Jtmfy~if8BiGxV-pb*VvlVcQyH@xE&r=Oo+r8D?&G+uTLFc=zEX{B z9;**cE7YACF=eUi64wi+PElr8)^9RMadBNG#iys|WvMLF=e^qh^G?|VWeux> z@3Oi2yLK3HYV4nR@BX7dC!0Uqyxe(k>s!Y?k|%C6Udn%PKd#~7tQYy$Pu;7`;&0xc z85tzqw(ab0fj^gaGAmEM^W@|c-bHRw-aQ3v9GV#O4N!QV)ze$3+ar9ftX~}4{+vyx_14WewDrPy@tjGXu7 z-{tK5+bNtipFA!0Dm=S4?UZUz+|gZJKP^7j%vfp=FfB}Vt=rA6JK-u}D$!G~O#gi# z#@X1dO{*vB!h;I?r)SgIzwh56%zWqbGf%y^TQ)V-uL7k{&3@N#)2Zf_@VV#z=1yKU zn_<6mrqG|0qCc)~zIEX%_~H%BCG&{GKP_SoZZY{vT;d(GBlwu2@tt?EA#}vH1U~pOfu{{{B15IDb{! zuEzCoZT>Z)cJ+QsOpCTYIRE8=eogj{osUn2UEjB?v$M83?a$HA>}|Pi0#_%k5~~R- z)b)-rE;+j4^dvpcT`9}FpY3|`qe(Knw_@$OTG8|DDXWubtdG1mf5-oSTkq977rfX~ z=+UJ9Q0U*Qi@|etIQcGLwyL-*W-AVb^YYs>y$61CWF!C3qGbLPSSec#(VKc-LrI(u5^!R}jv zf7Y*?ayCDHmh9rKDuJQ~POrGvN<}$FP0W!@z8T}aY{Qff+0XXLEYc4zjdFe3U?VTc zAKK&QtNqJ={mXxvPp%s_+^Rjr<7xA4$>%GA=kEF!KRTl%#(j0=`lg9eto;WkX-x{4 zwA@8`Cg=2J2h!D^R#=;sJWv;tuYFc;_vK3UHsuCJ`HJ-)Pw&^;_ob`ijpFW!CvFS= zVpB8N_xbJ?p8{Wx53edezG{8B_tvlNIsYra1l<0-`}WJfv#-9@uB#3Cp!Q+nkB#De zycx!awrDZjigjM%$ZdCBWtzkFGqoo$BzRWQvI)vSoul{H4G4^|DXG(Ij zHDO8uC2`~wR5X|{tCrR&TV__M4sg>waEFQn|_d zV8DzVA;IYW_}R~Rg)}CvQ8Q{w3o%V>xjp03>aqjoUURIbZoBkzcUpt=j0W|&%jdO< zf6RI2k>z$!ch~InEZ)W~6W4sw$o_koRWO`KspDF2%}wwBjotUZ9hJBImw#{j<&Hm3 z<{tYY`(dZOXuoaFZk7XiTz+B?&Mhu@zA<;+&e*VzZx7siX>(w{h0YruyQckr&&)l1 z)ym*zZHZCar>}n)GNj7pEAlw2lq;)UvM@~M{hODxXG+EM&z+ag-w~;~(dz%;31`-I zZokf{+FXkp*Q~sCux}h8E%bs2=o-co=vQV9k zq2l%5V-KB=-R#}T{A~?i-gEQY1}F38f8TTM`JbG;$5ub~Z#4*?U-#Bwvshj`Q^jmC zzsY}+)(P!da@KU3zg6^tbq9RDEPhck=kM?3!FywK<#v8A`FNcFWcaUTIVrESMb;^B z2RhE2^!&lj0J&Q`rt28+`emp#s8|cI{p<<7>G!~Yzx^MvE(u-%`FJ2&T|MQ)( z@#aY3TMMM~%jKpU#jpl727A5oC}}XWxvw+%xW}ixk1Z_oUbaU?nx?jDYOdgWYxcpc zHz2exqf|7CTg`RTPlFTorSJFuII!~3rF94A*V&f|{0VdYx7Mra?Yi9ZxC8RmHHF_F z_@AzR{`+J2{m)6|W`5^{ z--Rn{SYjM!GM!vBX;Dm|?hDDF5Nlx$i-!$gyZ!I}{(n#C$K_4a)CIPQU%eiC`{>Wv zw)xx71TyY_UGVLhRsHU5``;f>sQYBAUz(mg>)21%TZSR4xqK{@+~=LPO_%z;d{b%K z+U(hEweP;&uw}OSnezKVcX)3z`)#Y^XE;u(Fa)R^s`PMtXp7HDUzITtd&i(op04zx#yGX8BeJlDI-aB0R2Y2Peim(60Ua!y2TtUtg1NAY^@ zAJV61m}z-b&7EtU?*6CN1zHQ#2h@8#sjXc~pPjtF143-h6cF+Pyh9Yx1T)@b_k3v*BIr zZ?{)}dsEkxwfvuQ_^0i*=V@yIr9hew%>Of=luWsXnuX1=f`@hFTeTszkA^SzBFp$9w+VVR&2Jn zo}AfGzSq9?zf!@;heEN* zue9gM`8)-$rd0ehZkf3|rER*5Op#7w}FFXHo*4*m6 z<*JZz;Fbh$aBd6Rcb6jda`#l}kDC==rJEmrC;6aL{m9FHiR1Edf6b1c z7oUGy-uboG=zd`C|N8RhLdiEvr#{SoTYGMAXzcrUdfP8Y98#L*n0JUpD20(rNWnuv za-zbslv6!CkKY+~IV7DB==5-5Qk%i(5h3ZK#y=rxx~GiD@q>lCcki0_z4qL_*XbM1 z?+v}0XMgH$ZpQjB@2lJM=dP;$_kYdaZ@04luD-%@#$cI*@f^t&hON^wI*-laPF`N_ zX~O$_BfptNQLd|*Tvfn1&B->vxCdzTR&4_f~lR|5x>M z+5b#GHob4ZWkt>ZWD{cOSocpYvRy;o#QnM-P0jdS7%tvV5!R;ppO76HJ36 zRhOSKGtJCe8nWkW<@yGJn>#;V%P&!>crX2b@5iT$@BcpdJnrAz_x}%S$5*|*y#7v( zp3nV{ZU5w(|4%N||9`Q*uI9t<`&CsxZsyyY)_hD*-TTTKVsZ3_0Hb^?brPKzpi}0FZ;*aeg4mb&*SW}Uh{m|UOw;E z|E1IaeX!s6>zR6-ea3y){(oEZ?X`VP(vQykKaURD-?=kO(J-Ug?)TdM{`fob zC*QOGab=(2aU%N2m4u$#0goguPwaGdcW+}8`_z#zd8SEn=E|ps6z0GCQF(vEKL15? z&ItedCC(hvEfbLYq;CJ)^V3!fgzIG5rsmGNv1N_!6m#C_?{lv6glRDM|61x7Fn7+L zL*a72pG~g+c4K?pzk3hr|2TlxOokK19o$LoJR>DRN_ZP}O4UT^*P>1yen zHtUM^l>7+#rE~1S#svAy^G9;c^JZ3Xmsls1-;&_lV3Qzr+{E{Au>aQgp^RS|IT;dW z6h7YdF_X!D*{(N_tETCF(cW>P>*|9wlWPwr3jbW@DcyF>Hv8-o?Mb?d?;pPsotxPI zPHunE)1&kMeoDSy_lxJp`nrEh7jNENqUo&JJzXcNU(SbX{>_Ty*Zul?xBcDyIzKLo zH@9ZSgZ+jtmp?Dxu2%p5+O;3|->va~-g2b2u0dF(-(sWp!?vk29(|r)Q~UGg+Cm%V zfBfdcpN!P6OkG&=LrO}y@A=pN3u1$J=sp(vu}<*ak~w?5Doa$48g+LiyA z%z}CS49oW(IGE4A&F$(n$IID=J_gOLI?Wk&Hq!ii@0vZCH_d%>c5KPJv})&i51nAO z#H(7Do(qQmIQ3Zn-<#?3zt3Hsd;9;rz;{pcUSw>SK6iJSN37Bj-_J6YiosibR@rU- z`RrQ$+WU8YeBF9?>+)%B-evP2cz-zc!Rhy(cSld!-`i#K@7zPL;H+<&k0kdgEG=y} zUMh9Uc9rz+ChaxHMCSj$;y-QvUW?B7y2{-@yXEs#t!A<=aeY0#^z~oPA7#fcL>;C_D?;Zc%cPsAQkrfR^i&gbE zg}++W+np4-^XAR$1;_SI_Edc&w?5?Yz3ly;&hIa<_y2b_-=?}aKP>f0iRiA>xn-$d z=i{dBKDBbr^oM-wq$)!>?w#CLrt;&?)Wok_^$wQ@{aVYkFPn#F*QWQDKX&Kc*_KnT z^J`uzU(}x&BJM2)3p1tG#dy|y-#xcU{Jk|p3;!fe6NmGi(&lq=cYM936WbX+;ccXJ z^VQ7>C!1JRyVIV$X>*)VDtpf9p63}0EvxU(JRYvkxBq;3Q{8S+_hpkfg(V}+Y!vUD zo|F))b8+&7srBuXOSV+3j`aG@YPF#W0BVC%fQudKJ=xYNDuIqhp#G43@{GfcJ0 zy?N`D><=sbAMzax`Pw2+g|^4N+AKTWM|sWK<6&D5ZeryYDvG?AJc(8E-rPKeO&@wD zhAf+|o5l8Ao^|TBjDSx?i-jt-Jt|`kSS`@(XJQ#uxcly|8h**$#SQ&0mPC|h_33k7 z@tE~UtGdub)#2+3qx;MKCEs5&zUUk>h3V#lr)dt;@0ngn@+s&Ix%Gz6v7G1Kj*Zzn zneV?{@YP~L-m#vXQ_r@j#{1>G*NO5y$Ni68>A-D|4ZmG4-v4y>-qkI<2D=?r9S_lc zGNseOY%0gSCn++Tr^O}L6*Zsw(7Eo*&fm!?Pai4qMopeHou#wE-U+;10LL24fb5#Tfv&o~v;B;Sn2p+^Lw zjM6EhiOVIAainJ~b58l)RO?(VR+?~=PyE669H)A|fA!CQv&z3~X80hdvOw9kwZ2a%3dvbw zV|<7s-SdKSKwucRwsDc_nrN-AFFxIxo_AmNMo)R3>Z})TvV6T!@cN0D-}_y7_WE0G zL%dyrIK#AtvsWWLEBhUpo1JH}J@c8ET5x#Hv_1LjDt+sDT|KftPUbm&RVhtxwgk`G zCDr}C6)BF**FH~(lL~&huz{byfuVq3h+((+`b}rquFXI7XwvgL&$Ny{nW>f(Jo8t} zmE$X?u5FS@TK?j0@5wS_qfb5UB27k;=efkDWN&bLH)D@j)S*bXD7LLmCtXqn-t*Tq zQn3{WCvAQ>M<%DBSVQfAgd0|Xmlb5kb&o(jI zKCx2D?BcO6k6Q$TuPuLjm_c4nfboF{=el_D^KUE;ygSRb>hvucRmrL8X)DDui_)|f zPjgzEAo^u?+7|`}wr`+w0fN?SSm3wEFe>De&KV;m;Z2uMaYil-obqC4HQ&2~OXqod zJDv9Mp7g6N%W~?I_r478>fWw9aItn@=xk3P-d z6Mdcr&AfT}>X%4KJ;UoC&x&P!>|+sImb-;Bcg}qm0W%`!bfDp0uq{uQC7On#WPDu@hc?-uuHQyk1Fct?82*@eQWuN4R@x!-qvZ|Cp+WQg`!yx4V}F^gKZ`xt31CHzGud*i%wjA2FGn@ zK2IsVdM1GR-hwL=rbREiJgv9)%s0*-2X=n{^*)XN4D*?_pIK7h?kPNcV?WD++5$bk z&qpuns2y8-gJg6= zeZEpN9vPfS4=z#)NqXcK-?mHY|KvbZ2OX<_*Q`pteo;ul+_VU!UM-r>0)^ zoX5^*XT!pDVCIYkDLnIU3jW`vx-RZ(ZJ6V zjw!ztzOg5u^-k59$!{#vedKtvJ_lI8l3ewqi_P(ATXLLS?#b*qT-O%`&pf(B;8`)V zhX4PX{=D8N!Alk!}sD8B4f61Vm@=lP|KaaOY!-syNe_p zCrOIb_Evt;tD1EEKuy=RnpctLna*r?zkPO@xOvXW!wVYD&tw0llWi~EKJD)fE#Ae4 zDi)cjewDs8;lHfC+@#trf7m)`KcIj#8aI=BAU^KPwWh}P4K zy5_pj_s(_SHC|C}uZ;7Tzw&!ACwOt#owZ9Q+|lfsGxx_PwpMx4d~bP3-ONx9_H{^;<9Bu+_A5LAm+Mhs^fd+n+J|-Tvb|V=DXR zJtsV;rTKO3e!KHI%lWy#{>xr`-T6$ZIcxq^Pw9@(6OoEh9D3>%$2j#gTPJOv&v^Q- z$JKjH3<7Uba(uSil>e*?3EHxhFF)f`aw7Y*QUMNjNqdfEj|0LFzsxa9yf*(Lw`<48 zPW3tWYYy(L+ZX-C@B5p?+wG4S{`;!th=<3q-dzn8zA5M+4g*tB-7!{@9Nm!lO+tIJO8c^@~`F?v__^JziXYhK>;S{=Qq%`9Z$%qt5MWulxi3jMjCzIB(Vsc_+B zSng@S&r>h*WBzfbP*KC~CoyYxg>UlwBA{f*x;6B`-4(kzSES!sl`i08;uyBoZ`GZm zQ;+YYZJAWy@1r)eTim$WQGL&!4Az?Oo7|@{6i2hP#k7mZapdH)mz6VTXE!c&OxPjw z!k;PEsOoQ#%xpi^)F3mpz@=+v7=>)?N-`1gwoTvk#Ao@;t)}Va*Kgh{+qV5{AcMRe z6H7z24(IOO$1XEJe(=2K?%e}r)6?d~nWb$m_pm9|y7V_{59gPvMfb%|=XczeK6h)D zo!5c$ZU|{fc^>bP0l+XkKZ*GG9 diff --git a/launcher/resources/multimc/128x128/instances/herobrine.png b/launcher/resources/multimc/128x128/instances/herobrine.png deleted file mode 100644 index 13f1494c4dd62b54e2e16942b23036e2968d640d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4937 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 Pz`)??>gTe~DWM4fu7_Uz diff --git a/launcher/resources/multimc/128x128/instances/magitech.png b/launcher/resources/multimc/128x128/instances/magitech.png deleted file mode 100644 index 0f81a1997fd0fe38cf927d4d29cbb1db394e32dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23097 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 Mr>mdKI;Vst07B&frT_o{ diff --git a/launcher/resources/multimc/128x128/instances/netherstar.png b/launcher/resources/multimc/128x128/instances/netherstar.png deleted file mode 100644 index 132085f02f2673a6db43d779246ca2c36daf43b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14062 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

e|~y; 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 diff --git a/launcher/resources/multimc/128x128/instances/skeleton.png b/launcher/resources/multimc/128x128/instances/skeleton.png deleted file mode 100644 index 55fcf5a991a78c85f1491aaac2069ba4891374f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3673 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 diff --git a/launcher/resources/multimc/128x128/instances/squarecreeper.png b/launcher/resources/multimc/128x128/instances/squarecreeper.png deleted file mode 100644 index c82d8406db175e65b2f72bc93e8c58bcbc669c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9136 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 U5?|yY1_lNOPgg&ebxsLQ0HO*O#sB~S diff --git a/launcher/resources/multimc/32x32/instances/brick.png b/launcher/resources/multimc/32x32/instances/brick.png deleted file mode 100644 index c324fda06304c72b6ca19d95bbfc610b60d22a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN^X_+~x z3MG{VsS2qTnQ06R6}Q%gXBT}o10r9@W&wcVQJTCt^DfRfjNhMjXLau?{ z47(X5um1bFd-eVg%0_XK;)}%Jo7RP`32;(=^>uQk>8*3G|6HtVeZIV|bgx2*;k!L@ z&bJ;5|GN9Q*|`1W`M+B4%tg#E)D<#Rp0P<=U9No5fA#$vyehe-dyW*Co8||fmb37^ znVxytd9%9o`B(Q6nHPn~x)}y0mpt~`qx+y#ZH{30;ikei=3CPu&+2W~b#$0_$GUv& zd&VlRPnj#PzldKu{Xy`pzkh_h_b0a;yDfffFaJNDkGVNjjKrBiFfV|&B}5!4e3gooxQJBZ1$Eb3%8!T zTXwyc-?r@K%cR`Rzn=bJ%}(3wHhHC?Ud)<>;jIMb59yV1wsqRsc#pwo&pd^dCD$~2zR%d#dgo5nWH0Vl+`pPwjO(0sO+2&N@X3Re zgAorr9-5lWnkAEDVwk(EAZq=M>oTh+DqTCisdvjrZ!t z)H_!x$hccxEb}*CuouUrq!3J%yLFT`oK{=uRvW*lj~j8ko=Y>BgETz~t_={w2|K}GXx!!BJ~ z_iGk!Zil5txw~0do6w)?UviBkk9>R^-S@<@ur6& z#h8i={O;!64BGwZJipqZQ*|LmRdZ9)#V5br7L#QdbBZgi`FA+ei8sNV^IM+sZPOKx zeD~y~Y;mhq^)&ZiM^rzouxm5Wje4SJy4NwSLjwq{`0lt>&w251Sb}$5oonW=Pj5Fn%TEctA;a zW%L2NyZNneBNK0*c((J={Wblf(=vMx``y@gqeHf=`?RP|NlL)ptD*b!#b0Y1om}|Z za&M1ra{ZnSf&ClA%KgmO+b^H$-+dzM;F9y754!E$EI(V!(yFZH%t5h~%7ypUU-H&6 zt!n&Xt&l$L>qZ5^^_!MV`nTuUr8tfg$E!V8d&k~$i2b+1`{@4|;rZ8#O~t=dpZ$3` z=x5b_&9GYSoAO#=dnfCZxxYS`F!6rHhtJNn5#?XQVxwb@@4Ix%k3pwEK4if@?e+Gt z`By(5`n|mMca-~mrd9q7;uXjL1#Z~&{1Ns#H1N3&vzzq&3pV>&Tikmqm|RX@3eQHKgnG3fpACq%)E#r(nl`Oo_4Ns zzQrl8NlrC>Hfa}FJLPxk?f!FY=Zg*V)7^S~s^(dE>4;cIyh{i(3VEdYXvU(fDeuqk zT2pZE(VDQVHKqRl4h6(TM?SMU>!`A^L$yOdVR4(0)&_y)p~^>HW_=Tu`^R`(f0DOa zxMYtE_X?-hCqEAUe^9+uxtNyON1zUZeKfx9iOs zX8K=xovT~M(z3m=`}H=p_l(o69sW<&lboc?n(>R9^}*kseVXhpd5!l>w{O2@=O^F5 zQ#y4QBOhPmM5WaA)qAXO+`PR%J?igYhL)b9b&Dc2ZZj}2uqAoByD#35PJhHup_s

4_#%-Q1jv*0;&raX% z$K)u{YR|jLaiX`!1PNj3O>3|GVlew9WLCDXacyt@L+KkAqLLT4wzAIhxbQ$oFVc}| zR>H%7FZ{l-&3g0aY)bkwAG7r5bN;`%^z`DxDebqea=jsU_MRCB7aw)7E{39U5pDhOk+}*>%$_aQE|9(ot+KyhPm*w?@`q@*{L&LUQL**y~AM751&6gEiXe}ZOq=Cw{hi*n3_Y^ z#m7K4Re%V87e>edXjn7Iqt4HYiFjfZ=Va> zzt*&sobj~L^>^irb6?Lh?+p8Uo1LxuYw=0p&3Ek6=Uwn;O|%OCFP(M$d;O=*ACdxh z-BO*tovwG@oW8rrA!Lu;-GcQ033_v9cg1tq>F}@kx1g85hH>{6>Gf4nf8!Y#7#KWV L{an^LB{Ts5CF6OY diff --git a/launcher/resources/multimc/32x32/instances/chicken.png b/launcher/resources/multimc/32x32/instances/chicken.png deleted file mode 100644 index f870467a6204f302e0c62f708200f09891622b69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1181 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 diff --git a/launcher/resources/multimc/32x32/instances/diamond.png b/launcher/resources/multimc/32x32/instances/diamond.png deleted file mode 100644 index 1eb26469788c26f4fb96a3a3fad652ca8b6e023c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2444 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 diff --git a/launcher/resources/multimc/32x32/instances/enderpearl.png b/launcher/resources/multimc/32x32/instances/enderpearl.png deleted file mode 100644 index a818eb8e671a46e99523f269234f60dd5c4ff32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2120 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 diff --git a/launcher/resources/multimc/32x32/instances/gold.png b/launcher/resources/multimc/32x32/instances/gold.png deleted file mode 100644 index 593410fac9a7a929696dee968e112d24780a01da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2366 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 diff --git a/launcher/resources/multimc/32x32/instances/grass.png b/launcher/resources/multimc/32x32/instances/grass.png deleted file mode 100644 index f1694547a419523cce164ff7a698c1692c2522b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($0Fct^7J29*~C-ahlfq^C6 z(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG6B0gH(xYL`iUdT1k0gQ7S_~VrE{6 zo}X)oLYc9ish**M!Iz?i3=E7nJzX3_JiPZ#_4H$ia(h03C-kKaDU6(=NFdWyq)&I zQv61>JmZ!xFVy+e&M`L_KKqOX!&6;yuSmY$8?MHfJ#jDpZ1vXbAM(#Jw=z`)??>gTe~DWM4fTdWLd diff --git a/launcher/resources/multimc/32x32/instances/herobrine.png b/launcher/resources/multimc/32x32/instances/herobrine.png deleted file mode 100644 index e5460da31d7df8e6d20fa59fbd3b3b8f5ef655df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1034 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 diff --git a/launcher/resources/multimc/32x32/instances/meat.png b/launcher/resources/multimc/32x32/instances/meat.png deleted file mode 100644 index 6694859db96b06391866d074da591ea12a9a352b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zoCO|{#S9F**Fl)kNn>^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa~N>7Fi*ArY->ukX)~iIhC{@%+x>^fw!A3zLrT|J1C)$CxP?up>e6sG7EviiWS_ zcGkP!I=YrV>R<4H-=HID;tR87w~w(p zxviD0q6bZvzTTl_$n9loGx>(7?X?ZdAD$5Z^-lWZSI;HF=I?i}$qX&=-q07_lzJxg zbg8Rbq* zIKdhm6XN2U;C^`5v}9S{(>qjmsqawV)q9om{5=s<)zVZIiGo1EmAakMLCm=qn=X|e z+;t@O;@fl0H{}l=H_vbUFC)`%j=8+h{PsK6z^^k^lJ1{)_ERayyNPw>K1p8gMcF%+ ze&J0_dbZvzb8VW#90#Ut=fo%O(*MyOva+}G;HHeFpWnT)UT!@9?_K?azt-3D|NHUp zZ`YCC^7jtT&Ds5ZRfm(wq13?mkf|#+D+SHxn6-7eVRv7~zpXRpyDN2g2`+8BlTfT z3g+u`-J-d910}ZqzOpUDcin|>3nAO7H%{BV`s-V;cwPDI`}-F(EKrU*GAZF?K)Cn2 zSsC23i<++N%kav(#_i1BbX==HzdJ~aG2dZ9^J*`1lai@!O|L%Hx^GdwHDS5g)Uqeb zzVOO;_;5!h_n(*hmQd=GBxAqNmMQ$%><1tJ9gO5GF8x;PsHfDmOoYu%Z1t)Ys}h_a zu5Y`R(l*aarD=)T)S#6W%tFRm`aNC?&($fsl6rBgG|6*b*g26Gr(~@*z6g*HO*m+|VZTuMd+*L!hott+&i(#RrAn=0QRewAZB8p{72IYo z+_Lo1t`(auIcXY-l&a244&4y4eul<_I~{rpl?`>Xq_SpIYd)C5;kGSQE^eVbhtWaf zi}Mm(w@k8q^ENpy^{(tenKY~X{pQ>^FYgamnfCgVq`Xt9jQ-;u;bR^eZ>3*$UlVm} zYujaUz|L;Hbl6q*)lu<6y4O?E&MRIJ{UYKwrD$hR{G5cN%RSy`tUY0CY;fsnL5u#B zZ%ejboD#-r9=NFS>E)T}{MG*ttxNEKIkQb!x7K!N&Z36tDmPY0bF|7!-MAe7iff+s zSEq|lQKwz8y3Sw9>+2Ss*+!QH z*LvL%tc@;k-=Z>0OvGZ{`?JfN>a}aNsvb>pj#W2%67PJ#(kX1ot~8nGD+RFy(Iv9s z7uK9zF7-fYx7Ti|Z!GTfUi|J9d@gs;^7tp|K#qg#i^^SOYcKQls&KU)DL$CT36$+yWJ>ZXX&SESH)U#bw+Sd9f$P+dJTztl7_3g740{&5Ft;7#J8BJYD@<);T3K0RYkFzTW@< diff --git a/launcher/resources/multimc/32x32/instances/netherstar.png b/launcher/resources/multimc/32x32/instances/netherstar.png deleted file mode 100644 index 43cb51139e7b412d5ca95bbde6d814bc96b695a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zoCO|{#S9E=Z$Ow)uGGSmfq_A?#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#W zDFz01VNVywkcif;)9?C6-xNJs|NO_TA40bk^o!NIQ0bkyp$;ni3@s|o}F$uxNqb8 zuUl*Vej?jTbNGH%PN9E_}-^8xwTO;DW4e z;iK>Jr>4~8CqAaTzN7=XWIYuoE(Zr=31BY z?TlHsS^f3v^*?L(eYm_-b=mW0+phh2eUSOmO&#CfUb}LG9}_40otJ3a$g*a`aosnb z4w|ZM?d^YOEi?UDyDypJ;G>4}?lS_I@So0vM- z-FMz2_C(ZGgN=>NW}=761BrHd3|*g?8S-rF zdKmmFZR&N!y6dl()~*ZCm{NARbFQX9r^_K}zV_EsgJiu{X5HR)ch<5{4#lYWq^x_l ze^_jBJfI~~;Mpm#DD<*P&h0pMF0Yk43oL9Vd8ou)>J-m+IP$nKR`cqLDZ45*?fZAQ z;l8|!rT`PGhvEiq);CELxB9dNJX2!OZk#Ri@wa4bL_$p>r;)Uh^A?1pP6tfCBkQ^MQo_6j!05z z?cA$hOQ&7G=CL%Wr>9p|(pzO6!}KXZy&o%THanOH8JLBAf5BiBoesy5=($Y<$V(_leQ< zxk2_)gLilM9p5i{Vs(Dy%e1L4O{Y#hqdxh_@#C5KS&KBXA6{Tz;w2e0lgG`h+i>2~ zq|2fV>+b(jbu;VEj4UxT|NOY^vxlO?L33kc1{v;FgCI?<=7W2t6s_B{=MKvhmMQn& zpSS2UHnOw&m1#GB`=Zd$D_5_5x_Uz*zON@|<5~_DizTm9iYsQ*lm{?Wf{ zm)U`v8i!6U_y1VAx5wWnK$P$H^j*8xTlN`0`u^Lv;SxjA#u>8x$Co$Gew>`VY16W2 z$?>kO>p#yeKQTk?f6X6>%iA(LTr6Ze6H+#x(bo?y;bYEWmY0xu^6dG1<7}snmk~N?`O6p_wr<}(`(s6olV)jhX4$oieKJ2a(r=3%O%h}; z*cs!ar#o?b?yWxg<0sN0wOa%GZn4=}*qlk+FR!>?d;Pg*X^(SswsG$B?I`=kG|@w4 zPj`3s*Pv5;#|u|6ZWmbO#Bs5zy!7j#Q@^bCSN*S@611auKO^h6g|9snfBd|LvcMMp)Y{r>%1I5#&}+t$|h=iCSD zcQxj^%==wi605JZ^v#~sz)iW6R*FnZ6F>Zpx^pvl+W+4X>b3iQJbiv*^tEeE0SX7qCr>Wfx+Nt#dE;ySeV_N5-CwVJ|Ju6z zJNs%&3rnvi-!?m%B)I5T<9_LV$5ByYJu*ZxGprn4LFNJ#xsndvo^F@&x8r}y2v z*Z-|=KKbld_zRZZdq3|@+TVOKZO;;61`y|w@3O~h>;H>C{#nm3|JyC+1>!5WFfcGM Nc)I$ztaD0e0ss*8na%(J diff --git a/launcher/resources/multimc/32x32/instances/planks.png b/launcher/resources/multimc/32x32/instances/planks.png deleted file mode 100644 index a94b75029b0a8fd4df03fa99848963354b000429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2299 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN<_EjMfB|(Yh3I#>^X_+~x z3MG{VsS2qTnQ06R6}Q%gM{m+r=lPQ^8p$NoalA-EV%4T*9s9G%32!!@w_Vw_JjZ}T zaaZ)Au;=#m;a|n$e2!^q+wFKU=h$gCY0HJeUn-9N^St%#{J%$*t?%_8XZaem@kAN# z`(^T0_*km`j&BPdm&UYO9!|8HB|P2va#`N)snruCo*Vj=S#>>su|wjI?Um%VS<4go zQ}=zg^z$g*{4Mq_`x_Osn`R2m_~=)`UNfn4gYx5x=4x6dIT>zD4sm_u zTchqXRx$p3wX*z6_|M*P#TGcC6 zeV0{VH>{Z5b?KGU^0kc*8Bh4eKl@Ozhqd^{FF^!OI8)xBJ4wn2D{a;wKrBUuKeH@X~cJQ5fBdL}5pooOprz@wm{SY$Sh-@rjB zMnEMxSw{PO?WGk)96$!awrd>c$SL)q;hFak^&abTwN1ovFT9?=RccCc1V^XNo zN6F*`oAm$Po77Xwmn%?p-?~Nk!pd)~tZVyO_cFh}UpPmnR)w{8ieQ7Py;`7Q_>U-G z{`)SU6>yFLTXAifwjk>2+tuc*n@z$u?!%6M`ZMXCa@%J>i zymM}!k(+k>kj$yBcWG@&W&zI)R~y7uJm~CBKDc4cwb(M}U zp0081aCr%1amDpXyR7zancirzWV?X;@qmOHNB_)QL@)?h2DVyQ@l?xi)^e+f`<+deUOnG;Xgu+qECw zjhS@oS8|T9yoag!S+BiTJ9Xot{=GY*ZhvO;=Tkv5m|CXa&XhC1yYHf1jQYA2D__iz zJ8;ij<8;pN>b;%26XX3Biv&9kaMYBR&dln$=H_0T!#_y0@ZBY*wa@*uW@-*MjLCgUyt zy;pueELNartbAyn!}P$zi~p{%oN)1dWOZP4&biwsb3g7*|9Yk-_~UP#RrQSB<@aXJ z+!DN+fq}6l)7d$|)7cqTlrk_>%&DDd>v7mY=4gEMQKhMTZxtR1Y_N(H*k5o(OJt$b z3el)igPmWvXPKyI>h(2cA3WH9bX9Zr=5>7QniPI8K6>(E$qOabfBKqRIzB$wA^-lJ z?Yn!7|J+(vrd^j!Ug(QTR{_Bm!xqiXnZM>}EPG(N@7=@4uVd$=SI+-k z{6({JGNWB%#k7}gu6rD9_GZ4E^SyKN8WqhW&yOr-i=FUe;_FSP^XGK){jN;Aa$?Ez z&c#QZHa0)yOH*}Lou|^LxytS5zcr`1p6i~=T6!$%`xAYhr(36{uDdMbBGetx#KCBk zrLmZayD-W$$Y)8W{lkay1%H%wrW8#*cw%FNR)|NR{2%_h@@z4+V|SMXFukbT__jZB zLArRxwcOvoZ)}^b?(jfz$E92UvY2Q5RM~s)T9Ug%h4hXcdD)-j3U)Gov41&9(K4uE z+5P~Ad*@%wE^>Gx_9C{pI{WS8FN`Mw!dFT^cpxC58T4(}@!idH_x`P3cJ)60y0b<5 zSM|>{WME)mOY(MiVfexDpW(mI-0Efq1_sUokH}&M2EM}}%y>M1MG6B01AB?5uPgf# z4q<+E(f*l%<_rvsYdu{YLn02J4L|F3*g;~>FXm-|oPie=I<8Evwnm`kOcN)6%2Er$0|-SmDOZ;IQQm8^e~x zu4jasUp@B!oS*lefr0yjjQ5{|bA>yzLcTx$e*SC4CN2h#N22Nb-u1jT)mPT%R-a$b z^5xCf?#*}4uH-0G4-?QlJ6|<3!SsM}oyMKbw>@K3EdE7&nfvdpN!cx#^!=vu|Nawv z@#Z}v!>)GI{`H^L84fsZd+PJ%lvDOSovHbYxUNL4r-5ad64CkyX*?90h8>7;)#JPLh%2}esm*4&9zh{|Tgw=wDuhXA? z>}UAfaPPTTzxlQ6|Gu`LIlWs&#@^vx{o}P;Lgm*)U%1rI=`AJp)BVBgH@Ejc(&u5_ zGGWG#Za4E!4@wi_>=V`o*C($19M7D-H~D$pbIFx@B~t%Z?cVywL8b0smHiL*hCSD^ z!j5iQ6*uv6<*F4m`7O;2pJHnn%a6&fP+qh=M1H}~H5~5jI`#J6@;Y-j++#hc_<>Vd X<$sd9`@`Q13=9mOu6{1-oD!M^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa}Crk*a2ArY--r|<4kaujJh|59tu#n?6_w!9qa(>iOEmkH1KDZ*`cV1@Qb^d%b~t7B^D?FjdE z(%j0%5bpI;d-~~}cS>VTcn-T9Ig?}d`(35n?q!UpH!Trxl59)dwXVD7H5X$;<-Frs zQ@Kjx)`lIK=+RPPG*jUG^WsMZ7Ct$%)HY6;wBu%uks{0Q@K>|-_BeChVYr`rA^G~& z2%V0}CshiSCMsN8EXTukCre(!dX}n^U#q^^^hfl^)@v>e(tH%W@%67N&Np6KUmu?P@a6cYOaH3bk~T_w z?EhWeaNM2Yv8~3xKRkcy=GVR6`25{FzHjf#cDwV=(P4ZpGr_Q7`SP==5&=45_G|4A zNUAb4oK3i;GXG}%`%q7Q}vE(RiTT z@d4X6uLb*4xLOZYn%-X(w_ZLc-$d%U^p6h{icdWMEIxBb$bZ?H#dXolk3Y`X5w%vR z-DzPn^NV`B+WYE##~-ubE*Jfw#B+y%{f5kR28XC=s<+>MyUMS|ps>A|X?t$8W#41v zN3&BSHClH3y6B_%bz9u}+S}XqA9!f;;_=V;1;1V?KXH1rl!1YP!PC{xWt~$(696d% BH;4cL diff --git a/launcher/resources/multimc/32x32/instances/squarecreeper.png b/launcher/resources/multimc/32x32/instances/squarecreeper.png deleted file mode 100644 index b78c4ae09d46cdb8184615248eca9e81c8253e26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 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 diff --git a/launcher/resources/multimc/32x32/instances/stone.png b/launcher/resources/multimc/32x32/instances/stone.png deleted file mode 100644 index 1b6ef7a4343f56efa133c025fc01e10d7f640014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1866 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 RF)%PNc)I$ztaD0e0syrHeJB6` diff --git a/launcher/resources/multimc/50x50/instances/enderman.png b/launcher/resources/multimc/50x50/instances/enderman.png deleted file mode 100644 index 9f3a72b3a093df63a45e6ca6a651bedb0943de8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2429 zcmeAS@N?(olHy`uVBq!ia0y~yU@!t<4mJh`208nVjSLJ7k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8R#Y(m>DXV zndljs7+9KE>L?f)7#ips8tEID>lzwZnVMS}7%D)4lAVH0QA(Oskc%7CuA-DQTcwPW zk^(Dz{qpj1y>er{{GxPyLrY6beFGzXBO~3Slr-Jq%Dj@q3f;V7Wta&rsl~}fnFS@8 z`FRQ;6BCp2OG|8(l%U2|bol2!OE0x2x;^|kUZ%1qD9OU!Y}PcF?(%`5SAu~n+b zEznEJOtCUBwlFX>G&eCYH!?7@Ff_C@G_bUAF*kH{HMDdxc6Nf9flaTOp`od#v5SGDiL0rbqmzq)nWZC4uV-FyNn&1dD$L%@%oHoAUNgLUt(=Qe6HD@o zLh|!-U@0IVBfliSI3vG6!8zDe&rrcPF*!32Bm#;caOhjPq!wkCrKY$Q<>xAZL)a=4 ziwg`)3HcnNH-(%~)3;Nw(FY|Dq~rn<3UYA+F~KPtl*;WC5ZNa+FU3}=NXg!gp(`Pf zfq`|kr;B4q#jQ6{yYq})C1T@~qC2NrXc%b(d8u$!S!HR-H9V_l;nLc*f3efA=&U$~ zz)PRmL_9(QxjI~(*7?=MK8q-xwmCknEL~P*QO8ubc{g{~rtkZ`Cc1K7`uazeybcWu z=kA^K{3^rCS!JiE_q~7p>s$8(h45+n*3?+9XSyWce|-M;-+#By^?Sa!Z1>#En;Q%- zrR_~9|E+oW`s=Tgt?F`Zuf*w1-+wM`^Y-V@pWE+RH<7jrPCKTpRL@ z&y3+C%Z0aP+)NkQ#U?W_g(^IlAk_TROT;DA|K`ibX}lL(h0HIU|2Tn9YeCp}L^ z>YW{~CIyOwx_foK`n6NMarHqDwkB4E?g^z=-oJnE-Ew$OQSqMi*-t-y+{n`L$)BOU zy`9xSprW=mHbP5)@3UXu!@q|QJ73J_*P5w(%CAAbIom7<~Yf(d;uqRP%LQ}mkD zcZA2$L9=<$($^8G>x7p|d@<|qOQqbe z`&9caE`QFJdnv!Fzdc)izRNl3*4#D9zutUzKbcl=!SrE!-epL*OYJ9n+uv-Vr{ z;^&cTul!kXj@?FZZO-1SRap*`WEaJ;JlHw!@6C6asl^@0hJVfG6jm&9jZ404+7WuLS@Er~nqXviw%l@3YmE7NRm zX0?ii*e`6kl@ny1JVl^u_9}}-@83L)RbI`yGyOrj`uD26L2M@?bXd-`{jaDmEDS7K z(s5PixClqB`{Rhy^EyN~YxT7(dNxV^<3vOL<$hmu+NBCzIiam&QTJ0p#yKvjZ zg~wzr-cV=j+F#{$o-s)`mcu2v&mm7z`R?7jQ`eRMnAuRrWVN_ONj^|vPeJm2wWK%K zKYj=9bqHAc9XGFk4Z3v1{*lE?S+qK1nIKg&j$MyHYqhi|_~ znteoT`=dnHv-g-@WgdSP)@o3i=%-L~>UG1D*;5X>o`09Z_o_r)qKscalable/reddit-alien.svg - 128x128/instances/flame.png + scalable/instances/flame.svg scalable/launcher.svg @@ -256,58 +256,32 @@ - 32x32/instances/chicken.png - 128x128/instances/chicken.png + scalable/instances/chicken.svg + scalable/instances/creeper.svg + scalable/instances/enderpearl.svg + scalable/instances/ftb_logo.svg - 32x32/instances/creeper.png - 128x128/instances/creeper.png + scalable/instances/flame.svg + scalable/instances/gear.svg + scalable/instances/herobrine.svg + scalable/instances/magitech.svg + scalable/instances/meat.svg + scalable/instances/netherstar.svg + scalable/instances/skeleton.svg + scalable/instances/squarecreeper.svg + scalable/instances/steve.svg - 32x32/instances/enderpearl.png - 128x128/instances/enderpearl.png + scalable/instances/brick.svg + scalable/instances/diamond.svg + scalable/instances/dirt.svg + scalable/instances/gold.svg + scalable/instances/grass.svg + scalable/instances/iron.svg + scalable/instances/planks.svg + scalable/instances/stone.svg + scalable/instances/tnt.svg - 32x32/instances/ftb_glow.png - 128x128/instances/ftb_glow.png - - 32x32/instances/ftb_logo.png - 128x128/instances/ftb_logo.png - - 128x128/instances/flame.png - - 32x32/instances/gear.png - 128x128/instances/gear.png - - 32x32/instances/herobrine.png - 128x128/instances/herobrine.png - - 32x32/instances/magitech.png - 128x128/instances/magitech.png - - 32x32/instances/meat.png - 128x128/instances/meat.png - - 32x32/instances/netherstar.png - 128x128/instances/netherstar.png - - 32x32/instances/skeleton.png - 128x128/instances/skeleton.png - - 32x32/instances/squarecreeper.png - 128x128/instances/squarecreeper.png - - 32x32/instances/steve.png - 128x128/instances/steve.png - - 32x32/instances/brick.png - 32x32/instances/diamond.png - 32x32/instances/dirt.png - 32x32/instances/gold.png - 32x32/instances/grass.png - 32x32/instances/iron.png - 32x32/instances/planks.png - 32x32/instances/stone.png - 32x32/instances/tnt.png - - 50x50/instances/enderman.png + scalable/instances/enderman.svg scalable/instances/fox.svg scalable/instances/bee.svg diff --git a/launcher/resources/multimc/scalable/instances/bee.svg b/launcher/resources/multimc/scalable/instances/bee.svg index 49f216c8f..a0870984d 100644 --- a/launcher/resources/multimc/scalable/instances/bee.svg +++ b/launcher/resources/multimc/scalable/instances/bee.svg @@ -1,159 +1,100 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + viewBox="0 0 32 32" + id="svg168" + xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/brick.svg b/launcher/resources/multimc/scalable/instances/brick.svg new file mode 100644 index 000000000..1b5f65c0b --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/brick.svg @@ -0,0 +1,37 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/chicken.svg b/launcher/resources/multimc/scalable/instances/chicken.svg new file mode 100644 index 000000000..831997225 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/chicken.svg @@ -0,0 +1,102 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/creeper.svg b/launcher/resources/multimc/scalable/instances/creeper.svg new file mode 100644 index 000000000..fdb90cab0 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/creeper.svg @@ -0,0 +1,37 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/diamond.svg b/launcher/resources/multimc/scalable/instances/diamond.svg new file mode 100644 index 000000000..47133136c --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/diamond.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/dirt.svg b/launcher/resources/multimc/scalable/instances/dirt.svg new file mode 100644 index 000000000..45e4ec2ad --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/dirt.svg @@ -0,0 +1,46 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/enderman.svg b/launcher/resources/multimc/scalable/instances/enderman.svg new file mode 100644 index 000000000..a13dde36a --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/enderman.svg @@ -0,0 +1,60 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/enderpearl.svg b/launcher/resources/multimc/scalable/instances/enderpearl.svg new file mode 100644 index 000000000..ad88bcd5e --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/enderpearl.svg @@ -0,0 +1,43 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/flame.svg b/launcher/resources/multimc/scalable/instances/flame.svg new file mode 100644 index 000000000..94d8cfff4 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/flame.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/fox.svg b/launcher/resources/multimc/scalable/instances/fox.svg index fcf16b2fb..b1317b41b 100644 --- a/launcher/resources/multimc/scalable/instances/fox.svg +++ b/launcher/resources/multimc/scalable/instances/fox.svg @@ -1,290 +1,113 @@ + + - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + viewBox="0 0 32 32" + id="svg168" + xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/ftb_logo.svg b/launcher/resources/multimc/scalable/instances/ftb_logo.svg new file mode 100644 index 000000000..7d5537823 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/ftb_logo.svg @@ -0,0 +1,36 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/gear.svg b/launcher/resources/multimc/scalable/instances/gear.svg new file mode 100644 index 000000000..ca71778da --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/gear.svg @@ -0,0 +1,90 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/gold.svg b/launcher/resources/multimc/scalable/instances/gold.svg new file mode 100644 index 000000000..ad845612e --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/gold.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/grass.svg b/launcher/resources/multimc/scalable/instances/grass.svg new file mode 100644 index 000000000..184b25832 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/grass.svg @@ -0,0 +1,52 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/herobrine.svg b/launcher/resources/multimc/scalable/instances/herobrine.svg new file mode 100644 index 000000000..b58745c61 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/herobrine.svg @@ -0,0 +1,96 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/iron.svg b/launcher/resources/multimc/scalable/instances/iron.svg new file mode 100644 index 000000000..f67ee37b3 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/iron.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/magitech.svg b/launcher/resources/multimc/scalable/instances/magitech.svg new file mode 100644 index 000000000..9dd993903 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/magitech.svg @@ -0,0 +1,55 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/meat.svg b/launcher/resources/multimc/scalable/instances/meat.svg new file mode 100644 index 000000000..3cefa7e24 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/meat.svg @@ -0,0 +1,56 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/modrinth.svg b/launcher/resources/multimc/scalable/instances/modrinth.svg index a40f0e72b..59df86b6a 100644 --- a/launcher/resources/multimc/scalable/instances/modrinth.svg +++ b/launcher/resources/multimc/scalable/instances/modrinth.svg @@ -1,4 +1,41 @@ - - - - + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/netherstar.svg b/launcher/resources/multimc/scalable/instances/netherstar.svg new file mode 100644 index 000000000..dde8bddc6 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/netherstar.svg @@ -0,0 +1,33 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/planks.svg b/launcher/resources/multimc/scalable/instances/planks.svg new file mode 100644 index 000000000..4328fec27 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/planks.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/skeleton.svg b/launcher/resources/multimc/scalable/instances/skeleton.svg new file mode 100644 index 000000000..d8beb49bb --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/skeleton.svg @@ -0,0 +1,69 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/squarecreeper.svg b/launcher/resources/multimc/scalable/instances/squarecreeper.svg new file mode 100644 index 000000000..71a28e122 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/squarecreeper.svg @@ -0,0 +1,49 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/steve.svg b/launcher/resources/multimc/scalable/instances/steve.svg new file mode 100644 index 000000000..0f29687ca --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/steve.svg @@ -0,0 +1,108 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/stone.svg b/launcher/resources/multimc/scalable/instances/stone.svg new file mode 100644 index 000000000..c28634698 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/stone.svg @@ -0,0 +1,30 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/tnt.svg b/launcher/resources/multimc/scalable/instances/tnt.svg new file mode 100644 index 000000000..841f4ef86 --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/tnt.svg @@ -0,0 +1,95 @@ + + + +Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher From e12a7a44156278799dee57dff9903a7917aaa7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Sun, 20 Nov 2022 16:40:34 -0300 Subject: [PATCH 0318/1149] gradients! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- .../multimc/scalable/instances/bee.svg | 87 +++++++--- .../multimc/scalable/instances/brick.svg | 56 ++++-- .../multimc/scalable/instances/chicken.svg | 153 ++++++++++------- .../multimc/scalable/instances/creeper.svg | 49 +++++- .../multimc/scalable/instances/diamond.svg | 44 ++++- .../multimc/scalable/instances/dirt.svg | 54 +++--- .../multimc/scalable/instances/enderman.svg | 44 ++++- .../multimc/scalable/instances/enderpearl.svg | 81 +++++++-- .../multimc/scalable/instances/flame.svg | 26 ++- .../multimc/scalable/instances/fox.svg | 121 +++++++++---- .../multimc/scalable/instances/ftb_logo.svg | 67 ++++++-- .../multimc/scalable/instances/gear.svg | 104 +++++------- .../multimc/scalable/instances/gold.svg | 45 ++++- .../multimc/scalable/instances/grass.svg | 86 +++++++--- .../multimc/scalable/instances/herobrine.svg | 92 ++++++---- .../multimc/scalable/instances/iron.svg | 160 +++++++++++++++++- .../multimc/scalable/instances/magitech.svg | 84 ++++++--- .../multimc/scalable/instances/meat.svg | 51 +++++- .../multimc/scalable/instances/modrinth.svg | 37 +++- .../multimc/scalable/instances/netherstar.svg | 37 +++- .../multimc/scalable/instances/planks.svg | 75 +++++++- .../multimc/scalable/instances/skeleton.svg | 81 ++++++++- .../scalable/instances/squarecreeper.svg | 80 ++++++--- .../multimc/scalable/instances/steve.svg | 158 +++++++++++------ .../multimc/scalable/instances/stone.svg | 37 +++- .../multimc/scalable/instances/tnt.svg | 159 ++++++++++------- 26 files changed, 1517 insertions(+), 551 deletions(-) diff --git a/launcher/resources/multimc/scalable/instances/bee.svg b/launcher/resources/multimc/scalable/instances/bee.svg index a0870984d..fef2aeb33 100644 --- a/launcher/resources/multimc/scalable/instances/bee.svg +++ b/launcher/resources/multimc/scalable/instances/bee.svg @@ -14,21 +14,54 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + xlink:href="#linearGradient1308" + id="linearGradient1310" + x1="16" + y1="27" + x2="16" + y2="5" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1308"><stop + style="stop-color:#f3db6c;stop-opacity:1;" + offset="0" + id="stop1304" /><stop + style="stop-color:#ffeea9;stop-opacity:1;" + offset="1" + id="stop1306" /></linearGradient><linearGradient + xlink:href="#linearGradient1440" + id="linearGradient1442" + x1="7" + y1="24" + x2="11" + y2="14" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1440"><stop + style="stop-color:#2c251f;stop-opacity:1;" + offset="0" + id="stop1436" /><stop + style="stop-color:#4d3f33;stop-opacity:1;" + offset="1" + id="stop1438" /></linearGradient><linearGradient + xlink:href="#linearGradient1460" + id="linearGradient1462" + x1="10" + y1="18" + x2="12" + y2="14" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1460"><stop + style="stop-color:#4c7aba;stop-opacity:1;" + offset="0" + id="stop1456" /><stop + style="stop-color:#86c3cf;stop-opacity:1;" + offset="1" + id="stop1458" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient288023"><stop + style="stop-color:#c1c1c1;stop-opacity:1;" + offset="0" + id="stop288019" /><stop + style="stop-color:#dfdfdf;stop-opacity:1;" + offset="1" + id="stop288021" /></linearGradient><linearGradient + xlink:href="#linearGradient84376" + id="linearGradient84368" + x1="48" + y1="26" + x2="48" + y2="6" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient84376"><stop + style="stop-color:#a63649;stop-opacity:1;" + offset="0" + id="stop84370" /><stop + style="stop-color:#df6277;stop-opacity:1;" + offset="1" + id="stop84381" /></linearGradient><linearGradient + xlink:href="#linearGradient288023" + id="linearGradient85182" + x1="48" + y1="6" + x2="48" + y2="26" + gradientUnits="userSpaceOnUse" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/chicken.svg b/launcher/resources/multimc/scalable/instances/chicken.svg index 831997225..30929c9e2 100644 --- a/launcher/resources/multimc/scalable/instances/chicken.svg +++ b/launcher/resources/multimc/scalable/instances/chicken.svg @@ -8,43 +8,92 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + id="linearGradient2085"><stop + style="stop-color:#261a0a;stop-opacity:1;" + offset="0" + id="stop2081" /><stop + style="stop-color:#3c2b13;stop-opacity:1;" + offset="1" + id="stop2083" /></linearGradient><linearGradient + xlink:href="#linearGradient292700" + id="linearGradient292686" + x1="86.052681" + y1="26.999552" + x2="86" + y2="5" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient292700"><stop + style="stop-color:#d0d0d0;stop-opacity:1;" + offset="0.23078403" + id="stop292702" /><stop + style="stop-color:#eeeeee;stop-opacity:1;" + offset="0.83153141" + id="stop292698" /></linearGradient><linearGradient + xlink:href="#linearGradient293074" + id="linearGradient293076" + x1="80" + y1="31" + x2="80" + y2="21" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient293074"><stop + style="stop-color:#a63649;stop-opacity:1;" + offset="0" + id="stop293070" /><stop + style="stop-color:#df6277;stop-opacity:1;" + offset="0.52521378" + id="stop293078" /><stop + style="stop-color:#a63649;stop-opacity:1;" + offset="1" + id="stop293072" /></linearGradient><linearGradient + xlink:href="#linearGradient2085" + id="linearGradient42830" + x1="77" + y1="17" + x2="77" + y2="14" + gradientUnits="userSpaceOnUse" /><linearGradient + xlink:href="#linearGradient292039" + id="linearGradient292041" + x1="89" + y1="25" + x2="89" + y2="18" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient292039"><stop + style="stop-color:#fb9168;stop-opacity:1;" + offset="0" + id="stop292035" /><stop + style="stop-color:#f3db6c;stop-opacity:1;" + offset="1" + id="stop292037" /></linearGradient><linearGradient + xlink:href="#linearGradient2085" + id="linearGradient82810" + gradientUnits="userSpaceOnUse" + x1="77" + y1="17" + x2="77" + y2="14" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/creeper.svg b/launcher/resources/multimc/scalable/instances/creeper.svg index fdb90cab0..38f7ac7a9 100644 --- a/launcher/resources/multimc/scalable/instances/creeper.svg +++ b/launcher/resources/multimc/scalable/instances/creeper.svg @@ -8,27 +8,58 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + xlink:href="#linearGradient11855" + id="linearGradient11859" + x1="111" + y1="25" + x2="111" + y2="7" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient11855"><stop + style="stop-color:#57965f;stop-opacity:1;" + offset="0" + id="stop11851" /><stop + style="stop-color:#78bf6e;stop-opacity:1;" + offset="1" + id="stop11853" /></linearGradient><radialGradient + xlink:href="#linearGradient10455" + id="radialGradient10457" + cx="112" + cy="17" + fx="112" + fy="17" + r="6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1666668,-6.8921104e-7,5.6666669e-7,1.1666667,-18.666684,-2.8332561)" /><linearGradient + id="linearGradient10455"><stop + style="stop-color:#1b2719;stop-opacity:1;" + offset="0" + id="stop10451" /><stop + style="stop-color:#0f150e;stop-opacity:1;" + offset="1" + id="stop10453" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient41693"><stop + style="stop-color:#64d5df;stop-opacity:1;" + offset="0" + id="stop41689" /><stop + style="stop-color:#17c2d6;stop-opacity:1;" + offset="0.35665122" + id="stop41711" /><stop + style="stop-color:#89edf6;stop-opacity:1;" + offset="0.71356344" + id="stop41709" /><stop + style="stop-color:#2bc4d4;stop-opacity:1;" + offset="1" + id="stop41691" /></linearGradient><linearGradient + xlink:href="#linearGradient41693" + id="linearGradient2973" + gradientUnits="userSpaceOnUse" + x1="153" + y1="25" + x2="135" + y2="7" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/dirt.svg b/launcher/resources/multimc/scalable/instances/dirt.svg index 45e4ec2ad..fe06bffcc 100644 --- a/launcher/resources/multimc/scalable/instances/dirt.svg +++ b/launcher/resources/multimc/scalable/instances/dirt.svg @@ -14,33 +14,39 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + id="linearGradient53203"><stop + style="stop-color:#77563b;stop-opacity:1;" + offset="0" + id="stop53199" /><stop + style="stop-color:#86674f;stop-opacity:1;" + offset="1" + id="stop53201" /></linearGradient><linearGradient + xlink:href="#linearGradient53203" + id="linearGradient39079" + gradientUnits="userSpaceOnUse" + x1="785" + y1="26" + x2="785" + y2="6" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + x="768" + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/enderman.svg b/launcher/resources/multimc/scalable/instances/enderman.svg index a13dde36a..483a002eb 100644 --- a/launcher/resources/multimc/scalable/instances/enderman.svg +++ b/launcher/resources/multimc/scalable/instances/enderman.svg @@ -8,32 +8,68 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + xlink:href="#linearGradient5295" + id="linearGradient5297" + x1="239" + y1="5" + x2="239" + y2="27" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient5295"><stop + style="stop-color:#25262d;stop-opacity:1;" + offset="0" + id="stop5291" /><stop + style="stop-color:#141519;stop-opacity:1;" + offset="1" + id="stop5293" /></linearGradient><linearGradient + xlink:href="#linearGradient5303" + id="linearGradient5316" + x1="243" + y1="17" + x2="243" + y2="20" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient5303"><stop + style="stop-color:#bd44b3;stop-opacity:1;" + offset="0" + id="stop5299" /><stop + style="stop-color:#d84ecd;stop-opacity:1;" + offset="1" + id="stop5301" /></linearGradient><linearGradient + xlink:href="#linearGradient5303" + id="linearGradient5305" + x1="236" + y1="17" + x2="236" + y2="20" + gradientUnits="userSpaceOnUse" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient3853"><stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="0.39989081" + id="stop3851" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop3849" /></linearGradient><linearGradient + id="linearGradient3405"><stop + style="stop-color:#27414e;stop-opacity:1;" + offset="0.16041158" + id="stop3401" /><stop + style="stop-color:#27414e;stop-opacity:0.74901961;" + offset="0.50162286" + id="stop39443" /><stop + style="stop-color:#27414e;stop-opacity:0;" + offset="1" + id="stop3403" /></linearGradient><linearGradient + id="linearGradient3000"><stop + style="stop-color:#62b397;stop-opacity:1;" + offset="0.47770822" + id="stop2996" /><stop + style="stop-color:#3a7a81;stop-opacity:1;" + offset="1" + id="stop2998" /></linearGradient><radialGradient + xlink:href="#linearGradient3000" + id="radialGradient3002-5" + cx="272" + cy="16" + fx="272" + fy="16" + r="12" + gradientUnits="userSpaceOnUse" /><radialGradient + xlink:href="#linearGradient3405" + id="radialGradient3407-4" + cx="272" + cy="16" + fx="272" + fy="16" + r="5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.2,0,0,1.2,-54.4,-3.2)" /><radialGradient + xlink:href="#linearGradient3853" + id="radialGradient3855-4" + cx="272" + cy="16" + fx="272" + fy="16" + r="5" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.2,0,0,2,-326.4,-16)" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + xlink:href="#linearGradient1468" + id="linearGradient1470" + x1="300" + y1="26" + x2="300" + y2="10" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1468"><stop + style="stop-color:#d63954;stop-opacity:1;" + offset="0" + id="stop1464" /><stop + style="stop-color:#e6812b;stop-opacity:1;" + offset="1" + id="stop1466" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/fox.svg b/launcher/resources/multimc/scalable/instances/fox.svg index b1317b41b..687a5b09d 100644 --- a/launcher/resources/multimc/scalable/instances/fox.svg +++ b/launcher/resources/multimc/scalable/instances/fox.svg @@ -14,55 +14,112 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"></clipPath><linearGradient + xlink:href="#linearGradient287187" + id="linearGradient287189" + x1="192.38519" + y1="22.999998" + x2="192.38519" + y2="17.999998" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient287187"><stop + style="stop-color:#dfdfdf;stop-opacity:1;" + offset="0" + id="stop287183" /><stop + style="stop-color:#f3f3f3;stop-opacity:1;" + offset="1" + id="stop287185" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + xlink:href="#linearGradient12453" + id="linearGradient12455" + x1="351" + y1="26" + x2="351" + y2="10" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient12453"><stop + style="stop-color:#b11917;stop-opacity:1;" + offset="0" + id="stop12449" /><stop + style="stop-color:#e65014;stop-opacity:1;" + offset="1" + id="stop12451" /></linearGradient><linearGradient + xlink:href="#linearGradient12299" + id="linearGradient12301" + x1="324" + y1="26" + x2="324" + y2="10" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient12299"><stop + style="stop-color:#0787c1;stop-opacity:1;" + offset="0" + id="stop12295" /><stop + style="stop-color:#65adb9;stop-opacity:1;" + offset="1" + id="stop12297" /></linearGradient><linearGradient + xlink:href="#linearGradient12445" + id="linearGradient12447" + x1="334" + y1="26" + x2="334" + y2="10" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient12445"><stop + style="stop-color:#798b2f;stop-opacity:1;" + offset="0" + id="stop12441" /><stop + style="stop-color:#9fc41e;stop-opacity:1;" + offset="1" + id="stop12443" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/gear.svg b/launcher/resources/multimc/scalable/instances/gear.svg index ca71778da..4bb91e085 100644 --- a/launcher/resources/multimc/scalable/instances/gear.svg +++ b/launcher/resources/multimc/scalable/instances/gear.svg @@ -8,80 +8,58 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><radialGradient + xlink:href="#linearGradient21157" + id="radialGradient21159" + cx="368" + cy="16" + fx="368" + fy="16" + r="7" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient21157"><stop + style="stop-color:#e1edf2;stop-opacity:1;" + offset="0" + id="stop21153" /><stop + style="stop-color:#abbdc4;stop-opacity:1;" + offset="0.72112602" + id="stop21161" /><stop + style="stop-color:#95acb6;stop-opacity:1;" + offset="1" + id="stop21155" /></linearGradient><radialGradient + xlink:href="#linearGradient21167" + id="radialGradient21309" + gradientUnits="userSpaceOnUse" + cx="400" + cy="16" + fx="400" + fy="16" + r="11" + gradientTransform="matrix(1.3636364,0,0,1.3636364,-177.45455,-5.8181818)" /><linearGradient + id="linearGradient21167"><stop + style="stop-color:#e5e6e9;stop-opacity:1;" + offset="0.13595749" + id="stop21163" /><stop + style="stop-color:#c5c7cf;stop-opacity:1;" + offset="0.86267382" + id="stop21165" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient48524"><stop + style="stop-color:#dfcd64;stop-opacity:1;" + offset="0" + id="stop48516" /><stop + style="stop-color:#d6b917;stop-opacity:1;" + offset="0.11879402" + id="stop48518" /><stop + style="stop-color:#f6e689;stop-opacity:1;" + offset="0.71356344" + id="stop48520" /><stop + style="stop-color:#d4bb2b;stop-opacity:1;" + offset="1" + id="stop48522" /></linearGradient><linearGradient + xlink:href="#linearGradient48524" + id="linearGradient48512" + gradientUnits="userSpaceOnUse" + x1="153" + y1="25" + x2="135" + y2="7" + gradientTransform="translate(256)" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/grass.svg b/launcher/resources/multimc/scalable/instances/grass.svg index 184b25832..d33dad507 100644 --- a/launcher/resources/multimc/scalable/instances/grass.svg +++ b/launcher/resources/multimc/scalable/instances/grass.svg @@ -14,39 +14,71 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + id="linearGradient53203"><stop + style="stop-color:#77563b;stop-opacity:1;" + offset="0" + id="stop53199" /><stop + style="stop-color:#86674f;stop-opacity:1;" + offset="1" + id="stop53201" /></linearGradient><linearGradient + id="linearGradient29505"><stop + style="stop-color:#99cd61;stop-opacity:1;" + offset="0" + id="stop29501" /><stop + style="stop-color:#bccd61;stop-opacity:1;" + offset="1" + id="stop29503" /></linearGradient><linearGradient + xlink:href="#linearGradient53203" + id="linearGradient56913" + gradientUnits="userSpaceOnUse" + x1="785" + y1="26" + x2="785" + y2="6" + gradientTransform="translate(-352)" /><linearGradient + xlink:href="#linearGradient56992" + id="linearGradient56984" + x1="433" + y1="11" + x2="433" + y2="20" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient56992"><stop + style="stop-color:#4d3f33;stop-opacity:0.5;" + offset="0" + id="stop56986" /><stop + style="stop-color:#4d3f33;stop-opacity:0;" + offset="1" + id="stop56990" /></linearGradient><linearGradient + xlink:href="#linearGradient29505" + id="linearGradient29507" + x1="428" + y1="14" + x2="428" + y2="4" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(2,2)" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/herobrine.svg b/launcher/resources/multimc/scalable/instances/herobrine.svg index b58745c61..4704eb153 100644 --- a/launcher/resources/multimc/scalable/instances/herobrine.svg +++ b/launcher/resources/multimc/scalable/instances/herobrine.svg @@ -8,55 +8,75 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + id="linearGradient2085"><stop + style="stop-color:#261a0a;stop-opacity:1;" + offset="0" + id="stop2081" /><stop + style="stop-color:#3c2b13;stop-opacity:1;" + offset="1" + id="stop2083" /></linearGradient><radialGradient + xlink:href="#linearGradient2066" + id="radialGradient2757-3" + cx="496.06177" + cy="17.211182" + fx="495.87827" + fy="18.730774" + r="11" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.5554022,0,0,1.2337313,-771.57556,-4.2669434)" /><linearGradient + id="linearGradient2066"><stop + style="stop-color:#ceb8aa;stop-opacity:1;" + offset="0.23876573" + id="stop2062" /><stop + style="stop-color:#b39888;stop-opacity:1;" + offset="0.51858544" + id="stop2064" /></linearGradient><linearGradient + xlink:href="#linearGradient2085" + id="linearGradient94741" + gradientUnits="userSpaceOnUse" + x1="504" + y1="15" + x2="504" + y2="5" /><linearGradient + xlink:href="#linearGradient2564" + id="linearGradient2566" + x1="466" + y1="27" + x2="466" + y2="22" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient2564"><stop + style="stop-color:#45362e;stop-opacity:1;" + offset="0" + id="stop2560" /><stop + style="stop-color:#59463c;stop-opacity:1;" + offset="1" + id="stop2562" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient27992"><stop + style="stop-color:#c5c7cf;stop-opacity:1;" + offset="0" + id="stop27990" /><stop + style="stop-color:#d8d9e0;stop-opacity:1;" + offset="1" + id="stop27988" /></linearGradient><linearGradient + id="linearGradient56358"><stop + style="stop-color:#ededed;stop-opacity:1;" + offset="0" + id="stop56354" /><stop + style="stop-color:#f4f4f4;stop-opacity:1;" + offset="1" + id="stop56356" /></linearGradient><linearGradient + xlink:href="#linearGradient27992" + id="linearGradient17901" + x1="496" + y1="26" + x2="496" + y2="6" + gradientUnits="userSpaceOnUse" /><linearGradient + xlink:href="#linearGradient56358" + id="linearGradient18032" + gradientUnits="userSpaceOnUse" + x1="503" + y1="25" + x2="503" + y2="23" + gradientTransform="translate(0,-4)" /><linearGradient + xlink:href="#linearGradient56358" + id="linearGradient18124" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-8)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + xlink:href="#linearGradient18539" + id="linearGradient18530" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-6)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + id="linearGradient18539"><stop + style="stop-color:#27414e;stop-opacity:0;" + offset="0" + id="stop18537" /><stop + style="stop-color:#27414e;stop-opacity:0.74901961;" + offset="0.49837714" + id="stop18535" /><stop + style="stop-color:#27414e;stop-opacity:1;" + offset="0.83958842" + id="stop18533" /></linearGradient><linearGradient + xlink:href="#linearGradient18539" + id="linearGradient18590" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-10)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + xlink:href="#linearGradient18539" + id="linearGradient18615" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-14)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + xlink:href="#linearGradient18539" + id="linearGradient18640" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-2)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + xlink:href="#linearGradient56358" + id="linearGradient18124-2" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-12)" + x1="503" + y1="25" + x2="503" + y2="23" /><linearGradient + xlink:href="#linearGradient56358" + id="linearGradient18124-0" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-16)" + x1="503" + y1="25" + x2="503" + y2="23" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/magitech.svg b/launcher/resources/multimc/scalable/instances/magitech.svg index 9dd993903..d866c6f01 100644 --- a/launcher/resources/multimc/scalable/instances/magitech.svg +++ b/launcher/resources/multimc/scalable/instances/magitech.svg @@ -8,45 +8,75 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><radialGradient + xlink:href="#linearGradient16441" + id="radialGradient16443" + cx="559.9212" + cy="16.022875" + fx="559.9212" + fy="16.022875" + r="11.80246" + gradientTransform="matrix(1,0,0,1.0119015,0,-0.19069696)" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient16441"><stop + style="stop-color:#9f0bff;stop-opacity:1;" + offset="0.4400529" + id="stop16439" /><stop + style="stop-color:#7111f8;stop-opacity:1;" + offset="1" + id="stop16437" /></linearGradient><radialGradient + xlink:href="#linearGradient14255" + id="radialGradient14257" + cx="560" + cy="16" + fx="560" + fy="16" + r="9" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-32)" /><linearGradient + id="linearGradient14255"><stop + style="stop-color:#e570f7;stop-opacity:1;" + offset="0" + id="stop14251" /><stop + style="stop-color:#d829c8;stop-opacity:1;" + offset="1" + id="stop14253" /></linearGradient><linearGradient + xlink:href="#linearGradient16452" + id="linearGradient16454" + x1="560" + y1="25" + x2="560" + y2="11" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-32)" /><linearGradient + id="linearGradient16452"><stop + style="stop-color:#f6cff4;stop-opacity:1;" + offset="0" + id="stop16450" /><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop16448" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient6068"><stop + style="stop-color:#cdcdcd;stop-opacity:1;" + offset="0" + id="stop6064" /><stop + style="stop-color:#eeeeee;stop-opacity:1;" + offset="1" + id="stop6066" /></linearGradient><linearGradient + xlink:href="#linearGradient6068" + id="linearGradient39389" + x1="565" + y1="23" + x2="567" + y2="21" + gradientUnits="userSpaceOnUse" /><linearGradient + xlink:href="#linearGradient38100" + id="linearGradient38102" + x1="408.70773" + y1="-379.00925" + x2="408.70773" + y2="-389.8125" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient38100"><stop + style="stop-color:#956c4a;stop-opacity:1;" + offset="0" + id="stop38096" /><stop + style="stop-color:#bb7c47;stop-opacity:1;" + offset="1" + id="stop38098" /></linearGradient><linearGradient + xlink:href="#linearGradient39375" + id="linearGradient39377" + x1="401.63666" + y1="-379.00925" + x2="401.63666" + y2="-389.8125" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient39375"><stop + style="stop-color:#d15e65;stop-opacity:1;" + offset="0" + id="stop39371" /><stop + style="stop-color:#b2594e;stop-opacity:1;" + offset="1" + id="stop39373" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + id="linearGradient3108"><stop + style="stop-color:#1bd96a;stop-opacity:1;" + offset="0" + id="stop3104" /><stop + style="stop-color:#1bd9a1;stop-opacity:1;" + offset="1" + id="stop3106" /></linearGradient><linearGradient + xlink:href="#linearGradient3108" + id="linearGradient3110" + x1="70.852509" + y1="141.75883" + x2="70.852509" + y2="0.053809531" + gradientUnits="userSpaceOnUse" /><linearGradient + xlink:href="#linearGradient3108" + id="linearGradient50774" + gradientUnits="userSpaceOnUse" + x1="70.852509" + y1="141.75883" + x2="70.852509" + y2="0.053809531" /><linearGradient + xlink:href="#linearGradient3108" + id="linearGradient50776" + gradientUnits="userSpaceOnUse" + x1="70.852509" + y1="141.75883" + x2="70.852509" + y2="0.053809531" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<radialGradient + xlink:href="#linearGradient62774" + id="radialGradient62776" + cx="624" + cy="15" + fx="624" + fy="15" + r="12" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient62774"><stop + style="stop-color:#f2effd;stop-opacity:1;" + offset="0.45171013" + id="stop62772" /><stop + style="stop-color:#d2cbf3;stop-opacity:1;" + offset="1" + id="stop62770" /></linearGradient><radialGradient + xlink:href="#linearGradient62766" + id="radialGradient62768" + cx="624" + cy="16" + fx="624" + fy="16" + r="6" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient62766"><stop + style="stop-color:#fafbb9;stop-opacity:1;" + offset="0" + id="stop62762" /><stop + style="stop-color:#fafbb9;stop-opacity:0;" + offset="1" + id="stop62764" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + xlink:href="#linearGradient19391" + id="linearGradient19373" + x1="690" + y1="22" + x2="690" + y2="21" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient19391"><stop + style="stop-color:#cfaf6b;stop-opacity:1;" + offset="0" + id="stop19387" /><stop + style="stop-color:#ddc694;stop-opacity:1;" + offset="1" + id="stop19389" /></linearGradient><linearGradient + xlink:href="#linearGradient19391" + id="linearGradient19435" + gradientUnits="userSpaceOnUse" + x1="690" + y1="22" + x2="690" + y2="21" + gradientTransform="translate(0,-5)" /><linearGradient + xlink:href="#linearGradient19391" + id="linearGradient19458" + gradientUnits="userSpaceOnUse" + x1="690" + y1="22" + x2="690" + y2="21" + gradientTransform="translate(0,-10)" /><linearGradient + xlink:href="#linearGradient19391" + id="linearGradient19481" + gradientUnits="userSpaceOnUse" + x1="690" + y1="22" + x2="690" + y2="21" + gradientTransform="translate(0,-15)" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/skeleton.svg b/launcher/resources/multimc/scalable/instances/skeleton.svg index d8beb49bb..33a34abba 100644 --- a/launcher/resources/multimc/scalable/instances/skeleton.svg +++ b/launcher/resources/multimc/scalable/instances/skeleton.svg @@ -8,46 +8,112 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + xlink:href="#linearGradient6068" + id="linearGradient6070" + x1="656" + y1="27" + x2="656" + y2="5" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient6068"><stop + style="stop-color:#cdcdcd;stop-opacity:1;" + offset="0" + id="stop6064" /><stop + style="stop-color:#eeeeee;stop-opacity:1;" + offset="1" + id="stop6066" /></linearGradient><linearGradient + xlink:href="#linearGradient7624" + id="linearGradient7626" + x1="658" + y1="20" + x2="658" + y2="24" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient7624"><stop + style="stop-color:#8e8e86;stop-opacity:1;" + offset="0" + id="stop7620" /><stop + style="stop-color:#8e8e86;stop-opacity:0;" + offset="1" + id="stop7622" /></linearGradient><linearGradient + xlink:href="#linearGradient7155" + id="linearGradient7165" + x1="656" + y1="25" + x2="656" + y2="22" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient7155"><stop + style="stop-color:#3e4447;stop-opacity:1;" + offset="0" + id="stop7151" /><stop + style="stop-color:#2e3134;stop-opacity:1;" + offset="1" + id="stop7153" /></linearGradient><radialGradient + xlink:href="#linearGradient6078" + id="radialGradient6080" + cx="662" + cy="18" + fx="662" + fy="18" + r="3" + gradientTransform="matrix(0.99999794,-1.7103091e-6,1.7879388e-6,1.0000015,0.0013367,0.00110992)" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient6078"><stop + style="stop-color:#006868;stop-opacity:1;" + offset="0" + id="stop6074" /><stop + style="stop-color:#3e4447;stop-opacity:1;" + offset="1" + id="stop6076" /></linearGradient><linearGradient + xlink:href="#linearGradient7155" + id="linearGradient7157" + x1="651" + y1="20" + x2="651" + y2="16" + gradientUnits="userSpaceOnUse" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<radialGradient + xlink:href="#linearGradient36865" + id="radialGradient10457-1" + cx="112" + cy="17" + fx="112" + fy="17" + r="6" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1666668,-6.8921104e-7,5.6666669e-7,1.1666667,589.33332,-2.8332561)" /><linearGradient + id="linearGradient36865"><stop + style="stop-color:#63271f;stop-opacity:1;" + offset="0" + id="stop36861" /><stop + style="stop-color:#3d1212;stop-opacity:1;" + offset="1" + id="stop36863" /></linearGradient><linearGradient + xlink:href="#linearGradient36859" + id="linearGradient11859-1" + x1="111" + y1="25" + x2="111" + y2="7" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(608)" /><linearGradient + id="linearGradient36859"><stop + style="stop-color:#729657;stop-opacity:1;" + offset="0" + id="stop36855" /><stop + style="stop-color:#a5bf6e;stop-opacity:1;" + offset="1" + id="stop36857" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/steve.svg b/launcher/resources/multimc/scalable/instances/steve.svg index 0f29687ca..53b35b6ec 100644 --- a/launcher/resources/multimc/scalable/instances/steve.svg +++ b/launcher/resources/multimc/scalable/instances/steve.svg @@ -8,55 +8,101 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><radialGradient + xlink:href="#linearGradient2739" + id="radialGradient2757" + cx="496.06177" + cy="17.211182" + fx="495.87827" + fy="18.730774" + r="11" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.5554022,0,0,1.2337313,-515.57556,-4.2669434)" /><linearGradient + id="linearGradient2739"><stop + style="stop-color:#cca997;stop-opacity:1;" + offset="0.23748928" + id="stop2755" /><stop + style="stop-color:#bd8e74;stop-opacity:1;" + offset="0.51858547" + id="stop2735" /></linearGradient><linearGradient + xlink:href="#linearGradient1330" + id="linearGradient1332" + x1="487" + y1="15" + x2="487" + y2="5" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(256)" /><linearGradient + id="linearGradient1330"><stop + style="stop-color:#261a0a;stop-opacity:1;" + offset="0" + id="stop1326" /><stop + style="stop-color:#422e11;stop-opacity:1;" + offset="1" + id="stop1328" /></linearGradient><linearGradient + xlink:href="#linearGradient1463" + id="linearGradient1465" + x1="755" + y1="27" + x2="755" + y2="22" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1463"><stop + style="stop-color:#45220e;stop-opacity:1;" + offset="0" + id="stop1459" /><stop + style="stop-color:#552910;stop-opacity:1;" + offset="1" + id="stop1461" /></linearGradient><linearGradient + xlink:href="#linearGradient1503" + id="linearGradient1505" + x1="748" + y1="20" + x2="748" + y2="17" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient1503"><stop + style="stop-color:#5c3874;stop-opacity:1;" + offset="0" + id="stop1499" /><stop + style="stop-color:#3c3874;stop-opacity:1;" + offset="1" + id="stop1501" /></linearGradient><linearGradient + xlink:href="#linearGradient1503" + id="linearGradient1365" + gradientUnits="userSpaceOnUse" + x1="748" + y1="20" + x2="748" + y2="17" /><linearGradient + xlink:href="#linearGradient1503" + id="linearGradient1367" + gradientUnits="userSpaceOnUse" + x1="748" + y1="20" + x2="748" + y2="17" /></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher<linearGradient + xlink:href="#linearGradient25803" + id="linearGradient25805" + x1="785" + y1="26" + x2="785" + y2="6" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient25803"><stop + style="stop-color:#8e8e86;stop-opacity:1;" + offset="0" + id="stop25799" /><stop + style="stop-color:#a2a29b;stop-opacity:1;" + offset="1" + id="stop25801" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="0" /> diff --git a/launcher/resources/multimc/scalable/instances/tnt.svg b/launcher/resources/multimc/scalable/instances/tnt.svg index 841f4ef86..a7a2689ff 100644 --- a/launcher/resources/multimc/scalable/instances/tnt.svg +++ b/launcher/resources/multimc/scalable/instances/tnt.svg @@ -8,85 +8,116 @@ viewBox="0 0 32 32" id="svg168" xml:space="preserve" + xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><linearGradient + xlink:href="#linearGradient18899" + id="linearGradient18901" + x1="805" + y1="16" + x2="812" + y2="16" + gradientUnits="userSpaceOnUse" /><linearGradient + id="linearGradient18899"><stop + style="stop-color:#bf454c;stop-opacity:1;" + offset="0" + id="stop18895" /><stop + style="stop-color:#df6277;stop-opacity:1;" + offset="0.5" + id="stop18972" /><stop + style="stop-color:#bf454c;stop-opacity:1;" + offset="1" + id="stop18897" /></linearGradient><linearGradient + xlink:href="#linearGradient18899" + id="linearGradient19011" + x1="812" + y1="16" + x2="820" + y2="16" + gradientUnits="userSpaceOnUse" /><linearGradient + xlink:href="#linearGradient18899" + id="linearGradient19015" + gradientUnits="userSpaceOnUse" + x1="805" + y1="16" + x2="812" + y2="16" + gradientTransform="matrix(-1,0,0,1,1632,0)" /><linearGradient + xlink:href="#linearGradient19917" + id="linearGradient22848" + gradientUnits="userSpaceOnUse" + x1="816" + y1="27" + x2="816" + y2="20" /><linearGradient + id="linearGradient19917"><stop + style="stop-color:#a02722;stop-opacity:1;" + offset="0" + id="stop19913" /><stop + style="stop-color:#a02722;stop-opacity:0;" + offset="1" + id="stop19915" /></linearGradient><radialGradient + xlink:href="#linearGradient19935" + id="radialGradient19929" + cx="816" + cy="14" + fx="816" + fy="14" + r="11" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.1570249,0,0,1,-128.13223,0)" /><linearGradient + id="linearGradient19935"><stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop19933" /><stop + style="stop-color:#f6cff4;stop-opacity:1;" + offset="1" + id="stop19931" /></linearGradient></defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Date: Tue, 22 Nov 2022 13:02:39 -0300 Subject: [PATCH 0319/1149] merge with upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/resources/instance_icons.svg | 2925 ++++++++++++----- .../128x128/instances/chicken_legacy.png | Bin 0 -> 6369 bytes .../128x128/instances/creeper_legacy.png | Bin 0 -> 9046 bytes .../128x128/instances/enderpearl_legacy.png | Bin 0 -> 21425 bytes .../128x128/instances/flame_legacy.png | Bin 0 -> 6226 bytes .../128x128/instances/ftb_glow_legacy.png | Bin 0 -> 12708 bytes .../128x128/instances/ftb_logo_legacy.png | Bin 0 -> 7883 bytes .../multimc/128x128/instances/gear_legacy.png | Bin 0 -> 18321 bytes .../128x128/instances/herobrine_legacy.png | Bin 0 -> 4937 bytes .../128x128/instances/infinity_legacy.png | Bin 0 -> 8012 bytes .../128x128/instances/magitech_legacy.png | Bin 0 -> 23097 bytes .../multimc/128x128/instances/meat_legacy.png | Bin 0 -> 10583 bytes .../128x128/instances/netherstar_legacy.png | Bin 0 -> 14062 bytes .../128x128/instances/skeleton_legacy.png | Bin 0 -> 3673 bytes .../instances/squarecreeper_legacy.png | Bin 0 -> 9136 bytes .../128x128/instances/steve_legacy.png | Bin 0 -> 4312 bytes .../multimc/32x32/instances/brick_legacy.png | Bin 0 -> 2388 bytes .../32x32/instances/chicken_legacy.png | Bin 0 -> 1181 bytes .../32x32/instances/creeper_legacy.png | Bin 0 -> 1524 bytes .../32x32/instances/diamond_legacy.png | Bin 0 -> 2444 bytes .../multimc/32x32/instances/dirt_legacy.png | Bin 0 -> 482 bytes .../32x32/instances/enderpearl_legacy.png | Bin 0 -> 2120 bytes .../multimc/32x32/instances/ftb_glow.png | Bin 0 -> 1747 bytes .../32x32/instances/ftb_logo_legacy.png | Bin 0 -> 1607 bytes .../multimc/32x32/instances/gear_legacy.png | Bin 0 -> 2414 bytes .../multimc/32x32/instances/gold_legacy.png | Bin 0 -> 2366 bytes .../multimc/32x32/instances/grass_legacy.png | Bin 0 -> 618 bytes .../32x32/instances/herobrine_legacy.png | Bin 0 -> 1034 bytes .../32x32/instances/infinity_legacy.png | Bin 0 -> 1714 bytes .../multimc/32x32/instances/iron_legacy.png | Bin 0 -> 1772 bytes .../32x32/instances/magitech_legacy.png | Bin 0 -> 2646 bytes .../multimc/32x32/instances/meat_legacy.png | Bin 0 -> 1514 bytes .../32x32/instances/netherstar_legacy.png | Bin 0 -> 1942 bytes .../multimc/32x32/instances/planks_legacy.png | Bin 0 -> 2299 bytes .../32x32/instances/skeleton_legacy.png | Bin 0 -> 696 bytes .../32x32/instances/squarecreeper_legacy.png | Bin 0 -> 1623 bytes .../multimc/32x32/instances/steve_legacy.png | Bin 0 -> 969 bytes .../multimc/32x32/instances/stone_legacy.png | Bin 0 -> 1866 bytes .../multimc/32x32/instances/tnt_legacy.png | Bin 0 -> 378 bytes .../50x50/instances/enderman_legacy.png | Bin 0 -> 2429 bytes launcher/resources/multimc/multimc.qrc | 71 +- .../multimc/scalable/instances/bee_legacy.svg | 159 + .../multimc/scalable/instances/fox.svg | 45 +- .../multimc/scalable/instances/fox_legacy.svg | 290 ++ .../multimc/scalable/instances/meat.svg | 2 +- 45 files changed, 2645 insertions(+), 847 deletions(-) create mode 100644 launcher/resources/multimc/128x128/instances/chicken_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/creeper_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/enderpearl_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/flame_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/ftb_glow_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/ftb_logo_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/gear_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/herobrine_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/infinity_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/magitech_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/meat_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/netherstar_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/skeleton_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/squarecreeper_legacy.png create mode 100644 launcher/resources/multimc/128x128/instances/steve_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/brick_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/chicken_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/creeper_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/diamond_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/dirt_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/enderpearl_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/ftb_glow.png create mode 100644 launcher/resources/multimc/32x32/instances/ftb_logo_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/gear_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/gold_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/grass_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/herobrine_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/infinity_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/iron_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/magitech_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/meat_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/netherstar_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/planks_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/skeleton_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/squarecreeper_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/steve_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/stone_legacy.png create mode 100644 launcher/resources/multimc/32x32/instances/tnt_legacy.png create mode 100644 launcher/resources/multimc/50x50/instances/enderman_legacy.png create mode 100644 launcher/resources/multimc/scalable/instances/bee_legacy.svg create mode 100644 launcher/resources/multimc/scalable/instances/fox_legacy.svg diff --git a/launcher/resources/instance_icons.svg b/launcher/resources/instance_icons.svg index 0c2b9e202..84c0ef6f0 100644 --- a/launcher/resources/instance_icons.svg +++ b/launcher/resources/instance_icons.svg @@ -384,7 +384,1389 @@ height="22" x="485" y="5" - ry="3" />Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism LauncherTODOTODOTODOTODOTODOTODO?TODOTODO + y="32" /> diff --git a/launcher/resources/multimc/128x128/instances/chicken_legacy.png b/launcher/resources/multimc/128x128/instances/chicken_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..71f6dedc54f470a6f8219a427bbabbae1f025a02 GIT binary patch literal 6369 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 Xlbl-wZ*(y*Ffe$!`njxgN@xNAtADtW literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/creeper_legacy.png b/launcher/resources/multimc/128x128/instances/creeper_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..41b7d07dbfcc841eb6dded16284b1a49fe4e8b4a GIT binary patch literal 9046 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

e|~y; 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/skeleton_legacy.png b/launcher/resources/multimc/128x128/instances/skeleton_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..55fcf5a991a78c85f1491aaac2069ba4891374f3 GIT binary patch literal 3673 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/squarecreeper_legacy.png b/launcher/resources/multimc/128x128/instances/squarecreeper_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..c82d8406db175e65b2f72bc93e8c58bcbc669c06 GIT binary patch literal 9136 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 U5?|yY1_lNOPgg&ebxsLQ0HO*O#sB~S literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/brick_legacy.png b/launcher/resources/multimc/32x32/instances/brick_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..c324fda06304c72b6ca19d95bbfc610b60d22a4b GIT binary patch literal 2388 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN^X_+~x z3MG{VsS2qTnQ06R6}Q%gXBT}o10r9@W&wcVQJTCt^DfRfjNhMjXLau?{ z47(X5um1bFd-eVg%0_XK;)}%Jo7RP`32;(=^>uQk>8*3G|6HtVeZIV|bgx2*;k!L@ z&bJ;5|GN9Q*|`1W`M+B4%tg#E)D<#Rp0P<=U9No5fA#$vyehe-dyW*Co8||fmb37^ znVxytd9%9o`B(Q6nHPn~x)}y0mpt~`qx+y#ZH{30;ikei=3CPu&+2W~b#$0_$GUv& zd&VlRPnj#PzldKu{Xy`pzkh_h_b0a;yDfffFaJNDkGVNjjKrBiFfV|&B}5!4e3gooxQJBZ1$Eb3%8!T zTXwyc-?r@K%cR`Rzn=bJ%}(3wHhHC?Ud)<>;jIMb59yV1wsqRsc#pwo&pd^dCD$~2zR%d#dgo5nWH0Vl+`pPwjO(0sO+2&N@X3Re zgAorr9-5lWnkAEDVwk(EAZq=M>oTh+DqTCisdvjrZ!t z)H_!x$hccxEb}*CuouUrq!3J%yLFT`oK{=uRvW*lj~j8ko=Y>BgETz~t_={w2|K}GXx!!BJ~ z_iGk!Zil5txw~0do6w)?UviBkk9>R^-S@<@ur6& z#h8i={O;!64BGwZJipqZQ*|LmRdZ9)#V5br7L#QdbBZgi`FA+ei8sNV^IM+sZPOKx zeD~y~Y;mhq^)&ZiM^rzouxm5Wje4SJy4NwSLjwq{`0lt>&w251Sb}$5oonW=Pj5Fn%TEctA;a zW%L2NyZNneBNK0*c((J={Wblf(=vMx``y@gqeHf=`?RP|NlL)ptD*b!#b0Y1om}|Z za&M1ra{ZnSf&ClA%KgmO+b^H$-+dzM;F9y754!E$EI(V!(yFZH%t5h~%7ypUU-H&6 zt!n&Xt&l$L>qZ5^^_!MV`nTuUr8tfg$E!V8d&k~$i2b+1`{@4|;rZ8#O~t=dpZ$3` z=x5b_&9GYSoAO#=dnfCZxxYS`F!6rHhtJNn5#?XQVxwb@@4Ix%k3pwEK4if@?e+Gt z`By(5`n|mMca-~mrd9q7;uXjL1#Z~&{1Ns#H1N3&vzzq&3pV>&Tikmqm|RX@3eQHKgnG3fpACq%)E#r(nl`Oo_4Ns zzQrl8NlrC>Hfa}FJLPxk?f!FY=Zg*V)7^S~s^(dE>4;cIyh{i(3VEdYXvU(fDeuqk zT2pZE(VDQVHKqRl4h6(TM?SMU>!`A^L$yOdVR4(0)&_y)p~^>HW_=Tu`^R`(f0DOa zxMYtE_X?-hCqEAUe^9+uxtNyON1zUZeKfx9iOs zX8K=xovT~M(z3m=`}H=p_l(o69sW<&lboc?n(>R9^}*kseVXhpd5!l>w{O2@=O^F5 zQ#y4QBOhPmM5WaA)qAXO+`PR%J?igYhL)b9b&Dc2ZZj}2uqAoByD#35PJhHup_s

4_#%-Q1jv*0;&raX% z$K)u{YR|jLaiX`!1PNj3O>3|GVlew9WLCDXacyt@L+KkAqLLT4wzAIhxbQ$oFVc}| zR>H%7FZ{l-&3g0aY)bkwAG7r5bN;`%^z`DxDebqea=jsU_MRCB7aw)7E{39U5pDhOk+}*>%$_aQE|9(ot+KyhPm*w?@`q@*{L&LUQL**y~AM751&6gEiXe}ZOq=Cw{hi*n3_Y^ z#m7K4Re%V87e>edXjn7Iqt4HYiFjfZ=Va> zzt*&sobj~L^>^irb6?Lh?+p8Uo1LxuYw=0p&3Ek6=Uwn;O|%OCFP(M$d;O=*ACdxh z-BO*tovwG@oW8rrA!Lu;-GcQ033_v9cg1tq>F}@kx1g85hH>{6>Gf4nf8!Y#7#KWV L{an^LB{Ts5CF6OY literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/chicken_legacy.png b/launcher/resources/multimc/32x32/instances/chicken_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..f870467a6204f302e0c62f708200f09891622b69 GIT binary patch literal 1181 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/diamond_legacy.png b/launcher/resources/multimc/32x32/instances/diamond_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb26469788c26f4fb96a3a3fad652ca8b6e023c GIT binary patch literal 2444 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/enderpearl_legacy.png b/launcher/resources/multimc/32x32/instances/enderpearl_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..a818eb8e671a46e99523f269234f60dd5c4ff32d GIT binary patch literal 2120 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/gold_legacy.png b/launcher/resources/multimc/32x32/instances/gold_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..593410fac9a7a929696dee968e112d24780a01da GIT binary patch literal 2366 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/grass_legacy.png b/launcher/resources/multimc/32x32/instances/grass_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..f1694547a419523cce164ff7a698c1692c2522b8 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4kiW$hCdQ-7c($0Fct^7J29*~C-ahlfq^C6 z(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG6B0gH(xYL`iUdT1k0gQ7S_~VrE{6 zo}X)oLYc9ish**M!Iz?i3=E7nJzX3_JiPZ#_4H$ia(h03C-kKaDU6(=NFdWyq)&I zQv61>JmZ!xFVy+e&M`L_KKqOX!&6;yuSmY$8?MHfJ#jDpZ1vXbAM(#Jw=z`)??>gTe~DWM4fTdWLd literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/herobrine_legacy.png b/launcher/resources/multimc/32x32/instances/herobrine_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..e5460da31d7df8e6d20fa59fbd3b3b8f5ef655df GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zoCO|{#S9F**Fl)kNn>^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa~t?Vc`WU;M0y-cqCma$*X zVh7%HyMN5SS^2y6^S{aSZepQ*sAm}Q%ed8-ft%h_L)~Wwp4(NQ6IlhrK zVX;P1R=7f6GNTXcs0sI zsxz%F2PF!8v zzW#a^pZ7}Hdw0H>)-L(eaJc?mMfSbwms<|Y*X-NS{{BPg0@)x|3HzTjq{X+~|LV83 z>&%OFUzZB^?<(B+c2l)-(10c^Trr1uu_3 zw(@!W%bj)Kc60Ceb@=+)i;9~QUNG&_iHO|8#t;!3b>!8Zp4rn6t~mVsd_CjbcVA6* z{1CoZmwm1Geb{uFdHeoIpK+{SAUo4 zoptMf=`wF~nSY;-pXS>iRk`ZlmgOek@FT^6&4w-OVi72G=-Ejz379Jl*%YV<^kZ z!%eFlKJ9LcniOf)bx`i?j2XHuH&~C%QVQO?xopYJN(=VMA{xEuQ2s~=7b@AAvc!XR0;Ne3~yM;<-r|$M$pE>)8r|kVlyN?@x>uGPl zcw^)2RSgpkeLwoi@_G5Q@4x5V|2cR5hiC8iWiWRv;%G>XWVrIWwC~jO&x`>pLl`(( zofvw0dKebGwqodYOHPn4k1yXBqsKhKM{RDUU&JN_4u*_bYzJ~Q7#(h`XZp*L_y2_% z!^HeP-ZkZ(bK`6H7*3mW9f(tAcUT$1q#(e-ut0;0;cnjboB!+OFW0MCJ}f==;TQip z<_~}T!x(=2-us>LLxl}9+p1R+R{mSVaNtY%b4HCQQ-(*2CQEyNjAZ!t?XWDv7IT@T zJiV*;w3z<0v$R~l?th!%*X&hNQ%I+!+CynJ#@|KASA1HV=kUwda2et6=} zqRzIW_xx|FpB^*2psrwl+g0G-+K7MFocF8Wx=R0=xMux1<=*Wabyn>XdC8SJI>AlL z#2tli{@CjG@7(0N}u2u}#BeZB{Xw_@`&wrQ+zFf<1N-o(=-*76g0i$IZ|d&w)nM}`mjIrieO0}^t5yB> z8hUFyOm-Jp(avxA_fT@niev23#c%e6FaDL+ns-~xQY=kJ=vmw@hs@s-uDO?_=^fMP z_54vhSFUj$v-k9zvhT}J{@LvM*{yl~o-K!d&5SJjEV_VgvHa5P+cAHgrCt|J_qgP* zcg1xjo96qTO+U*TcklNtRx>@=dR20f3r3dWS z1+QdVd1vkCjXMkV)-9W`^q`R<7t`mD9Q(4Z+|IJxPP2ckT)qA1wfEm8d4E=<=5GA{ zaq%ZjBf(fz%UH**6H7jawjVgm{Cw-D*>XJ2i()QyL^9s_`0y8l!1q-w$(ekuo>8;J zFK>zT^!>22|GaY7p@zGGoXa}wFC5qqx=n6+KPvXw5oj#_Q8818aYQLDw^!=?>BfDDc>h~Sh_pKj?zS&wU_pg%6I6k$`$gN1} zR{4Rda+d719Z$NAKL0Y=SSGnNFW~N{M%_ts-f#HQao{?k#)I3 zAydPg4jJ<)_o`iMYzUmX@v*7Z=gO9&%trmoZtPDD+8O+O=Vrf^@AtAYq^>^OoYEa| zs$a>or*~V2dzMDr+%WG&VV{F_djrl%@*+&8VG zMS6vubnNGer(HbmzuoYczjcEBDNW681&-#a25Oof??ra%ibYgdHpYFO@U>r&OQ~wL zv+?aiw=^%^$x_;$6K7+5daZlp6}>sSZ9D!M^zVAITx8=3v09HG9~F|OSj*hgym;&C zha=M?V`Go*m@2JOV3PfHn`dP9=Gp5Ns$5t+6;v!OC+c4HJkqqMq>OLAQnB>&p74s6 zduBK9oSkf$v!L{L!r_Mt+ZdLpxkq@o1f~jlid5&H-?)C^suO!A$UOb?NriW>@8YXz zWj0O+Ru?>e$T&&kLGV12P|=y6PX|YIn|=SzwS{Lg^T}qV?ij1>9V%S@G3S%x4=;A< zyI23>JLmhF4=*h4&)57Ow!`XU--_cOGiA>gus=Sf`gmPAXWiS+*$(?B7rni6;x5?FO3 hiN6yssrx;M7oR^z=5Afp5(Wka22WQ%mvv4FO#l!^X_+~x z3MG{VsS2qTnQ06R6}Q%gXHWaA#`E{Q)-Dzmf&Ql-Y?fQU_*8xHM&X>4M?a&Cw`~w` zx}*KDC+q*8yI13PL`)71t0}l>*?Zbe+H#@rm$IWjRdSyf$L(qR@NY@@afUlt%$eK5 z=TEC`ijx!mW~yQTIy6FAX4+!Y4b~>fPd7%{vUA$zS8X~Sm=k^c=!5eMpNVEgwi!<; zoxbhuglkEUW9N!qV_vGY!RX9chhFvBqK!A-wOBv!R6Eqy<9=T%P$1_{7fXXpZvOPB z`HWRemG4(-|8jrNWVd{&xwy{VLmYFrGpoEmIA37Cn3=oFADan(-n|liaxeSE-rU{Z z*BAr08+omkoomS6COKiY<=KV2%bWJi*ImRqw}kO&sQBEAT&_tQE{R62nzABz_ND;G zj%m`>9?uS?y=wX>vvbD5$+Epx)xy54%{g4=sXSL|jyM(HwYaV=vY|+IhS5RE#8bzY z)k*#F4coZO<~643{65x>B*MOj6x5)6mCjA zj;Q3bxpqv(|MIj}S$@-V%K}}GEu6nuLE zyYPf+{+_Ro=6<*P@gmsZARDLN4*@40%_0*EX4PFUk~<8S9nnf$$P&-_jdRwSn<=wZ zcfTn_u!lTmzl02ubUTLAWYW2Q0sqCyJQhr@&vrVqoaO-ZnGBNvZ$?c`P z-&McZxV(Am(O2HTS+lo9JU)44!)NyF3tI2X#ZCHzCFe96Zeuz2H-UlkY_qZKi72@< zyyr?%L|P4+rX1{DWg@}cx=qk~dGl`e;_Vf|LU|vL-JcQMyz76nCF`rW%Id>WviEly zN#0&nkg$q()%tEfnGmU!`IZi9BAudtGIeczMOkNRW$g1P4ZP5OezncD3Z3_JH@@2Y zHMD8%cjjZc=RTawTYWq}rTFEl&UXs~x6ipV!QMKntY7KsR&o80Z}qP7);v%Auky3LER;QOsL>1b<^WV$Y;%|J&f8CX8k56*@w%@#WO5m%g(yrGhHotkWQ+8&E z-iq2uIpwXtQYOCItF$<1*-|I-w?FN(o~32(dD3B2&vBM>V(&lB&O0qn*jLt>GTNt< z^L*|LEZt;qsr>vp?K3rDD?WGZ=yyM1*A!o>y~D@<;VS8!PUSpTd_7Jva_;vx_Pfo;${h|(?^2Gnuelzlo9DFDZ^Dl4_h-%y z`n&!8g~vXjKmGmPK3+dlr!sp>JlmCz+N}R|SJyM{_|UukD&yoP1_s8KOlRi+PiJRX znZUqMF{gH-t;b;pnWOR1N0p}Xy;XQMVd1U}$B-j|s{>lN7KUY9J^193e#WH>ZOAPhQkL<;VUd7nF`QKd#%e`}>Y+_8-!s%VxzsZdeuR zW;Ih_)6UR^&qWF>>Y+H;#6Wev0`Blm(G#Qs~(0Em;G&N zuRrjy`^lt}p=`>>nN|fTTGoBA|8aM13 znEt>k`}bG`-FA2Ev_nTg11AvI_x)2Gs`sAmYgx&U|+wx z-}Oa1nD4xrRd_V;$i!K%e7#@J|5;S|YFXvHY~GSs^V{-mj1BwVGww*axymncT3e1o zt%>jFi_J@?EUQ?sib23>kJ^LE&3|=mZ*FVLQScLDxMXtIbcajxtKa+fTgkUPoFBa4 zlpWW!nDwvgsx=~tev0u%zbhBH;eT+q(Zll14(7r#tlxqQOoZPocDVj^*USeR2JKBR oqjTS%e)iM9IbmD=A2vC$u&N0O!E(o-2-bo$blpV0&Yp zWWVik+s)tS{oiu!SCwI#)MJrK&)0b`>+iq+d+qx5SUlx#ZVz+u}AY=jtP73^x1c_c7+yQU$|D~lF4}!fAxs7$4VA%eK32i z0>`Y%;K^*t>_xSoJnNlVSXwS#+_2p$_FSx(BfHxCj|Ug66zP3p)|IqA<)z!%O{>`cq4`N&vWw&ULc`G0C*2N}gy#n-&47CE{g>iv=3o1Sfpd~#E|(Lb*H zc7?5^3{s$$?mgi<;rHKuLX9;r{3O{DR^?d+Q&RrxB0xktIA4N>u!7amv2t| z|LuG0%m247(f)b4GrnqZjLOINy!HR5{mxo$7SG$)y59D~A73kP(`giu7`X@zou--*QsXlH#nZ> zEZFtx(y#i?6HTjjWs6jJb#427*dq68&v#k>^1oke_lMO!Wf1EL{~2=qV)VvSpG4;T zl|TMRb;kT~m4-&gh4r>McT!%w;W>0KXr}klO(vh3DmLh!x;IPe)3tkzn*=1yV|jQ@ zT~z`@Ys0y>+!Q(_P@@)HS$?PB>uTKE4-pMFw#W3%Ip?W~7{1Y$25G(Gft!I}K8_(P)BxyfgA9$l8{ zR8ryVw9;C-=-!Q%UHtA+GWupY5keEM>?!^&zgL;-_9wIXJ1?ZSt`=GQVDZx6+Z#{a zINf)$_`?Oghv(J`9CKh`+2p1War^9!{;>10CjPz?OrruKu0&n2YMNK7q;yxo+BRq5 z-Eam@R>2?BR~-NTWmR^r^7iQ3ME3bFs$Oo(%MF{pe2Vh_g>NK<%)Z5~+`)E7%0V)t zNl(L$S3}QRA?-aIkG@zGQec@awi4 zNg?GA?+CQ6y&ElcyRmt*{nwDB8{401edu3bdhWVtw&M3T;b#AWmH#Kp{C>85N6jzY zoLP#6EJ*^71JVr(Q&Og`Quw>@^V`bg^(`B`o2D-4I%}Ts?z(=D&99xSebegLwyhIC z^rGvEJkJGzF3B(F`CySHy6HFe3aks613iV2b*6)qd;%+5*g+# zD^FSR9xA&O;>7p8^S$q)1sYmepSNYp=GFP#-1&1=+;^^X2j|P&+G=t6bM!@Le%lD& z+;jZ%e`}rpf7yO>NPOD?1w#pC1=W&R-mK7`tqiIc_>LY)nYrh)ct#w{tC)hdCp#MN zto#cz?$J9VfDsk5=|e zG)rt&n;Cig(*C}Gzuzq=FR-0_Zu6d5S`(D6unL_@H7y8`p8J_s^G)VtvGtQhpPzX1 zY5)1$eI2d6(L7&eK7FgxyYlVhq3-ja55ND{aC-V{m6^_q1r|vhDmW|Nhn>gBDryKLIP^G z=bpC8x?n0{aCPVOm%nWE<*Pb>J{8+({zD^b_uZuunymtD9wLVmQSHL)J5Q!Jl_KRXek$S3&Pk#Vn5b-3u> zRPDF?_fD$Ym5KM4ek)AO?98wK%laz)+~bd&FDkzl9mzB}dBx@5yz2rCuU)%sB>2K^ z^#mW(in#Hh@A0ACg^4YiQw7vJw4~f$1js*I7cEioLix|JZL=#kggm=)N$7md*UGfM zc}LVc51-Hxk}>?Tc;BrkhCjQXHwy1IO|UFqTF`k%uRib3Vc~6=-uvy1_8p9T7_ENR zYhU`#uytEJH&0Qz=U{m(|9;2+7wkK~9*F((?f}E#)(>B=AFuqEt-qlnMaF#plB_c} z1tRAYU!RTai}$-PclzGUE?1X|KOc824$dnw+aEpoN%E|;+y668Z+t5*#$21XX8ns- z?^l#=cb$7#efbflx)g!!_2zG@w{6_KdHSWU!796i~if;fBCP<%MEIouHl#YPJa4#>)YACFP|(u zaFns`Imf>B!jr{jw2I!jqf}JLXKuT^%fI2~)>B_6d_LG8V0(UN@y+wHUZNqZq9><) zezSAdS3hIx_uS?yT32VLFWpR;f{y5P{_2)8Pz+OB!xkJ8%`LNk&WcyPuA5)W-Px|6l(^7I;L4)| zp;vx(wM_{$wRr5}(X-1oY*5Z&U|?YIboFyt=akR{0HVPyVE_OC literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/meat_legacy.png b/launcher/resources/multimc/32x32/instances/meat_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..6694859db96b06391866d074da591ea12a9a352b GIT binary patch literal 1514 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zoCO|{#S9F**Fl)kNn>^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa~N>7Fi*ArY->ukX)~iIhC{@%+x>^fw!A3zLrT|J1C)$CxP?up>e6sG7EviiWS_ zcGkP!I=YrV>R<4H-=HID;tR87w~w(p zxviD0q6bZvzTTl_$n9loGx>(7?X?ZdAD$5Z^-lWZSI;HF=I?i}$qX&=-q07_lzJxg zbg8Rbq* zIKdhm6XN2U;C^`5v}9S{(>qjmsqawV)q9om{5=s<)zVZIiGo1EmAakMLCm=qn=X|e z+;t@O;@fl0H{}l=H_vbUFC)`%j=8+h{PsK6z^^k^lJ1{)_ERayyNPw>K1p8gMcF%+ ze&J0_dbZvzb8VW#90#Ut=fo%O(*MyOva+}G;HHeFpWnT)UT!@9?_K?azt-3D|NHUp zZ`YCC^7jtT&Ds5ZRfm(wq13?mkf|#+D+SHxn6-7eVRv7~zpXRpyDN2g2`+8BlTfT z3g+u`-J-d910}ZqzOpUDcin|>3nAO7H%{BV`s-V;cwPDI`}-F(EKrU*GAZF?K)Cn2 zSsC23i<++N%kav(#_i1BbX==HzdJ~aG2dZ9^J*`1lai@!O|L%Hx^GdwHDS5g)Uqeb zzVOO;_;5!h_n(*hmQd=GBxAqNmMQ$%><1tJ9gO5GF8x;PsHfDmOoYu%Z1t)Ys}h_a zu5Y`R(l*aarD=)T)S#6W%tFRm`aNC?&($fsl6rBgG|6*b*g26Gr(~@*z6g*HO*m+|VZTuMd+*L!hott+&i(#RrAn=0QRewAZB8p{72IYo z+_Lo1t`(auIcXY-l&a244&4y4eul<_I~{rpl?`>Xq_SpIYd)C5;kGSQE^eVbhtWaf zi}Mm(w@k8q^ENpy^{(tenKY~X{pQ>^FYgamnfCgVq`Xt9jQ-;u;bR^eZ>3*$UlVm} zYujaUz|L;Hbl6q*)lu<6y4O?E&MRIJ{UYKwrD$hR{G5cN%RSy`tUY0CY;fsnL5u#B zZ%ejboD#-r9=NFS>E)T}{MG*ttxNEKIkQb!x7K!N&Z36tDmPY0bF|7!-MAe7iff+s zSEq|lQKwz8y3Sw9>+2Ss*+!QH z*LvL%tc@;k-=Z>0OvGZ{`?JfN>a}aNsvb>pj#W2%67PJ#(kX1ot~8nGD+RFy(Iv9s z7uK9zF7-fYx7Ti|Z!GTfUi|J9d@gs;^7tp|K#qg#i^^SOYcKQls&KU)DL$CT36$+yWJ>ZXX&SESH)U#bw+Sd9f$P+dJTztl7_3g740{&5Ft;7#J8BJYD@<);T3K0RYkFzTW@< literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/netherstar_legacy.png b/launcher/resources/multimc/32x32/instances/netherstar_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..43cb51139e7b412d5ca95bbde6d814bc96b695a3 GIT binary patch literal 1942 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT% zoCO|{#S9E=Z$Ow)uGGSmfq_A?#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#W zDFz01VNVywkcif;)9?C6-xNJs|NO_TA40bk^o!NIQ0bkyp$;ni3@s|o}F$uxNqb8 zuUl*Vej?jTbNGH%PN9E_}-^8xwTO;DW4e z;iK>Jr>4~8CqAaTzN7=XWIYuoE(Zr=31BY z?TlHsS^f3v^*?L(eYm_-b=mW0+phh2eUSOmO&#CfUb}LG9}_40otJ3a$g*a`aosnb z4w|ZM?d^YOEi?UDyDypJ;G>4}?lS_I@So0vM- z-FMz2_C(ZGgN=>NW}=761BrHd3|*g?8S-rF zdKmmFZR&N!y6dl()~*ZCm{NARbFQX9r^_K}zV_EsgJiu{X5HR)ch<5{4#lYWq^x_l ze^_jBJfI~~;Mpm#DD<*P&h0pMF0Yk43oL9Vd8ou)>J-m+IP$nKR`cqLDZ45*?fZAQ z;l8|!rT`PGhvEiq);CELxB9dNJX2!OZk#Ri@wa4bL_$p>r;)Uh^A?1pP6tfCBkQ^MQo_6j!05z z?cA$hOQ&7G=CL%Wr>9p|(pzO6!}KXZy&o%THanOH8JLBAf5BiBoesy5=($Y<$V(_leQ< zxk2_)gLilM9p5i{Vs(Dy%e1L4O{Y#hqdxh_@#C5KS&KBXA6{Tz;w2e0lgG`h+i>2~ zq|2fV>+b(jbu;VEj4UxT|NOY^vxlO?L33kc1{v;FgCI?<=7W2t6s_B{=MKvhmMQn& zpSS2UHnOw&m1#GB`=Zd$D_5_5x_Uz*zON@|<5~_DizTm9iYsQ*lm{?Wf{ zm)U`v8i!6U_y1VAx5wWnK$P$H^j*8xTlN`0`u^Lv;SxjA#u>8x$Co$Gew>`VY16W2 z$?>kO>p#yeKQTk?f6X6>%iA(LTr6Ze6H+#x(bo?y;bYEWmY0xu^6dG1<7}snmk~N?`O6p_wr<}(`(s6olV)jhX4$oieKJ2a(r=3%O%h}; z*cs!ar#o?b?yWxg<0sN0wOa%GZn4=}*qlk+FR!>?d;Pg*X^(SswsG$B?I`=kG|@w4 zPj`3s*Pv5;#|u|6ZWmbO#Bs5zy!7j#Q@^bCSN*S@611auKO^h6g|9snfBd|LvcMMp)Y{r>%1I5#&}+t$|h=iCSD zcQxj^%==wi605JZ^v#~sz)iW6R*FnZ6F>Zpx^pvl+W+4X>b3iQJbiv*^tEeE0SX7qCr>Wfx+Nt#dE;ySeV_N5-CwVJ|Ju6z zJNs%&3rnvi-!?m%B)I5T<9_LV$5ByYJu*ZxGprn4LFNJ#xsndvo^F@&x8r}y2v z*Z-|=KKbld_zRZZdq3|@+TVOKZO;;61`y|w@3O~h>;H>C{#nm3|JyC+1>!5WFfcGM Nc)I$ztaD0e0ss*8na%(J literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/planks_legacy.png b/launcher/resources/multimc/32x32/instances/planks_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..a94b75029b0a8fd4df03fa99848963354b000429 GIT binary patch literal 2299 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 BH;4cL literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/squarecreeper_legacy.png b/launcher/resources/multimc/32x32/instances/squarecreeper_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..b78c4ae09d46cdb8184615248eca9e81c8253e26 GIT binary patch literal 1623 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/32x32/instances/stone_legacy.png b/launcher/resources/multimc/32x32/instances/stone_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6ef7a4343f56efa133c025fc01e10d7f640014 GIT binary patch literal 1866 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 RF)%PNc)I$ztaD0e0syrHeJB6` literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/50x50/instances/enderman_legacy.png b/launcher/resources/multimc/50x50/instances/enderman_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3a72b3a093df63a45e6ca6a651bedb0943de8a GIT binary patch literal 2429 zcmeAS@N?(olHy`uVBq!ia0y~yU@!t<4mJh`208nVjSLJ7k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8R#Y(m>DXV zndljs7+9KE>L?f)7#ips8tEID>lzwZnVMS}7%D)4lAVH0QA(Oskc%7CuA-DQTcwPW zk^(Dz{qpj1y>er{{GxPyLrY6beFGzXBO~3Slr-Jq%Dj@q3f;V7Wta&rsl~}fnFS@8 z`FRQ;6BCp2OG|8(l%U2|bol2!OE0x2x;^|kUZ%1qD9OU!Y}PcF?(%`5SAu~n+b zEznEJOtCUBwlFX>G&eCYH!?7@Ff_C@G_bUAF*kH{HMDdxc6Nf9flaTOp`od#v5SGDiL0rbqmzq)nWZC4uV-FyNn&1dD$L%@%oHoAUNgLUt(=Qe6HD@o zLh|!-U@0IVBfliSI3vG6!8zDe&rrcPF*!32Bm#;caOhjPq!wkCrKY$Q<>xAZL)a=4 ziwg`)3HcnNH-(%~)3;Nw(FY|Dq~rn<3UYA+F~KPtl*;WC5ZNa+FU3}=NXg!gp(`Pf zfq`|kr;B4q#jQ6{yYq})C1T@~qC2NrXc%b(d8u$!S!HR-H9V_l;nLc*f3efA=&U$~ zz)PRmL_9(QxjI~(*7?=MK8q-xwmCknEL~P*QO8ubc{g{~rtkZ`Cc1K7`uazeybcWu z=kA^K{3^rCS!JiE_q~7p>s$8(h45+n*3?+9XSyWce|-M;-+#By^?Sa!Z1>#En;Q%- zrR_~9|E+oW`s=Tgt?F`Zuf*w1-+wM`^Y-V@pWE+RH<7jrPCKTpRL@ z&y3+C%Z0aP+)NkQ#U?W_g(^IlAk_TROT;DA|K`ibX}lL(h0HIU|2Tn9YeCp}L^ z>YW{~CIyOwx_foK`n6NMarHqDwkB4E?g^z=-oJnE-Ew$OQSqMi*-t-y+{n`L$)BOU zy`9xSprW=mHbP5)@3UXu!@q|QJ73J_*P5w(%CAAbIom7<~Yf(d;uqRP%LQ}mkD zcZA2$L9=<$($^8G>x7p|d@<|qOQqbe z`&9caE`QFJdnv!Fzdc)izRNl3*4#D9zutUzKbcl=!SrE!-epL*OYJ9n+uv-Vr{ z;^&cTul!kXj@?FZZO-1SRap*`WEaJ;JlHw!@6C6asl^@0hJVfG6jm&9jZ404+7WuLS@Er~nqXviw%l@3YmE7NRm zX0?ii*e`6kl@ny1JVl^u_9}}-@83L)RbI`yGyOrj`uD26L2M@?bXd-`{jaDmEDS7K z(s5PixClqB`{Rhy^EyN~YxT7(dNxV^<3vOL<$hmu+NBCzIiam&QTJ0p#yKvjZ zg~wzr-cV=j+F#{$o-s)`mcu2v&mm7z`R?7jQ`eRMnAuRrWVN_ONj^|vPeJm2wWK%K zKYj=9bqHAc9XGFk4Z3v1{*lE?S+qK1nIKg&j$MyHYqhi|_~ znteoT`=dnHv-g-@WgdSP)@o3i=%-L~>UG1D*;5X>o`09Z_o_r)qK scalable/discord.svg - - + scalable/instances/chicken.svg scalable/instances/creeper.svg scalable/instances/enderpearl.svg scalable/instances/ftb_logo.svg - scalable/instances/flame.svg scalable/instances/gear.svg scalable/instances/herobrine.svg @@ -270,23 +268,78 @@ scalable/instances/skeleton.svg scalable/instances/squarecreeper.svg scalable/instances/steve.svg - - scalable/instances/brick.svg scalable/instances/diamond.svg scalable/instances/dirt.svg - scalable/instances/gold.svg scalable/instances/grass.svg + scalable/instances/brick.svg + scalable/instances/gold.svg scalable/instances/iron.svg scalable/instances/planks.svg scalable/instances/stone.svg scalable/instances/tnt.svg - scalable/instances/enderman.svg - scalable/instances/fox.svg scalable/instances/bee.svg - scalable/instances/prismlauncher.svg + + + 32x32/instances/chicken_legacy.png + 128x128/instances/chicken_legacy.png + + 32x32/instances/creeper_legacy.png + 128x128/instances/creeper_legacy.png + + 32x32/instances/enderpearl_legacy.png + 128x128/instances/enderpearl_legacy.png + + 32x32/instances/ftb_glow.png + 128x128/instances/ftb_glow.png + + 32x32/instances/ftb_logo_legacy.png + 128x128/instances/ftb_logo_legacy.png + + 128x128/instances/flame_legacy.png + + 32x32/instances/gear_legacy.png + 128x128/instances/gear_legacy.png + + 32x32/instances/herobrine_legacy.png + 128x128/instances/herobrine_legacy.png + + 32x32/instances/magitech_legacy.png + 128x128/instances/magitech_legacy.png + + 32x32/instances/meat_legacy.png + 128x128/instances/meat_legacy.png + + 32x32/instances/netherstar_legacy.png + 128x128/instances/netherstar_legacy.png + + 32x32/instances/skeleton_legacy.png + 128x128/instances/skeleton_legacy.png + + 32x32/instances/squarecreeper_legacy.png + 128x128/instances/squarecreeper_legacy.png + + 32x32/instances/steve_legacy.png + 128x128/instances/steve_legacy.png + + 32x32/instances/brick_legacy.png + 32x32/instances/diamond_legacy.png + 32x32/instances/dirt_legacy.png + 32x32/instances/gold_legacy.png + 32x32/instances/grass_legacy.png + 32x32/instances/iron_legacy.png + 32x32/instances/planks_legacy.png + 32x32/instances/stone_legacy.png + 32x32/instances/tnt_legacy.png + + 50x50/instances/enderman_legacy.png + + scalable/instances/prismlauncher.svg + scalable/instances/fox_legacy.svg + scalable/instances/bee_legacy.svg + scalable/delete.svg scalable/tag.svg diff --git a/launcher/resources/multimc/scalable/instances/bee_legacy.svg b/launcher/resources/multimc/scalable/instances/bee_legacy.svg new file mode 100644 index 000000000..49f216c8f --- /dev/null +++ b/launcher/resources/multimc/scalable/instances/bee_legacy.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/instances/fox.svg b/launcher/resources/multimc/scalable/instances/fox.svg index 687a5b09d..f4b2bf53e 100644 --- a/launcher/resources/multimc/scalable/instances/fox.svg +++ b/launcher/resources/multimc/scalable/instances/fox.svg @@ -35,23 +35,15 @@ y1="11" x2="171" y2="7" - gradientUnits="userSpaceOnUse" /> + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/instances/meat.svg b/launcher/resources/multimc/scalable/instances/meat.svg index c13fa3714..52da5b1c4 100644 --- a/launcher/resources/multimc/scalable/instances/meat.svg +++ b/launcher/resources/multimc/scalable/instances/meat.svg @@ -72,7 +72,7 @@ x="397.64703" y="-389.8125" ry="4" - rx="0" + rx="4" transform="rotate(45)" /> Date: Tue, 22 Nov 2022 17:36:47 -0300 Subject: [PATCH 0320/1149] forgot ftb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- .../multimc/128x128/instances/ftb_glow.png | Bin 0 -> 12708 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 launcher/resources/multimc/128x128/instances/ftb_glow.png diff --git a/launcher/resources/multimc/128x128/instances/ftb_glow.png b/launcher/resources/multimc/128x128/instances/ftb_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..86632b21ded4a18156a011115bdf671a8c998cce GIT binary patch literal 12708 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 AZ~y=R literal 0 HcmV?d00001 From 9daf2a29964d476f831480c0745cc53f72b67de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Thu, 24 Nov 2022 19:40:03 -0300 Subject: [PATCH 0321/1149] resize to 24x24 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- .../multimc/scalable/instances/bee.svg | 47 +++--- .../multimc/scalable/instances/brick.svg | 16 +- .../multimc/scalable/instances/chicken.svg | 49 +++--- .../multimc/scalable/instances/creeper.svg | 16 +- .../multimc/scalable/instances/diamond.svg | 16 +- .../multimc/scalable/instances/dirt.svg | 18 +-- .../multimc/scalable/instances/enderman.svg | 16 +- .../multimc/scalable/instances/enderpearl.svg | 29 ++-- .../multimc/scalable/instances/flame.svg | 23 +-- .../multimc/scalable/instances/fox.svg | 36 ++--- .../multimc/scalable/instances/ftb_logo.svg | 55 ++++--- .../multimc/scalable/instances/gear.svg | 16 +- .../multimc/scalable/instances/gold.svg | 16 +- .../multimc/scalable/instances/grass.svg | 16 +- .../multimc/scalable/instances/herobrine.svg | 57 +++---- .../multimc/scalable/instances/iron.svg | 16 +- .../multimc/scalable/instances/magitech.svg | 26 +-- .../multimc/scalable/instances/meat.svg | 18 +-- .../multimc/scalable/instances/netherstar.svg | 49 ++++-- .../multimc/scalable/instances/planks.svg | 16 +- .../multimc/scalable/instances/skeleton.svg | 16 +- .../scalable/instances/squarecreeper.svg | 16 +- .../multimc/scalable/instances/steve.svg | 152 +++++++++--------- .../multimc/scalable/instances/stone.svg | 16 +- .../multimc/scalable/instances/tnt.svg | 16 +- 25 files changed, 393 insertions(+), 374 deletions(-) diff --git a/launcher/resources/multimc/scalable/instances/bee.svg b/launcher/resources/multimc/scalable/instances/bee.svg index fef2aeb33..110b224ce 100644 --- a/launcher/resources/multimc/scalable/instances/bee.svg +++ b/launcher/resources/multimc/scalable/instances/bee.svg @@ -2,10 +2,10 @@ Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="4" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/brick.svg b/launcher/resources/multimc/scalable/instances/brick.svg index 8264bb43d..b600eba8b 100644 --- a/launcher/resources/multimc/scalable/instances/brick.svg +++ b/launcher/resources/multimc/scalable/instances/brick.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/creeper.svg b/launcher/resources/multimc/scalable/instances/creeper.svg index 38f7ac7a9..4a9fe380f 100644 --- a/launcher/resources/multimc/scalable/instances/creeper.svg +++ b/launcher/resources/multimc/scalable/instances/creeper.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="100" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/diamond.svg b/launcher/resources/multimc/scalable/instances/diamond.svg index e1e1380c2..1d490b918 100644 --- a/launcher/resources/multimc/scalable/instances/diamond.svg +++ b/launcher/resources/multimc/scalable/instances/diamond.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/enderman.svg b/launcher/resources/multimc/scalable/instances/enderman.svg index 483a002eb..29f25a2f2 100644 --- a/launcher/resources/multimc/scalable/instances/enderman.svg +++ b/launcher/resources/multimc/scalable/instances/enderman.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="228" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/enderpearl.svg b/launcher/resources/multimc/scalable/instances/enderpearl.svg index dc4b80f19..e4c1e1041 100644 --- a/launcher/resources/multimc/scalable/instances/enderpearl.svg +++ b/launcher/resources/multimc/scalable/instances/enderpearl.svg @@ -2,10 +2,10 @@ </defs><title id="title132">Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="260" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/flame.svg b/launcher/resources/multimc/scalable/instances/flame.svg index b15fa3ff2..775914b89 100644 --- a/launcher/resources/multimc/scalable/instances/flame.svg +++ b/launcher/resources/multimc/scalable/instances/flame.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + d="M 305.94922,10 C 304.86851,10.02738 304,10.912691 304,12 v 1 a 1,1 0 0 1 -1,-1 v 2 c 0,0.552284 0.44772,1 1,1 0,0.552284 -0.44772,1 -1,1 -0.55228,0 -1,-0.447716 -1,-1 -0.55228,0 -1,0.447716 -1,1 0,1.104568 0.89543,2 2,2 0.55228,0 1,0.447716 1,1 0,-0.552284 0.44772,-1 1,-1 h 1 c 0.55228,0 1,-0.447716 1,-1 v -1 c 0,0.552284 -0.44772,1 -1,1 -0.55228,0 -1,-0.447716 -1,-1 0.55228,0 1,-0.447716 1,-1 v -1 c 0,-0.552284 -0.44772,-1 -1,-1 v -1 c 0,-1.087309 0.86851,-1.97262 1.94922,-2 H 306 c -0.0173,0 -0.0336,-4.35e-4 -0.0508,0 z" /> diff --git a/launcher/resources/multimc/scalable/instances/fox.svg b/launcher/resources/multimc/scalable/instances/fox.svg index f4b2bf53e..95ca6ef91 100644 --- a/launcher/resources/multimc/scalable/instances/fox.svg +++ b/launcher/resources/multimc/scalable/instances/fox.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="164" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/ftb_logo.svg b/launcher/resources/multimc/scalable/instances/ftb_logo.svg index edaed84e2..85e8295eb 100644 --- a/launcher/resources/multimc/scalable/instances/ftb_logo.svg +++ b/launcher/resources/multimc/scalable/instances/ftb_logo.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/gear.svg b/launcher/resources/multimc/scalable/instances/gear.svg index 4bb91e085..b2923d676 100644 --- a/launcher/resources/multimc/scalable/instances/gear.svg +++ b/launcher/resources/multimc/scalable/instances/gear.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="356" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/gold.svg b/launcher/resources/multimc/scalable/instances/gold.svg index 0dd246c57..f1513d70a 100644 --- a/launcher/resources/multimc/scalable/instances/gold.svg +++ b/launcher/resources/multimc/scalable/instances/gold.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher diff --git a/launcher/resources/multimc/scalable/instances/iron.svg b/launcher/resources/multimc/scalable/instances/iron.svg index b20426944..6a6faf77f 100644 --- a/launcher/resources/multimc/scalable/instances/iron.svg +++ b/launcher/resources/multimc/scalable/instances/iron.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="516" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/meat.svg b/launcher/resources/multimc/scalable/instances/meat.svg index 52da5b1c4..0fbfe5a45 100644 --- a/launcher/resources/multimc/scalable/instances/meat.svg +++ b/launcher/resources/multimc/scalable/instances/meat.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="548" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/netherstar.svg b/launcher/resources/multimc/scalable/instances/netherstar.svg index 152b5b1c5..a5d9606eb 100644 --- a/launcher/resources/multimc/scalable/instances/netherstar.svg +++ b/launcher/resources/multimc/scalable/instances/netherstar.svg @@ -2,10 +2,10 @@ Prism Launcher LogoPrism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="612" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/planks.svg b/launcher/resources/multimc/scalable/instances/planks.svg index aad6b8d26..8febfa6bd 100644 --- a/launcher/resources/multimc/scalable/instances/planks.svg +++ b/launcher/resources/multimc/scalable/instances/planks.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="644" + y="4" /> diff --git a/launcher/resources/multimc/scalable/instances/squarecreeper.svg b/launcher/resources/multimc/scalable/instances/squarecreeper.svg index 7b9cffdd5..ddb9aec8c 100644 --- a/launcher/resources/multimc/scalable/instances/squarecreeper.svg +++ b/launcher/resources/multimc/scalable/instances/squarecreeper.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + y="17" /> diff --git a/launcher/resources/multimc/scalable/instances/stone.svg b/launcher/resources/multimc/scalable/instances/stone.svg index 5f8bd526a..6df534d22 100644 --- a/launcher/resources/multimc/scalable/instances/stone.svg +++ b/launcher/resources/multimc/scalable/instances/stone.svg @@ -2,10 +2,10 @@ Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher Prism Launcher Logo19/10/2022Prism LauncherAutiOne, Boba, ely, Fulmine, gon sawa, Pankakes, tobimori, Zekehttps://github.com/PrismLauncher/PrismLauncherCC BY-SA 4.0Prism Launcher + width="24" + height="24" + x="804" + y="4" /> From 71d35dc70b58b14820abeeffd8a8aed067379c75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Thu, 24 Nov 2022 19:43:24 -0300 Subject: [PATCH 0322/1149] meat is now round MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- .../multimc/scalable/instances/meat.svg | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/launcher/resources/multimc/scalable/instances/meat.svg b/launcher/resources/multimc/scalable/instances/meat.svg index 0fbfe5a45..36f0551b0 100644 --- a/launcher/resources/multimc/scalable/instances/meat.svg +++ b/launcher/resources/multimc/scalable/instances/meat.svg @@ -8,12 +8,34 @@ viewBox="0 0 24 24" id="svg168" xml:space="preserve" + sodipodi:docname="meat.svg" + inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/"> Date: Fri, 25 Nov 2022 14:18:19 -0300 Subject: [PATCH 0323/1149] remove unused ftb icon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- .../128x128/instances/ftb_glow_legacy.png | Bin 12708 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 launcher/resources/multimc/128x128/instances/ftb_glow_legacy.png diff --git a/launcher/resources/multimc/128x128/instances/ftb_glow_legacy.png b/launcher/resources/multimc/128x128/instances/ftb_glow_legacy.png deleted file mode 100644 index 86632b21ded4a18156a011115bdf671a8c998cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12708 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 AZ~y=R From c90f2c3ac6d12624ac596a68cf5a9f4da92eb3f6 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sat, 26 Nov 2022 15:05:08 +0100 Subject: [PATCH 0324/1149] fix: use monochrome icon for breeze Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .../breeze_dark/scalable/shortcut.svg | 31 ++++++++++--------- .../breeze_light/scalable/shortcut.svg | 31 ++++++++++--------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/launcher/resources/breeze_dark/scalable/shortcut.svg b/launcher/resources/breeze_dark/scalable/shortcut.svg index 2f24b8c08..5559be1df 100644 --- a/launcher/resources/breeze_dark/scalable/shortcut.svg +++ b/launcher/resources/breeze_dark/scalable/shortcut.svg @@ -1,15 +1,18 @@ - - - - - - - - + + + + + + + diff --git a/launcher/resources/breeze_light/scalable/shortcut.svg b/launcher/resources/breeze_light/scalable/shortcut.svg index 96def1f8c..426769d17 100644 --- a/launcher/resources/breeze_light/scalable/shortcut.svg +++ b/launcher/resources/breeze_light/scalable/shortcut.svg @@ -1,15 +1,18 @@ - - - - - - - - + + + + + + + From 6c09efd6306705fd4cfebdb66710373c90f5ab3a Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sun, 27 Nov 2022 15:24:15 +0100 Subject: [PATCH 0325/1149] fix: use qt 6.4.0 on windows msvc for now qt 6.4.1 has a very bad scaling regression Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f07a86e6b..792215314 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -67,7 +67,7 @@ jobs: qt_ver: 6 qt_host: windows qt_arch: '' - qt_version: '6.4.1' + qt_version: '6.4.0' qt_modules: 'qt5compat qtimageformats' qt_tools: '' From 236c196e681dcbf0547677260d141a7e48047b43 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 27 Nov 2022 18:38:56 +0100 Subject: [PATCH 0326/1149] fix: improve code readability Signed-off-by: Sefa Eyeoglu --- launcher/ui/MainWindow.cpp | 56 ++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 5d2a07f32..c3c4d10f9 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1801,39 +1801,37 @@ void MainWindow::on_actionAddInstance_triggered() void MainWindow::droppedURLs(QList urls) { + // NOTE: This loop only processes one dropped file! for (auto& url : urls) { - if (url.isLocalFile()) { - auto localFileName = url.toLocalFile(); - QFileInfo localFileInfo(localFileName); - - ImportResourcePackDialog dlg(this); - - if (ResourcePackUtils::validate(localFileInfo)) { - dlg.exec(); - - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import resource pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->resourcePackList()->installResource(localFileName); - } - } else if (TexturePackUtils::validate(localFileInfo)) { - dlg.exec(); - - if (dlg.result() == QDialog::Accepted) { - qDebug() << "Selected instance to import texture pack into: " << dlg.selectedInstanceKey; - auto instance = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); - auto instanceButBuffed = std::dynamic_pointer_cast(instance); - instanceButBuffed->texturePackList()->installResource(localFileName); - } - } else { - addInstance(localFileName); - } - } else { + if (!url.isLocalFile()) { // probably instance/modpack addInstance(url.toString()); + break; } - // Only process one dropped file... + auto localFileName = url.toLocalFile(); + QFileInfo localFileInfo(localFileName); + + bool isResourcePack = ResourcePackUtils::validate(localFileInfo); + bool isTexturePack = TexturePackUtils::validate(localFileInfo); + + if (!isResourcePack && !isTexturePack) { // probably instance/modpack + addInstance(localFileName); + break; + } + + ImportResourcePackDialog dlg(this); + + if (dlg.exec() != QDialog::Accepted) + break; + + qDebug() << "Adding resource/texture pack" << localFileName << "to" << dlg.selectedInstanceKey; + + auto inst = APPLICATION->instances()->getInstanceById(dlg.selectedInstanceKey); + auto minecraftInst = std::dynamic_pointer_cast(inst); + if (isResourcePack) + minecraftInst->resourcePackList()->installResource(localFileName); + else if (isTexturePack) + minecraftInst->texturePackList()->installResource(localFileName); break; } } From 8cac61f0bea17036346438761728c3b7bef4fbeb Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 27 Nov 2022 18:41:52 +0100 Subject: [PATCH 0327/1149] fix: check resource pack validity solely using pack format Signed-off-by: Sefa Eyeoglu --- launcher/minecraft/mod/ResourcePack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/mod/ResourcePack.cpp b/launcher/minecraft/mod/ResourcePack.cpp index ef0370d02..4a9ad21bf 100644 --- a/launcher/minecraft/mod/ResourcePack.cpp +++ b/launcher/minecraft/mod/ResourcePack.cpp @@ -117,5 +117,5 @@ bool ResourcePack::applyFilter(QRegularExpression filter) const bool ResourcePack::valid() const { - return s_pack_format_versions.contains(m_pack_format); + return m_pack_format != 0; } From 3cbf8d4993b8c336feb65e6371b777ab0d7865ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santiago=20C=C3=A9zar?= Date: Sun, 27 Nov 2022 16:24:45 -0300 Subject: [PATCH 0328/1149] resolving reviews MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Santiago Cézar --- launcher/resources/multimc/index.theme | 2 +- launcher/resources/multimc/multimc.qrc | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/launcher/resources/multimc/index.theme b/launcher/resources/multimc/index.theme index 1f72c0a76..070e23f10 100644 --- a/launcher/resources/multimc/index.theme +++ b/launcher/resources/multimc/index.theme @@ -2,7 +2,7 @@ Name=multimc Comment=Default Icons Inherits=default -Directories=8x8,16x16,22x22,24x24,32x32,48x48,64x64,256x256,scalable,scalable/instances +Directories=8x8,16x16,22x22,24x24,32x32,32x32/instances,48x48,50x50/instances,64x64,128x128/instances,256x256,scalable,scalable/instances [8x8] Size=8 diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc index 0627fc47f..08b86406e 100644 --- a/launcher/resources/multimc/multimc.qrc +++ b/launcher/resources/multimc/multimc.qrc @@ -6,9 +6,6 @@ scalable/reddit-alien.svg - - scalable/instances/flame.svg - scalable/launcher.svg @@ -254,7 +251,8 @@ scalable/discord.svg - + + scalable/instances/flame.svg scalable/instances/chicken.svg scalable/instances/creeper.svg scalable/instances/enderpearl.svg @@ -285,7 +283,7 @@ 32x32/instances/chicken_legacy.png 128x128/instances/chicken_legacy.png - + 32x32/instances/creeper_legacy.png 128x128/instances/creeper_legacy.png From a5b0b4800a592172ba4ff6c6421bc0f0abdef5e0 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 27 Nov 2022 23:10:32 +0100 Subject: [PATCH 0329/1149] fix: make resource buttons work when instance is running Signed-off-by: Sefa Eyeoglu --- launcher/ui/pages/instance/ExternalResourcesPage.cpp | 11 ----------- launcher/ui/pages/instance/ExternalResourcesPage.h | 1 - launcher/ui/pages/instance/ModFolderPage.cpp | 2 +- launcher/ui/pages/instance/ModFolderPage.h | 2 +- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.cpp b/launcher/ui/pages/instance/ExternalResourcesPage.cpp index b6c873cc2..5c919573f 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.cpp +++ b/launcher/ui/pages/instance/ExternalResourcesPage.cpp @@ -14,8 +14,6 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared { ui->setupUi(this); - ExternalResourcesPage::runningStateChanged(m_instance && m_instance->isRunning()); - ui->actionsToolbar->insertSpacer(ui->actionViewConfigs); m_filterModel = model->createFilterProxyModel(this); @@ -45,7 +43,6 @@ ExternalResourcesPage::ExternalResourcesPage(BaseInstance* instance, std::shared auto selection_model = ui->treeView->selectionModel(); connect(selection_model, &QItemSelectionModel::currentChanged, this, &ExternalResourcesPage::current); connect(ui->filterEdit, &QLineEdit::textChanged, this, &ExternalResourcesPage::filterTextChanged); - connect(m_instance, &BaseInstance::runningStatusChanged, this, &ExternalResourcesPage::runningStateChanged); } ExternalResourcesPage::~ExternalResourcesPage() @@ -97,14 +94,6 @@ void ExternalResourcesPage::filterTextChanged(const QString& newContents) m_filterModel->setFilterRegularExpression(m_viewFilter); } -void ExternalResourcesPage::runningStateChanged(bool running) -{ - if (m_controlsEnabled == !running) - return; - - m_controlsEnabled = !running; -} - bool ExternalResourcesPage::shouldDisplay() const { return true; diff --git a/launcher/ui/pages/instance/ExternalResourcesPage.h b/launcher/ui/pages/instance/ExternalResourcesPage.h index 8e352cef9..11058bf6c 100644 --- a/launcher/ui/pages/instance/ExternalResourcesPage.h +++ b/launcher/ui/pages/instance/ExternalResourcesPage.h @@ -47,7 +47,6 @@ class ExternalResourcesPage : public QMainWindow, public BasePage { protected slots: void itemActivated(const QModelIndex& index); void filterTextChanged(const QString& newContents); - virtual void runningStateChanged(bool running); virtual void addItem(); virtual void removeItem(); diff --git a/launcher/ui/pages/instance/ModFolderPage.cpp b/launcher/ui/pages/instance/ModFolderPage.cpp index f0106066a..0a2e6155e 100644 --- a/launcher/ui/pages/instance/ModFolderPage.cpp +++ b/launcher/ui/pages/instance/ModFolderPage.cpp @@ -108,13 +108,13 @@ ModFolderPage::ModFolderPage(BaseInstance* inst, std::shared_ptr disconnect(mods.get(), &ModFolderModel::updateFinished, this, 0); }); + connect(m_instance, &BaseInstance::runningStatusChanged, this, &ModFolderPage::runningStateChanged); ModFolderPage::runningStateChanged(m_instance && m_instance->isRunning()); } } void ModFolderPage::runningStateChanged(bool running) { - ExternalResourcesPage::runningStateChanged(running); ui->actionDownloadItem->setEnabled(!running); ui->actionUpdateItem->setEnabled(!running); ui->actionAddItem->setEnabled(!running); diff --git a/launcher/ui/pages/instance/ModFolderPage.h b/launcher/ui/pages/instance/ModFolderPage.h index c9a55bde1..f20adf34d 100644 --- a/launcher/ui/pages/instance/ModFolderPage.h +++ b/launcher/ui/pages/instance/ModFolderPage.h @@ -53,12 +53,12 @@ class ModFolderPage : public ExternalResourcesPage { virtual QString helpPage() const override { return "Loader-mods"; } virtual bool shouldDisplay() const override; - void runningStateChanged(bool running) override; public slots: bool onSelectionChanged(const QModelIndex& current, const QModelIndex& previous) override; private slots: + void runningStateChanged(bool running); void removeItem() override; void installMods(); From 4e27e132a06974854f1c49dd8fb7a776915f5d03 Mon Sep 17 00:00:00 2001 From: flow Date: Mon, 28 Nov 2022 12:02:38 -0300 Subject: [PATCH 0330/1149] fix: don't disable interaction on non-mod models when inst. is running It is still useful for mods though, since we don't wnt to allow disabling mods when the instance is running, as that wouldn't affect the running instance, possibly causing confusion Signed-off-by: flow --- launcher/minecraft/MinecraftInstance.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp index 70d0b9492..a3adb2682 100644 --- a/launcher/minecraft/MinecraftInstance.cpp +++ b/launcher/minecraft/MinecraftInstance.cpp @@ -1110,8 +1110,6 @@ std::shared_ptr MinecraftInstance::resourcePackList() c if (!m_resource_pack_list) { m_resource_pack_list.reset(new ResourcePackFolderModel(resourcePacksDir())); - m_resource_pack_list->enableInteraction(!isRunning()); - connect(this, &BaseInstance::runningStatusChanged, m_resource_pack_list.get(), &ResourcePackFolderModel::disableInteraction); } return m_resource_pack_list; } @@ -1121,8 +1119,6 @@ std::shared_ptr MinecraftInstance::texturePackList() con if (!m_texture_pack_list) { m_texture_pack_list.reset(new TexturePackFolderModel(texturePacksDir())); - m_texture_pack_list->disableInteraction(isRunning()); - connect(this, &BaseInstance::runningStatusChanged, m_texture_pack_list.get(), &ModFolderModel::disableInteraction); } return m_texture_pack_list; } @@ -1132,8 +1128,6 @@ std::shared_ptr MinecraftInstance::shaderPackList() const if (!m_shader_pack_list) { m_shader_pack_list.reset(new ShaderPackFolderModel(shaderPacksDir())); - m_shader_pack_list->disableInteraction(isRunning()); - connect(this, &BaseInstance::runningStatusChanged, m_shader_pack_list.get(), &ModFolderModel::disableInteraction); } return m_shader_pack_list; } From 31dc82b1a64fef40ab8fadbbb80d7641456bbb0a Mon Sep 17 00:00:00 2001 From: TheKodeToad Date: Tue, 29 Nov 2022 09:43:08 +0000 Subject: [PATCH 0331/1149] Make requested changes Signed-off-by: TheKodeToad --- launcher/minecraft/PackProfile.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/launcher/minecraft/PackProfile.cpp b/launcher/minecraft/PackProfile.cpp index bbdf51d88..43fa3f8d6 100644 --- a/launcher/minecraft/PackProfile.cpp +++ b/launcher/minecraft/PackProfile.cpp @@ -838,15 +838,12 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) QFileInfo sourceInfo(filepath); QString id = QUuid::createUuid().toString(QUuid::WithoutBraces); QString target_filename = id + ".jar"; - QString target_id = "org.multimc.jarmod." + id; + QString target_id = "custom.jarmod." + id; QString target_name = sourceInfo.completeBaseName() + " (jar mod)"; QString finalPath = FS::PathCombine(d->m_instance->jarModsDir(), target_filename); QFileInfo targetInfo(finalPath); - if(targetInfo.exists()) - { - return false; - } + Q_ASSERT(!targetInfo.exists()); if (!QFile::copy(sourceInfo.absoluteFilePath(),QFileInfo(finalPath).absoluteFilePath())) { @@ -855,7 +852,7 @@ bool PackProfile::installJarMods_internal(QStringList filepaths) auto f = std::make_shared(); auto jarMod = std::make_shared(); - jarMod->setRawName(GradleSpecifier("org.multimc.jarmods:" + id + ":1")); + jarMod->setRawName(GradleSpecifier("custom.jarmods:" + id + ":1")); jarMod->setFilename(target_filename); jarMod->setDisplayName(sourceInfo.completeBaseName()); jarMod->setHint("local"); @@ -895,7 +892,7 @@ bool PackProfile::installCustomJar_internal(QString filepath) return false; } - auto specifier = GradleSpecifier("org.multimc:customjar:1"); + auto specifier = GradleSpecifier("custom:customjar:1"); QFileInfo sourceInfo(filepath); QString target_filename = specifier.getFileName(); QString target_id = specifier.artifactId(); @@ -957,13 +954,12 @@ bool PackProfile::installAgents_internal(QStringList filepaths) const QFileInfo sourceInfo(source); const QString id = QUuid::createUuid().toString(QUuid::WithoutBraces); const QString targetBaseName = id + ".jar"; - const QString targetId = "org.prismlauncher.agent." + id; + const QString targetId = "custom.agent." + id; const QString targetName = sourceInfo.completeBaseName() + " (agent)"; const QString target = FS::PathCombine(d->m_instance->getLocalLibraryPath(), targetBaseName); const QFileInfo targetInfo(target); - if (targetInfo.exists()) - return false; + Q_ASSERT(!targetInfo.exists()); if (!QFile::copy(source, target)) return false; @@ -972,7 +968,7 @@ bool PackProfile::installAgents_internal(QStringList filepaths) auto agent = std::make_shared(); - agent->setRawName("org.prismlauncher.agents:" + id + ":1"); + agent->setRawName("custom.agents:" + id + ":1"); agent->setFilename(targetBaseName); agent->setDisplayName(sourceInfo.completeBaseName()); agent->setHint("local"); From 52d06ed8147bffc191d01c9eddc9aec050a5998d Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 29 Nov 2022 20:07:00 +0100 Subject: [PATCH 0332/1149] chore: move instance_icons.svg Signed-off-by: Sefa Eyeoglu --- {launcher/resources => program_info}/instance_icons.svg | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {launcher/resources => program_info}/instance_icons.svg (100%) diff --git a/launcher/resources/instance_icons.svg b/program_info/instance_icons.svg similarity index 100% rename from launcher/resources/instance_icons.svg rename to program_info/instance_icons.svg From 5efa725e92e87497287408c8d4d011e63aa214bb Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sat, 5 Nov 2022 08:25:10 +0100 Subject: [PATCH 0333/1149] feat(actions) add arm64 build Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 53 ++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 792215314..d957f6275 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,6 +71,18 @@ jobs: qt_modules: 'qt5compat qtimageformats' qt_tools: '' + - os: windows-2022 + name: "Windows-MSVC-arm64" + msystem: '' + architecture: 'arm64' + vcvars_arch: 'amd64_arm64' + qt_ver: 6 + qt_host: windows + qt_arch: 'win64_msvc2019_arm64' + qt_version: '6.4.0' + qt_modules: 'qt5compat qtimageformats' + qt_tools: '' + - os: macos-12 name: macOS macosx_deployment_target: 10.15 @@ -139,7 +151,7 @@ jobs: if: (runner.os != 'Windows' || matrix.msystem == '') && inputs.build_type == 'Debug' uses: hendrikmuhs/ccache-action@v1.2.5 with: - key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} + key: ${{ matrix.os }}-qt${{ matrix.qt_ver }}-${{ matrix.architecture }} - name: Setup ccache (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug' @@ -188,8 +200,23 @@ jobs: if: runner.os == 'Linux' && matrix.qt_ver != 6 run: | sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 - - - name: Install Qt (macOS, AppImage & Windows MSVC) + + - name: Install host Qt (Windows MSVC arm64) + if: runner.os == 'Windows' && matrix.architecture == 'arm64' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ matrix.qt_version }} + host: 'windows' + target: 'desktop' + arch: '' + modules: ${{ matrix.qt_modules }} + tools: ${{ matrix.qt_tools }} + cache: ${{ inputs.is_qt_cached }} + cache-key-prefix: host-qt-arm64-windows + dir: ${{ github.workspace }}\HostQt + set-env: false + + - name: Install Qt (macOS, Linux, Qt 6 & Windows MSVC) if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '') uses: jurplel/install-qt-action@v3 with: @@ -201,6 +228,13 @@ jobs: tools: ${{ matrix.qt_tools }} cache: ${{ inputs.is_qt_cached }} + - name: Install MSVC (Windows MSVC) + if: runner.os == 'Windows' && matrix.msystem == '' + uses: ilammy/msvc-dev-cmd@v1 + with: + vsversion: 2022 + arch: ${{ matrix.vcvars_arch }} + - name: Prepare AppImage (Linux) if: runner.os == 'Linux' && matrix.qt_ver != 5 run: | @@ -210,6 +244,11 @@ jobs: ${{ github.workspace }}/.github/scripts/prepare_JREs.sh + - name: Add QT_HOST_PATH var (Windows MSVC arm64) + if: runner.os == 'Windows' && matrix.architecture == 'arm64' + run: | + echo "QT_HOST_PATH=${{ github.workspace }}\HostQt\Qt\${{ matrix.qt_version }}\msvc2019_64" >> $env:GITHUB_ENV + ## # CONFIGURE ## @@ -286,7 +325,7 @@ jobs: ctest -E "^example64|example$" --test-dir build --output-on-failure - name: Test (Windows MSVC) - if: runner.os == 'Windows' && matrix.msystem == '' + if: runner.os == 'Windows' && matrix.msystem == '' && matrix.architecture != 'arm64' run: | ctest -E "^example64|example$" --test-dir build --output-on-failure -C ${{ inputs.build_type }} @@ -324,12 +363,6 @@ jobs: EOF fi - - name: Add VC Enviroment Variables - if: runner.os == 'Windows' && matrix.msystem == '' - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: ${{ matrix.vcvars_arch }} - - name: Package (Windows MinGW-w64) if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} From efef2e95ab63fa06d0d46506aa3af3e096fb1589 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Thu, 24 Nov 2022 11:53:29 +0000 Subject: [PATCH 0334/1149] Use ECMQueryQt Only with Qt5 Qt6 provides CMake variables for the paths we need Signed-off-by: TheLastRar --- CMakeLists.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f04b733be..4a80e87bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,11 +235,18 @@ else() message(FATAL_ERROR "Qt version ${Launcher_QT_VERSION_MAJOR} is not supported") endif() -include(ECMQueryQt) -ecm_query_qt(QT_PLUGINS_DIR QT_INSTALL_PLUGINS) -ecm_query_qt(QT_LIBS_DIR QT_INSTALL_LIBS) -ecm_query_qt(QT_LIBEXECS_DIR QT_INSTALL_LIBEXECS) -ecm_query_qt(QT_DATA_DIR QT_HOST_DATA) +if(Launcher_QT_VERSION_MAJOR EQUAL 5) + include(ECMQueryQt) + ecm_query_qt(QT_PLUGINS_DIR QT_INSTALL_PLUGINS) + ecm_query_qt(QT_LIBS_DIR QT_INSTALL_LIBS) + ecm_query_qt(QT_LIBEXECS_DIR QT_INSTALL_LIBEXECS) + ecm_query_qt(QT_DATA_DIR QT_HOST_DATA) +else() + set(QT_PLUGINS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_PLUGINS}) + set(QT_LIBS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_LIBS}) + set(QT_LIBEXECS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_LIBEXECS}) + set(QT_DATA_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_DATA}) +endif() set(QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) # NOTE: Qt 6 already sets this by default From 94d164c0f2a2ab80515351d422cefffbdbf6c910 Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Thu, 24 Nov 2022 13:09:17 +0000 Subject: [PATCH 0335/1149] Remove unused QT_DATA_DIR/QT_MKSPECS_DIR Signed-off-by: TheLastRar --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a80e87bc..5c326cfa4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -240,14 +240,11 @@ if(Launcher_QT_VERSION_MAJOR EQUAL 5) ecm_query_qt(QT_PLUGINS_DIR QT_INSTALL_PLUGINS) ecm_query_qt(QT_LIBS_DIR QT_INSTALL_LIBS) ecm_query_qt(QT_LIBEXECS_DIR QT_INSTALL_LIBEXECS) - ecm_query_qt(QT_DATA_DIR QT_HOST_DATA) else() set(QT_PLUGINS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_PLUGINS}) set(QT_LIBS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_LIBS}) set(QT_LIBEXECS_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_LIBEXECS}) - set(QT_DATA_DIR ${QT${QT_VERSION_MAJOR}_INSTALL_PREFIX}/${QT${QT_VERSION_MAJOR}_INSTALL_DATA}) endif() -set(QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) # NOTE: Qt 6 already sets this by default if (Qt5_POSITION_INDEPENDENT_CODE) From 24193163e102c7421261497b42bb44d22bbf09ef Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Fri, 25 Nov 2022 03:54:15 +0000 Subject: [PATCH 0336/1149] Maybe fix ResourceFolderModel Clang64 test failure Previously this test would fail sometimes without including ECMQueryQt Signed-off-by: TheLastRar --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c326cfa4..2bdd4811d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -221,7 +221,7 @@ if(Launcher_QT_VERSION_MAJOR EQUAL 5) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNICODE -D_UNICODE") elseif(Launcher_QT_VERSION_MAJOR EQUAL 6) set(QT_VERSION_MAJOR 6) - find_package(Qt6 REQUIRED COMPONENTS Core Widgets Concurrent Network Test Xml Core5Compat) + find_package(Qt6 REQUIRED COMPONENTS Core CoreTools Widgets Concurrent Network Test Xml Core5Compat) list(APPEND Launcher_QT_LIBS Qt6::Core5Compat) if(NOT Launcher_FORCE_BUNDLED_LIBS) From 99dd9874df18fc7bea6114466c3c36597cf7d849 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sat, 26 Nov 2022 08:41:41 +0100 Subject: [PATCH 0337/1149] refactor+fix: refactor the windows part of the release workflow and add arm to it Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 6 ++--- .github/workflows/trigger_release.yml | 36 +++++++++++++++++++-------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d957f6275..b18ef30ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,17 +38,17 @@ jobs: qt_tools: '' - os: windows-2022 - name: "Windows-Legacy" + name: "Windows-MinGW-w64-Legacy" msystem: clang32 qt_ver: 5 - os: windows-2022 - name: "Windows" + name: "Windows-MinGW-w64" msystem: clang64 qt_ver: 6 - os: windows-2022 - name: "Windows-Legacy-MSVC" + name: "Windows-MSVC-Legacy" msystem: '' architecture: 'win32' vcvars_arch: 'amd64_x86' diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index 8baa9693a..ac20c943f 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -46,14 +46,27 @@ jobs: tar -czf PrismLauncher-${{ env.VERSION }}.tar.gz PrismLauncher-${{ env.VERSION }} - for d in PrismLauncher-Windows-*; do + for d in PrismLauncher-Windows-MSVC*; do + cd "${d}" || continue + LEGACY="$(echo -n ${d} | grep -o Legacy || true)" + ARM64="$(echo -n ${d} | grep -o arm64 || true)" + INST="$(echo -n ${d} | grep -o Setup || true)" + PORT="$(echo -n ${d} | grep -o Portable || true)" + NAME="PrismLauncher-Windows-MSVC" + test -z "${LEGACY}" || NAME="${NAME}-Legacy" + test -z "${ARM64}" || NAME="${NAME}-arm64" + test -z "${PORT}" || NAME="${NAME}-Portable" + test -z "${INST}" || mv PrismLauncher-*.exe ../${NAME}-Setup-${{ env.VERSION }}.exe + test -n "${INST}" || zip -r -9 "../${NAME}-${{ env.VERSION }}.zip" * + cd .. + done + + for d in PrismLauncher-Windows-MinGW-w64*; do cd "${d}" || continue - MSVC="$(echo -n ${d} | grep -o MSVC || true)" LEGACY="$(echo -n ${d} | grep -o Legacy || true)" INST="$(echo -n ${d} | grep -o Setup || true)" PORT="$(echo -n ${d} | grep -o Portable || true)" - NAME="PrismLauncher-Windows" - test -z "${MSVC}" && NAME="${NAME}-MinGW" || NAME="${NAME}-MSVC" + NAME="PrismLauncher-Windows-MinGW-w64" test -z "${LEGACY}" || NAME="${NAME}-Legacy" test -z "${PORT}" || NAME="${NAME}-Portable" test -z "${INST}" || mv PrismLauncher-*.exe ../${NAME}-Setup-${{ env.VERSION }}.exe @@ -77,15 +90,18 @@ jobs: PrismLauncher-Linux-${{ env.VERSION }}-x86_64.AppImage PrismLauncher-Linux-Qt6-${{ env.VERSION }}.tar.gz PrismLauncher-Linux-Qt6-Portable-${{ env.VERSION }}.tar.gz - PrismLauncher-Windows-MinGW-Legacy-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-Legacy-Portable-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-Legacy-Setup-${{ env.VERSION }}.exe - PrismLauncher-Windows-MinGW-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-Portable-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MinGW-w64-Legacy-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-w64-Legacy-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-w64-Legacy-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MinGW-w64-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-w64-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MinGW-w64-Setup-${{ env.VERSION }}.exe PrismLauncher-Windows-MSVC-Legacy-${{ env.VERSION }}.zip PrismLauncher-Windows-MSVC-Legacy-Portable-${{ env.VERSION }}.zip PrismLauncher-Windows-MSVC-Legacy-Setup-${{ env.VERSION }}.exe + PrismLauncher-Windows-MSVC-arm64-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-arm64-Portable-${{ env.VERSION }}.zip + PrismLauncher-Windows-MSVC-arm64-Setup-${{ env.VERSION }}.exe PrismLauncher-Windows-MSVC-${{ env.VERSION }}.zip PrismLauncher-Windows-MSVC-Portable-${{ env.VERSION }}.zip PrismLauncher-Windows-MSVC-Setup-${{ env.VERSION }}.exe From 4c1c26a0e61fa492abb3715fe294fa25ca129649 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Wed, 30 Nov 2022 13:52:02 +0100 Subject: [PATCH 0338/1149] chore: drop Windows-MinGW-w64-Legacy this brings back the number of builds as the same as before the pr this is one of the slowest builds + windows 7/8.1 users can just use Windows-MSVC-Legacy Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .github/workflows/build.yml | 27 ++++++++------------------- .github/workflows/trigger_release.yml | 5 ----- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b18ef30ff..1ba5d0e48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,15 +37,9 @@ jobs: qt_modules: 'qt5compat qtimageformats' qt_tools: '' - - os: windows-2022 - name: "Windows-MinGW-w64-Legacy" - msystem: clang32 - qt_ver: 5 - - os: windows-2022 name: "Windows-MinGW-w64" msystem: clang64 - qt_ver: 6 - os: windows-2022 name: "Windows-MSVC-Legacy" @@ -135,12 +129,12 @@ jobs: cmake:p extra-cmake-modules:p ninja:p - qt${{ matrix.qt_ver }}-base:p - qt${{ matrix.qt_ver }}-svg:p - qt${{ matrix.qt_ver }}-imageformats:p - quazip-qt${{ matrix.qt_ver }}:p + qt6-base:p + qt6-svg:p + qt6-imageformats:p + quazip-qt6:p ccache:p - ${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }} + qt6-5compat:p - name: Force newer ccache if: runner.os == 'Windows' && matrix.msystem == '' && inputs.build_type == 'Debug' @@ -174,9 +168,9 @@ jobs: uses: actions/cache@v3.0.11 with: path: '${{ github.workspace }}\.ccache' - key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} + key: ${{ matrix.os }}-mingw-w64 restore-keys: | - ${{ matrix.os }}-qt${{ matrix.qt_ver }} + ${{ matrix.os }}-mingw-w64 - name: Set short version shell: bash @@ -267,7 +261,7 @@ jobs: if: runner.os == 'Windows' && matrix.msystem != '' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=6 -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja - name: Configure CMake (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' @@ -369,11 +363,6 @@ jobs: run: | cmake --install ${{ env.BUILD_DIR }} - cd ${{ env.INSTALL_DIR }} - if [ "${{ matrix.qt_ver }}" == "5" ]; then - cp /clang32/bin/libcrypto-1_1.dll /clang32/bin/libssl-1_1.dll ./ - fi - - name: Package (Windows MSVC) if: runner.os == 'Windows' && matrix.msystem == '' run: | diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index ac20c943f..a2f89819c 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -63,11 +63,9 @@ jobs: for d in PrismLauncher-Windows-MinGW-w64*; do cd "${d}" || continue - LEGACY="$(echo -n ${d} | grep -o Legacy || true)" INST="$(echo -n ${d} | grep -o Setup || true)" PORT="$(echo -n ${d} | grep -o Portable || true)" NAME="PrismLauncher-Windows-MinGW-w64" - test -z "${LEGACY}" || NAME="${NAME}-Legacy" test -z "${PORT}" || NAME="${NAME}-Portable" test -z "${INST}" || mv PrismLauncher-*.exe ../${NAME}-Setup-${{ env.VERSION }}.exe test -n "${INST}" || zip -r -9 "../${NAME}-${{ env.VERSION }}.zip" * @@ -90,9 +88,6 @@ jobs: PrismLauncher-Linux-${{ env.VERSION }}-x86_64.AppImage PrismLauncher-Linux-Qt6-${{ env.VERSION }}.tar.gz PrismLauncher-Linux-Qt6-Portable-${{ env.VERSION }}.tar.gz - PrismLauncher-Windows-MinGW-w64-Legacy-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-w64-Legacy-Portable-${{ env.VERSION }}.zip - PrismLauncher-Windows-MinGW-w64-Legacy-Setup-${{ env.VERSION }}.exe PrismLauncher-Windows-MinGW-w64-${{ env.VERSION }}.zip PrismLauncher-Windows-MinGW-w64-Portable-${{ env.VERSION }}.zip PrismLauncher-Windows-MinGW-w64-Setup-${{ env.VERSION }}.exe From a116778402bd98ee079488d8c5a27933369e9046 Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 1 Dec 2022 15:15:15 -0300 Subject: [PATCH 0339/1149] fix(Inst.Import): don't search inside 'overrides/' for the manifest It will never be there anyways, and saves a **bunch** of time when the overrides folder is big and we traverse all the tree when searching for the MMC 'instance.cfg' file. Signed-off-by: flow --- launcher/InstanceImportTask.cpp | 10 +++------- launcher/MMCZip.cpp | 27 ++++++++++++++++----------- launcher/MMCZip.h | 4 +++- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/launcher/InstanceImportTask.cpp b/launcher/InstanceImportTask.cpp index b490620d5..5f4596490 100644 --- a/launcher/InstanceImportTask.cpp +++ b/launcher/InstanceImportTask.cpp @@ -164,18 +164,14 @@ void InstanceImportTask::processZipPack() } else { - QString mmcRoot = MMCZip::findFolderOfFileInZip(m_packZip.get(), "instance.cfg"); - QString flameRoot = MMCZip::findFolderOfFileInZip(m_packZip.get(), "manifest.json"); + QStringList paths_to_ignore { "overrides/" }; - if (!mmcRoot.isNull()) - { + if (QString mmcRoot = MMCZip::findFolderOfFileInZip(m_packZip.get(), "instance.cfg", paths_to_ignore); !mmcRoot.isNull()) { // process as MultiMC instance/pack qDebug() << "MultiMC:" << mmcRoot; root = mmcRoot; m_modpackType = ModpackType::MultiMC; - } - else if(!flameRoot.isNull()) - { + } else if (QString flameRoot = MMCZip::findFolderOfFileInZip(m_packZip.get(), "manifest.json", paths_to_ignore); !flameRoot.isNull()) { // process as Flame pack qDebug() << "Flame:" << flameRoot; root = flameRoot; diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp index 9f4e968f7..f66003432 100644 --- a/launcher/MMCZip.cpp +++ b/launcher/MMCZip.cpp @@ -39,6 +39,7 @@ #include "MMCZip.h" #include "FileSystem.h" +#include #include // ours @@ -228,23 +229,27 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const } // ours -QString MMCZip::findFolderOfFileInZip(QuaZip * zip, const QString & what, const QString &root) +QString MMCZip::findFolderOfFileInZip(QuaZip* zip, const QString& what, const QStringList& ignore_paths, const QString& root) { QuaZipDir rootDir(zip, root); - for(auto fileName: rootDir.entryList(QDir::Files)) - { - if(fileName == what) + for (auto&& fileName : rootDir.entryList(QDir::Files)) { + if (fileName == what) return root; + + QCoreApplication::processEvents(); } - for(auto fileName: rootDir.entryList(QDir::Dirs)) - { - QString result = findFolderOfFileInZip(zip, what, root + fileName); - if(!result.isEmpty()) - { + + // Recurse the search to non-ignored subfolders + for (auto&& fileName : rootDir.entryList(QDir::Dirs)) { + if (ignore_paths.contains(fileName)) + continue; + + QString result = findFolderOfFileInZip(zip, what, ignore_paths, root + fileName); + if (!result.isEmpty()) return result; - } } - return QString(); + + return {}; } // ours diff --git a/launcher/MMCZip.h b/launcher/MMCZip.h index ce9775bdb..81f9cb908 100644 --- a/launcher/MMCZip.h +++ b/launcher/MMCZip.h @@ -80,9 +80,11 @@ namespace MMCZip /** * Find a single file in archive by file name (not path) * + * \param ignore_paths paths to skip when recursing the search + * * \return the path prefix where the file is */ - QString findFolderOfFileInZip(QuaZip * zip, const QString & what, const QString &root = QString("")); + QString findFolderOfFileInZip(QuaZip * zip, const QString & what, const QStringList& ignore_paths = {}, const QString &root = QString("")); /** * Find a multiple files of the same name in archive by file name From 79b79b752ce9c22764601da8c4ad7ca77ab8a016 Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 1 Dec 2022 15:32:26 -0300 Subject: [PATCH 0340/1149] fix(Inst.Import): Show error reason in fail dialog Signed-off-by: flow --- launcher/InstanceCreationTask.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/launcher/InstanceCreationTask.cpp b/launcher/InstanceCreationTask.cpp index 3971effaf..73dc17891 100644 --- a/launcher/InstanceCreationTask.cpp +++ b/launcher/InstanceCreationTask.cpp @@ -25,9 +25,13 @@ void InstanceCreationTask::executeTask() return; qWarning() << "Instance creation failed!"; - if (!m_error_message.isEmpty()) + if (!m_error_message.isEmpty()) { qWarning() << "Reason: " << m_error_message; - emitFailed(tr("Error while creating new instance.")); + emitFailed(tr("Error while creating new instance:\n%1").arg(m_error_message)); + } else { + emitFailed(tr("Error while creating new instance.")); + } + return; } From 386fb28a35e4195838c0711dc894626a5d259c0e Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 1 Dec 2022 15:33:35 -0300 Subject: [PATCH 0341/1149] fix(FileResolvingTask): Fail instead of crash when there's API errors Also remove non-used variable (rip). Signed-off-by: flow --- .../modplatform/flame/FileResolvingTask.cpp | 20 +++++++++++++++---- .../flame/FlameInstanceCreationTask.cpp | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 25b56fbd1..7f1beb1af 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -42,12 +42,25 @@ void Flame::FileResolvingTask::executeTask() void Flame::FileResolvingTask::netJobFinished() { setProgress(1, 3); - int index = 0; // job to check modrinth for blocked projects m_checkJob = new NetJob("Modrinth check", m_network); blockedProjects = QMap(); - auto doc = Json::requireDocument(*result); - auto array = Json::requireArray(doc.object()["data"]); + + QJsonDocument doc; + QJsonArray array; + + try { + doc = Json::requireDocument(*result); + array = Json::requireArray(doc.object()["data"]); + } catch (Json::JsonException& e) { + qCritical() << "Non-JSON data returned from the CF API"; + qCritical() << e.cause(); + + emitFailed(tr("Invalid data returned from the API.")); + + return; + } + for (QJsonValueRef file : array) { auto fileid = Json::requireInteger(Json::requireObject(file)["id"]); auto& out = m_toProcess.files[fileid]; @@ -68,7 +81,6 @@ void Flame::FileResolvingTask::netJobFinished() blockedProjects.insert(&out, output); } } - index++; } connect(m_checkJob.get(), &NetJob::finished, this, &Flame::FileResolvingTask::modrinthCheckFinished); diff --git a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp index 91554b587..a00c948a8 100644 --- a/launcher/modplatform/flame/FlameInstanceCreationTask.cpp +++ b/launcher/modplatform/flame/FlameInstanceCreationTask.cpp @@ -338,6 +338,7 @@ bool FlameCreationTask::createInstance() connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::failed, [&](QString reason) { m_mod_id_resolver.reset(); setError(tr("Unable to resolve mod IDs:\n") + reason); + loop.quit(); }); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::progress, this, &FlameCreationTask::setProgress); connect(m_mod_id_resolver.get(), &Flame::FileResolvingTask::status, this, &FlameCreationTask::setStatus); From 3cc987a5b4afdc0b8df5be420fc6d1e2a19fbe66 Mon Sep 17 00:00:00 2001 From: flow Date: Thu, 1 Dec 2022 22:54:03 -0300 Subject: [PATCH 0342/1149] fix: explicitly set scheme for local file in -I argument Otherwise isLocalFile() will return false for local files without the file:// thingy. Signed-off-by: flow --- launcher/ui/MainWindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index e2fb10954..b626bbae5 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -1817,6 +1817,10 @@ void MainWindow::droppedURLs(QList urls) { // NOTE: This loop only processes one dropped file! for (auto& url : urls) { + // The isLocalFile() check below doesn't work as intended without an explicit scheme. + if (url.scheme().isEmpty()) + url.setScheme("file"); + if (!url.isLocalFile()) { // probably instance/modpack addInstance(url.toString()); break; From 5c6f32507176a0067df8728814ea26d3159e1d61 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 2 Dec 2022 20:47:11 +0100 Subject: [PATCH 0343/1149] Remove blue-ish tint from remaining flat white icons Signed-off-by: Sefa Eyeoglu --- launcher/resources/flat_white/scalable/shortcut.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/resources/flat_white/scalable/shortcut.svg b/launcher/resources/flat_white/scalable/shortcut.svg index b419a77d4..77ccbdd46 100644 --- a/launcher/resources/flat_white/scalable/shortcut.svg +++ b/launcher/resources/flat_white/scalable/shortcut.svg @@ -1,3 +1,3 @@ - + From fa3caf091aca8bc784464e3bdf2fe51a09f7d759 Mon Sep 17 00:00:00 2001 From: Ryan Cao <70191398+ryanccn@users.noreply.github.com> Date: Sat, 3 Dec 2022 21:54:41 +0800 Subject: [PATCH 0344/1149] fix: warn before trashing instances Signed-off-by: Ryan Cao <70191398+ryanccn@users.noreply.github.com> --- launcher/ui/MainWindow.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index b626bbae5..91cc5f292 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -2088,27 +2088,25 @@ void MainWindow::on_actionAbout_triggered() void MainWindow::on_actionDeleteInstance_triggered() { - if (!m_selectedInstance) - { + if (!m_selectedInstance) { return; } auto id = m_selectedInstance->id(); - if (APPLICATION->instances()->trashInstance(id)) { - ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); - return; - } - - auto response = CustomMessageBox::selectable( - this, - tr("CAREFUL!"), - tr("About to delete: %1\nThis is permanent and will completely delete the instance.\n\nAre you sure?").arg(m_selectedInstance->name()), - QMessageBox::Warning, - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No - )->exec(); - if (response == QMessageBox::Yes) - { + + auto response = + CustomMessageBox::selectable(this, tr("CAREFUL!"), + tr("About to delete: %1\nThis may be permanent and will completely delete the instance.\n\nAre you sure?") + .arg(m_selectedInstance->name()), + QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) + ->exec(); + + if (response == QMessageBox::Yes) { + if (APPLICATION->instances()->trashInstance(id)) { + ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); + return; + } + APPLICATION->instances()->deleteInstance(id); } } From 70620d51374d677bd6cafc21b470446696c9e0a0 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Sun, 4 Dec 2022 12:45:36 +0100 Subject: [PATCH 0345/1149] feat: add a proper server icon Signed-off-by: DioEgizio <83089242+DioEgizio@users.noreply.github.com> --- .../resources/breeze_dark/breeze_dark.qrc | 1 + .../resources/breeze_dark/scalable/server.svg | 13 + .../resources/breeze_light/breeze_light.qrc | 1 + .../breeze_light/scalable/server.svg | 13 + launcher/resources/flat/flat.qrc | 1 + launcher/resources/flat/scalable/server.svg | 1 + launcher/resources/flat_white/flat_white.qrc | 1 + .../resources/flat_white/scalable/server.svg | 1 + launcher/resources/multimc/multimc.qrc | 1 + .../resources/multimc/scalable/server.svg | 9764 +++++++++++++++++ launcher/ui/pages/instance/ServersPage.h | 2 +- 11 files changed, 9798 insertions(+), 1 deletion(-) create mode 100644 launcher/resources/breeze_dark/scalable/server.svg create mode 100644 launcher/resources/breeze_light/scalable/server.svg create mode 100644 launcher/resources/flat/scalable/server.svg create mode 100644 launcher/resources/flat_white/scalable/server.svg create mode 100644 launcher/resources/multimc/scalable/server.svg diff --git a/launcher/resources/breeze_dark/breeze_dark.qrc b/launcher/resources/breeze_dark/breeze_dark.qrc index 97434abc4..79707828f 100644 --- a/launcher/resources/breeze_dark/breeze_dark.qrc +++ b/launcher/resources/breeze_dark/breeze_dark.qrc @@ -40,5 +40,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/server.svg diff --git a/launcher/resources/breeze_dark/scalable/server.svg b/launcher/resources/breeze_dark/scalable/server.svg new file mode 100644 index 000000000..7d9af3e71 --- /dev/null +++ b/launcher/resources/breeze_dark/scalable/server.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/breeze_light/breeze_light.qrc b/launcher/resources/breeze_light/breeze_light.qrc index 6d868b183..ae8dbf3be 100644 --- a/launcher/resources/breeze_light/breeze_light.qrc +++ b/launcher/resources/breeze_light/breeze_light.qrc @@ -40,5 +40,6 @@ scalable/export.svg scalable/rename.svg scalable/launch.svg + scalable/server.svg diff --git a/launcher/resources/breeze_light/scalable/server.svg b/launcher/resources/breeze_light/scalable/server.svg new file mode 100644 index 000000000..52d7dd7d2 --- /dev/null +++ b/launcher/resources/breeze_light/scalable/server.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/launcher/resources/flat/flat.qrc b/launcher/resources/flat/flat.qrc index a846bd2dc..cadf87364 100644 --- a/launcher/resources/flat/flat.qrc +++ b/launcher/resources/flat/flat.qrc @@ -47,6 +47,7 @@ scalable/tag.svg scalable/export.svg scalable/rename.svg + scalable/server.svg scalable/launch.svg diff --git a/launcher/resources/flat/scalable/server.svg b/launcher/resources/flat/scalable/server.svg new file mode 100644 index 000000000..49c22b38c --- /dev/null +++ b/launcher/resources/flat/scalable/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/flat_white/flat_white.qrc b/launcher/resources/flat_white/flat_white.qrc index b0759d8fd..2701462fe 100644 --- a/launcher/resources/flat_white/flat_white.qrc +++ b/launcher/resources/flat_white/flat_white.qrc @@ -48,5 +48,6 @@ scalable/rename.svg scalable/tag.svg scalable/launch.svg + scalable/server.svg diff --git a/launcher/resources/flat_white/scalable/server.svg b/launcher/resources/flat_white/scalable/server.svg new file mode 100644 index 000000000..f41db1b22 --- /dev/null +++ b/launcher/resources/flat_white/scalable/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/launcher/resources/multimc/multimc.qrc b/launcher/resources/multimc/multimc.qrc index 42b496dad..9712698d2 100644 --- a/launcher/resources/multimc/multimc.qrc +++ b/launcher/resources/multimc/multimc.qrc @@ -346,5 +346,6 @@ scalable/export.svg scalable/launch.svg + scalable/server.svg diff --git a/launcher/resources/multimc/scalable/server.svg b/launcher/resources/multimc/scalable/server.svg new file mode 100644 index 000000000..c6a957b36 --- /dev/null +++ b/launcher/resources/multimc/scalable/server.svg @@ -0,0 +1,9764 @@ + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + 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 +byvXOWum0rOluGXuPT4pS3q2kZkyF8/TndQsijF6W5VXE8dqeuN8bT21Xewa1nt+93tv5mKzZL3L +d1vOXTWxeaF9Ts23ir9Ty59fe1OJcjI+tfxSeZhaVguXUwt7HegL+uIumTrKTyW2NltxWstnN7XV +WtxoQZMPfmiTSxcG/e31YBv3JbnayfzCb5etvkegf51coVFUF/J3s1IcxknB3Th1W9Z+7HzkoOZc +L7G1OzWX7qidY1Zsbjd1sz7zDn/u1uHdO4t1/KjTbq937ttP62en8mr6cgG3FVcKtZBqd5XH9O3n +0bJvpU8fxl5gpZr6tToVVOlb+3k1cQO1iNXSSk+MxZmrVv3Ir9LOzLNmBFW6t3WebVx7KkW14GrT +i7eJ9fLpsV+l7d7r2sJSfGPq1a9SuSBvbwRUqs3M5tbf8xjJPn1N3z3KhaJx7tvT6UJrLX5aO77w +rXR3pnnkqZSuF1zt/MFR+jhogK/aj2X1AFW62De8u9M3qXimOw+vpZt9c7o2C7NPqz2bn/fMarqY +3a3jSmE1vdlipU/tp+u3i4BK114yV5WPVbdSKc5V+7xSPAmsNLv6fjnvX+nG1GK7s5bo+Fd6ln2G +Wih++/ramd+6UwIqzXwuzhvVXf9K04tPiY31H66nOEmcO6ulzMyv1jv2q1QuHJ4bAZVqM/FMLrMd +UOndC3IlbBaLvn2d3p3dnDuqfl75Vrp7nrsOGt69uZWp5Cep1H78LgDG+AGeXuzM7yzjAV7qq3Tv +5Sfzu9SSodJsy1vp0f7JE630bmXB01Mpns0kk/dutUJf7w356Oc861/p/nQvd3RXzvlWelqv7rmV +wryI1R4mf1vLAZU+JOTLo9+ef6WHqeejQmF7yq9SmJfifm0/sK+Xx1rxNahSS76Wn/P+lR6tzBQr +L0vruFIp7u3r9fNmJ7DS64XqSyuo0mP5ZmXb8KtUikO1duJmJ9c2fQf4frn4HFjp13TxyAio9FGT +n0qvCVwpwpinrydXte+1+Mmyb6XPz7cvgZU2q9sLH36VSnFU7bH8ah9Z/gNcuFKmb7vn+36Vttsn +KzO00rfUomfRJPJLdgpXKsWV0nR3V6RKa+1eypRRpct9lZ5uLvw+27c7UOlm21NpYq15t0wr/c4v +uZUCTUbVxt8fpslWrhp3yr5IIC5k++RhF1W60r+nnqzMNlLrZ1Cp2fUOr21/JXGlaF4W7GUPKZyv +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 + + +

& zA9ud~G>TlK@cYWs_ni0VoIf=Ex*O*JA(aRI;m= z{;ZJ3rM=TEe-u7kCSTLUu*d(?ecvAr+qgSE1h(Wqziav9=RT7!lbsTcMGds~WTd!V zoBQkW2l->Ne;*t^rM|oE&=1AywZ6gs!hZB6?T>5H&*M9(=TO@O1b(RHJ|nU0(3hv_w>H+#m#NcW zK5>Y>NYLRx`~R>e{>pXiHA~jLgnm}XvnRQ3X69-1 zuYE9ipWOk`P48Xn78ov4_%HIX{VSv0&E?z*pa1V@kUY+~$zO(T{-W@ZsKzxMr8x%_ zx;9ULxP0{_m1H;d8gWtGUq3QW@1Osnc&~#QlZ)l8hnF3G=<&oyCV%wTnt1*z*Zdeh zPk$|24kxaa+d~-M7t*aXR2#!jJ%t0)9gIIr{r<$}k?x-zI@)1O-)*-Z^xs}k zddU3lk$v9rP49oK=KQGp;qfe|o%^m$bqEV!Ia#~tqrz=}u?P2gS^4hnv}UnO{I7f? z;D<_#ZR2_;hD~h&ahzY~OYOTO<)kF_rMW)bCWE1-pyctoM&4+NsyxN)_@~o9Fb7Ef zyT}*s%C>Yy&Z`~KWysw{@o2o;M+Ir)G3aI%erTtUE%g^cRGXJmGXn`)-~FBe*X?xH!WdE z{c+L3>cQ%Z-~Xvuu6Vtp3Ix<{SN zns$NFUT~4~{FZyaH6Oiah(9&A{l3eFe;?X!ySlPBw+I_NKV zt)*rD{PNHBonbo)lSF&Mk5u&TH)dVR)4X0eg8xU5#O*e%Qyav8s<)kwWiR<>_QT<0 zTEH3I!?jHF+YUa@3=!DWwdr%=(&vnF$FDCvuleeP2zzzZIhj8{jufsrkoPa-Yqy!N zR{fk$N9|4bzHZU)nd%(YEi?D>fy_hd`b%Q=^*&fsBhgXOQoo70&!7YKaY`#e5&zt$(1uibn|IbtVzn@AeV#iYO^X@;#Dd|CJ(G@NH zoJC1L*xoVxILJ|Ts9fQSp4k-p!+di&*)u*|cawekfLoPYVDH1*t+ETG?Y^f!+LhtL zm9cT>O}&PPpWo;G_!hyo�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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/flame_legacy.png b/launcher/resources/multimc/128x128/instances/flame_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..6482975c494e02522f34a10894bb434f1ccc7194 GIT binary patch literal 6226 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 AZ~y=R literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/ftb_logo_legacy.png b/launcher/resources/multimc/128x128/instances/ftb_logo_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..e725b7fe4da31e42ff795a39a8b41a373f96a1eb GIT binary patch literal 7883 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 literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/herobrine_legacy.png b/launcher/resources/multimc/128x128/instances/herobrine_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..13f1494c4dd62b54e2e16942b23036e2968d640d GIT binary patch literal 4937 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 Pz`)??>gTe~DWM4fu7_Uz literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/magitech_legacy.png b/launcher/resources/multimc/128x128/instances/magitech_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..0f81a1997fd0fe38cf927d4d29cbb1db394e32dd GIT binary patch literal 23097 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 Mr>mdKI;Vst07B&frT_o{ literal 0 HcmV?d00001 diff --git a/launcher/resources/multimc/128x128/instances/netherstar_legacy.png b/launcher/resources/multimc/128x128/instances/netherstar_legacy.png new file mode 100644 index 0000000000000000000000000000000000000000..132085f02f2673a6db43d779246ca2c36daf43b5 GIT binary patch literal 14062 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