diff options
author | Petr Mrázek <peterix@gmail.com> | 2018-02-17 00:00:06 +0100 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2018-02-17 00:57:54 +0100 |
commit | 65bca654895c94e83ef25008dc1c44cc822cfbab (patch) | |
tree | 1ec8ced7e8f9af0f7c39c2407b72f51a05bb366f | |
parent | a7957f24bac2a6c7fea6f5f2fbfcd77b4db16fa8 (diff) | |
download | MultiMC-65bca654895c94e83ef25008dc1c44cc822cfbab.tar MultiMC-65bca654895c94e83ef25008dc1c44cc822cfbab.tar.gz MultiMC-65bca654895c94e83ef25008dc1c44cc822cfbab.tar.lz MultiMC-65bca654895c94e83ef25008dc1c44cc822cfbab.tar.xz MultiMC-65bca654895c94e83ef25008dc1c44cc822cfbab.zip |
GH-2150 Split out custom commands into a custom widget
Now it is used from a global page and from a sub-page in the instance settings.
-rw-r--r-- | application/CMakeLists.txt | 5 | ||||
-rw-r--r-- | application/MultiMC.cpp | 3 | ||||
-rw-r--r-- | application/pages/InstanceSettingsPage.cpp | 22 | ||||
-rw-r--r-- | application/pages/InstanceSettingsPage.ui | 96 | ||||
-rw-r--r-- | application/pages/global/CustomCommandsPage.cpp | 50 | ||||
-rw-r--r-- | application/pages/global/CustomCommandsPage.h | 55 | ||||
-rw-r--r-- | application/pages/global/JavaPage.cpp | 15 | ||||
-rw-r--r-- | application/pages/global/JavaPage.ui | 79 | ||||
-rw-r--r-- | application/resources/multimc/multimc.qrc | 3 | ||||
-rw-r--r-- | application/resources/multimc/scalable/custom-commands.svg | 338 | ||||
-rw-r--r-- | application/widgets/CustomCommands.cpp | 48 | ||||
-rw-r--r-- | application/widgets/CustomCommands.h | 43 | ||||
-rw-r--r-- | application/widgets/CustomCommands.ui | 98 |
13 files changed, 689 insertions, 166 deletions
diff --git a/application/CMakeLists.txt b/application/CMakeLists.txt index aa09efbb..00d93595 100644 --- a/application/CMakeLists.txt +++ b/application/CMakeLists.txt @@ -101,6 +101,8 @@ SET(MULTIMC_SOURCES # GUI - global settings pages pages/global/AccountListPage.cpp pages/global/AccountListPage.h + pages/global/CustomCommandsPage.cpp + pages/global/CustomCommandsPage.h pages/global/ExternalToolsPage.cpp pages/global/ExternalToolsPage.h pages/global/JavaPage.cpp @@ -155,6 +157,8 @@ SET(MULTIMC_SOURCES # GUI - widgets widgets/Common.cpp widgets/Common.h + widgets/CustomCommands.cpp + widgets/CustomCommands.h widgets/FocusLineEdit.cpp widgets/FocusLineEdit.h widgets/IconLabel.cpp @@ -232,6 +236,7 @@ SET(MULTIMC_UIS dialogs/SkinUploadDialog.ui # Widgets/other + widgets/CustomCommands.ui widgets/MCModInfoFrame.ui ) diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 0643aa24..f928d11b 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -11,6 +11,7 @@ #include "pages/global/AccountListPage.h" #include "pages/global/PasteEEPage.h" #include "pages/global/PackagesPage.h" +#include "pages/global/CustomCommandsPage.h" #include "themes/ITheme.h" #include "themes/SystemTheme.h" @@ -65,6 +66,7 @@ #include <ganalytics.h> #include <sys.h> + #if defined Q_OS_WIN32 #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN @@ -514,6 +516,7 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) m_globalSettingsProvider->addPage<MultiMCPage>(); m_globalSettingsProvider->addPage<MinecraftPage>(); m_globalSettingsProvider->addPage<JavaPage>(); + m_globalSettingsProvider->addPage<CustomCommandsPage>(); m_globalSettingsProvider->addPage<ProxyPage>(); // m_globalSettingsProvider->addPage<PackagesPage>(); m_globalSettingsProvider->addPage<ExternalToolsPage>(); diff --git a/application/pages/InstanceSettingsPage.cpp b/application/pages/InstanceSettingsPage.cpp index b146ffd8..71e90a32 100644 --- a/application/pages/InstanceSettingsPage.cpp +++ b/application/pages/InstanceSettingsPage.cpp @@ -12,6 +12,7 @@ #include <java/JavaInstallList.h> #include <FileSystem.h> #include <sys.h> +#include <widgets/CustomCommands.h> InstanceSettingsPage::InstanceSettingsPage(BaseInstance *inst, QWidget *parent) : QWidget(parent), ui(new Ui::InstanceSettingsPage), m_instance(inst) @@ -130,13 +131,13 @@ void InstanceSettingsPage::applySettings() m_settings->reset("OverrideJava"); // Custom Commands - bool custcmd = ui->customCommandsGroupBox->isChecked(); + bool custcmd = ui->customCommands->checked(); m_settings->set("OverrideCommands", custcmd); if (custcmd) { - m_settings->set("PreLaunchCommand", ui->preLaunchCmdTextBox->text()); - m_settings->set("WrapperCommand", ui->wrapperCmdTextBox->text()); - m_settings->set("PostExitCommand", ui->postExitCmdTextBox->text()); + m_settings->set("PreLaunchCommand", ui->customCommands->prelaunchCommand()); + m_settings->set("WrapperCommand", ui->customCommands->wrapperCommand()); + m_settings->set("PostExitCommand", ui->customCommands->postexitCommand()); } else { @@ -187,11 +188,14 @@ void InstanceSettingsPage::loadSettings() ui->javaArgumentsGroupBox->setChecked(overrideArgs); ui->jvmArgsTextBox->setPlainText(m_settings->get("JvmArgs").toString()); - // Custom Commands - ui->customCommandsGroupBox->setChecked(m_settings->get("OverrideCommands").toBool()); - ui->preLaunchCmdTextBox->setText(m_settings->get("PreLaunchCommand").toString()); - ui->wrapperCmdTextBox->setText(m_settings->get("WrapperCommand").toString()); - ui->postExitCmdTextBox->setText(m_settings->get("PostExitCommand").toString()); + // Custom commands + ui->customCommands->initialize( + true, + m_settings->get("OverrideCommands").toBool(), + m_settings->get("PreLaunchCommand").toString(), + m_settings->get("WrapperCommand").toString(), + m_settings->get("PostExitCommand").toString() + ); } void InstanceSettingsPage::on_javaDetectBtn_clicked() diff --git a/application/pages/InstanceSettingsPage.ui b/application/pages/InstanceSettingsPage.ui index 6163297f..60262b9a 100644 --- a/application/pages/InstanceSettingsPage.ui +++ b/application/pages/InstanceSettingsPage.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>458</width> - <height>508</height> + <width>553</width> + <height>583</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> @@ -42,7 +42,7 @@ <bool>true</bool> </property> <property name="title"> - <string>Java ins&tallation</string> + <string>Java insta&llation</string> </property> <property name="checkable"> <bool>true</bool> @@ -196,7 +196,7 @@ <bool>true</bool> </property> <property name="title"> - <string>Java arguments</string> + <string>Java argumen&ts</string> </property> <property name="checkable"> <bool>true</bool> @@ -363,81 +363,7 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout_6"> <item> - <widget class="QGroupBox" name="customCommandsGroupBox"> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="title"> - <string>Cus&tom Commands</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="2" column="0"> - <widget class="QLabel" name="labelPostExitCmd"> - <property name="text"> - <string>Post-exit command:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="preLaunchCmdTextBox"/> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="labelPreLaunchCmd"> - <property name="text"> - <string>Pre-launch command:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="postExitCmdTextBox"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="labelWrapperCmd"> - <property name="text"> - <string>Wrapper command:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="wrapperCmdTextBox"/> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QLabel" name="labelCustomCmdsDescription"> - <property name="text"> - <string><html><head/><body><p>Pre-launch command runs before the instance launches and post-exit command runs after it exits.</p><p>Both will be run in MultiMC's working folder with extra environment variables:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_NAME - Name of the instance</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_ID - ID of the instance</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_DIR - absolute path of the instance</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_MC_DIR - absolute path of minecraft</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_JAVA - java binary used for launch</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">INST_JAVA_ARGS - command-line parameters used for launch</li></ul></body></html></string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - <property name="textInteractionFlags"> - <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacerMinecraft_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>88</width> - <height>186</height> - </size> - </property> - </spacer> + <widget class="CustomCommands" name="customCommands" native="true"/> </item> </layout> </widget> @@ -445,6 +371,14 @@ </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>CustomCommands</class> + <extends>QWidget</extends> + <header>widgets/CustomCommands.h</header> + <container>1</container> + </customwidget> + </customwidgets> <tabstops> <tabstop>settingsTabs</tabstop> <tabstop>javaSettingsGroupBox</tabstop> @@ -466,10 +400,6 @@ <tabstop>showConsoleCheck</tabstop> <tabstop>autoCloseConsoleCheck</tabstop> <tabstop>showConsoleErrorCheck</tabstop> - <tabstop>customCommandsGroupBox</tabstop> - <tabstop>preLaunchCmdTextBox</tabstop> - <tabstop>wrapperCmdTextBox</tabstop> - <tabstop>postExitCmdTextBox</tabstop> </tabstops> <resources/> <connections/> diff --git a/application/pages/global/CustomCommandsPage.cpp b/application/pages/global/CustomCommandsPage.cpp new file mode 100644 index 00000000..1352b6be --- /dev/null +++ b/application/pages/global/CustomCommandsPage.cpp @@ -0,0 +1,50 @@ +#include "CustomCommandsPage.h" +#include <QVBoxLayout> +#include <QTabWidget> +#include <QTabBar> + +CustomCommandsPage::CustomCommandsPage(QWidget* parent): QWidget(parent) +{ + + auto verticalLayout = new QVBoxLayout(this); + verticalLayout->setObjectName(QStringLiteral("verticalLayout")); + verticalLayout->setContentsMargins(0, 0, 0, 0); + + auto tabWidget = new QTabWidget(this); + tabWidget->setObjectName(QStringLiteral("tabWidget")); + commands = new CustomCommands(this); + tabWidget->addTab(commands, "Foo"); + tabWidget->tabBar()->hide(); + verticalLayout->addWidget(tabWidget); + loadSettings(); +} + +CustomCommandsPage::~CustomCommandsPage() +{ +} + +bool CustomCommandsPage::apply() +{ + applySettings(); + return true; +} + +void CustomCommandsPage::applySettings() +{ + auto s = MMC->settings(); + s->set("PreLaunchCommand", commands->prelaunchCommand()); + s->set("WrapperCommand", commands->wrapperCommand()); + s->set("PostExitCommand", commands->postexitCommand()); +} + +void CustomCommandsPage::loadSettings() +{ + auto s = MMC->settings(); + commands->initialize( + false, + true, + s->get("PreLaunchCommand").toString(), + s->get("WrapperCommand").toString(), + s->get("PostExitCommand").toString() + ); +} diff --git a/application/pages/global/CustomCommandsPage.h b/application/pages/global/CustomCommandsPage.h new file mode 100644 index 00000000..52256ed3 --- /dev/null +++ b/application/pages/global/CustomCommandsPage.h @@ -0,0 +1,55 @@ +/* Copyright 2018-2018 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 <memory> +#include <QDialog> + +#include "pages/BasePage.h" +#include <MultiMC.h> +#include "widgets/CustomCommands.h" + +class CustomCommandsPage : public QWidget, public BasePage +{ + Q_OBJECT + +public: + explicit CustomCommandsPage(QWidget *parent = 0); + ~CustomCommandsPage(); + + QString displayName() const override + { + return tr("Custom Commands"); + } + QIcon icon() const override + { + return MMC->getThemedIcon("custom-commands"); + } + QString id() const override + { + return "custom-commands"; + } + QString helpPage() const override + { + return "Custom-commands"; + } + bool apply() override; + +private: + void applySettings(); + void loadSettings(); + CustomCommands * commands; +}; diff --git a/application/pages/global/JavaPage.cpp b/application/pages/global/JavaPage.cpp index 4aa0f184..57250c79 100644 --- a/application/pages/global/JavaPage.cpp +++ b/application/pages/global/JavaPage.cpp @@ -22,7 +22,6 @@ #include <QDir> #include "dialogs/VersionSelectDialog.h" -#include <ColumnResizer.h> #include "java/JavaUtils.h" #include "java/JavaInstallList.h" @@ -37,10 +36,6 @@ JavaPage::JavaPage(QWidget *parent) : QWidget(parent), ui(new Ui::JavaPage) ui->setupUi(this); ui->tabWidget->tabBar()->hide(); - auto resizer = new ColumnResizer(this); - resizer->addWidgetsFromLayout(ui->javaSettingsGroupBox->layout(), 0); - resizer->addWidgetsFromLayout(ui->customCommandsGroupBox->layout(), 0); - auto sysMB = Sys::getSystemRam() / Sys::megabyte; ui->maxMemSpinBox->setMaximum(sysMB); loadSettings(); @@ -80,11 +75,6 @@ void JavaPage::applySettings() s->set("JavaPath", ui->javaPathTextBox->text()); s->set("JvmArgs", ui->jvmArgsTextBox->text()); JavaCommon::checkJVMArgs(s->get("JvmArgs").toString(), this->parentWidget()); - - // Custom Commands - s->set("PreLaunchCommand", ui->preLaunchCmdTextBox->text()); - s->set("WrapperCommand", ui->wrapperCmdTextBox->text()); - s->set("PostExitCommand", ui->postExitCmdTextBox->text()); } void JavaPage::loadSettings() { @@ -107,11 +97,6 @@ void JavaPage::loadSettings() // Java Settings ui->javaPathTextBox->setText(s->get("JavaPath").toString()); ui->jvmArgsTextBox->setText(s->get("JvmArgs").toString()); - - // Custom Commands - ui->preLaunchCmdTextBox->setText(s->get("PreLaunchCommand").toString()); - ui->wrapperCmdTextBox->setText(s->get("WrapperCommand").toString()); - ui->postExitCmdTextBox->setText(s->get("PostExitCommand").toString()); } void JavaPage::on_javaDetectBtn_clicked() diff --git a/application/pages/global/JavaPage.ui b/application/pages/global/JavaPage.ui index 9023b932..201b310c 100644 --- a/application/pages/global/JavaPage.ui +++ b/application/pages/global/JavaPage.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>545</width> - <height>760</height> + <height>580</height> </rect> </property> <property name="sizePolicy"> @@ -17,7 +17,16 @@ </sizepolicy> </property> <layout class="QVBoxLayout" name="verticalLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> <number>0</number> </property> <item> @@ -217,62 +226,17 @@ </widget> </item> <item> - <widget class="QGroupBox" name="customCommandsGroupBox"> - <property name="title"> - <string>Custom Commands</string> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="3" column="0"> - <widget class="QLabel" name="labelPostExitCmd"> - <property name="text"> - <string>Post-exit command:</string> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="labelPreLaunchCmd"> - <property name="text"> - <string>Pre-launch command:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="preLaunchCmdTextBox"/> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="postExitCmdTextBox"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="labelWrapperCmd"> - <property name="text"> - <string>Wrapper command:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="wrapperCmdTextBox"/> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QLabel" name="labelCustomCmdsDescription"> - <property name="sizePolicy"> - <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> </property> - <property name="text"> - <string><html><head/><body><p>Pre-launch command runs before the instance launches and post-exit command runs after it exits. Both will be run in MultiMC's working folder with INST_ID, INST_DIR, and INST_NAME as environment variables.</p><p>Wrapper command allows running java using an extra wrapper program (like 'optirun' on Linux)</p></body></html></string> - </property> - <property name="alignment"> - <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> + </spacer> </item> </layout> </widget> @@ -289,9 +253,6 @@ <tabstop>jvmArgsTextBox</tabstop> <tabstop>javaDetectBtn</tabstop> <tabstop>javaTestBtn</tabstop> - <tabstop>preLaunchCmdTextBox</tabstop> - <tabstop>wrapperCmdTextBox</tabstop> - <tabstop>postExitCmdTextBox</tabstop> <tabstop>tabWidget</tabstop> </tabstops> <resources/> diff --git a/application/resources/multimc/multimc.qrc b/application/resources/multimc/multimc.qrc index 7e1b0315..780e458d 100644 --- a/application/resources/multimc/multimc.qrc +++ b/application/resources/multimc/multimc.qrc @@ -62,6 +62,9 @@ <file>64x64/screenshots.png</file> <file>scalable/screenshots.svg</file> + <!-- Custom commands. --> + <file>scalable/custom-commands.svg</file> + <!-- Patron logo. (C) 2014 Patreon, Inc., http://www.patreon.com/toolbox?ftyp=media --> <file>16x16/patreon.png</file> <file>22x22/patreon.png</file> diff --git a/application/resources/multimc/scalable/custom-commands.svg b/application/resources/multimc/scalable/custom-commands.svg new file mode 100644 index 00000000..b7f1a149 --- /dev/null +++ b/application/resources/multimc/scalable/custom-commands.svg @@ -0,0 +1,338 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg2" + height="64" + width="64" + version="1.1" + sodipodi:docname="custom-commands.svg" + inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="3840" + inkscape:window-height="2123" + id="namedview52" + showgrid="false" + inkscape:zoom="20.85965" + inkscape:cx="28.409224" + inkscape:cy="33.675543" + inkscape:window-x="1200" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:bbox-nodes="true"> + <inkscape:grid + type="xygrid" + id="grid858" /> + </sodipodi:namedview> + <defs + id="defs4"> + <linearGradient + id="linearGradient3931"> + <stop + offset="0" + style="stop-color:#ffffff;stop-opacity:0" + id="stop3933" /> + <stop + offset="0.69999987" + style="stop-color:#ffffff;stop-opacity:0.10396039" + id="stop3939" /> + <stop + offset="1" + style="stop-color:#ffffff;stop-opacity:0.14356436" + id="stop3935" /> + </linearGradient> + <linearGradient + id="linearGradient3900"> + <stop + offset="0" + style="stop-color:#f6f6f6;stop-opacity:1" + id="stop3902" /> + <stop + offset="0.75714284" + style="stop-color:#494949;stop-opacity:1" + id="stop3904" /> + <stop + offset="1" + style="stop-color:#2c2c2c;stop-opacity:1" + id="stop3906" /> + </linearGradient> + <linearGradient + id="linearGradient3808"> + <stop + offset="0" + style="stop-color:#333333;stop-opacity:1" + id="stop3810" /> + <stop + offset="1" + style="stop-color:#c8c8c8;stop-opacity:1" + id="stop3812" /> + </linearGradient> + <linearGradient + id="linearGradient3030"> + <stop + offset="0" + style="stop-color:#000000;stop-opacity:1" + id="stop3032" /> + <stop + offset="0.75714284" + style="stop-color:#333333;stop-opacity:1" + id="stop3038" /> + <stop + offset="1" + style="stop-color:#4d4d4d;stop-opacity:1" + id="stop3034" /> + </linearGradient> + <radialGradient + gradientTransform="matrix(1.3519242,1.8838281,-1.5359217,1.1022493,15.935733,948.08165)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3030" + id="radialGradient3036" + fy="14.242621" + fx="29.381905" + r="16.375" + cy="14.242621" + cx="29.381905" /> + <linearGradient + gradientTransform="matrix(1.5,0,0,1,-16,4)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3808" + id="linearGradient3824" + y2="1033.8622" + x2="34" + y1="1033.8622" + x1="30" /> + <linearGradient + gradientTransform="matrix(0.82142857,0,0,1.500001,6.7142857,-522.68214)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3808" + id="linearGradient3834" + y2="1039.3622" + x2="32" + y1="1043.3622" + x1="32" /> + <radialGradient + gradientTransform="matrix(6.479993,1.9525666,-10.415476,2.1794781,10657.845,-1282.8793)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3900" + id="radialGradient3844" + fy="1039.813" + fx="30.724609" + r="3" + cy="1039.813" + cx="30.724609" /> + <radialGradient + gradientTransform="matrix(2.5191507,2.9862959,-4.0491019,3.333339,4186.8847,-2518.44)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3900" + id="radialGradient3852" + fy="1039.813" + fx="30.724609" + r="3" + cy="1039.813" + cx="30.724609" /> + <radialGradient + gradientTransform="matrix(-2.5191507,2.9863064,4.0491022,3.3333507,-4122.8849,-2518.4524)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3900" + id="radialGradient3857" + fy="1039.813" + fx="30.724609" + r="3" + cy="1039.813" + cx="30.724609" /> + <radialGradient + gradientTransform="matrix(-0.69414478,2.3073251,-1.6952184,-0.67174747,96.941544,960.82172)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient3900" + id="radialGradient3937" + fy="21.976955" + fx="31.946348" + r="19.25" + cy="21.976955" + cx="31.946348" /> + </defs> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + transform="translate(0,-988.36218)"> + <rect + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient3036);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.25954175;stroke-opacity:1;marker:none;enable-background:accumulate" + id="rect2997" + y="992.99194" + x="5.6297708" + ry="0.70710492" + rx="0.70710504" + height="53.740437" + width="53.740459" /> + </g> + <g + id="g1021" + transform="translate(1.7703716e-7,-0.42472956)"> + <g + style="fill:#008000" + transform="matrix(0.08572572,0,0,0.08572572,9.999999,10.424713)" + id="g899"> + <g + style="fill:#008000" + id="g867"> + <g + style="fill:#008000" + id="g865"> + <path + style="fill:#008000" + d="m 226.434,249.503 c 0,-6.995 -2.705,-13.403 -7.846,-18.556 L 61.8,74.165 c -5.128,-5.141 -11.554,-7.852 -18.568,-7.852 -7.026,0 -13.452,2.717 -18.556,7.846 l -16.83,16.83 c -5.129,5.135 -7.84,11.549 -7.84,18.538 0,7.026 2.717,13.452 7.846,18.556 L 129.267,249.503 7.84,370.936 C 2.711,376.071 0,382.491 0,389.486 c 0,7.02 2.717,13.439 7.846,18.544 l 16.775,16.774 c 5.116,5.165 11.555,7.895 18.611,7.895 7.044,0 13.47,-2.723 18.556,-7.846 l 156.813,-156.8 c 5.128,-5.14 7.833,-11.549 7.833,-18.55 z" + id="path860" + inkscape:connector-curvature="0" /> + <path + style="fill:#008000" + d="m 498.866,384.951 h -323.02 c -7.203,0 -13.611,2.583 -18.581,7.528 -4.896,4.92 -7.484,11.327 -7.484,18.531 v 21.536 c 0,7.252 2.607,13.672 7.491,18.543 4.915,4.927 11.34,7.528 18.574,7.528 h 323.02 c 7.239,0 13.659,-2.607 18.531,-7.497 4.927,-4.908 7.533,-11.334 7.533,-18.58 v -21.537 c 0,-7.209 -2.589,-13.616 -7.54,-18.592 -4.913,-4.877 -11.321,-7.46 -18.524,-7.46 z" + id="path862" + inkscape:connector-curvature="0" /> + </g> + </g> + <g + style="fill:#008000" + id="g869" /> + <g + style="fill:#008000" + id="g871" /> + <g + style="fill:#008000" + id="g873" /> + <g + style="fill:#008000" + id="g875" /> + <g + style="fill:#008000" + id="g877" /> + <g + style="fill:#008000" + id="g879" /> + <g + style="fill:#008000" + id="g881" /> + <g + style="fill:#008000" + id="g883" /> + <g + style="fill:#008000" + id="g885" /> + <g + style="fill:#008000" + id="g887" /> + <g + style="fill:#008000" + id="g889" /> + <g + style="fill:#008000" + id="g891" /> + <g + style="fill:#008000" + id="g893" /> + <g + style="fill:#008000" + id="g895" /> + <g + style="fill:#008000" + id="g897" /> + </g> + <g + id="g914" + transform="matrix(0.08572572,0,0,0.08572572,9.9999994,8.4247072)" + style="fill:#00ff00"> + <g + id="g856" + style="fill:#00ff00"> + <g + id="g854" + style="fill:#00ff00"> + <path + inkscape:connector-curvature="0" + id="path850" + d="m 226.434,249.503 c 0,-6.995 -2.705,-13.403 -7.846,-18.556 L 61.8,74.165 c -5.128,-5.141 -11.554,-7.852 -18.568,-7.852 -7.026,0 -13.452,2.717 -18.556,7.846 l -16.83,16.83 c -5.129,5.135 -7.84,11.549 -7.84,18.538 0,7.026 2.717,13.452 7.846,18.556 L 129.267,249.503 7.84,370.936 C 2.711,376.071 0,382.491 0,389.486 c 0,7.02 2.717,13.439 7.846,18.544 l 16.775,16.774 c 5.116,5.165 11.555,7.895 18.611,7.895 7.044,0 13.47,-2.723 18.556,-7.846 l 156.813,-156.8 c 5.128,-5.14 7.833,-11.549 7.833,-18.55 z" + style="fill:#00ff00" /> + <path + inkscape:connector-curvature="0" + id="path852" + d="m 498.866,384.951 h -323.02 c -7.203,0 -13.611,2.583 -18.581,7.528 -4.896,4.92 -7.484,11.327 -7.484,18.531 v 21.536 c 0,7.252 2.607,13.672 7.491,18.543 4.915,4.927 11.34,7.528 18.574,7.528 h 323.02 c 7.239,0 13.659,-2.607 18.531,-7.497 4.927,-4.908 7.533,-11.334 7.533,-18.58 v -21.537 c 0,-7.209 -2.589,-13.616 -7.54,-18.592 -4.913,-4.877 -11.321,-7.46 -18.524,-7.46 z" + style="fill:#00ff00" /> + </g> + </g> + <g + id="g858" + style="fill:#00ff00" /> + <g + id="g860" + style="fill:#00ff00" /> + <g + id="g862" + style="fill:#00ff00" /> + <g + id="g864" + style="fill:#00ff00" /> + <g + id="g866" + style="fill:#00ff00" /> + <g + id="g868" + style="fill:#00ff00" /> + <g + id="g870" + style="fill:#00ff00" /> + <g + id="g872" + style="fill:#00ff00" /> + <g + id="g874" + style="fill:#00ff00" /> + <g + id="g876" + style="fill:#00ff00" /> + <g + id="g878" + style="fill:#00ff00" /> + <g + id="g880" + style="fill:#00ff00" /> + <g + id="g882" + style="fill:#00ff00" /> + <g + id="g884" + style="fill:#00ff00" /> + <g + id="g886" + style="fill:#00ff00" /> + </g> + </g> +</svg> diff --git a/application/widgets/CustomCommands.cpp b/application/widgets/CustomCommands.cpp new file mode 100644 index 00000000..9f11e344 --- /dev/null +++ b/application/widgets/CustomCommands.cpp @@ -0,0 +1,48 @@ +#include "CustomCommands.h" +#include "ui_CustomCommands.h" + +CustomCommands::~CustomCommands() +{ +} + +CustomCommands::CustomCommands(QWidget* parent): + QWidget(parent), + ui(new Ui::CustomCommands) +{ + ui->setupUi(this); +} + +void CustomCommands::initialize(bool checkable, bool checked, const QString& prelaunch, const QString& wrapper, const QString& postexit) +{ + ui->customCommandsGroupBox->setCheckable(checkable); + if(checkable) + { + ui->customCommandsGroupBox->setChecked(checked); + } + ui->preLaunchCmdTextBox->setText(prelaunch); + ui->wrapperCmdTextBox->setText(wrapper); + ui->postExitCmdTextBox->setText(postexit); +} + + +bool CustomCommands::checked() const +{ + if(!ui->customCommandsGroupBox->isCheckable()) + return true; + return ui->customCommandsGroupBox->isChecked(); +} + +QString CustomCommands::prelaunchCommand() const +{ + return ui->preLaunchCmdTextBox->text(); +} + +QString CustomCommands::wrapperCommand() const +{ + return ui->wrapperCmdTextBox->text(); +} + +QString CustomCommands::postexitCommand() const +{ + return ui->postExitCmdTextBox->text(); +} diff --git a/application/widgets/CustomCommands.h b/application/widgets/CustomCommands.h new file mode 100644 index 00000000..2bc7cb1a --- /dev/null +++ b/application/widgets/CustomCommands.h @@ -0,0 +1,43 @@ +/* Copyright 2018-2018 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 <QWidget> + +namespace Ui +{ +class CustomCommands; +} + +class CustomCommands : public QWidget +{ + Q_OBJECT + +public: + explicit CustomCommands(QWidget *parent = 0); + ~CustomCommands(); + void initialize(bool checkable, bool checked, const QString & prelaunch, const QString & wrapper, const QString & postexit); + + bool checked() const; + QString prelaunchCommand() const; + QString wrapperCommand() const; + QString postexitCommand() const; + +private: + Ui::CustomCommands *ui; +}; + + diff --git a/application/widgets/CustomCommands.ui b/application/widgets/CustomCommands.ui new file mode 100644 index 00000000..44104460 --- /dev/null +++ b/application/widgets/CustomCommands.ui @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CustomCommands</class> + <widget class="QWidget" name="CustomCommands"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>518</width> + <height>646</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QGroupBox" name="customCommandsGroupBox"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="title"> + <string>Cus&tom Commands</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="2" column="0"> + <widget class="QLabel" name="labelPostExitCmd"> + <property name="text"> + <string>Post-exit command:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="preLaunchCmdTextBox"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="labelPreLaunchCmd"> + <property name="text"> + <string>Pre-launch command:</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="postExitCmdTextBox"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="labelWrapperCmd"> + <property name="text"> + <string>Wrapper command:</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="wrapperCmdTextBox"/> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QLabel" name="labelCustomCmdsDescription"> + <property name="text"> + <string><html><head/><body><p>Pre-launch command runs before the instance launches and post-exit command runs after it exits.</p><p>Both will be run in MultiMC's working folder with extra environment variables:</p><ul><li>INST_NAME - Name of the instance</li><li>INST_ID - ID of the instance</li><li>INST_DIR - absolute path of the instance</li><li>INST_MC_DIR - absolute path of minecraft</li><li>INST_JAVA - java binary used for launch</li><li>INST_JAVA_ARGS - command-line parameters used for launch</li></ul><p>Wrapper command allows launching using an extra wrapper program (like 'optirun' on Linux)</p></body></html></string> + </property> + <property name="alignment"> + <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + <property name="textInteractionFlags"> + <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> |