From 3b97e3c363711c96a0198fa57695eaaa021c82ba Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 11:49:06 +0100 Subject: [PATCH 01/45] Fix a few things related to the translations --- CMakeLists.txt | 1 - gui/dialogs/ModEditDialogCommon.cpp | 4 ++-- logic/NagUtils.cpp | 18 +++++++++--------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c026de4d..a1a8aeb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,7 +235,6 @@ gui/dialogs/SettingsDialog.h gui/dialogs/SettingsDialog.cpp gui/dialogs/CopyInstanceDialog.h gui/dialogs/CopyInstanceDialog.cpp -gui/dialogs/dialogs/ gui/dialogs/NewInstanceDialog.cpp gui/dialogs/ProgressDialog.h gui/dialogs/ProgressDialog.cpp diff --git a/gui/dialogs/ModEditDialogCommon.cpp b/gui/dialogs/ModEditDialogCommon.cpp index 9a15d92d..eee42e5e 100644 --- a/gui/dialogs/ModEditDialogCommon.cpp +++ b/gui/dialogs/ModEditDialogCommon.cpp @@ -50,8 +50,8 @@ void showWebsiteForMod(QWidget *parentDlg, Mod &m) else { CustomMessageBox::selectable( - parentDlg, parentDlg->tr("How sad!"), - parentDlg->tr("The mod author didn't provide a website link for this mod."), + parentDlg, QObject::tr("How sad!"), + QObject::tr("The mod author didn't provide a website link for this mod."), QMessageBox::Warning); } } diff --git a/logic/NagUtils.cpp b/logic/NagUtils.cpp index 6f81b3c7..c963a98a 100644 --- a/logic/NagUtils.cpp +++ b/logic/NagUtils.cpp @@ -23,15 +23,15 @@ void checkJVMArgs(QString jvmargs, QWidget *parent) if (jvmargs.contains("-XX:PermSize=") || jvmargs.contains(QRegExp("-Xm[sx]"))) { CustomMessageBox::selectable( - parent, parent->tr("JVM arguments warning"), - parent->tr("You tried to manually set a JVM memory option (using " - " \"-XX:PermSize\", \"-Xmx\" or \"-Xms\") - there" - " are dedicated boxes for these in the settings (Java" - " tab, in the Memory group at the top).\n" - "Your manual settings will be overridden by the" - " dedicated options.\n" - "This message will be displayed until you remove them" - " from the JVM arguments."), + parent, QObject::tr("JVM arguments warning"), + QObject::tr("You tried to manually set a JVM memory option (using " + " \"-XX:PermSize\", \"-Xmx\" or \"-Xms\") - there" + " are dedicated boxes for these in the settings (Java" + " tab, in the Memory group at the top).\n" + "Your manual settings will be overridden by the" + " dedicated options.\n" + "This message will be displayed until you remove them" + " from the JVM arguments."), QMessageBox::Warning)->exec(); } } From 998a14c95d231754839b576eb1547ff81e2bfd70 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 11:54:51 +0100 Subject: [PATCH 02/45] Update the german translation --- translations/mmc_de.ts | 1808 ++++++++++++++++++++++++++++++++-------- 1 file changed, 1468 insertions(+), 340 deletions(-) diff --git a/translations/mmc_de.ts b/translations/mmc_de.ts index 42047378..667fa36e 100644 --- a/translations/mmc_de.ts +++ b/translations/mmc_de.ts @@ -1,51 +1,95 @@ - + AboutDialog - Dialog - Dialog + Dialog - + MultiMC MultiMC - + About Über - MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple installations of Minecraft at once. - MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es dir erlaubt, mehrere Installationen von Minecraft zu verwalten. + MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es dir erlaubt, mehrere Installationen von Minecraft zu verwalten. - + + About MultiMC + Über MultiMC + + + + <html><head/><body><p>MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple instances of Minecraft at once.</p></body></html> + <html><head/><body><p>MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es dir erlaubt, mehrere Installationen von Minecraft zu verwalten.</p></body></html> + + + © 2013 MultiMC Contributors © 2013 MultiMC Contributors - + <html><head/><body><p><a href="http://github.com/Forkk/MultiMC5"><span style=" text-decoration: underline; color:#0000ff;">http://github.com/MultiMC/MultiMC5</span></a></p></body></html> - - No Language file loaded. - Hey, Translator, You are free to put a reference to you here :) - Deutsche Sprachdatei von Kilobyte (siehe oben). - - - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2012 MultiMC Contributors</span></p> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">MultiMC</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Andrew Okin &lt;</span><a href="mailto:forkk@forkk.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">forkk@forkk.net</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Petr Mrázek &lt;</span><a href="mailto:peterix@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">peterix@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Sky &lt;</span><a href="https://www.twitter.com/drayshak"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@drayshak</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:10pt; font-weight:600;">With thanks to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Orochimarufan &lt;</span><a href="mailto:orochimarufan.x3@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">orochimarufan.x3@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">TakSuyu &lt;</span><a href="mailto:taksuyu@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">taksuyu@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Kilobyte &lt;</span><a href="mailto:stiepen22@gmx.de"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">stiepen22@gmx.de</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Jan (02JanDal) &lt;</span><a href="mailto:02jandal@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">02jandal@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Robotbrain &lt;</span><a href="https://twitter.com/skylordelros"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@skylordelros</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Rootbear75 &lt;</span><a href="https://twitter.com/rootbear75"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@rootbear75</span></a><span style=" font-size:10pt;">&gt; (build server)</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">MultiMC</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Andrew Okin &lt;</span><a href="mailto:forkk@forkk.net"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">forkk@forkk.net</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Petr Mrázek &lt;</span><a href="mailto:peterix@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">peterix@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Sky &lt;</span><a href="https://www.twitter.com/drayshak"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@drayshak</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:10pt; font-weight:600;">Mit dank an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Orochimarufan &lt;</span><a href="mailto:orochimarufan.x3@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">orochimarufan.x3@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">TakSuyu &lt;</span><a href="mailto:taksuyu@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">taksuyu@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Kilobyte &lt;</span><a href="mailto:stiepen22@gmx.de"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">stiepen22@gmx.de</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Jan (02JanDal) &lt;</span><a href="mailto:02jandal@gmail.com"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">02jandal@gmail.com</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Robotbrain &lt;</span><a href="https://twitter.com/skylordelros"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@skylordelros</span></a><span style=" font-size:10pt;">&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Rootbear75 &lt;</span><a href="https://twitter.com/rootbear75"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">@rootbear75</span></a><span style=" font-size:10pt;">&gt; (bau server)</span></p></body></html> + + + + No Language file loaded. + Hey, Translator, feel free to put credit to you here + Deutsche Sprachdatei von Kilobyte (siehe oben). Aktualisiert von Jan + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans Mono'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">MultiMC</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2012-2014 MultiMC Contributors</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">you may not use this file except in compliance with the License.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">You may obtain a copy of the License at</span></p> @@ -58,39 +102,271 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">See the License for the specific language governing permissions and</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">limitations under the License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">MultiMC uses QSLog, </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright (c) 2010, Razvan Petru</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">All rights reserved.</span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">QSLog</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Copyright (c) 2010, Razvan Petru</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">All rights reserved.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Redistribution and use in source and binary forms, with or without modification,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">are permitted provided that the following conditions are met:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* Redistributions of source code must retain the above copyright notice, this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> list of conditions and the following disclaimer.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* Redistributions in binary form must reproduce the above copyright notice, this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> list of conditions and the following disclaimer in the documentation and/or other</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> materials provided with the distribution.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* The name of the contributors may not be used to endorse or promote products</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> derived from this software without specific prior written permission.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">OF THE POSSIBILITY OF SUCH DAMAGE.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Group View (instance view)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> /*</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Copyright (C) 2007 Rafael Fernández López &lt;ereslibre@kde.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Copyright (C) 2007 John Tapsell &lt;tapsell@kde.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This library is free software; you can redistribute it and/or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * modify it under the terms of the GNU Library General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * License as published by the Free Software Foundation; either</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * version 2 of the License, or (at your option) any later version.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This library is distributed in the hope that it will be useful,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Library General Public License for more details.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * You should have received a copy of the GNU Library General Public License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * along with this library; see the file COPYING.LIB. If not, write to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Boston, MA 02110-1301, USA.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Pack200</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The GNU General Public License (GPL)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Version 2, June 1991</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">+ &quot;CLASSPATH&quot; EXCEPTION TO THE GPL</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Certain source files distributed by Oracle America and/or its affiliates are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">subject to the following clarification and special exception to the GPL, but</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">only where Oracle has expressly included in the particular source file's header</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">the words &quot;Oracle designates this particular file as subject to the &quot;Classpath&quot;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">exception as provided by Oracle in the LICENSE file that accompanied this code.&quot;</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> Linking this library statically or dynamically with other modules is making</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> a combined work based on this library. Thus, the terms and conditions of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the GNU General Public License cover the whole combination.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> As a special exception, the copyright holders of this library give you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> permission to link this library with independent modules to produce an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> executable, regardless of the license terms of these independent modules,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> and to copy and distribute the resulting executable under terms of your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> choice, provided that you also meet, for each linked independent module,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the terms and conditions of the license of that module. An independent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> module is a module which is not derived from or based on this library. If</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> you modify this library, you may extend this exception to your version of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the library, but you are not obligated to do so. If you do not wish to do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> so, delete this exception statement from your version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Quazip</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Copyright (C) 2005-2011 Sergey A. Tachenov</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This program is free software; you can redistribute it and/or modify it</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">under the terms of the GNU Lesser General Public License as published by</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">the Free Software Foundation; either version 2 of the License, or (at</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">your option) any later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This program is distributed in the hope that it will be useful, but</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">General Public License for more details.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">You should have received a copy of the GNU Lesser General Public License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">along with this program; if not, write to the Free Software Foundation,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">See COPYING file for the full LGPL text.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Original ZIP package is copyrighted by Gilles Vollant, see</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">quazip/(un)zip.h files for details, basically it's zlib license.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">xz-minidec</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">/*</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * XZ decompressor</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Authors: Lasse Collin &lt;lasse.collin@tukaani.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Igor Pavlov &lt;http://7-zip.org/&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This file has been put into the public domain.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * You can do whatever you want with this file.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'DejaVu Sans Mono'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">MultiMC</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2012-2014 MultiMC Contributors</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">you may not use this file except in compliance with the License.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">You may obtain a copy of the License at</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Redistribution and use in source and binary forms, with or without modification,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">are permitted provided that the following conditions are met:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;"> http://www.apache.org/licenses/LICENSE-2.0</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">* Redistributions of source code must retain the above copyright notice, this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;"> list of conditions and the following disclaimer.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">* Redistributions in binary form must reproduce the above copyright notice, this</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;"> list of conditions and the following disclaimer in the documentation and/or other</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;"> materials provided with the distribution.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">* The name of the contributors may not be used to endorse or promote products</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;"> derived from this software without specific prior written permission.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Unless required by applicable law or agreed to in writing, software</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">See the License for the specific language governing permissions and</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">limitations under the License.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">OF THE POSSIBILITY OF SUCH DAMAGE.</span></p></body></html> - +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">QSLog</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Copyright (c) 2010, Razvan Petru</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">All rights reserved.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Redistribution and use in source and binary forms, with or without modification,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">are permitted provided that the following conditions are met:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* Redistributions of source code must retain the above copyright notice, this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> list of conditions and the following disclaimer.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* Redistributions in binary form must reproduce the above copyright notice, this</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> list of conditions and the following disclaimer in the documentation and/or other</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> materials provided with the distribution.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">* The name of the contributors may not be used to endorse or promote products</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> derived from this software without specific prior written permission.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">OF THE POSSIBILITY OF SUCH DAMAGE.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Group View (instance view)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> /*</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Copyright (C) 2007 Rafael Fernández López &lt;ereslibre@kde.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Copyright (C) 2007 John Tapsell &lt;tapsell@kde.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This library is free software; you can redistribute it and/or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * modify it under the terms of the GNU Library General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * License as published by the Free Software Foundation; either</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * version 2 of the License, or (at your option) any later version.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This library is distributed in the hope that it will be useful,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Library General Public License for more details.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * You should have received a copy of the GNU Library General Public License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * along with this library; see the file COPYING.LIB. If not, write to</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Boston, MA 02110-1301, USA.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Pack200</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">The GNU General Public License (GPL)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Version 2, June 1991</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">+ &quot;CLASSPATH&quot; EXCEPTION TO THE GPL</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Certain source files distributed by Oracle America and/or its affiliates are</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">subject to the following clarification and special exception to the GPL, but</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">only where Oracle has expressly included in the particular source file's header</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">the words &quot;Oracle designates this particular file as subject to the &quot;Classpath&quot;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">exception as provided by Oracle in the LICENSE file that accompanied this code.&quot;</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> Linking this library statically or dynamically with other modules is making</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> a combined work based on this library. Thus, the terms and conditions of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the GNU General Public License cover the whole combination.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> As a special exception, the copyright holders of this library give you</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> permission to link this library with independent modules to produce an</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> executable, regardless of the license terms of these independent modules,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> and to copy and distribute the resulting executable under terms of your</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> choice, provided that you also meet, for each linked independent module,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the terms and conditions of the license of that module. An independent</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> module is a module which is not derived from or based on this library. If</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> you modify this library, you may extend this exception to your version of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> the library, but you are not obligated to do so. If you do not wish to do</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> so, delete this exception statement from your version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Quazip</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Copyright (C) 2005-2011 Sergey A. Tachenov</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This program is free software; you can redistribute it and/or modify it</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">under the terms of the GNU Lesser General Public License as published by</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">the Free Software Foundation; either version 2 of the License, or (at</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">your option) any later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">This program is distributed in the hope that it will be useful, but</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">General Public License for more details.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">You should have received a copy of the GNU Lesser General Public License</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">along with this program; if not, write to the Free Software Foundation,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">See COPYING file for the full LGPL text.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Original ZIP package is copyrighted by Gilles Vollant, see</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">quazip/(un)zip.h files for details, basically it's zlib license.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">xz-minidec</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">/*</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * XZ decompressor</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Authors: Lasse Collin &lt;lasse.collin@tukaani.org&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Igor Pavlov &lt;http://7-zip.org/&gt;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This file has been put into the public domain.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * You can do whatever you want with this file.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p></body></html> + + + + Forking/Redistribution + Abspaltung/Weiterverbreitung + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">We keep MultiMC open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Part of the reason for using the Apache license is we don't want people using the &quot;MultiMC&quot; name when redistributing the project. This means people must take the time to go through the source code and remove all references to &quot;MultiMC&quot;, including but not limited to the project icon and the title of windows, (no *MultiMC-fork* in the title).</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">The Apache license covers reasonable use for the name - a mention of the project's origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork </span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:600;">without</span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;"> implying that you have our blessing.</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Wir wollen das MultiMC open source bleibt da wir glauben das es wichtig ist den Quellcode einem Projekt wie diesem einzusehen. Daher verbreiten wir MultiMC unter der Apache Licens</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Eine der grunde das wir die Apache Licens gewählt haben ist das wir nicht wollen das der &quot;MultiMC&quot; name benutzt wird beim weiterverbreiten. Dies bedeutet das leute sich die zeit nehmen mussen den code durchzugehen und alle referencen zu &quot;MultiMC&quot;, inkludirend aber nicht begrenzt zu dem &quot;MultiMC&quot; Logo und den titeln in Fenstern (kein *MultiMC-fork* im titel)</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Die Apache Licens gibt ihnen ein angemessenes recht den namen zu benutzen - eine bemerkung im Über dialog und in der Licens is akzeptabel. Es sollte aber klar sein das das Projekt eine abspaltung ist </span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:600;">ohne</span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;"> unserem Segen</span></p></body></html> <html><head/><body><p><a href="http://github.com/Forkk/MultiMC5"><span style=" text-decoration: underline; color:#0000ff;">http://github.com/Forkk/MultiMC5</span></a></p></body></html> <html><head/><body><p><a href="http://github.com/Forkk/MultiMC5"><span style=" text-decoration: underline; color:#0000ff;">http://github.com/Forkk/MultiMC5</span></a></p></body></html> - + Credits Dank an @@ -112,7 +388,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deutsche Übersetzung: Kilobyte &lt;<a href="mailto:stiepen22@gmx.de"><span style=" text-decoration: underline; color:#0000ff;">stiepen22@gmx.de</span></a>&gt;</p></body></html> - + License Lizenz @@ -201,83 +477,289 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">POSSIBILITY OF SUCH DAMAGE.</span></p></body></html> - + About Qt Über Qt - + Close Schließen + + AccountListDialog + + + Manage Accounts + Konto verwaltung + + + + <html><head/><body><p>Welcome! If you're new here, you can click the &quot;Add&quot; button to add your Mojang or Minecraft account.</p></body></html> + <html><head/><body><p>Willkommen! Sollten Sie neu sein können Sie &quot;Hinzufügen&quot; drucken um ihr Mojang oder Minecraft Konto hinzuzufügen</p></body></html> + + + + &Add + &Hinzufügen + + + + &Remove + &Entfernen + + + + <html><head/><body><p>Set the currently selected account as the active account. The active account is the account that is used to log in (unless it is overridden in an instance-specific setting).</p></body></html> + <html><head/><body><p>Mache das ausgewählten Konto zum voreingeställten Konto. Das voreingeställte Konto ist das Konto das zum einloggen benutzt wird (es sei den es wird von einer Instanz-spezifischen einstellung überschrieben).</p></body></html> + + + + &Set Default + &Benutze als voreinstellung + + + + Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set. + Mache die voreinstellung rückgängig. Wenn kein Konto voreingeställt ist wird MultiMC dich beim jeden start einer Instans fragen welches Konto benutzt werden soll, es sei den die Instans hat ein Instanz-spezifisches Konto eingeställt. + + + + &No Default + &Keine voreinstellung + + + + Please enter your Mojang or Minecraft account username and password to add your account. + Bitte geben Benutzernamen und Passwort ihres Mojang oder Minecraft Konto an um ihr Konto hinzuzufügen. + + + + Login error. + Login Fehler. + + + + AccountSelectDialog + + + Select an Account + Wähle ein Konto + + + + Select an account. + Wähle ein konto. + + + + Use as default? + Als Default benutzen? + + + + Use as default for this instance only? + Nur für diese Instanz als Default benutzen? + + + + AssetsMigrateTask + + + Migrating legacy assets... + Migration der bestehenden daten ... + + + + AuthenticateTask + + + Authenticating: Sending request... + Authentifizierung: Sende Anfrage... + + + + Authenticating: Processing response... + Authentifizierung: Bearbeite Antwort... + + ConsoleWindow - + MultiMC Console MultiMC-Konsole - + + Upload Log + Log hochladen + + + + &Kill Minecraft + &Minecraft Killen + + + + &Close + &Schließen + + Kill Minecraft - Minecraft Killen + Minecraft Killen - Close - Schließen + Schließen - + Kill Minecraft? - Main question of the kill confirmation dialog Minecraft Killen? - + This can cause the instance to get corrupted and should only be used if Minecraft is frozen for some reason Dies kann diese Instanz beschädigen und sollte daher nur genutzt werden, wenn Minecraft eingefroren ist + + CopyInstanceDialog + + + Copy Instance + Kopiere Instanz + + + + Name + Name + + + + DownloadUpdateTask + + + Finding information about the current version... + Finde informationen zur benutzten Version... + + + + Loading version information... + Lade Versionsinformation... + + + + Failed to download version info files. + Laden der Versionsdateien ist fehlgeschlagen. + + + + Reading file list for new version... + Bearbeite die Dateiliste der neuen Version... + + + + Reading file list for current version... + Bearbeite die Dateilsite der benutzten Version... + + + + Failed to process update lists... + Fehler beim bearbeiten der Updateliste... + + + + Downloading %1 update files. + %1 Dateien werden herruntergeladen. + + + + Processing file lists - figuring out how to install the update... + Bearbete Dateilisten - Rechne aus wie das Update installiert werden soll... + + + + Failed to write update script file. + Fehler beim schreiben des Updatescripts. + + + + Failed to download update files. + Fehler beim herrunterladen der Updatedateien. + + + + EditAccountDialog + + + Edit Account + Redigiere Konto + + + + Message label placeholder. + Message label placeholder. + + + + Email / Username + Email / Benutzername + + + + Password + Passwort + + EditNotesDialog - + Edit Notes Notizen bearbeiten - + Edit notes of %1 Notizen von %1 bearbeiten + + ForgeListLoadTask + + + Fetching Forge version lists... + Lade liste von Forge Versionen... + + IconPickerDialog - + Pick icon Symbol auswählen - + Add Icon Symbol hinzufügen - + Remove Icon Symbol entfernen - + Select Icons The title of the select icons open file dialog Symbol auswählen - + Icons The type of icon files Symbole @@ -286,140 +768,190 @@ p, li { white-space: pre-wrap; } InstanceSettings - + + Instance Settings + Instanz einstellungen + + + Minecraft - + Window Size Fenstergröße - + Start Minecraft maximized? Minecraft maximiert starten? - + Window height: Fensterhöhe: - + Window width: Fensterbreite: - + Console Settings Konsoleneinstellungen - + Show console while the game is running? Konsole anzeigen wenn das Spiel läuft? - + Automatically close console when the game quits? Konsole automatisch schließen, nachdem das Spiel beendet wurde? - + + Browse... + Durchsuchen... + + + + Auto-detect... + Auto-Erkennung... + + Account Settings - Konteneinstellungen + Konteneinstellungen - Login automatically when an instance icon is double clicked? - Automatisch einloggen, wenn das Instanzsymbol doppelt gecklickt wurde? + Automatisch einloggen, wenn das Instanzsymbol doppelt gecklickt wurde? - + Java Java - + Memory Arbeitsspeicher - + Minimum memory allocation: Min. Arbeitspeicher: - + Maximum memory allocation: Max. Arbeitspeicher: - + PermGen: PermGen: - + Java Settings Java-Einstellungen - + + Test + Teste + + + Java path: Java-Pfad: - + JVM arguments: JVM-Argumente: - Auto-detect - Automatisch erkennen + Automatisch erkennen - + Custom Commands Eigene Befehle - + Post-exit command: Nach-abschluss-Befehl: - + Pre-launch command: Vor-Start-Befehl: - + Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working directory with INST_ID, INST_DIR, and INST_NAME as environment variables. Vor-Start wird ausgeführt, bevor die Instanz startet, Nach-Ende nachdem die Instanz beendet wurde. Beide werden Im ausführungsverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. + + + Select a Java version + Wähle eine Java version + + + + Find Java executable + Java-Anwendung finden + + + + Java test success + Java test erfolgreich abgeschlossen + + + + Java test failure + Java test fehlgeschlagen + + + + The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. + Das ausgewählte java program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den pfad zu der java applikation angeben. + + + + JavaListLoadTask + + + Detecting Java installations... + Suche nach Java installationen... + LWJGLSelectDialog - - Dialog - + + Manage Lwjgl Versions + LWJGL Versions Verwaltung - + Status label... - + &Refresh Anktualisie&ren - + Loading LWJGL version list... Lade LWJGL-Versionsliste... @@ -427,550 +959,788 @@ p, li { white-space: pre-wrap; } LegacyModEditDialog - - Dialog - + + Edit Mods + Mods bearbeiten - + Jar Mods Jar-Mods - - - - + + + + &Add &Hinzufügen - - - - + + + + &Remove &Entfernen - + MCForge - + Move &Up &Nach Oben - + Move &Down Nach &Unten - + Core Mods Coremods - - - + + + &View Folder &Ordner öffnen - + Loader Mods Normale Mods - + Texture Packs Texturenpacks - - + + Select Loader Mods Title of regular mod selection dialog Mods auswählen - + Select Resource Packs Resourcenpacks auswählen - + Select Core Mods Title of core mod selection dialog Coremodsauswählen - + + Select Forge version + Wähle Forge-Version + + + Select Jar Mods Title of jar mod selection dialog Jarmods auswählen - + Select Texture Packs Title of texture pack selection dialog Texturenpacks auswählen + + LegacyUpdate + + + Downloading new LWJGL... + LWJGL wird herruntergeladen... + + + + Installing new LWJGL... + Das neue LWJGL wird installiert... + + + + Installing new LWJGL - extracting + Das neue LWJGL wird installier - Extraktion + + + + Checking for jar updates... + Suche nach jar änderungen... + + + + Downloading new minecraft.jar ... + Neue minecraft jar wird herruntergeladen... + + + + Installing mods: Adding + Mod installation: Einfügung von + + + + Installing mods: Backing up minecraft.jar ... + Mod installation: Erstellen von Sicherheitskopie von minecraft.jar... + + + + Installing mods: Opening minecraft.jar ... + Mod installation: minecraft.jar wird geöffnet... + + + + Installing mods: Adding mod files... + Mod installation: Mods werden hinzugefügt... + + LoginDialog - Login - Einloggen + Einloggen - - <span style=" color:#ff0000;">Error</span> - - - - Username: - Nutzername: + Nutzername: - Password: - Passwort: + Passwort: - Password - Passwort + Passwort - Forget - Vergessen + Vergessen - &Remember Username? - &Nutzernamen speichern? + &Nutzernamen speichern? - R&emember Password? - &Passwort speichern? + &Passwort speichern? - Offline Once Use offline mode one time - Einmal Offline + Einmal Offline - Name The username during login (placeholder) - Name + Name LoginTask - - Logging in... - Einloggen... + Einloggen... Failed to parse Minecraft version string. Konnte Minecraft-Versionsstring nicht parsen. - Invalid username or password. - Falsche Kombination von Nutzernamen und Passwort. + Falsche Kombination von Nutzernamen und Passwort. - Launcher outdated, please update. - Veralteter Launcher, Bitte lade ein Update herunter. + Veralteter Launcher, Bitte lade ein Update herunter. - - - - Login failed: %1 - Login fehlgeschlagen: %1 + Login fehlgeschlagen: %1 - - The login servers are currently unavailable. Check http://help.mojang.com/ for more info. - Derzeit kann auf die Login-Server nicht zugegriffe werden. Für weitere Informationen siehe http://help.mojang.com/. + Derzeit kann auf die Login-Server nicht zugegriffe werden. Für weitere Informationen siehe http://help.mojang.com/. - - Login failed: Unknown HTTP error %1 occurred. - Login fehlgeschlagen. Unbekannter HTTP-Fehler: %1. + Login fehlgeschlagen. Unbekannter HTTP-Fehler: %1. - - Login canceled. - Login abgebrochen. + Login abgebrochen. + + + + MCModInfoFrame + + + Frame + Frame - - Login failed: BAD FORMAT #1 - Login fehlgeschlagen: UNGÜLTIGES FORMAT #1 - + + + Select a mod to view title and authors... + Wähle ein mod um Titel und Authoren zu sehen... + + + + + Select a mod to view description... + Wähle ein mod um die Beschreibung zu sehen... + + + + No description provided in mcmod.info + mcmod.info wurde nicht mit einer Beschreibung versehen + + + + MCVListLoadTask + + + Loading instance version list... + Lade liste von Minecraft Versionen... MainWindow - + MultiMC 5 MultiMC 5 - + Main Toolbar Haupt-Werkzeugleiste - + Instance Toolbar Instanz-Werkzeugleiste - + + News Toolbar + Nachrichten-Werkzeugleiste + + + Add Instance Instanz hinzufügen - - + + + Add a new instance. Neue Instanz erstellen. - + View Instance Folder Instanzordner öffnen - - + + Open the instance folder in a file browser. Instanzordner im Dateimanager öffnen. - + Refresh Aktualisieren - - + + Reload the instance list. Instanzliste neu Laden. - + View Central Mods Folder Zenstralen Modordner öffnen - - + + Open the central mods folder in a file browser. Zentralen Modordner in einem Dateimanager öffnen. - + Check for Updates Auf Updates überprüfen - - + + Check for new updates for MultiMC Auf Updates für MultiMC prüfen - - + + Settings Einstellungen - - + + Change settings. Einstellungen ändern. - + Report a Bug Fehler melden - - + + Open the bug tracker to report a bug with MultiMC. - Fehler-Verfolgung öffnen, um einen Fehler zu melden (Bitte auf Englisch ;)) + Fehler-Verfolgung öffnen, um einen Fehler zu melden (Bitte auf Englisch ;)). - News - Neuigkeiten + Neuigkeiten - - Open the MultiMC dev blog to read news about MultiMC. - Den MultiMC Entwicklerblog öffnen und Neuigkeiten über MultiMC erfahren. + Den MultiMC Entwicklerblog öffnen und Neuigkeiten über MultiMC erfahren. - - + + More News + Mehr Nachrichten + + + + More news... + Mehr Nachrichten... + + + + + Open the MultiMC development blog to read more news about MultiMC. + Öffne den MultiMC Entwicklungs Blog um mehr Nachrichten zu MultiMC zu lesen. + + + + About MultiMC Über MultiMC - + View information about MultiMC. Informationen über MultiMC anzeigen. - + Play Spielen - - + + Launch the selected instance. Die ausgewählte Instanz starten. - + Instance Name Instanzname - - + + Rename the selected instance. Ausgewählte Instanz umbenennen. - + Change Group Gruppe ändern - - + + Change the selected instance's group. Die Gruppe der ausgewählten Instanz ändern. - + Change Icon Symbol ändern - - + + Change the selected instance's icon. Das Symbol der ausgewählten Instanz ändern. - + Edit Notes Notizen bearbeiten - - + + Edit the notes for the selected instance. Notizen für die ausgewählte Instanz bearbeiten. - - + + Change settings for the selected instance. Einstellungen für die ausgewählte Instanz bearbeiten. - + Make Shortcut Verknüpfung erstellen - - + + Make a shortcut on the desktop for the selected instance. Erstellt eine Verknüpfung für die ausgewählte Instanz auf dem Desktop. - + Manage Saves Speicherstände verwalten - - + + Manage saves for the selected instance. Die Speicherstände der ausgewählten Instanz verwalten. - + Edit Mods Mods bearbeiten - - + + Edit the mods for the selected instance. Die Mods der ausgewähten Instanz bearbeiten. - + Change Version Version ändern - - + + Change the selected instance's Minecraft version. Die Minecraftversion der ausgewählten Instanz ändern. - + Change LWJGL LWJGL ändern - - + + Change the version of LWJGL for the selected instance to use. Die zu benutzende Version von LWJGL für die aktuelle Instanz ändern. - + Instance Folder Instanzordner - - + + Open the selected instance's root folder in a file browser. Den Wurzelordner der Aktuellen Instanz im Dateimanager öffnen. - + Delete Löschen - - + + Delete the selected instance. Ausgewählte Instanz löschen. - + Config Folder Konfig-ordner - + Open the instance's config folder Den Konfigurationsordner im Dateimanager anzeigen - + Meow Miau - + <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnarok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> + + + Copy Instance + Kopiere Instanz + + + + Copy the selected instance. + Kopiere die ausgewählte Instanz. + + + + + Manage Accounts + Verwalte Konten + + + + Manage your Mojang or Minecraft accounts. + Verwalte ihre Mojang und Minecraft Konten. + <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnatok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnatok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> - + + No instance selected + Keine Instanz ausgewählt + + + + Accounts + Konten + + + + No update found. + Keine neue Version gefunden. + + + + No MultiMC update was found! +You are using the latest version. + Kein update zu MultiMC konnte gefunden werden! +Sie benutzen die neuste Version. + + + + No accounts added! + Keine Konten angegeben! + + + + No Default Account + Kein voreingestelltes Konto + + + + Loading news... + Nachrichten werden geladen... + + + + No news available. + Keine Nachrichten zugänglich. + + + + + + + + + + + + Error + Fehler + + + + + MultiMC cannot download Minecraft or update instances unless you have at least one account added. +Please add your Mojang or Minecraft account. + MultiMC kann Minecraft nicht herrunterladen und keine Instanzen aktualisieren so lange Sie nicht mindestens ein Konto angegeben haben. +Bitte fügen Sie Ihr Mojang oder Minecraft Konto hinzu. + + + Group name Gruppenname - + Enter a new group name. Neuen Gruppennamen eingeben. - + + CAREFUL + VORSICHTIG + + + + This is permanent! Are you sure? +About to delete: + Dies ist permanent! Sind sie sich sicher? +Die folgende Instanz löschen: + + + Instance name Instanzname - + Enter a new instance name. Neuen Instanznamen eingeben. - + + No Accounts + Keine Konten + + + + In order to play Minecraft, you must have at least one Mojang or Minecraft account logged in to MultiMC.Would you like to open the account manager to add an account now? + Damit sie Minecraft spielen können mussen sie mindestens ein Mojang oder Minecraft Konto in MultiMC hinterlegen. Wollen sie die Konto Verwaltung öffen um ein Konto hinzuzufügen? + + + + Which account would you like to use? + Wälches Konto wollen Sie benutzen? + + + + Your account is currently not logged in. Please enter your password to log in again. + Ihr Konto ist momentan nicht angemeldet. Bitte geben sie ihr passwort an um sich anzumelden. + + + + Play Offline + Offline spielen + + + + Error updating instance + Fehler beim Aktualisieren der Instanz + + + MultiMC Shortcut MultiMC-Verknüpfung - + Enter a Shortcut Name. Verknüpfungsnamen eingeben. - + Not useful Sinnlos - + A Dummy Shortcut was created. it will not do anything productive Eine Dummy-Verknüpfung wurde erstellt. Sie wird jedoch absolut nichts bewirken - + + Change Minecraft version + Minecraft-Version ändern + + + + Are you sure? + Sind sie sich sicher? + + + + This will remove any library/version customization you did previously. This includes things like Forge install and similar. + Dies will sämtliche Bibliotheks/Versions-Anpassung die sie vorgenommen haben entfernen. Dies inkludiert sachen wir Forge oder änlich. + + + + Instance settings + Instanz einstellungen + + + Rename Instance Instanz umbenennen + + + Select a Java version + Wähle eine Java version + + + + Invalid version selected + Ungültige version ausgewählt + + + + You didn't select a valid Java version, so MultiMC will select the default. You can change this in the settings dialog. + Sie haben keine gültige Java version ausgewählt, daher wird MultiMC für sie eine voreinstellung benutzen. Sie können dies in den einstellungen ändern. + MinecraftProcess - + Minecraft exited with exitcode %1. Message displayed on instance exit Minecraft wurde mit exitcode %1 beendet. - + + Minecraft crashed with exitcode %1. + Message displayed on instance crashed + Minecraft ist mit dem exitcode %1 abgesturtzt + + + Minecraft was killed by user. Message displayed after the instance exits due to kill request Minecraft wurde durch den nutzer gekillt. - + Could not launch minecraft! Error message displayed if instace can't start Konnte Minecraft nicht starten! @@ -1030,362 +1800,632 @@ p, li { white-space: pre-wrap; } NewInstanceDialog - + New Instance Neue Instanz - + Name Name - + Version: Version: - + ... ... + + + Change Minecraft version + Ändere die Minecraft-Version... + + + + NewsEntry + + + + Untitled + Unbennant + + + + + No content. + Kein eintrag. + + + + + Unknown Author + Unbekannter Autor + + + + OneSixFTBInstanceForge + + + Downloading Forge... + Forge wird herruntergeladen... + + + + Installing Forge... + Forge wird installiert... + + + + Couldn't load the version config + Fehlschlag beim laden der Versions-Konfiguration + + + + Couldn't install Forge + Fehler beim installieren von Forge + OneSixModEditDialog - Dialog Am i really responsible for this? - Edit Mods + Edit Mods Library Bibliothek - + Loader Mods Mods - - - + + + &Add &Hinzufügen - + + Manage Mods + Verwalte Mods + + + Version Version - + Main Class: Hauptklasse: - + Replace any current custom version with Minecraft Forge Die aktuelle benutzerdefinierte Version mit Minecraft Forge ersetzen - + Install Forge Forge Installieren - + + Install LiteLoader + Installiere LiteLoader + + + Create an customized copy of the base version Eine modifizierbare Kopie der Version erstellen - + Customize Benutzerdefiniert - + Revert to original base version Benutzerdefinierte Einstellungen zurücksetzen - + Revert Zurücksetzen - + Add new libraries - + Remove selected libraries - - - + + + &Remove &Entfernen - - + + Open custom.json + Öffne custom.json + + + + &View Folder &Ordner öffnen - + Resource Packs Resourcenpacks - - + + Revert? Zurücksetzen? - + Do you want to revert the version of this instance to its original configuration? Möchtest du wirklich die Version dieser Instanz zurücksetzen? - + + Error + Fehler + + + + Unable to open custom.json, check the settings + Fehler beim öffnen der custom.json Datei, überprüfen Sie Ihre Einstellungen + + + + Select Forge version + Wähle Forge Version + + + This will revert any changes you did to the version up to this point. Is that OK? Dies wird alle Änderungen, die du vorgenommen hast zurücksetzen. Bist du damit einverstanden? + + + + LiteLoader + LiteLoader + + + + There is no information available on how to install LiteLoader into this version of Minecraft + Es gibt momentan keine information zur installation von LiteLoader für diese Version von Minecraft + + + + For reasons unknown, the LiteLoader installation failed. Check your MultiMC log files for details. + Aus unbekannten Gründen ist die installation von LiteLoader fehlgeschlagen. Schauen sie sich Ihre MultiMC log datei an um weitere details zu erhalten. + + + + OneSixUpdate + + + + Testing the Java installation... + Java installation wird getestet... + + + + Getting the version files from Mojang... + Versionsdateien von Mojang werden herruntergeladen... + + + + Updating assets index... + Daten index wird aktualisiert... + + + + Getting the assets files from Mojang... + Daten werden von Mojang herruntergeholt... + + + + Getting the library files from Mojang... + Bibliotheken werden von Mojang herruntergeholt... + + + + Preparing for launch... + Der Start wird vorbereitet... + ProgressDialog - + Please wait... Bitte warten... - + Task Status... Aufgabenstatus... + + + Skip + Überspringen + + + + QObject + + + JVM arguments warning + JVM argument verwarnung + + + + You tried to manually set a JVM memory option (using "-XX:PermSize", "-Xmx" or "-Xms") - there are dedicated boxes for these in the settings (Java tab, in the Memory group at the top). +Your manual settings will be overridden by the dedicated options. +This message will be displayed until you remove them from the JVM arguments. + Sie haben versucht manuel eine JVM Speicher option anzugeben ("-XX:PermSize", "-Xmx" oder "-Xms") - es gibt hierfür gewidmete boxen in den einstellung (Java tab, in der Speicher gruppe am anfang). +Ihre manuellen einstellungen werden von den gewidmeten überschrieben werden. +Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfernt haben. + + + + How sad! + Wie schade! + + + + The mod author didn't provide a website link for this mod. + Der Autor des mods hat keine link zu einer webseite angegeben. + + + + RefreshTask + + + Refreshing login token... + Erfrischung des Login-Tokens... + + + + Refreshing login token: Processing response... + Erfrischung des Login-Tokens: Bearbeite Antwort... + SettingsDialog - + Settings Einstellungen - + General Generell - + Sorting Mode Sortiermodus - + By last launched Nach letzem Start - + By name Nach Namen - + Update Settings Updateeinstellungen - + Use development builds? Entwicklerversionen benutzen? - + Check for updates when MultiMC starts? Beim Start nach Updates suchen? - + Folders Ordner - + Instances: Instanzen: - - - + + + + + + + + ... ... - + + FTB + FTB + + + + Launcher: + Launcher: + + + + Track FTB instances + FTB Instanzen verfolgen + + + + Files: + Dateien: + + + Mods: Mods: - + LWJGL: LWJGL: - + + Icons: + Symbole: + + + + External Editors (leave empty for system default) + Externe Editor-Anwendungen (lehr lassen um die System-Voreinstellung zu benutzen) + + + + JSON Editor: + JSON Editor: + + + Minecraft Minecraft - + Window Size Fenstergröße - + Start Minecraft maximized? Minecraft maximiert starten? - + Window height: Fensterhöhe: - + Window width: Fensterbreite: - + Console Settings Konsoleneinstellungen - + Show console while the game is running? Konsole anzeigen wenn das Spiel läuft? - + Automatically close console when the game quits? Konsole automatisch schließen, nachdem das Spiel beendet wurde? - Login automatically when an instance icon is double clicked? - Automatisch einloggen, wenn das Instanzsymbol doppelt gecklickt wurde? + Automatisch einloggen, wenn das Instanzsymbol doppelt gecklickt wurde? - + Java Java - + Memory Arbeitsspeicher - + Minimum memory allocation: Min. Arbeitspeicher: - + Maximum memory allocation: Max. Arbeitspeicher: - + PermGen: PermGen: - + Java Settings Java-Einstellungen - + Java path: Java-Pfad: - + + Auto-detect... + Auto-Erkennung: + + + + Test + Test + + + JVM arguments: JVM-Argumente: - Browse... - Durchsuchen... + Durchsuchen... - Auto-detect - Automatisch erkennen + Automatisch erkennen - + Custom Commands Eigene Befehle - + Post-exit command: Nach-abschluss-Befehl: - + Pre-launch command: Vor-Start-Befehl: - + Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working directory with INST_ID, INST_DIR, and INST_NAME as environment variables. Vor-Start wird ausgeführt, bevor die Instanz startet, Nach-Ende nachdem die Instanz beendet wurde. Beide werden Im ausführungsverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. - + + FTB Launcher Directory + FTB Launcher Ordner + + + + FTB Directory + FTB-Ordner + + + Instance Directory Instanz-Ordner - + + Icons Directory + Symbolordner + + + Mods Directory Modordner - + LWJGL Directory LWJGL-Ordner - + + JSON Editor + JSON Editor + + + + Invalid + Ungültig + + + + The file chosen does not seem to be an executable + Die ausgesuchte Datei scheint nicht eine Anwendung zu seien + + + Development builds Entwicklerversionen - + Development builds contain experimental features and may be unstable. Are you sure you want to enable them? - Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du sie dennoch aktivieren? + Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du Sie dennoch aktivieren? - + + Select a Java version + Wähle Java version + + + Find Java executable Umm... this translation is a bit meh - Java-Anwendung finden + Java-Anwendung finden + + + + Java test success + Java test erfolgreich abgeschlossen + + + + Java test failure + Java test fehlgeschlagen + + + + The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. + Das ausgewählte java program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den pfad zu der java applikation angeben. @@ -1399,12 +2439,52 @@ p, li { white-space: pre-wrap; } Aufgabenstatus... + + UpdateDialog + + + MultiMC Update + Neue MultiMC Version + + + + A new MultiMC update is available! + Eine Neue Version von MultiMC ist jetzt verfügbar! + + + + Update now + Jetzt herrunterladen + + + + Update after MultiMC closes + Herrunterladen wenn MultiMC abgeschlossen wird + + + + Don't update yet + Noch nicht herrunterladen + + + + ValidateTask + + + Validating access token: Sending request... + Validiere Zugriffstoken: Sende Anfrage... + + + + Validating access token: Processing response... + Validiere Zugriffstoken: Bearbeite Antwort... + + VersionSelectDialog - Dialog - Dialog + Dialog Show &snapshots? @@ -1415,14 +2495,62 @@ p, li { white-space: pre-wrap; } '&Nostalgia'-Versionen anzeigen? - + + Choose Version + Wähle Version + + + Reloads the version list. Instanzliste aktualisieren. - + &Refresh &Aktualisieren + + YggdrasilTask + + + <b>SSL Handshake failed.</b><br/>There might be a few causes for it:<br/><ul><li>You use Windows XP and need to <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">update your root certificates</a></li><li>Some device on your network is interfering with SSL traffic. In that case, you have bigger worries than Minecraft not starting.</li><li>Possibly something else. Check the MultiMC log file for details</li></ul> + <b>SSL Handshake Fehlgeschlagen.</b><br/>Es kann mehrere Erklärungen geben:<br/><ul><li>Sie benutzen Windows XP und mussen <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">Ihr root certifikat aktualisieren</a></li><li>Irgend ein gerät in Ihrem Netzwerk mischt sich in den SSL verkehr mit ein. In diesem fall haben sie grössere probleme alls das Minecraft nicht starten kann.</li><li>Möglicherweise irgendetwas anderes. Sehen sie in der MultiMC log Datei nach um weitere Details zu finden</li></ul> + + + + An unknown error occurred when processing the response from the authentication server. + Ein unbekannter fehler ist beim bearbeiten der Antwort des Authentikations-Servers aufgetreten. + + + + Failed to parse Yggdrasil JSON response: %1 at offset %2. + Fehler beim bearbeiten der Yggdrasil-JSON-Antwort: %1 bei %2. + + + + An unknown error occurred when trying to communicate with the authentication server: %1 + Ein unbekannter fehler ist aufgetreten bei der Kommunikation mit den Authentifizierungs-Server: %1 + + + + An unknown Yggdrasil error occurred. + Ein unbekannter Yggdrasil fehler ist entstanden. + + + + Sending request to auth servers... + Sende Anfrage an die Authentifizierungs-Server... + + + + Processing response from servers... + Bearbeite Antwort des Authentifizierungs-Servers... + + + + Processing. Please wait... + Bearbeite. Bitte warten... + + From 0f1a3329e439dfe04bd34df05cd55344c014ea29 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 12:58:47 +0100 Subject: [PATCH 03/45] Du/Sie consistency --- translations/mmc_de.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/translations/mmc_de.ts b/translations/mmc_de.ts index 667fa36e..47df4508 100644 --- a/translations/mmc_de.ts +++ b/translations/mmc_de.ts @@ -29,7 +29,7 @@ <html><head/><body><p>MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple instances of Minecraft at once.</p></body></html> - <html><head/><body><p>MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es dir erlaubt, mehrere Installationen von Minecraft zu verwalten.</p></body></html> + <html><head/><body><p>MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es Ihnen erlaubt, mehrere Installationen von Minecraft zu verwalten.</p></body></html> @@ -1984,7 +1984,7 @@ Die folgende Instanz löschen: Do you want to revert the version of this instance to its original configuration? - Möchtest du wirklich die Version dieser Instanz zurücksetzen? + Möchten Sie wirklich die Version dieser Instanz zurücksetzen? @@ -2004,7 +2004,7 @@ Die folgende Instanz löschen: This will revert any changes you did to the version up to this point. Is that OK? - Dies wird alle Änderungen, die du vorgenommen hast zurücksetzen. Bist du damit einverstanden? + Dies wird alle Änderungen, die Sie vorgenommen haben zurücksetzen. Sind Sie damit einverstanden? @@ -2217,7 +2217,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer External Editors (leave empty for system default) - Externe Editor-Anwendungen (lehr lassen um die System-Voreinstellung zu benutzen) + Externe Editor-Anwendungen (leer lassen um die System-Voreinstellung zu benutzen) @@ -2399,7 +2399,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Development builds contain experimental features and may be unstable. Are you sure you want to enable them? - Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du Sie dennoch aktivieren? + Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchten Sie sie dennoch aktivieren? From 08856682920d74c23c7b833131f2cf1703d7b610 Mon Sep 17 00:00:00 2001 From: xnrand Date: Sat, 4 Jan 2014 13:02:07 +0100 Subject: [PATCH 04/45] Update mmc_de.ts Fixed grammar, improved wording. It's not perfect but definitely better. --- translations/mmc_de.ts | 176 ++++++++++++++++++++--------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/translations/mmc_de.ts b/translations/mmc_de.ts index 47df4508..a175b11e 100644 --- a/translations/mmc_de.ts +++ b/translations/mmc_de.ts @@ -29,7 +29,7 @@ <html><head/><body><p>MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple instances of Minecraft at once.</p></body></html> - <html><head/><body><p>MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es Ihnen erlaubt, mehrere Installationen von Minecraft zu verwalten.</p></body></html> + <html><head/><body><p>MultiMC ist ein alternativer Launcher, der das Management von Minecraft vereinfacht, indem er es dir erlaubt, mehrere Installationen von Minecraft zu verwalten.</p></body></html> @@ -512,7 +512,7 @@ p, li { white-space: pre-wrap; } <html><head/><body><p>Set the currently selected account as the active account. The active account is the account that is used to log in (unless it is overridden in an instance-specific setting).</p></body></html> - <html><head/><body><p>Mache das ausgewählten Konto zum voreingeställten Konto. Das voreingeställte Konto ist das Konto das zum einloggen benutzt wird (es sei den es wird von einer Instanz-spezifischen einstellung überschrieben).</p></body></html> + <html><head/><body><p>Mache das ausgewählten Konto zum voreingestellten Konto. Das voreingestellte Konto ist das Konto das zum Einloggen benutzt wird (es sei denn es wird von einer Instanz-spezifischen Einstellung überschrieben).</p></body></html> @@ -522,22 +522,22 @@ p, li { white-space: pre-wrap; } Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set. - Mache die voreinstellung rückgängig. Wenn kein Konto voreingeställt ist wird MultiMC dich beim jeden start einer Instans fragen welches Konto benutzt werden soll, es sei den die Instans hat ein Instanz-spezifisches Konto eingeställt. + Mache die Voreinstellung rückgängig. Wenn kein Konto voreingestellt ist wird MultiMC dich beim jedem Start einer Instanz fragen, welches Konto benutzt werden soll, es sei denn die Instans hat ein Instanz-spezifisches Konto eingeställt. &No Default - &Keine voreinstellung + &Keine Voreinstellung Please enter your Mojang or Minecraft account username and password to add your account. - Bitte geben Benutzernamen und Passwort ihres Mojang oder Minecraft Konto an um ihr Konto hinzuzufügen. + Bitte gib Benutzernamen und Passwort deines Mojang- oder Minecraft-Kontos an um es hinzuzufügen. Login error. - Login Fehler. + Loginfehler. @@ -555,12 +555,12 @@ p, li { white-space: pre-wrap; } Use as default? - Als Default benutzen? + Als Voreinstellung benutzen? Use as default for this instance only? - Nur für diese Instanz als Default benutzen? + Nur für diese Instanz als Voreinstellung benutzen? @@ -568,7 +568,7 @@ p, li { white-space: pre-wrap; } Migrating legacy assets... - Migration der bestehenden daten ... + Migriere bestehende Daten... @@ -643,12 +643,12 @@ p, li { white-space: pre-wrap; } Finding information about the current version... - Finde informationen zur benutzten Version... + Finde Informationen zur benutzten Version... Loading version information... - Lade Versionsinformation... + Lade Versionsinformationen... @@ -668,27 +668,27 @@ p, li { white-space: pre-wrap; } Failed to process update lists... - Fehler beim bearbeiten der Updateliste... + Fehler beim Bearbeiten der Updateliste... Downloading %1 update files. - %1 Dateien werden herruntergeladen. + %1 Dateien werden heruntergeladen. Processing file lists - figuring out how to install the update... - Bearbete Dateilisten - Rechne aus wie das Update installiert werden soll... + Bearbete Dateilisten - Rechne aus, wie das Update installiert werden soll... Failed to write update script file. - Fehler beim schreiben des Updatescripts. + Fehler beim Schreiben des Updatescripts. Failed to download update files. - Fehler beim herrunterladen der Updatedateien. + Fehler beim Herunterladen der Updatedateien. @@ -696,7 +696,7 @@ p, li { white-space: pre-wrap; } Edit Account - Redigiere Konto + Bearbeite Konto @@ -732,7 +732,7 @@ p, li { white-space: pre-wrap; } Fetching Forge version lists... - Lade liste von Forge Versionen... + Lade die Forge-Versionslisten... @@ -770,7 +770,7 @@ p, li { white-space: pre-wrap; } Instance Settings - Instanz einstellungen + Instanzeinstellungen @@ -902,12 +902,12 @@ p, li { white-space: pre-wrap; } Select a Java version - Wähle eine Java version + Wähle eine Java-Version Find Java executable - Java-Anwendung finden + Java-Programm finden @@ -922,7 +922,7 @@ p, li { white-space: pre-wrap; } The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. - Das ausgewählte java program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den pfad zu der java applikation angeben. + Das ausgewählte Java-Programm hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den Pfad zum Java-Programm angeben. @@ -930,7 +930,7 @@ p, li { white-space: pre-wrap; } Detecting Java installations... - Suche nach Java installationen... + Suche nach Java-Installationen... @@ -938,7 +938,7 @@ p, li { white-space: pre-wrap; } Manage Lwjgl Versions - LWJGL Versions Verwaltung + LWJGL Versionsverwaltung @@ -1019,7 +1019,7 @@ p, li { white-space: pre-wrap; } Texture Packs - Texturenpacks + Texturenpakete @@ -1037,7 +1037,7 @@ p, li { white-space: pre-wrap; } Select Core Mods Title of core mod selection dialog - Coremodsauswählen + Coremods auswählen @@ -1054,7 +1054,7 @@ p, li { white-space: pre-wrap; } Select Texture Packs Title of texture pack selection dialog - Texturenpacks auswählen + Texturenpakete auswählen @@ -1072,37 +1072,37 @@ p, li { white-space: pre-wrap; } Installing new LWJGL - extracting - Das neue LWJGL wird installier - Extraktion + Das neue LWJGL wird installiert - entpacken Checking for jar updates... - Suche nach jar änderungen... + Suche nach jar Änderungen... Downloading new minecraft.jar ... - Neue minecraft jar wird herruntergeladen... + Neue minecraft.jar wird herruntergeladen... Installing mods: Adding - Mod installation: Einfügung von + Mod-Installation: Hinzufügen Installing mods: Backing up minecraft.jar ... - Mod installation: Erstellen von Sicherheitskopie von minecraft.jar... + Mod-Installation: Erstellen einer Sicherheitskopie von minecraft.jar... Installing mods: Opening minecraft.jar ... - Mod installation: minecraft.jar wird geöffnet... + Mod-Installation: minecraft.jar wird geöffnet... Installing mods: Adding mod files... - Mod installation: Mods werden hinzugefügt... + Mod-Installation: Mod-Dateien werden hinzugefügt... @@ -1138,7 +1138,7 @@ p, li { white-space: pre-wrap; } Offline Once Use offline mode one time - Einmal Offline + Einmal Offline-Modus verwenden Name @@ -1170,7 +1170,7 @@ p, li { white-space: pre-wrap; } The login servers are currently unavailable. Check http://help.mojang.com/ for more info. - Derzeit kann auf die Login-Server nicht zugegriffe werden. Für weitere Informationen siehe http://help.mojang.com/. + Derzeit kann auf die Login-Server nicht zugegriffen werden. Für weitere Informationen siehe http://help.mojang.com/. Login failed: Unknown HTTP error %1 occurred. @@ -1192,13 +1192,13 @@ p, li { white-space: pre-wrap; } Select a mod to view title and authors... - Wähle ein mod um Titel und Authoren zu sehen... + Wähle einem Mod aus, um Titel und Autoren zu sehen... Select a mod to view description... - Wähle ein mod um die Beschreibung zu sehen... + Wähle ein Mod um die Beschreibung zu sehen... @@ -1211,7 +1211,7 @@ p, li { white-space: pre-wrap; } Loading instance version list... - Lade liste von Minecraft Versionen... + Lade Liste von Minecraft-Versionen... @@ -1273,13 +1273,13 @@ p, li { white-space: pre-wrap; } View Central Mods Folder - Zenstralen Modordner öffnen + Zenstralen Mod-Ordner öffnen Open the central mods folder in a file browser. - Zentralen Modordner in einem Dateimanager öffnen. + Zentralen Mod-Ordner in einem Dateimanager öffnen. @@ -1337,7 +1337,7 @@ p, li { white-space: pre-wrap; } Open the MultiMC development blog to read more news about MultiMC. - Öffne den MultiMC Entwicklungs Blog um mehr Nachrichten zu MultiMC zu lesen. + Öffne den MultiMC Entwicklerblog um mehr Nachrichten zu MultiMC zu lesen. @@ -1491,7 +1491,7 @@ p, li { white-space: pre-wrap; } Config Folder - Konfig-ordner + Konfig-Ordner @@ -1527,7 +1527,7 @@ p, li { white-space: pre-wrap; } Manage your Mojang or Minecraft accounts. - Verwalte ihre Mojang und Minecraft Konten. + Verwalte diene Mojang- und Minecraft -onten. <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnatok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> @@ -1609,7 +1609,7 @@ Bitte fügen Sie Ihr Mojang oder Minecraft Konto hinzu. CAREFUL - VORSICHTIG + ACHTUNG @@ -1636,7 +1636,7 @@ Die folgende Instanz löschen: In order to play Minecraft, you must have at least one Mojang or Minecraft account logged in to MultiMC.Would you like to open the account manager to add an account now? - Damit sie Minecraft spielen können mussen sie mindestens ein Mojang oder Minecraft Konto in MultiMC hinterlegen. Wollen sie die Konto Verwaltung öffen um ein Konto hinzuzufügen? + Damit sie Minecraft spielen können mussen sie mindestens ein Mojang- oder Minecraft-Konto in MultiMC hinterlegen. Wollen sie die Konto Verwaltung öffen um ein Konto hinzuzufügen? @@ -1686,17 +1686,17 @@ Die folgende Instanz löschen: Are you sure? - Sind sie sich sicher? + Sind Sie sicher? This will remove any library/version customization you did previously. This includes things like Forge install and similar. - Dies will sämtliche Bibliotheks/Versions-Anpassung die sie vorgenommen haben entfernen. Dies inkludiert sachen wir Forge oder änlich. + Dies will sämtliche Bibliotheks/Versions-Anpassung die Sie vorgenommen haben entfernen. Dies schließt Sachen wie Forge mit ein. Instance settings - Instanz einstellungen + Instanzeinstellungen @@ -1706,7 +1706,7 @@ Die folgende Instanz löschen: Select a Java version - Wähle eine Java version + Wähle eine Java-Version @@ -1716,7 +1716,7 @@ Die folgende Instanz löschen: You didn't select a valid Java version, so MultiMC will select the default. You can change this in the settings dialog. - Sie haben keine gültige Java version ausgewählt, daher wird MultiMC für sie eine voreinstellung benutzen. Sie können dies in den einstellungen ändern. + Sie haben keine gültige Java-Version ausgewählt, daher wird MultiMC für Sie eine Voreinstellung benutzen. Sie können dies in den Einstellungen ändern. @@ -1725,19 +1725,19 @@ Die folgende Instanz löschen: Minecraft exited with exitcode %1. Message displayed on instance exit - Minecraft wurde mit exitcode %1 beendet. + Minecraft wurde mit Status %1 beendet. Minecraft crashed with exitcode %1. Message displayed on instance crashed - Minecraft ist mit dem exitcode %1 abgesturtzt + Minecraft ist mit dem Status %1 abgesturtzt Minecraft was killed by user. Message displayed after the instance exits due to kill request - Minecraft wurde durch den nutzer gekillt. + Minecraft wurde durch den Nutzer gekillt. @@ -1750,15 +1750,15 @@ Die folgende Instanz löschen: MultiMC display this help and exit. - Zeigt diese Hilfe und beended das Programm. + Zeigt diese Hilfe und beendet das Programm. display program version and exit. - Zeigt die programmversion an und beendet das Programm. + Zeigt die Programmversion an und beendet das Programm. use the supplied directory as MultiMC root instead of the binary location (use '.' for current) - Benutze das angegebene Verzeichnis als Arbeitsverzeichnis anstelle des speicherorts. (Benutze '.' um das aktuele Verzeichnis zu verwenden) + Benutze das angegebene Verzeichnis als Arbeitsverzeichnis anstelle des Speicherorts. (Benutze '.' um das aktuele Verzeichnis zu verwenden) replaces the given file with the running executable @@ -1837,7 +1837,7 @@ Die folgende Instanz löschen: No content. - Kein eintrag. + Kein Eintrag. @@ -1851,7 +1851,7 @@ Die folgende Instanz löschen: Downloading Forge... - Forge wird herruntergeladen... + Forge wird heruntergeladen... @@ -1866,7 +1866,7 @@ Die folgende Instanz löschen: Couldn't install Forge - Fehler beim installieren von Forge + Fehler beim Installieren von Forge @@ -1984,7 +1984,7 @@ Die folgende Instanz löschen: Do you want to revert the version of this instance to its original configuration? - Möchten Sie wirklich die Version dieser Instanz zurücksetzen? + Möchtest du wirklich die Version dieser Instanz zurücksetzen? @@ -1994,17 +1994,17 @@ Die folgende Instanz löschen: Unable to open custom.json, check the settings - Fehler beim öffnen der custom.json Datei, überprüfen Sie Ihre Einstellungen + Fehler beim Öffnen der custom.json Datei, überprüfen Sie Ihre Einstellungen Select Forge version - Wähle Forge Version + Wähle Forge-Version This will revert any changes you did to the version up to this point. Is that OK? - Dies wird alle Änderungen, die Sie vorgenommen haben zurücksetzen. Sind Sie damit einverstanden? + Dies wird alle Änderungen, die du vorgenommen hast zurücksetzen. Bist du damit einverstanden? @@ -2015,12 +2015,12 @@ Die folgende Instanz löschen: There is no information available on how to install LiteLoader into this version of Minecraft - Es gibt momentan keine information zur installation von LiteLoader für diese Version von Minecraft + Es gibt momentan keine Informationen zur Installation von LiteLoader für diese Version von Minecraft For reasons unknown, the LiteLoader installation failed. Check your MultiMC log files for details. - Aus unbekannten Gründen ist die installation von LiteLoader fehlgeschlagen. Schauen sie sich Ihre MultiMC log datei an um weitere details zu erhalten. + Aus unbekannten Gründen ist die Installation von LiteLoader fehlgeschlagen. Schauen sie sich Ihre MultiMC Logdateien an, um weitere Details zu erhalten. @@ -2029,7 +2029,7 @@ Die folgende Instanz löschen: Testing the Java installation... - Java installation wird getestet... + Java-Installation wird getestet... @@ -2039,17 +2039,17 @@ Die folgende Instanz löschen: Updating assets index... - Daten index wird aktualisiert... + Datenindex wird aktualisiert... Getting the assets files from Mojang... - Daten werden von Mojang herruntergeholt... + Daten werden von Mojang geholt... Getting the library files from Mojang... - Bibliotheken werden von Mojang herruntergeholt... + Bibliotheken werden von Mojang geholt... @@ -2107,12 +2107,12 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Refreshing login token... - Erfrischung des Login-Tokens... + Auffrischung des Login-Tokens... Refreshing login token: Processing response... - Erfrischung des Login-Tokens: Bearbeite Antwort... + Auffrischung des Login-Tokens: Verarbeite Antwort... @@ -2125,7 +2125,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer General - Generell + Allgemein @@ -2192,7 +2192,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Track FTB instances - FTB Instanzen verfolgen + FTB-Instanzen beobachten @@ -2217,7 +2217,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer External Editors (leave empty for system default) - Externe Editor-Anwendungen (leer lassen um die System-Voreinstellung zu benutzen) + Externe Editor-Anwendungen (leer lassen, um die System-Voreinstellung zu benutzen) @@ -2266,7 +2266,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Login automatically when an instance icon is double clicked? - Automatisch einloggen, wenn das Instanzsymbol doppelt gecklickt wurde? + Automatisch einloggen, wenn das Instanzsymbol doppelt geklickt wurde? @@ -2349,7 +2349,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer FTB Launcher Directory - FTB Launcher Ordner + FTB-Launcher-Ordner @@ -2389,7 +2389,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer The file chosen does not seem to be an executable - Die ausgesuchte Datei scheint nicht eine Anwendung zu seien + Die ausgesuchte Datei scheint keine Anwendung zu sein @@ -2399,7 +2399,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Development builds contain experimental features and may be unstable. Are you sure you want to enable them? - Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchten Sie sie dennoch aktivieren? + Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du Sie dennoch aktivieren? @@ -2425,7 +2425,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. - Das ausgewählte java program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den pfad zu der java applikation angeben. + Das ausgewählte Java-Program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den Pfad zum Java-Programm angeben. @@ -2454,12 +2454,12 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Update now - Jetzt herrunterladen + Jetzt herunterladen Update after MultiMC closes - Herrunterladen wenn MultiMC abgeschlossen wird + Herunterladen wenn MultiMC geschlossen wird @@ -2492,7 +2492,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Show &Nostalgia? - '&Nostalgia'-Versionen anzeigen? + '&Nostalgie'-Versionen anzeigen? @@ -2515,27 +2515,27 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer <b>SSL Handshake failed.</b><br/>There might be a few causes for it:<br/><ul><li>You use Windows XP and need to <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">update your root certificates</a></li><li>Some device on your network is interfering with SSL traffic. In that case, you have bigger worries than Minecraft not starting.</li><li>Possibly something else. Check the MultiMC log file for details</li></ul> - <b>SSL Handshake Fehlgeschlagen.</b><br/>Es kann mehrere Erklärungen geben:<br/><ul><li>Sie benutzen Windows XP und mussen <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">Ihr root certifikat aktualisieren</a></li><li>Irgend ein gerät in Ihrem Netzwerk mischt sich in den SSL verkehr mit ein. In diesem fall haben sie grössere probleme alls das Minecraft nicht starten kann.</li><li>Möglicherweise irgendetwas anderes. Sehen sie in der MultiMC log Datei nach um weitere Details zu finden</li></ul> + <b>SSL-Handshake fehlgeschlagen.</b><br/>Es kann mehrere Erklärungen geben:<br/><ul><li>Sie benutzen Windows XP und mussen <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">Ihr root certifikat aktualisieren</a></li><li>Irgend ein gerät in Ihrem Netzwerk mischt sich in den SSL verkehr mit ein. In diesem fall haben sie grössere probleme alls das Minecraft nicht starten kann.</li><li>Möglicherweise irgendetwas anderes. Sehen sie in der MultiMC log Datei nach um weitere Details zu finden</li></ul> An unknown error occurred when processing the response from the authentication server. - Ein unbekannter fehler ist beim bearbeiten der Antwort des Authentikations-Servers aufgetreten. + Ein unbekannter Fehler ist beim Bearbeiten der Antwort des Authentifizierungs-Servers aufgetreten. Failed to parse Yggdrasil JSON response: %1 at offset %2. - Fehler beim bearbeiten der Yggdrasil-JSON-Antwort: %1 bei %2. + Fehler beim Bearbeiten der Yggdrasil-JSON-Antwort: %1 bei %2. An unknown error occurred when trying to communicate with the authentication server: %1 - Ein unbekannter fehler ist aufgetreten bei der Kommunikation mit den Authentifizierungs-Server: %1 + Ein unbekannter Fehler ist aufgetreten bei der Kommunikation mit den Authentifizierungs-Server: %1 An unknown Yggdrasil error occurred. - Ein unbekannter Yggdrasil fehler ist entstanden. + Ein unbekannter Yggdrasil-Fehler ist aufgetreten. From 9bbbb050602e401b3805febf23a2bc2bdb881d18 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 13:35:15 +0100 Subject: [PATCH 05/45] Add xnrand to the translation credits --- translations/mmc_de.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/mmc_de.ts b/translations/mmc_de.ts index a175b11e..f1da9766 100644 --- a/translations/mmc_de.ts +++ b/translations/mmc_de.ts @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } No Language file loaded. Hey, Translator, feel free to put credit to you here - Deutsche Sprachdatei von Kilobyte (siehe oben). Aktualisiert von Jan + Deutsche Sprachdatei von Kilobyte (siehe oben). Aktualisiert von xnrand (nsfw auf IRC) und Jan. From 7f6b344b49506462a63453bc79ae1b82536dc138 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 16:13:28 +0100 Subject: [PATCH 06/45] Clean up/update translation code and made language selectable in the settings dialog --- MultiMC.cpp | 30 +++++++++++++++++------------- gui/dialogs/SettingsDialog.cpp | 16 ++++++++++++++++ gui/dialogs/SettingsDialog.ui | 17 +++++++++++++++-- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/MultiMC.cpp b/MultiMC.cpp index 619a7e0a..80eddcd1 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -54,8 +54,6 @@ MultiMC::MultiMC(int &argc, char **argv, const QString &data_dir_override) setOrganizationName("MultiMC"); setApplicationName("MultiMC5"); - initTranslations(); - setAttribute(Qt::AA_UseHighDpiPixmaps); // Don't quit on hiding the last window this->setQuitOnLastWindowClosed(false); @@ -179,6 +177,9 @@ MultiMC::MultiMC(int &argc, char **argv, const QString &data_dir_override) // load settings initGlobalSettings(); + // load translations + initTranslations(); + // initialize the updater m_updateChecker.reset(new UpdateChecker()); @@ -281,18 +282,20 @@ MultiMC::~MultiMC() void MultiMC::initTranslations() { + QLocale locale(m_settings->get("Language").toString()); + QLocale::setDefault(locale); + QLOG_INFO() << "Your language is" << locale.bcp47Name(); m_qt_translator.reset(new QTranslator()); - if (m_qt_translator->load("qt_" + QLocale::system().name(), + if (m_qt_translator->load("qt_" + locale.bcp47Name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { - std::cout << "Loading Qt Language File for " - << QLocale::system().name().toLocal8Bit().constData() << "..."; + QLOG_DEBUG() << "Loading Qt Language File for" + << locale.bcp47Name().toLocal8Bit().constData() << "..."; if (!installTranslator(m_qt_translator.get())) { - std::cout << " failed."; + QLOG_ERROR() << "Loading Qt Language File failed."; m_qt_translator.reset(); } - std::cout << std::endl; } else { @@ -300,17 +303,15 @@ void MultiMC::initTranslations() } m_mmc_translator.reset(new QTranslator()); - if (m_mmc_translator->load("mmc_" + QLocale::system().name(), - QDir("translations").absolutePath())) + if (m_mmc_translator->load("mmc_" + locale.bcp47Name(), MMC->root() + "/translations")) { - std::cout << "Loading MMC Language File for " - << QLocale::system().name().toLocal8Bit().constData() << "..."; + QLOG_DEBUG() << "Loading MMC Language File for" + << locale.bcp47Name().toLocal8Bit().constData() << "..."; if (!installTranslator(m_mmc_translator.get())) { - std::cout << " failed."; + QLOG_ERROR() << "Loading MMC Language File failed."; m_mmc_translator.reset(); } - std::cout << std::endl; } else { @@ -410,6 +411,9 @@ void MultiMC::initGlobalSettings() // Editors m_settings->registerSetting("JsonEditor", QString()); + // Language + m_settings->registerSetting("Language", QLocale(QLocale::system().language()).bcp47Name()); + // Console m_settings->registerSetting("ShowConsole", true); m_settings->registerSetting("AutoCloseConsole", true); diff --git a/gui/dialogs/SettingsDialog.cpp b/gui/dialogs/SettingsDialog.cpp index 9362075e..e0e1b82c 100644 --- a/gui/dialogs/SettingsDialog.cpp +++ b/gui/dialogs/SettingsDialog.cpp @@ -219,6 +219,9 @@ void SettingsDialog::applySettings(SettingsObject *s) } } + // Language + s->set("Language", ui->languageBox->currentData().toLocale().bcp47Name()); + // Updates s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked()); @@ -286,6 +289,19 @@ void SettingsDialog::applySettings(SettingsObject *s) void SettingsDialog::loadSettings(SettingsObject *s) { + // Language + ui->languageBox->clear(); + ui->languageBox->addItem(tr("English"), QLocale(QLocale::English)); + foreach(const QString & lang, + QDir(MMC->root() + "/translations").entryList(QStringList() << "*.qm", QDir::Files)) + { + QLocale locale(lang.section(QRegExp("[_\.]"), 1)); + ui->languageBox->addItem( + QLocale::languageToString(locale.language()), + locale); + } + ui->languageBox->setCurrentIndex(ui->languageBox->findData(QLocale(s->get("Language").toString()))); + // Updates ui->autoUpdateCheckBox->setChecked(s->get("AutoUpdate").toBool()); ui->devBuildsCheckBox->setChecked(s->get("UseDevBuilds").toBool()); diff --git a/gui/dialogs/SettingsDialog.ui b/gui/dialogs/SettingsDialog.ui index dbc8ca88..c1008c75 100644 --- a/gui/dialogs/SettingsDialog.ui +++ b/gui/dialogs/SettingsDialog.ui @@ -7,7 +7,7 @@ 0 0 526 - 628 + 701 @@ -40,6 +40,20 @@ General + + + + + + Language (needs restart): + + + + + + + + @@ -644,7 +658,6 @@ - settingsTab buttonBox sortLastLaunchedBtn sortByNameBtn From 8950953d915ba234f62da93b520a1b82594cb9dc Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sat, 4 Jan 2014 19:20:20 +0100 Subject: [PATCH 07/45] Hopefully fix Qt 5.1 compilation --- gui/dialogs/SettingsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/dialogs/SettingsDialog.cpp b/gui/dialogs/SettingsDialog.cpp index e0e1b82c..60a3e009 100644 --- a/gui/dialogs/SettingsDialog.cpp +++ b/gui/dialogs/SettingsDialog.cpp @@ -220,7 +220,7 @@ void SettingsDialog::applySettings(SettingsObject *s) } // Language - s->set("Language", ui->languageBox->currentData().toLocale().bcp47Name()); + s->set("Language", ui->languageBox->itemData(ui->languageBox->currentIndex()).toLocale().bcp47Name()); // Updates s->set("AutoUpdate", ui->autoUpdateCheckBox->isChecked()); From 6961525faadf5d16fd1323af848ef88b7e1f26d4 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sun, 5 Jan 2014 23:24:05 +0100 Subject: [PATCH 08/45] Unbreak and reactivate the some UpdateChecker tests --- tests/CMakeLists.txt | 19 ++++++++++++++----- tests/TestUtil.h | 2 ++ tests/data/1.json | 6 +++--- tests/data/2.json | 4 ++-- tests/data/channels.json | 4 ++-- tests/test_config.h.in | 3 +++ tests/tst_UpdateChecker.cpp | 35 ++++++++++++++++++++++++++--------- 7 files changed, 52 insertions(+), 21 deletions(-) create mode 100644 tests/test_config.h.in diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2d851404..cc7d1a11 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -84,9 +84,18 @@ if(MultiMC_CODE_COVERAGE) add_custom_target(MultiMC_RUN_TESTS DEPENDS MultiMC_GENERATE_COVERAGE_HTML) endif(MultiMC_CODE_COVERAGE) +set(MultiMC_TEST_DATA_PATH "${CMAKE_CURRENT_BINARY_DIR}/data") +if(UNIX) + # on unix we get the third / from the filename + set(MultiMC_TEST_DATA_PATH "file://${MultiMC_TEST_DATA_PATH}") +else() + # we don't on windows, so we have to add it ourselves + set(MultiMC_TEST_DATA_PATH "file:///${MultiMC_TEST_DATA_PATH}") +endif() +file(GLOB data_files "data/*") +foreach(data_file ${data_files}) + get_filename_component(filename ${data_file} NAME) + configure_file(${data_file} ${CMAKE_CURRENT_BINARY_DIR}/data/${filename} @ONLY) +endforeach() -add_custom_target(MultiMC_Test_Data - ALL - COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/data - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/data ${CMAKE_CURRENT_BINARY_DIR}/data -) +configure_file(test_config.h.in test_config.h @ONLY) diff --git a/tests/TestUtil.h b/tests/TestUtil.h index 57d1fdf2..e9099b15 100644 --- a/tests/TestUtil.h +++ b/tests/TestUtil.h @@ -7,6 +7,8 @@ #include "MultiMC.h" +#include "test_config.h" + struct TestsInternal { static QByteArray readFile(const QString &fileName) diff --git a/tests/data/1.json b/tests/data/1.json index f9f99b22..0f2d6ced 100644 --- a/tests/data/1.json +++ b/tests/data/1.json @@ -8,7 +8,7 @@ "Sources": [ { "SourceType": "http", - "Url": "$PWD/tests/data/fileOneA" + "Url": "@MultiMC_TEST_DATA_PATH@/fileOneA" } ], "Executable": true, @@ -20,7 +20,7 @@ "Sources": [ { "SourceType": "http", - "Url": "$PWD/tests/data/fileTwo" + "Url": "@MultiMC_TEST_DATA_PATH@/fileTwo" } ], "Executable": false, @@ -32,7 +32,7 @@ "Sources": [ { "SourceType": "http", - "Url": "$PWD/tests/data/fileThree" + "Url": "@MultiMC_TEST_DATA_PATH@/fileThree" } ], "Executable": false, diff --git a/tests/data/2.json b/tests/data/2.json index bb59b9b6..6e2b0d3c 100644 --- a/tests/data/2.json +++ b/tests/data/2.json @@ -8,7 +8,7 @@ "Sources": [ { "SourceType": "http", - "Url": "$PWD/tests/data/fileOneB" + "Url": "@MultiMC_TEST_DATA_PATH@/fileOneB" } ], "Executable": true, @@ -20,7 +20,7 @@ "Sources": [ { "SourceType": "http", - "Url": "$PWD/tests/data/fileTwo" + "Url": "@MultiMC_TEST_DATA_PATH@/fileTwo" } ], "Executable": false, diff --git a/tests/data/channels.json b/tests/data/channels.json index d7446274..3ad504b0 100644 --- a/tests/data/channels.json +++ b/tests/data/channels.json @@ -5,13 +5,13 @@ "id": "develop", "name": "Develop", "description": "The channel called \"develop\"", - "url": "$PWD/tests/data/" + "url": "@MultiMC_TEST_DATA_PATH@" }, { "id": "stable", "name": "Stable", "description": "It's stable at least", - "url": "$PWD/tests/data/" + "url": "@MultiMC_TEST_DATA_PATH@" }, { "id": "42", diff --git a/tests/test_config.h.in b/tests/test_config.h.in new file mode 100644 index 00000000..69dd38e7 --- /dev/null +++ b/tests/test_config.h.in @@ -0,0 +1,3 @@ +#pragma once + +#define MultiMC_TEST_DATA_PATH "@MultiMC_TEST_DATA_PATH@" diff --git a/tests/tst_UpdateChecker.cpp b/tests/tst_UpdateChecker.cpp index 1e5e682f..0dcb242f 100644 --- a/tests/tst_UpdateChecker.cpp +++ b/tests/tst_UpdateChecker.cpp @@ -1,6 +1,9 @@ #include #include +#include "depends/settings/settingsobject.h" +#include "depends/settings/setting.h" + #include "TestUtil.h" #include "logic/updater/UpdateChecker.h" @@ -20,6 +23,19 @@ QDebug operator<<(QDebug dbg, const UpdateChecker::ChannelListEntry &c) return dbg.maybeSpace(); } +class ResetSetting +{ +public: + ResetSetting(std::shared_ptr setting) : setting(setting), oldValue(setting->get()) {} + ~ResetSetting() + { + setting->set(oldValue); + } + + std::shared_ptr setting; + QVariant oldValue; +}; + class UpdateCheckerTest : public QObject { Q_OBJECT @@ -76,24 +92,27 @@ slots: << true << true << (QList() - << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", "$PWD/tests/data/"} - << UpdateChecker::ChannelListEntry{"stable", "Stable", "It's stable at least", "$PWD/tests/data/"} + << UpdateChecker::ChannelListEntry{"develop", "Develop", "The channel called \"develop\"", MultiMC_TEST_DATA_PATH} + << UpdateChecker::ChannelListEntry{"stable", "Stable", "It's stable at least", MultiMC_TEST_DATA_PATH} << UpdateChecker::ChannelListEntry{"42", "The Channel", "This is the channel that is going to answer all of your questions", "https://dent.me/tea"}); } void tst_ChannelListParsing() { + ResetSetting resetUpdateChannel(MMC->settings()->getSetting("UpdateChannel")); + QFETCH(QString, channel); QFETCH(QString, channelUrl); QFETCH(bool, hasChannels); QFETCH(bool, valid); QFETCH(QList, result); + MMC->settings()->set("UpdateChannel", channel); + UpdateChecker checker; QSignalSpy channelListLoadedSpy(&checker, SIGNAL(channelListLoaded())); QVERIFY(channelListLoadedSpy.isValid()); - checker.setCurrentChannel(channel); checker.setChannelListUrl(channelUrl); checker.updateChanList(); @@ -112,8 +131,7 @@ slots: QCOMPARE(checker.hasChannels(), hasChannels); QCOMPARE(checker.getChannelList(), result); } - // FIXME: fix, comment, explain what it does. -/* + void tst_UpdateChecking_data() { QTest::addColumn("channel"); @@ -126,19 +144,19 @@ slots: << 2 << (QList() << QString() << "1.0.3" << 3); } - */ -/* void tst_UpdateChecking() { + ResetSetting resetUpdateChannel(MMC->settings()->getSetting("UpdateChannel")); + QFETCH(QString, channel); QFETCH(QString, channelUrl); QFETCH(int, currentBuild); QFETCH(QList, result); + MMC->settings()->set("UpdateChannel", channel); MMC->m_version.build = currentBuild; UpdateChecker checker; - checker.setCurrentChannel(channel); checker.setChannelListUrl(channelUrl); QSignalSpy updateAvailableSpy(&checker, SIGNAL(updateAvailable(QString,QString,int))); @@ -158,7 +176,6 @@ slots: res[0] = checker.m_channels[0].url; QCOMPARE(updateAvailableSpy.first(), res); } - */ }; QTEST_GUILESS_MAIN_MULTIMC(UpdateCheckerTest) From 7d76fd57e99e686d59f48038e7b762e4064996d1 Mon Sep 17 00:00:00 2001 From: Jan Dalheimer Date: Sun, 5 Jan 2014 23:24:19 +0100 Subject: [PATCH 09/45] Get rid of some obsolete functions --- logic/updater/UpdateChecker.cpp | 1 - logic/updater/UpdateChecker.h | 2 -- 2 files changed, 3 deletions(-) diff --git a/logic/updater/UpdateChecker.cpp b/logic/updater/UpdateChecker.cpp index 489e7769..68d97db5 100644 --- a/logic/updater/UpdateChecker.cpp +++ b/logic/updater/UpdateChecker.cpp @@ -30,7 +30,6 @@ UpdateChecker::UpdateChecker() { - m_currentChannel = VERSION_CHANNEL; m_channelListUrl = CHANLIST_URL; m_updateChecking = false; m_chanListLoading = false; diff --git a/logic/updater/UpdateChecker.h b/logic/updater/UpdateChecker.h index 7840cedc..3b0ee28d 100644 --- a/logic/updater/UpdateChecker.h +++ b/logic/updater/UpdateChecker.h @@ -27,7 +27,6 @@ public: UpdateChecker(); void checkForUpdate(bool notifyNoUpdate); - void setCurrentChannel(const QString &channel) { m_currentChannel = channel; } void setChannelListUrl(const QString &url) { m_channelListUrl = url; } /*! @@ -83,7 +82,6 @@ private: QString m_repoUrl; QString m_channelListUrl; - QString m_currentChannel; QList m_channels; From 5650a28fc6b51d79a388f9b7db5ecfec43852c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 8 Jan 2014 21:06:31 +0100 Subject: [PATCH 10/45] Hopefully fix OSX icon file --- CMakeLists.txt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c795ab8..c5c23235 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -526,13 +526,6 @@ ENDIF() ################################ COMPILE ################################ -# ICNS file for OS X -IF(APPLE) - SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - SET(MULTIMC_SOURCES ${MULTIMC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns) -ENDIF(APPLE) - # Link additional libraries IF(WIN32) SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} @@ -661,6 +654,11 @@ FILE(WRITE \"\${CMAKE_INSTALL_PREFIX}/${QTCONF_DEST_DIR}/qt.conf\" \"\") COMPONENT Runtime ) +# ICNS file for OS X +IF(APPLE) + INSTALL(FILES MultiMC.icns DESTINATION MultiMC.app/Contents/Resources) +ENDIF() + CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/install_prereqs.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/install_prereqs.cmake" From c51a993ff741074ac88bbc901ebfad9da636eeaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 9 Jan 2014 01:20:24 +0100 Subject: [PATCH 11/45] Add logging calls to the java checker. --- logic/JavaChecker.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/logic/JavaChecker.cpp b/logic/JavaChecker.cpp index 6ee7b4cf..b87ee3d5 100644 --- a/logic/JavaChecker.cpp +++ b/logic/JavaChecker.cpp @@ -20,6 +20,9 @@ void JavaChecker::performCheck() process->setArguments(args); process->setProgram(path); process->setProcessChannelMode(QProcess::SeparateChannels); + QLOG_DEBUG() << "Running java checker!"; + QLOG_DEBUG() << "Java: " + path; + QLOG_DEBUG() << "Args: {" + args.join("|") + "}"; connect(process.get(), SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus))); @@ -42,15 +45,19 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) result.path = path; result.id = id; } + QLOG_DEBUG() << "Java checker finished with status " << status << " exit code " << exitcode; if (status == QProcess::CrashExit || exitcode == 1) { + QLOG_DEBUG() << "Java checker failed!"; emit checkFinished(result); return; } bool success = true; QString p_stdout = _process->readAllStandardOutput(); + QLOG_DEBUG() << p_stdout; + QMap results; QStringList lines = p_stdout.split("\n", QString::SkipEmptyParts); for(QString line : lines) @@ -70,6 +77,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) if(!results.contains("os.arch") || !results.contains("java.version") || !success) { + QLOG_DEBUG() << "Java checker failed - couldn't extract required information."; emit checkFinished(result); return; } @@ -84,7 +92,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) result.mojangPlatform = is_64 ? "64" : "32"; result.realPlatform = os_arch; result.javaVersion = java_version; - + QLOG_DEBUG() << "Java checker succeeded."; emit checkFinished(result); } @@ -93,7 +101,7 @@ void JavaChecker::error(QProcess::ProcessError err) if(err == QProcess::FailedToStart) { killTimer.stop(); - + QLOG_DEBUG() << "Java checker has failed to start."; JavaCheckResult result; { result.path = path; @@ -110,6 +118,7 @@ void JavaChecker::timeout() // NO MERCY. NO ABUSE. if(process) { + QLOG_DEBUG() << "Java checker has been killed by timeout."; process->kill(); } } From 52c9cd5497153365f5b3871b216e5828923f9b5f Mon Sep 17 00:00:00 2001 From: Forkk Date: Wed, 8 Jan 2014 23:38:34 -0600 Subject: [PATCH 12/45] Make the GitHub link in the about dialog clickable Fixes #38 --- gui/dialogs/AboutDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gui/dialogs/AboutDialog.cpp b/gui/dialogs/AboutDialog.cpp index efeea6f2..35c85815 100644 --- a/gui/dialogs/AboutDialog.cpp +++ b/gui/dialogs/AboutDialog.cpp @@ -24,6 +24,8 @@ AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDia MultiMCPlatform::fixWM_CLASS(this); ui->setupUi(this); + ui->urlLabel->setOpenExternalLinks(true); + ui->icon->setPixmap(QIcon(":/icons/multimc/scalable/apps/multimc.svg").pixmap(64)); ui->title->setText("MultiMC 5 " + MMC->version().toString()); From e6201f9ff799a21faff15c61586f2da4e62b799f Mon Sep 17 00:00:00 2001 From: Sky Date: Thu, 9 Jan 2014 15:30:21 +0000 Subject: [PATCH 13/45] Add "MB" as a suffix to memory spinboxes --- gui/dialogs/InstanceSettings.ui | 9 +++++++++ gui/dialogs/SettingsDialog.ui | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gui/dialogs/InstanceSettings.ui b/gui/dialogs/InstanceSettings.ui index 9260caea..930b772a 100644 --- a/gui/dialogs/InstanceSettings.ui +++ b/gui/dialogs/InstanceSettings.ui @@ -168,6 +168,9 @@ + + MB + 512 @@ -198,6 +201,9 @@ + + MB + 256 @@ -214,6 +220,9 @@ + + MB + 64 diff --git a/gui/dialogs/SettingsDialog.ui b/gui/dialogs/SettingsDialog.ui index e7671cce..5f2614ed 100644 --- a/gui/dialogs/SettingsDialog.ui +++ b/gui/dialogs/SettingsDialog.ui @@ -596,6 +596,9 @@ + + MB + 512 @@ -626,6 +629,9 @@ + + MB + 256 @@ -649,6 +655,9 @@ + + MB + 64 @@ -895,7 +904,7 @@ - + From 3c189a65530a8bb67a86806861ca3abcd7c2da3b Mon Sep 17 00:00:00 2001 From: Sky Date: Fri, 10 Jan 2014 12:40:20 +0000 Subject: [PATCH 14/45] Hide user properties in the console too --- logic/MinecraftProcess.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 209929b7..b3959db9 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -90,6 +90,14 @@ QString MinecraftProcess::censorPrivateInfo(QString in) in.replace(profileId, ""); in.replace(profileName, ""); } + + auto i = m_account->user().properties.begin(); + while (i != m_account->user().properties.end()) + { + in.replace(i.value(), "<" + i.key().toUpper() + ">"); + ++i; + } + return in; } From 9ddf2aec31e33e8e0fa450d0084f115471401ad4 Mon Sep 17 00:00:00 2001 From: Sky Date: Fri, 10 Jan 2014 13:16:31 +0000 Subject: [PATCH 15/45] Add tooltips to Java memory spinboxes --- gui/dialogs/InstanceSettings.ui | 9 +++++++++ gui/dialogs/SettingsDialog.ui | 11 ++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gui/dialogs/InstanceSettings.ui b/gui/dialogs/InstanceSettings.ui index 930b772a..9c7e1757 100644 --- a/gui/dialogs/InstanceSettings.ui +++ b/gui/dialogs/InstanceSettings.ui @@ -168,6 +168,9 @@ + + The maximum amount of memory Minecraft is allowed to use. + MB @@ -201,6 +204,9 @@ + + The amount of memory Minecraft is started with. + MB @@ -220,6 +226,9 @@ + + The amount of memory available to store loaded Java classes. + MB diff --git a/gui/dialogs/SettingsDialog.ui b/gui/dialogs/SettingsDialog.ui index 840e9928..b95b3c8c 100644 --- a/gui/dialogs/SettingsDialog.ui +++ b/gui/dialogs/SettingsDialog.ui @@ -599,6 +599,9 @@ + + The maximum amount of memory Minecraft is allowed to use. + MB @@ -632,6 +635,9 @@ + + The amount of memory Minecraft is started with. + MB @@ -658,6 +664,9 @@ + + The amount of memory available to store loaded Java classes. + MB @@ -907,7 +916,7 @@ - + From 8e286c2b5c432e972df2e94b01481bbe094e464c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Fri, 10 Jan 2014 22:08:00 +0100 Subject: [PATCH 16/45] Make CacheDownload use QSaveFile --- logic/net/CacheDownload.cpp | 48 ++++++++++++++++--------------------- logic/net/CacheDownload.h | 6 ++--- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/logic/net/CacheDownload.cpp b/logic/net/CacheDownload.cpp index 6eadae39..17fd7f2a 100644 --- a/logic/net/CacheDownload.cpp +++ b/logic/net/CacheDownload.cpp @@ -42,6 +42,13 @@ void CacheDownload::start() // if there already is a file and md5 checking is in effect and it can be opened if (!ensureFilePathExists(m_target_path)) { + QLOG_ERROR() << "Could not create folder for " + m_target_path; + emit failed(m_index_within_job); + return; + } + if(!m_output_file.open(QIODevice::WriteOnly)) + { + QLOG_ERROR() << "Could not open " + m_target_path + " for writing"; emit failed(m_index_within_job); return; } @@ -85,26 +92,21 @@ void CacheDownload::downloadFinished() // if the download succeeded if (m_status != Job_Failed) { - // nothing went wrong... m_status = Job_Finished; - if (m_output_file.isOpen()) + if (m_output_file.commit()) { - // save the data to the downloadable if we aren't saving to file - m_output_file.close(); m_entry->md5sum = md5sum.result().toHex().constData(); } else { - if (m_output_file.open(QIODevice::ReadOnly)) - { - m_entry->md5sum = - QCryptographicHash::hash(m_output_file.readAll(), QCryptographicHash::Md5) - .toHex() - .constData(); - m_output_file.close(); - } + QLOG_ERROR() << "Failed to commit changes to " << m_target_path; + m_output_file.cancelWriting(); + m_reply.reset(); + emit failed(m_index_within_job); + return; } + QFileInfo output_file_info(m_target_path); m_entry->etag = m_reply->rawHeader("ETag").constData(); @@ -124,8 +126,7 @@ void CacheDownload::downloadFinished() // else the download failed else { - m_output_file.close(); - m_output_file.remove(); + m_output_file.cancelWriting(); m_reply.reset(); emit failed(m_index_within_job); return; @@ -134,19 +135,12 @@ void CacheDownload::downloadFinished() void CacheDownload::downloadReadyRead() { - if (!m_output_file.isOpen()) - { - if (!m_output_file.open(QIODevice::WriteOnly)) - { - /* - * Can't open the file... the job failed - */ - m_reply->abort(); - emit failed(m_index_within_job); - return; - } - } QByteArray ba = m_reply->readAll(); md5sum.addData(ba); - m_output_file.write(ba); + if(m_output_file.write(ba) != ba.size()) + { + QLOG_ERROR() << "Failed writing into " + m_target_path; + m_reply->abort(); + emit failed(m_index_within_job); + } } diff --git a/logic/net/CacheDownload.h b/logic/net/CacheDownload.h index e25aecd2..921e231b 100644 --- a/logic/net/CacheDownload.h +++ b/logic/net/CacheDownload.h @@ -17,8 +17,8 @@ #include "NetAction.h" #include "HttpMetaCache.h" -#include -#include +#include +#include typedef std::shared_ptr CacheDownloadPtr; class CacheDownload : public NetAction @@ -29,7 +29,7 @@ public: /// if saving to file, use the one specified in this string QString m_target_path; /// this is the output file, if any - QFile m_output_file; + QSaveFile m_output_file; /// the hash-as-you-download QCryptographicHash md5sum; From 088ad07a8098d587aac54a582e1ef70f18ff5d17 Mon Sep 17 00:00:00 2001 From: Sky Date: Sat, 11 Jan 2014 00:22:08 +0000 Subject: [PATCH 17/45] Show active account skin whilst it's checked for updates --- gui/MainWindow.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 31e4b9e4..dba15e98 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -235,17 +235,20 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(MMC->accounts().get(), &MojangAccountList::listChanged, [this] { repopulateAccountsMenu(); }); - std::shared_ptr accounts = MMC->accounts(); + // Show initial account + activeAccountChanged(); + + auto accounts = MMC->accounts(); // TODO: Nicer way to iterate? for (int i = 0; i < accounts->count(); i++) { - MojangAccountPtr account = accounts->at(i); + auto account = accounts->at(i); if (account != nullptr) { auto job = new NetJob("Startup player skins: " + account->username()); - for (AccountProfile profile : account->profiles()) + for (auto profile : account->profiles()) { auto meta = MMC->metacache()->resolveEntry("skins", profile.name + ".png"); auto action = CacheDownload::make( From 43a39a3bfbffa2997cf8ca5126ee3ac5157f62c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 11 Jan 2014 02:06:22 +0100 Subject: [PATCH 18/45] Harden CacheDownload. It's now super hard. SRSLY. --- CMakeLists.txt | 2 ++ logic/net/CacheDownload.cpp | 62 ++++++++++++++++++++++--------------- logic/net/CacheDownload.h | 2 ++ 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3779a74..cab0b51c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,8 @@ IF(UNIX) SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) ENDIF() +set(CMAKE_JAVA_TARGET_OUTPUT_DIR ${PROJECT_BINARY_DIR}/jars) + ######## Set compiler flags ######## IF(APPLE) message(STATUS "Using APPLE CMAKE_CXX_FLAGS") diff --git a/logic/net/CacheDownload.cpp b/logic/net/CacheDownload.cpp index 17fd7f2a..8a8d00f0 100644 --- a/logic/net/CacheDownload.cpp +++ b/logic/net/CacheDownload.cpp @@ -33,8 +33,10 @@ CacheDownload::CacheDownload(QUrl url, MetaEntryPtr entry) void CacheDownload::start() { + m_status = Job_InProgress; if (!m_entry->stale) { + m_status = Job_Finished; emit succeeded(m_index_within_job); return; } @@ -43,12 +45,14 @@ void CacheDownload::start() if (!ensureFilePathExists(m_target_path)) { QLOG_ERROR() << "Could not create folder for " + m_target_path; + m_status = Job_Failed; emit failed(m_index_within_job); return; } - if(!m_output_file.open(QIODevice::WriteOnly)) + if (!m_output_file.open(QIODevice::WriteOnly)) { QLOG_ERROR() << "Could not open " + m_target_path + " for writing"; + m_status = Job_Failed; emit failed(m_index_within_job); return; } @@ -90,12 +94,21 @@ void CacheDownload::downloadError(QNetworkReply::NetworkError error) void CacheDownload::downloadFinished() { // if the download succeeded - if (m_status != Job_Failed) + if (m_status == Job_Failed) + { + m_output_file.cancelWriting(); + m_reply.reset(); + m_status = Job_Failed; + emit failed(m_index_within_job); + return; + } + + if (wroteAnyData) { // nothing went wrong... - m_status = Job_Finished; if (m_output_file.commit()) { + m_status = Job_Finished; m_entry->md5sum = md5sum.result().toHex().constData(); } else @@ -103,44 +116,43 @@ void CacheDownload::downloadFinished() QLOG_ERROR() << "Failed to commit changes to " << m_target_path; m_output_file.cancelWriting(); m_reply.reset(); + m_status = Job_Failed; emit failed(m_index_within_job); return; } - - QFileInfo output_file_info(m_target_path); - - m_entry->etag = m_reply->rawHeader("ETag").constData(); - if (m_reply->hasRawHeader("Last-Modified")) - { - m_entry->remote_changed_timestamp = m_reply->rawHeader("Last-Modified").constData(); - } - m_entry->local_changed_timestamp = - output_file_info.lastModified().toUTC().toMSecsSinceEpoch(); - m_entry->stale = false; - MMC->metacache()->updateEntry(m_entry); - - m_reply.reset(); - emit succeeded(m_index_within_job); - return; } - // else the download failed else { - m_output_file.cancelWriting(); - m_reply.reset(); - emit failed(m_index_within_job); - return; + m_status = Job_Finished; } + + QFileInfo output_file_info(m_target_path); + + m_entry->etag = m_reply->rawHeader("ETag").constData(); + if (m_reply->hasRawHeader("Last-Modified")) + { + m_entry->remote_changed_timestamp = m_reply->rawHeader("Last-Modified").constData(); + } + m_entry->local_changed_timestamp = + output_file_info.lastModified().toUTC().toMSecsSinceEpoch(); + m_entry->stale = false; + MMC->metacache()->updateEntry(m_entry); + + m_reply.reset(); + emit succeeded(m_index_within_job); + return; } void CacheDownload::downloadReadyRead() { QByteArray ba = m_reply->readAll(); md5sum.addData(ba); - if(m_output_file.write(ba) != ba.size()) + if (m_output_file.write(ba) != ba.size()) { QLOG_ERROR() << "Failed writing into " + m_target_path; + m_status = Job_Failed; m_reply->abort(); emit failed(m_index_within_job); } + wroteAnyData = true; } diff --git a/logic/net/CacheDownload.h b/logic/net/CacheDownload.h index 921e231b..48be1dae 100644 --- a/logic/net/CacheDownload.h +++ b/logic/net/CacheDownload.h @@ -33,6 +33,8 @@ public: /// the hash-as-you-download QCryptographicHash md5sum; + bool wroteAnyData = false; + public: explicit CacheDownload(QUrl url, MetaEntryPtr entry); static CacheDownloadPtr make(QUrl url, MetaEntryPtr entry) From d52079e73464dcdcc9b15862c9a610634a9db5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 11 Jan 2014 02:17:51 +0100 Subject: [PATCH 19/45] No more generated resources. --- CMakeLists.txt | 5 +---- generated.qrc.in | 8 -------- main.cpp | 1 - 3 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 generated.qrc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index cab0b51c..dcb4cbaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -559,12 +559,10 @@ ENDIF(MultiMC_CODE_COVERAGE) # Qt 5 stuff QT5_WRAP_UI(MULTIMC_UI ${MULTIMC_UIS}) -CONFIGURE_FILE(generated.qrc.in generated.qrc) -QT5_ADD_RESOURCES(GENERATED_QRC ${CMAKE_CURRENT_BINARY_DIR}/generated.qrc) QT5_ADD_RESOURCES(GRAPHICS_QRC graphics.qrc) # Add common library -ADD_LIBRARY(MultiMC_common STATIC ${MULTIMC_SOURCES} ${MULTIMC_UI} ${GENERATED_QRC} ${GRAPHICS_QRC}) +ADD_LIBRARY(MultiMC_common STATIC ${MULTIMC_SOURCES} ${MULTIMC_UI} ${GRAPHICS_QRC}) # Add executable ADD_EXECUTABLE(MultiMC MACOSX_BUNDLE WIN32 main.cpp ${MULTIMC_RCS}) @@ -574,7 +572,6 @@ TARGET_LINK_LIBRARIES(MultiMC MultiMC_common) TARGET_LINK_LIBRARIES(MultiMC_common xz-embedded unpack200 quazip libUtil libSettings libGroupView ${MultiMC_LINK_ADDITIONAL_LIBS}) QT5_USE_MODULES(MultiMC Core Widgets Network Xml Concurrent ${MultiMC_QT_ADDITIONAL_MODULES}) QT5_USE_MODULES(MultiMC_common Core Widgets Network Xml Concurrent ${MultiMC_QT_ADDITIONAL_MODULES}) -ADD_DEPENDENCIES(MultiMC_common MultiMCLauncher JavaCheck) ################################ INSTALLATION AND PACKAGING ################################ diff --git a/generated.qrc.in b/generated.qrc.in deleted file mode 100644 index 794943eb..00000000 --- a/generated.qrc.in +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/main.cpp b/main.cpp index 57131942..c91af978 100644 --- a/main.cpp +++ b/main.cpp @@ -19,7 +19,6 @@ int main(int argc, char *argv[]) MultiMC app(argc, argv); Q_INIT_RESOURCE(graphics); - Q_INIT_RESOURCE(generated); switch (app.status()) { From a774b3d24816aa0010e1d5f67b20acb99e7181ac Mon Sep 17 00:00:00 2001 From: Sky Date: Sun, 12 Jan 2014 18:28:42 +0000 Subject: [PATCH 20/45] Show Mojang service statuses in status bar --- CMakeLists.txt | 4 + MultiMC.cpp | 6 ++ MultiMC.h | 7 ++ gui/MainWindow.cpp | 79 +++++++++++++++++++ gui/MainWindow.h | 11 +++ logic/net/URLConstants.h | 2 + logic/status/StatusChecker.cpp | 138 +++++++++++++++++++++++++++++++++ logic/status/StatusChecker.h | 67 ++++++++++++++++ 8 files changed, 314 insertions(+) create mode 100644 logic/status/StatusChecker.cpp create mode 100644 logic/status/StatusChecker.h diff --git a/CMakeLists.txt b/CMakeLists.txt index dcb4cbaa..7aba8832 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -393,6 +393,10 @@ logic/news/NewsChecker.cpp logic/news/NewsEntry.h logic/news/NewsEntry.cpp +# Status system +logic/status/StatusChecker.h +logic/status/StatusChecker.cpp + # legacy instances logic/LegacyInstance.h logic/LegacyInstance.cpp diff --git a/MultiMC.cpp b/MultiMC.cpp index 17fc2e0a..819091cd 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -20,8 +20,11 @@ #include "logic/news/NewsChecker.h" +#include "logic/status/StatusChecker.h" + #include "logic/InstanceLauncher.h" #include "logic/net/HttpMetaCache.h" +#include "logic/net/URLConstants.h" #include "logic/JavaUtils.h" @@ -181,6 +184,9 @@ MultiMC::MultiMC(int &argc, char **argv, bool root_override) // initialize the news checker m_newsChecker.reset(new NewsChecker(NEWS_RSS_URL)); + // initialize the status checker + m_statusChecker.reset(new StatusChecker()); + // and instances auto InstDirSetting = m_settings->getSetting("InstanceDir"); m_instances.reset(new InstanceList(InstDirSetting->get().toString(), this)); diff --git a/MultiMC.h b/MultiMC.h index 18c7aab7..638a442f 100644 --- a/MultiMC.h +++ b/MultiMC.h @@ -21,6 +21,7 @@ class JavaVersionList; class UpdateChecker; class NotificationChecker; class NewsChecker; +class StatusChecker; #if defined(MMC) #undef MMC @@ -113,6 +114,11 @@ public: return m_newsChecker; } + std::shared_ptr statusChecker() + { + return m_statusChecker; + } + std::shared_ptr lwjgllist(); std::shared_ptr forgelist(); @@ -183,6 +189,7 @@ private: std::shared_ptr m_updateChecker; std::shared_ptr m_notificationChecker; std::shared_ptr m_newsChecker; + std::shared_ptr m_statusChecker; std::shared_ptr m_accounts; std::shared_ptr m_icons; std::shared_ptr m_qnam; diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index dba15e98..cc6d4abb 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -77,6 +77,8 @@ #include "logic/news/NewsChecker.h" +#include "logic/status/StatusChecker.h" + #include "logic/net/URLConstants.h" #include "logic/BaseInstance.h" @@ -199,7 +201,27 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi connect(MMC->instances().get(), SIGNAL(dataIsInvalid()), SLOT(selectionBad())); m_statusLeft = new QLabel(tr("No instance selected"), this); + m_statusRight = new QLabel(tr("No status available"), this); + m_statusRefresh = new QToolButton(this); + m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly); + m_statusRefresh->setIcon( + QPixmap(":/icons/toolbar/refresh").scaled(16, 16, Qt::KeepAspectRatio)); + statusBar()->addPermanentWidget(m_statusLeft, 1); + statusBar()->addPermanentWidget(m_statusRight, 0); + statusBar()->addPermanentWidget(m_statusRefresh, 0); + + // Start status checker + { + connect(MMC->statusChecker().get(), &StatusChecker::statusLoaded, this, &MainWindow::updateStatusUI); + connect(MMC->statusChecker().get(), &StatusChecker::statusLoadingFailed, this, &MainWindow::updateStatusFailedUI); + + connect(m_statusRefresh, &QAbstractButton::clicked, this, &MainWindow::reloadStatus); + connect(&statusTimer, &QTimer::timeout, this, &MainWindow::reloadStatus); + statusTimer.setSingleShot(true); + + reloadStatus(); + } // Add "manage accounts" button, right align QWidget *spacer = new QWidget(); @@ -498,6 +520,63 @@ void MainWindow::updateNewsLabel() } } +static QString convertStatus(const QString &status) +{ + if(status == "green") return "↑"; + else if(status == "yellow") return "-"; + else if(status == "red") return "↓"; + else return "?"; +} + +void MainWindow::reloadStatus() +{ + MMC->statusChecker()->reloadStatus(); + updateStatusUI(); +} + +static QString makeStatusString(const QMap statuses) +{ + QString status = ""; + status += "Web: " + convertStatus(statuses["minecraft.net"]); + status += " Account: " + convertStatus(statuses["account.mojang.com"]); + status += " Skins: " + convertStatus(statuses["skins.minecraft.net"]); + status += " Auth: " + convertStatus(statuses["authserver.mojang.com"]); + status += " Session: " + convertStatus(statuses["sessionserver.mojang.com"]); + + return status; +} + +void MainWindow::updateStatusUI() +{ + auto statusChecker = MMC->statusChecker(); + auto statuses = statusChecker->getStatusEntries(); + + QString status = makeStatusString(statuses); + if(statusChecker->isLoadingStatus()) + { + m_statusRefresh->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + m_statusRefresh->setText(tr("Loading...")); + } + else + { + m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly); + m_statusRefresh->setText(tr("")); + } + + m_statusRight->setText(status); + + statusTimer.start(60 * 1000); +} + +void MainWindow::updateStatusFailedUI() +{ + m_statusRight->setText(makeStatusString(QMap())); + m_statusRefresh->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + m_statusRefresh->setText(tr("Failed.")); + + statusTimer.start(60 * 1000); +} + void MainWindow::updateAvailable(QString repo, QString versionName, int versionId) { UpdateDialog dlg; diff --git a/gui/MainWindow.h b/gui/MainWindow.h index 12d76da4..eb478776 100644 --- a/gui/MainWindow.h +++ b/gui/MainWindow.h @@ -17,6 +17,7 @@ #include #include +#include #include "logic/lists/InstanceList.h" #include "logic/BaseInstance.h" @@ -168,6 +169,12 @@ slots: void repopulateAccountsMenu(); void updateNewsLabel(); + + void updateStatusUI(); + + void updateStatusFailedUI(); + + void reloadStatus(); /*! * Runs the DownloadUpdateTask and installs updates. @@ -198,8 +205,12 @@ private: Task *m_versionLoadTask; QLabel *m_statusLeft; + QLabel *m_statusRight; + QToolButton *m_statusRefresh; QMenu *accountMenu; QToolButton *accountMenuButton; QAction *manageAccountsAction; + + QTimer statusTimer; }; diff --git a/logic/net/URLConstants.h b/logic/net/URLConstants.h index 9579198d..8cb1f3fd 100644 --- a/logic/net/URLConstants.h +++ b/logic/net/URLConstants.h @@ -31,4 +31,6 @@ const QString SKINS_BASE("skins.minecraft.net/MinecraftSkins/"); const QString AUTH_BASE("authserver.mojang.com/"); const QString FORGE_LEGACY_URL("http://files.minecraftforge.net/minecraftforge/json"); const QString FORGE_GRADLE_URL("http://files.minecraftforge.net/maven/net/minecraftforge/forge/json"); +const QString MOJANG_STATUS_URL("http://status.mojang.com/check"); +const QString MOJANG_STATUS_NEWS_URL("http://status.mojang.com/news"); } diff --git a/logic/status/StatusChecker.cpp b/logic/status/StatusChecker.cpp new file mode 100644 index 00000000..54cf077a --- /dev/null +++ b/logic/status/StatusChecker.cpp @@ -0,0 +1,138 @@ +/* Copyright 2013 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 "StatusChecker.h" + +#include + +#include +#include + +#include + +StatusChecker::StatusChecker() +{ + +} + +void StatusChecker::reloadStatus() +{ + if (isLoadingStatus()) + { + QLOG_INFO() << "Ignored request to reload status. Currently reloading already."; + return; + } + + QLOG_INFO() << "Reloading status."; + + NetJob* job = new NetJob("Status JSON"); + job->addNetAction(ByteArrayDownload::make(URLConstants::MOJANG_STATUS_URL)); + QObject::connect(job, &NetJob::succeeded, this, &StatusChecker::statusDownloadFinished); + QObject::connect(job, &NetJob::failed, this, &StatusChecker::statusDownloadFailed); + m_statusNetJob.reset(job); + job->start(); +} + +void StatusChecker::statusDownloadFinished() +{ + // Parse the XML file and process the RSS feed entries. + QLOG_DEBUG() << "Finished loading status JSON."; + + QByteArray data; + { + ByteArrayDownloadPtr dl = std::dynamic_pointer_cast(m_statusNetJob->first()); + data = dl->m_data; + m_statusNetJob.reset(); + } + + QJsonParseError jsonError; + QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); + + if (jsonError.error != QJsonParseError::NoError) + { + fail("Error parsing status JSON:" + jsonError.errorString()); + return; + } + + if (!jsonDoc.isArray()) + { + fail("Error parsing status JSON: JSON root is not an array"); + return; + } + + QJsonArray root = jsonDoc.array(); + + for(auto status = root.begin(); status != root.end(); ++status) + { + QVariantMap map = (*status).toObject().toVariantMap(); + + for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) + { + QString key = iter.key(); + QVariant value = iter.value(); + + if(value.type() == QVariant::Type::String) + { + m_statusEntries.insert(key, value.toString()); + QLOG_DEBUG() << "Status JSON object: " << key << m_statusEntries[key]; + } + else + { + fail("Malformed status JSON: expected status type to be a string."); + return; + } + } + } + + succeed(); +} + +void StatusChecker::statusDownloadFailed() +{ + fail("Failed to load status JSON."); +} + + +QMap StatusChecker::getStatusEntries() const +{ + return m_statusEntries; +} + +bool StatusChecker::isLoadingStatus() const +{ + return m_statusNetJob.get() != nullptr; +} + +QString StatusChecker::getLastLoadErrorMsg() const +{ + return m_lastLoadError; +} + +void StatusChecker::succeed() +{ + m_lastLoadError = ""; + QLOG_DEBUG() << "Status loading succeeded."; + m_statusNetJob.reset(); + emit statusLoaded(); +} + +void StatusChecker::fail(const QString& errorMsg) +{ + m_lastLoadError = errorMsg; + QLOG_DEBUG() << "Failed to load status:" << errorMsg; + m_statusNetJob.reset(); + emit statusLoadingFailed(errorMsg); +} + diff --git a/logic/status/StatusChecker.h b/logic/status/StatusChecker.h new file mode 100644 index 00000000..b81050ab --- /dev/null +++ b/logic/status/StatusChecker.h @@ -0,0 +1,67 @@ +/* Copyright 2013 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 +#include + +#include + +class StatusChecker : public QObject +{ + Q_OBJECT +public: + StatusChecker(); + + QString getLastLoadErrorMsg() const; + + bool isStatusLoaded() const; + + bool isLoadingStatus() const; + + QMap getStatusEntries() const; + + void Q_SLOT reloadStatus(); + +signals: + void statusLoaded(); + void statusLoadingFailed(QString errorMsg); + +protected slots: + void statusDownloadFinished(); + void statusDownloadFailed(); + +protected: + QMap m_statusEntries; + NetJobPtr m_statusNetJob; + + //! True if news has been loaded. + bool m_loadedStatus; + + QString m_lastLoadError; + + /*! + * Emits newsLoaded() and sets m_lastLoadError to empty string. + */ + void Q_SLOT succeed(); + + /*! + * Emits newsLoadingFailed() and sets m_lastLoadError to the given message. + */ + void Q_SLOT fail(const QString& errorMsg); +}; + From c51090dcff68fc520a8377cb9ff5635a815ff489 Mon Sep 17 00:00:00 2001 From: Sky Date: Sun, 12 Jan 2014 18:34:43 +0000 Subject: [PATCH 21/45] Remove wrong comments --- logic/status/StatusChecker.h | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/logic/status/StatusChecker.h b/logic/status/StatusChecker.h index b81050ab..1cb01836 100644 --- a/logic/status/StatusChecker.h +++ b/logic/status/StatusChecker.h @@ -48,20 +48,10 @@ protected slots: protected: QMap m_statusEntries; NetJobPtr m_statusNetJob; - - //! True if news has been loaded. bool m_loadedStatus; - QString m_lastLoadError; - /*! - * Emits newsLoaded() and sets m_lastLoadError to empty string. - */ void Q_SLOT succeed(); - - /*! - * Emits newsLoadingFailed() and sets m_lastLoadError to the given message. - */ void Q_SLOT fail(const QString& errorMsg); }; From 500581d095b634998f4d6db70276905cbfcf5d21 Mon Sep 17 00:00:00 2001 From: Sky Date: Sun, 12 Jan 2014 18:42:02 +0000 Subject: [PATCH 22/45] More comments removal --- logic/status/StatusChecker.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/logic/status/StatusChecker.cpp b/logic/status/StatusChecker.cpp index 54cf077a..7c856d3f 100644 --- a/logic/status/StatusChecker.cpp +++ b/logic/status/StatusChecker.cpp @@ -47,7 +47,6 @@ void StatusChecker::reloadStatus() void StatusChecker::statusDownloadFinished() { - // Parse the XML file and process the RSS feed entries. QLOG_DEBUG() << "Finished loading status JSON."; QByteArray data; From 398167e8b01732badaa2c757b1547e879a369945 Mon Sep 17 00:00:00 2001 From: Sky Date: Sun, 12 Jan 2014 18:44:54 +0000 Subject: [PATCH 23/45] More space between status items --- gui/MainWindow.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index cc6d4abb..d5cc1d44 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -538,10 +538,10 @@ static QString makeStatusString(const QMap statuses) { QString status = ""; status += "Web: " + convertStatus(statuses["minecraft.net"]); - status += " Account: " + convertStatus(statuses["account.mojang.com"]); - status += " Skins: " + convertStatus(statuses["skins.minecraft.net"]); - status += " Auth: " + convertStatus(statuses["authserver.mojang.com"]); - status += " Session: " + convertStatus(statuses["sessionserver.mojang.com"]); + status += " Account: " + convertStatus(statuses["account.mojang.com"]); + status += " Skins: " + convertStatus(statuses["skins.minecraft.net"]); + status += " Auth: " + convertStatus(statuses["authserver.mojang.com"]); + status += " Session: " + convertStatus(statuses["sessionserver.mojang.com"]); return status; } From fca4441229808891f460d5fbc4affd51e8896aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 9 Jan 2014 01:22:34 +0100 Subject: [PATCH 24/45] Replace old launcher part with a shiny new one. No more garbage on the command line. --- depends/javacheck/.gitignore | 6 + depends/launcher/.gitignore | 6 + depends/launcher/CMakeLists.txt | 25 +- depends/launcher/MultiMCLauncher.java | 331 ------------------ depends/launcher/net/minecraft/Launcher.java | 44 +-- depends/launcher/org/multimc/EntryPoint.java | 135 +++++++ depends/launcher/org/multimc/IconLoader.java | 132 +++++++ depends/launcher/org/multimc/Launcher.java | 22 ++ .../org/multimc/NotFoundException.java | 21 ++ depends/launcher/org/multimc/ParamBucket.java | 86 +++++ .../launcher/org/multimc/ParseException.java | 22 ++ depends/launcher/org/multimc/Utils.java | 125 +++++++ .../multimc/legacy/LegacyFrame.java} | 58 ++- .../org/multimc/legacy/LegacyLauncher.java | 178 ++++++++++ .../org/multimc/onesix/OneSixLauncher.java | 196 +++++++++++ gui/ConsoleWindow.cpp | 4 + gui/dialogs/AboutDialog.ui | 55 ++- logic/BaseInstance.cpp | 7 + logic/BaseInstance.h | 2 + logic/LegacyInstance.cpp | 57 +-- logic/MinecraftProcess.cpp | 51 ++- logic/MinecraftProcess.h | 15 +- logic/OneSixInstance.cpp | 88 +++-- 23 files changed, 1157 insertions(+), 509 deletions(-) create mode 100644 depends/javacheck/.gitignore create mode 100644 depends/launcher/.gitignore delete mode 100644 depends/launcher/MultiMCLauncher.java create mode 100644 depends/launcher/org/multimc/EntryPoint.java create mode 100644 depends/launcher/org/multimc/IconLoader.java create mode 100644 depends/launcher/org/multimc/Launcher.java create mode 100644 depends/launcher/org/multimc/NotFoundException.java create mode 100644 depends/launcher/org/multimc/ParamBucket.java create mode 100644 depends/launcher/org/multimc/ParseException.java create mode 100644 depends/launcher/org/multimc/Utils.java rename depends/launcher/{MCFrame.java => org/multimc/legacy/LegacyFrame.java} (70%) create mode 100644 depends/launcher/org/multimc/legacy/LegacyLauncher.java create mode 100644 depends/launcher/org/multimc/onesix/OneSixLauncher.java diff --git a/depends/javacheck/.gitignore b/depends/javacheck/.gitignore new file mode 100644 index 00000000..cc1c52bf --- /dev/null +++ b/depends/javacheck/.gitignore @@ -0,0 +1,6 @@ +.idea +*.iml +out +.classpath +.idea +.project diff --git a/depends/launcher/.gitignore b/depends/launcher/.gitignore new file mode 100644 index 00000000..cc1c52bf --- /dev/null +++ b/depends/launcher/.gitignore @@ -0,0 +1,6 @@ +.idea +*.iml +out +.classpath +.idea +.project diff --git a/depends/launcher/CMakeLists.txt b/depends/launcher/CMakeLists.txt index 729ebb67..6af5f738 100644 --- a/depends/launcher/CMakeLists.txt +++ b/depends/launcher/CMakeLists.txt @@ -3,20 +3,33 @@ project(launcher Java) find_package(Java 1.6 REQUIRED COMPONENTS Development) include(UseJava) -set(CMAKE_JAVA_JAR_ENTRY_POINT MultiMCLauncher) +set(CMAKE_JAVA_JAR_ENTRY_POINT org.multimc.EntryPoint) set(CMAKE_JAVA_COMPILE_FLAGS -target 1.6 -source 1.6 -Xlint:deprecation -Xlint:unchecked) set(SRC - MultiMCLauncher.java + # OSX things org/simplericity/macify/eawt/Application.java org/simplericity/macify/eawt/ApplicationAdapter.java org/simplericity/macify/eawt/ApplicationEvent.java org/simplericity/macify/eawt/ApplicationListener.java org/simplericity/macify/eawt/DefaultApplication.java + + # legacy applet wrapper thing. + # The launcher has to be there for silly FML/Forge relauncher. net/minecraft/Launcher.java - MCFrame.java + org/multimc/legacy/LegacyLauncher.java + org/multimc/legacy/LegacyFrame.java + + # onesix launcher + org/multimc/onesix/OneSixLauncher.java + + # generic launcher + org/multimc/EntryPoint.java + org/multimc/Launcher.java + org/multimc/ParseException.java + org/multimc/Utils.java + org/multimc/IconLoader.java ) +add_jar(NewLaunch ${SRC}) -add_jar(MultiMCLauncher ${SRC}) - -INSTALL_JAR(MultiMCLauncher "${BINARY_DEST_DIR}/jars") +INSTALL_JAR(NewLaunch "${BINARY_DEST_DIR}/jars") diff --git a/depends/launcher/MultiMCLauncher.java b/depends/launcher/MultiMCLauncher.java deleted file mode 100644 index 09a019ce..00000000 --- a/depends/launcher/MultiMCLauncher.java +++ /dev/null @@ -1,331 +0,0 @@ -// -// Copyright 2012 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. -// - -import java.applet.Applet; -import java.awt.Dimension; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.zip.ZipEntry; -import java.util.zip.ZipException; -import java.util.zip.ZipFile; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import org.simplericity.macify.eawt.Application; -import org.simplericity.macify.eawt.DefaultApplication; - -public class MultiMCLauncher -{ - /** - * @param args - * The arguments you want to launch Minecraft with. New path, - * Username, Session ID. - */ - public static void main(String[] args) - { - if (args.length < 3) - { - System.out.println("Not enough arguments."); - System.exit(-1); - } - - // Set the OSX application icon first, if we are on OSX. - Application application = new DefaultApplication(); - if(application.isMac()) - { - try - { - BufferedImage image = ImageIO.read(new File("icon.png")); - application.setApplicationIconImage(image); - } - catch (IOException e) - { - e.printStackTrace(); - } - } - - String userName = args[0]; - String sessionId = args[1]; - String windowtitle = args[2]; - String windowParams = args[3]; - String lwjgl = args[4]; - String cwd = System.getProperty("user.dir"); - - Dimension winSize = new Dimension(854, 480); - boolean maximize = false; - boolean compatMode = false; - - - String[] dimStrings = windowParams.split("x"); - - if (windowParams.equalsIgnoreCase("compatmode")) - { - compatMode = true; - } - else if (windowParams.equalsIgnoreCase("max")) - { - maximize = true; - } - else if (dimStrings.length == 2) - { - try - { - winSize = new Dimension(Integer.parseInt(dimStrings[0]), - Integer.parseInt(dimStrings[1])); - } - catch (NumberFormatException e) - { - System.out.println("Invalid Window size argument, " + - "using default."); - } - } - else - { - System.out.println("Invalid Window size argument, " + - "using default."); - } - - try - { - File binDir = new File(cwd, "bin"); - File lwjglDir; - if(lwjgl.equalsIgnoreCase("Mojang")) - lwjglDir = binDir; - else - lwjglDir = new File(lwjgl); - - System.out.println("Loading jars..."); - String[] lwjglJars = new String[] { - "lwjgl.jar", "lwjgl_util.jar", "jinput.jar" - }; - - URL[] urls = new URL[4]; - try - { - File f = new File(binDir, "minecraft.jar"); - urls[0] = f.toURI().toURL(); - System.out.println("Loading URL: " + urls[0].toString()); - - for (int i = 1; i < urls.length; i++) - { - File jar = new File(lwjglDir, lwjglJars[i-1]); - urls[i] = jar.toURI().toURL(); - System.out.println("Loading URL: " + urls[i].toString()); - } - } - catch (MalformedURLException e) - { - System.err.println("MalformedURLException, " + e.toString()); - System.exit(5); - } - - System.out.println("Loading natives..."); - String nativesDir = new File(lwjglDir, "natives").toString(); - - System.setProperty("org.lwjgl.librarypath", nativesDir); - System.setProperty("net.java.games.input.librarypath", nativesDir); - - URLClassLoader cl = - new URLClassLoader(urls, MultiMCLauncher.class.getClassLoader()); - - // Get the Minecraft Class. - Class mc = null; - try - { - mc = cl.loadClass("net.minecraft.client.Minecraft"); - - Field f = getMCPathField(mc); - - if (f == null) - { - System.err.println("Could not find Minecraft path field. Launch failed."); - System.exit(-1); - } - - f.setAccessible(true); - f.set(null, new File(cwd)); - // And set it. - System.out.println("Fixed Minecraft Path: Field was " + f.toString()); - } - catch (ClassNotFoundException e) - { - System.err.println("Can't find main class. Searching..."); - - // Look for any class that looks like the main class. - File mcJar = new File(new File(cwd, "bin"), "minecraft.jar"); - ZipFile zip = null; - try - { - zip = new ZipFile(mcJar); - } catch (ZipException e1) - { - e1.printStackTrace(); - System.err.println("Search failed."); - System.exit(-1); - } catch (IOException e1) - { - e1.printStackTrace(); - System.err.println("Search failed."); - System.exit(-1); - } - - Enumeration entries = zip.entries(); - ArrayList classes = new ArrayList(); - - while (entries.hasMoreElements()) - { - ZipEntry entry = entries.nextElement(); - if (entry.getName().endsWith(".class")) - { - String entryName = entry.getName().substring(0, entry.getName().lastIndexOf('.')); - entryName = entryName.replace('/', '.'); - System.out.println("Found class: " + entryName); - classes.add(entryName); - } - } - - for (String clsName : classes) - { - try - { - Class cls = cl.loadClass(clsName); - if (!Runnable.class.isAssignableFrom(cls)) - { - continue; - } - else - { - System.out.println("Found class implementing runnable: " + - cls.getName()); - } - - if (getMCPathField(cls) == null) - { - continue; - } - else - { - System.out.println("Found class implementing runnable " + - "with mcpath field: " + cls.getName()); - } - - mc = cls; - break; - } - catch (ClassNotFoundException e1) - { - // Ignore - continue; - } - } - - if (mc == null) - { - System.err.println("Failed to find Minecraft main class."); - System.exit(-1); - } - else - { - System.out.println("Found main class: " + mc.getName()); - } - } - - System.setProperty("minecraft.applet.TargetDirectory", cwd); - - String[] mcArgs = new String[2]; - mcArgs[0] = userName; - mcArgs[1] = sessionId; - - if (compatMode) - { - System.out.println("Launching in compatibility mode..."); - mc.getMethod("main", String[].class).invoke(null, (Object) mcArgs); - } - else - { - System.out.println("Launching with applet wrapper..."); - try - { - Class MCAppletClass = cl.loadClass( - "net.minecraft.client.MinecraftApplet"); - Applet mcappl = (Applet) MCAppletClass.newInstance(); - MCFrame mcWindow = new MCFrame(windowtitle); - mcWindow.start(mcappl, userName, sessionId, winSize, maximize); - } catch (InstantiationException e) - { - System.out.println("Applet wrapper failed! Falling back " + - "to compatibility mode."); - mc.getMethod("main", String[].class).invoke(null, (Object) mcArgs); - } - } - } catch (ClassNotFoundException e) - { - e.printStackTrace(); - System.exit(1); - } catch (IllegalArgumentException e) - { - e.printStackTrace(); - System.exit(2); - } catch (IllegalAccessException e) - { - e.printStackTrace(); - System.exit(2); - } catch (InvocationTargetException e) - { - e.printStackTrace(); - System.exit(3); - } catch (NoSuchMethodException e) - { - e.printStackTrace(); - System.exit(3); - } catch (SecurityException e) - { - e.printStackTrace(); - System.exit(4); - } - } - - public static Field getMCPathField(Class mc) - { - Field[] fields = mc.getDeclaredFields(); - - for (int i = 0; i < fields.length; i++) - { - Field f = fields[i]; - if (f.getType() != File.class) - { - // Has to be File - continue; - } - if (f.getModifiers() != (Modifier.PRIVATE + Modifier.STATIC)) - { - // And Private Static. - continue; - } - return f; - } - return null; - } -} diff --git a/depends/launcher/net/minecraft/Launcher.java b/depends/launcher/net/minecraft/Launcher.java index 8cef35ad..c9b137e1 100644 --- a/depends/launcher/net/minecraft/Launcher.java +++ b/depends/launcher/net/minecraft/Launcher.java @@ -1,18 +1,18 @@ -// -// Copyright 2012 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. -// +/* + * Copyright 2012-2014 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; @@ -38,7 +38,7 @@ public class Launcher extends Applet implements AppletStub this.setLayout(new BorderLayout()); this.add(applet, "Center"); - this.wrappedApplet = applet; + this.wrappedApplet = applet; this.documentBase = documentBase; } @@ -46,17 +46,17 @@ public class Launcher extends Applet implements AppletStub { params.put(name, value); } - + 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(); @@ -99,7 +99,7 @@ public class Launcher extends Applet implements AppletStub { wrappedApplet.resize(d); } - + @Override public void init() { @@ -127,7 +127,7 @@ public class Launcher extends Applet implements AppletStub { wrappedApplet.destroy(); } - + @Override public URL getCodeBase() { return wrappedApplet.getCodeBase(); diff --git a/depends/launcher/org/multimc/EntryPoint.java b/depends/launcher/org/multimc/EntryPoint.java new file mode 100644 index 00000000..c42e34e7 --- /dev/null +++ b/depends/launcher/org/multimc/EntryPoint.java @@ -0,0 +1,135 @@ +package org.multimc;/* + * Copyright 2012-2014 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. + */ + +import org.multimc.legacy.LegacyLauncher; +import org.multimc.onesix.OneSixLauncher; +import org.simplericity.macify.eawt.Application; +import org.simplericity.macify.eawt.DefaultApplication; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; + +public class EntryPoint +{ + private enum Action + { + Proceed, + Launch + } + + public static void main(String[] args) + { + // Set the OSX application icon first, if we are on OSX. + Application application = new DefaultApplication(); + if(application.isMac()) + { + try + { + BufferedImage image = ImageIO.read(new File("icon.png")); + application.setApplicationIconImage(image); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + EntryPoint listener = new EntryPoint(); + int retCode = listener.listen(); + if (retCode != 0) + { + System.out.println("Exiting with " + retCode); + System.exit(retCode); + } + } + + private Action parseLine(String inData) throws ParseException + { + String[] pair = inData.split(" ", 2); + if(pair.length != 2) + throw new ParseException(); + + String command = pair[0]; + String param = pair[1]; + + if(command.equals("launch")) + { + if(param.equals("legacy")) + { + m_launcher = new LegacyLauncher(); + System.out.println("Using legacy launcher."); + System.out.println(); + return Action.Launch; + } + if(param.equals("onesix")) + { + m_launcher = new OneSixLauncher(); + System.out.println("Using onesix launcher."); + System.out.println(); + return Action.Launch; + } + else + throw new ParseException(); + } + + m_params.add(command, param); + //System.out.println(command + " : " + param); + return Action.Proceed; + } + + public int listen() + { + BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); + boolean isListening = true; + // Main loop + while (isListening) + { + String inData=""; + try + { + // Read from the pipe one line at a time + inData = buffer.readLine(); + if (inData != null) + { + if(parseLine(inData) == Action.Launch) + { + isListening = false; + } + } + } + catch (IOException e) + { + e.printStackTrace(); + return 1; + } + catch (ParseException e) + { + e.printStackTrace(); + return 1; + } + } + if(m_launcher != null) + { + return m_launcher.launch(m_params); + } + System.err.println("No valid launcher implementation specified."); + return 1; + } + + private ParamBucket m_params = new ParamBucket(); + private org.multimc.Launcher m_launcher; +} diff --git a/depends/launcher/org/multimc/IconLoader.java b/depends/launcher/org/multimc/IconLoader.java new file mode 100644 index 00000000..f1638f3a --- /dev/null +++ b/depends/launcher/org/multimc/IconLoader.java @@ -0,0 +1,132 @@ +package org.multimc; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; + +/***************************************************************************** + * A convenience class for loading icons from images. + * + * Icons loaded from this class are formatted to fit within the required + * dimension (16x16, 32x32, or 128x128). If the source image is larger than the + * target dimension, it is shrunk down to the minimum size that will fit. If it + * is smaller, then it is only scaled up if the new scale can be a per-pixel + * linear scale (i.e., x2, x3, x4, etc). In both cases, the image's width/height + * ratio is kept the same as the source image. + * + * @author Chris Molini + *****************************************************************************/ +public class IconLoader +{ + /************************************************************************* + * Loads an icon in ByteBuffer form. + * + * @param filepath + * The location of the Image to use as an icon. + * + * @return An array of ByteBuffers containing the pixel data for the icon in + * various sizes (as recommended by the OS). + *************************************************************************/ + public static ByteBuffer[] load(String filepath) + { + BufferedImage image; + try { + image = ImageIO.read ( new File( filepath ) ); + } catch ( IOException e ) { + e.printStackTrace(); + return new ByteBuffer[0]; + } + ByteBuffer[] buffers; + buffers = new ByteBuffer[1]; + buffers[0] = loadInstance(image, 128); + return buffers; + } + + /************************************************************************* + * Copies the supplied image into a square icon at the indicated size. + * + * @param image + * The image to place onto the icon. + * @param dimension + * The desired size of the icon. + * + * @return A ByteBuffer of pixel data at the indicated size. + *************************************************************************/ + private static ByteBuffer loadInstance(BufferedImage image, int dimension) + { + BufferedImage scaledIcon = new BufferedImage(dimension, dimension, + BufferedImage.TYPE_INT_ARGB_PRE); + Graphics2D g = scaledIcon.createGraphics(); + double ratio = getIconRatio(image, scaledIcon); + double width = image.getWidth() * ratio; + double height = image.getHeight() * ratio; + g.drawImage(image, (int) ((scaledIcon.getWidth() - width) / 2), + (int) ((scaledIcon.getHeight() - height) / 2), (int) (width), + (int) (height), null); + g.dispose(); + + return convertToByteBuffer(scaledIcon); + } + + /************************************************************************* + * Gets the width/height ratio of the icon. This is meant to simplify + * scaling the icon to a new dimension. + * + * @param src + * The base image that will be placed onto the icon. + * @param icon + * The icon that will have the image placed on it. + * + * @return The amount to scale the source image to fit it onto the icon + * appropriately. + *************************************************************************/ + private static double getIconRatio(BufferedImage src, BufferedImage icon) + { + double ratio = 1; + if (src.getWidth() > icon.getWidth()) + ratio = (double) (icon.getWidth()) / src.getWidth(); + else + ratio = (int) (icon.getWidth() / src.getWidth()); + if (src.getHeight() > icon.getHeight()) + { + double r2 = (double) (icon.getHeight()) / src.getHeight(); + if (r2 < ratio) + ratio = r2; + } + else + { + double r2 = (int) (icon.getHeight() / src.getHeight()); + if (r2 < ratio) + ratio = r2; + } + return ratio; + } + + /************************************************************************* + * Converts a BufferedImage into a ByteBuffer of pixel data. + * + * @param image + * The image to convert. + * + * @return A ByteBuffer that contains the pixel data of the supplied image. + *************************************************************************/ + public static ByteBuffer convertToByteBuffer(BufferedImage image) + { + byte[] buffer = new byte[image.getWidth() * image.getHeight() * 4]; + int counter = 0; + for (int i = 0; i < image.getHeight(); i++) + for (int j = 0; j < image.getWidth(); j++) + { + int colorSpace = image.getRGB(j, i); + buffer[counter + 0] = (byte) ((colorSpace << 8) >> 24); + buffer[counter + 1] = (byte) ((colorSpace << 16) >> 24); + buffer[counter + 2] = (byte) ((colorSpace << 24) >> 24); + buffer[counter + 3] = (byte) (colorSpace >> 24); + counter += 4; + } + return ByteBuffer.wrap(buffer); + } +} \ No newline at end of file diff --git a/depends/launcher/org/multimc/Launcher.java b/depends/launcher/org/multimc/Launcher.java new file mode 100644 index 00000000..1aa2b21f --- /dev/null +++ b/depends/launcher/org/multimc/Launcher.java @@ -0,0 +1,22 @@ +/* + * Copyright 2012-2014 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.multimc; + +public interface Launcher +{ + abstract int launch(ParamBucket params); +} diff --git a/depends/launcher/org/multimc/NotFoundException.java b/depends/launcher/org/multimc/NotFoundException.java new file mode 100644 index 00000000..fe154a2f --- /dev/null +++ b/depends/launcher/org/multimc/NotFoundException.java @@ -0,0 +1,21 @@ +/* + * Copyright 2012-2014 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.multimc; + +public class NotFoundException extends Exception +{ +} diff --git a/depends/launcher/org/multimc/ParamBucket.java b/depends/launcher/org/multimc/ParamBucket.java new file mode 100644 index 00000000..2e197d9f --- /dev/null +++ b/depends/launcher/org/multimc/ParamBucket.java @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2014 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.multimc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ParamBucket +{ + public void add(String key, String value) + { + List coll = null; + if(!m_params.containsKey(key)) + { + coll = new ArrayList(); + m_params.put(key, coll); + } + else + { + coll = m_params.get(key); + } + coll.add(value); + } + + public List all(String key) throws NotFoundException + { + if(!m_params.containsKey(key)) + throw new NotFoundException(); + return m_params.get(key); + } + + public List allSafe(String key, List def) + { + if(!m_params.containsKey(key) || m_params.get(key).size() < 1) + { + return def; + } + return m_params.get(key); + } + + public List allSafe(String key) + { + return allSafe(key, new ArrayList()); + } + + public String first(String key) throws NotFoundException + { + List list = all(key); + if(list.size() < 1) + { + throw new NotFoundException(); + } + return list.get(0); + } + + public String firstSafe(String key, String def) + { + if(!m_params.containsKey(key) || m_params.get(key).size() < 1) + { + return def; + } + return m_params.get(key).get(0); + } + + public String firstSafe(String key) + { + return firstSafe(key, ""); + } + + private HashMap> m_params = new HashMap>(); +} diff --git a/depends/launcher/org/multimc/ParseException.java b/depends/launcher/org/multimc/ParseException.java new file mode 100644 index 00000000..d9e8e53e --- /dev/null +++ b/depends/launcher/org/multimc/ParseException.java @@ -0,0 +1,22 @@ +/* + * Copyright 2012-2014 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.multimc; + +public class ParseException extends java.lang.Exception +{ + +} diff --git a/depends/launcher/org/multimc/Utils.java b/depends/launcher/org/multimc/Utils.java new file mode 100644 index 00000000..ba90c07f --- /dev/null +++ b/depends/launcher/org/multimc/Utils.java @@ -0,0 +1,125 @@ +/* + * Copyright 2012-2014 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.multimc; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.List; + +public class Utils +{ + /** + * Adds the specified library to the classpath + * + * @param s the path to add + * @throws Exception + */ + public static void addToClassPath(String s) throws Exception + { + File f = new File(s); + URL u = f.toURI().toURL(); + URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); + Class urlClass = URLClassLoader.class; + Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class}); + method.setAccessible(true); + method.invoke(urlClassLoader, new Object[]{u}); + } + + /** + * Adds many libraries to the classpath + * + * @param jars the paths to add + */ + public static boolean addToClassPath(List jars) + { + boolean pure = true; + // initialize the class path + for (String jar : jars) + { + try + { + Utils.addToClassPath(jar); + } catch (Exception e) + { + System.err.println("Unable to load: " + jar); + e.printStackTrace(System.err); + pure = false; + } + } + return pure; + } + + /** + * Adds the specified path to the java library path + * + * @param pathToAdd the path to add + * @throws Exception + */ + @Deprecated public static void addLibraryPath(String pathToAdd) throws Exception + { + final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths"); + usrPathsField.setAccessible(true); + + //get array of paths + final String[] paths = (String[]) usrPathsField.get(null); + + //check if the path to add is already present + for (String path : paths) + { + if (path.equals(pathToAdd)) + { + return; + } + } + + //add the new path + final String[] newPaths = Arrays.copyOf(paths, paths.length + 1); + newPaths[newPaths.length - 1] = pathToAdd; + usrPathsField.set(null, newPaths); + } + + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * + * @param mc the class to scan + */ + public static Field getMCPathField(Class mc) + { + Field[] fields = mc.getDeclaredFields(); + + for (Field f : fields) + { + if (f.getType() != File.class) + { + // Has to be File + continue; + } + if (f.getModifiers() != (Modifier.PRIVATE + Modifier.STATIC)) + { + // And Private Static. + continue; + } + return f; + } + return null; + } +} diff --git a/depends/launcher/MCFrame.java b/depends/launcher/org/multimc/legacy/LegacyFrame.java similarity index 70% rename from depends/launcher/MCFrame.java rename to depends/launcher/org/multimc/legacy/LegacyFrame.java index ce4564c9..c3c0cafc 100644 --- a/depends/launcher/MCFrame.java +++ b/depends/launcher/org/multimc/legacy/LegacyFrame.java @@ -1,40 +1,39 @@ -// -// Copyright 2012 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.multimc.legacy;/* + * Copyright 2012-2014 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. + */ import net.minecraft.Launcher; + +import javax.imageio.ImageIO; import java.applet.Applet; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Toolkit; +import java.awt.*; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.io.IOException; -import java.io.File; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -public class MCFrame extends Frame implements WindowListener +public class LegacyFrame extends Frame implements WindowListener { private Launcher appletWrap = null; - public MCFrame ( String title ) + public LegacyFrame(String title) { super ( title ); - BufferedImage image = null; + BufferedImage image; try { image = ImageIO.read ( new File ( "icon.png" ) ); setIconImage ( image ); @@ -47,14 +46,14 @@ public class MCFrame extends Frame implements WindowListener public void start ( Applet mcApplet, String user, String session, Dimension winSize, boolean maximize ) { try { - appletWrap = new Launcher ( mcApplet, new URL ( "http://www.minecraft.net/game" ) ); + appletWrap = new Launcher( mcApplet, new URL ( "http://www.minecraft.net/game" ) ); } catch ( MalformedURLException ignored ) {} - appletWrap.setParameter ( "username", user ); appletWrap.setParameter ( "sessionid", session ); appletWrap.setParameter ( "stand-alone", "true" ); // Show the quit button. - mcApplet.setStub ( appletWrap ); - + appletWrap.setParameter ( "demo", "false" ); + appletWrap.setParameter("fullscreen", "false"); + mcApplet.setStub(appletWrap); this.add ( appletWrap ); appletWrap.setPreferredSize ( winSize ); this.pack(); @@ -63,7 +62,6 @@ public class MCFrame extends Frame implements WindowListener if ( maximize ) { this.setExtendedState ( MAXIMIZED_BOTH ); } - validate(); appletWrap.init(); appletWrap.start(); diff --git a/depends/launcher/org/multimc/legacy/LegacyLauncher.java b/depends/launcher/org/multimc/legacy/LegacyLauncher.java new file mode 100644 index 00000000..6a0a3014 --- /dev/null +++ b/depends/launcher/org/multimc/legacy/LegacyLauncher.java @@ -0,0 +1,178 @@ +package org.multimc.legacy;/* + * Copyright 2012-2014 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. + */ + +import org.multimc.Launcher; +import org.multimc.NotFoundException; +import org.multimc.ParamBucket; +import org.multimc.Utils; + +import java.applet.Applet; +import java.awt.*; +import java.io.File; +import java.lang.reflect.Field; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +public class LegacyLauncher implements Launcher +{ + @Override + public int launch(ParamBucket params) + { + String userName, sessionId, windowTitle, windowParams, lwjgl; + String mainClass = "net.minecraft.client.Minecraft"; + try + { + userName = params.first("userName"); + sessionId = params.first("sessionId"); + windowTitle = params.first("windowTitle"); + windowParams = params.first("windowParams"); + lwjgl = params.first("lwjgl"); + } catch (NotFoundException e) + { + System.err.println("Not enough arguments."); + return -1; + } + + String cwd = System.getProperty("user.dir"); + Dimension winSize = new Dimension(854, 480); + boolean maximize = false; + + String[] dimStrings = windowParams.split("x"); + + if (windowParams.equalsIgnoreCase("max")) + { + maximize = true; + } + else if (dimStrings.length == 2) + { + try + { + winSize = new Dimension(Integer.parseInt(dimStrings[0]), Integer.parseInt(dimStrings[1])); + } catch (NumberFormatException ignored) {} + } + + File binDir = new File(cwd, "bin"); + File lwjglDir; + if (lwjgl.equalsIgnoreCase("Mojang")) + { + lwjglDir = binDir; + } + else + { + lwjglDir = new File(lwjgl); + } + + URL[] classpath; + { + try + { + classpath = new URL[] + { + new File(binDir, "minecraft.jar").toURI().toURL(), + new File(lwjglDir, "lwjgl.jar").toURI().toURL(), + new File(lwjglDir, "lwjgl_util.jar").toURI().toURL(), + new File(lwjglDir, "jinput.jar").toURI().toURL(), + }; + } catch (MalformedURLException e) + { + System.err.println("Class path entry is badly formed:"); + e.printStackTrace(System.err); + return -1; + } + } + + String nativesDir = new File(lwjglDir, "natives").toString(); + + System.setProperty("org.lwjgl.librarypath", nativesDir); + System.setProperty("net.java.games.input.librarypath", nativesDir); + + // print the pretty things + { + System.out.println("Main Class:"); + System.out.println(mainClass); + System.out.println(); + + System.out.println("Class Path:"); + for (URL s : classpath) + { + System.out.println(s); + } + System.out.println(); + + System.out.println("Native Path:"); + System.out.println(nativesDir); + System.out.println(); + } + + URLClassLoader cl = new URLClassLoader(classpath, LegacyLauncher.class.getClassLoader()); + + // Get the Minecraft Class and set the base folder + Class mc; + try + { + mc = cl.loadClass(mainClass); + + Field f = Utils.getMCPathField(mc); + + if (f == null) + { + System.err.println("Could not find Minecraft path field. Launch failed."); + return -1; + } + + f.setAccessible(true); + f.set(null, new File(cwd)); + } catch (Exception e) + { + System.err.println("Could not set base folder. Failed to find/access Minecraft main class:"); + e.printStackTrace(System.err); + return -1; + } + + System.setProperty("minecraft.applet.TargetDirectory", cwd); + + String[] mcArgs = new String[2]; + mcArgs[0] = userName; + mcArgs[1] = sessionId; + + System.out.println("Launching with applet wrapper..."); + try + { + Class MCAppletClass = cl.loadClass("net.minecraft.client.MinecraftApplet"); + Applet mcappl = (Applet) MCAppletClass.newInstance(); + LegacyFrame mcWindow = new LegacyFrame(windowTitle); + mcWindow.start(mcappl, userName, sessionId, winSize, maximize); + } catch (Exception e) + { + System.err.println("Applet wrapper failed:"); + e.printStackTrace(System.err); + System.err.println(); + System.out.println("Falling back to compatibility mode."); + try + { + mc.getMethod("main", String[].class).invoke(null, (Object) mcArgs); + } catch (Exception e1) + { + System.err.println("Failed to invoke the Minecraft main class:"); + e1.printStackTrace(System.err); + return -1; + } + } + + return 0; + } +} diff --git a/depends/launcher/org/multimc/onesix/OneSixLauncher.java b/depends/launcher/org/multimc/onesix/OneSixLauncher.java new file mode 100644 index 00000000..2232eeba --- /dev/null +++ b/depends/launcher/org/multimc/onesix/OneSixLauncher.java @@ -0,0 +1,196 @@ +/* Copyright 2012-2014 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.multimc.onesix; + +import org.multimc.*; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; + +public class OneSixLauncher implements Launcher +{ + @Override + public int launch(ParamBucket params) + { + // get and process the launch script params + List libraries; + List mcparams; + List mods; + String mainClass; + String natives; + final String windowTitle; + String windowParams; + try + { + libraries = params.all("cp"); + mcparams = params.all("param"); + mainClass = params.first("mainClass"); + mods = params.allSafe("mods", new ArrayList()); + natives = params.first("natives"); + windowTitle = params.first("windowTitle"); + // windowParams = params.first("windowParams"); + } catch (NotFoundException e) + { + System.err.println("Not enough arguments."); + e.printStackTrace(System.err); + return -1; + } + + List allJars = new ArrayList(); + allJars.addAll(mods); + allJars.addAll(libraries); + + if(!Utils.addToClassPath(allJars)) + { + System.err.println("Halting launch due to previous errors."); + return -1; + } + + final ClassLoader cl = ClassLoader.getSystemClassLoader(); + + // print the pretty things + { + System.out.println("Main Class:"); + System.out.println(mainClass); + System.out.println(); + + System.out.println("Libraries:"); + for (String s : libraries) + { + System.out.println(s); + } + System.out.println(); + + if(mods.size() > 0) + { + System.out.println("Class Path Mods:"); + for (String s : mods) + { + System.out.println(s); + } + System.out.println(); + } + + System.out.println("Params:"); + System.out.println(mcparams.toString()); + System.out.println(); + } + + // set up the natives path(s). + System.setProperty("java.library.path", natives ); + Field fieldSysPath; + try + { + fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); + fieldSysPath.setAccessible( true ); + fieldSysPath.set( null, null ); + } catch (Exception e) + { + System.err.println("Failed to set the native library path:"); + e.printStackTrace(System.err); + return -1; + } + + // Get the Minecraft Class. + Class mc; + try + { + mc = cl.loadClass(mainClass); + } catch (ClassNotFoundException e) + { + System.err.println("Failed to find Minecraft main class:"); + e.printStackTrace(System.err); + return -1; + } + + // get the main method. + Method meth; + try + { + meth = mc.getMethod("main", String[].class); + } catch (NoSuchMethodException e) + { + System.err.println("Failed to acquire the main method:"); + e.printStackTrace(System.err); + return -1; + } + + // FIXME: works only on linux, we need a better solution +/* + final java.nio.ByteBuffer[] icons = IconLoader.load("icon.png"); + new Thread() { + public void run() { + ClassLoader cl = ClassLoader.getSystemClassLoader(); + try + { + Class Display; + Method isCreated; + Method setTitle; + Method setIcon; + + Display = cl.loadClass("org.lwjgl.opengl.Display"); + isCreated = Display.getMethod("isCreated"); + setTitle = Display.getMethod("setTitle", String.class); + setIcon = Display.getMethod("setIcon", java.nio.ByteBuffer[].class); + + // set the window title? Maybe? + while(!(Boolean) isCreated.invoke(null)) + { + try + { + Thread.sleep(150); + } catch (InterruptedException ignored) {} + } + // Give it a bit more time ;) + Thread.sleep(150); + // set the title + setTitle.invoke(null,windowTitle); + // only set icon when there's actually something to set... + if(icons.length > 0) + { + setIcon.invoke(null,(Object)icons); + } + } + catch (Exception e) + { + System.err.println("Couldn't set window icon or title."); + e.printStackTrace(System.err); + } + } + } + .start(); +*/ + // start Minecraft + String[] paramsArray = mcparams.toArray(new String[mcparams.size()]); // init params accordingly + try + { + meth.invoke(null, (Object) paramsArray); // static method doesn't have an instance + } catch (Exception e) + { + System.err.println("Failed to start Minecraft:"); + e.printStackTrace(System.err); + return -1; + } + return 0; + } +} diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index 84a141ce..54a74bde 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -166,6 +166,10 @@ void ConsoleWindow::on_closeButton_clicked() void ConsoleWindow::setMayClose(bool mayclose) { + if(mayclose) + ui->closeButton->setText(tr("Close")); + else + ui->closeButton->setText(tr("Hide")); m_mayclose = mayclose; } diff --git a/gui/dialogs/AboutDialog.ui b/gui/dialogs/AboutDialog.ui index b0dafb06..64a355d3 100644 --- a/gui/dialogs/AboutDialog.ui +++ b/gui/dialogs/AboutDialog.ui @@ -104,7 +104,7 @@ 0 0 689 - 331 + 311 @@ -229,7 +229,7 @@ 0 0 689 - 331 + 311 @@ -245,7 +245,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">MultiMC</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">Andrew Okin &lt;</span><a href="mailto:forkk@forkk.net"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;">forkk@forkk.net</span></a><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">&gt;</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">Petr Mrázek &lt;</span><a href="mailto:peterix@gmail.com"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;">peterix@gmail.com</span></a><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">&gt;</span></p> @@ -282,7 +282,7 @@ p, li { white-space: pre-wrap; } 0 0 689 - 331 + 311 @@ -309,7 +309,7 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'DejaVu Sans Mono'; font-size:9pt; font-weight:400; font-style:normal;"> +</style></head><body style=" font-family:'DejaVu Sans Mono'; font-size:11pt; font-weight:400; font-style:normal;"> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">MultiMC</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2012-2014 MultiMC Contributors</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></p> @@ -430,7 +430,36 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> *</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * This file has been put into the public domain.</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * You can do whatever you want with this file.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> */</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:18pt; font-weight:600;">Java IconLoader class</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Copyright (c) 2011, Chris Molini</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">All rights reserved.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Redistribution and use in source and binary forms, with or without</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">modification, are permitted provided that the following conditions are met:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Redistributions of source code must retain the above copyright</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> notice, this list of conditions and the following disclaimer.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Redistributions in binary form must reproduce the above copyright</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> notice, this list of conditions and the following disclaimer in the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> documentation and/or other materials provided with the distribution.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> * Neither the name of the &lt;organization&gt; nor the</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> names of its contributors may be used to endorse or promote products</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;"> derived from this software without specific prior written permission.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot; AND</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">DISCLAIMED. IN NO EVENT SHALL &lt;COPYRIGHT HOLDER&gt; BE LIABLE FOR ANY</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> @@ -442,7 +471,7 @@ p, li { white-space: pre-wrap; } 0 0 689 - 331 + 311 @@ -455,12 +484,12 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">We keep MultiMC open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Part of the reason for using the Apache license is we don't want people using the &quot;MultiMC&quot; name when redistributing the project. This means people must take the time to go through the source code and remove all references to &quot;MultiMC&quot;, including but not limited to the project icon and the title of windows, (no *MultiMC-fork* in the title).</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">The Apache license covers reasonable use for the name - a mention of the project's origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork </span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:600;">without</span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;"> implying that you have our blessing.</span></p></body></html> +</style></head><body style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">We keep MultiMC open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Part of the reason for using the Apache license is we don't want people using the &quot;MultiMC&quot; name when redistributing the project. This means people must take the time to go through the source code and remove all references to &quot;MultiMC&quot;, including but not limited to the project icon and the title of windows, (no *MultiMC-fork* in the title).</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Apache license covers reasonable use for the name - a mention of the project's origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork <span style=" font-weight:600;">without</span> implying that you have our blessing.</p></body></html> Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index ac66a8d5..4fc6b9dc 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -26,6 +26,7 @@ #include "overridesetting.h" #include "pathutils.h" +#include #include "lists/MinecraftVersionList.h" #include "logic/icons/IconList.h" @@ -248,8 +249,14 @@ void BaseInstance::setName(QString val) d->m_settings->set("name", val); emit propertiesChanged(this); } + QString BaseInstance::name() const { I_D(BaseInstance); return d->m_settings->get("name").toString(); } + +QStringList BaseInstance::extraArguments() const +{ + return Util::Commandline::splitArgs(settings().get("JvmArgs").toString()); +} diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index 01d6dc7d..c059d058 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -81,6 +81,8 @@ public: void setGroupInitial(QString val); void setGroupPost(QString val); + QStringList extraArguments() const; + virtual QString intendedVersionId() const = 0; virtual bool setIntendedVersionId(QString version) = 0; diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index 5ab19fc9..4b650e37 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -47,7 +47,7 @@ std::shared_ptr LegacyInstance::doUpdate(bool only_prepare) // make sure the jar mods list is initialized by asking for it. auto list = jarModList(); // create an update task - return std::shared_ptr (new LegacyUpdate(this, only_prepare , this)); + return std::shared_ptr(new LegacyUpdate(this, only_prepare, this)); } MinecraftProcess *LegacyInstance::prepareForLaunch(MojangAccountPtr account) @@ -58,58 +58,27 @@ MinecraftProcess *LegacyInstance::prepareForLaunch(MojangAccountPtr account) auto pixmap = icon.pixmap(128, 128); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); - // extract the legacy launcher - QString launcherJar = PathCombine(MMC->bin(), "jars", "MultiMCLauncher.jar"); - - // set the process arguments + // create the launch script + QString launchScript; { - QStringList args; - // window size - QString windowSize; + QString windowParams; if (settings().get("LaunchMaximized").toBool()) - windowSize = "max"; + windowParams = "max"; else - windowSize = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg( + windowParams = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg( settings().get("MinecraftWinHeight").toInt()); - // window title - QString windowTitle; - windowTitle.append("MultiMC: ").append(name()); - - // Java arguments - args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString())); - -#ifdef OSX - // OSX dock icon and name - args << "-Xdock:icon=icon.png"; - args << QString("-Xdock:name=\"%1\"").arg(windowTitle); -#endif - QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion()) .absolutePath(); - - // launcher arguments - args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt()); - args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt()); - args << QString("-XX:PermSize=%1m").arg(settings().get("PermGen").toInt()); -/** -* HACK: Stupid hack for Intel drivers. -* See: https://mojang.atlassian.net/browse/MCL-767 -*/ -#ifdef Q_OS_WIN32 - args << QString("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_" - "minecraft.exe.heapdump"); -#endif - - args << "-jar" << launcherJar; - args << account->currentProfile()->name; - args << account->sessionId(); - args << windowTitle; - args << windowSize; - args << lwjgl; - proc->setArguments(args); + launchScript += "userName " + account->currentProfile()->name + "\n"; + launchScript += "sessionId " + account->sessionId() + "\n"; + launchScript += "windowTitle MultiMC: " + name() + "\n"; + launchScript += "windowParams " + windowParams + "\n"; + launchScript += "lwjgl " + lwjgl + "\n"; + launchScript += "launch legacy\n"; } + proc->setLaunchScript(launchScript); // set the process work path proc->setWorkdir(minecraftRoot()); diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 209929b7..153b462c 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "MultiMC.h" #include "MinecraftProcess.h" #include #include #include -//#include #include #include "BaseInstance.h" @@ -59,11 +59,6 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst) connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut())); } -void MinecraftProcess::setArguments(QStringList args) -{ - m_args = args; -} - void MinecraftProcess::setWorkdir(QString path) { QDir mcDir(path); @@ -189,13 +184,43 @@ void MinecraftProcess::launch() } m_instance->setLastLaunch(); + auto &settings = m_instance->settings(); + + //////////// java arguments //////////// + QStringList args; + { + // custom args go first. we want to override them if we have our own here. + args.append(m_instance->extraArguments()); + + // OSX dock icon and name + #ifdef OSX + args << "-Xdock:icon=icon.png"; + args << QString("-Xdock:name=\"%1\"").arg(windowTitle); + #endif + + // HACK: Stupid hack for Intel drivers. See: https://mojang.atlassian.net/browse/MCL-767 + #ifdef Q_OS_WIN32 + args << QString("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_" + "minecraft.exe.heapdump"); + #endif + + args << QString("-Xms%1m").arg(settings.get("MinMemAlloc").toInt()); + args << QString("-Xmx%1m").arg(settings.get("MaxMemAlloc").toInt()); + args << QString("-XX:PermSize=%1m").arg(settings.get("PermGen").toInt()); + if(!m_nativeFolder.isEmpty()) + args << QString("-Djava.library.path=%1").arg(m_nativeFolder); + args << "-jar" << PathCombine(MMC->bin(), "jars", "NewLaunch.jar"); + } - emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); QString JavaPath = m_instance->settings().get("JavaPath").toString(); - emit log(QString("Java path: '%1'").arg(JavaPath)); - QString allArgs = m_args.join("' '"); - emit log(QString("Arguments: '%1'").arg(censorPrivateInfo(allArgs))); - start(JavaPath, m_args); + emit log("MultiMC version: " + MMC->version().toString() + "\n\n"); + emit log("Minecraft folder is:\n" + workingDirectory() + "\n\n"); + emit log("Java path is:\n" + JavaPath + "\n\n"); + QString allArgs = args.join(", "); + emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n"); + + // instantiate the launcher part + start(JavaPath, args); if (!waitForStarted()) { //: Error message displayed if instace can't start @@ -204,11 +229,13 @@ void MinecraftProcess::launch() emit launch_failed(m_instance); return; } + // send the launch script to the launcher part + QByteArray bytes = launchScript.toUtf8(); + writeData(bytes.constData(), bytes.length()); } MessageLevel::Enum MinecraftProcess::getLevel(const QString &line, MessageLevel::Enum level) { - if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]")) level = MessageLevel::Message; diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h index bd0151cc..5d1a2b71 100644 --- a/logic/MinecraftProcess.h +++ b/logic/MinecraftProcess.h @@ -18,7 +18,7 @@ #pragma once #include - +#include #include "BaseInstance.h" /** @@ -65,7 +65,15 @@ public: void setWorkdir(QString path); - void setArguments(QStringList args); + void setLaunchScript(QString script) + { + launchScript = script; + } + + void setNativeFolder(QString natives) + { + m_nativeFolder = natives; + } void killMinecraft(); @@ -104,12 +112,13 @@ signals: protected: BaseInstance *m_instance = nullptr; - QStringList m_args; QString m_err_leftover; QString m_out_leftover; QProcess m_prepostlaunchprocess; bool killed = false; MojangAccountPtr m_account; + QString launchScript; + QString m_nativeFolder; protected slots: diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index 2392c683..a12cf047 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -13,12 +13,14 @@ * limitations under the License. */ +#include "MultiMC.h" #include "OneSixInstance.h" #include "OneSixInstance_p.h" #include "OneSixUpdate.h" #include "MinecraftProcess.h" #include "OneSixVersion.h" #include "JavaChecker.h" +#include "logic/icons/IconList.h" #include #include @@ -27,6 +29,7 @@ #include "gui/dialogs/OneSixModEditDialog.h" #include "logger/QsLog.h" #include "logic/assets/AssetsUtils.h" +#include OneSixInstance::OneSixInstance(const QString &rootDir, SettingsObject *setting_obj, QObject *parent) @@ -40,7 +43,7 @@ OneSixInstance::OneSixInstance(const QString &rootDir, SettingsObject *setting_o std::shared_ptr OneSixInstance::doUpdate(bool only_prepare) { - return std::shared_ptr (new OneSixUpdate(this, only_prepare)); + return std::shared_ptr(new OneSixUpdate(this, only_prepare)); } QString replaceTokensIn(QString text, QMap with) @@ -78,24 +81,25 @@ QDir OneSixInstance::reconstructAssets(std::shared_ptr version) QFile indexFile(indexPath); QDir virtualRoot(PathCombine(virtualDir.path(), version->assets)); - if(!indexFile.exists()) + if (!indexFile.exists()) { QLOG_ERROR() << "No assets index file" << indexPath << "; can't reconstruct assets"; return virtualRoot; } - QLOG_DEBUG() << "reconstructAssets" << assetsDir.path() << indexDir.path() << objectDir.path() << virtualDir.path() << virtualRoot.path(); + QLOG_DEBUG() << "reconstructAssets" << assetsDir.path() << indexDir.path() + << objectDir.path() << virtualDir.path() << virtualRoot.path(); AssetsIndex index; bool loadAssetsIndex = AssetsUtils::loadAssetsIndexJson(indexPath, &index); - if(loadAssetsIndex) + if (loadAssetsIndex) { - if(index.isVirtual) + if (index.isVirtual) { QLOG_INFO() << "Reconstructing virtual assets folder at" << virtualRoot.path(); - for(QString map : index.objects.keys()) + for (QString map : index.objects.keys()) { AssetObject asset_object = index.objects.value(map); QString target_path = PathCombine(virtualRoot.path(), map); @@ -103,17 +107,20 @@ QDir OneSixInstance::reconstructAssets(std::shared_ptr version) QString tlk = asset_object.hash.left(2); - QString original_path = PathCombine(PathCombine(objectDir.path(), tlk), asset_object.hash); + QString original_path = + PathCombine(PathCombine(objectDir.path(), tlk), asset_object.hash); QFile original(original_path); - if(!target.exists()) + if (!target.exists()) { QFileInfo info(target_path); QDir target_dir = info.dir(); - //QLOG_DEBUG() << target_dir; - if(!target_dir.exists()) QDir("").mkpath(target_dir.path()); + // QLOG_DEBUG() << target_dir; + if (!target_dir.exists()) + QDir("").mkpath(target_dir.path()); bool couldCopy = original.copy(target_path); - QLOG_DEBUG() << " Copying" << original_path << "to" << target_path << QString::number(couldCopy);// << original.errorString(); + QLOG_DEBUG() << " Copying" << original_path << "to" << target_path + << QString::number(couldCopy); // << original.errorString(); } } @@ -155,7 +162,7 @@ QStringList OneSixInstance::processMinecraftArgs(MojangAccountPtr account) auto user = account->user(); QJsonObject userAttrs; - for(auto key: user.properties.keys()) + for (auto key : user.properties.keys()) { auto array = QJsonArray::fromStringList(user.properties.values(key)); userAttrs.insert(key, array); @@ -180,71 +187,56 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(MojangAccountPtr account) { I_D(OneSixInstance); - QString natives_dir_raw = PathCombine(instanceRoot(), "natives/"); + QIcon icon = MMC->icons()->getIcon(iconKey()); + auto pixmap = icon.pixmap(128, 128); + pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG"); auto version = d->version; if (!version) return nullptr; - - QStringList args; - args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString())); - args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt()); - args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt()); - args << QString("-XX:PermSize=%1m").arg(settings().get("PermGen").toInt()); - -/** - * HACK: Stupid hack for Intel drivers. - * See: https://mojang.atlassian.net/browse/MCL-767 - */ -#ifdef Q_OS_WIN32 - args << QString("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_" - "minecraft.exe.heapdump"); -#endif - - QDir natives_dir(natives_dir_raw); - args << QString("-Djava.library.path=%1").arg(natives_dir.absolutePath()); - QString classPath; + QString launchScript; { auto libs = version->getActiveNormalLibs(); for (auto lib : libs) { QFileInfo fi(QString("libraries/") + lib->storagePath()); - classPath.append(fi.absoluteFilePath()); -#ifdef Q_OS_WIN32 - classPath.append(';'); -#else - classPath.append(':'); -#endif + launchScript += "cp " + fi.absoluteFilePath() + "\n"; } QString targetstr = "versions/" + version->id + "/" + version->id + ".jar"; QFileInfo fi(targetstr); - classPath.append(fi.absoluteFilePath()); + launchScript += "cp " + fi.absoluteFilePath() + "\n"; } - if (classPath.size()) + launchScript += "mainClass " + version->mainClass + "\n"; + + for (auto param : processMinecraftArgs(account)) { - args << "-cp"; - args << classPath; + launchScript += "param " + param + "\n"; } - args << version->mainClass; - args.append(processMinecraftArgs(account)); // Set the width and height for 1.6 instances bool maximize = settings().get("LaunchMaximized").toBool(); if (maximize) { // this is probably a BAD idea - // args << QString("--fullscreen"); + // launchScript += "param --fullscreen\n"; } else { - args << QString("--width") << settings().get("MinecraftWinWidth").toString(); - args << QString("--height") << settings().get("MinecraftWinHeight").toString(); + launchScript += + "param --width\nparam " + settings().get("MinecraftWinWidth").toString() + "\n"; + launchScript += + "param --height\nparam " + settings().get("MinecraftWinHeight").toString() + "\n"; } + QDir natives_dir(PathCombine(instanceRoot(), "natives/")); + launchScript += "windowTitle MultiMC: " + name() + "\n"; + launchScript += "natives " + natives_dir.absolutePath() + "\n"; + launchScript += "launch onesix\n"; // create the process and set its parameters MinecraftProcess *proc = new MinecraftProcess(this); - proc->setArguments(args); proc->setWorkdir(minecraftRoot()); + proc->setLaunchScript(launchScript); + // proc->setNativeFolder(natives_dir.absolutePath()); return proc; } From afd1778fd766011a968074d68241b42b1438fb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 12 Jan 2014 23:38:12 +0100 Subject: [PATCH 25/45] Fix window title problem on OSX. --- logic/BaseInstance.cpp | 5 +++++ logic/BaseInstance.h | 3 +++ logic/LegacyInstance.cpp | 2 +- logic/MinecraftProcess.cpp | 2 +- logic/OneSixInstance.cpp | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index 4fc6b9dc..afe3dd03 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -256,6 +256,11 @@ QString BaseInstance::name() const return d->m_settings->get("name").toString(); } +QString BaseInstance::windowTitle() const +{ + return "MultiMC: " + name(); +} + QStringList BaseInstance::extraArguments() const { return Util::Commandline::splitArgs(settings().get("JvmArgs").toString()); diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index c059d058..353ea58a 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -71,6 +71,9 @@ public: QString name() const; void setName(QString val); + /// Value used for instance window titles + QString windowTitle() const; + QString iconKey() const; void setIconKey(QString val); diff --git a/logic/LegacyInstance.cpp b/logic/LegacyInstance.cpp index 4b650e37..2828bcbf 100644 --- a/logic/LegacyInstance.cpp +++ b/logic/LegacyInstance.cpp @@ -73,7 +73,7 @@ MinecraftProcess *LegacyInstance::prepareForLaunch(MojangAccountPtr account) .absolutePath(); launchScript += "userName " + account->currentProfile()->name + "\n"; launchScript += "sessionId " + account->sessionId() + "\n"; - launchScript += "windowTitle MultiMC: " + name() + "\n"; + launchScript += "windowTitle " + windowTitle() + "\n"; launchScript += "windowParams " + windowParams + "\n"; launchScript += "lwjgl " + lwjgl + "\n"; launchScript += "launch legacy\n"; diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 153b462c..09d60771 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -195,7 +195,7 @@ void MinecraftProcess::launch() // OSX dock icon and name #ifdef OSX args << "-Xdock:icon=icon.png"; - args << QString("-Xdock:name=\"%1\"").arg(windowTitle); + args << QString("-Xdock:name=\"%1\"").arg(m_instance->windowTitle()); #endif // HACK: Stupid hack for Intel drivers. See: https://mojang.atlassian.net/browse/MCL-767 diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index a12cf047..16699a1d 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -228,7 +228,7 @@ MinecraftProcess *OneSixInstance::prepareForLaunch(MojangAccountPtr account) "param --height\nparam " + settings().get("MinecraftWinHeight").toString() + "\n"; } QDir natives_dir(PathCombine(instanceRoot(), "natives/")); - launchScript += "windowTitle MultiMC: " + name() + "\n"; + launchScript += "windowTitle " + windowTitle() + "\n"; launchScript += "natives " + natives_dir.absolutePath() + "\n"; launchScript += "launch onesix\n"; From 4744ea07a892bc7066fbb21d394a2ce5efb0bdd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 13 Jan 2014 02:19:20 +0100 Subject: [PATCH 26/45] Small fix for stale files getting stuck in the cache --- logic/net/CacheDownload.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/logic/net/CacheDownload.cpp b/logic/net/CacheDownload.cpp index 8a8d00f0..0022c361 100644 --- a/logic/net/CacheDownload.cpp +++ b/logic/net/CacheDownload.cpp @@ -58,11 +58,17 @@ void CacheDownload::start() } QLOG_INFO() << "Downloading " << m_url.toString(); QNetworkRequest request(m_url); - if (m_entry->remote_changed_timestamp.size()) - request.setRawHeader(QString("If-Modified-Since").toLatin1(), - m_entry->remote_changed_timestamp.toLatin1()); - if (m_entry->etag.size()) - request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->etag.toLatin1()); + + // check file consistency first. + QFile current(m_target_path); + if(current.exists() && current.size() != 0) + { + if (m_entry->remote_changed_timestamp.size()) + request.setRawHeader(QString("If-Modified-Since").toLatin1(), + m_entry->remote_changed_timestamp.toLatin1()); + if (m_entry->etag.size()) + request.setRawHeader(QString("If-None-Match").toLatin1(), m_entry->etag.toLatin1()); + } request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Cached)"); From 555cbe00ced6097202f148f200811acc6b1eeb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 14 Jan 2014 01:13:35 +0100 Subject: [PATCH 27/45] Do not use the java checker during instance update --- depends/launcher/org/multimc/Utils.java | 31 ++++ .../org/multimc/onesix/OneSixLauncher.java | 17 +- logic/OneSixUpdate.cpp | 150 ++++++++---------- logic/OneSixUpdate.h | 8 - 4 files changed, 112 insertions(+), 94 deletions(-) diff --git a/depends/launcher/org/multimc/Utils.java b/depends/launcher/org/multimc/Utils.java index ba90c07f..c4d55b6e 100644 --- a/depends/launcher/org/multimc/Utils.java +++ b/depends/launcher/org/multimc/Utils.java @@ -27,6 +27,37 @@ import java.util.List; public class Utils { + /** + * Combine two parts of a path. + * @param path1 + * @param path2 + * @return the paths, combined + */ + public static String combine (String path1, String path2) + { + File file1 = new File(path1); + File file2 = new File(file1, path2); + return file2.getPath(); + } + + /** + * Join a list of strings into a string using a separator! + * @param strings the string list to join + * @param separator the glue + * @return the result. + */ + public static String join (List strings, String separator) + { + StringBuilder sb = new StringBuilder(); + String sep = ""; + for(String s: strings) + { + sb.append(sep).append(s); + sep = separator; + } + return sb.toString(); + } + /** * Adds the specified library to the classpath * diff --git a/depends/launcher/org/multimc/onesix/OneSixLauncher.java b/depends/launcher/org/multimc/onesix/OneSixLauncher.java index 2232eeba..f25a3245 100644 --- a/depends/launcher/org/multimc/onesix/OneSixLauncher.java +++ b/depends/launcher/org/multimc/onesix/OneSixLauncher.java @@ -66,7 +66,11 @@ public class OneSixLauncher implements Launcher return -1; } - final ClassLoader cl = ClassLoader.getSystemClassLoader(); + String property = System.getProperty("os.arch"); + List allNativePaths = new ArrayList(); + boolean is_64 = property.equalsIgnoreCase("x86_64") || property.equalsIgnoreCase("amd64"); + allNativePaths.add(natives); + allNativePaths.add(Utils.combine(natives, is_64 ? "64" : "32")); // print the pretty things { @@ -74,6 +78,13 @@ public class OneSixLauncher implements Launcher System.out.println(mainClass); System.out.println(); + System.out.println("Native paths:"); + for (String s : allNativePaths) + { + System.out.println(s); + } + System.out.println(); + System.out.println("Libraries:"); for (String s : libraries) { @@ -96,8 +107,10 @@ public class OneSixLauncher implements Launcher System.out.println(); } + final ClassLoader cl = ClassLoader.getSystemClassLoader(); + // set up the natives path(s). - System.setProperty("java.library.path", natives ); + System.setProperty("java.library.path", Utils.join(allNativePaths, String.valueOf(File.pathSeparatorChar)) ); Field fieldSysPath; try { diff --git a/logic/OneSixUpdate.cpp b/logic/OneSixUpdate.cpp index 4d93477a..5309a7e0 100644 --- a/logic/OneSixUpdate.cpp +++ b/logic/OneSixUpdate.cpp @@ -54,17 +54,7 @@ void OneSixUpdate::executeTask() if (m_only_prepare) { - /* - * FIXME: in offline mode, do not proceed! - */ - setStatus(tr("Testing the Java installation...")); - QString java_path = m_inst->settings().get("JavaPath").toString(); - - checker.reset(new JavaChecker()); - connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this, - SLOT(checkFinishedOffline(JavaCheckResult))); - checker->path = java_path; - checker->performCheck(); + prepareForLaunch(); return; } @@ -83,46 +73,8 @@ void OneSixUpdate::executeTask() } else { - checkJavaOnline(); - } -} - -void OneSixUpdate::checkJavaOnline() -{ - setStatus(tr("Testing the Java installation...")); - QString java_path = m_inst->settings().get("JavaPath").toString(); - - checker.reset(new JavaChecker()); - connect(checker.get(), SIGNAL(checkFinished(JavaCheckResult)), this, - SLOT(checkFinishedOnline(JavaCheckResult))); - checker->path = java_path; - checker->performCheck(); -} - -void OneSixUpdate::checkFinishedOnline(JavaCheckResult result) -{ - if (result.valid) - { - java_is_64bit = result.is_64bit; jarlibStart(); } - else - { - emitFailed("The java binary doesn't work. Check the settings and correct the problem"); - } -} - -void OneSixUpdate::checkFinishedOffline(JavaCheckResult result) -{ - if (result.valid) - { - java_is_64bit = result.is_64bit; - prepareForLaunch(); - } - else - { - emitFailed("The java binary doesn't work. Check the settings and correct the problem"); - } } void OneSixUpdate::versionFileStart() @@ -130,7 +82,8 @@ void OneSixUpdate::versionFileStart() QLOG_INFO() << m_inst->name() << ": getting version file."; setStatus(tr("Getting the version files from Mojang...")); - QString urlstr = "http://" + URLConstants::AWS_DOWNLOAD_VERSIONS + targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json"; + QString urlstr = "http://" + URLConstants::AWS_DOWNLOAD_VERSIONS + + targetVersion->descriptor() + "/" + targetVersion->descriptor() + ".json"; auto job = new NetJob("Version index"); job->addNetAction(ByteArrayDownload::make(QUrl(urlstr))); specificVersionDownloadJob.reset(job); @@ -186,7 +139,7 @@ void OneSixUpdate::versionFileFinished() } inst->reloadFullVersion(); - checkJavaOnline(); + jarlibStart(); } void OneSixUpdate::versionFileFailed() @@ -230,7 +183,7 @@ void OneSixUpdate::assetIndexFinished() { emitFailed("Failed to read the assets index!"); } - + QList dls; for (auto object : index.objects.values()) { @@ -245,17 +198,17 @@ void OneSixUpdate::assetIndexFinished() dls.append(objectDL); } } - if(dls.size()) + if (dls.size()) { setStatus(tr("Getting the assets files from Mojang...")); auto job = new NetJob("Assets for " + inst->name()); - for(auto dl: dls) + for (auto dl : dls) job->addNetAction(dl); jarlibDownloadJob.reset(job); connect(jarlibDownloadJob.get(), SIGNAL(succeeded()), SLOT(assetsFinished())); connect(jarlibDownloadJob.get(), SIGNAL(failed()), SLOT(assetsFailed())); connect(jarlibDownloadJob.get(), SIGNAL(progress(qint64, qint64)), - SIGNAL(progress(qint64, qint64))); + SIGNAL(progress(qint64, qint64))); jarlibDownloadJob->start(); return; } @@ -277,8 +230,6 @@ void OneSixUpdate::assetsFailed() emitFailed("Failed to download assets!"); } - - void OneSixUpdate::jarlibStart() { setStatus(tr("Getting the library files from Mojang...")); @@ -318,24 +269,37 @@ void OneSixUpdate::jarlibStart() { if (lib->hint() == "local") continue; - QString subst = java_is_64bit ? "64" : "32"; - QString storage = lib->storagePath(); - QString dl = lib->downloadUrl(); - storage.replace("${arch}", subst); - dl.replace("${arch}", subst); + QString raw_storage = lib->storagePath(); + QString raw_dl = lib->downloadUrl(); - auto entry = metacache->resolveEntry("libraries", storage); - if (entry->stale) + auto f = [&](QString storage, QString dl) { - if (lib->hint() == "forge-pack-xz") + auto entry = metacache->resolveEntry("libraries", storage); + if (entry->stale) { - ForgeLibs.append(ForgeXzDownload::make(storage, entry)); - } - else - { - jarlibDownloadJob->addNetAction(CacheDownload::make(dl, entry)); + if (lib->hint() == "forge-pack-xz") + { + ForgeLibs.append(ForgeXzDownload::make(storage, entry)); + } + else + { + jarlibDownloadJob->addNetAction(CacheDownload::make(dl, entry)); + } } + }; + if (raw_storage.contains("${arch}")) + { + QString cooked_storage = raw_storage; + QString cooked_dl = raw_dl; + f(cooked_storage.replace("${arch}", "32"), cooked_dl.replace("${arch}", "32")); + cooked_storage = raw_storage; + cooked_dl = raw_dl; + f(cooked_storage.replace("${arch}", "64"), cooked_dl.replace("${arch}", "64")); + } + else + { + f(raw_storage, raw_dl); } } // TODO: think about how to propagate this from the original json file... or IF AT ALL @@ -388,7 +352,9 @@ void OneSixUpdate::prepareForLaunch() auto libs_to_extract = version->getActiveNativeLibs(); // Acquire bag - bool success = ensureFolderPathExists(natives_dir_raw); + bool success = true; + success &= ensureFolderPathExists(natives_dir_raw + "/32"); + success &= ensureFolderPathExists(natives_dir_raw + "/64"); if (!success) { emitFailed("Could not create the native library folder:\n" + natives_dir_raw + @@ -398,22 +364,38 @@ void OneSixUpdate::prepareForLaunch() } // Put swag in the bag - QString subst = java_is_64bit ? "64" : "32"; for (auto lib : libs_to_extract) { - QString storage = lib->storagePath(); - storage.replace("${arch}", subst); - - QString path = "libraries/" + storage; - QLOG_INFO() << "Will extract " << path.toLocal8Bit(); - if (JlCompress::extractWithExceptions(path, natives_dir_raw, lib->extract_excludes) - .isEmpty()) + auto f = [&](QString storage, QString arch = "") { - emitFailed( - "Could not extract the native library:\n" + path + - "\nMake sure MultiMC has appropriate permissions and there is enough space " - "on the storage device."); - return; + QString path = "libraries/" + storage; + QLOG_INFO() << "Will extract " << path.toLocal8Bit(); + if (JlCompress::extractWithExceptions(path, natives_dir_raw + "/" + arch, + lib->extract_excludes).isEmpty()) + { + emitFailed( + "Could not extract the native library:\n" + path + + "\nMake sure MultiMC has appropriate permissions and there is enough space " + "on the storage device."); + return false; + } + }; + QString storage = lib->storagePath(); + if (storage.contains("${arch}")) + { + QString cooked_storage = storage; + cooked_storage.replace("${arch}", "32"); + if (!f(cooked_storage, "32")) + return; + cooked_storage = storage; + cooked_storage.replace("${arch}", "64"); + if (!f(cooked_storage, "64")) + return; + } + else + { + if (!f(storage)) + return; } } diff --git a/logic/OneSixUpdate.h b/logic/OneSixUpdate.h index 00b769c7..bc717a94 100644 --- a/logic/OneSixUpdate.h +++ b/logic/OneSixUpdate.h @@ -21,7 +21,6 @@ #include "logic/net/NetJob.h" #include "logic/tasks/Task.h" -#include "logic/JavaChecker.h" class MinecraftVersion; class BaseInstance; @@ -50,10 +49,6 @@ slots: void assetsFinished(); void assetsFailed(); - void checkJavaOnline(); - void checkFinishedOnline(JavaCheckResult result); - void checkFinishedOffline(JavaCheckResult result); - // extract the appropriate libraries void prepareForLaunch(); @@ -65,7 +60,4 @@ private: std::shared_ptr targetVersion; BaseInstance *m_inst = nullptr; bool m_only_prepare = false; - std::shared_ptr checker; - - bool java_is_64bit = false; }; From d85e820a070ea81ee9b76553c3e35948ef785426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Wed, 15 Jan 2014 22:49:37 +0100 Subject: [PATCH 28/45] Fix FTB. Add support of private packs. Fix instance ID problems related to FTB instances. --- logic/BaseInstance.h | 2 +- logic/LegacyFTBInstance.cpp | 5 +++ logic/LegacyFTBInstance.h | 1 + logic/OneSixFTBInstance.cpp | 5 +++ logic/OneSixFTBInstance.h | 2 + logic/lists/InstanceList.cpp | 73 ++++++++++++++++++++---------------- 6 files changed, 54 insertions(+), 34 deletions(-) diff --git a/logic/BaseInstance.h b/logic/BaseInstance.h index 353ea58a..a861e9b2 100644 --- a/logic/BaseInstance.h +++ b/logic/BaseInstance.h @@ -57,7 +57,7 @@ public: /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to /// be unique. - QString id() const; + virtual QString id() const; /// get the type of this instance QString instanceType() const; diff --git a/logic/LegacyFTBInstance.cpp b/logic/LegacyFTBInstance.cpp index 84d5a900..6c6bd10b 100644 --- a/logic/LegacyFTBInstance.cpp +++ b/logic/LegacyFTBInstance.cpp @@ -14,3 +14,8 @@ bool LegacyFTBInstance::menuActionEnabled(QString action_name) const { return false; } + +QString LegacyFTBInstance::id() const +{ + return "FTB/" + BaseInstance::id(); +} diff --git a/logic/LegacyFTBInstance.h b/logic/LegacyFTBInstance.h index 2ae72797..70f60535 100644 --- a/logic/LegacyFTBInstance.h +++ b/logic/LegacyFTBInstance.h @@ -10,4 +10,5 @@ public: QObject *parent = 0); virtual QString getStatusbarDescription(); virtual bool menuActionEnabled(QString action_name) const; + virtual QString id() const; }; diff --git a/logic/OneSixFTBInstance.cpp b/logic/OneSixFTBInstance.cpp index 4bb5cf42..e50a5b53 100644 --- a/logic/OneSixFTBInstance.cpp +++ b/logic/OneSixFTBInstance.cpp @@ -92,6 +92,11 @@ OneSixFTBInstance::OneSixFTBInstance(const QString &rootDir, SettingsObject *set } } +QString OneSixFTBInstance::id() const +{ + return "FTB/" + BaseInstance::id(); +} + QString OneSixFTBInstance::getStatusbarDescription() { return "OneSix FTB: " + intendedVersionId(); diff --git a/logic/OneSixFTBInstance.h b/logic/OneSixFTBInstance.h index 7600090c..dc028819 100644 --- a/logic/OneSixFTBInstance.h +++ b/logic/OneSixFTBInstance.h @@ -15,6 +15,8 @@ public: virtual std::shared_ptr doUpdate(bool only_prepare) override; + virtual QString id() const; + private: std::shared_ptr m_forge; }; diff --git a/logic/lists/InstanceList.cpp b/logic/lists/InstanceList.cpp index bfd183d9..0d4eab95 100644 --- a/logic/lists/InstanceList.cpp +++ b/logic/lists/InstanceList.cpp @@ -308,45 +308,52 @@ void InstanceList::loadForgeInstances(QMap groupMap) return; } dir.cd("ModPacks"); - auto fpath = dir.absoluteFilePath("modpacks.xml"); - QFile f(fpath); - QLOG_INFO() << "Discovering FTB instances -- " << fpath; - if (!f.open(QFile::ReadOnly)) - return; - - // read the FTB packs XML. - QXmlStreamReader reader(&f); - while (!reader.atEnd()) + auto allFiles = dir.entryList(QDir::Readable | QDir::Files, QDir::Name); + for(auto filename: allFiles) { - switch (reader.readNext()) + if(!filename.endsWith(".xml")) + continue; + auto fpath = dir.absoluteFilePath(filename); + QFile f(fpath); + QLOG_INFO() << "Discovering FTB instances -- " << fpath; + if (!f.open(QFile::ReadOnly)) + continue; + + // read the FTB packs XML. + QXmlStreamReader reader(&f); + while (!reader.atEnd()) { - case QXmlStreamReader::StartElement: - { - if (reader.name() == "modpack") + switch (reader.readNext()) { - QXmlStreamAttributes attrs = reader.attributes(); - FTBRecord record; - record.dir = attrs.value("dir").toString(); - QDir test(dataDir.absoluteFilePath(record.dir)); - if(!test.exists()) - continue; - record.name = attrs.value("name").toString(); - record.logo = attrs.value("logo").toString(); - record.mcVersion = attrs.value("mcVersion").toString(); - record.description = attrs.value("description").toString(); - records.append(record); + case QXmlStreamReader::StartElement: + { + if (reader.name() == "modpack") + { + QXmlStreamAttributes attrs = reader.attributes(); + FTBRecord record; + record.dir = attrs.value("dir").toString(); + QDir test(dataDir.absoluteFilePath(record.dir)); + if(!test.exists()) + continue; + record.name = attrs.value("name").toString(); + record.logo = attrs.value("logo").toString(); + record.mcVersion = attrs.value("mcVersion").toString(); + record.description = attrs.value("description").toString(); + records.append(record); + } + break; + } + case QXmlStreamReader::EndElement: + break; + case QXmlStreamReader::Characters: + break; + default: + break; } - break; - } - case QXmlStreamReader::EndElement: - break; - case QXmlStreamReader::Characters: - break; - default: - break; } + f.close(); } - f.close(); + if(!records.size()) { QLOG_INFO() << "No FTB instances to load."; From 7b96d74d3b197c23324c5a364809a91ea6800e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 16 Jan 2014 23:06:07 +0100 Subject: [PATCH 29/45] Sort forge versions right. Do not spam the multimc log with mc server status stuff. --- logic/BaseVersion.h | 9 +++++++++ logic/lists/ForgeVersionList.cpp | 8 ++------ logic/lists/ForgeVersionList.h | 21 +++++++++++++++++---- logic/status/StatusChecker.cpp | 6 +++--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/logic/BaseVersion.h b/logic/BaseVersion.h index 1864c94c..43f5942a 100644 --- a/logic/BaseVersion.h +++ b/logic/BaseVersion.h @@ -39,6 +39,15 @@ struct BaseVersion * the kind of version this is (Stable, Beta, Snapshot, whatever) */ virtual QString typeString() const = 0; + + virtual bool operator<(BaseVersion &a) + { + return name() < a.name(); + }; + virtual bool operator>(BaseVersion &a) + { + return name() > a.name(); + }; }; typedef std::shared_ptr BaseVersionPtr; diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp index 56eca744..38e033fa 100644 --- a/logic/lists/ForgeVersionList.cpp +++ b/logic/lists/ForgeVersionList.cpp @@ -404,12 +404,8 @@ void ForgeListLoadTask::listDownloaded() { return; } - - qSort(list.begin(), list.end(), [](const BaseVersionPtr & p1, const BaseVersionPtr & p2) - { - // TODO better comparison (takes major/minor/build number into account) - return p1->name() > p2->name(); - }); + std::sort(list.begin(), list.end(), [](const BaseVersionPtr & l, const BaseVersionPtr & r) + { return (*l > *r); }); m_list->updateListData(list); diff --git a/logic/lists/ForgeVersionList.h b/logic/lists/ForgeVersionList.h index 924084ae..b19d3f56 100644 --- a/logic/lists/ForgeVersionList.h +++ b/logic/lists/ForgeVersionList.h @@ -29,25 +29,38 @@ typedef std::shared_ptr ForgeVersionPtr; struct ForgeVersion : public BaseVersion { - virtual QString descriptor() + virtual QString descriptor() override { return filename; } ; - virtual QString name() + virtual QString name() override { return "Forge " + jobbuildver; } ; - virtual QString typeString() const + virtual QString typeString() const override { if (installer_url.isEmpty()) return "Universal"; else return "Installer"; } - ; + virtual bool operator<(BaseVersion &a) override + { + ForgeVersion *pa = dynamic_cast(&a); + if(!pa) + return true; + return m_buildnr < pa->m_buildnr; + } + virtual bool operator>(BaseVersion &a) override + { + ForgeVersion *pa = dynamic_cast(&a); + if(!pa) + return false; + return m_buildnr > pa->m_buildnr; + } int m_buildnr = 0; QString universal_url; QString changelog_url; diff --git a/logic/status/StatusChecker.cpp b/logic/status/StatusChecker.cpp index 7c856d3f..66f800ae 100644 --- a/logic/status/StatusChecker.cpp +++ b/logic/status/StatusChecker.cpp @@ -31,11 +31,11 @@ void StatusChecker::reloadStatus() { if (isLoadingStatus()) { - QLOG_INFO() << "Ignored request to reload status. Currently reloading already."; + // QLOG_INFO() << "Ignored request to reload status. Currently reloading already."; return; } - QLOG_INFO() << "Reloading status."; + // QLOG_INFO() << "Reloading status."; NetJob* job = new NetJob("Status JSON"); job->addNetAction(ByteArrayDownload::make(URLConstants::MOJANG_STATUS_URL)); @@ -85,7 +85,7 @@ void StatusChecker::statusDownloadFinished() if(value.type() == QVariant::Type::String) { m_statusEntries.insert(key, value.toString()); - QLOG_DEBUG() << "Status JSON object: " << key << m_statusEntries[key]; + //QLOG_DEBUG() << "Status JSON object: " << key << m_statusEntries[key]; } else { From 188d0d58865f5e134b5803bda2cd631a61cf2915 Mon Sep 17 00:00:00 2001 From: Orochimarufan Date: Fri, 17 Jan 2014 22:55:10 +0100 Subject: [PATCH 30/45] Improve Console window output. -> Log Pre- and Post-Launch command happenings -> Enable the java part to specify the level TODO: fix logging with mc 1.7's log4j logging infrastructure Signed-off-by: Orochimarufan --- .gitignore | 14 +- MultiMC.cpp | 1 + depends/launcher/org/multimc/EntryPoint.java | 8 +- depends/launcher/org/multimc/Utils.java | 23 ++ .../org/multimc/legacy/LegacyLauncher.java | 28 +-- .../org/multimc/onesix/OneSixLauncher.java | 30 +-- gui/ConsoleWindow.cpp | 3 + logic/BaseInstance.cpp | 1 + logic/MinecraftProcess.cpp | 207 ++++++++++++++---- logic/MinecraftProcess.h | 17 +- 10 files changed, 249 insertions(+), 83 deletions(-) diff --git a/.gitignore b/.gitignore index 54bd5039..2ef0d673 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,23 @@ Thumbs.db .kdev4 -MultiMC5.kdev4 -MultiMC.pro.user -CMakeLists.txt.user .user .directory -build resources/CMakeFiles resources/MultiMCLauncher.jar *~ *.swp html/ +# Project Files +MultiMC5.kdev4 +MultiMC.pro.user +CMakeLists.txt.user +CMakeLists.txt.user.* + +# Build dirs +build +/build-* + # Ctags File tags diff --git a/MultiMC.cpp b/MultiMC.cpp index 7a82c642..e4a30f22 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -379,6 +379,7 @@ void MultiMC::initGlobalSettings() // Console m_settings->registerSetting("ShowConsole", true); m_settings->registerSetting("AutoCloseConsole", true); + m_settings->registerSetting("LogPrePostOutput", true); // Console Colors // m_settings->registerSetting("SysMessageColor", QColor(Qt::blue)); diff --git a/depends/launcher/org/multimc/EntryPoint.java b/depends/launcher/org/multimc/EntryPoint.java index c42e34e7..83f232f1 100644 --- a/depends/launcher/org/multimc/EntryPoint.java +++ b/depends/launcher/org/multimc/EntryPoint.java @@ -71,15 +71,15 @@ public class EntryPoint if(param.equals("legacy")) { m_launcher = new LegacyLauncher(); - System.out.println("Using legacy launcher."); - System.out.println(); + Utils.log("Using legacy launcher."); + Utils.log(); return Action.Launch; } if(param.equals("onesix")) { m_launcher = new OneSixLauncher(); - System.out.println("Using onesix launcher."); - System.out.println(); + Utils.log("Using onesix launcher."); + Utils.log(); return Action.Launch; } else diff --git a/depends/launcher/org/multimc/Utils.java b/depends/launcher/org/multimc/Utils.java index c4d55b6e..df0ef861 100644 --- a/depends/launcher/org/multimc/Utils.java +++ b/depends/launcher/org/multimc/Utils.java @@ -153,4 +153,27 @@ public class Utils } return null; } + + /** + * Log to the MultiMC console + * + * @param message A String containing the message + * @param level A String containing the level name. See MinecraftProcess::getLevel() + */ + public static void log(String message, String level) + { + // Kinda dirty + String tag = "!![" + level + "]!"; + System.out.println(tag + message.replace("\n", "\n" + tag)); + } + + public static void log(String message) + { + log(message, "MultiMC"); + } + + public static void log() + { + System.out.println(); + } } diff --git a/depends/launcher/org/multimc/legacy/LegacyLauncher.java b/depends/launcher/org/multimc/legacy/LegacyLauncher.java index 6a0a3014..1ca37c4a 100644 --- a/depends/launcher/org/multimc/legacy/LegacyLauncher.java +++ b/depends/launcher/org/multimc/legacy/LegacyLauncher.java @@ -102,20 +102,20 @@ public class LegacyLauncher implements Launcher // print the pretty things { - System.out.println("Main Class:"); - System.out.println(mainClass); - System.out.println(); + Utils.log("Main Class:"); + Utils.log(" " + mainClass); + Utils.log(); - System.out.println("Class Path:"); + Utils.log("Class Path:"); for (URL s : classpath) { - System.out.println(s); + Utils.log(" " + s); } - System.out.println(); + Utils.log(); - System.out.println("Native Path:"); - System.out.println(nativesDir); - System.out.println(); + Utils.log("Native Path:"); + Utils.log(" " + nativesDir); + Utils.log(); } URLClassLoader cl = new URLClassLoader(classpath, LegacyLauncher.class.getClassLoader()); @@ -149,7 +149,7 @@ public class LegacyLauncher implements Launcher mcArgs[0] = userName; mcArgs[1] = sessionId; - System.out.println("Launching with applet wrapper..."); + Utils.log("Launching with applet wrapper..."); try { Class MCAppletClass = cl.loadClass("net.minecraft.client.MinecraftApplet"); @@ -158,16 +158,16 @@ public class LegacyLauncher implements Launcher mcWindow.start(mcappl, userName, sessionId, winSize, maximize); } catch (Exception e) { - System.err.println("Applet wrapper failed:"); + Utils.log("Applet wrapper failed:", "Error"); e.printStackTrace(System.err); - System.err.println(); - System.out.println("Falling back to compatibility mode."); + Utils.log(); + Utils.log("Falling back to compatibility mode."); try { mc.getMethod("main", String[].class).invoke(null, (Object) mcArgs); } catch (Exception e1) { - System.err.println("Failed to invoke the Minecraft main class:"); + Utils.log("Failed to invoke the Minecraft main class:", "Fatal"); e1.printStackTrace(System.err); return -1; } diff --git a/depends/launcher/org/multimc/onesix/OneSixLauncher.java b/depends/launcher/org/multimc/onesix/OneSixLauncher.java index f25a3245..d6c80b67 100644 --- a/depends/launcher/org/multimc/onesix/OneSixLauncher.java +++ b/depends/launcher/org/multimc/onesix/OneSixLauncher.java @@ -74,37 +74,37 @@ public class OneSixLauncher implements Launcher // print the pretty things { - System.out.println("Main Class:"); - System.out.println(mainClass); - System.out.println(); + Utils.log("Main Class:"); + Utils.log(" " + mainClass); + Utils.log(); - System.out.println("Native paths:"); + Utils.log("Native paths:"); for (String s : allNativePaths) { - System.out.println(s); + Utils.log(" " + s); } - System.out.println(); + Utils.log(); - System.out.println("Libraries:"); + Utils.log("Libraries:"); for (String s : libraries) { - System.out.println(s); + Utils.log(" " + s); } - System.out.println(); + Utils.log(); if(mods.size() > 0) { - System.out.println("Class Path Mods:"); + Utils.log("Class Path Mods:"); for (String s : mods) { - System.out.println(s); + Utils.log(" " + s); } - System.out.println(); + Utils.log(); } - System.out.println("Params:"); - System.out.println(mcparams.toString()); - System.out.println(); + Utils.log("Params:"); + Utils.log(" " + mcparams.toString()); + Utils.log(); } final ClassLoader cl = ClassLoader.getSystemClassLoader(); diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index 54a74bde..dc36a8ff 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -140,6 +140,9 @@ void ConsoleWindow::write(QString data, MessageLevel::Enum mode) else if (mode == MessageLevel::Debug) while (iter.hasNext()) writeColor(iter.next(), "green"); + else if (mode == MessageLevel::PrePost) + while (iter.hasNext()) + writeColor(iter.next(), "grey"); // TODO: implement other MessageLevels else while (iter.hasNext()) diff --git a/logic/BaseInstance.cpp b/logic/BaseInstance.cpp index afe3dd03..222004a3 100644 --- a/logic/BaseInstance.cpp +++ b/logic/BaseInstance.cpp @@ -82,6 +82,7 @@ BaseInstance::BaseInstance(BaseInstancePrivate *d_in, const QString &rootDir, settings().registerSetting("OverrideConsole", false); settings().registerOverride(globalSettings->getSetting("ShowConsole")); settings().registerOverride(globalSettings->getSetting("AutoCloseConsole")); + settings().registerOverride(globalSettings->getSetting("LogPrePostOutput")); } void BaseInstance::iconUpdated(QString key) diff --git a/logic/MinecraftProcess.cpp b/logic/MinecraftProcess.cpp index 18d63674..84610021 100644 --- a/logic/MinecraftProcess.cpp +++ b/logic/MinecraftProcess.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "BaseInstance.h" @@ -42,6 +43,7 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst) #ifdef LINUX // Strip IBus + // IBus is a Linux IME framework. For some reason, it breaks MC? if (env.value("XMODIFIERS").contains(IBUS)) env.insert("XMODIFIERS", env.value("XMODIFIERS").replace(IBUS, "")); #endif @@ -57,6 +59,15 @@ MinecraftProcess::MinecraftProcess(BaseInstance *inst) : m_instance(inst) // std channels connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr())); connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut())); + + // Log prepost launch command output (can be disabled.) + if (m_instance->settings().get("LogPrePostOutput").toBool()) + { + connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardError, + this, &MinecraftProcess::on_prepost_stdErr); + connect(&m_prepostlaunchprocess, &QProcess::readyReadStandardOutput, + this, &MinecraftProcess::on_prepost_stdOut); + } } void MinecraftProcess::setWorkdir(QString path) @@ -97,43 +108,133 @@ QString MinecraftProcess::censorPrivateInfo(QString in) } // console window +MessageLevel::Enum MinecraftProcess::guessLevel(const QString &line, MessageLevel::Enum level) +{ + if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || + line.contains("[FINER]") || line.contains("[FINEST]")) + level = MessageLevel::Message; + if (line.contains("[SEVERE]") || line.contains("[STDERR]")) + level = MessageLevel::Error; + if (line.contains("[WARNING]")) + level = MessageLevel::Warning; + if (line.contains("Exception in thread") || line.contains(" at ")) + level = MessageLevel::Fatal; + if (line.contains("[DEBUG]")) + level = MessageLevel::Debug; + return level; +} + +MessageLevel::Enum MinecraftProcess::getLevel(const QString &levelName) +{ + if (levelName == "MultiMC") + return MessageLevel::MultiMC; + else if (levelName == "Debug") + return MessageLevel::Debug; + else if (levelName == "Info") + return MessageLevel::Info; + else if (levelName == "Message") + return MessageLevel::Message; + else if (levelName == "Warning") + return MessageLevel::Warning; + else if (levelName == "Error") + return MessageLevel::Error; + else if (levelName == "Fatal") + return MessageLevel::Fatal; + // Skip PrePost, it's not exposed to !![]! + else + return MessageLevel::Message; +} + +void MinecraftProcess::logOutput(const QStringList &lines, + MessageLevel::Enum defaultLevel, + bool guessLevel, bool censor) +{ + for (int i = 0; i < lines.size(); ++i) + logOutput(lines[i], defaultLevel, guessLevel, censor); +} + +void MinecraftProcess::logOutput(QString line, + MessageLevel::Enum defaultLevel, + bool guessLevel, bool censor) +{ + MessageLevel::Enum level = defaultLevel; + + // Level prefix + int endmark = line.indexOf("]!"); + if (line.startsWith("!![") && endmark != -1) + { + level = getLevel(line.left(endmark).mid(3)); + line = line.mid(endmark + 2); + } + // Guess level + else if (guessLevel) + level = this->guessLevel(line, defaultLevel); + + if (censor) + line = censorPrivateInfo(line); + + emit log(line, level); +} + void MinecraftProcess::on_stdErr() { QByteArray data = readAllStandardError(); QString str = m_err_leftover + QString::fromLocal8Bit(data); - m_err_leftover.clear(); - QStringList lines = str.split("\n"); - bool complete = str.endsWith("\n"); - for (int i = 0; i < lines.size() - 1; i++) - { - QString &line = lines[i]; - emit log(censorPrivateInfo(line), getLevel(line, MessageLevel::Error)); - } - if (!complete) - m_err_leftover = lines.last(); + QStringList lines = str.split("\n"); + m_err_leftover = lines.takeLast(); + + logOutput(lines, MessageLevel::Error); } void MinecraftProcess::on_stdOut() { QByteArray data = readAllStandardOutput(); QString str = m_out_leftover + QString::fromLocal8Bit(data); - m_out_leftover.clear(); - QStringList lines = str.split("\n"); - bool complete = str.endsWith("\n"); - for (int i = 0; i < lines.size() - 1; i++) - { - QString &line = lines[i]; - emit log(censorPrivateInfo(line), getLevel(line, MessageLevel::Message)); - } - if (!complete) - m_out_leftover = lines.last(); + QStringList lines = str.split("\n"); + m_out_leftover = lines.takeLast(); + + logOutput(lines); +} + +void MinecraftProcess::on_prepost_stdErr() +{ + QByteArray data = m_prepostlaunchprocess.readAllStandardError(); + QString str = m_err_leftover + QString::fromLocal8Bit(data); + + QStringList lines = str.split("\n"); + m_err_leftover = lines.takeLast(); + + logOutput(lines, MessageLevel::PrePost, false, false); +} + +void MinecraftProcess::on_prepost_stdOut() +{ + QByteArray data = m_prepostlaunchprocess.readAllStandardOutput(); + QString str = m_out_leftover + QString::fromLocal8Bit(data); + + QStringList lines = str.split("\n"); + m_out_leftover = lines.takeLast(); + + logOutput(lines, MessageLevel::PrePost, false, false); } // exit handler void MinecraftProcess::finish(int code, ExitStatus status) { + // Flush console window + if (!m_err_leftover.isEmpty()) + { + logOutput(m_err_leftover, MessageLevel::Error); + m_err_leftover.clear(); + } + if (!m_out_leftover.isEmpty()) + { + logOutput(m_out_leftover); + m_out_leftover.clear(); + } + if (!killed) { if (status == NormalExit) @@ -156,15 +257,32 @@ void MinecraftProcess::finish(int code, ExitStatus status) m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code)); // run post-exit - if (!m_instance->settings().get("PostExitCommand").toString().isEmpty()) + QString postlaunch_cmd = m_instance->settings().get("PostExitCommand").toString(); + if (!postlaunch_cmd.isEmpty()) { - m_prepostlaunchprocess.start(m_instance->settings().get("PostExitCommand").toString()); + emit log(tr("Running Post-Launch command: %1").arg(postlaunch_cmd)); + m_prepostlaunchprocess.start(postlaunch_cmd); m_prepostlaunchprocess.waitForFinished(); + // Flush console window + if (!m_err_leftover.isEmpty()) + { + logOutput(m_err_leftover, MessageLevel::PrePost); + m_err_leftover.clear(); + } + if (!m_out_leftover.isEmpty()) + { + logOutput(m_out_leftover, MessageLevel::PrePost); + m_out_leftover.clear(); + } if (m_prepostlaunchprocess.exitStatus() != NormalExit) { + emit log(tr("Post-Launch command failed with code %1.\n\n").arg(m_prepostlaunchprocess.exitCode()), + MessageLevel::Error); emit postlaunch_failed(m_instance, m_prepostlaunchprocess.exitCode(), m_prepostlaunchprocess.exitStatus()); } + else + emit log(tr("Post-Launch command ran successfully.\n\n")); } m_instance->cleanupAfterRun(); emit ended(m_instance, code, status); @@ -178,17 +296,40 @@ void MinecraftProcess::killMinecraft() void MinecraftProcess::launch() { - if (!m_instance->settings().get("PreLaunchCommand").toString().isEmpty()) + emit log("MultiMC version: " + MMC->version().toString() + "\n\n"); + emit log("Minecraft folder is:\n" + workingDirectory() + "\n\n"); + + QString prelaunch_cmd = m_instance->settings().get("PreLaunchCommand").toString(); + if (!prelaunch_cmd.isEmpty()) { - m_prepostlaunchprocess.start(m_instance->settings().get("PreLaunchCommand").toString()); + // Launch + emit log(tr("Running Pre-Launch command: %1").arg(prelaunch_cmd)); + m_prepostlaunchprocess.start(prelaunch_cmd); + // Wait m_prepostlaunchprocess.waitForFinished(); + // Flush console window + if (!m_err_leftover.isEmpty()) + { + logOutput(m_err_leftover, MessageLevel::PrePost); + m_err_leftover.clear(); + } + if (!m_out_leftover.isEmpty()) + { + logOutput(m_out_leftover, MessageLevel::PrePost); + m_out_leftover.clear(); + } + // Process return values if (m_prepostlaunchprocess.exitStatus() != NormalExit) { + emit log(tr("Pre-Launch command failed with code %1.\n\n").arg(m_prepostlaunchprocess.exitCode()), + MessageLevel::Fatal); m_instance->cleanupAfterRun(); emit prelaunch_failed(m_instance, m_prepostlaunchprocess.exitCode(), m_prepostlaunchprocess.exitStatus()); return; } + else + emit log(tr("Pre-Launch command ran successfully.\n\n")); } m_instance->setLastLaunch(); @@ -221,8 +362,6 @@ void MinecraftProcess::launch() } QString JavaPath = m_instance->settings().get("JavaPath").toString(); - emit log("MultiMC version: " + MMC->version().toString() + "\n\n"); - emit log("Minecraft folder is:\n" + workingDirectory() + "\n\n"); emit log("Java path is:\n" + JavaPath + "\n\n"); QString allArgs = args.join(", "); emit log("Java Arguments:\n[" + censorPrivateInfo(allArgs) + "]\n\n"); @@ -241,19 +380,3 @@ void MinecraftProcess::launch() QByteArray bytes = launchScript.toUtf8(); writeData(bytes.constData(), bytes.length()); } - -MessageLevel::Enum MinecraftProcess::getLevel(const QString &line, MessageLevel::Enum level) -{ - if (line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || - line.contains("[FINER]") || line.contains("[FINEST]")) - level = MessageLevel::Message; - if (line.contains("[SEVERE]") || line.contains("[STDERR]")) - level = MessageLevel::Error; - if (line.contains("[WARNING]")) - level = MessageLevel::Warning; - if (line.contains("Exception in thread") || line.contains(" at ")) - level = MessageLevel::Fatal; - if (line.contains("[DEBUG]")) - level = MessageLevel::Debug; - return level; -} diff --git a/logic/MinecraftProcess.h b/logic/MinecraftProcess.h index 5d1a2b71..70e5df52 100644 --- a/logic/MinecraftProcess.h +++ b/logic/MinecraftProcess.h @@ -31,11 +31,12 @@ enum Enum { MultiMC, /**< MultiMC Messages */ Debug, /**< Debug Messages */ - Info, /**< Info Messages */ + Info, /**< Info Messages */ Message, /**< Standard Messages */ Warning, /**< Warnings */ Error, /**< Errors */ - Fatal /**< Fatal Errors */ + Fatal, /**< Fatal Errors */ + PrePost, /**< Pre/Post Launch command output */ }; } @@ -125,9 +126,17 @@ slots: void finish(int, QProcess::ExitStatus status); void on_stdErr(); void on_stdOut(); + void on_prepost_stdOut(); + void on_prepost_stdErr(); + void logOutput(const QStringList &lines, + MessageLevel::Enum defaultLevel = MessageLevel::Message, + bool guessLevel = true, bool censor = true); + void logOutput(QString line, + MessageLevel::Enum defaultLevel = MessageLevel::Message, + bool guessLevel = true, bool censor = true); private: QString censorPrivateInfo(QString in); - MessageLevel::Enum getLevel(const QString &message, MessageLevel::Enum defaultLevel); - + MessageLevel::Enum guessLevel(const QString &message, MessageLevel::Enum defaultLevel); + MessageLevel::Enum getLevel(const QString &levelName); }; From ecc80bd763111b0e368aa80366bd8382cd814ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 03:32:31 +0100 Subject: [PATCH 31/45] Change the native extraction/loading logic. --- .../org/multimc/onesix/OneSixLauncher.java | 5 +- logic/OneSixLibrary.cpp | 56 +++++++++++++++++++ logic/OneSixLibrary.h | 2 + logic/OneSixUpdate.cpp | 55 ++++-------------- 4 files changed, 71 insertions(+), 47 deletions(-) diff --git a/depends/launcher/org/multimc/onesix/OneSixLauncher.java b/depends/launcher/org/multimc/onesix/OneSixLauncher.java index d6c80b67..c1676c94 100644 --- a/depends/launcher/org/multimc/onesix/OneSixLauncher.java +++ b/depends/launcher/org/multimc/onesix/OneSixLauncher.java @@ -70,7 +70,7 @@ public class OneSixLauncher implements Launcher List allNativePaths = new ArrayList(); boolean is_64 = property.equalsIgnoreCase("x86_64") || property.equalsIgnoreCase("amd64"); allNativePaths.add(natives); - allNativePaths.add(Utils.combine(natives, is_64 ? "64" : "32")); + allNativePaths.add(natives + "/" + (is_64 ? "64" : "32")); // print the pretty things { @@ -110,7 +110,8 @@ public class OneSixLauncher implements Launcher final ClassLoader cl = ClassLoader.getSystemClassLoader(); // set up the natives path(s). - System.setProperty("java.library.path", Utils.join(allNativePaths, String.valueOf(File.pathSeparatorChar)) ); + String libpath = Utils.join(allNativePaths, String.valueOf(File.pathSeparatorChar)); + System.setProperty("java.library.path", libpath); Field fieldSysPath; try { diff --git a/logic/OneSixLibrary.cpp b/logic/OneSixLibrary.cpp index 4b6ed9dc..1d69b660 100644 --- a/logic/OneSixLibrary.cpp +++ b/logic/OneSixLibrary.cpp @@ -19,6 +19,9 @@ #include "OneSixRule.h" #include "OpSys.h" #include "logic/net/URLConstants.h" +#include +#include +#include "logger/QsLog.h" void OneSixLibrary::finalize() { @@ -133,6 +136,59 @@ QString OneSixLibrary::hint() return m_hint; } +bool OneSixLibrary::extractTo(QString target_dir) +{ + QString storage = storagePath(); + if (storage.contains("${arch}")) + { + QString cooked_storage = storage; + cooked_storage.replace("${arch}", "32"); + QString origin = PathCombine("libraries", cooked_storage); + QString target_dir_cooked = PathCombine(target_dir, "32"); + if(!ensureFolderPathExists(target_dir_cooked)) + { + QLOG_ERROR() << "Couldn't create folder " + target_dir_cooked; + return false; + } + if (JlCompress::extractWithExceptions(origin, target_dir_cooked, extract_excludes) + .isEmpty()) + { + QLOG_ERROR() << "Couldn't extract " + origin; + return false; + } + cooked_storage = storage; + cooked_storage.replace("${arch}", "64"); + origin = PathCombine("libraries", cooked_storage); + target_dir_cooked = PathCombine(target_dir, "32"); + if(!ensureFolderPathExists(target_dir_cooked)) + { + QLOG_ERROR() << "Couldn't create folder " + target_dir_cooked; + return false; + } + if (JlCompress::extractWithExceptions(origin, target_dir_cooked, extract_excludes) + .isEmpty()) + { + QLOG_ERROR() << "Couldn't extract " + origin; + return false; + } + } + else + { + if(!ensureFolderPathExists(target_dir)) + { + QLOG_ERROR() << "Couldn't create folder " + target_dir; + return false; + } + QString path = PathCombine("libraries", storage); + if (JlCompress::extractWithExceptions(path, target_dir, extract_excludes).isEmpty()) + { + QLOG_ERROR() << "Couldn't extract " + path; + return false; + } + } + return true; +} + QJsonObject OneSixLibrary::toJson() { QJsonObject libRoot; diff --git a/logic/OneSixLibrary.h b/logic/OneSixLibrary.h index 3f0bc83d..bc097348 100644 --- a/logic/OneSixLibrary.h +++ b/logic/OneSixLibrary.h @@ -126,4 +126,6 @@ public: /// set a hint about how to treat the library. This is an MMC extension. void setHint(QString hint); QString hint(); + + bool extractTo(QString target_dir); }; diff --git a/logic/OneSixUpdate.cpp b/logic/OneSixUpdate.cpp index 5309a7e0..ee355308 100644 --- a/logic/OneSixUpdate.cpp +++ b/logic/OneSixUpdate.cpp @@ -340,7 +340,6 @@ void OneSixUpdate::prepareForLaunch() // delete any leftovers, if they are present. onesix_inst->cleanupAfterRun(); - // Acquire swag QString natives_dir_raw = PathCombine(onesix_inst->instanceRoot(), "natives/"); auto version = onesix_inst->getFullVersion(); if (!version) @@ -349,56 +348,22 @@ void OneSixUpdate::prepareForLaunch() "it or changing the version."); return; } - auto libs_to_extract = version->getActiveNativeLibs(); - - // Acquire bag - bool success = true; - success &= ensureFolderPathExists(natives_dir_raw + "/32"); - success &= ensureFolderPathExists(natives_dir_raw + "/64"); - if (!success) - { - emitFailed("Could not create the native library folder:\n" + natives_dir_raw + +/* + * emitFailed("Could not create the native library folder:\n" + natives_dir_raw + "\nMake sure MultiMC has appropriate permissions and there is enough space " "on the storage device."); - return; - } - - // Put swag in the bag - for (auto lib : libs_to_extract) +*/ + for (auto lib : version->getActiveNativeLibs()) { - auto f = [&](QString storage, QString arch = "") + if (!lib->extractTo(natives_dir_raw)) { - QString path = "libraries/" + storage; - QLOG_INFO() << "Will extract " << path.toLocal8Bit(); - if (JlCompress::extractWithExceptions(path, natives_dir_raw + "/" + arch, - lib->extract_excludes).isEmpty()) - { - emitFailed( - "Could not extract the native library:\n" + path + - "\nMake sure MultiMC has appropriate permissions and there is enough space " - "on the storage device."); - return false; - } - }; - QString storage = lib->storagePath(); - if (storage.contains("${arch}")) - { - QString cooked_storage = storage; - cooked_storage.replace("${arch}", "32"); - if (!f(cooked_storage, "32")) - return; - cooked_storage = storage; - cooked_storage.replace("${arch}", "64"); - if (!f(cooked_storage, "64")) - return; - } - else - { - if (!f(storage)) - return; + emitFailed("Could not extract the native library:\n" + lib->storagePath() + " to " + + natives_dir_raw + + "\nMake sure MultiMC has appropriate permissions and there is enough " + "space on the storage device."); + return; } } - // Show them your war face! emitSucceeded(); } From 8650aa81f06d9e229764b200f1dca135412c2ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 10:22:32 +0100 Subject: [PATCH 32/45] Fix settings dialog when offline --- gui/dialogs/SettingsDialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gui/dialogs/SettingsDialog.cpp b/gui/dialogs/SettingsDialog.cpp index b90434b0..ef363f02 100644 --- a/gui/dialogs/SettingsDialog.cpp +++ b/gui/dialogs/SettingsDialog.cpp @@ -269,6 +269,10 @@ void SettingsDialog::refreshUpdateChannelDesc() // Get the channel list. QList channelList = MMC->updateChecker()->getChannelList(); int selectedIndex = ui->updateChannelComboBox->currentIndex(); + if(selectedIndex < 0) + { + return; + } if (selectedIndex < channelList.count()) { // Find the channel list entry with the given index. From 3fabb11f4c59baffb14db00d338d9efe342e277e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 22:11:33 +0100 Subject: [PATCH 33/45] Marginally improve OneSix offline mode launch While reconstructing assets, skip files that don't exist. Report missing OneSix native libraries. --- logic/OneSixInstance.cpp | 51 +++++++++++++-------------- logic/OneSixLibrary.cpp | 28 +++++++++++++++ logic/OneSixLibrary.h | 1 + logic/OneSixUpdate.cpp | 20 +++++++---- logic/auth/MojangAccount.cpp | 6 +++- logic/lists/ForgeVersionList.cpp | 4 +-- logic/net/CacheDownload.cpp | 21 ++++++----- logic/net/CacheDownload.h | 9 +++-- logic/updater/NotificationChecker.cpp | 2 +- 9 files changed, 95 insertions(+), 47 deletions(-) diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index 16699a1d..3cfc1c76 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -93,39 +93,38 @@ QDir OneSixInstance::reconstructAssets(std::shared_ptr version) AssetsIndex index; bool loadAssetsIndex = AssetsUtils::loadAssetsIndexJson(indexPath, &index); - if (loadAssetsIndex) + if (loadAssetsIndex && index.isVirtual) { - if (index.isVirtual) + QLOG_INFO() << "Reconstructing virtual assets folder at" << virtualRoot.path(); + + for (QString map : index.objects.keys()) { - QLOG_INFO() << "Reconstructing virtual assets folder at" << virtualRoot.path(); + AssetObject asset_object = index.objects.value(map); + QString target_path = PathCombine(virtualRoot.path(), map); + QFile target(target_path); - for (QString map : index.objects.keys()) + QString tlk = asset_object.hash.left(2); + + QString original_path = + PathCombine(PathCombine(objectDir.path(), tlk), asset_object.hash); + QFile original(original_path); + if(!original.exists()) + continue; + if (!target.exists()) { - AssetObject asset_object = index.objects.value(map); - QString target_path = PathCombine(virtualRoot.path(), map); - QFile target(target_path); + QFileInfo info(target_path); + QDir target_dir = info.dir(); + // QLOG_DEBUG() << target_dir; + if (!target_dir.exists()) + QDir("").mkpath(target_dir.path()); - QString tlk = asset_object.hash.left(2); - - QString original_path = - PathCombine(PathCombine(objectDir.path(), tlk), asset_object.hash); - QFile original(original_path); - if (!target.exists()) - { - QFileInfo info(target_path); - QDir target_dir = info.dir(); - // QLOG_DEBUG() << target_dir; - if (!target_dir.exists()) - QDir("").mkpath(target_dir.path()); - - bool couldCopy = original.copy(target_path); - QLOG_DEBUG() << " Copying" << original_path << "to" << target_path - << QString::number(couldCopy); // << original.errorString(); - } + bool couldCopy = original.copy(target_path); + QLOG_DEBUG() << " Copying" << original_path << "to" << target_path + << QString::number(couldCopy); // << original.errorString(); } - - // TODO: Write last used time to virtualRoot/.lastused } + + // TODO: Write last used time to virtualRoot/.lastused } return virtualRoot; diff --git a/logic/OneSixLibrary.cpp b/logic/OneSixLibrary.cpp index 1d69b660..cf29a832 100644 --- a/logic/OneSixLibrary.cpp +++ b/logic/OneSixLibrary.cpp @@ -136,6 +136,34 @@ QString OneSixLibrary::hint() return m_hint; } +bool OneSixLibrary::filesExist() +{ + QString storage = storagePath(); + if (storage.contains("${arch}")) + { + QString cooked_storage = storage; + cooked_storage.replace("${arch}", "32"); + if (!QFileInfo::exists(PathCombine("libraries", cooked_storage))) + { + return false; + } + cooked_storage = storage; + cooked_storage.replace("${arch}", "64"); + if (!QFileInfo::exists(PathCombine("libraries", cooked_storage))) + { + return false; + } + } + else + { + if (!QFileInfo::exists(PathCombine("libraries", storage))) + { + return false; + } + } + return true; +} + bool OneSixLibrary::extractTo(QString target_dir) { QString storage = storagePath(); diff --git a/logic/OneSixLibrary.h b/logic/OneSixLibrary.h index bc097348..227cdbef 100644 --- a/logic/OneSixLibrary.h +++ b/logic/OneSixLibrary.h @@ -128,4 +128,5 @@ public: QString hint(); bool extractTo(QString target_dir); + bool filesExist(); }; diff --git a/logic/OneSixUpdate.cpp b/logic/OneSixUpdate.cpp index ee355308..0119ab07 100644 --- a/logic/OneSixUpdate.cpp +++ b/logic/OneSixUpdate.cpp @@ -348,18 +348,26 @@ void OneSixUpdate::prepareForLaunch() "it or changing the version."); return; } -/* - * emitFailed("Could not create the native library folder:\n" + natives_dir_raw + - "\nMake sure MultiMC has appropriate permissions and there is enough space " - "on the storage device."); -*/ + /* + * emitFailed("Could not create the native library folder:\n" + natives_dir_raw + + "\nMake sure MultiMC has appropriate permissions and there is enough + space " + "on the storage device."); + */ for (auto lib : version->getActiveNativeLibs()) { + if (!lib->filesExist()) + { + emitFailed("Native library is missing some files:\n" + lib->storagePath() + + "\n\nRun the instance at least once in online mode to get all the " + "required files."); + return; + } if (!lib->extractTo(natives_dir_raw)) { emitFailed("Could not extract the native library:\n" + lib->storagePath() + " to " + natives_dir_raw + - "\nMake sure MultiMC has appropriate permissions and there is enough " + "\n\nMake sure MultiMC has appropriate permissions and there is enough " "space on the storage device."); return; } diff --git a/logic/auth/MojangAccount.cpp b/logic/auth/MojangAccount.cpp index a462eda5..f41985ec 100644 --- a/logic/auth/MojangAccount.cpp +++ b/logic/auth/MojangAccount.cpp @@ -198,7 +198,11 @@ void MojangAccount::authFailed(QString reason) { // This is emitted when the yggdrasil tasks time out or are cancelled. // -> we treat the error as no-op - if (reason != "Yggdrasil task cancelled.") + if (reason == "Yggdrasil task cancelled.") + { + // do nothing + } + else { m_online = false; m_accessToken = QString(); diff --git a/logic/lists/ForgeVersionList.cpp b/logic/lists/ForgeVersionList.cpp index 38e033fa..4902dc64 100644 --- a/logic/lists/ForgeVersionList.cpp +++ b/logic/lists/ForgeVersionList.cpp @@ -187,7 +187,7 @@ bool ForgeListLoadTask::parseForgeList(QList &out) QByteArray data; { auto dlJob = listDownload; - auto filename = std::dynamic_pointer_cast(dlJob)->m_target_path; + auto filename = std::dynamic_pointer_cast(dlJob)->getTargetFilepath(); QFile listFile(filename); if (!listFile.open(QIODevice::ReadOnly)) { @@ -303,7 +303,7 @@ bool ForgeListLoadTask::parseForgeGradleList(QList &out) QByteArray data; { auto dlJob = gradleListDownload; - auto filename = std::dynamic_pointer_cast(dlJob)->m_target_path; + auto filename = std::dynamic_pointer_cast(dlJob)->getTargetFilepath(); QFile listFile(filename); if (!listFile.open(QIODevice::ReadOnly)) { diff --git a/logic/net/CacheDownload.cpp b/logic/net/CacheDownload.cpp index 0022c361..d2a9bdee 100644 --- a/logic/net/CacheDownload.cpp +++ b/logic/net/CacheDownload.cpp @@ -40,7 +40,9 @@ void CacheDownload::start() emit succeeded(m_index_within_job); return; } - m_output_file.setFileName(m_target_path); + // create a new save file + m_output_file.reset(new QSaveFile(m_target_path)); + // if there already is a file and md5 checking is in effect and it can be opened if (!ensureFilePathExists(m_target_path)) { @@ -49,7 +51,7 @@ void CacheDownload::start() emit failed(m_index_within_job); return; } - if (!m_output_file.open(QIODevice::WriteOnly)) + if (!m_output_file->open(QIODevice::WriteOnly)) { QLOG_ERROR() << "Could not open " + m_target_path + " for writing"; m_status = Job_Failed; @@ -94,7 +96,7 @@ void CacheDownload::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) void CacheDownload::downloadError(QNetworkReply::NetworkError error) { // error happened during download. - QLOG_ERROR() << "Failed" << m_url.toString() << "with reason" << error; + QLOG_ERROR() << "Failed " << m_url.toString() << " with reason " << error; m_status = Job_Failed; } void CacheDownload::downloadFinished() @@ -102,17 +104,17 @@ void CacheDownload::downloadFinished() // if the download succeeded if (m_status == Job_Failed) { - m_output_file.cancelWriting(); + m_output_file->cancelWriting(); m_reply.reset(); - m_status = Job_Failed; emit failed(m_index_within_job); return; } + // if we wrote any data to the save file, we try to commit the data to the real file. if (wroteAnyData) { // nothing went wrong... - if (m_output_file.commit()) + if (m_output_file->commit()) { m_status = Job_Finished; m_entry->md5sum = md5sum.result().toHex().constData(); @@ -120,7 +122,7 @@ void CacheDownload::downloadFinished() else { QLOG_ERROR() << "Failed to commit changes to " << m_target_path; - m_output_file.cancelWriting(); + m_output_file->cancelWriting(); m_reply.reset(); m_status = Job_Failed; emit failed(m_index_within_job); @@ -132,6 +134,9 @@ void CacheDownload::downloadFinished() m_status = Job_Finished; } + // then get rid of the save file + m_output_file.reset(); + QFileInfo output_file_info(m_target_path); m_entry->etag = m_reply->rawHeader("ETag").constData(); @@ -153,7 +158,7 @@ void CacheDownload::downloadReadyRead() { QByteArray ba = m_reply->readAll(); md5sum.addData(ba); - if (m_output_file.write(ba) != ba.size()) + if (m_output_file->write(ba) != ba.size()) { QLOG_ERROR() << "Failed writing into " + m_target_path; m_status = Job_Failed; diff --git a/logic/net/CacheDownload.h b/logic/net/CacheDownload.h index 48be1dae..154f5988 100644 --- a/logic/net/CacheDownload.h +++ b/logic/net/CacheDownload.h @@ -24,12 +24,12 @@ typedef std::shared_ptr CacheDownloadPtr; class CacheDownload : public NetAction { Q_OBJECT -public: +private: MetaEntryPtr m_entry; /// if saving to file, use the one specified in this string QString m_target_path; /// this is the output file, if any - QSaveFile m_output_file; + std::shared_ptr m_output_file; /// the hash-as-you-download QCryptographicHash md5sum; @@ -41,7 +41,10 @@ public: { return CacheDownloadPtr(new CacheDownload(url, entry)); } - + QString getTargetFilepath() + { + return m_target_path; + } protected slots: virtual void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); diff --git a/logic/updater/NotificationChecker.cpp b/logic/updater/NotificationChecker.cpp index b2d67632..191e90a3 100644 --- a/logic/updater/NotificationChecker.cpp +++ b/logic/updater/NotificationChecker.cpp @@ -55,7 +55,7 @@ void NotificationChecker::downloadSucceeded(int) { m_entries.clear(); - QFile file(m_download->m_output_file.fileName()); + QFile file(m_download->getTargetFilepath()); if (file.open(QFile::ReadOnly)) { QJsonArray root = QJsonDocument::fromJson(file.readAll()).array(); From 208209e4a73e6ce75b8ecbd40b5cf7c6e9117eb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 22:16:47 +0100 Subject: [PATCH 34/45] Fix derp: there is no static QFileInfo::exists in Qt 5.1.1 --- logic/OneSixLibrary.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/logic/OneSixLibrary.cpp b/logic/OneSixLibrary.cpp index cf29a832..510be52b 100644 --- a/logic/OneSixLibrary.cpp +++ b/logic/OneSixLibrary.cpp @@ -143,13 +143,15 @@ bool OneSixLibrary::filesExist() { QString cooked_storage = storage; cooked_storage.replace("${arch}", "32"); - if (!QFileInfo::exists(PathCombine("libraries", cooked_storage))) + QFileInfo info32(PathCombine("libraries", cooked_storage)); + if (!info32.exists()) { return false; } cooked_storage = storage; cooked_storage.replace("${arch}", "64"); - if (!QFileInfo::exists(PathCombine("libraries", cooked_storage))) + QFileInfo info64(PathCombine("libraries", cooked_storage)); + if (!info64.exists()) { return false; } From e9186d6d2c9d5e08516d6a3126440f89e55d056b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 22:20:36 +0100 Subject: [PATCH 35/45] DERP DERP DERP DERP ALERT. DUCK AND COVER! --- logic/OneSixLibrary.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/logic/OneSixLibrary.cpp b/logic/OneSixLibrary.cpp index 510be52b..d1eceb0e 100644 --- a/logic/OneSixLibrary.cpp +++ b/logic/OneSixLibrary.cpp @@ -158,7 +158,8 @@ bool OneSixLibrary::filesExist() } else { - if (!QFileInfo::exists(PathCombine("libraries", storage))) + QFileInfo info(PathCombine("libraries", storage)); + if (!info.exists()) { return false; } From e71295d7606a8fba95639051246b3c238148d0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 18 Jan 2014 22:51:04 +0100 Subject: [PATCH 36/45] Force using LF endlines while configuring tests --- tests/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index cc7d1a11..7aeae59f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -95,7 +95,12 @@ endif() file(GLOB data_files "data/*") foreach(data_file ${data_files}) get_filename_component(filename ${data_file} NAME) - configure_file(${data_file} ${CMAKE_CURRENT_BINARY_DIR}/data/${filename} @ONLY) + configure_file( + ${data_file} + ${CMAKE_CURRENT_BINARY_DIR}/data/${filename} + @ONLY + NEWLINE_STYLE LF + ) endforeach() configure_file(test_config.h.in test_config.h @ONLY) From e6ab57b8b1275137d873c0c465aeffe61c13c324 Mon Sep 17 00:00:00 2001 From: Sky Date: Sun, 19 Jan 2014 01:33:32 +0000 Subject: [PATCH 37/45] Try to improve status arrows a bit --- gui/MainWindow.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index d5cc1d44..cca1ecac 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -522,10 +522,13 @@ void MainWindow::updateNewsLabel() static QString convertStatus(const QString &status) { - if(status == "green") return "↑"; - else if(status == "yellow") return "-"; - else if(status == "red") return "↓"; - else return "?"; + QString ret = "?"; + + if(status == "green") ret = "↑"; + else if(status == "yellow") ret = "-"; + else if(status == "red") ret="↓"; + + return "" + ret + ""; } void MainWindow::reloadStatus() From d8413fa5ec594455b3cdec86899b61adba39eb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 19 Jan 2014 04:52:34 +0100 Subject: [PATCH 38/45] Use icon theme so we can have more than one icon size per icon --- CMakeLists.txt | 10 +- graphics.qrc | 51 --- gui/MainWindow.cpp | 31 +- gui/MainWindow.ui | 41 +-- main.cpp | 5 +- resources/{icons => }/MultiMC.ico | Bin resources/XdgIcon.theme | 12 - resources/backgrounds/backgrounds.qrc | 6 + resources/{ => backgrounds}/catbgrnd2.png | Bin resources/{icons => }/instances/brick.png | Bin resources/{icons => }/instances/chicken.png | Bin .../{icons => }/instances/chicken128.png | Bin resources/{icons => }/instances/creeper.png | Bin .../{icons => }/instances/creeper128.png | Bin resources/{icons => }/instances/derp.png | Bin resources/{icons => }/instances/diamond.png | Bin resources/{icons => }/instances/dirt.png | Bin resources/{icons => }/instances/enderman.png | Bin .../{icons => }/instances/enderpearl.png | Bin .../{icons => }/instances/enderpearl128.png | Bin resources/{icons => }/instances/ftb_glow.png | Bin .../{icons => }/instances/ftb_glow128.png | Bin resources/{icons => }/instances/ftb_logo.png | Bin .../{icons => }/instances/ftb_logo128.png | Bin resources/{icons => }/instances/gear.png | Bin resources/{icons => }/instances/gear128.png | Bin resources/{icons => }/instances/gold.png | Bin resources/{icons => }/instances/grass.png | Bin resources/{icons => }/instances/herobrine.png | Bin .../{icons => }/instances/herobrine128.png | Bin resources/{icons => }/instances/infinity.png | Bin .../{icons => }/instances/infinity128.png | Bin resources/instances/instances.qrc | 30 ++ resources/{icons => }/instances/iron.png | Bin resources/{icons => }/instances/magitech.png | Bin .../{icons => }/instances/magitech128.png | Bin resources/{icons => }/instances/meat.png | Bin resources/{icons => }/instances/meat128.png | Bin .../{icons => }/instances/netherstar.png | Bin .../{icons => }/instances/netherstar128.png | Bin resources/{icons => }/instances/planks.png | Bin resources/{icons => }/instances/skeleton.png | Bin .../{icons => }/instances/skeleton128.png | Bin .../{icons => }/instances/squarecreeper.png | Bin .../instances/squarecreeper128.png | Bin resources/{icons => }/instances/steve.png | Bin resources/{icons => }/instances/steve128.png | Bin resources/{icons => }/instances/stone.png | Bin resources/{icons => }/instances/tnt.png | Bin resources/multimc/16x16/noaccount.png | Bin 0 -> 334 bytes resources/multimc/16x16/refresh.png | Bin 0 -> 1389 bytes .../toolbar => multimc/22x22}/about.png | Bin .../ReportBug.png => multimc/22x22/bug.png} | Bin .../toolbar => multimc/22x22}/centralmods.png | Bin .../toolbar => multimc/22x22}/checkupdate.png | Bin .../InstCopy.png => multimc/22x22/copy.png} | Bin .../{icons/toolbar => multimc/22x22}/help.png | Bin .../{icons/toolbar => multimc/22x22}/new.png | Bin .../NewsIcon.png => multimc/22x22/news.png} | Bin .../toolbar => multimc/22x22}/refresh.png | Bin .../toolbar => multimc/22x22}/settings.png | Bin .../toolbar => multimc/22x22}/viewfolder.png | Bin .../toolbar/Cat.png => multimc/24x24/cat.png} | Bin resources/multimc/24x24/noaccount.png | Bin 0 -> 344 bytes resources/multimc/24x24/refresh.png | Bin 0 -> 2116 bytes resources/multimc/32x32/noaccount.png | Bin 0 -> 363 bytes resources/multimc/32x32/refresh.png | Bin 0 -> 2822 bytes resources/multimc/48x48/noaccount.png | Bin 0 -> 387 bytes resources/multimc/48x48/refresh.png | Bin 0 -> 3922 bytes .../8x8/noaccount.png} | Bin resources/multimc/index.theme | 30 ++ resources/multimc/multimc.qrc | 32 ++ .../scalable/apps}/multimc.svg | 0 .../toolbar_svg => multimc/scalable}/bug.svg | 0 .../{icons => multimc/scalable}/console.svg | 0 .../scalable}/console_error.svg | 0 .../toolbar_svg => multimc/scalable}/news.svg | 0 .../instances_svg => sources}/clucker.svg | 0 .../instances_svg => sources}/creeper.svg | 0 .../instances_svg => sources}/enderpearl.svg | 0 .../instances_svg => sources}/ftb-glow.svg | 0 .../instances_svg => sources}/ftb-logo.svg | 0 .../{icons/instances_svg => sources}/gear.svg | 0 .../instances_svg => sources}/herobrine.svg | 0 .../instances_svg => sources}/magitech.svg | 0 .../{icons/instances_svg => sources}/meat.svg | 0 .../instances_svg => sources}/netherstar.svg | 0 .../instances_svg => sources}/pskeleton.svg | 0 .../instances_svg => sources}/skeleton.svg | 0 .../squarecreeper.svg | 0 resources/sources/status-bad.svg | 262 ++++++++++++++++ resources/sources/status-good.svg | 293 ++++++++++++++++++ resources/sources/status-terrible.svg | 262 ++++++++++++++++ .../instances_svg => sources}/steve.svg | 0 94 files changed, 953 insertions(+), 112 deletions(-) delete mode 100644 graphics.qrc rename resources/{icons => }/MultiMC.ico (100%) delete mode 100644 resources/XdgIcon.theme create mode 100644 resources/backgrounds/backgrounds.qrc rename resources/{ => backgrounds}/catbgrnd2.png (100%) rename resources/{icons => }/instances/brick.png (100%) rename resources/{icons => }/instances/chicken.png (100%) rename resources/{icons => }/instances/chicken128.png (100%) rename resources/{icons => }/instances/creeper.png (100%) rename resources/{icons => }/instances/creeper128.png (100%) rename resources/{icons => }/instances/derp.png (100%) rename resources/{icons => }/instances/diamond.png (100%) rename resources/{icons => }/instances/dirt.png (100%) rename resources/{icons => }/instances/enderman.png (100%) rename resources/{icons => }/instances/enderpearl.png (100%) rename resources/{icons => }/instances/enderpearl128.png (100%) rename resources/{icons => }/instances/ftb_glow.png (100%) rename resources/{icons => }/instances/ftb_glow128.png (100%) rename resources/{icons => }/instances/ftb_logo.png (100%) rename resources/{icons => }/instances/ftb_logo128.png (100%) rename resources/{icons => }/instances/gear.png (100%) rename resources/{icons => }/instances/gear128.png (100%) rename resources/{icons => }/instances/gold.png (100%) rename resources/{icons => }/instances/grass.png (100%) rename resources/{icons => }/instances/herobrine.png (100%) rename resources/{icons => }/instances/herobrine128.png (100%) rename resources/{icons => }/instances/infinity.png (100%) rename resources/{icons => }/instances/infinity128.png (100%) create mode 100644 resources/instances/instances.qrc rename resources/{icons => }/instances/iron.png (100%) rename resources/{icons => }/instances/magitech.png (100%) rename resources/{icons => }/instances/magitech128.png (100%) rename resources/{icons => }/instances/meat.png (100%) rename resources/{icons => }/instances/meat128.png (100%) rename resources/{icons => }/instances/netherstar.png (100%) rename resources/{icons => }/instances/netherstar128.png (100%) rename resources/{icons => }/instances/planks.png (100%) rename resources/{icons => }/instances/skeleton.png (100%) rename resources/{icons => }/instances/skeleton128.png (100%) rename resources/{icons => }/instances/squarecreeper.png (100%) rename resources/{icons => }/instances/squarecreeper128.png (100%) rename resources/{icons => }/instances/steve.png (100%) rename resources/{icons => }/instances/steve128.png (100%) rename resources/{icons => }/instances/stone.png (100%) rename resources/{icons => }/instances/tnt.png (100%) create mode 100644 resources/multimc/16x16/noaccount.png create mode 100644 resources/multimc/16x16/refresh.png rename resources/{icons/toolbar => multimc/22x22}/about.png (100%) rename resources/{icons/toolbar/ReportBug.png => multimc/22x22/bug.png} (100%) rename resources/{icons/toolbar => multimc/22x22}/centralmods.png (100%) rename resources/{icons/toolbar => multimc/22x22}/checkupdate.png (100%) rename resources/{icons/toolbar/InstCopy.png => multimc/22x22/copy.png} (100%) rename resources/{icons/toolbar => multimc/22x22}/help.png (100%) rename resources/{icons/toolbar => multimc/22x22}/new.png (100%) rename resources/{icons/toolbar/NewsIcon.png => multimc/22x22/news.png} (100%) rename resources/{icons/toolbar => multimc/22x22}/refresh.png (100%) rename resources/{icons/toolbar => multimc/22x22}/settings.png (100%) rename resources/{icons/toolbar => multimc/22x22}/viewfolder.png (100%) rename resources/{icons/toolbar/Cat.png => multimc/24x24/cat.png} (100%) create mode 100644 resources/multimc/24x24/noaccount.png create mode 100644 resources/multimc/24x24/refresh.png create mode 100644 resources/multimc/32x32/noaccount.png create mode 100644 resources/multimc/32x32/refresh.png create mode 100644 resources/multimc/48x48/noaccount.png create mode 100644 resources/multimc/48x48/refresh.png rename resources/{icons/toolbar/NoAccount.png => multimc/8x8/noaccount.png} (100%) create mode 100644 resources/multimc/index.theme create mode 100644 resources/multimc/multimc.qrc rename resources/{icons => multimc/scalable/apps}/multimc.svg (100%) rename resources/{icons/toolbar_svg => multimc/scalable}/bug.svg (100%) rename resources/{icons => multimc/scalable}/console.svg (100%) rename resources/{icons => multimc/scalable}/console_error.svg (100%) rename resources/{icons/toolbar_svg => multimc/scalable}/news.svg (100%) rename resources/{icons/instances_svg => sources}/clucker.svg (100%) rename resources/{icons/instances_svg => sources}/creeper.svg (100%) rename resources/{icons/instances_svg => sources}/enderpearl.svg (100%) rename resources/{icons/instances_svg => sources}/ftb-glow.svg (100%) rename resources/{icons/instances_svg => sources}/ftb-logo.svg (100%) rename resources/{icons/instances_svg => sources}/gear.svg (100%) rename resources/{icons/instances_svg => sources}/herobrine.svg (100%) rename resources/{icons/instances_svg => sources}/magitech.svg (100%) rename resources/{icons/instances_svg => sources}/meat.svg (100%) rename resources/{icons/instances_svg => sources}/netherstar.svg (100%) rename resources/{icons/instances_svg => sources}/pskeleton.svg (100%) rename resources/{icons/instances_svg => sources}/skeleton.svg (100%) rename resources/{icons/instances_svg => sources}/squarecreeper.svg (100%) create mode 100644 resources/sources/status-bad.svg create mode 100644 resources/sources/status-good.svg create mode 100644 resources/sources/status-terrible.svg rename resources/{icons/instances_svg => sources}/steve.svg (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index c0a4439b..f2ccdab0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -519,6 +519,12 @@ gui/widgets/MCModInfoFrame.ui set (FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${MULTIMC_SOURCES} ${MULTIMC_UIS}) +SET(MULTIMC_QRCS +resources/backgrounds/backgrounds.qrc +resources/multimc/multimc.qrc +resources/instances/instances.qrc +) + ######## Windows resource files ######## IF(WIN32) @@ -562,10 +568,10 @@ ENDIF(MultiMC_CODE_COVERAGE) # Qt 5 stuff QT5_WRAP_UI(MULTIMC_UI ${MULTIMC_UIS}) -QT5_ADD_RESOURCES(GRAPHICS_QRC graphics.qrc) +QT5_ADD_RESOURCES(MULTIMC_RESOURCES ${MULTIMC_QRCS}) # Add common library -ADD_LIBRARY(MultiMC_common STATIC ${MULTIMC_SOURCES} ${MULTIMC_UI} ${GRAPHICS_QRC}) +ADD_LIBRARY(MultiMC_common STATIC ${MULTIMC_SOURCES} ${MULTIMC_UI} ${MULTIMC_RESOURCES}) # Add executable ADD_EXECUTABLE(MultiMC MACOSX_BUNDLE WIN32 main.cpp ${MULTIMC_RCS}) diff --git a/graphics.qrc b/graphics.qrc deleted file mode 100644 index 68d3beed..00000000 --- a/graphics.qrc +++ /dev/null @@ -1,51 +0,0 @@ - - - resources/icons/toolbar/about.png - resources/icons/toolbar/ReportBug.png - resources/icons/toolbar/centralmods.png - resources/icons/toolbar/checkupdate.png - resources/icons/toolbar/help.png - resources/icons/toolbar/new.png - resources/icons/toolbar/InstCopy.png - resources/icons/toolbar/NewsIcon.png - resources/icons/toolbar/refresh.png - resources/icons/toolbar/settings.png - resources/icons/toolbar/viewfolder.png - resources/icons/toolbar/Cat.png - resources/icons/toolbar/NoAccount.png - - - resources/icons/instances/brick.png - resources/icons/instances/chicken128.png - resources/icons/instances/creeper128.png - resources/icons/instances/derp.png - resources/icons/instances/diamond.png - resources/icons/instances/dirt.png - resources/icons/instances/enderman.png - resources/icons/instances/enderpearl128.png - resources/icons/instances/ftb_glow128.png - resources/icons/instances/ftb_logo128.png - resources/icons/instances/gear128.png - resources/icons/instances/gold.png - resources/icons/instances/grass.png - resources/icons/instances/herobrine128.png - resources/icons/instances/infinity128.png - resources/icons/instances/iron.png - resources/icons/instances/magitech128.png - resources/icons/instances/meat128.png - resources/icons/instances/netherstar128.png - resources/icons/instances/planks.png - resources/icons/instances/skeleton128.png - resources/icons/instances/squarecreeper128.png - resources/icons/instances/steve128.png - resources/icons/instances/stone.png - resources/icons/instances/tnt.png - - - resources/icons/multimc.svg - resources/XdgIcon.theme - - - resources/catbgrnd2.png - - diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index cca1ecac..7c8562cd 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -128,7 +128,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // Add the news label to the news toolbar. { newsLabel = new QToolButton(); - newsLabel->setIcon(QIcon(":/icons/toolbar/news")); + newsLabel->setIcon(QIcon::fromTheme("news")); newsLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); newsLabel->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); ui->newsToolBar->insertWidget(ui->actionMoreNews, newsLabel); @@ -203,9 +203,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi m_statusLeft = new QLabel(tr("No instance selected"), this); m_statusRight = new QLabel(tr("No status available"), this); m_statusRefresh = new QToolButton(this); + m_statusRefresh->setCheckable(true); m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly); - m_statusRefresh->setIcon( - QPixmap(":/icons/toolbar/refresh").scaled(16, 16, Qt::KeepAspectRatio)); + m_statusRefresh->setIcon(QIcon::fromTheme("refresh")); statusBar()->addPermanentWidget(m_statusLeft, 1); statusBar()->addPermanentWidget(m_statusRight, 0); @@ -241,8 +241,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi accountMenuButton->setMenu(accountMenu); accountMenuButton->setPopupMode(QToolButton::InstantPopup); accountMenuButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - accountMenuButton->setIcon( - QPixmap(":/icons/toolbar/noaccount").scaled(48, 48, Qt::KeepAspectRatio)); + accountMenuButton->setIcon(QIcon::fromTheme("noaccount")); QWidgetAction *accountMenuButtonAction = new QWidgetAction(this); accountMenuButtonAction->setDefaultWidget(accountMenuButton); @@ -408,7 +407,7 @@ void MainWindow::repopulateAccountsMenu() QAction *action = new QAction(tr("No Default Account"), this); action->setCheckable(true); - action->setIcon(QPixmap(":/icons/toolbar/noaccount").scaled(48, 48, Qt::KeepAspectRatio)); + action->setIcon(QIcon::fromTheme("noaccount")); action->setData(""); if (active_username.isEmpty()) { @@ -462,8 +461,7 @@ void MainWindow::activeAccountChanged() } // Set the icon to the "no account" icon. - accountMenuButton->setIcon( - QPixmap(":/icons/toolbar/noaccount").scaled(48, 48, Qt::KeepAspectRatio)); + accountMenuButton->setIcon(QIcon::fromTheme("noaccount")); } bool MainWindow::eventFilter(QObject *obj, QEvent *ev) @@ -533,8 +531,9 @@ static QString convertStatus(const QString &status) void MainWindow::reloadStatus() { + m_statusRefresh->setChecked(true); MMC->statusChecker()->reloadStatus(); - updateStatusUI(); + //updateStatusUI(); } static QString makeStatusString(const QMap statuses) @@ -555,16 +554,7 @@ void MainWindow::updateStatusUI() auto statuses = statusChecker->getStatusEntries(); QString status = makeStatusString(statuses); - if(statusChecker->isLoadingStatus()) - { - m_statusRefresh->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - m_statusRefresh->setText(tr("Loading...")); - } - else - { - m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly); - m_statusRefresh->setText(tr("")); - } + m_statusRefresh->setChecked(false); m_statusRight->setText(status); @@ -574,8 +564,7 @@ void MainWindow::updateStatusUI() void MainWindow::updateStatusFailedUI() { m_statusRight->setText(makeStatusString(QMap())); - m_statusRefresh->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - m_statusRefresh->setText(tr("Failed.")); + m_statusRefresh->setChecked(false); statusTimer.start(60 * 1000); } diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui index 16e72c2f..5653907e 100644 --- a/gui/MainWindow.ui +++ b/gui/MainWindow.ui @@ -14,7 +14,7 @@ MultiMC 5 - + :/icons/multimc/scalable/apps/multimc.svg:/icons/multimc/scalable/apps/multimc.svg @@ -152,8 +152,7 @@ - - :/icons/toolbar/new:/icons/toolbar/new + Add Instance @@ -167,8 +166,7 @@ - - :/icons/toolbar/viewfolder:/icons/toolbar/viewfolder + View Instance Folder @@ -182,8 +180,7 @@ - - :/icons/toolbar/refresh:/icons/toolbar/refresh + Refresh @@ -197,8 +194,7 @@ - - :/icons/toolbar/centralmods:/icons/toolbar/centralmods + View Central Mods Folder @@ -212,8 +208,7 @@ - - :/icons/toolbar/checkupdate:/icons/toolbar/checkupdate + Check for Updates @@ -227,8 +222,7 @@ - - :/icons/toolbar/settings:/icons/toolbar/settings + Settings @@ -245,8 +239,7 @@ - - :/icons/toolbar/bug:/icons/toolbar/bug + Report a Bug @@ -260,8 +253,7 @@ - - :/icons/toolbar/news:/icons/toolbar/news + More News @@ -278,8 +270,7 @@ - - :/icons/toolbar/about:/icons/toolbar/about + About MultiMC @@ -332,7 +323,7 @@ true - + :/icons/instances/infinity:/icons/instances/infinity @@ -472,8 +463,7 @@ true - - :/icons/toolbar/cat:/icons/toolbar/cat + Meow @@ -484,8 +474,7 @@ - - :/icons/toolbar/copy:/icons/toolbar/copy + Copy Instance @@ -508,7 +497,9 @@ - + + + diff --git a/main.cpp b/main.cpp index c91af978..181d7299 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ int main_gui(MultiMC &app) { // show main window + QIcon::setThemeName("multimc"); MainWindow mainWin; mainWin.restoreState(QByteArray::fromBase64(MMC->settings()->get("MainWindowState").toByteArray())); mainWin.restoreGeometry(QByteArray::fromBase64(MMC->settings()->get("MainWindowGeometry").toByteArray())); @@ -18,7 +19,9 @@ int main(int argc, char *argv[]) // initialize Qt MultiMC app(argc, argv); - Q_INIT_RESOURCE(graphics); + Q_INIT_RESOURCE(instances); + Q_INIT_RESOURCE(multimc); + Q_INIT_RESOURCE(backgrounds); switch (app.status()) { diff --git a/resources/icons/MultiMC.ico b/resources/MultiMC.ico similarity index 100% rename from resources/icons/MultiMC.ico rename to resources/MultiMC.ico diff --git a/resources/XdgIcon.theme b/resources/XdgIcon.theme deleted file mode 100644 index ad26482e..00000000 --- a/resources/XdgIcon.theme +++ /dev/null @@ -1,12 +0,0 @@ -[Icon Theme] -Name=MultiMC -Comment=MultiMC Default Icons -Inherits=default -Directories=scalable/apps - -[scalable/apps] -Size=48 -Type=scalable -MinSize=1 -MaxSize=512 -Context=Applications diff --git a/resources/backgrounds/backgrounds.qrc b/resources/backgrounds/backgrounds.qrc new file mode 100644 index 00000000..55de139e --- /dev/null +++ b/resources/backgrounds/backgrounds.qrc @@ -0,0 +1,6 @@ + + + + catbgrnd2.png + + diff --git a/resources/catbgrnd2.png b/resources/backgrounds/catbgrnd2.png similarity index 100% rename from resources/catbgrnd2.png rename to resources/backgrounds/catbgrnd2.png diff --git a/resources/icons/instances/brick.png b/resources/instances/brick.png similarity index 100% rename from resources/icons/instances/brick.png rename to resources/instances/brick.png diff --git a/resources/icons/instances/chicken.png b/resources/instances/chicken.png similarity index 100% rename from resources/icons/instances/chicken.png rename to resources/instances/chicken.png diff --git a/resources/icons/instances/chicken128.png b/resources/instances/chicken128.png similarity index 100% rename from resources/icons/instances/chicken128.png rename to resources/instances/chicken128.png diff --git a/resources/icons/instances/creeper.png b/resources/instances/creeper.png similarity index 100% rename from resources/icons/instances/creeper.png rename to resources/instances/creeper.png diff --git a/resources/icons/instances/creeper128.png b/resources/instances/creeper128.png similarity index 100% rename from resources/icons/instances/creeper128.png rename to resources/instances/creeper128.png diff --git a/resources/icons/instances/derp.png b/resources/instances/derp.png similarity index 100% rename from resources/icons/instances/derp.png rename to resources/instances/derp.png diff --git a/resources/icons/instances/diamond.png b/resources/instances/diamond.png similarity index 100% rename from resources/icons/instances/diamond.png rename to resources/instances/diamond.png diff --git a/resources/icons/instances/dirt.png b/resources/instances/dirt.png similarity index 100% rename from resources/icons/instances/dirt.png rename to resources/instances/dirt.png diff --git a/resources/icons/instances/enderman.png b/resources/instances/enderman.png similarity index 100% rename from resources/icons/instances/enderman.png rename to resources/instances/enderman.png diff --git a/resources/icons/instances/enderpearl.png b/resources/instances/enderpearl.png similarity index 100% rename from resources/icons/instances/enderpearl.png rename to resources/instances/enderpearl.png diff --git a/resources/icons/instances/enderpearl128.png b/resources/instances/enderpearl128.png similarity index 100% rename from resources/icons/instances/enderpearl128.png rename to resources/instances/enderpearl128.png diff --git a/resources/icons/instances/ftb_glow.png b/resources/instances/ftb_glow.png similarity index 100% rename from resources/icons/instances/ftb_glow.png rename to resources/instances/ftb_glow.png diff --git a/resources/icons/instances/ftb_glow128.png b/resources/instances/ftb_glow128.png similarity index 100% rename from resources/icons/instances/ftb_glow128.png rename to resources/instances/ftb_glow128.png diff --git a/resources/icons/instances/ftb_logo.png b/resources/instances/ftb_logo.png similarity index 100% rename from resources/icons/instances/ftb_logo.png rename to resources/instances/ftb_logo.png diff --git a/resources/icons/instances/ftb_logo128.png b/resources/instances/ftb_logo128.png similarity index 100% rename from resources/icons/instances/ftb_logo128.png rename to resources/instances/ftb_logo128.png diff --git a/resources/icons/instances/gear.png b/resources/instances/gear.png similarity index 100% rename from resources/icons/instances/gear.png rename to resources/instances/gear.png diff --git a/resources/icons/instances/gear128.png b/resources/instances/gear128.png similarity index 100% rename from resources/icons/instances/gear128.png rename to resources/instances/gear128.png diff --git a/resources/icons/instances/gold.png b/resources/instances/gold.png similarity index 100% rename from resources/icons/instances/gold.png rename to resources/instances/gold.png diff --git a/resources/icons/instances/grass.png b/resources/instances/grass.png similarity index 100% rename from resources/icons/instances/grass.png rename to resources/instances/grass.png diff --git a/resources/icons/instances/herobrine.png b/resources/instances/herobrine.png similarity index 100% rename from resources/icons/instances/herobrine.png rename to resources/instances/herobrine.png diff --git a/resources/icons/instances/herobrine128.png b/resources/instances/herobrine128.png similarity index 100% rename from resources/icons/instances/herobrine128.png rename to resources/instances/herobrine128.png diff --git a/resources/icons/instances/infinity.png b/resources/instances/infinity.png similarity index 100% rename from resources/icons/instances/infinity.png rename to resources/instances/infinity.png diff --git a/resources/icons/instances/infinity128.png b/resources/instances/infinity128.png similarity index 100% rename from resources/icons/instances/infinity128.png rename to resources/instances/infinity128.png diff --git a/resources/instances/instances.qrc b/resources/instances/instances.qrc new file mode 100644 index 00000000..e9d22c78 --- /dev/null +++ b/resources/instances/instances.qrc @@ -0,0 +1,30 @@ + + + + brick.png + chicken128.png + creeper128.png + derp.png + diamond.png + dirt.png + enderman.png + enderpearl128.png + ftb_glow128.png + ftb_logo128.png + gear128.png + gold.png + grass.png + herobrine128.png + infinity128.png + iron.png + magitech128.png + meat128.png + netherstar128.png + planks.png + skeleton128.png + squarecreeper128.png + steve128.png + stone.png + tnt.png + + diff --git a/resources/icons/instances/iron.png b/resources/instances/iron.png similarity index 100% rename from resources/icons/instances/iron.png rename to resources/instances/iron.png diff --git a/resources/icons/instances/magitech.png b/resources/instances/magitech.png similarity index 100% rename from resources/icons/instances/magitech.png rename to resources/instances/magitech.png diff --git a/resources/icons/instances/magitech128.png b/resources/instances/magitech128.png similarity index 100% rename from resources/icons/instances/magitech128.png rename to resources/instances/magitech128.png diff --git a/resources/icons/instances/meat.png b/resources/instances/meat.png similarity index 100% rename from resources/icons/instances/meat.png rename to resources/instances/meat.png diff --git a/resources/icons/instances/meat128.png b/resources/instances/meat128.png similarity index 100% rename from resources/icons/instances/meat128.png rename to resources/instances/meat128.png diff --git a/resources/icons/instances/netherstar.png b/resources/instances/netherstar.png similarity index 100% rename from resources/icons/instances/netherstar.png rename to resources/instances/netherstar.png diff --git a/resources/icons/instances/netherstar128.png b/resources/instances/netherstar128.png similarity index 100% rename from resources/icons/instances/netherstar128.png rename to resources/instances/netherstar128.png diff --git a/resources/icons/instances/planks.png b/resources/instances/planks.png similarity index 100% rename from resources/icons/instances/planks.png rename to resources/instances/planks.png diff --git a/resources/icons/instances/skeleton.png b/resources/instances/skeleton.png similarity index 100% rename from resources/icons/instances/skeleton.png rename to resources/instances/skeleton.png diff --git a/resources/icons/instances/skeleton128.png b/resources/instances/skeleton128.png similarity index 100% rename from resources/icons/instances/skeleton128.png rename to resources/instances/skeleton128.png diff --git a/resources/icons/instances/squarecreeper.png b/resources/instances/squarecreeper.png similarity index 100% rename from resources/icons/instances/squarecreeper.png rename to resources/instances/squarecreeper.png diff --git a/resources/icons/instances/squarecreeper128.png b/resources/instances/squarecreeper128.png similarity index 100% rename from resources/icons/instances/squarecreeper128.png rename to resources/instances/squarecreeper128.png diff --git a/resources/icons/instances/steve.png b/resources/instances/steve.png similarity index 100% rename from resources/icons/instances/steve.png rename to resources/instances/steve.png diff --git a/resources/icons/instances/steve128.png b/resources/instances/steve128.png similarity index 100% rename from resources/icons/instances/steve128.png rename to resources/instances/steve128.png diff --git a/resources/icons/instances/stone.png b/resources/instances/stone.png similarity index 100% rename from resources/icons/instances/stone.png rename to resources/instances/stone.png diff --git a/resources/icons/instances/tnt.png b/resources/instances/tnt.png similarity index 100% rename from resources/icons/instances/tnt.png rename to resources/instances/tnt.png diff --git a/resources/multimc/16x16/noaccount.png b/resources/multimc/16x16/noaccount.png new file mode 100644 index 0000000000000000000000000000000000000000..b49bcf36ae68fbc9bc5225702f87c678edd51987 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9-}a`f&6Ke=0u>-TTd6q5RLP5C)u8Jbr5NjuQy+JgQ1l-qWPXvUj5{Uw- znYpao#%eBfQA0$;e7f-ltwn2w`fd-dBpK^f6QDJsf zPa(^XyVf-%N&po%yx!$-d)udje|ehz{;g{~|D5^9KK+}%ml-POF=x)QJ0;*M_`rfM zAyO=0+R~i%M2kigQu&X%Q~loCIIIMf~Nog literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/refresh.png b/resources/multimc/16x16/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..dc66b824fb1b40194cadfc8a0962c9624505b62c GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3^B*n9%f)*PW5zg46!)vJ2~5D zYAM69`v2c+|3A0Yf4)euv+rI)p) z-7UG|e=sC4%O#u=a^|n`xhGdFK4<#@52fyd*BE(w|GVot>q+Sei94RVzB)DXEDf)2rs&-7c%WI^E;=0>keT@jSfCjBcLUv(Wpjo<*IG(CQnv zuc@VP@m$C6_u*N)x}Ep)&Fm8nW-iYAy6jm+D(~Z$UQ*NK68^t@UN>`}@mC(T?VgDf z)nkHZzPP_@W!>MW+RQV%z?J_Yj(>VjN3b_C;h=PiC+`7-D>veF*#@3b3pZhY)UvN3`;cM{vEv5Fi?_F|g zl}oND_RcxG>d14)$R#_sy*#CPG%?+$*v`*dq#UWU)_?Hf}XWPg^$*_Bkin>}&$S+;!(Yy7>Ji(M8m zQWU#v=H1txtX;IK!J#1_W1ruhT!mWiOCK*@?7X<~y)~yOFXy+G17A&wUfpQSjb$&l z-8Wfl^(5ivRd44nJ669nC4ysV_B!VJ^ZIvw8e7)g{Cdak%mbYu_YJ#W+}FP$^z72^ z_tD=kO#CMMw$u3U-u?f}ULP~-`M@+!FYuCc+omVeYM4&YM5rDpE^6t@z*F2+Vz|C9V-A$wjG&C8@e8K!U-@ zz`#=1&`{UVG{n%%%D}?P#8B73+{(Z}W!=LEFbyD;RuEl44Tc7~21dF@1|deqRz_x4 zh87SF>2GX-#R9|zu!h|Hl+3hBs0N@7h9L%)K-E^p<`4}FlDyskHJE~&wH$SgfFTW^VKL?_uSl`Dzz(?Om&rsj`;1&s(jS$NS_^Dcc z`W2uCNsx`f`DrEPiAAXljw$&`sS2LCiRr09sfj6-g(p*OfQon_ib{);QyKh9%kpy) z*Z7-$1WK47B;rGZd|*y4FE7{2OwP~K&CbkA*8@6Szn~~TD>b>KSU(S}UBAqB3#dS4 N@O1TaS?83{1OW6PPQL&E literal 0 HcmV?d00001 diff --git a/resources/icons/toolbar/about.png b/resources/multimc/22x22/about.png similarity index 100% rename from resources/icons/toolbar/about.png rename to resources/multimc/22x22/about.png diff --git a/resources/icons/toolbar/ReportBug.png b/resources/multimc/22x22/bug.png similarity index 100% rename from resources/icons/toolbar/ReportBug.png rename to resources/multimc/22x22/bug.png diff --git a/resources/icons/toolbar/centralmods.png b/resources/multimc/22x22/centralmods.png similarity index 100% rename from resources/icons/toolbar/centralmods.png rename to resources/multimc/22x22/centralmods.png diff --git a/resources/icons/toolbar/checkupdate.png b/resources/multimc/22x22/checkupdate.png similarity index 100% rename from resources/icons/toolbar/checkupdate.png rename to resources/multimc/22x22/checkupdate.png diff --git a/resources/icons/toolbar/InstCopy.png b/resources/multimc/22x22/copy.png similarity index 100% rename from resources/icons/toolbar/InstCopy.png rename to resources/multimc/22x22/copy.png diff --git a/resources/icons/toolbar/help.png b/resources/multimc/22x22/help.png similarity index 100% rename from resources/icons/toolbar/help.png rename to resources/multimc/22x22/help.png diff --git a/resources/icons/toolbar/new.png b/resources/multimc/22x22/new.png similarity index 100% rename from resources/icons/toolbar/new.png rename to resources/multimc/22x22/new.png diff --git a/resources/icons/toolbar/NewsIcon.png b/resources/multimc/22x22/news.png similarity index 100% rename from resources/icons/toolbar/NewsIcon.png rename to resources/multimc/22x22/news.png diff --git a/resources/icons/toolbar/refresh.png b/resources/multimc/22x22/refresh.png similarity index 100% rename from resources/icons/toolbar/refresh.png rename to resources/multimc/22x22/refresh.png diff --git a/resources/icons/toolbar/settings.png b/resources/multimc/22x22/settings.png similarity index 100% rename from resources/icons/toolbar/settings.png rename to resources/multimc/22x22/settings.png diff --git a/resources/icons/toolbar/viewfolder.png b/resources/multimc/22x22/viewfolder.png similarity index 100% rename from resources/icons/toolbar/viewfolder.png rename to resources/multimc/22x22/viewfolder.png diff --git a/resources/icons/toolbar/Cat.png b/resources/multimc/24x24/cat.png similarity index 100% rename from resources/icons/toolbar/Cat.png rename to resources/multimc/24x24/cat.png diff --git a/resources/multimc/24x24/noaccount.png b/resources/multimc/24x24/noaccount.png new file mode 100644 index 0000000000000000000000000000000000000000..ac12437cf9565c0cd340eb6b7b5c92a36d3350ce GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9oCO|{#S9GG!XV7ZFl!D-1$&97 zuPggKMqy?{p*4Ny<^qMjd%8G=Se!n4#rB-Lg8IG`vyB)FFmj=H{pJ{!z7i2NU;U0 zv;r4!%8d>S(5D$TL9qiRx@DgxMVGN#?{e5qLQ{~UzZ>e1*+4DNQpXa z^uui-*6W*5R9linH|_&Of>OM^Dm;C)tLf4!TmeF z2m*+GGv73+bwu_B+u$-<5omN08~1Brufy3l=(9|G>PfHkJ6r4?oKd!LKF(A*lfAtg zE#Fcu3)0iF;7MgrjDMs})jTv7O}6Utjor4T9mSmvM= zCdZ+npcm7Y8?9Vu?tY{=9NMS3L`J2fI8%Npj~FP}mT;D&}V2+Gj29MP)f zLiz*#^%n=8ZoT9O5Xkt*)7xcM`LBpg9cVaQ;U46Z8t}JTSFBr=qhc=DH5Gz%Fq4Vt z7x#_5)OyrYKYJr@_uNnh?~%L9<>^={IqBr~vZOK*<1(X{6iwmzoKs7KAs*v{;GGkuclw}M0S*4#QegE>-f%oPgi z0Jj&3e=HugEb~tndCr|$^01$5OSsEDP*rxMxaE9GizCIwS72wfM-@fRq4vzoD@9r1 zi^6Dfr2owT1_>zYFs16|Uq=Fh#YKR@xw7kaD1kwDN*$x5h% z&2+zCI8OC1e%)9e8knyF_PXf#L4;XV9@m=e@+xS<^?B;ZoQfN{debBq6r{w~JCc!x zmCA=Y$Gw|xTjY>=iR6b3do}7W6vSKW`4^0QbFt(Z6!kR&-5XAO!^Ux1%z?Z-*8GDCdI8042HN8cbuIEf^|+Egj@Ec65QF4*KEcl3 zPuq5n!}U46*eD!+H1X*r~2{kiSm;oA9kP47|97>=pgkq6O}7^?BCm&+vV8=w}$*N1XP!vtp~Slp!DQ(D{oIw_vIH&x#Q3 zsH}9e563jq+yaAnv=}~a_pMBTg5bmZWUOoalLR3Te4ycaxksB>!SpRCD{A*mUnX|W2HtT)kY=2oX>z1)o7kbA{{^)C^X>Ji`@LNTyOL4rI zSnDxGH?M1r+?g$Iikr|0%ex8&@93V5KKO0lDd-LpG%I-5u4`IB4H_(kl2SI-C=*9Y z_rzC$lO0e;)Hd+xKxRHBNB__Hv`(Wp#t-cSgyuWMC$w9PeIxDeU{%x#Hn zxv|3jB$lrFBE);tG>%7Xk&ngSW*X>p51YP;H4mdGfqKS9eN5siX6=UAKPL3I|8KC;|mVAv{sW7!(?VJhTarCaomZZqs1{2%`j&gJS*zAfZU4C&CBodBuJcfg#U`V*d zv-0&Kx$&k=v;Xs^pq$dD5@6T5qX#93&Iq6p0k(mZGsHd4VF4tfJ240zDEQ WzJbG|tjgE_2>@rTn*-O*Kk479BfUug literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/noaccount.png b/resources/multimc/32x32/noaccount.png new file mode 100644 index 0000000000000000000000000000000000000000..a73afc946064d63f20a6077980c4c5266a5a7bdc GIT binary patch literal 363 zcmV-x0hIoUP)Zx9=x zumNk(TZmp1_CT*x*oG+8wm>AJQ79;oV5&KDi!U*+c*RWaseY1sBl(UiS8yEX^_}aw zU`dkT<2c~+JYi83VOf^p`@VnHygr=2{{oqvI~#V^x~{{TrjhHHWubfG9XxixKE!bh ztEvi{rU|d>3JZb&Ptyb!MZr7xeS{=Q$ZvexHds*ymSCng-7E98S}ecksqJh@uD&mSw?)VZdcslAC?shr6zW$8qExym1cLe@@@` za8*^X=XvDjEX&9>?462t@Z7;L4CLLEO#PMUY{m@noWSN~~%;+Fsb002ov JPDHLkV1j7!pNs$i literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/refresh.png b/resources/multimc/32x32/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0c391323e7e5d04d842d6ab027b87d91b873e1 GIT binary patch literal 2822 zcmai$X*d*W8^_0XtO+eBCu1LKR%`ZQY}uw7LdY0Hj4^|;%f5t^-BBd_+8Ap>RI;U$ zwGLuzSsSvZP~NHDbG;wm=eq9a|19_K`rps>e7O_Q7DmT-&hP*LfMX`cs4Gkb{tT`^ zn6qzi@D5Yh-H_%;0HCHBdyxuZZ8z%>w|qewd(;7@N+=*&$?%!Rh#pb&Y`aH`1@n^jJS~pafI0g&Yenv|fI4 zr@RgI+)o%43bv!hKDthQzN*lSF92Stqn1EutO~1hyn_+6twc@sNNIL1?i5|tzBeD? z_d;6t?r{SJURCa5@>avW0>Y=3CU4|ReUxp-jO*A~on}AO0XFH;HFfiYe03c~Q zf5q5~4r*l2;~wiVWPwp}m|hFUJP$d%Xtzt#(s8_rN&5!HHKAXS=KdmwVBnAYJ|ba(Awr zo2j41_~nUdL7ro5_UZ4m7QW%3TJ0r)ArQxb`rL_@Y>hgs)xrQ^Fe26@#u3ylXOp1+ zJwg7dd%IG{fLY3BmGI_gyO)KY21`wOTq{=@|4buhCL%9v4Fs5nhb(S1YP6f6-=DIi zRr*X@E0LEGu{>%o(#QI8qj zk0FVS=onnGFk9~IZCx{?a-T}B5fpLW-cUy86@yz5W$rL#e*FuvgY#Z4+n6w$CM(zB zm}Yi%x+<1Fwe8~N%3sCS52~~^imvPtI%hw;-4#xN%DIZ=_oF#noFM%i?JGx87su^Z)!sCir;S z2D`1lHn7?)cwQg)Av776-y_CJ=H)^tl{xfib4>Aos%<+bR+TBH%P+(yEDGA%600Wq;PY4ax5M7GmR-7laqg#2(oOm0&4r;{|eA z6yKyHm92DAN%$O)t`MC4y(dxCIoK8Zp$Gn^ncXyqALuF{Q};j$n-#VVCxzCk)pgV{ zaIi)4;a7;d9c`anWpb7i-CV3RQpGAacEuW%=8>dJYYfwv&LSemJx;8(UK>I4StOwg zoJ@f2uh&Gmu!&Y5cx;CbS7vo#G_LGj*;f|n=`0o}x9VRAMz9QX7~5PMW(7Jl746J+ zeaN!=Ec~oyXFT3efG7UN!sAC0kI3v?X}V>F1{~gEgK_Wg$E}Vi6D|jv13lCe(QXJ7 z;A%V!!!`u6xR1^%Sw(UrvP#?;_sZ{)8O>kLnE5#Z68(3T-=>3=(3Y~aivel(zIpj0WEN*7W% zuqQg5@9h{i1*NDq6VAUYm5Qq+`N(w-2OHZD(H z&rN(sYi)>$>n_Df?-wnZZjPrP0Od_+wHvZmn;pfpolr-jMMrwp2b6|}p}TSAtC2$6 zmjw^({iKoHd?V>o;4y`TLE{)aE>p$EMpEcP-{4zck%OjFCpBkuj&Ixm5>fMeXxE_L8P4EP`e0Iaj39;{#KqWbu7lfG7RNwwl-61?h*sY)NgG9oRNEHI zUlV4Zy?JMKKe()=w6u<@P1EnmEos&wcryg(DoaGV`t#4!2q_lhy&LhJzHGkRJf)}2 z;K7TI$?kt0eyYmU>|kW-k9o*U+%Alnxii|`1!ASnJ28+V2emjBK3=oqp8M3s2KO%6 z5`Ch8%YzGrZ+9+)FUA~fhvzH#Z>&|1?Qqm*bu^s;cc+g+ZcDv-3gIRnoaFqXAe4p_ zi8!l5>Tsbq(M8uhW9afTYRKZf4^ANTw!`>Ch?QSs#cpykL+grlX;JN|u~b;9tU>X` z^;uT~Ty*zVcQ(C^^RD&gRsV1FjkjjxGE>%fY{e>NIS>+Z)L+G;ON6ICDmyP+v^A7u zBNX+v)Ucw+F6XQmXKWU>!CwDc#qtsFhR$feX!6`9dW6{$$xsYzC^#QHmVyVnFed;4 z2D=D`Bfu~<3>=}Ztf>BTt*XvE73xX&7xmN2BL6!6Hv2zsaxJQT#soxvI$kBY zQUb6(cmUFc z#q8gb0|Ejd?l_VcnBeZ^24NNsCHs&(@HmPu)aw@x_19|n+35mI3@lJoJ*TMu0B3U+ AN&o-= literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/noaccount.png b/resources/multimc/48x48/noaccount.png new file mode 100644 index 0000000000000000000000000000000000000000..4703796c7187bb7f852b4040d83d55b9f517ab4e GIT binary patch literal 387 zcmV-}0et?6P)D|d7k(AKF{-j zD2f7dT^GoG-ypIqgQ%(s^1d&A_4#8%fhf>#M`b(34%;BpG(il*;GVN>8^4>hG72PI z%UDX&6hzl`5Zksv_I(GDBnf0$7Lcl{Xk`>g^gvRUW!zioI1Ug^(?HgB1#w*$r0;uL z83p=>cNyEMIF3Q0C<5_)pWCUf>p;q~1j+N9Rz`t@zsr&&0dgD%#Ih`qx~{oLhhYdZ z3Y{*{tb@f2+}kSNDu_vql=>8e#O3C(#j~1crBZz3Fs%Uj&0j=`@+t7 ho?M}oQ6S+0eF5BMSRWi{S5N=|002ovPDHLkV1o4Zo}2&x literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/refresh.png b/resources/multimc/48x48/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..f81b8d674cba6aca4aaa458fd3c93fcadec969c4 GIT binary patch literal 3922 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 KhE@7bk^ckTKJ|Y9 literal 0 HcmV?d00001 diff --git a/resources/icons/toolbar/NoAccount.png b/resources/multimc/8x8/noaccount.png similarity index 100% rename from resources/icons/toolbar/NoAccount.png rename to resources/multimc/8x8/noaccount.png diff --git a/resources/multimc/index.theme b/resources/multimc/index.theme new file mode 100644 index 00000000..d7d460c7 --- /dev/null +++ b/resources/multimc/index.theme @@ -0,0 +1,30 @@ +[Icon Theme] +Name=multimc +Comment=MultiMC Default Icons +Inherits=default +Directories=scalable/apps,8x8,16x16,22x22,24x24,32x32,48x48 + +[scalable/apps] +Size=48 +Type=scalable +MinSize=1 +MaxSize=512 +Context=Applications + +[8x8] +Size=8 + +[16x16] +Size=16 + +[22x22] +Size=22 + +[24x24] +Size=24 + +[32x32] +Size=32 + +[48x48] +Size=48 diff --git a/resources/multimc/multimc.qrc b/resources/multimc/multimc.qrc new file mode 100644 index 00000000..bacd1f76 --- /dev/null +++ b/resources/multimc/multimc.qrc @@ -0,0 +1,32 @@ + + + + index.theme + scalable/apps/multimc.svg + scalable/console.svg + scalable/console_error.svg + scalable/bug.svg + scalable/news.svg + 22x22/about.png + 22x22/bug.png + 22x22/centralmods.png + 22x22/checkupdate.png + 22x22/help.png + 22x22/new.png + 22x22/copy.png + 22x22/news.png + 16x16/refresh.png + 22x22/refresh.png + 24x24/refresh.png + 32x32/refresh.png + 48x48/refresh.png + 22x22/settings.png + 22x22/viewfolder.png + 24x24/cat.png + 8x8/noaccount.png + 16x16/noaccount.png + 24x24/noaccount.png + 32x32/noaccount.png + 48x48/noaccount.png + + diff --git a/resources/icons/multimc.svg b/resources/multimc/scalable/apps/multimc.svg similarity index 100% rename from resources/icons/multimc.svg rename to resources/multimc/scalable/apps/multimc.svg diff --git a/resources/icons/toolbar_svg/bug.svg b/resources/multimc/scalable/bug.svg similarity index 100% rename from resources/icons/toolbar_svg/bug.svg rename to resources/multimc/scalable/bug.svg diff --git a/resources/icons/console.svg b/resources/multimc/scalable/console.svg similarity index 100% rename from resources/icons/console.svg rename to resources/multimc/scalable/console.svg diff --git a/resources/icons/console_error.svg b/resources/multimc/scalable/console_error.svg similarity index 100% rename from resources/icons/console_error.svg rename to resources/multimc/scalable/console_error.svg diff --git a/resources/icons/toolbar_svg/news.svg b/resources/multimc/scalable/news.svg similarity index 100% rename from resources/icons/toolbar_svg/news.svg rename to resources/multimc/scalable/news.svg diff --git a/resources/icons/instances_svg/clucker.svg b/resources/sources/clucker.svg similarity index 100% rename from resources/icons/instances_svg/clucker.svg rename to resources/sources/clucker.svg diff --git a/resources/icons/instances_svg/creeper.svg b/resources/sources/creeper.svg similarity index 100% rename from resources/icons/instances_svg/creeper.svg rename to resources/sources/creeper.svg diff --git a/resources/icons/instances_svg/enderpearl.svg b/resources/sources/enderpearl.svg similarity index 100% rename from resources/icons/instances_svg/enderpearl.svg rename to resources/sources/enderpearl.svg diff --git a/resources/icons/instances_svg/ftb-glow.svg b/resources/sources/ftb-glow.svg similarity index 100% rename from resources/icons/instances_svg/ftb-glow.svg rename to resources/sources/ftb-glow.svg diff --git a/resources/icons/instances_svg/ftb-logo.svg b/resources/sources/ftb-logo.svg similarity index 100% rename from resources/icons/instances_svg/ftb-logo.svg rename to resources/sources/ftb-logo.svg diff --git a/resources/icons/instances_svg/gear.svg b/resources/sources/gear.svg similarity index 100% rename from resources/icons/instances_svg/gear.svg rename to resources/sources/gear.svg diff --git a/resources/icons/instances_svg/herobrine.svg b/resources/sources/herobrine.svg similarity index 100% rename from resources/icons/instances_svg/herobrine.svg rename to resources/sources/herobrine.svg diff --git a/resources/icons/instances_svg/magitech.svg b/resources/sources/magitech.svg similarity index 100% rename from resources/icons/instances_svg/magitech.svg rename to resources/sources/magitech.svg diff --git a/resources/icons/instances_svg/meat.svg b/resources/sources/meat.svg similarity index 100% rename from resources/icons/instances_svg/meat.svg rename to resources/sources/meat.svg diff --git a/resources/icons/instances_svg/netherstar.svg b/resources/sources/netherstar.svg similarity index 100% rename from resources/icons/instances_svg/netherstar.svg rename to resources/sources/netherstar.svg diff --git a/resources/icons/instances_svg/pskeleton.svg b/resources/sources/pskeleton.svg similarity index 100% rename from resources/icons/instances_svg/pskeleton.svg rename to resources/sources/pskeleton.svg diff --git a/resources/icons/instances_svg/skeleton.svg b/resources/sources/skeleton.svg similarity index 100% rename from resources/icons/instances_svg/skeleton.svg rename to resources/sources/skeleton.svg diff --git a/resources/icons/instances_svg/squarecreeper.svg b/resources/sources/squarecreeper.svg similarity index 100% rename from resources/icons/instances_svg/squarecreeper.svg rename to resources/sources/squarecreeper.svg diff --git a/resources/sources/status-bad.svg b/resources/sources/status-bad.svg new file mode 100644 index 00000000..54334e06 --- /dev/null +++ b/resources/sources/status-bad.svg @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/resources/sources/status-good.svg b/resources/sources/status-good.svg new file mode 100644 index 00000000..3b311806 --- /dev/null +++ b/resources/sources/status-good.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/resources/sources/status-terrible.svg b/resources/sources/status-terrible.svg new file mode 100644 index 00000000..b0de7bfd --- /dev/null +++ b/resources/sources/status-terrible.svg @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/resources/icons/instances_svg/steve.svg b/resources/sources/steve.svg similarity index 100% rename from resources/icons/instances_svg/steve.svg rename to resources/sources/steve.svg From 2fe033c4a0bcdb0972046e1b55b0cf463075dc24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 19 Jan 2014 05:21:09 +0100 Subject: [PATCH 39/45] Move a bunch of resources into the resources folder. Also, cat is no longer mysterious. It's just FLUFFY! --- CMakeLists.txt | 4 ++-- gui/MainWindow.ui | 2 +- MultiMC.icns => resources/MultiMC.icns | Bin MultiMC.manifest => resources/MultiMC.manifest | 0 multimc.rc => resources/multimc.rc | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename MultiMC.icns => resources/MultiMC.icns (100%) rename MultiMC.manifest => resources/MultiMC.manifest (100%) rename multimc.rc => resources/multimc.rc (90%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2ccdab0..9efb4cd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -528,7 +528,7 @@ resources/instances/instances.qrc ######## Windows resource files ######## IF(WIN32) -SET(MULTIMC_RCS multimc.rc) +SET(MULTIMC_RCS resources/multimc.rc) ENDIF() ####### X11 Stuff ####### @@ -670,7 +670,7 @@ FILE(WRITE \"\${CMAKE_INSTALL_PREFIX}/${QTCONF_DEST_DIR}/qt.conf\" \"\") # ICNS file for OS X IF(APPLE) - INSTALL(FILES MultiMC.icns DESTINATION MultiMC.app/Contents/Resources) + INSTALL(FILES resources/MultiMC.icns DESTINATION MultiMC.app/Contents/Resources) ENDIF() CONFIGURE_FILE( diff --git a/gui/MainWindow.ui b/gui/MainWindow.ui index 5653907e..25af6f60 100644 --- a/gui/MainWindow.ui +++ b/gui/MainWindow.ui @@ -469,7 +469,7 @@ Meow - <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnarok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> + <html><head/><body><p align="center">It's a fluffy kitty :3</p></body></html> diff --git a/MultiMC.icns b/resources/MultiMC.icns similarity index 100% rename from MultiMC.icns rename to resources/MultiMC.icns diff --git a/MultiMC.manifest b/resources/MultiMC.manifest similarity index 100% rename from MultiMC.manifest rename to resources/MultiMC.manifest diff --git a/multimc.rc b/resources/multimc.rc similarity index 90% rename from multimc.rc rename to resources/multimc.rc index 2140e3f4..ca92e2c3 100644 --- a/multimc.rc +++ b/resources/multimc.rc @@ -3,7 +3,7 @@ #endif #include -IDI_ICON1 ICON DISCARDABLE "resources/icons/MultiMC.ico" +IDI_ICON1 ICON DISCARDABLE "MultiMC.ico" 1 RT_MANIFEST "MultiMC.manifest" VS_VERSION_INFO VERSIONINFO From 498bb4833808399c8c7c84ebdd41fec6ef0fa6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 19 Jan 2014 13:52:44 +0100 Subject: [PATCH 40/45] Add more scales to toolbar icons --- resources/instances/instances.qrc | 23 +- resources/multimc/16x16/about.png | Bin 0 -> 1270 bytes resources/multimc/16x16/bug.png | Bin 0 -> 734 bytes resources/multimc/16x16/centralmods.png | Bin 0 -> 1145 bytes resources/multimc/16x16/checkupdate.png | Bin 0 -> 1212 bytes resources/multimc/16x16/copy.png | Bin 0 -> 957 bytes resources/multimc/16x16/help.png | Bin 0 -> 1297 bytes resources/multimc/16x16/new.png | Bin 0 -> 1175 bytes resources/multimc/16x16/news.png | Bin 0 -> 727 bytes resources/multimc/16x16/settings.png | Bin 0 -> 1410 bytes resources/multimc/16x16/viewfolder.png | Bin 0 -> 852 bytes resources/multimc/22x22/copy.png | Bin 297 -> 1004 bytes resources/multimc/24x24/about.png | Bin 0 -> 2051 bytes resources/multimc/24x24/bug.png | Bin 0 -> 1290 bytes resources/multimc/24x24/centralmods.png | Bin 0 -> 1787 bytes resources/multimc/24x24/checkupdate.png | Bin 0 -> 1632 bytes resources/multimc/24x24/copy.png | Bin 0 -> 1417 bytes resources/multimc/24x24/help.png | Bin 0 -> 2089 bytes resources/multimc/24x24/new.png | Bin 0 -> 1468 bytes resources/multimc/24x24/news.png | Bin 0 -> 1295 bytes resources/multimc/24x24/settings.png | Bin 0 -> 2109 bytes resources/multimc/24x24/viewfolder.png | Bin 0 -> 1235 bytes resources/multimc/32x32/about.png | Bin 0 -> 2658 bytes resources/multimc/32x32/bug.png | Bin 0 -> 1772 bytes resources/multimc/32x32/centralmods.png | Bin 0 -> 2119 bytes resources/multimc/32x32/checkupdate.png | Bin 0 -> 2480 bytes resources/multimc/32x32/copy.png | Bin 0 -> 1401 bytes resources/multimc/32x32/help.png | Bin 0 -> 2720 bytes resources/multimc/32x32/new.png | Bin 0 -> 1769 bytes resources/multimc/32x32/news.png | Bin 0 -> 1752 bytes resources/multimc/32x32/settings.png | Bin 0 -> 2983 bytes resources/multimc/32x32/viewfolder.png | Bin 0 -> 1518 bytes resources/multimc/48x48/about.png | Bin 0 -> 3995 bytes resources/multimc/48x48/bug.png | Bin 0 -> 3124 bytes resources/multimc/48x48/centralmods.png | Bin 0 -> 3201 bytes resources/multimc/48x48/checkupdate.png | Bin 0 -> 4196 bytes resources/multimc/48x48/copy.png | Bin 0 -> 1952 bytes resources/multimc/48x48/help.png | Bin 0 -> 4170 bytes resources/multimc/48x48/new.png | Bin 0 -> 2870 bytes resources/multimc/48x48/news.png | Bin 0 -> 3333 bytes resources/multimc/48x48/settings.png | Bin 0 -> 4797 bytes resources/multimc/48x48/viewfolder.png | Bin 0 -> 1945 bytes resources/multimc/multimc.qrc | 84 ++++- resources/multimc/scalable/centralmods.svg | 346 +++++++++++++++++++++ resources/multimc/scalable/checkupdate.svg | 167 ++++++++++ resources/multimc/scalable/new.svg | 127 ++++++++ resources/multimc/scalable/viewfolder.svg | 122 ++++++++ 47 files changed, 855 insertions(+), 14 deletions(-) create mode 100644 resources/multimc/16x16/about.png create mode 100644 resources/multimc/16x16/bug.png create mode 100644 resources/multimc/16x16/centralmods.png create mode 100644 resources/multimc/16x16/checkupdate.png create mode 100644 resources/multimc/16x16/copy.png create mode 100644 resources/multimc/16x16/help.png create mode 100644 resources/multimc/16x16/new.png create mode 100644 resources/multimc/16x16/news.png create mode 100644 resources/multimc/16x16/settings.png create mode 100644 resources/multimc/16x16/viewfolder.png create mode 100644 resources/multimc/24x24/about.png create mode 100644 resources/multimc/24x24/bug.png create mode 100644 resources/multimc/24x24/centralmods.png create mode 100644 resources/multimc/24x24/checkupdate.png create mode 100644 resources/multimc/24x24/copy.png create mode 100644 resources/multimc/24x24/help.png create mode 100644 resources/multimc/24x24/new.png create mode 100644 resources/multimc/24x24/news.png create mode 100644 resources/multimc/24x24/settings.png create mode 100644 resources/multimc/24x24/viewfolder.png create mode 100644 resources/multimc/32x32/about.png create mode 100644 resources/multimc/32x32/bug.png create mode 100644 resources/multimc/32x32/centralmods.png create mode 100644 resources/multimc/32x32/checkupdate.png create mode 100644 resources/multimc/32x32/copy.png create mode 100644 resources/multimc/32x32/help.png create mode 100644 resources/multimc/32x32/new.png create mode 100644 resources/multimc/32x32/news.png create mode 100644 resources/multimc/32x32/settings.png create mode 100644 resources/multimc/32x32/viewfolder.png create mode 100644 resources/multimc/48x48/about.png create mode 100644 resources/multimc/48x48/bug.png create mode 100644 resources/multimc/48x48/centralmods.png create mode 100644 resources/multimc/48x48/checkupdate.png create mode 100644 resources/multimc/48x48/copy.png create mode 100644 resources/multimc/48x48/help.png create mode 100644 resources/multimc/48x48/new.png create mode 100644 resources/multimc/48x48/news.png create mode 100644 resources/multimc/48x48/settings.png create mode 100644 resources/multimc/48x48/viewfolder.png create mode 100644 resources/multimc/scalable/centralmods.svg create mode 100644 resources/multimc/scalable/checkupdate.svg create mode 100644 resources/multimc/scalable/new.svg create mode 100644 resources/multimc/scalable/viewfolder.svg diff --git a/resources/instances/instances.qrc b/resources/instances/instances.qrc index e9d22c78..ec3cdf21 100644 --- a/resources/instances/instances.qrc +++ b/resources/instances/instances.qrc @@ -1,30 +1,35 @@ + brick.png - chicken128.png - creeper128.png - derp.png diamond.png dirt.png + gold.png + grass.png + stone.png + tnt.png + iron.png + planks.png + + + derp.png enderman.png + + + chicken128.png + creeper128.png enderpearl128.png ftb_glow128.png ftb_logo128.png gear128.png - gold.png - grass.png herobrine128.png infinity128.png - iron.png magitech128.png meat128.png netherstar128.png - planks.png skeleton128.png squarecreeper128.png steve128.png - stone.png - tnt.png diff --git a/resources/multimc/16x16/about.png b/resources/multimc/16x16/about.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a986e1947e8e70579d73555a4cc2be8bd76228 GIT binary patch literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE~MgCGO;z zCl|M53JG13Pz~wrX6trw5x=`bqv^ujyPQqG^J2L5{_w|ebag2_atmnLSF$jyWt*pB zZm{~yq-PT=pQgRLQ|%}2sd9ul{k!da{pYDa>Zi={*L~Xcc>QmmL`Ms$bd@b{u}R z@#4zX{*B5FwQbW<)104xZm#HV1?#32(XR;Q1v8C*k{gwCe`q?*B-f-`Y(0Izku}AhC6(IF=1BV?sd&CzZ|`CB1X$>o`KN6f6I^dezodft+-JmQvZut-Z%67 z`rnb;BY!hx$TBXf%g-<0-2f~^-SoT{bucdnY??yo}K>n?QnnN zr<3sv65K{Vy$?_Be*aW$zP-GN+NN`s%6GGF+>ELYxWDK3&$!k9WH;1)nW)alz*um~ z(q4Lrad1LSeSN-l-*0ILR*wGe`HZif;*{?ehPMNgy=;kVM2T~LZfb88S*r3as??!FFYqr6vQtl%H3umtT~w zp94`+tnVJ+qi>{Vpr4b)wgP4$#4Z9}ViS+)2WpT2Ss0vOT9lm1;F(ual$lKI8$wNdXpj%gUB#KX1v#mid3pI|i6xo&d3t%NCHk3pDXA5D1sMhQ m1&QgYwnj#3#bCp2jnpzzY>lQm{yYXWk-^i|&t;ucLK6VJZUj&O literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/bug.png b/resources/multimc/16x16/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5b78b40bb508c4b5d9e26698fa6eab7a48ff4b GIT binary patch literal 734 zcmV<40wMj0P)*tZNH35A?yIWLe_%Gr^#T`w#`U5ia$H1es>z}1L@XBDFCsg#3436qNxn82 zCR#&ee|Q`OUI4$h6v$*UL+Nz7&vjkqb?MyhFeW5$FAc92DZF3eC~!+e+5j8)C@Ui$ zsjsi^Y;JBo?7A)harGIjOmVjims3yR?h+0`9nj4^vwive2kf=&z0 z#vxV%wgJmPuf>6^jR#y))x1&FaaHZfHa1*r4cx^r&=Jz$kge)P>ew3w1qNqf(ggvI z*(8%t-mruA+|*om2s;mSZA+NuL<*-O1VE%xrauZh4J-y=L%6+`VG*%ID`&dWQA5jV z1EVg~&dd=pLOhkE5P;>uF1Ji2fVa!gD3CHFfK#gzWWM<{R023@K}^6YIQR;6$s`3I zYJ3RFWgb+ZCkzoN04EH9s`eCByJmf!mVGD&FkFJy(+>H9gB6M5STW|TI?hC3yTC7> zDOIg(aN-l6PbD9UK6Hm54$S2Li4^S^MXQdSN9m2n7_76hhzxxQ=zHn$rRYH-fCV2W zT)6(zVJ7cTYe$)saPGEeZY;vhYA22ZspkP>Y3OQF&c^~mQGtC1rV9>B%R%YkpM}RW zu0OEWxcVDcVToL76Z%`=y9iN7$-Pq^Ey0MYmez=>x@oLf{0`8#6-QP13wd1`5|=?C Qf&c&j07*qoM6N<$f;lBLX#fBK literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/centralmods.png b/resources/multimc/16x16/centralmods.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b91c763d1e70a9fc36f4a588044f2cee3d81ea GIT binary patch literal 1145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3D}^FQ?Z2PPm)l=>W=WBQ>c_ygE*DS1pa?-1l?;)c9SasLuwSsiRUkLY#c_vk zluHZiqPK@ONeHVwTNXi(#;HPb51`19}DXp4PL2Cwwa+deNi|L{H2$+GS7y81@e7e{<1iB_E|W}fn#?V9NQ+_^`D zCj7c~vi>xG#43yB-*UdKalP@*B)Mnd{Z+A-ADo=cdHhnyk9h}whMwN=^Tf>BLW4Gs zbn`&X*sb?xiaWS&2yu03nXtE}MPhnZzHr$^U4~WF`j=;D9PZF7b_o#O7~&9m;)CkR zd3A0#z61)CX{=arct&g9DZVR$uXY|jut8DFTH;=TNT|J5!b*;5?wT{}&Mf?+dFj(? z!Q1?dM|T7Yd|+u7d1vRD=sD*`0(xHldYjCR*-dA5d~|dY zU*)%J#!r@aZ+PC{vi`Ae^}L3q6=KRi_I9PD7)BM&e)r5fNaBRabIoCH=O!VW$vr=FW7lIUlPtVkQL095zv#cA)oQ%{$Rc#a+|8 zVzfT~TRl;ALzabC>P3l&1uq-KV_0W4|66Dnx8}hr9hEc8+nBg66osvmx6ECY=JG=z z@e=DP{>_<-uYdT{xJ5qS;CfJ%_>U|`=L0tuWuKUQ?c+ApWy-b79zIm?-7j-y=k+Vk zro5`Wz13Rr+RjJwC+%mPKX12^j_mPHU{X>oag8WRE=o--N!3jO5)4KL29~;phPsBP zA%^Bw21ZuKCb|YdhQYSyeL^q|AeB}ST|fw##Y8aE=WW97C|Qz z4Y~O#nQ4_!4L}8HLp08A)}p;f%&4myj(9ItXek{q#Epv_vWik1GO-Cy85}Sb4q9e04M0brvLx| literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/checkupdate.png b/resources/multimc/16x16/checkupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..f37420588e11fd5f96862adf69e83627f3c7fb9d GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St315xGm{5`9_22iI%U7OEx#ZcDtA6!bXJ&F#t3sWC($qc$(Ibz%mShONJ;YI{EWsS> zvAZC#`PSS3*6s(3SXmuCxN|qGXlc<>yO4R=Bsb~onLTQszuw#P{oP)@EN9KH?CIq{ z=KgOiZZT~8J+tC&UF5Ajt39x6>oBY*Kb{ zaJc)vZ&mNV-E0i6{Quyi>&qo(g8k|YKOQB>G_+OEy|9FLYFmJ8GEe`TG&*UPdhGIi$%>!&X@WAxn;@2b5C z=iz&j>8ZAHEz9|L746*N_KTONThEQ1ZN2QjMRnSnCkgXeE<|0tn00Y>?&F#J%r-Hn z?y|1lptGVfwXJyZk+)$$^2#2gX{^!muS%!%_1zO((Q#q@F?tsI_wQIo=$i#zx>fu&*esi_FSKZ4lp=12?({gp8W23AmE)rrh4}!MFy|-C3AJ0 zcOF(a@Vz?iv0{@Xoq6&9 zt89j;87>#^%{=sH=GmD(-M8zkCw3gqU{hS`wY2hdsqGZI50BNick}-_w)>5|cd2%! z?9mC=qw*&Q=`l{87Wmj+cC{GeKh`g&lhj4iZe0Ur4Am0Xh?11Vl2ohYqEsNoU}Ruu zple{LYiJl^U}+EyIc0n}guvcV@aIW@01 zl_8^~q`*pFA8c1rx_%BsNwL0rfRDbBo`HT&7TXG-eqoUQ;QZ2} z#jA YCWH0r2gq)H4b;rw>FVdQ&MBb@06*3KfdBvi literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/copy.png b/resources/multimc/16x16/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..ccaed9e11ba442b10c50ffb18c5372277d1e0fa9 GIT binary patch literal 957 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3ZElfdzWd)AuKpN~2hL~e(4+HHi^K@|xu{hm3 z$uUdXQNT6+x`&upM)ICZhE8Ud4YK-=?kGsFf9t!ah{w|D-J-4h0v(Abtk^r6ukbnb z_Abf%dOj&_%DE#(dKnq3R>gn)KZTjE!Mx$|Pk|4jKkn-8xy;RM@z(C$*2(GjlGA1s zTNuwN{+cP}zF5%z@22Zfjl6b}$3TLIA&zmi&n5GQV9#0SpGUPUIGOS( z$d$?O-*3is^IpDxuX!dbGOa$<^zY$^0tdD+7_V03U0`syD~Y>st@&=74QmRy&nT>2 zX~TYEc2vSe#&X4IhwTYF|MBb*zM#A7++zvld)42*{d)7B-_wF|Bl{AG#lQaU%T{Op z>XaJ1_j}LrWCl5T`5!g4wail(+7GZlSYsKllDRV`Yj2$Pu@z_27VnNP_tMmCS@600 zbMymK>qjn=!d6dRwJNA5P*c@6J-Ah%r1IxS>ko1pVjCU%1Pk zwSQ*MXu;68i_Ls@Jd=IH6}A5i8Qd>AS{|i(0HZ^-#5JNMxhOTUBvm&BNH7=~7+C5W z8tNLFh8UV#85mg^o9G$<83x;)_X)u?fK*yRbOALO8t57r=^7b?7#Uj`nOPZ{LNu^h z$26j7$jwj5Osj-y0NP*}Vqj@yWMXAv2+`oR@`D3VLpsPwKAFj>dBv#=86_nJR{Hv2 zyE4mClk;=#NSK0so literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/help.png b/resources/multimc/16x16/help.png new file mode 100644 index 0000000000000000000000000000000000000000..e6edf6ba222fa6877f2657b3a4ac47a1d072f518 GIT binary patch literal 1297 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEBc!h{fsD$)~gDq>3D?f1kR~C(UT` z>6B&3$5fWg*fKG|BtUA)C8aJA@uZa;d3)Bdn(K*P@8bT?v|E7Z-hozW(Tys(dlsy9 zT08T~65o@(=ThEHKVyFXyPSBY$}#5j?>763`R2HP{4Zr>W^~znhGl*-bFkk9$K7Sy zWB2YC_%T=7L6C$0$g2q#874a`AHVN0f6neH64f~ok1}KLb92sC{kT0pG<&suZSeh= zpBFlJGyZUA>`zmd|DW*Z&FS+Mi#K0WZ<6QQTIOIbqNBKL#~ZEvb>DvH)xGo;{3*zB zmbtj9qU6=x&gF6YGmf8+xS!e6=5i&echS>!mPHfy^?30--*jcWT;BBZbxf(;Gdivt zPoHa9eo=b1Y4ySho>hDPUovU_$l=!#e{I#CzpnFs#WgHh7LxVsW%1fWzgo-IewoPj zYx2yE&wt5VPJYwn>QYgr=Br*36SwF1rME`Umj~~uu<8z4Fh$AC?)GF0vyV0gIgKeb z87X1vn@*KCar~*>fAY`y*;AxrjZVs)o98i6x+`hxp^VnvbCbP6NMIwUVk5UF-v~I+N0gyzh}DcXA=-_J7+nkfx|-GLOsUn zuYmDR74Dz0`}RhvBzthsKL!uuPAfBN$uQK~85d?5Ps_J5{QYd1W4 zY+hE*DkY_1&Mkf2>Zr9MS5v?TWf5d54qqQkTvfMM<>I}2>dGr0 zPh@Boo^kG|rkPdD$?y+7YI(AAudcrPb*a9-`Rd*C8MZPv+<&_z?C&SGy|?T|l^di?9tzVkn^Z7NLe zDLR|9d*jYMK~eudKMq^_MRY^ygcFMy82ByHdggwpN?yDmr+ocZQI@-*3DOzzV*i;h zI%do{`KdAd7#Ua@m|2;c>Kd3^85l$^)7lNw08(iM(FN3CXrOBV z)LW*Kf_1Zpq=Imst8IW@01l_8^~q`*pF zA8c1kkcGkd zrA5i944!!w7uo~WxFOWUhX(n;+*O>JTac5QnU|MemRORR zpQo3XTB4tsmy%kcSCCO)UyzudYHMVqRtz@W)<`Wg#nx!5!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3psJ)Hx}NG+W7Nb_td=X4~4rvT240Dy2$Exg!J8XsoU~OR}b7RPCqaIwydh> z^eJAQ`f~=q!`-d_>)(3u_EE-*j5jrm_NrE!b*B9nWIVOW=2m8TSYp8^i7O-_9>F`n~qV{d==s&x`G5c-HrL%1V_;&dm0N`~%*%yx$A%VQV^f ziHk2~y|~C9AC>~+0*{p{ONBPhQILG_^=Bfdk~(w4OvZp^fk%}jpLrF3Gr9S|qQhs| z9YtxGAvqJAgIF9q;XEL=>6vWcV@Sng?-BP8U4OhP276- zv|aM+`Yez0*$rMztAtb<8Uzf*PSj5OahZ8izM{kXBck(cs$RXl_RhY&YQFsyxd>i? zz|f@H)qcvo$|`?b178?lvNQQzb1UoT<^R*d9zSgVc~6QpDZs}mcUM5HU9nN|ta0JOm{#K6+Zz{1Md0%F7TB~On6 zHJE^$s{hTbe z6)+1Sb`kJWLB{E7payY}g~9oyMaiiQ?tcEht_q&X`FWs_%1u4^Q!NvyL;;~BJ~YS& h=B&h`620`i{M=NqgN&X`tOTlM@O1TaS?83{1OSOz!NmXo literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/news.png b/resources/multimc/16x16/news.png new file mode 100644 index 0000000000000000000000000000000000000000..872e85dbc05d1e94b766e1ddd0fd59ecf91fd91a GIT binary patch literal 727 zcmV;|0x127P)^fK`!d!lV=kssK*Gf2Ejk){+yJyU9 zuB)S$IGZ{}zof8zi_%twc+kZGNiz~1rYB60)?|kl*~wr)>zP6}yNL)GV=%@brX5Mx z3K0=h6%#QG9UMRslY^>S>>$V$ii9ZTvP0ANQB_o->eMKeD{Pgkkc^D(Kf)-KR!iYfu*Y)n=juNmM=`*xuUA>@8;Ssu|KS3 ziVe5f5s+;~uUu=23|-7c|J zlr>xMZ{m?zp8DCzoWRa1d&3*oI?(*lKi~Q?b>K-!h*Z)%&Usqq#%FMp& z#fy3yuNc;=BD1%$a;05lRnN{ znkHp1l(8!aHML2tSl>9I|K4%!7q4tIu3U4SZ|u9-E$r%nbL@HB!#tL6zWgsJJ$0&o zO0FgMDrOb-H7`plgSUj=+G%8U`p1v=!LydB9^JI5Xd5S+^OH@l>u*j~dU#jwgs8&g z_M@u5y#7Bd2<-~DpPQ!kI3+&!tkniZsZGqzWeFZ!yYe=b*xPQL7{6UfSMfu|#?@TM zmAsE!wQLg$DM~$Svdu)W)5OK$!^uPP$s&y28z1M@aHwc*H<-Ji>X(}DQ^j4<+AnTQ zRZeZKT&?P}G}^%|%u{cjN0UO;)4iL^4H*tUUi|6kbwA@^jUuRdVZ)ltpnHH7B+;w2twxieHevFuU|7V@|iS<)*pLovw zJ!y&5gXy=;CvSRCr6h32c+JaO<=NS*m+N@XIP-jS8&3j5nP<(a*AM>nTi;U3Q_C}` zN^E&@FYQ&-ZOeO~Q>H5IY;Rs@dvEE{l)^XL=eyVME&1r8WooavhiQfCzJrUI^Le(E zZM(hc{+#E>KKL(*tC(Ez|MU+L&e?AkE$Dt?=2LRkTV~hSdgQBli@6&pY$nJigvPQ3H#pcDUm#_bx;rVx;)it9`A#Uz7XV1=< zEG+!n_GKm2OgacjrI*^G|Vm)*q8! z4$P9OC9V-A$wjG&C8@e8K!U-@z`#=1&`{UVG{n%%%D}?P#8B73+{(Z}W!=LEFbyD; zRuEl44Tc7~21dF@1|deqRz_x4Moez3>hUQ1y=g{V7oHQQj_y@bMy0x_413-^>ZLfiuHZm1AO$2 z^bGZ_4{niw*$A-L1;Fyx1l&avFo0y&&l$w}QS$Hzl z2B?S^qNubeIhDb$v@Aa-agD#}N1%iWLLxpi$Oq=+^73-M%;fw$-R#V~bUmQM^$Uvf dvr>~wiuLor+V#t9w}47n22WQ%mvv4FO#pV7P~!jq literal 0 HcmV?d00001 diff --git a/resources/multimc/16x16/viewfolder.png b/resources/multimc/16x16/viewfolder.png new file mode 100644 index 0000000000000000000000000000000000000000..98b8a9448a5756451eadce70af3772be1f543993 GIT binary patch literal 852 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE0z%d<2gY`4S99w&sfq~J`)5S5w;`Gv>-CoX)0=DVp@A8@$w+gyk zW?Ac-n7w$Ze1a7Bf29fX7vwoQ4Hb2pPwpZlyzw76$+xg?=UZ@v)2#b0dFKL^yir1f2 zt+>ggS-@fCtq(Ex_jLpt?sq=QxidndJz~ivPG#4%|6CrooJiGKz_z#ckGRXBLZ=S# z=AO+0v)?T_Dip_agq^3>;pDE8aM_iI*m+c6pSkz-@$0O_tezzH&kKY#UzwjTyf!m7 z^Zxy?Tjg_SuDX&L3oGvKvI+89`ut4Jd~asWlEpt6A96=DZ(*2U2MkHo64!{5 z9nO2Eg!<&1*zW_C)gPi1(nVgzeoXU_vn(|^KQ}i&uUId?C|y4XqNG?qsZzH%QQuh4KwlxhNP!p~KJEcN`bK(&`qBM1 z$uKuUoQD(&2FALEmLY})R;ET)ra(`b0X=n7{@W&?21$?`gY(l$$`gxH8OqDc^)mCa zi<1)zQbA6e{mw=Ts7M&1sI(|KmBGKFGCeg6QF!S5 zR5#`GcdFmb%s=KNq*TOz!0w-3(IoSKNw?1YPK}%wm9416@F82Q(c+|Z_1QbGzs_T- z5EgD*wMev#UAj<^(UT$Kd~S2Vl6A9h6deA0FV@0SK}n;FY4YdK=bV=82XXvl2_iyIUwqz5||IL+BQD0_uKQ=1Mth;P7<$-bk&RZ`- ze=JfIH$1-ZtH?wS!}mh(OJua)2=$tJY*RhrQtMOVC+>Pt_1WwV*A7K-hxQuZ`^Np- zauruHr=p`j~685^Vz)&E)&BD(ozPOrjgqnP;m{j3JXt@b=@&C_!)CT*;+n14S0 z=bc+>*PPFLA~-1Idx=dq5`j=j4N zU%k3r-rfEDJQ3HAAGcS{PY$lwfB(IF+1z7M-KS5l&+lDn-}9jLfVIp&Hn%V;WI3huCmz_c~D8 zOb0p1Co?%UuQ-(=0i`}Mu~s?$I%44$rjF6*2UngA%RdszSg delta 264 zcmV+j0r&pw2dM&(Du4d~{{a7>y{D4^000McNliru*8&t10VyM$p_>2z0Lw{4K~y-6 z&6Gh7f-n$8KM5D8E=fF>xPge#Gnt5ijkq&$<)x$-AkdHMX7W1uZ3dW0 z0RR+LejW=*>Tn7VH+x|96-;+T2j8*P$Aae*Z?clvLXM}nRq5}>yO(7E2}{%J2x0iS>XjtJ)WnD zDJ#YqZ-AS|ZdkU*QM4hz6RmKqKmt#EAs diff --git a/resources/multimc/24x24/about.png b/resources/multimc/24x24/about.png new file mode 100644 index 0000000000000000000000000000000000000000..537f37e4bd29bb7635aaa765ae60343e1fd98f01 GIT binary patch literal 2051 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 A`Tzg` literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/centralmods.png b/resources/multimc/24x24/centralmods.png new file mode 100644 index 0000000000000000000000000000000000000000..c220d033707c5cb423ce2a4cc3a95bd7bc0e3ab8 GIT binary patch literal 1787 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3S9S-K49hAo~hjv*e$ zmrgz1FLPD&SpD;R(O0k9+VWQ&OS6&dw{0^_Ym)7m6yelj(Y03Mh;yLWy-nMW$Tx_u znYc({O03uk?gVB*?b94f_PEG>Vt(^O@wPy};jzwiwp*7k$KJjAbw|5vuYANj7iGJZ ztHerQ{eD&RypZ*Qx%=#%s|Tg>76-goTJS-fcOUY$8>*v>$7I>^XVKl+I;ZXJj(XLnJ z%&d2Vd4C+xetE0sqNTPBi=XAyCg=C}6ke{r7u&qsU{l!ry_2>GONO1D7=C~EH$PQ_ z+1&5T8Mkhow69de&zgOqwZM-3DA#31t9fj~87iadij{V4WCkHqAWSX7W3se!iIGj8Cd5KLp*5&rexa-Q@b0@$=uz zJ+rLuuPx}{Saqp1FeAzFV_cr}k|eKeljIwB5~2$xb@JZc*gV^zIz+AR)RRB^Z@lrJ z{DW;{Uy}q2f0S8+VUyCvZl{+FBCTsoJRGn5?_!KiQHe+@PVJkylJQlr|H3Vfwn9?J zw(UP4TwI@2@X-0+MDHGvh0fe(}Rjj?JPVD zemOTy>`f4Tnii?Ob;rR#we9;4G{4@ju-DRk_1vP|pEAo+^f%siNI2**({cNUgx-$h z0;cxKNy+DKY>RI)U7_nx{eb%d6H5SNzF_i7lVvM=Y<%|a_Idsz&}r6_t-V4LqS-2C zff-h<-^G-=^4)j&CUWy!WmafOum(;DV%85}XkCzb@ag0F=U>ihe$q7# znWJ99mhE#q)VXu>qBo48tq(b$nae&nvhna6vskxnd5$50+({*>&6hMaMSP>q{C%u5 z|K1Ik{O6xrrgAj}ak?-?M~P&s1y$@c{`>g$%=dr0&g<_vyKW<2-iEFWMz#quHSC*I zJ*K^=*?HjT>;6l(D;dJ2qXNYX{ZzPA%I3z|zY|sSDXw>S5V`hV;avO2v;7BL1xgNV zJ^1C+%rm+fF4x`(_{%Sej%`o*ncL>W*=^H(cc!rX{PP>~Rrkg*Uk!3`iIr+M{0i`g++l|Z}DiH<4(}LUh?!^?GFBH zdq3{}czwIA?a!XH7Oi1WZA1|6>fX{-v38e_wM(tt3SW*C3CF%P42f- zUz^3<^IRLZIxI)vLj0>sF&?+V{nW(w?VF^Rckk>q-_0-2T+q<#a5A$okdRT#v}3pY zeqbY)(4j4#x8~P=J^9G#PRy?#uU=leIQ#!OyDp<=`gQl_$KJbHRhBgE??Z=L_gm)P z|M&dYiu-%V;?rl&?+234sGZGkd*1(5e{Hp4M8>=`5&PpJG7dG`Yt{b{Q8eV{r(~v8 zLNx$wFbpxUv@$ZYGPQu%AfA^BES?$CK~D0?Ois-!PG!g_DJihh*9Y5`S(cidpPQSX zSFD#`l&+rxQBtg*RH<8>sBf%ips$c$q(F=gANK$seIq?X{pfz1WSAQv&O-_X12bI% zV~`t7EvyWUbq&mbp`bG>H5{lx805y_{L-T2R0jWw%JkGc1Imuh m&>$a}FUrfy_42{0bu&S#!QOapzUnkk3xlVtpUXO@geCxs<@DG9 literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/checkupdate.png b/resources/multimc/24x24/checkupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..db62813f1f03b75c959c24d15597cc6da329944c GIT binary patch literal 1632 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 E0G^6Op8x;= literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/help.png b/resources/multimc/24x24/help.png new file mode 100644 index 0000000000000000000000000000000000000000..735ca50a87e4836af0afd94d825b7372857d2819 GIT binary patch literal 2089 zcmai#dpy(s9>>2fxlA2Wa(_hSQrJzxYLV8DwUwPEP}(l|^>)kuTKW~-!hTQO3^rp@kA+Ac@zhENlMYCd7YpGfX=41QUPw~uQA&3 zv;#z?e&>NRSk8SVx)F^!;N$fyD`$`zL^Kv9jWN6P2mP+)y0FZjfp(|alY7+zKpe|m zuXNt9it&ZR$tZQ_p!u!1C#O{RLvF80aN#uIUp1Av? zT3GQXy9d96@4Cc>P6!Q~@OxL%3Zlp_=WF$YTWo|QARJWSkI(0hcUAO4VXX3#9$?o0GV<(bRwooW)!_^5x zBrET4%g#LT*opIJr^M2+Ib-t?Qt?jJ?XM)ETp>a=1YQ5(;vK9WWM59#d(Ukh%T2xY zOBE~QW3!CKM=F8ca=V(I9o}rwhR8P zGTzjK)6-v^b?Ag`0%16p)8P7e&?$62CVfc`e!rB{ET={X1>Fm70QqZ+ z{X&q_)>k@gK)j{=>#{~4NobY8NSt?VUg*8_DmM$iWN>wJ{t6aST3|lO7Hkgm!vRI6 zHhZ2VBo#xLSFro)3^p28V|VoO6*k#wU)H6y8?ovNGYQqhWe#H7AyX3K&h;w@JVJ#xP zE8TR1gMT3J46$jF3>-02^jDR|! zr-GB8Oy_(FAa^gzr5j{gZZl8(o~k*D^ljV39(OB_9lt*ikWQJrD((z~_B~2?GA{5u;Uo8eF~+-7s%T3*FUPs1MU-SOs?Bn)x0hJ@ z2M5(uRtA?1r0hzzO9g5txEXcBjQOCt(j-&_(`G2@w63;#?IYulxzkqlb#El)clc9J z3@?@0(M$<^xMN~W;)TUTm#w|Q3_u(Tg9<`B7T%Adz zy)X_%RG`ss=w31nZo*@#{naeK@2^kKsNMdn8GyR;c6RxuPn5lC%fp^?u1oc~>o5XS z8JV%F-i$Isw`Q04jP$#i@c!7n|7%z8^O0tqziEgv7qs2YjUK+p8eGSDUQ(Lkf!M_q z>DQGp%=A>Bu~B9jhU^{NZe(s6@AH-P@gCQ_7&A#ApN)DK^lj>OR%fs2P`NGuOj;!L z)?o$^5Hi;;#U)~yGaIl0(P zoZpZx)g}}j3NOY7&+0VcqS^sAxVhhq+2^g&f9;3#^h7$lZg%L|4#t|&g z;Z%ynF#@C7rpQg{`Q<;JkmGpl&$;L%GA)`wqEM*uVGI(L0;Uic5E3PVa0X0^q`A?; jhy)}YZcYE*90|83MIhm~4k$#*jsW`5QB<`@=%s%HhQ7S~ literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/new.png b/resources/multimc/24x24/new.png new file mode 100644 index 0000000000000000000000000000000000000000..bca3f45beda29d4d224944941c475f26e5294d09 GIT binary patch literal 1468 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3(}6VDAq*8hOP4V)Ft7G>aSZV| zzICc^zI3Qa+k9jBt&cn3-pKM$beO$FBl8l|DzDav5=Yk4UOGQ`b+kg)L>%N#xF~;s zi&LcW$gnKJWXP zYW+Xw6;D3-E&ohC=k~69yt~6i-eiPMX21T{8x1dcB3mi`IsCQP-1?}~ z-{}+ooU#>M+cc$7xbE+prs=VFEEqTre>inyrRKKP(JhG`tCD&SzR+`$Jbv#$saava zt>SyT;yt&_`9k&bU;lppwAjCXQ|@Lyk%let_OGjN9zA8(V3^g-;V7_R)yEeKR|Ib! z*;Zz-tmT8i=O1dVH`SCfBPK0WDE_x8b?dv%7XfQ_y}y3`?zc_cj{FN&8J<|+!my?B z1m89rSF`nQ?;G!YxvOCrFyn4o_09*|9x4?W))sx!PLP&hm5Z)s5LOLnmSPQ6I5J7f z@2A$xmGY97mzP;Aw>W2AUEkRgFekXH*sJbW-HoXDe=H>;7K|I%4Q5TK5^`*~aHyx& zaq$;MrM>6*dtaUEnQT}2jBf(-U4Da&E~}(Gr~FxZ$(4gKW4qmZPfLl!9dms88S^gP zx9gn5Ri&+=*VNn9Yx~cz*M6Ui@6!N>+*H2rS1lX-p773-)tacrB6`5hly{cn)ozpR zMebf#@|H7}HAtP9+{oo~$&^Jv(8b7sacM`9P2Jl?x0Y;D37N)nS@%0boig`{`xhTv ztdlEOS6%?|r_%-M8LPt+;2cF+Z3wBiz(#Q>f_FjN~RJCasK1Um9yUCgp6X z7E!p$*%Y0<^eVr<|K7p}Zojt&gkJMn-I7?r?ZNog@xY5e+wY$>|MTp_hk|FZSMA!> zr+-=)q_s*xDXska|F6e-XMaBOo#Eoui>u98_c)bs?ekzM{Pd0c+0XYM`Io62am=kc z#tqEFswJ)wCCNppi6yDJDL{h3$iTo-*U(Vc&@{xz*vi1f%E(ODz}(8fAVy@tdYA@~ zN-Kyipaw$&T>~RsBLk2IBQq;QQ-}sO>zGCq4Y~O#nQ4_!4L}HJE^$wH$SgfFTW^VKL?_uSl>OsN8d=# zKtCsoZ3WCih+PD{#Ju#{Y@h~lkcGkdrA5i94DNpZzOD+M$@zH-AsMN;sRw_mWdfBb nAe6+12Km68l~`1wm!6lOn+kT2(UXalK(!2>u6{1-oD!M<`mIcv literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/news.png b/resources/multimc/24x24/news.png new file mode 100644 index 0000000000000000000000000000000000000000..8679405d66214e8400f4d68a4e7e944b810a01cb GIT binary patch literal 1295 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 Pg8;C#bhO}^dtCV&>WaOS literal 0 HcmV?d00001 diff --git a/resources/multimc/24x24/viewfolder.png b/resources/multimc/24x24/viewfolder.png new file mode 100644 index 0000000000000000000000000000000000000000..3e95749b9d764e3b64398738db1543843e9dcfb6 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkEJ36(i&fB*g7?`LPv zoO?FSB+_`Y&aE8^Gpu?OR<>&BnPts&^YutfUdqChq?nPtQqYk_F#11ZE|1wJE~yC% z)Qqif%73oAxBlqunWCJ#UY}_^{?u;YoZ@}Y4~RBQx8HG=$9#RxnfE|qgGP$l0w(!- z3RXPL8~EePtBqVpZu8g_mtaA{2lyw^>+6?zuq~!Gx^<=n)l5- zEU2)7(aLgzb@{Qcy(Tx(Q*)-1HogSvIU*A8q=}-4PTV|mqcAby^Uq}|3hR5Clk`5Ef7`#G(Id|2`Nus!Oq&A3 z+`^h}dcKg835=ADoA-~&U(`9wW&dXRo9C6eKPfvzYF`dwcI7F0xi;V4zF4a^XyftZ z$Nya>+AydoDV_LsZ_A#i=f7H?xBGhJu+*Gu7tiQ=*hL>^k^B2``)_CawRbXp`(OX& zSG7%sQBWn!Fm3z$Yr^t-?(^O&Zw_B{^U+TRt)!5xt9HfCS4+I~`h|k8jG>gy!Zg7X zT$js))b@$q@iPyN&D1W9nX;#m%fj?JSKjgMlMLQ%3-vFZy2>o&V9%KYnl8qklMKFj ze)uk=KWSUbuDDZ7%d~_xX>@*9mY*XZDKg{x?v`1+XIz@TEAO}TIX-vWt~EXTRwg`@ zb2+l)a?ov=ZO8Ua|NEhMzwDV8thiL$*w1VgYYA`g=H2`Wb3^A~@GBUF= zHG^m{<5_kQMMG|WN@iLmZVm2%a=Aba=^!WhWG1KP6{j*}l#~=$>Fa~-$}CGw&d<%w z&nwo;FG|G+U$2W zQb0w*5Jja$$*Bzf6_x3!c?zD%K-a&KSoZ=bt&Wh64-N8xc@<<>K3KJGCP+2dukX!Q Rod#-Q@O1TaS?83{1ORot`WyfN literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/about.png b/resources/multimc/32x32/about.png new file mode 100644 index 0000000000000000000000000000000000000000..5174c4f197d575dacceee5880f4e938af5a3d6e6 GIT binary patch literal 2658 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/centralmods.png b/resources/multimc/32x32/centralmods.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2b8208ec31bb3f4824f819eb0dfe47a7585b2c GIT binary patch literal 2119 zcma)-c{r47AIBfV(3nI{BjSjNw#RIin#hdZP{uSOgNU)bVr0giZIC5%Bvh8HiO7_Y zEfV55p@lO_iO8XpyjjLpa~^fN-uM0Qy|3$cf1l^Rzn|;={_cP7WXdsfDajp@002l? zT9{BFRoSRb;?T?r4_|;p%!_oC1OU}($aOb3^e@7qni~PUex>&tPIn9HQ2+?n0Dzcy z09b{VVx|Eg2m=5gTmgV^6#%ve0MK*VD3QnA z*Bdt$g9Aujkg9yI#MQiO5DHkDkZ2AalUIC`ob6HF(Y~J}`x{wPf9iYU@W*nJZ|+E} z4I4K5qMF6uQ%qTilgDsnYcHp4q863gZd0sFl0))SQ2UJN2^Ma$$VcY8?dTZn`@uo> zu=+q)5U&4q#O%!L8o^RWV}^B3cCVfBg9g`**0nSI)dHcTFo>TZ49QsO6P)*)ot_;- z#JawPOVebx2pRD<`r)pOMMqJ}eD3edVES2-w-VCcLuqJo&zuXTt+h==v}|z zZ&25C>dR^RJHf|uhqLJUVH45Z_d>hNqJl_|#V1-47YWfi06=b#(~vwF0T;d9VoSxF z3P&5)rK>1e7j9m;Z4fp)iK@EMZM?~ZiGYQO zXwJyx$(B$YK&Cy5C&?&QiKJ<-?1&}HdmrvtYb=n``!re5kv8Wv<8{!WKC7ZnPlO1N z_M-HF^37LHDaXi~hxn)D#%ansH0K749piHit*E~ie>f3vZ^8eTG;h{K4oHHbd`suv zfNS44nz!9`Yx6xKS3bWJj|PZQGpc;0mmN}-y2oo+CZ-sHP~t4VBKg-1K_bXD7- zPUq5?ZI}DUU_-eR3#LXqVep*YUyltRoHcaz$}iRvO0sMXYZhHz%QjJW6=%BQ#c=>X zERU`fQ`DO?Jb%kZ*mn4p`N^R9`nk*o>j?66(_)mkjRBDom9@2zdow`s81D>7jy=H% z>eP_jlOmgms-C^nvGhTKSMY6jWM1(U!PrV*7WlRP;>?=UL}AX*$x6Jy}Tjp$YR8qaIiO@ z(1sWXkk=_-@7%|dQMZrxy0J~R#~sx-iz!v7z>-IMiLPR!%?T{U2koDg?@Qa~a@bp* zA5sTnKn^#3Wpcdh8RHdJogZ&S`g z0jOb&HA{+rVbayToxH0wXTU0`-FvFc!bK>*Ia9UV)9MNlMck(#U-s~P;jX73CA;+Q z*Nlcvke^h0+`_yvt?zBOa?Y#JwIlSJ;*;&Py7=-PFDx;PLRf{Qh6tm^=|vZNN~e6= zvx_vz>;AU&!~FeA2^|miY~@NlH|p)Ke;v_BCvM;FD-Zg#DZ4dm>MtppA+1OYeApdGT+H8aL-OuQ9Ke|K=`= zyDEeph23mZ2ex}4!;Q@VJ)jA|VK9e4EEdG-(6D+0432=;12NDCCQ&*w?I*C|B>bQt z0E+=JI1sB#!yY2wbs_5yV5jWJ9aPyZ_AiBi?`A0!A0a;5Rbr93)`zAZDYr133(P2>4|q<8fwCpgRMw2@UgN z_^VjDL%}}E^Pm?S(EQK#DLbn5&n`kjLbRCQ-Js8g`+FOo^(r1i2w-V?%!Fs;%J~}y C{-3Y_ literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/checkupdate.png b/resources/multimc/32x32/checkupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..754005f97832b2d4e2238419b1b975990711fe75 GIT binary patch literal 2480 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/help.png b/resources/multimc/32x32/help.png new file mode 100644 index 0000000000000000000000000000000000000000..b38542784dbdff26ad5abf9f568255cf5873c966 GIT binary patch literal 2720 zcmai$c{J4PAIHDL(4@iGt}PjaC}WthO${@{&6ZGHuEby#BgS9`QOuNG$uf~GTCF9w zkVL~+ZsL*~itIm>Jz0{n?8@BIGwo!@iL=Xsy=ocHVV{ygVAe>}-f$F0T1l*9l4 z5Vy6lIw4T__kxHD_OPg^HGzow+FM%*RIs)z8)5~rn_=^N7y#^%`CcF(uR!7ZVK@U% z6)5~iC4Md_1OP~qtrgzIo!{nmDv8uDcY3?v)Rj}Lh9?!Djj$v4{vMfoYNX`w3MMBf zec5IoBpJMyP@Jrq44ZT_SCS&Yy`_;B92;{jO4oQ&3XIy-x_j|}pH;_M*5R*tbJi?Z z7IyjGwkdUXYP1}oomIN^oYURt%BmO`ny+l^LHJS#kDpW>WmescR%~p4`_@ypsHbFh zHg#qwPj8NO_<(HQ5)apD&fu*{s9^pDT1o!1W7eH12NHs%-p7LvfrykDo5`zLCG9Tt zwa=t_y;78AWK*ZP6g50+Bs9Bb72%$6B>(soM1lF&3STa7Rtv7qP>Bce3UYHl6j?mQ z__TYBEj<@E&s0{fFQfYR8dhFnJ_0$SXgz+5=o+_?(ERwz2fGO$?zK$MrG|f8-R9-a zQKewOWBc&5mZ-_(F^}Nuk=xff$r;)mk_(O4x-*74mFAE0#%aaVXIz3*o5Y^^;xuN4 zd)wBDA1AlkR_(sUw@eT1;Z;=Z*oym76v>Bf5`me&9d}|nQmYC+FTK0|yoCOAe#0kM zo(KQ8O8|{@mu@TB zmNl06h4(abXF%UMW-+V6HVGjOhDXkoS=^RX{W@zR8t#BKV-1ef!*e*6^n7L;gm?TO|$bRiI6fWɚO`c0j zqZv}SQ=jS`TvSx|m)^of zAG`+2waLstCU6Lq4U!7CSp)^qEnV=-MIziu?FKxcSqbVLul04N+w#+M;RaZaQ0$iu zxq_!oM~ff(HLch=^VK1Ic6v+e>-2@d=B1GaBeagc$V}}5v<+8WiwX|5e<;TjM=uq0 zPFinX;=|%*9S==7mbf`r3$t4mM4U_G-l_AU>Yvhe`n7l(8XBBkt{*(;z<_gmkO;)C zjw4qd4ww+v?)XMBb^t>PG;!?t)a&i}QuNo-jXDtDSUEG}0*}+t=_+^VO-zR{3Wd_` z4ebv?D}_v^iE(^Qz1Vp|VcS6L-!)Ll+>j7-izzUjA+-L8k5u6KPuKWK4iCjm>3q^%Snhgj4sPy(aF13mO}x$(cL`M8x;Ie5 z!xX)&;tVbwn|vUx=XUj9UKa^(H3Pgh_X6WK{Iav!0dBvQYl*;9*c$qu?D*n@SRigV ze0@@0(s5!|(n0XhMLdCHq#zR3wf`iTNTy< zQ!DNB-%_H(viCy@5%O6=20BED(C#n!(z00PEFqnKs}Oojjb~+}#NPK^$C;I_azVaU9?QN1(|px_eAL>m=vwFC*L^R{y1b`f3&hY zo=;Yqn<6`W6)+Enj#Tx=JW^`St9cN$ntK`OA>y+3~ z_E3P_?8I>iuRYBRYt$f=x42m8^!$TSKH(b+L)v?KxF7FK@iN1VUe)Xdpb<^(A9tCb zsL4yJ$;+xA<>oHg%EW=gn0-=sF_5KLt9UZgQ~it>i79-!{^4Jf4b*S7N1m-63)1-J zHqP4iz{T}=Zc0$CMVFUV-dk{0l%MgHRC*v4j&qUH`!A=14WQGU0?hDy#l611)jQpH z4#pzTdHOfL4EZ+9>{tr{Y}14#)$X>aWhCnSW-fLhClfo6lyU6Z1-Plx{aLg<{Z4qb zSK0N@TBX>kezDY|^}2;r*lVo|=YK)w;g8Pr>C!`VVJ&JU848G7w*%Oxh0{#ES0Z*| z=e^5hcoC7t*EoXDi3;;qccx`CZ9J&X+aGnovGzW$FaS~%HH zaHU{+7$P{7svr2%5~gqMbWGn6fz%HS5H0;D@MqTlxe}F!brb*!-vdtuvqJsIfGwRF zN~5yKa9h7%I{YM=d0+d6g}`(4KOS$_6UY9UD~uMz2qe?!^x$wGCM}qbpp%*UG&+eK qiD39MEEqmiGS<*gE9^&etf3Z-gf+a1-)a|h1Z;mjZgrnPyzp;18ma~W literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/new.png b/resources/multimc/32x32/new.png new file mode 100644 index 0000000000000000000000000000000000000000..a3555ba49095de05b6e5462bf4ae9b349ee48738 GIT binary patch literal 1769 zcmai!dr;Ep9>&3t1TC$+;w7}S+af>Ev~W`~P)wIvLpLi864X`@67*1kqDWth*+nhOnopJ~Qt;pLxFTKX1kXvd^bn(lo^-Ads%DF9Ala>FUL}Dk|H_y2h%;ZI9G=7tJ7`GwKB&*q!~Y{!NE|D zsLL_gRRac#-uH1pmO@wjamxX340Q>zDHEA_qgXFP*W#8HNmN>KrJIwQ6P_R9svnpC zw4ZcVrSsI$w2lHvG&Zq3((;wa^i za$~^t5SjV|sYpNcT{m&EJ1`>dE-mhL7IT&nyKCVYKjqdGUzxIL--R5m31wc8 zO!C~;15$!Eh8%^5uKg{ATidT#yCeKxMZf)6o7T5aCuM=Sn3+IJPd4_npz%s7mn@O5 zR6tMjbgJ}uM57(0X<=*KWUfOosNj7)(D_{347=EDD}k%HPbCu3ZzYEyT>NbRt#@{&&|u*^bn-&|nSf_&(QOEi<)s=hO7 zvYHrk%X_(Z@*~$O?l5&|?F+ZUr4fPs(;DPhC9LM$=^u0I9L!(Wja|4-?E|^As%$lS z(wWPFn5gGNy9eL;%wM+rIN#gg6D!3ebDhcy?e@zln2@Gkoxa?9fxCBJtz}NIfjE_0 zI}<CP{XshpFmjCrf*2U~>J_)BKkyopstwN2VeQF< zJ9Hyu<;qS?OR@K*9mu9voiZnA5)S;k1F)C==-0%%F2f!8!MRcN$S$~Ld zdvc_j+0(A~+#CX*!PdMliS(jE6YqP;O5CO`UR5ZZwi&gvxzo~pP#hG) zKPd_&QvYq~QvKO8!Cv7j0UdR}p%4@}w~js(?-L+6>$~4v&?kxg)CCL!#-w=#jYad31c3ffqBdjzvX=zmD`T-8;iLdFCcW9SDB$dOO(Qy`oWF z|BL6kFT2m0)y>Q;B;i+gwx^%eIja3N?RmsQys#JsjmJRIwF86&fZZqz28G#4!8+jp zXPgrT1-Rk>Akd;z@(ox{;=WQ^00W=^ED8%O16UUvX6IJ`>ULD{KLCqOKM|hrH=u36 zP=MVy3Bz+Kr?@a)_g1c+Vy{)1g}wLY5}w5!h`JCm@o#&hrIs>BGNaE9gUA?(ZC1Z@`NOC%F+dQpXc0WPlroB#j- literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/news.png b/resources/multimc/32x32/news.png new file mode 100644 index 0000000000000000000000000000000000000000..c579fd44d6310d8b061a9dc05d10cf1e070f2f25 GIT binary patch literal 1752 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 C8*<$M literal 0 HcmV?d00001 diff --git a/resources/multimc/32x32/viewfolder.png b/resources/multimc/32x32/viewfolder.png new file mode 100644 index 0000000000000000000000000000000000000000..74ab8fa63a1211ab1e0936bf19d0549971d4561f GIT binary patch literal 1518 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7a$D;Kb?2i11Zh|kH}&M z2J;vYW;}g-$xe`9S%G6ZkX8WW_Fr@6GB7Zo_H=O!i8%Z;%)2ATRmArBwYAsRFW)V! z?sLqugeQ=V^CpW>2+Q3arBA&M@^kDGis|Us!Ox`^^61=LYw;$9yiFy^O@d0D3Tm@@ zCbdj>x%{xt_t)1$OJn!U^N*SF)7D&0qrx?`@SN@XcWb%-+&?IOUZ-iYr;h@|?LB^n zoYttDcQ+`ri_YKw@xnY#0mXwS1Kfk%Cph>x_-rU-xpGzN`7+U?UWdHX>+V~#&-=fl ztifel(6TtA8?%(z3bY;fAnF)aK9W{_)iRdhBj(7Q5dEO)VaN@$p}0^D*PK!|BUs z93&K&w8Mn!cSP~BD_194Y}?#7!$_ep`it}#rwx}MDM+@lIheonWN|o<^|>+SfRF#B z&c$~7w^;mJlpUkCLHJ!MFWVEvN1IfurP{n)IaWq4l~JED@ub5QpRh2syK~Au39dIx zTy}3)t>EMrYq=iuUq8mJy|gsgDZaII-N6Pe35LVVx{q~cO?tiTk8$XBnX+Gn%wA&v`{o(4M8AAgx% zR$Tw#YWlOkwX*hH2XFNT-tT?FGIz6hetOmv`~AD6KIKIRb!_|_zoFYhWA(=e&!ra! zh2ANWT=IBvzv8AsW}XJ)jaRjHP1vz!)w&bL=KJ%#R%i7*`}a?cb=5g19=qW173EPW zT-Rp{N%y@vw&bLXiE+xj2-!m`FFS?C+6V8-i*^t?6dQV{T1j$3wd2B)RqNKj+Opp3 z`s`KR$!{Hs4UC^iuJj5oUVSf6{mr&k&9#;nWF`r|6+LE|TWoHAVw!k& z@}J!d3!Z8^9kPzSbmq6}j0i6^wuJ4z&utS+f9DIN#7z&G`+BygPnsWtkCtPxQO1Up zB)8A6rhPe?eD_fGv42?~u3D^%J#_3I)0Ov)dNSu8A5s*{+P?3te3Zq$JwYdZP6dT- z=juJ=@nhchq>rbbHZg2s@3;9Ab9(n=&7-kqd!vmVkKD|V(f?EU_qskO!`rgihaYa> zc92escRumCW~q+%l#{y7#dia8d;fG=o**- zLqRQShc{4zB*=}y`DrEPiAAXl<>lpinR(g8$%zH2Ag9fKXCnnvBn(khT9lm1;9pUh zo|>oNnGAIO8;NxG;qfADCA`hUJ4*>t=#fgZ=v6eAQ{776wmOKbLh*2~7Z} Ca&|WW literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/about.png b/resources/multimc/48x48/about.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ac71b8e247bd07e4abe14bb095fcf55e31e2d9 GIT binary patch literal 3995 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/new.png b/resources/multimc/48x48/new.png new file mode 100644 index 0000000000000000000000000000000000000000..a81753b3154c59991d5522f274861a270e2df1f7 GIT binary patch literal 2870 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 P00000NkvXXu0mjf5>Y?$ literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/settings.png b/resources/multimc/48x48/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6674eb236d40a571d619059b3e16e5c0b56282fb GIT binary patch literal 4797 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 F{{i`D)Gh!3 literal 0 HcmV?d00001 diff --git a/resources/multimc/48x48/viewfolder.png b/resources/multimc/48x48/viewfolder.png new file mode 100644 index 0000000000000000000000000000000000000000..0492a736c2d7b5599ce6548199fc43c6485f67a9 GIT binary patch literal 1945 zcma)+c~p~E8pc185F)ZgK-nw-wc43x10fLE!eR)e?8sUmgb>4$00{&dDnY1}Dgwfk zQ3}eiNF!o_3IYNGwlpjiDn)PtQLKP0!GReeSvU`Q7`x?;l^T zmj_v0)j$;h0CkG1vk$1ay@7y(a{y#B2NZbZCuC<(!Ee*4Jp+_|39dmL03d|!4W)s; zs@A>Dlmrq3)VDnFi}X?e04S$WoJoFXrL&udG0=1A2RX;LpjMSz7*fVm%G%^Qjsh?JyYGYom zpK(VjKo04L*B<3W%Y#!m~HDJ_Av>8^2|(-Fi4mk|&V7&QpQ&P$7h$rKcoQY?H;)D7u*HD}iiE z%_J=>sp{M*C5IGpkB7hAB@29sve%y~PAjd9=6U7U9OUKqm z@N9IHN^|p+(IDR=ZZ`dgr7sS~FidVxE@xUJA_dm%F0qexuh-S}Uq7eNb)We(!K&%h zmAjO0Rg$XJj;^p=QrzdOmbVx6eyOX2cfQ$LflX2}9=I#2O>FC)%9BeP+Tk0;roLkq z6<_?;oy_wpQFLs(O^zpCc{vTuIdn}NF*XXV()4R^P)mH?l(!UK71w0epCKPLyjkk= zoxjeb=(v(6nGMS>+z@!-`moh)G_zlC_nDz)URXLSvD0=)b>r86HaT2>;*<$RiFBYh zUj+Gf>?k&KzrlxwP5c}#pX(ZmJ5zd(zZ!cu8V-S2$NarMRBXp(Ug-ydRruB0FKDq+TPzKXO0L= z8;9tHLH_eK7{9g->t?XeN=v~e@k(nE3m+0HZ=i4D=+5fY^jg)DweBN{jcr%^CQ`>I zTYc>ebojs&u~*$y-@xM1vb|BC?9GOdqBY^6AEU88`|0x2tTtkpsMfS`XJ&(}z4Hf~ zup{c@-tt274yCL)YT!x^XZHrdrWHrE^t}}U)H<_ z_MF6b6bRsPXdDRO{czSqb3D=P-vEY_xcEOnJUfaRo%a8MaE!gf+?g~wi$e#_ za=8gaEcWeN%oI9}9UsqTaWL#81~%@Ug@cVuLvyHDa|{lPVke>g4B<}pa>trs@Ys-i z8`}Gf@8bPe7jWiiytN-5N3<{};=rOT!7hBPeBToU^!GCQvZJ{?Y7!mb@pu>}E0#l} zCeZhyl}c?4K$G@6Q*siG4tS=fG3YE5g$AZy)T^HZkB|T7INaaI{e7u>m$Bcv(ab&f V+gg_i!T}HgC@vn(^^Ote{{=K$OYi^y literal 0 HcmV?d00001 diff --git a/resources/multimc/multimc.qrc b/resources/multimc/multimc.qrc index bacd1f76..894d8ab9 100644 --- a/resources/multimc/multimc.qrc +++ b/resources/multimc/multimc.qrc @@ -2,27 +2,101 @@ index.theme - scalable/apps/multimc.svg + + scalable/apps/multimc.svg + + scalable/console.svg + + scalable/console_error.svg - scalable/bug.svg - scalable/news.svg + + + 16x16/about.png 22x22/about.png + 24x24/about.png + 32x32/about.png + 48x48/about.png + + + scalable/bug.svg + 16x16/bug.png 22x22/bug.png + 24x24/bug.png + 32x32/bug.png + 48x48/bug.png + + + scalable/centralmods.svg + 16x16/centralmods.png 22x22/centralmods.png + 24x24/centralmods.png + 32x32/centralmods.png + 48x48/centralmods.png + + + scalable/checkupdate.svg + 16x16/checkupdate.png 22x22/checkupdate.png - 22x22/help.png + 24x24/checkupdate.png + 32x32/checkupdate.png + 48x48/checkupdate.png + + + 16x16/help.png + 22x22/help.png + 24x24/help.png + 32x32/help.png + 48x48/help.png + + + 16x16/new.png 22x22/new.png + 24x24/new.png + 32x32/new.png + 48x48/new.png + + + 16x16/copy.png 22x22/copy.png - 22x22/news.png + 24x24/copy.png + 32x32/copy.png + 48x48/copy.png + + + scalable/news.svg + 16x16/news.png + 22x22/news.png + 24x24/news.png + 32x32/news.png + 48x48/news.png + + 16x16/refresh.png 22x22/refresh.png 24x24/refresh.png 32x32/refresh.png 48x48/refresh.png + + + 16x16/settings.png 22x22/settings.png + 24x24/settings.png + 32x32/settings.png + 48x48/settings.png + + + scalable/viewfolder.svg + 16x16/viewfolder.png 22x22/viewfolder.png + 24x24/viewfolder.png + 32x32/viewfolder.png + 48x48/viewfolder.png + + 24x24/cat.png + + 8x8/noaccount.png 16x16/noaccount.png 24x24/noaccount.png diff --git a/resources/multimc/scalable/centralmods.svg b/resources/multimc/scalable/centralmods.svg new file mode 100644 index 00000000..a8b123d0 --- /dev/null +++ b/resources/multimc/scalable/centralmods.svg @@ -0,0 +1,346 @@ + + + + + + + + + + unsorted + + + + + Open Clip Art Library, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons + + + + + + + + + + + + + + image/svg+xml + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/multimc/scalable/checkupdate.svg b/resources/multimc/scalable/checkupdate.svg new file mode 100644 index 00000000..fc09cb4c --- /dev/null +++ b/resources/multimc/scalable/checkupdate.svg @@ -0,0 +1,167 @@ + + + + + + + + + + unsorted + + + + + Open Clip Art Library, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors, Source: GNOME-Colors + + + + + + + + + + + + + + image/svg+xml + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/multimc/scalable/new.svg b/resources/multimc/scalable/new.svg new file mode 100644 index 00000000..c9cff358 --- /dev/null +++ b/resources/multimc/scalable/new.svg @@ -0,0 +1,127 @@ + + + + + + New Document + + + + regular + plaintext + text + document + + + + + Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme, Source: GNOME Icon Theme + + + + + Jakub Steiner + + + + + Jakub Steiner + + + + image/svg+xml + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/multimc/scalable/viewfolder.svg b/resources/multimc/scalable/viewfolder.svg new file mode 100644 index 00000000..4ba0ed0a --- /dev/null +++ b/resources/multimc/scalable/viewfolder.svg @@ -0,0 +1,122 @@ + + + + + + + + + + unsorted + + + + + Open Clip Art Library, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons, Source: Oxygen Icons + + + + + + + + + + + + + + image/svg+xml + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 53f61bea71996eca02ef6f1ca5a7f4a65be1df97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 19 Jan 2014 15:16:32 +0100 Subject: [PATCH 41/45] Remove 24x24 icons :< --- resources/multimc/24x24/about.png | Bin 2051 -> 0 bytes resources/multimc/24x24/bug.png | Bin 1290 -> 0 bytes resources/multimc/24x24/centralmods.png | Bin 1787 -> 0 bytes resources/multimc/24x24/checkupdate.png | Bin 1632 -> 0 bytes resources/multimc/24x24/copy.png | Bin 1417 -> 0 bytes resources/multimc/24x24/help.png | Bin 2089 -> 0 bytes resources/multimc/24x24/new.png | Bin 1468 -> 0 bytes resources/multimc/24x24/news.png | Bin 1295 -> 0 bytes resources/multimc/24x24/refresh.png | Bin 2116 -> 0 bytes resources/multimc/24x24/settings.png | Bin 2109 -> 0 bytes resources/multimc/24x24/viewfolder.png | Bin 1235 -> 0 bytes resources/multimc/multimc.qrc | 11 ----------- 12 files changed, 11 deletions(-) delete mode 100644 resources/multimc/24x24/about.png delete mode 100644 resources/multimc/24x24/bug.png delete mode 100644 resources/multimc/24x24/centralmods.png delete mode 100644 resources/multimc/24x24/checkupdate.png delete mode 100644 resources/multimc/24x24/copy.png delete mode 100644 resources/multimc/24x24/help.png delete mode 100644 resources/multimc/24x24/new.png delete mode 100644 resources/multimc/24x24/news.png delete mode 100644 resources/multimc/24x24/refresh.png delete mode 100644 resources/multimc/24x24/settings.png delete mode 100644 resources/multimc/24x24/viewfolder.png diff --git a/resources/multimc/24x24/about.png b/resources/multimc/24x24/about.png deleted file mode 100644 index 537f37e4bd29bb7635aaa765ae60343e1fd98f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2051 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 A`Tzg` diff --git a/resources/multimc/24x24/centralmods.png b/resources/multimc/24x24/centralmods.png deleted file mode 100644 index c220d033707c5cb423ce2a4cc3a95bd7bc0e3ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3S9S-K49hAo~hjv*e$ zmrgz1FLPD&SpD;R(O0k9+VWQ&OS6&dw{0^_Ym)7m6yelj(Y03Mh;yLWy-nMW$Tx_u znYc({O03uk?gVB*?b94f_PEG>Vt(^O@wPy};jzwiwp*7k$KJjAbw|5vuYANj7iGJZ ztHerQ{eD&RypZ*Qx%=#%s|Tg>76-goTJS-fcOUY$8>*v>$7I>^XVKl+I;ZXJj(XLnJ z%&d2Vd4C+xetE0sqNTPBi=XAyCg=C}6ke{r7u&qsU{l!ry_2>GONO1D7=C~EH$PQ_ z+1&5T8Mkhow69de&zgOqwZM-3DA#31t9fj~87iadij{V4WCkHqAWSX7W3se!iIGj8Cd5KLp*5&rexa-Q@b0@$=uz zJ+rLuuPx}{Saqp1FeAzFV_cr}k|eKeljIwB5~2$xb@JZc*gV^zIz+AR)RRB^Z@lrJ z{DW;{Uy}q2f0S8+VUyCvZl{+FBCTsoJRGn5?_!KiQHe+@PVJkylJQlr|H3Vfwn9?J zw(UP4TwI@2@X-0+MDHGvh0fe(}Rjj?JPVD zemOTy>`f4Tnii?Ob;rR#we9;4G{4@ju-DRk_1vP|pEAo+^f%siNI2**({cNUgx-$h z0;cxKNy+DKY>RI)U7_nx{eb%d6H5SNzF_i7lVvM=Y<%|a_Idsz&}r6_t-V4LqS-2C zff-h<-^G-=^4)j&CUWy!WmafOum(;DV%85}XkCzb@ag0F=U>ihe$q7# znWJ99mhE#q)VXu>qBo48tq(b$nae&nvhna6vskxnd5$50+({*>&6hMaMSP>q{C%u5 z|K1Ik{O6xrrgAj}ak?-?M~P&s1y$@c{`>g$%=dr0&g<_vyKW<2-iEFWMz#quHSC*I zJ*K^=*?HjT>;6l(D;dJ2qXNYX{ZzPA%I3z|zY|sSDXw>S5V`hV;avO2v;7BL1xgNV zJ^1C+%rm+fF4x`(_{%Sej%`o*ncL>W*=^H(cc!rX{PP>~Rrkg*Uk!3`iIr+M{0i`g++l|Z}DiH<4(}LUh?!^?GFBH zdq3{}czwIA?a!XH7Oi1WZA1|6>fX{-v38e_wM(tt3SW*C3CF%P42f- zUz^3<^IRLZIxI)vLj0>sF&?+V{nW(w?VF^Rckk>q-_0-2T+q<#a5A$okdRT#v}3pY zeqbY)(4j4#x8~P=J^9G#PRy?#uU=leIQ#!OyDp<=`gQl_$KJbHRhBgE??Z=L_gm)P z|M&dYiu-%V;?rl&?+234sGZGkd*1(5e{Hp4M8>=`5&PpJG7dG`Yt{b{Q8eV{r(~v8 zLNx$wFbpxUv@$ZYGPQu%AfA^BES?$CK~D0?Ois-!PG!g_DJihh*9Y5`S(cidpPQSX zSFD#`l&+rxQBtg*RH<8>sBf%ips$c$q(F=gANK$seIq?X{pfz1WSAQv&O-_X12bI% zV~`t7EvyWUbq&mbp`bG>H5{lx805y_{L-T2R0jWw%JkGc1Imuh m&>$a}FUrfy_42{0bu&S#!QOapzUnkk3xlVtpUXO@geCxs<@DG9 diff --git a/resources/multimc/24x24/checkupdate.png b/resources/multimc/24x24/checkupdate.png deleted file mode 100644 index db62813f1f03b75c959c24d15597cc6da329944c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 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 E0G^6Op8x;= diff --git a/resources/multimc/24x24/help.png b/resources/multimc/24x24/help.png deleted file mode 100644 index 735ca50a87e4836af0afd94d825b7372857d2819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2089 zcmai#dpy(s9>>2fxlA2Wa(_hSQrJzxYLV8DwUwPEP}(l|^>)kuTKW~-!hTQO3^rp@kA+Ac@zhENlMYCd7YpGfX=41QUPw~uQA&3 zv;#z?e&>NRSk8SVx)F^!;N$fyD`$`zL^Kv9jWN6P2mP+)y0FZjfp(|alY7+zKpe|m zuXNt9it&ZR$tZQ_p!u!1C#O{RLvF80aN#uIUp1Av? zT3GQXy9d96@4Cc>P6!Q~@OxL%3Zlp_=WF$YTWo|QARJWSkI(0hcUAO4VXX3#9$?o0GV<(bRwooW)!_^5x zBrET4%g#LT*opIJr^M2+Ib-t?Qt?jJ?XM)ETp>a=1YQ5(;vK9WWM59#d(Ukh%T2xY zOBE~QW3!CKM=F8ca=V(I9o}rwhR8P zGTzjK)6-v^b?Ag`0%16p)8P7e&?$62CVfc`e!rB{ET={X1>Fm70QqZ+ z{X&q_)>k@gK)j{=>#{~4NobY8NSt?VUg*8_DmM$iWN>wJ{t6aST3|lO7Hkgm!vRI6 zHhZ2VBo#xLSFro)3^p28V|VoO6*k#wU)H6y8?ovNGYQqhWe#H7AyX3K&h;w@JVJ#xP zE8TR1gMT3J46$jF3>-02^jDR|! zr-GB8Oy_(FAa^gzr5j{gZZl8(o~k*D^ljV39(OB_9lt*ikWQJrD((z~_B~2?GA{5u;Uo8eF~+-7s%T3*FUPs1MU-SOs?Bn)x0hJ@ z2M5(uRtA?1r0hzzO9g5txEXcBjQOCt(j-&_(`G2@w63;#?IYulxzkqlb#El)clc9J z3@?@0(M$<^xMN~W;)TUTm#w|Q3_u(Tg9<`B7T%Adz zy)X_%RG`ss=w31nZo*@#{naeK@2^kKsNMdn8GyR;c6RxuPn5lC%fp^?u1oc~>o5XS z8JV%F-i$Isw`Q04jP$#i@c!7n|7%z8^O0tqziEgv7qs2YjUK+p8eGSDUQ(Lkf!M_q z>DQGp%=A>Bu~B9jhU^{NZe(s6@AH-P@gCQ_7&A#ApN)DK^lj>OR%fs2P`NGuOj;!L z)?o$^5Hi;;#U)~yGaIl0(P zoZpZx)g}}j3NOY7&+0VcqS^sAxVhhq+2^g&f9;3#^h7$lZg%L|4#t|&g z;Z%ynF#@C7rpQg{`Q<;JkmGpl&$;L%GA)`wqEM*uVGI(L0;Uic5E3PVa0X0^q`A?; jhy)}YZcYE*90|83MIhm~4k$#*jsW`5QB<`@=%s%HhQ7S~ diff --git a/resources/multimc/24x24/new.png b/resources/multimc/24x24/new.png deleted file mode 100644 index bca3f45beda29d4d224944941c475f26e5294d09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ua371Hn({-St3(}6VDAq*8hOP4V)Ft7G>aSZV| zzICc^zI3Qa+k9jBt&cn3-pKM$beO$FBl8l|DzDav5=Yk4UOGQ`b+kg)L>%N#xF~;s zi&LcW$gnKJWXP zYW+Xw6;D3-E&ohC=k~69yt~6i-eiPMX21T{8x1dcB3mi`IsCQP-1?}~ z-{}+ooU#>M+cc$7xbE+prs=VFEEqTre>inyrRKKP(JhG`tCD&SzR+`$Jbv#$saava zt>SyT;yt&_`9k&bU;lppwAjCXQ|@Lyk%let_OGjN9zA8(V3^g-;V7_R)yEeKR|Ib! z*;Zz-tmT8i=O1dVH`SCfBPK0WDE_x8b?dv%7XfQ_y}y3`?zc_cj{FN&8J<|+!my?B z1m89rSF`nQ?;G!YxvOCrFyn4o_09*|9x4?W))sx!PLP&hm5Z)s5LOLnmSPQ6I5J7f z@2A$xmGY97mzP;Aw>W2AUEkRgFekXH*sJbW-HoXDe=H>;7K|I%4Q5TK5^`*~aHyx& zaq$;MrM>6*dtaUEnQT}2jBf(-U4Da&E~}(Gr~FxZ$(4gKW4qmZPfLl!9dms88S^gP zx9gn5Ri&+=*VNn9Yx~cz*M6Ui@6!N>+*H2rS1lX-p773-)tacrB6`5hly{cn)ozpR zMebf#@|H7}HAtP9+{oo~$&^Jv(8b7sacM`9P2Jl?x0Y;D37N)nS@%0boig`{`xhTv ztdlEOS6%?|r_%-M8LPt+;2cF+Z3wBiz(#Q>f_FjN~RJCasK1Um9yUCgp6X z7E!p$*%Y0<^eVr<|K7p}Zojt&gkJMn-I7?r?ZNog@xY5e+wY$>|MTp_hk|FZSMA!> zr+-=)q_s*xDXska|F6e-XMaBOo#Eoui>u98_c)bs?ekzM{Pd0c+0XYM`Io62am=kc z#tqEFswJ)wCCNppi6yDJDL{h3$iTo-*U(Vc&@{xz*vi1f%E(ODz}(8fAVy@tdYA@~ zN-Kyipaw$&T>~RsBLk2IBQq;QQ-}sO>zGCq4Y~O#nQ4_!4L}HJE^$wH$SgfFTW^VKL?_uSl>OsN8d=# zKtCsoZ3WCih+PD{#Ju#{Y@h~lkcGkdrA5i94DNpZzOD+M$@zH-AsMN;sRw_mWdfBb nAe6+12Km68l~`1wm!6lOn+kT2(UXalK(!2>u6{1-oD!M<`mIcv diff --git a/resources/multimc/24x24/news.png b/resources/multimc/24x24/news.png deleted file mode 100644 index 8679405d66214e8400f4d68a4e7e944b810a01cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 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 WzJbG|tjgE_2>@rTn*-O*Kk479BfUug diff --git a/resources/multimc/24x24/settings.png b/resources/multimc/24x24/settings.png deleted file mode 100644 index a4c6cb327b0ae683537839766ec043f2f116d8bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2109 zcmai$c{~(q7sqGFQWJS;B22n-Z&_+~>x7By29rjYHl{I{7&F6IDr?APDz`F(3NJ&7 zL0QryrfiY5l&qPqL_=iX@5p;U@8|vNeLkOaexK(#=lh)V{B@oLf}^$E4%Hn106@;x z#==>wDw`%NE%u*6Ocuqm&D+eu3;-x@GLT9f6Yr(Z+gn?RRlJst@gv2uonhk^C{~-F zX7$?Fbn`HnVdgE?pZ5Vm@!UKys%L9qMzm=R=eYSLe*iZ|E<|8v!ZAak4f{kS6mLQ5 zTC`#L4^2ZUJb!~XR(rB?dgYT&xX&AR?6ZZjRo0}@Xr$C3pU(|)i)%n#SXAEFHVHEc zAf#p}DNl;vf=kcKrbdLBf?c{9>WiW$hwd6LwWVG(E-X~&I1npqr@dP{4jN0yO};-e z)55p58wQ()3OKb|3=l&@dP;t$C~U4HJ7$PZJDY#y5V*ibn_I_GjAcP`KR@ka-n{Wy z3vQ0WTjL$BukEcn{mC>`<)}_#WjUW;TzRU1AzX7RNDI2di=pscEzKSmfW zm>&35&BxDg_1VMmPA<3W7%-1?=WW%Q!3un`l7?3kmGofOQ9?}Aj)yY2+ZyB29gwM{ z&_QT#*+Xqbs*mGucFbCrlYpltCX#~r`T1kv)f4MUZS9Z0y36^RE6ACVWuZX|@<$0$ z1MIqgZz0mffPu=pC64g~+3|0` zs7oXz4M<-3Rc86?5Lmn`R)WG_ z4!f1l-$pt+x_q6vAWC~no|y?GM^y{&4Dyv*K3uR5fxXRrk^`)7Cgrzy93h;O=mu5T zW8BX5o_h)VeX;v{Bb7$%x5-5T`+*|xp^`!_*F2k1bB3o1q0PlY6?HWhcTd^n3QNjS zjTwBM(0hmJnZ-PXwfk(@+fw;M0SvMLS#B?9iQrB}@Ec(1sv6%+(4i~5xC zMcsOZjc?^H4p{tA^~^yf0(X_Bbe%_iKQ}cV@BafM6KQ4~5m@2O8_7UHzrE6HXx2BQ z$4M4Z_W9}{mzE^0{Nv&E*}`2+41`zw2xJM0D|4-q3ArVl3UsOjgSbbDb()vXAU;Ss!n{MpSY#aHJW`VA{)9Q(4 zvlEC=Chm*jJgjyNSNq6D`h6kvL`xX#@|>`u_9X;+q>r$Z?J{jRO_aafw?E%>y^oV& zz^j&fBU!#-1ug-yi_!e=fX2yt!nul=fu#NyQ>W}hOSm*&Tz8Ld=EmC2xG}?QpM)Eu z?#YQx15dL<>{&x6;w7D@XVbkLsthowPN$0z-a=fuj%muhDnzD?4z7bR|xjH*1egi47I)vnqe z)C-|AhbPm-O+s+%gBqq2B9VbqEg~8vYx;3$<&|JGY4xe^!sH(Bb<--Rb=z^F)cVMF zrAuq0egk~v*3tU$JcZAt1KRMYjI`hd;KA_+#y!yc~AbtGRW8eN4CMWp;lw6{gXUzSHj=q|U zuUcTOogH0ENhmACt;AM_j&JT@v0>!B7tD#!=dQ#{mse_xkR>Cp1p+~|T)2rKiwF7; z^e+liN2;X2o(Q-|GzGl12qmf7Vb($`OnU^|c5D#jq)L^{t9qz&8 zH_s;|Q||(V7|iV(3c~TGrlp0pyJM>RRF@mpQ&Q&CloBis>`Q9bybVfVVZrUAGo|OJ z1?ou9UjPtzwsPE553^K!3U$cA%LqsmK+DF8V+hvz?<)c`w69A(?#9tvLp z=>Q1fT2m9pqw z@iaNWvUFvU11KaG1?DMs05lS51Vf=gvLf23RCAIHk?{A7C>RyG4ls z6cUC+!_Y_~8iPgaW6`KBAZ#U)`9A=S?n(8!_#Z%A0YyX_VNpg{40;QI+>s9w1A3b+ z;i+Vbe;@_m!(uV82*l4?)L;skPNUKN1L5=lZ-n1gN+1GnO~512a1`Q*plowG{(RF` zvH$ZXZOx~fb9V1$#S?TdRtPD80xd8MdoXYu{cR?D=8>|OaV9s z1=IaVg-&|Y;(+dd1MV))_Ey$#j31FV){0E^Zvb2%uk}kXeBU|DQM_*raUp Pg8;C#bhO}^dtCV&>WaOS diff --git a/resources/multimc/24x24/viewfolder.png b/resources/multimc/24x24/viewfolder.png deleted file mode 100644 index 3e95749b9d764e3b64398738db1543843e9dcfb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkEJ36(i&fB*g7?`LPv zoO?FSB+_`Y&aE8^Gpu?OR<>&BnPts&^YutfUdqChq?nPtQqYk_F#11ZE|1wJE~yC% z)Qqif%73oAxBlqunWCJ#UY}_^{?u;YoZ@}Y4~RBQx8HG=$9#RxnfE|qgGP$l0w(!- z3RXPL8~EePtBqVpZu8g_mtaA{2lyw^>+6?zuq~!Gx^<=n)l5- zEU2)7(aLgzb@{Qcy(Tx(Q*)-1HogSvIU*A8q=}-4PTV|mqcAby^Uq}|3hR5Clk`5Ef7`#G(Id|2`Nus!Oq&A3 z+`^h}dcKg835=ADoA-~&U(`9wW&dXRo9C6eKPfvzYF`dwcI7F0xi;V4zF4a^XyftZ z$Nya>+AydoDV_LsZ_A#i=f7H?xBGhJu+*Gu7tiQ=*hL>^k^B2``)_CawRbXp`(OX& zSG7%sQBWn!Fm3z$Yr^t-?(^O&Zw_B{^U+TRt)!5xt9HfCS4+I~`h|k8jG>gy!Zg7X zT$js))b@$q@iPyN&D1W9nX;#m%fj?JSKjgMlMLQ%3-vFZy2>o&V9%KYnl8qklMKFj ze)uk=KWSUbuDDZ7%d~_xX>@*9mY*XZDKg{x?v`1+XIz@TEAO}TIX-vWt~EXTRwg`@ zb2+l)a?ov=ZO8Ua|NEhMzwDV8thiL$*w1VgYYA`g=H2`Wb3^A~@GBUF= zHG^m{<5_kQMMG|WN@iLmZVm2%a=Aba=^!WhWG1KP6{j*}l#~=$>Fa~-$}CGw&d<%w z&nwo;FG|G+U$2W zQb0w*5Jja$$*Bzf6_x3!c?zD%K-a&KSoZ=bt&Wh64-N8xc@<<>K3KJGCP+2dukX!Q Rod#-Q@O1TaS?83{1ORot`WyfN diff --git a/resources/multimc/multimc.qrc b/resources/multimc/multimc.qrc index 894d8ab9..592ea7a1 100644 --- a/resources/multimc/multimc.qrc +++ b/resources/multimc/multimc.qrc @@ -14,7 +14,6 @@ 16x16/about.png 22x22/about.png - 24x24/about.png 32x32/about.png 48x48/about.png @@ -22,7 +21,6 @@ scalable/bug.svg 16x16/bug.png 22x22/bug.png - 24x24/bug.png 32x32/bug.png 48x48/bug.png @@ -30,7 +28,6 @@ scalable/centralmods.svg 16x16/centralmods.png 22x22/centralmods.png - 24x24/centralmods.png 32x32/centralmods.png 48x48/centralmods.png @@ -38,28 +35,24 @@ scalable/checkupdate.svg 16x16/checkupdate.png 22x22/checkupdate.png - 24x24/checkupdate.png 32x32/checkupdate.png 48x48/checkupdate.png 16x16/help.png 22x22/help.png - 24x24/help.png 32x32/help.png 48x48/help.png 16x16/new.png 22x22/new.png - 24x24/new.png 32x32/new.png 48x48/new.png 16x16/copy.png 22x22/copy.png - 24x24/copy.png 32x32/copy.png 48x48/copy.png @@ -67,21 +60,18 @@ scalable/news.svg 16x16/news.png 22x22/news.png - 24x24/news.png 32x32/news.png 48x48/news.png 16x16/refresh.png 22x22/refresh.png - 24x24/refresh.png 32x32/refresh.png 48x48/refresh.png 16x16/settings.png 22x22/settings.png - 24x24/settings.png 32x32/settings.png 48x48/settings.png @@ -89,7 +79,6 @@ scalable/viewfolder.svg 16x16/viewfolder.png 22x22/viewfolder.png - 24x24/viewfolder.png 32x32/viewfolder.png 48x48/viewfolder.png From 58741d2df4e2d78f8034ca60c334d511ff7e1ddb Mon Sep 17 00:00:00 2001 From: ACGaming Date: Sun, 19 Jan 2014 17:38:26 +0100 Subject: [PATCH 42/45] Complete revision of the German language file --- translations/mmc_de.ts | 206 ++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/translations/mmc_de.ts b/translations/mmc_de.ts index f1da9766..7bca2272 100644 --- a/translations/mmc_de.ts +++ b/translations/mmc_de.ts @@ -34,7 +34,7 @@ © 2013 MultiMC Contributors - © 2013 MultiMC Contributors + © 2013 MultiMC-Mitwirkende @@ -80,7 +80,7 @@ p, li { white-space: pre-wrap; } No Language file loaded. Hey, Translator, feel free to put credit to you here - Deutsche Sprachdatei von Kilobyte (siehe oben). Aktualisiert von xnrand (nsfw auf IRC) und Jan. + Deutsche Sprachdatei von Kilobyte (siehe oben). Aktualisiert von xnrand (nsfw auf IRC), Jan und ACGaming. @@ -355,11 +355,11 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Wir wollen das MultiMC open source bleibt da wir glauben das es wichtig ist den Quellcode einem Projekt wie diesem einzusehen. Daher verbreiten wir MultiMC unter der Apache Licens</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Wir wollen, dass MultiMC Open Source bleibt, da wir glauben, dass es wichtig ist, den Quellcode von einem Projekt wie diesem, einzusehen. Daher verbreiten wir MultiMC unter der Apache-Lizenz</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Eine der grunde das wir die Apache Licens gewählt haben ist das wir nicht wollen das der &quot;MultiMC&quot; name benutzt wird beim weiterverbreiten. Dies bedeutet das leute sich die zeit nehmen mussen den code durchzugehen und alle referencen zu &quot;MultiMC&quot;, inkludirend aber nicht begrenzt zu dem &quot;MultiMC&quot; Logo und den titeln in Fenstern (kein *MultiMC-fork* im titel)</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Eine der Gründe, warum wir die Apache-Lizenz gewählt haben, ist, dass wir nicht wollen, dass der &quot;MultiMC&quot;-Name beim Weiterverbreiten benutzt wird. Dies bedeutet, dass Leute sich die Zeit nehmen müssen, den Code durchzugehen und alle Referenzen zu &quot;MultiMC&quot;, miteinbegriffen aber nicht begrenzt zu dem &quot;MultiMC&quot;-Logo und den Fenstertiteln (kein *MultiMC-fork* im Titel)</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Bitstream Vera Sans'; font-size:11pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Die Apache Licens gibt ihnen ein angemessenes recht den namen zu benutzen - eine bemerkung im Über dialog und in der Licens is akzeptabel. Es sollte aber klar sein das das Projekt eine abspaltung ist </span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:600;">ohne</span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;"> unserem Segen</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;">Die Apache-Lizenz gibt Ihnen ein angemessenes Recht, den Namen zu benutzen - eine Bemerkung im Über-Dialog und in der Lizenz ist akzeptabel. Es sollte allerdings klar sein, dass das Projekt eine Abspaltung </span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt; font-weight:600;">ohne</span><span style=" font-family:'Bitstream Vera Sans'; font-size:11pt;"> unserem Segen ist</span></p></body></html> <html><head/><body><p><a href="http://github.com/Forkk/MultiMC5"><span style=" text-decoration: underline; color:#0000ff;">http://github.com/Forkk/MultiMC5</span></a></p></body></html> @@ -492,12 +492,12 @@ p, li { white-space: pre-wrap; } Manage Accounts - Konto verwaltung + Kontoverwaltung <html><head/><body><p>Welcome! If you're new here, you can click the &quot;Add&quot; button to add your Mojang or Minecraft account.</p></body></html> - <html><head/><body><p>Willkommen! Sollten Sie neu sein können Sie &quot;Hinzufügen&quot; drucken um ihr Mojang oder Minecraft Konto hinzuzufügen</p></body></html> + <html><head/><body><p>Willkommen! Solltest du neu sein, kannst du die &quot;Hinzufügen&quot;-Schaltfläche drucken um dein Mojang- oder Minecraft-Konto hinzuzufügen</p></body></html> @@ -517,12 +517,12 @@ p, li { white-space: pre-wrap; } &Set Default - &Benutze als voreinstellung + &Benutze als Voreinstellung Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set. - Mache die Voreinstellung rückgängig. Wenn kein Konto voreingestellt ist wird MultiMC dich beim jedem Start einer Instanz fragen, welches Konto benutzt werden soll, es sei denn die Instans hat ein Instanz-spezifisches Konto eingeställt. + Mache die Voreinstellung rückgängig. Wenn kein Konto voreingestellt ist, wird MultiMC dich bei jedem Start einer Instanz fragen, welches Konto benutzt werden soll, es sei denn, die Instanz hat ein instanzspezifisches Konto eingestellt. @@ -532,7 +532,7 @@ p, li { white-space: pre-wrap; } Please enter your Mojang or Minecraft account username and password to add your account. - Bitte gib Benutzernamen und Passwort deines Mojang- oder Minecraft-Kontos an um es hinzuzufügen. + Bitte gib Benutzernamen und Passwort deines Mojang- oder Minecraft-Kontos an, um es hinzuzufügen. @@ -550,7 +550,7 @@ p, li { white-space: pre-wrap; } Select an account. - Wähle ein konto. + Wähle ein Konto. @@ -599,7 +599,7 @@ p, li { white-space: pre-wrap; } &Kill Minecraft - &Minecraft Killen + &Minecraft töten @@ -608,7 +608,7 @@ p, li { white-space: pre-wrap; } Kill Minecraft - Minecraft Killen + Minecraft töten Close @@ -617,7 +617,7 @@ p, li { white-space: pre-wrap; } Kill Minecraft? - Minecraft Killen? + Minecraft töten? @@ -663,7 +663,7 @@ p, li { white-space: pre-wrap; } Reading file list for current version... - Bearbeite die Dateilsite der benutzten Version... + Bearbeite die Dateiliste der benutzten Version... @@ -678,7 +678,7 @@ p, li { white-space: pre-wrap; } Processing file lists - figuring out how to install the update... - Bearbete Dateilisten - Rechne aus, wie das Update installiert werden soll... + Bearbeite Dateilisten - Rechne aus, wie das Update installiert werden soll... @@ -706,7 +706,7 @@ p, li { white-space: pre-wrap; } Email / Username - Email / Benutzername + E-Mail / Benutzername @@ -805,7 +805,7 @@ p, li { white-space: pre-wrap; } Show console while the game is running? - Konsole anzeigen wenn das Spiel läuft? + Konsole anzeigen, während das Spiel läuft? @@ -843,12 +843,12 @@ p, li { white-space: pre-wrap; } Minimum memory allocation: - Min. Arbeitspeicher: + Min. Arbeitsspeicher: Maximum memory allocation: - Max. Arbeitspeicher: + Max. Arbeitsspeicher: @@ -887,7 +887,7 @@ p, li { white-space: pre-wrap; } Post-exit command: - Nach-abschluss-Befehl: + Nach-Abschluss-Befehl: @@ -897,7 +897,7 @@ p, li { white-space: pre-wrap; } Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working directory with INST_ID, INST_DIR, and INST_NAME as environment variables. - Vor-Start wird ausgeführt, bevor die Instanz startet, Nach-Ende nachdem die Instanz beendet wurde. Beide werden Im ausführungsverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. + Vor-Start-Befehle werden ausgeführt, bevor die Instanz startet, Nach-Ende-Befehle nachdem die Instanz beendet wurde. Beide werden im Hauptverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. @@ -912,17 +912,17 @@ p, li { white-space: pre-wrap; } Java test success - Java test erfolgreich abgeschlossen + Java-Test erfolgreich abgeschlossen Java test failure - Java test fehlgeschlagen + Java-Test fehlgeschlagen The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. - Das ausgewählte Java-Programm hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den Pfad zum Java-Programm angeben. + Das ausgewählte Java-Programm hat nicht funktioniert. Du solltest die Auto-Erkennung benutzen, oder den Pfad zum Java-Programm angeben. @@ -938,7 +938,7 @@ p, li { white-space: pre-wrap; } Manage Lwjgl Versions - LWJGL Versionsverwaltung + LWJGL-Versionsverwaltung @@ -948,7 +948,7 @@ p, li { white-space: pre-wrap; } &Refresh - Anktualisie&ren + &Aktualisieren @@ -992,12 +992,12 @@ p, li { white-space: pre-wrap; } Move &Up - &Nach Oben + Bewege &nach oben Move &Down - Nach &Unten + Bewege &nach unten @@ -1031,7 +1031,7 @@ p, li { white-space: pre-wrap; } Select Resource Packs - Resourcenpacks auswählen + Ressourcenpakete auswählen @@ -1062,12 +1062,12 @@ p, li { white-space: pre-wrap; } Downloading new LWJGL... - LWJGL wird herruntergeladen... + LWJGL wird heruntergeladen... Installing new LWJGL... - Das neue LWJGL wird installiert... + Neues LWJGL wird installiert... @@ -1077,12 +1077,12 @@ p, li { white-space: pre-wrap; } Checking for jar updates... - Suche nach jar Änderungen... + Suche nach Jar-Änderungen... Downloading new minecraft.jar ... - Neue minecraft.jar wird herruntergeladen... + Neue minecraft.jar wird heruntergeladen... @@ -1158,11 +1158,11 @@ p, li { white-space: pre-wrap; } Invalid username or password. - Falsche Kombination von Nutzernamen und Passwort. + Falscher Nutzername oder Passwort. Launcher outdated, please update. - Veralteter Launcher, Bitte lade ein Update herunter. + Veralteter Launcher, bitte lade ein Update herunter. Login failed: %1 @@ -1192,18 +1192,18 @@ p, li { white-space: pre-wrap; } Select a mod to view title and authors... - Wähle einem Mod aus, um Titel und Autoren zu sehen... + Wähle eine Modifikation aus, um Titel und Autor(en) zu sehen... Select a mod to view description... - Wähle ein Mod um die Beschreibung zu sehen... + Wähle eine Modifikation aus, um die Beschreibung zu sehen... No description provided in mcmod.info - mcmod.info wurde nicht mit einer Beschreibung versehen + mcmod.info wurde mit keiner Beschreibung versehen @@ -1268,7 +1268,7 @@ p, li { white-space: pre-wrap; } Reload the instance list. - Instanzliste neu Laden. + Instanzliste neuladen. @@ -1321,7 +1321,7 @@ p, li { white-space: pre-wrap; } Open the MultiMC dev blog to read news about MultiMC. - Den MultiMC Entwicklerblog öffnen und Neuigkeiten über MultiMC erfahren. + Den MultiMC-Entwicklerblog öffnen, um Neuigkeiten über MultiMC zu erhalten. @@ -1337,7 +1337,7 @@ p, li { white-space: pre-wrap; } Open the MultiMC development blog to read more news about MultiMC. - Öffne den MultiMC Entwicklerblog um mehr Nachrichten zu MultiMC zu lesen. + Öffne den MultiMC-Entwicklerblog, um weitere Neuigkeiten über MultiMC zu erhalten. @@ -1475,7 +1475,7 @@ p, li { white-space: pre-wrap; } Open the selected instance's root folder in a file browser. - Den Wurzelordner der Aktuellen Instanz im Dateimanager öffnen. + Das Hauptverzeichnis der aktuellen Instanz im Dateimanager öffnen. @@ -1527,7 +1527,7 @@ p, li { white-space: pre-wrap; } Manage your Mojang or Minecraft accounts. - Verwalte diene Mojang- und Minecraft -onten. + Verwalte deine Mojang- und Minecraft-Konten. <html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnatok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html> @@ -1552,8 +1552,8 @@ p, li { white-space: pre-wrap; } No MultiMC update was found! You are using the latest version. - Kein update zu MultiMC konnte gefunden werden! -Sie benutzen die neuste Version. + Es wurde kein Update für MultiMC gefunden! +Du verwendest bereits die neueste Version. @@ -1573,7 +1573,7 @@ Sie benutzen die neuste Version. No news available. - Keine Nachrichten zugänglich. + Keine Nachrichten verfügbar. @@ -1593,8 +1593,8 @@ Sie benutzen die neuste Version. MultiMC cannot download Minecraft or update instances unless you have at least one account added. Please add your Mojang or Minecraft account. - MultiMC kann Minecraft nicht herrunterladen und keine Instanzen aktualisieren so lange Sie nicht mindestens ein Konto angegeben haben. -Bitte fügen Sie Ihr Mojang oder Minecraft Konto hinzu. + MultiMC kann Minecraft nicht herunterladen und keine Instanzen aktualisieren, solange du kein Konto erstellt hast. +Bitte füge dein Mojang- oder Minecraft-Konto hinzu. @@ -1615,7 +1615,7 @@ Bitte fügen Sie Ihr Mojang oder Minecraft Konto hinzu. This is permanent! Are you sure? About to delete: - Dies ist permanent! Sind sie sich sicher? + Die Änderung ist dauerhaft! Bist du dir sicher? Die folgende Instanz löschen: @@ -1636,17 +1636,17 @@ Die folgende Instanz löschen: In order to play Minecraft, you must have at least one Mojang or Minecraft account logged in to MultiMC.Would you like to open the account manager to add an account now? - Damit sie Minecraft spielen können mussen sie mindestens ein Mojang- oder Minecraft-Konto in MultiMC hinterlegen. Wollen sie die Konto Verwaltung öffen um ein Konto hinzuzufügen? + Um Minecraft spielen zu können, musst du mindestens ein Mojang- oder Minecraft-Konto in MultiMC hinterlegen. Möchtest du die Kontoverwaltung öffnen, um ein Konto hinzuzufügen? Which account would you like to use? - Wälches Konto wollen Sie benutzen? + Welches Konto möchtest du benutzen? Your account is currently not logged in. Please enter your password to log in again. - Ihr Konto ist momentan nicht angemeldet. Bitte geben sie ihr passwort an um sich anzumelden. + Dein Konto ist momentan nicht angemeldet. Bitte gib dein Passwort an, um dich anzumelden. @@ -1686,12 +1686,12 @@ Die folgende Instanz löschen: Are you sure? - Sind Sie sicher? + Bist du sicher? This will remove any library/version customization you did previously. This includes things like Forge install and similar. - Dies will sämtliche Bibliotheks/Versions-Anpassung die Sie vorgenommen haben entfernen. Dies schließt Sachen wie Forge mit ein. + Dies wird sämtliche Bibliotheken-/Versions-Anpassungen, die du vorgenommen hast, entfernen. Dies schließt Dinge wie Forge mit ein. @@ -1711,12 +1711,12 @@ Die folgende Instanz löschen: Invalid version selected - Ungültige version ausgewählt + Ungültige Version ausgewählt You didn't select a valid Java version, so MultiMC will select the default. You can change this in the settings dialog. - Sie haben keine gültige Java-Version ausgewählt, daher wird MultiMC für Sie eine Voreinstellung benutzen. Sie können dies in den Einstellungen ändern. + Du hast keine gültige Java-Version ausgewählt, daher wird MultiMC die Voreinstellung benutzen. Du kannst dies in den Einstellungen ändern. @@ -1731,13 +1731,13 @@ Die folgende Instanz löschen: Minecraft crashed with exitcode %1. Message displayed on instance crashed - Minecraft ist mit dem Status %1 abgesturtzt + Minecraft ist mit dem Status %1 abgestürzt Minecraft was killed by user. Message displayed after the instance exits due to kill request - Minecraft wurde durch den Nutzer gekillt. + Minecraft wurde durch den Nutzer getötet. @@ -1758,7 +1758,7 @@ Die folgende Instanz löschen: use the supplied directory as MultiMC root instead of the binary location (use '.' for current) - Benutze das angegebene Verzeichnis als Arbeitsverzeichnis anstelle des Speicherorts. (Benutze '.' um das aktuele Verzeichnis zu verwenden) + Benutze das angegebene Verzeichnis als Hauptverzeichnis anstelle des Speicherorts. (Benutze '.', um das aktuelle Verzeichnis zu verwenden) replaces the given file with the running executable @@ -1766,27 +1766,27 @@ Die folgende Instanz löschen: <path> - <pfad> + <Pfad> doesn't restart MultiMC after installing updates - MultiMC nach dem Update nicht neu starten + MultiMC nach dem Update nicht neustarten tries to launch the given instance - Versucht die angegebene Instanz zu starten + Versucht, die angegebene Instanz zu starten <inst> - <instanz> + <Instanz> CommandLineError: - KommandoZeilenFehler: + Kommandozeilenfehler: Try '%1 -h' to get help on MultiMC's command line parameters. - Versuche '%1 -h' um Hilfe zu MultiMCs Kommandozeilenparametern zu bekommen. + Versuche '%1 -h', um Hilfe zu MultiMCs Kommandozeilenparametern zu bekommen. Performing MultiMC update: @@ -1861,7 +1861,7 @@ Die folgende Instanz löschen: Couldn't load the version config - Fehlschlag beim laden der Versions-Konfiguration + Fehlschlag beim Laden der Versions-Konfiguration @@ -1915,7 +1915,7 @@ Die folgende Instanz löschen: Install Forge - Forge Installieren + Forge installieren @@ -1925,7 +1925,7 @@ Die folgende Instanz löschen: Create an customized copy of the base version - Eine modifizierbare Kopie der Version erstellen + Eine modifizierte Kopie der Version erstellen @@ -1945,12 +1945,12 @@ Die folgende Instanz löschen: Add new libraries - + Füge neue Bibliotheken hinzu Remove selected libraries - + Entferne ausgewählte Bibliotheken @@ -1973,7 +1973,7 @@ Die folgende Instanz löschen: Resource Packs - Resourcenpacks + Ressourcenpakete @@ -1994,7 +1994,7 @@ Die folgende Instanz löschen: Unable to open custom.json, check the settings - Fehler beim Öffnen der custom.json Datei, überprüfen Sie Ihre Einstellungen + Fehler beim Öffnen der custom.json-Datei, überprüfe deine Einstellungen @@ -2004,7 +2004,7 @@ Die folgende Instanz löschen: This will revert any changes you did to the version up to this point. Is that OK? - Dies wird alle Änderungen, die du vorgenommen hast zurücksetzen. Bist du damit einverstanden? + Dies wird alle Änderungen, die du vorgenommen hast, zurücksetzen. Bist du damit einverstanden? @@ -2020,7 +2020,7 @@ Die folgende Instanz löschen: For reasons unknown, the LiteLoader installation failed. Check your MultiMC log files for details. - Aus unbekannten Gründen ist die Installation von LiteLoader fehlgeschlagen. Schauen sie sich Ihre MultiMC Logdateien an, um weitere Details zu erhalten. + Aus unbekannten Gründen ist die Installation von LiteLoader fehlgeschlagen. Sieh dir die MultiMC-Logdateien an, um weitere Details zu erhalten. @@ -2034,7 +2034,7 @@ Die folgende Instanz löschen: Getting the version files from Mojang... - Versionsdateien von Mojang werden herruntergeladen... + Versionsdateien von Mojang werden heruntergeladen... @@ -2054,7 +2054,7 @@ Die folgende Instanz löschen: Preparing for launch... - Der Start wird vorbereitet... + Start wird vorbereitet... @@ -2080,16 +2080,16 @@ Die folgende Instanz löschen: JVM arguments warning - JVM argument verwarnung + JVM-Argument-Warnung You tried to manually set a JVM memory option (using "-XX:PermSize", "-Xmx" or "-Xms") - there are dedicated boxes for these in the settings (Java tab, in the Memory group at the top). Your manual settings will be overridden by the dedicated options. This message will be displayed until you remove them from the JVM arguments. - Sie haben versucht manuel eine JVM Speicher option anzugeben ("-XX:PermSize", "-Xmx" oder "-Xms") - es gibt hierfür gewidmete boxen in den einstellung (Java tab, in der Speicher gruppe am anfang). -Ihre manuellen einstellungen werden von den gewidmeten überschrieben werden. -Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfernt haben. + Du hast versucht, eine JVM-Arbeitsspeicheroption manuell anzugeben ("-XX:PermSize", "-Xmx" oder "-Xms") - es gibt hierfür vorgesehene Felder in den Einstellungen (Java-Reiter, im Arbeitsspeicher-Bereich oben). +Deine manuellen Einstellungen werden von den vorgesehenen überschrieben. +Diese Mitteilung wird so lange angezeigt, bis du die Option entfernt hast. @@ -2099,7 +2099,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer The mod author didn't provide a website link for this mod. - Der Autor des mods hat keine link zu einer webseite angegeben. + Der Autor der Modifikation hat keine URL hinterlegt. @@ -2107,12 +2107,12 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Refreshing login token... - Auffrischung des Login-Tokens... + Erneuerung des Login-Tokens... Refreshing login token: Processing response... - Auffrischung des Login-Tokens: Verarbeite Antwort... + Erneuerung des Login-Tokens: Verarbeite Antwort... @@ -2150,7 +2150,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Use development builds? - Entwicklerversionen benutzen? + Entwicklungsversionen benutzen? @@ -2222,7 +2222,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer JSON Editor: - JSON Editor: + JSON-Editor: @@ -2257,7 +2257,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Show console while the game is running? - Konsole anzeigen wenn das Spiel läuft? + Konsole anzeigen, während das Spiel läuft? @@ -2334,7 +2334,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Post-exit command: - Nach-abschluss-Befehl: + Nach-Abschluss-Befehl: @@ -2344,7 +2344,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working directory with INST_ID, INST_DIR, and INST_NAME as environment variables. - Vor-Start wird ausgeführt, bevor die Instanz startet, Nach-Ende nachdem die Instanz beendet wurde. Beide werden Im ausführungsverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. + Der Vor-Start-Befehl wird ausgeführt, bevor die Instanz startet, der Nach-Ende-Befehl, nachdem die Instanz beendet wurde. Beide werden im Hauptverzeichnis von MultiMC gestartet. Verfügbare Umgebungsvariablen: INST_ID, INST_DIR, INST_NAME. @@ -2379,7 +2379,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer JSON Editor - JSON Editor + JSON-Editor @@ -2389,22 +2389,22 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer The file chosen does not seem to be an executable - Die ausgesuchte Datei scheint keine Anwendung zu sein + Die ausgewählte Datei scheint keine Anwendung zu sein Development builds - Entwicklerversionen + Entwicklungsversionen Development builds contain experimental features and may be unstable. Are you sure you want to enable them? - Entwicklerversionen enthalten experimentelle Features und können instabil sein. Möchtest du Sie dennoch aktivieren? + Entwicklungsversionen enthalten experimentelle Features und können instabil sein. Möchtest du sie dennoch aktivieren? Select a Java version - Wähle Java version + Wähle eine Java-Version @@ -2415,17 +2415,17 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Java test success - Java test erfolgreich abgeschlossen + Java-Test erfolgreich abgeschlossen Java test failure - Java test fehlgeschlagen + Java-Test fehlgeschlagen The specified java binary didn't work. You should use the auto-detect feature, or set the path to the java executable. - Das ausgewählte Java-Program hat nicht funktioniert. Sie sollten die Auto-Erkennung benutzen, oder den Pfad zum Java-Programm angeben. + Das ausgewählte Java-Program hat nicht funktioniert. Du solltest die Auto-Erkennung benutzen oder den Pfad zum Java-Programm angeben. @@ -2444,12 +2444,12 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer MultiMC Update - Neue MultiMC Version + Neue MultiMC-Version A new MultiMC update is available! - Eine Neue Version von MultiMC ist jetzt verfügbar! + Eine neue Version von MultiMC ist verfügbar! @@ -2459,12 +2459,12 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer Update after MultiMC closes - Herunterladen wenn MultiMC geschlossen wird + Herunterladen, wenn MultiMC geschlossen wird Don't update yet - Noch nicht herrunterladen + Noch nicht herunterladen @@ -2515,7 +2515,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer <b>SSL Handshake failed.</b><br/>There might be a few causes for it:<br/><ul><li>You use Windows XP and need to <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">update your root certificates</a></li><li>Some device on your network is interfering with SSL traffic. In that case, you have bigger worries than Minecraft not starting.</li><li>Possibly something else. Check the MultiMC log file for details</li></ul> - <b>SSL-Handshake fehlgeschlagen.</b><br/>Es kann mehrere Erklärungen geben:<br/><ul><li>Sie benutzen Windows XP und mussen <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">Ihr root certifikat aktualisieren</a></li><li>Irgend ein gerät in Ihrem Netzwerk mischt sich in den SSL verkehr mit ein. In diesem fall haben sie grössere probleme alls das Minecraft nicht starten kann.</li><li>Möglicherweise irgendetwas anderes. Sehen sie in der MultiMC log Datei nach um weitere Details zu finden</li></ul> + <b>SSL-Handshake fehlgeschlagen.</b><br/>Es kann mehrere Erklärungen geben:<br/><ul><li>Du benutzt Windows XP und musst <a href="http://www.microsoft.com/en-us/download/details.aspx?id=38918">dein Stammzertifikat aktualisieren</a></li><li>Ein Gerät in deinem Netzwerk mischt sich in den SSL-Verkehr ein. In diesem Fall hast du größere Probleme, als das, dass Minecraft nicht gestartet werden kann.</li><li>Möglicherweise etwas anderes. Prüfe die MultiMC-Logdatei für Details</li></ul> @@ -2530,7 +2530,7 @@ Diese Mitteilung wird angezeigt werden bis Sie sie von den JVM argumenten entfer An unknown error occurred when trying to communicate with the authentication server: %1 - Ein unbekannter Fehler ist aufgetreten bei der Kommunikation mit den Authentifizierungs-Server: %1 + Ein unbekannter Fehler ist bei der Kommunikation mit den Authentifizierungs-Servern aufgetreten: %1 From e9ed4b29bca585d0e45c2d24224e04ffdc1691fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 19 Jan 2014 22:07:59 +0100 Subject: [PATCH 43/45] Add 64x64 icon versions --- resources/multimc/16x16/cat.png | Bin 0 -> 736 bytes resources/multimc/16x16/refresh.png | Bin 1389 -> 931 bytes resources/multimc/22x22/cat.png | Bin 0 -> 1034 bytes resources/multimc/22x22/refresh.png | Bin 1843 -> 1283 bytes resources/multimc/24x24/cat.png | Bin 811 -> 1252 bytes resources/multimc/32x32/cat.png | Bin 0 -> 1678 bytes resources/multimc/32x32/refresh.png | Bin 2822 -> 2182 bytes resources/multimc/48x48/cat.png | Bin 0 -> 2733 bytes resources/multimc/48x48/refresh.png | Bin 3922 -> 3743 bytes resources/multimc/64x64/about.png | Bin 0 -> 5513 bytes resources/multimc/64x64/bug.png | Bin 0 -> 4263 bytes resources/multimc/64x64/cat.png | Bin 0 -> 4033 bytes resources/multimc/64x64/centralmods.png | Bin 0 -> 4408 bytes resources/multimc/64x64/checkupdate.png | Bin 0 -> 5858 bytes resources/multimc/64x64/copy.png | Bin 0 -> 2884 bytes resources/multimc/64x64/help.png | Bin 0 -> 5402 bytes resources/multimc/64x64/new.png | Bin 0 -> 3949 bytes resources/multimc/64x64/news.png | Bin 0 -> 4968 bytes resources/multimc/64x64/refresh.png | Bin 0 -> 5745 bytes resources/multimc/64x64/settings.png | Bin 0 -> 7125 bytes resources/multimc/64x64/viewfolder.png | Bin 0 -> 2134 bytes resources/multimc/index.theme | 3 ++ resources/multimc/multimc.qrc | 64 +++++++++++++++--------- resources/multimc/scalable/bug.svg | 28 +++++------ 24 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 resources/multimc/16x16/cat.png create mode 100644 resources/multimc/22x22/cat.png create mode 100644 resources/multimc/32x32/cat.png create mode 100644 resources/multimc/48x48/cat.png create mode 100644 resources/multimc/64x64/about.png create mode 100644 resources/multimc/64x64/bug.png create mode 100644 resources/multimc/64x64/cat.png create mode 100644 resources/multimc/64x64/centralmods.png create mode 100644 resources/multimc/64x64/checkupdate.png create mode 100644 resources/multimc/64x64/copy.png create mode 100644 resources/multimc/64x64/help.png create mode 100644 resources/multimc/64x64/new.png create mode 100644 resources/multimc/64x64/news.png create mode 100644 resources/multimc/64x64/refresh.png create mode 100644 resources/multimc/64x64/settings.png create mode 100644 resources/multimc/64x64/viewfolder.png diff --git a/resources/multimc/16x16/cat.png b/resources/multimc/16x16/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e31b44b25b476affa6d4db6f53a2aa40add758 GIT binary patch literal 736 zcmV<60w4W}P)A$tJ?GxJoqu$w)lvhDBr*z0VvQRUi9{P$ViWlQZrr$cp&!6+LEMnAbioQY zLK=+_aX}-YR*O=~gpNa}L+4-bJ@<8SiK$vn@+K!IIZxi-^K;!tk9lybk4er}uZ@Us z&=Jw4_ZL3eSzK7+r58>f?+v@}^#{E>UYrs~5vPv7!HFZUASMj<25ffj@vytWXfi+$ z_QKxVxBvL@^3A*7rQ>W^d$W1=Qvfdr2vn!))XLKc!kj3r`BS8MMyJ4<0ns@2vc#Ha;fqUV75NjIXc^1+1c%~v30L_98V_HD-GT`^Fh*_dwIQ3 zS&WKWC8?RJGr;C&j{Vj;cBX_tqj4BBgEZYkfO=GEOqUz&{Q$s3!~`)BwMOOeow}AP z3e;*f%nSvgO62Pyc{R(@|AjX*3`0clxJJ#Y7iOrwIC!#KI1m*oB-N0IcU@+&_c4)= z5m7`05kW=pE+UnDF8A`8!=EfulA=bG3F#!ktt7d>l36%wkvma}5-nB$6+umUHW;nu z#NUE#8o2>To(H@->LgPMrCGy{1oERfHZ9MzCV_|S*E^l&Yo9;Xs0009ZNklS%{TkHi4U>OUH z7&sALsFa4BcHBlsi`N(NcYV_oTp>fLE+?7NJ`-n~al@Wnou%pVX}HD(NrFWL?)c)2 z(V*?-Hg_X=9Z6)U=pP^fiPjVi7}^HOwgBxYl$hT>Q@=M)VO)P@k@4 zTnt;PyXeHo;i=5NaBcB84y1%WAnVRhE((X1*ndy#dHNhgU)U%(Hp<+GYG`AD;0^FJr1Y;?rHi4I%c_;FMZc-9 zq7T$6%fniZV)eSeBb3WKbLV*h0qzqD$854D7|H%j6nwkd<=EpT+aF67^lR}}dIULp zJAeC5V=Mfo=cb$VFb}Q}paNm{V2qtZ5t@TBTKx%%+^I&_<>{~~mjHZ+oc+f{0AB7s z;J)RJa<4L0Wbv^S?XrY*i{b8E+vsaq7~WHF0(d*`Tq5Uw=X@Bzi@Bb#7#%kTlo_)C i;D=oA=f-vH;~!CSYaU5(-z)$C002ovP6b4+LSTZ_cCzyT literal 1389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3^B*n9%f)*PW5zg46!)vJ2~5D zYAM69`v2c+|3A0Yf4)euv+rI)p) z-7UG|e=sC4%O#u=a^|n`xhGdFK4<#@52fyd*BE(w|GVot>q+Sei94RVzB)DXEDf)2rs&-7c%WI^E;=0>keT@jSfCjBcLUv(Wpjo<*IG(CQnv zuc@VP@m$C6_u*N)x}Ep)&Fm8nW-iYAy6jm+D(~Z$UQ*NK68^t@UN>`}@mC(T?VgDf z)nkHZzPP_@W!>MW+RQV%z?J_Yj(>VjN3b_C;h=PiC+`7-D>veF*#@3b3pZhY)UvN3`;cM{vEv5Fi?_F|g zl}oND_RcxG>d14)$R#_sy*#CPG%?+$*v`*dq#UWU)_?Hf}XWPg^$*_Bkin>}&$S+;!(Yy7>Ji(M8m zQWU#v=H1txtX;IK!J#1_W1ruhT!mWiOCK*@?7X<~y)~yOFXy+G17A&wUfpQSjb$&l z-8Wfl^(5ivRd44nJ669nC4ysV_B!VJ^ZIvw8e7)g{Cdak%mbYu_YJ#W+}FP$^z72^ z_tD=kO#CMMw$u3U-u?f}ULP~-`M@+!FYuCc+omVeYM4&YM5rDpE^6t@z*F2+Vz|C9V-A$wjG&C8@e8K!U-@ zz`#=1&`{UVG{n%%%D}?P#8B73+{(Z}W!=LEFbyD;RuEl44Tc7~21dF@1|deqRz_x4 zh87SF>2GX-#R9|zu!h|Hl+3hBs0N@7h9L%)K-E^p<`4}FlDyskHJE~&wH$SgfFTW^VKL?_uSl`Dzz(?Om&rsj`;1&s(jS$NS_^Dcc z`W2uCNsx`f`DrEPiAAXljw$&`sS2LCiRr09sfj6-g(p*OfQon_ib{);QyKh9%kpy) z*Z7-$1WK47B;rGZd|*y4FE7{2OwP~K&CbkA*8@6Szn~~TD>b>KSU(S}UBAqB3#dS4 N@O1TaS?83{1OW6PPQL&E diff --git a/resources/multimc/22x22/cat.png b/resources/multimc/22x22/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea7ba69e477a9e6b6395e884a542545ddbe1ec8 GIT binary patch literal 1034 zcmV+l1oiugP)&d zDx<%Yd1lWMoU`01-)21_A}1d0ePZgwfm6|wyAJZyu0zz5=%iD-y%tr5{pCcbmQBSi zZ0p&L@A(KqoJ7nlPEiRL?gFdo%c#6jx-)!zt~#?LjB07QI=%Do-eYF~n&8x?^mgy$ zp`JahzKG(G>4gbO6T{q^8YNEa7-LA1xH3HT$C=Vx|4Y?{I@xwZSFrU`E+~WmrqzX0 zM`DxaNNqyK&+y>pUJma)#tVI?IC0=rPWHV{K2v-=4lSR2^DY3Ne*GSGGrw|?RFI{d=ZMs(S`6v!g z504F${}(Lc0s7e3bm{Y}BNva3&)&RO>MZbzsw=BDgnNP;m9L*3xN+sHfzs7%6o>co za2=Rz71jhB<57>pw=Q1)>5Gx^!TSN1Bv;Ube zK06+G_=nByJ#}>!w_Lep@LXkvY>=mzZ|BbJ@QbsHQ!8x=1b#q}$+A$J!!EU(@A-5T zx`v{-#$W&Z#$!^qwPxadrRd<2vW4MO9RlzzYbMz@FzbGe5EL z`_Khu7A9A2(iZz!Zv$Jqwq2s}*wz@LzL#mvi-k_zobPLX+O>#lgkZ#g@|;6YZXoC_5Hvf< z2Pl#?7PCpwKH{{)^L#R1K%7LlrEa+!+i;y^IPRxGYHfNWAh?-DlO{MNMet%^)>uY! z_?;nfPg}kn0P8G`Yi+=Mlfj6g7A~fVmC22g8wV<&&R@D+QB`~~6v-8`1lt_CPmtYp zl6?`$BjTAY7?S}JQLLb`sLXp#ZU$>U4^8sk#POr17XX5@hn^aw)pe zhXP2O!xca?OUHL07Njmn)#9oki;Atz6UGV734&9{zk7SmFSdsaMgRZ+07*qoM6N<$ Ef(+;N@Bjb+ literal 0 HcmV?d00001 diff --git a/resources/multimc/22x22/refresh.png b/resources/multimc/22x22/refresh.png index 734729bf8246835878539ed1b7f5f208271ab9fe..45b5535ce420dff6a52b31609225245a2174de59 100644 GIT binary patch delta 1262 zcmV0b000?u zMObuGZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs000DlNkl3=N+g%U|L3gr??ph^fJ zR9Xu(igJmHM1z|6&=5nSZ#*<67(sy$V>-Wk#)L^*L0@?Il9j#J`p(K)$=L+piSX!) zdeW$gwy=73K5J9fWI<2CRAEnHB(F2?w!6*!J*!~{C_wXP)|Gr(@@TP8Prk&)#NP{F zFGSVhDs+9)g@5f|Z^zE>cB22werz1sh?N5?VXiapvDLJTe3Zm_iq+7CWdqA5XNf69 zs$466mbpG7((+*oc6_tral}6I;V_$~ny$4#R3N<6^5peIv6u1O9{lhq&wA z5X-p0FMr)lTBBAk>?bj~nG_==Z;*ZB1EHOPZDCk)dwiSvwLBDkUWCH4g_wJ2E*x7O(ALUv zu@+SR@^*MJZ}U9lzLpCLP*fb@^IbbbETyk={3_N6kZL5zVF^mL1hJAqst_QD1eo>e zX#f;WW~xvAQ>)ZqtFpnUH9(C7wOo!ce_T8h>L*GnS7c|EE;<_Y>G$!DrC*}kr%D1f zbALJs39SmmARB#@n3d6dd!yl&ngmM;3A*Z+w2F2%** zwl($^{e@Y-O$t(t71kp1ZUN>26`r94@IuT#>Bi#IsVF#;j{J{PIng+cpQYXAcYhOE zN9|)7?_0Z_ZMOF)MENttF~opyA#<|@=b(YiBNlQ$aAEOC8lF9$g4`=EHZ<7&v}LXG|ZQ;{i~SIP!|I1va7{5mAl`Cyx|lq9#4b!YBDk>EO>rO zh{5C7*~?>D$nJ9d!2)!ZR#N(ZzGom5pi;9|y=87tk-y)-)8j5UCk)so6?m?jcxK!K zTb}}Bjr<#L=2edV|DUEXsl4D7-p#0Eo&GZmv-?y_5A1dNO(DoGk)O8nF71zd^PUKQ Y1Bb!Ny~%9<;Q#;t07*qoM6N<$f?MZli2wiq literal 1843 zcmai#dpOit7{`Y-DwoJ0Gwo7F$uifBX2vDgW=NWtqCre!FqjK75h8?kedBng?++FTN5Dz;p*KWxwbx#xM#`99~I_jA7Qd7kr}S4eRqsjI+LKp>F1 zGuhD{P~FwOQ5hIJs>3V+Q3|p{Ck~Jt0R`G;hsHC2Y~qoR@c|{T z_5EF;Hmi$~Ji8!3*UkeC-=FjXfxxEDj&@Z1qYP1O7}ZI;^9+AhDs60jAys6TYF3x) zXhSgNB6q{$!$NH(@J(_#MgRM&yF$_xZCtJ!?Pn(mF~M+~+lE^xeK1N-pCQHXaQ07W zI^IJKJ=2`OXI>USR|XWF)a6FwS<=HAYqm0Ip&hQbRHT_OZuk8+9OBB`T=`Z%ylmLoDCTI=Od~H)F9`fJ znWA0bB00-pQGG0amJ}@*@}!qcvPS1Eb~GohnALs(mn&o~KAgCo?>{3WyLFt?f`NlQ z=4iri4=6+P4NffId44L~H*WCv+R*qPQ+GQlc~^l}l)5P)CL^h7re&LN>U%y0JEURE zQrb@0C{#b)Ds3#60XWjR}67=F1Y*tF=$yAp;DWk!G|weuftNZsJK; zM$3cDj?imXTf@`Z&5E!lIqtnBSs%`GF}OW%S%kVM*;JmNZ|cbL7?@XhCVOaZcKDgU z#%}rHx%PuU;^B4m{ua?!HA{7jNsb$rh7K_V@S^(`9!K8qZfsc=vJrmQD%f@cHL()Md{n(teH8X!Z_~X z<>3<*h?pCfDZwwCyN-csB!xcVlhmWr70lcEZRxF6fzPC6QPZIu+e+mW4Pj#01wDzb z2BMH^84te8?XL`3R+T#c5(wedyxNq#Ow`Z!rs8{`t%!zP{`qdk)9#FSLnFhEc&czv zZ0%`(Zv%aF;`Mw9)e84h=UCQn_ae)-Y!qApouo;0ZDX5E_i(3An+EK!?oV>~u4U6Z z9;8g!AvGs3IpLWLR#Ac7GSWAZ`~D)NJ5FEJWehb)!`dEGwlP-!7D5Z{@cm-wBgt~y z0rs*>Vd^^>mtDz-F$>x-G3of7W}=o6E18%in>jyFk2;Po*SnTtY`ytztyrsQDf>d4 z6}|ekMgq1~vv_Am?6zAlTx4Llo$yrDg9dY`YLkAerA79A$6WtDP|M}E2b;wd= zuz|})L`pw&2NG)0>xE?~Z1`|_K(A>E*l&a;;W`)jsse-wU1lR9?ww$7IY5g0X| z(a>~BtnpH!C(buHJG1?lT=6{IvMlkvc(8X4`J&Ng>~+o|_hE}np{l7g(<`c;Gx$7r z8viEIc&iWpO>)y@smG<}Anb-1jVI8lvdTEsGJ4^pyZv@epUak)8*;cgc+G%?w3O>` zSe()W7C|a6p!Z<+75_0?RB+5Pp!XB@;!J@=)P^0?MgCbq{iuf00iJEAHF7{Uc(gyh zrw1~1@a6f@CIy&u$=5)ZPp;`a(w-g=C}HS4QWg81fftJY%0p?~4v8zcGfh@8Q5te2 zJA5?qxYPV=)q&2@Joz9_DT0WuQoWkjGBwVD$v%6FRMKhnzm2sQEPA_mdhTRu>PD%6pt3 z4qEV%s@{%;3WG_redLkRY)JeBZ@g$~^U9O{1PLKgSxub?b}!J;e#LEt5fwhEsMZ31 z=uUx?mw*w$qzjmc0AK)N(P#n!gF#?$REz}?jVGF$BhY(^XmsSoZqip^HIlea0RRS# zKw}YDG!?sth_xVM@asU(J8R%`Uw2po*xUeCVD!HL;DDi`2}BHmh{de~+9EU)0C1}* zxw05c4xb4M76^Dm6l%?j70G09*=#O{kK{%Kp~BWf_$XHr#TA7`Vo;WC)p}nY*UkRt zPA0~6tJMX%>gd4@6hzS@m>|0V?g{30XEr^E>CU7FM2B}Vt$-l)^`Mgx3?|6!WF$9? ze&Y~M4s4kJx8Zlh-SunAQBhGy7K6({gt9n6NFZ?(FM=DwWC-{u&Ki!2w60z)iy&tw LH^*D{{z?A;NR=7c diff --git a/resources/multimc/24x24/cat.png b/resources/multimc/24x24/cat.png index 4fcda3ea161529732f8a83fbf502870f33134f95..c93245f6501496829b46cef86add4235b96c5856 100644 GIT binary patch delta 1233 zcmV;?1TOol2IL8lBYy;|Nklsk{5L^j9z?}F4Dl+mNV@P9vIOK)w>;LTg_JaNsY zT@0_=!q%bf%(v zF1>+Pyg-~c32cSY@n1KNO#H}OpFPKe_dY{d33%%HM|k$(*Kg|$2i^nrnU2+ShI2~Z z&d7@dD~6uh1+42EVnhGMVUo9=rVa1C@hMqcpicSZ{eLe>vgXiSJTnYnWJUPXUlnLO zM_Y4L^~#_B`gZSMlcQGxy!+Z7iquh`YVzs(-%_nq52ShPK&J*PQ79mt8A9j>VI!V< z>c_D?Py8`4;w>-yQZ&*cdGzS1!y_GnbEQa@_KHD3pfDwa;;G9FxOsg2WqHZo9-1bf- zh%mo;{XpA8WSK%AWT&qsowMzi&(Oq4AqFSj< zEPurFj87e6c43+|{cC_H%Vzh%zBdW{3fnHZjthG(+CDu$<(*AXvb^T>c_J$e)@=da|VE(xzYjdtTuf0CD-rvt*@P`{OdAeH1sP=&y^t33%dvQ zSG}l%P)2RlDpVCCoqP&VL7162?zwZ8vVUyrS&^QWBnFhcyB$QUi9(AAfNQrq4plHf zH$l)t*IIHHuG|1wcKC=0sH+NcdzENYAGN9hQFR>xlwN!Z32O>F@+`gFicw?if6$zE zV8pI9Vjpl6w^+P^2;bmJ5e8K%L?W0FSm%mjW8iE{jG?7-U02wl$>~Mx;kYLIDvp7d5F- z8Um9M{)oXGQuK&L#$vK#b>gOHeM-_IMba!I3<3Z`tX)myD>f2b)nFnZQZx|M3OEH( va3BRpqPWCCY>-w$oGg$R3WQ!jlBfIwZ?qMP>p02S00000NkvXXu0mjf;3{92 delta 789 zcmV+w1M2+b39AN>BYyw}VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru-3S>K9w>wi06PEx0=P*;K~zY`tyN1;6HyfY?#y(kEoB4?W@>Bg zb;5&9{qL9@S3WxRrFaVIXct!v-r3K{; zy9s`+t~lfJ^^qQ0DlI%?lAyGp>Vj6C?qn*`8me9`~jb3YWDr}FROC^fIu*?D61|-GXVe= zd6-}RbfvMXRj#(zy>lyTqw9*ZZu8eq)9*h%5QRx6h#py8H@Y@fxX3qlOT`aab!peB z6GS@zf23rA7wCYshRjkSaU4$(zZOo{_uh_;mry}46o2pn@Bt9F)75&1GhQNm0oxK=*JZPWIWrbn#rh1Y8)YLenKHVA}GnxW6?G zc8zIw--$z=1F@Rk7;hmWg?zL?t(R?adfysvAtE1n!V7fFv7Z2tX^%vX_TeL%6}UH@ z*JIa37JmtV33}v1FB#&vhHMFd9!8dreDl^j)u%x5%C!TXclm@(?rR@9H!=0{RIKmW zqe%!t51gwWynQ_vm*DB+N$B;xP*fM*yqbxgH`S}y@=OI%+;wsD%>B~lgB@R!wc$?C zSk?B>(LS^+K~Yhcws3N4u5U{0QygjJ~-d(kZZ~sNGFJC|2@y~ z{*J>vmCK%=`6fv^nS(*a80Bp&Eb7>q{Cj(neM*0h=vX8Wi TmJW3I00000NkvXXu0mjfggIVA diff --git a/resources/multimc/32x32/cat.png b/resources/multimc/32x32/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..78ff98e9e9d480131ad818759a777cc2fa67c5dd GIT binary patch literal 1678 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 uoN*zp0%-X}RI;U$ zwGLuzSsSvZP~NHDbG;wm=eq9a|19_K`rps>e7O_Q7DmT-&hP*LfMX`cs4Gkb{tT`^ zn6qzi@D5Yh-H_%;0HCHBdyxuZZ8z%>w|qewd(;7@N+=*&$?%!Rh#pb&Y`aH`1@n^jJS~pafI0g&Yenv|fI4 zr@RgI+)o%43bv!hKDthQzN*lSF92Stqn1EutO~1hyn_+6twc@sNNIL1?i5|tzBeD? z_d;6t?r{SJURCa5@>avW0>Y=3CU4|ReUxp-jO*A~on}AO0XFH;HFfiYe03c~Q zf5q5~4r*l2;~wiVWPwp}m|hFUJP$d%Xtzt#(s8_rN&5!HHKAXS=KdmwVBnAYJ|ba(Awr zo2j41_~nUdL7ro5_UZ4m7QW%3TJ0r)ArQxb`rL_@Y>hgs)xrQ^Fe26@#u3ylXOp1+ zJwg7dd%IG{fLY3BmGI_gyO)KY21`wOTq{=@|4buhCL%9v4Fs5nhb(S1YP6f6-=DIi zRr*X@E0LEGu{>%o(#QI8qj zk0FVS=onnGFk9~IZCx{?a-T}B5fpLW-cUy86@yz5W$rL#e*FuvgY#Z4+n6w$CM(zB zm}Yi%x+<1Fwe8~N%3sCS52~~^imvPtI%hw;-4#xN%DIZ=_oF#noFM%i?JGx87su^Z)!sCir;S z2D`1lHn7?)cwQg)Av776-y_CJ=H)^tl{xfib4>Aos%<+bR+TBH%P+(yEDGA%600Wq;PY4ax5M7GmR-7laqg#2(oOm0&4r;{|eA z6yKyHm92DAN%$O)t`MC4y(dxCIoK8Zp$Gn^ncXyqALuF{Q};j$n-#VVCxzCk)pgV{ zaIi)4;a7;d9c`anWpb7i-CV3RQpGAacEuW%=8>dJYYfwv&LSemJx;8(UK>I4StOwg zoJ@f2uh&Gmu!&Y5cx;CbS7vo#G_LGj*;f|n=`0o}x9VRAMz9QX7~5PMW(7Jl746J+ zeaN!=Ec~oyXFT3efG7UN!sAC0kI3v?X}V>F1{~gEgK_Wg$E}Vi6D|jv13lCe(QXJ7 z;A%V!!!`u6xR1^%Sw(UrvP#?;_sZ{)8O>kLnE5#Z68(3T-=>3=(3Y~aivel(zIpj0WEN*7W% zuqQg5@9h{i1*NDq6VAUYm5Qq+`N(w-2OHZD(H z&rN(sYi)>$>n_Df?-wnZZjPrP0Od_+wHvZmn;pfpolr-jMMrwp2b6|}p}TSAtC2$6 zmjw^({iKoHd?V>o;4y`TLE{)aE>p$EMpEcP-{4zck%OjFCpBkuj&Ixm5>fMeXxE_L8P4EP`e0Iaj39;{#KqWbu7lfG7RNwwl-61?h*sY)NgG9oRNEHI zUlV4Zy?JMKKe()=w6u<@P1EnmEos&wcryg(DoaGV`t#4!2q_lhy&LhJzHGkRJf)}2 z;K7TI$?kt0eyYmU>|kW-k9o*U+%Alnxii|`1!ASnJ28+V2emjBK3=oqp8M3s2KO%6 z5`Ch8%YzGrZ+9+)FUA~fhvzH#Z>&|1?Qqm*bu^s;cc+g+ZcDv-3gIRnoaFqXAe4p_ zi8!l5>Tsbq(M8uhW9afTYRKZf4^ANTw!`>Ch?QSs#cpykL+grlX;JN|u~b;9tU>X` z^;uT~Ty*zVcQ(C^^RD&gRsV1FjkjjxGE>%fY{e>NIS>+Z)L+G;ON6ICDmyP+v^A7u zBNX+v)Ucw+F6XQmXKWU>!CwDc#qtsFhR$feX!6`9dW6{$$xsYzC^#QHmVyVnFed;4 z2D=D`Bfu~<3>=}Ztf>BTt*XvE73xX&7xmN2BL6!6Hv2zsaxJQT#soxvI$kBY zQUb6(cmUFc z#q8gb0|Ejd?l_VcnBeZ^24NNsCHs&(@HmPu)aw@x_19|n+35mI3@lJoJ*TMu0B3U+ AN&o-= diff --git a/resources/multimc/48x48/cat.png b/resources/multimc/48x48/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..25912a3c023d49a05d82d10cf67b20e88f564d49 GIT binary patch literal 2733 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 IM6N<$f_Z-DTL1t6 literal 3922 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 KhE@7bk^ckTKJ|Y9 diff --git a/resources/multimc/64x64/about.png b/resources/multimc/64x64/about.png new file mode 100644 index 0000000000000000000000000000000000000000..b83e92690f3924b705dbafa712f98f50683c8744 GIT binary patch literal 5513 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/bug.png b/resources/multimc/64x64/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..156b031599420011e2a7bdf76714c7973a092775 GIT binary patch literal 4263 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/centralmods.png b/resources/multimc/64x64/centralmods.png new file mode 100644 index 0000000000000000000000000000000000000000..8831f437caf82e2db4e56b78dafaf63882e24991 GIT binary patch literal 4408 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 Qghv2PH9b|#J-ev?0yIM?CjbBd literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/checkupdate.png b/resources/multimc/64x64/checkupdate.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1e29ac6ab63f05f988ca17ce3feb8d73f213d8 GIT binary patch literal 5858 zcmai&byQT{yT=DX8k8;tq>&h!0S0O5MnJj-q#U|S8tE93927g0WyL$ayDk-)L+^yZP35I00H8YhH?T^S-d_A&^l_7OxKr7GV(a+A3IL$o zP*s#O@SEMuaZWIw@?H!L+&^wWH6G_LyIs(>s;U;Lq<*r1jT@(?OUhy?dn-v*vmku7 zD3z9|Z-;?=OVn~!;-AJqf(iE$k3Upd<0z#T@Z<2v<;;4d%~tcp3$c%`*n)EL*1h-V zrOp>ThZf41hJs0yKiHpyg-^!JgVzu47ELgxmd=%RXN?CnyAE@xdJJ6rG=vCnFrgh~ z%z5z~@`a+GYVL=qxPP%%VNFtDDQ?&M2$buyug+P0U1+lmq~ z6Kq=fxE|{$WV8ERU?tT}hkk)5NS&)AcH|Lhko1!O!Z*1;{0k}#&^86Rgji-$8l$)= z`wbL{I|e1)rybpsY=$1eplyPY9?6DVzL-wsEU})0tjd|TKtQfcv8qkX;X#)mSJG|V zTG43kVdu|7`Nbs*g-1>Hmo?aQr&xh*6Ph zGeYc+1Q5%r9WG?HB7QIJh3LSAX^M*ALNY8e#jZF|&eKX+?kGJ%2UfEd6+vQ<|Kcs> z^%bdw|L)qNn(52E#;k+X3NFB^4pcsBEu4=@BD3aWH0O-`6p^`^a@0{qNZtcZG#$;cMew+y(X3I~}Bwg^@!z3o_qG|@D>a`qCe-Qqxq&MbhwHm2aQJqBRj*9kGm*tcQ4tjhZ8;!pwTQq={P0L!V9zalMFeTxCz6F4BJ*z{lxgk4;Q%cpG23 zX^<(hvFI;eh{yC@tZe=QJ(U%BJ7+Af;qwrpao4kg^I*HIOzZlu`;Yukv<1vKjC8b& z500bAS@=&~T_szSj&zW3zrE23>E$!gC6DW8gO!OGEflo+WzCkWe*w0>nT~C(!v2lN zarY^*wihuJhU=AKmh#s#lV64t@wk*Mt7OG;9#f>&uypu1Mf2gw$#EpE=h6MDVn7`? zorI2!Y?D9hzj#IQF#^288(t8>5@L;Ky^&5J9aLE?@ZxR9j}Y8KNm$eXujMU+Q@qh8 z9IW;5>;wH8r6R0Ji8eap>Z(NzaU^g6e{>(*P-^-sxny*TOrAg2IP64>aQ)9Upn(lSjV7aFHxJ*zdiV zKk@B*u+PbKaZ#c5oLTW8!P>0=J~K0;uWI94*lE8SkG!3;O@uKW@$DPC^i-Q#_q(@mH_hceQJ~vFVE4oLR*ur3SFRA;* z{W^bAFfk66p8ip$@9b{NzII!Lg`Rr7c!troK-Rq3SHUDRWKiUKwxtZNwVfTTw$0!D z|B}`C?8_PTKTm$Hc=2l7@N1$Fo9I_EQnwW{iWHSF{bzEtX#+UFg|QmHXg{M!K}EgS zac6zGBp)2zv@R?d5c#XHcY}vGqFQA2>7ZRA*UR3@n{dJR2`f4vo+CST@ zUZqX~^>gd|v(f-teG)~^Xr#|XCWpKU9XOqxiFgz~*Z1q1(PlA;0*zo;l=6g}tred3 z%(8Nw&b6J*M@?m)@ehSM3FG_PwO@MD%gMVR!GfXeefyg zl6$pK10X5Oz@*V+#PMnnA4}Y+rsZHv#x{?m_gtpuVu|r-A{})ZR43WUGz%j6>(_UQ zF~7)yj3?XY!e-OTmOh-v>QfgZ+L&TflRST2MReU+$3BRmj|Q{ZbK&Ozc=n0R{mDo4 z*qaDtc{5MpM=BK=Gc#snHJa7V?>q6ovz#Xmfx5l^YY_n zc!;Yr|5q|rxmh`NoGx$1Y&48tQ{1@xeyUpf^o(5|&16ODuYm#ih=l=+HrI~$5FLkxQ{IkkZkvsTiYrYI# zsdrr)-iBTeb&FlRPMrEiC|k)-7y!$p%oq~qux*I2r3;>#JRTu-0jMYc42gRf^TEee$ za~r)cYgmHF5f$Iskb@O&R|1<{drdCwr-0Rm>uy6&Y{)VnatZ<`Xt*7!bHOL)WG@`* zZ~9HS9+(6^q76<6^a+V<|4pEg|967Tn*70ZY$eCMEQ6(r#C|~Lxj|lf3}c}IExLf> zJclLi(xENXtr<{4imhli)s!>6BndbT@sa-Qu1f#tSKzxKv0k&w7dEDCgXXU}bM2ir ztdsVG(uR3_&@v})A1z+8=_@=age?@@^lVe5mJ6FU%JOHfPcK|2I&@gN5215oSH)Ys ztQc;?sPWAa&4jOQI&s4yo7DXzOb{ZqF?}PqyoSKB*a64c<|naLZ-$!jP#!i%g?2Zi z9R5NfaTMuHkn^P(lBx3r1w|b$dflk*I(3btT?ZRKr*Q(fM^Xr9wK+g5kDzE2# zboLsHnKQO)MA8YbeHl4VYLX?Zl7G}=O)uSJ;9Ds31D@JCG*VXT@+Jz8i~sc4m7MI! z%d(9qU;%MzoWPgH^ON=Ql^67i;Ttp5=r#9PIYus{<3c!Z z6x`EhSODdJIOqddgOgVryEnuDk)VDtn@J@NV(ruh-0i`&iWNTfMn)rg;IHmYX?Ov! z#&*DGb6{ubBwt%#!Plslwu04`Cf3B0ZhPyFvCcS8q4Ir|Lp=OV_h!gNHuADaZU>Jz zv!_H1nmS$LynE)Gx0DMh@{4@16C916|6Sj8Zv&-y^ahC%&;y5i)^|o$@TN@1I(eop zkAkw8#W!5G;ipJS^MtkCp#2RU%BaWrDuJrgpMkhW`cbAFq&=lh{a zdaubj>p4O4Hn!wbYz%*}>YTSVbz$gqEz8$qE?)&{RNlmOlgBRwV#OtX<)5*-Y~3Mc zoW}4<;U%>>_ka7Ahu!OMg{e7#_|yuGQhIHZlh1V>2T_*RA~har`m%c#uH1E#O~{#6 zvB$>0XWSv7EGXQAjR&_qKX6>g$(*2Uj?q4D|Gv&;-y_K!3;LpIqC}nLO06IXku4jR z3y4pdLp676*sPL--M2_8q|g>fSyb>3etm39X?GhE1Z-xnS}9uCdg6k1VQ!1L%OBkG zEHbN2j+7%>x;Q}Yhk01jZVE6l*;$EiTZ+9RGV+Bc$IW`AI^CnZ{lJK4DP80#x3 z3(r##t_-!gh4OyQfc}upuwnk^`U3Y{e-xBVl*MvAi~>DLjrDM?kGagNC;ZsXm29s! zmv#ggEb38n#pNL=H8*vswo#W&e^xeGvXYzEY)kBSP;hVs?vbq3LlW!cNte#uS8E%y zs2ahU9WD-@oE$J-AMW3N{+rq@cB>k@y$-UVWv237lcsX+Jjz1b6$Pe$;EZ5TZwYY# zpphkI-wyJubeigFCrW<>T3BrG8+p%JsX2q!1ot2%lTSsmNx&37*u~pfq^5;|trGe3 z?iBv%fnKONf=tkNVLJLj$+cN0eMR(Ed3b@v%U<7bLoTo4-eS|UR1rBfPenz7($xpy zdIDs>Q;!G-oYje8Z_B}I8*5I@HPf%5s!ja0-nW}rqDbp+KR>NYs4eI44y-|(PG{5b zLyrx|3LLvG(j>j(VZSn|baE^$HXd^gs-!>^ujkEj<(91t+;Sklq1NqUVA=LllLc4% zFp3ymEW+d&1l>or0D_A{Q^EEwYSwZV*)AXQk76HxITrll*5c;oBU<-rPj!iFGe#;Q z4B1bJMA8Fh<*_qLhP?BH4EyG+WJ_NeMJK`|SWbw(OiaGF%umiuhrVrClMCfY@~nU~SXm3Z831PIBdiI1Hmanm`>l1^^FG?IwAIf37K!UZw+@gqatfPBpI(cIgKr!-;E zuF3w;>u>SCW;72+r_%tbbp&cSGUBmBM_!zJT1GX$-tMSPcs|1qQi-|A+y=Tk{vjdN z(jxPd$kr9jQxB*v^|_fI;@EAq(~f={-j1?0_<>+BGB!qfzl=o1HAMM{U*7GF<|Y+s zHNRkp`vU)vx$umc`zql`H18*x1V(^~Rl+v-!5>b)5VTOf;0|3*yMGc_1!B_4wf|-5 zDZ8O_P3-(-)GGw>#1;9_49R7LJXwH0IB%_gM`Y?xF%89bh`RIbW3r1e6n|Z-@46=T zj02+{=U)E!I??4kvd3jjoH~bZnnQ6+^3=pCi*7L6oTB+;uj(-$T17uP*L=&Wj!<8kCQ6(gkc=P3cT1jVW>}8 zKI)(g=_x#GIjSUZYOsqP{5Yy&m`;D{w0)U>b)EP#*eLDpa?V4tK|Msr zN%_lnMpOJR>~}MPK{e>X*|f5HO6XbGQhopWf`4D#@Z6po^1Pa?ufzF}3eg}dM%bU& z?^oW)=mfz>K1AU-@{gGMof@0)BpNd26C8SlQ4IE*z<4}`&2r$TrWR(QA!o3Qn`BHa z+QuLq|EqNM^yIW*A3`Z+C zI?RFCq>N;5DL2Jf898HD-a6#utvNZl4GZ84`7E@J-r0&D@il}_!`^iu-$C!W4=_W^ zXil}RjCLoe;EDXp*!I5*#6j+rp)4{V8A*k%ikRM;zuBk4UOW!A%^2Anhvc!=8-4`E z6@otZq~;}U?cvp#?#&6yXoS@INxa;v@)_4_KtkDt_sz0=n;e_II6c7LaA_M#czhbI zez!NimV9c_*)@p9Li~_#T6p>nR>UnlDB9Q*@XOq^;XUt!k$J>;HPQ>JkJcO;XrqwH zbL|_kkJ*#J9q#G<9bKEr?SwsS?CBHS$1c`0nm1bHJ)P!9*7%fBU_KxG{bpb)`tm!zcJ{Qjc7y!&$=L(b-xX2(TjcFw3jru=X=^I+DL`GI z9-gIHiYs?%!T(8HzR=V7@4lgS5PkI&hr{f7nWJg(cmg8`~a LT8b6&R^k5v={rA) literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/copy.png b/resources/multimc/64x64/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..d12cf9c8ab03f4e914eb9390cc1f0c2b1d18d2c2 GIT binary patch literal 2884 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 S)=>}HBcOBJ0PzlP6aGK*(cxVH literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/new.png b/resources/multimc/64x64/new.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c6796c4827595297d8f9f7fd2eb11b370c723b GIT binary patch literal 3949 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/news.png b/resources/multimc/64x64/news.png new file mode 100644 index 0000000000000000000000000000000000000000..e306eed37fe00ee1007049d63e915a236c8f2e5b GIT binary patch literal 4968 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/refresh.png b/resources/multimc/64x64/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..8373d81984c71dfa72b1874b3d07f5a7b5d5a7a9 GIT binary patch literal 5745 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/settings.png b/resources/multimc/64x64/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ff58faf7b887d202e7d40422887680a6db9a9d GIT binary patch literal 7125 zcmaiZcT`hL*M0~fy{Obk?=28|3&ntx&@>>u1dtj!1f+um6j6#a0i|5pMIbaOf)uGD z-H4P(lMd1e7-=8(y}x(;*7w&pYwdZ~oY~KM=Ik?b&dk|~_l3_aD<4 zM5+ICG1%{}+cj$b$F`1sBLM*R5q<5uW{+og@3(H?SIwXCta(aa>|nOfbnOGZiV_4U%Vo2094%P-O+XK$X#rnS!eTR?Qx(~k znlV1p6MXCyvJv+%sW3Qu7UBjb6#-{vhEW^gV2Ce;888v%XH>ixgmo`^=V;+< zUh(QHB-f?ukH=Av-Dvw@fuzYHP#+WgcE15Bj|$@lA93AtBuD?Q_}fA$GpgO>x_;tir#jR{reSaSWu7 zHhFvDbtoZ5XFt~^hE5h#Sqo;GNGT+=f+~Q?N?liyrv$l=ealZKpn= zKgmg8n5Mt;i2!?QQxQmfet-P?XZ=CJzgi0P1Pr0`FdG{;;c;rR8dX5@@|(}AU+D(w zx=RtvF@8#)i?jxQZ&`5n`0M!XJhaRrhaq!-1L&Ku9)D&8rLCMT6O5Wemts>b&^D0~ zh@a?UZh`kSVcc}EKwaKyu{;G1=d+U?P1b|QG&?(Qz10D+1@fmTpl1908!*e!QI<

*PG8%}6N~0KTu0 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 literal 0 HcmV?d00001 diff --git a/resources/multimc/64x64/viewfolder.png b/resources/multimc/64x64/viewfolder.png new file mode 100644 index 0000000000000000000000000000000000000000..7d531f9cca7c4aa311cb7cd6d8c09d17e8fe4187 GIT binary patch literal 2134 zcma)-X;c#08iv8yG)KxQQ`5{L1f-ivmP4A5oKiF^MMV*i96+$pgK3UsM&^_vdeq7! z4Z97RiHSL7IdmMlH_SYmrDaE)m7F?Qt994?ao0V2t?zr++WUR>e)s;f(>;#4ZQY`~ z1pokSMIl`<5_Q}x1vyEtBu5QPL@wCf%|)V;@%1o2K_ZG&}^v0cy|KQ&+CN;wJK&03%b= zPvZvmA7le~vr>(UYfYnVhY#WRis3WFM8P0Tb2JFpBQ3Ztp7Yk|d#2hU+ny)ArYJr{ zW#LVlTcqN;Mjyiug5$<9ne4_+Wb(*CjPvC8P-Z+ZhCDtF@+GW7KyRscjES``+EQ$SqhohY5?$#2I9kpT4 zizz^gw9OvD)D&>v3!YU^8Md@MzqL8;R<&xvtBWj?T8oKy39qkMPCJCp5APh&R27%r zqbq-EBQ?+a0SkM=TSl@9;#@AgNPS}aB<|Wq!nqfO1k0rtz<39lCCpSEl+5hUYOK&- z^-07QAq-CTGjiTu4Hpsy#;P3UogI1LRh_v4ixC#>IW`fcF_if{1~8C%tgdOy{%e!< z8{n#*YD~5om!Bo=r~11~X0j~6tnD*WJ(S)w+-^^_ZcX;=jUr}Ct84+*R2hgwDpzWi zh;HvzDh`|HI3cXa`Jk1d%-mLUxD)Z*rZ0NJvo}Sjvl!Qg+v+>o_ZTgHG{EIgu zr}~dzu5;h{+vKM`{R7K?xGh=e>(n1+Tp3?dUpMpKOZeIjn8fYcH(Y%bi><;$@!D{{ z)o`t0|GSe1I6;4kEJVG<8=f{|vT;^-xV<*(NfeW7u}ZrFyFxv+GdJ5c@(aOF`M@>6 z^ca$s-q6VIoIA4hfhXGN?gU2dftr+UUB1tSNTU}7xsH%sg*-RZ<7BowW=nTptyT^r zMERe7fE>0Fir4)Z5B0MWA*jBDYre=31p)@eYj{0az&%SK-iKKyyX7s@6 zl)k4Xp{8hO9MK2md)YiKXl%jERl%v?7PkKPWxk>lmo2uCvos%sE_rEhuW&BB>U7l8 z%H`8-fW_5oprjM)pfu0EGf+LnVis_b!%}~Fy7 z?O1$ToVma*F4!L%$zc96P&g7sm@d<^s`Bj zPK|*JM`8OMdlxS>gAtc!06C{Ynl&IMc!Sr3(HoJh$Y>> zN@<9{dM7~Jr)CT(>fq2D-E5Bf*k*do34WS|IkAVSZMdGKw1#L2eGdTz2h zpp^Yv^BUdgVkyh(ym}zNfO=|sr6t2pKm0jwYDJu&8K)rMb!+1I;zA#tj2+5%HH=@X z>0m9VB@2b0e?0)t3066=t~^C&UM@(VC++I@jHN?$vAzXH@%xYt4RiBtknr z>Vi%wGf-xyM?}-R#YMrlSye&cnlMvf*}GSzOYmT3^4}BVJ@JjXE06dWt68!pSj_$m zy)VoE+Mvy^IK-bk8c?Kdw-qb1J#y>kS>*&K@_bT&-J)4HIs3t=X!Sp$il|aEfifAL%e!4Sz>hMElU8>W+XHjPl%)w0HM**R0IU_{Vei10-h2PL5ZYW zQD`Jc_zw#m5*!Pr2SMOgP>3OgX83mqw3`PSVr>P3_+{GTe`fp<@Bh342w5YP06Lo) zy(q+JMi7kvU@#a~q<22x22/about.png 32x32/about.png 48x48/about.png + 64x64/about.png scalable/bug.svg - 16x16/bug.png - 22x22/bug.png - 32x32/bug.png + 16x16/bug.png + 22x22/bug.png + 32x32/bug.png 48x48/bug.png + 64x64/bug.png - - scalable/centralmods.svg - 16x16/centralmods.png - 22x22/centralmods.png - 32x32/centralmods.png + + 16x16/cat.png + 22x22/cat.png + 24x24/cat.png + 32x32/cat.png + 48x48/cat.png + 64x64/cat.png + + + scalable/centralmods.svg + 16x16/centralmods.png + 22x22/centralmods.png + 32x32/centralmods.png 48x48/centralmods.png + 64x64/centralmods.png scalable/checkupdate.svg - 16x16/checkupdate.png - 22x22/checkupdate.png - 32x32/checkupdate.png + 16x16/checkupdate.png + 22x22/checkupdate.png + 32x32/checkupdate.png 48x48/checkupdate.png + 64x64/checkupdate.png + + 16x16/copy.png + 22x22/copy.png + 32x32/copy.png + 48x48/copy.png + 64x64/copy.png + 16x16/help.png 22x22/help.png 32x32/help.png 48x48/help.png + 64x64/help.png 16x16/new.png 22x22/new.png 32x32/new.png 48x48/new.png - - - 16x16/copy.png - 22x22/copy.png - 32x32/copy.png - 48x48/copy.png + 64x64/new.png scalable/news.svg - 16x16/news.png + 16x16/news.png 22x22/news.png 32x32/news.png 48x48/news.png + 64x64/news.png - - 16x16/refresh.png + + 16x16/refresh.png 22x22/refresh.png 32x32/refresh.png 48x48/refresh.png + 64x64/refresh.png 16x16/settings.png 22x22/settings.png 32x32/settings.png 48x48/settings.png + 64x64/settings.png scalable/viewfolder.svg @@ -81,12 +99,10 @@ 22x22/viewfolder.png 32x32/viewfolder.png 48x48/viewfolder.png - - - 24x24/cat.png + 64x64/viewfolder.png - 8x8/noaccount.png + 8x8/noaccount.png 16x16/noaccount.png 24x24/noaccount.png 32x32/noaccount.png diff --git a/resources/multimc/scalable/bug.svg b/resources/multimc/scalable/bug.svg index 0534cbef..178e3c23 100644 --- a/resources/multimc/scalable/bug.svg +++ b/resources/multimc/scalable/bug.svg @@ -14,11 +14,11 @@ height="32" id="svg2" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.4 r9939" sodipodi:docname="bug.svg" - inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/tbaricons/ReportBug.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> + inkscape:export-filename="/home/peterix/minecraft/src/MultiMC5/resources/multimc/64x64/bug.png" + inkscape:export-xdpi="180" + inkscape:export-ydpi="180"> Date: Sun, 19 Jan 2014 23:05:16 +0100 Subject: [PATCH 44/45] Scale faces to 64x64 --- logic/SkinUtils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic/SkinUtils.h b/logic/SkinUtils.h index 324f86b8..64353b72 100644 --- a/logic/SkinUtils.h +++ b/logic/SkinUtils.h @@ -19,5 +19,5 @@ namespace SkinUtils { -QPixmap getFaceFromCache(QString username, int height = 48, int width = 48); +QPixmap getFaceFromCache(QString username, int height = 64, int width = 64); } From 3a3c9ac9515447941d383f2c4fe4b0225fdd8252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Mon, 20 Jan 2014 01:14:11 +0100 Subject: [PATCH 45/45] Update the changelog, version, scale the instance icon --- CMakeLists.txt | 4 ++-- changelog.yaml | 14 +++++++++++++- gui/MainWindow.cpp | 6 +++--- logic/icons/IconList.cpp | 17 +++++++++++++++++ logic/icons/IconList.h | 1 + 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9efb4cd2..0b276cf8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,8 +92,8 @@ SET(MultiMC_NEWS_RSS_URL "http://multimc.org/rss.xml" CACHE STRING "URL to fetch ######## Set version numbers ######## SET(MultiMC_VERSION_MAJOR 0) -SET(MultiMC_VERSION_MINOR 1) -SET(MultiMC_VERSION_HOTFIX 1) +SET(MultiMC_VERSION_MINOR 2) +SET(MultiMC_VERSION_HOTFIX 0) # Build number SET(MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.") diff --git a/changelog.yaml b/changelog.yaml index 82dccd69..01e11f52 100644 --- a/changelog.yaml +++ b/changelog.yaml @@ -16,4 +16,16 @@ - Added additional information to the about dialog. 0.1.1: - Hotfix - Changed the issue tracker URL to [GitHub issues](https://github.com/MultiMC/MultiMC5/issues). - +0.2: + - Java memory settings have MB added to the number to make the units obvious. + - Complete rework of the launcher part. No more sensitive information in the process arguments. + - Cached downloads now do not destroy files on failure. + - Mojang service status is now on the MultiMC status bar. + - Java checker is no longer needed/used on instance launch. + - Support for private FTB packs. + - Fixed instance ID issues related to copying FTB packs without changing the instance name. + - Forge versions are better sorted (build numbers above 999 were sorted wrong). + - Fixed crash related to the MultiMC update channel picker in offline mode. + - Started using icon themes for the application icons, fixing many OSX graphical glitches. + - Icon sources have been located, along with icon licenses. + - Update to the German translation. diff --git a/gui/MainWindow.cpp b/gui/MainWindow.cpp index 7c8562cd..ee9c3fad 100644 --- a/gui/MainWindow.cpp +++ b/gui/MainWindow.cpp @@ -830,7 +830,7 @@ void MainWindow::on_actionChangeInstIcon_triggered() if (dlg.result() == QDialog::Accepted) { m_selectedInstance->setIconKey(dlg.selectedIconKey); - auto ico = MMC->icons()->getIcon(dlg.selectedIconKey); + auto ico = MMC->icons()->getBigIcon(dlg.selectedIconKey); ui->actionChangeInstIcon->setIcon(ico); } } @@ -839,14 +839,14 @@ void MainWindow::iconUpdated(QString icon) { if(icon == m_currentInstIcon) { - ui->actionChangeInstIcon->setIcon(MMC->icons()->getIcon(m_currentInstIcon)); + ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); } } void MainWindow::updateInstanceToolIcon(QString new_icon) { m_currentInstIcon = new_icon; - ui->actionChangeInstIcon->setIcon(MMC->icons()->getIcon(m_currentInstIcon)); + ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); } void MainWindow::setSelectedInstanceById(const QString &id) diff --git a/logic/icons/IconList.cpp b/logic/icons/IconList.cpp index cda2db7b..d76e6fbb 100644 --- a/logic/icons/IconList.cpp +++ b/logic/icons/IconList.cpp @@ -336,6 +336,23 @@ QIcon IconList::getIcon(QString key) return QIcon(); } +QIcon IconList::getBigIcon(QString key) +{ + int icon_index = getIconIndex(key); + + if (icon_index == -1) + key = "infinity"; + + // Fallback for icons that don't exist. + icon_index = getIconIndex(key); + + if (icon_index == -1) + return QIcon(); + + QPixmap bigone = icons[icon_index].icon().pixmap(256,256).scaled(256,256); + return QIcon(bigone); +} + int IconList::getIconIndex(QString key) { if (key == "default") diff --git a/logic/icons/IconList.h b/logic/icons/IconList.h index 322411d1..4ee3f782 100644 --- a/logic/icons/IconList.h +++ b/logic/icons/IconList.h @@ -34,6 +34,7 @@ public: virtual ~IconList() {}; QIcon getIcon(QString key); + QIcon getBigIcon(QString key); int getIconIndex(QString key); virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;