From 576e979df4a54df9bf5ffeae3559f488b3045268 Mon Sep 17 00:00:00 2001 From: Orochimarufan Date: Thu, 21 Feb 2013 19:35:52 +0100 Subject: Implement About Dialog Prepared XDG icon theme in :/icons/multimc. will only be usefull as soon as Qt decides to support custom fallback themes. use the resources directly for now. --- CMakeLists.txt | 3 + gui/aboutdialog.cpp | 23 ++++ gui/aboutdialog.h | 22 ++++ gui/aboutdialog.ui | 288 ++++++++++++++++++++++++++++++++++++++++++++++++ gui/mainwindow.cpp | 4 +- main.cpp | 17 ++- multimc.qrc | 4 + resources/XdgIcon.theme | 12 ++ util/cmdutils.cpp | 27 ++--- util/cmdutils.h | 22 ++-- 10 files changed, 397 insertions(+), 25 deletions(-) create mode 100644 gui/aboutdialog.cpp create mode 100644 gui/aboutdialog.h create mode 100644 gui/aboutdialog.ui create mode 100644 resources/XdgIcon.theme diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ab4ca97..1853a8f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,6 +113,7 @@ gui/newinstancedialog.cpp gui/logindialog.cpp gui/taskdialog.cpp gui/browserdialog.cpp +gui/aboutdialog.cpp util/pathutils.cpp util/osutils.cpp @@ -134,6 +135,7 @@ gui/newinstancedialog.h gui/logindialog.h gui/taskdialog.h gui/browserdialog.h +gui/aboutdialog.h data/appsettings.h data/inifile.h @@ -174,6 +176,7 @@ gui/newinstancedialog.ui gui/logindialog.ui gui/taskdialog.ui gui/browserdialog.ui +gui/aboutdialog.ui ) ################################ Install ################################ diff --git a/gui/aboutdialog.cpp b/gui/aboutdialog.cpp new file mode 100644 index 00000000..876f3044 --- /dev/null +++ b/gui/aboutdialog.cpp @@ -0,0 +1,23 @@ +#include "aboutdialog.h" +#include "ui_aboutdialog.h" + +#include +#include + +AboutDialog::AboutDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AboutDialog) +{ + ui->setupUi(this); + + ui->icon->setPixmap(QIcon(":/icons/multimc/scalable/apps/multimc.svg").pixmap(64)); + + connect(ui->closeButton, SIGNAL(clicked()), SLOT(close())); + + QApplication::instance()->connect(ui->aboutQt, SIGNAL(clicked()), SLOT(aboutQt())); +} + +AboutDialog::~AboutDialog() +{ + delete ui; +} diff --git a/gui/aboutdialog.h b/gui/aboutdialog.h new file mode 100644 index 00000000..d462de28 --- /dev/null +++ b/gui/aboutdialog.h @@ -0,0 +1,22 @@ +#ifndef ABOUTDIALOG_H +#define ABOUTDIALOG_H + +#include + +namespace Ui { +class AboutDialog; +} + +class AboutDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AboutDialog(QWidget *parent = 0); + ~AboutDialog(); + +private: + Ui::AboutDialog *ui; +}; + +#endif // ABOUTDIALOG_H diff --git a/gui/aboutdialog.ui b/gui/aboutdialog.ui new file mode 100644 index 00000000..6b8f906d --- /dev/null +++ b/gui/aboutdialog.ui @@ -0,0 +1,288 @@ + + + AboutDialog + + + + 0 + 0 + 450 + 400 + + + + + 450 + 400 + + + + Dialog + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + + 64 + 64 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 15 + + + + MultiMC + + + Qt::AlignCenter + + + + + + + 0 + + + + + 0 + 0 + 432 + 153 + + + + About + + + + + + MultiMC is a custom launcher that makes managing Minecraft easier by allowing you to have multiple installations of Minecraft at once. + + + Qt::AlignCenter + + + true + + + + + + + + 8 + true + + + + © 2013 MultiMC Contributors + + + Qt::AlignCenter + + + + + + + + 10 + + + + <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> + + + Qt::AlignCenter + + + + + + + + + 0 + 0 + 432 + 153 + + + + Credits + + + + + + true + + + <!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: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;">Andrew Okin &lt;<a href="mailto:forkk@forkk.net"><span style=" text-decoration: underline; color:#0000ff;">forkk@forkk.net</span></a>&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Petr Mrázek &lt;<a href="mailto:peterix@gmail.com"><span style=" text-decoration: underline; color:#0000ff;">peterix@gmail.com</span></a>&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Orochimarufan &lt;<a href="mailto:orochimarufan.x3@gmail.com"><span style=" text-decoration: underline; color:#0000ff;">orochimarufan.x3@gmail.com</span></a>&gt;</p></body></html> + + + + + + + + License + + + + + + + 0 + 0 + + + + true + + + <!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: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-size:10pt;">Copyright 2012 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;"> 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;">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;">MultiMC uses bspatch, </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 2003-2005 Colin Percival</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 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</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;">modification, are permitted providing that the following conditions</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 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;">1. 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:10pt;"> 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:10pt;">2. 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:10pt;"> 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:10pt;"> documentation and/or other materials provided with the distribution.</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 AUTHOR ``AS IS'' AND ANY EXPRESS 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:10pt;">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</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 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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:10pt;">DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</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;">DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</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 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</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;">HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,</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;">STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING</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 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 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:10pt;">POSSIBILITY OF SUCH DAMAGE.</span></p></body></html> + + + + + + + + + + + + + About Qt + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Close + + + + + + + + + + diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 0ca9fde1..43c5cd82 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -37,6 +37,7 @@ #include "gui/logindialog.h" #include "gui/taskdialog.h" #include "gui/browserdialog.h" +#include "gui/aboutdialog.h" #include "data/appsettings.h" #include "data/version.h" @@ -109,7 +110,8 @@ void MainWindow::on_actionNews_triggered() void MainWindow::on_actionAbout_triggered() { - + AboutDialog dialog(this); + dialog.exec(); } void MainWindow::on_mainToolBar_visibilityChanged(bool) diff --git a/main.cpp b/main.cpp index efabc20a..fb7a5061 100644 --- a/main.cpp +++ b/main.cpp @@ -27,6 +27,8 @@ #include "util/cmdutils.h" +#include "config.h" + using namespace Util::Commandline; int main(int argc, char *argv[]) @@ -46,7 +48,11 @@ int main(int argc, char *argv[]) // --help parser.addSwitch("help"); parser.addShortOpt("help", 'h'); - parser.addDocumentation("help", "displays help on command line parameters"); + parser.addDocumentation("help", "display this help and exit."); + // --version + parser.addSwitch("version"); + parser.addShortOpt("version", 'V'); + parser.addDocumentation("version", "display program version and exit."); // --dir parser.addOption("dir", app.applicationDirPath()); parser.addShortOpt("dir", 'd'); @@ -70,6 +76,7 @@ int main(int argc, char *argv[]) args = parser.parse(app.arguments()); } catch(ParsingError e) { std::cerr << "CommandLineError: " << e.what() << std::endl; + std::cerr << "Try '%1 -h' to get help on MultiMC's command line parameters." << std::endl; return 1; } @@ -79,16 +86,24 @@ int main(int argc, char *argv[]) return 0; } + // display version and exit + if (args["version"].toBool()) { + std::cout << VERSION_STR << " " << JENKINS_BUILD_TAG << " " << (ARCH==x64?"x86_64":"x86") << std::endl; + return 0; + } + // update // Note: cwd is always the current executable path! if (!args["update"].isNull()) { std::cout << "Performing MultiMC update: " << qPrintable(args["update"].toString()) << std::endl; + QString cwd = QDir::currentPath(); QDir::setCurrent(app.applicationDirPath()); QFile file(app.applicationFilePath()); file.copy(args["update"].toString()); if(args["quietupdate"].toBool()) return 0; + QDir::setCurrent(cwd); } // change directory diff --git a/multimc.qrc b/multimc.qrc index d0171fa3..7008206b 100644 --- a/multimc.qrc +++ b/multimc.qrc @@ -30,4 +30,8 @@ resources/MultiMCLauncher.jar + + resources/icons/multimc.svg + resources/XdgIcon.theme + diff --git a/resources/XdgIcon.theme b/resources/XdgIcon.theme new file mode 100644 index 00000000..ad26482e --- /dev/null +++ b/resources/XdgIcon.theme @@ -0,0 +1,12 @@ +[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/util/cmdutils.cpp b/util/cmdutils.cpp index 890f07f8..bd52cf8f 100644 --- a/util/cmdutils.cpp +++ b/util/cmdutils.cpp @@ -50,7 +50,7 @@ FlagStyle Parser::flagStyle() } // setup methods -void Parser::addSwitch(QString name, bool def) throw (const char *) +void Parser::addSwitch(QString name, bool def) { if (m_params.contains(name)) throw "Name not unique"; @@ -66,7 +66,7 @@ void Parser::addSwitch(QString name, bool def) throw (const char *) m_optionList.append(param); } -void Parser::addOption(QString name, QVariant def) throw (const char *) +void Parser::addOption(QString name, QVariant def) { if (m_params.contains(name)) throw "Name not unique"; @@ -82,7 +82,7 @@ void Parser::addOption(QString name, QVariant def) throw (const char *) m_optionList.append(param); } -void Parser::addArgument(QString name, bool required, QVariant def) throw (const char *) +void Parser::addArgument(QString name, bool required, QVariant def) { if (m_params.contains(name)) throw "Name not unique"; @@ -91,12 +91,13 @@ void Parser::addArgument(QString name, bool required, QVariant def) throw (const param->name = name; param->def = def; param->required = required; + param->metavar = name; m_positionals.append(param); m_params[name] = (CommonDef *)param; } -void Parser::addDocumentation(QString name, QString doc, QString metavar) throw (const char *) +void Parser::addDocumentation(QString name, QString doc, QString metavar) { if (!m_params.contains(name)) throw "Name does not exist"; @@ -107,7 +108,7 @@ void Parser::addDocumentation(QString name, QString doc, QString metavar) throw param->metavar = metavar; } -void Parser::addShortOpt(QString name, QChar flag) throw (const char *) +void Parser::addShortOpt(QString name, QChar flag) { if (!m_params.contains(name)) throw "Name does not exist"; @@ -135,7 +136,7 @@ QString Parser::compileHelp(QString progName, int helpIndent, bool useFlags) { PositionalDef *param = it2.next(); help << " " << param->metavar; - help << " " << QString(helpIndent - param->name.length() - 1, ' '); + help << " " << QString(helpIndent - param->metavar.length() - 1, ' '); help << param->doc << "\r\n"; } } @@ -203,7 +204,7 @@ QString Parser::compileUsage(QString progName, bool useFlags) { PositionalDef *param = it2.next(); usage << " " << (param->required ? "<" : "["); - usage << param->name; + usage << param->metavar; usage << (param->required ? ">" : "]"); } @@ -211,7 +212,7 @@ QString Parser::compileUsage(QString progName, bool useFlags) } // parsing -QHash Parser::parse(QStringList argv) throw (ParsingError) +QHash Parser::parse(QStringList argv) { QHash map; @@ -411,20 +412,20 @@ void Parser::getPrefix(QString &opt, QString &flag) } // ParsingError -ParsingError::ParsingError(const QString &what) throw() +ParsingError::ParsingError(const QString &what) { m_what = what; } -ParsingError::ParsingError(const ParsingError &e) throw() +ParsingError::ParsingError(const ParsingError &e) { m_what = e.m_what; } -char *ParsingError::what() const throw() +const char *ParsingError::what() const throw() { - return m_what.toLocal8Bit().data(); + return m_what.toLocal8Bit().constData(); } -QString ParsingError::qwhat() const throw() +QString ParsingError::qwhat() const { return m_what; } diff --git a/util/cmdutils.h b/util/cmdutils.h index 10f8a9db..690c96fd 100644 --- a/util/cmdutils.h +++ b/util/cmdutils.h @@ -68,11 +68,11 @@ enum class ArgumentStyle { class ParsingError : public std::exception { public: - ParsingError(const QString &what) throw(); - ParsingError(const ParsingError &e) throw(); + ParsingError(const QString &what); + ParsingError(const ParsingError &e); ~ParsingError() throw() {} - char *what() const throw(); - QString qwhat() const throw(); + const char *what() const throw(); + QString qwhat() const; private: QString m_what; }; @@ -119,14 +119,14 @@ public: * @param name the parameter name * @param def the default value */ - void addSwitch(QString name, bool def=false) throw (const char *); + void addSwitch(QString name, bool def=false); /** * @brief define an option that takes an additional argument * @param name the parameter name * @param def the default value */ - void addOption(QString name, QVariant def=QVariant()) throw (const char *); + void addOption(QString name, QVariant def=QVariant()); /** * @brief define a positional argument @@ -134,7 +134,7 @@ public: * @param required wether this argument is required * @param def the default value */ - void addArgument(QString name, bool required=true, QVariant def=QVariant()) throw (const char *); + void addArgument(QString name, bool required=true, QVariant def=QVariant()); /** * @brief adds a flag to an existing parameter @@ -143,15 +143,17 @@ public: * @see addSwitch addArgument addOption * Note: any one parameter can only have one flag */ - void addShortOpt(QString name, QChar flag) throw (const char *); + void addShortOpt(QString name, QChar flag); /** * @brief adds documentation to a Parameter * @param name the parameter name * @param metavar a string to be displayed as placeholder for the value * @param doc a QString containing the documentation + * Note: on positional arguments, metavar replaces the name as displayed. + * on options , metavar replaces the value placeholder */ - void addDocumentation(QString name, QString doc, QString metavar=QString()) throw (const char *); + void addDocumentation(QString name, QString doc, QString metavar=QString()); /** * @brief generate a help message @@ -175,7 +177,7 @@ public: * @param argv a QStringList containing the program ARGV * @return a QHash mapping argument names to their values */ - QHash parse(QStringList argv) throw (ParsingError); + QHash parse(QStringList argv); /** * @brief clear all definitions -- cgit v1.2.3