From f24e5a707b6122f0b8ad0939236d4cd420399200 Mon Sep 17 00:00:00 2001 From: DrRac27 Date: Wed, 9 Feb 2022 00:08:44 +0100 Subject: [PATCH] Reimplement ArgumentParser in C++ Makes it possible to use --help and --version even if another instance of Moment is already running. Fixes #122. --- src/gui/ArgumentParser.qml | 59 -------------------------------------- src/gui/Window.qml | 8 ++++-- src/gui/qmldir | 1 - src/main.cpp | 39 ++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 64 deletions(-) delete mode 100644 src/gui/ArgumentParser.qml diff --git a/src/gui/ArgumentParser.qml b/src/gui/ArgumentParser.qml deleted file mode 100644 index 67892672..00000000 --- a/src/gui/ArgumentParser.qml +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright Mirage authors & contributors -// and Moment contributors -// SPDX-License-Identifier: LGPL-3.0-or-later - -pragma Singleton -import QtQuick 2.12 - -QtObject { - - property bool startInTray: false - property string loadQml: "" - - readonly property string help: `Usage: ${Qt.application.name} [options] - - Options: - -t, --start-in-tray Start in the system tray, without a visible window - -l, --load-qml PATH Override the file to be loaded as src/gui/UI.qml - -V, --version Show the application's version and exit - -h, --help Show this help and exit - - Environment variables: - MOMENT_CONFIG_DIR Override the default configuration folder - MOMENT_DATA_DIR Override the default application data folder - MOMENT_CACHE_DIR Override the default cache and downloads folder - http_proxy Override the General.proxy setting, see settings.py - ` - - readonly property bool ready: { - const passedArguments = Qt.application.arguments.slice(1) - - while (passedArguments.length) { - switch (passedArguments.shift()) { - case "-h": - case "--help": - print("\n\n" + help.replace(/^ {4}/gm, "")) - Qt.quit() - break - - case "-v": - case "--version": - print(Qt.application.version) - Qt.quit() - break - - case "-t": - case "--start-in-tray": - startInTray = true - break - - case "-l": - case "--load-qml": - loadQml = passedArguments.shift() - break - } - } - - return true - } -} diff --git a/src/gui/Window.qml b/src/gui/Window.qml index b7fe5d52..3cb48ec3 100644 --- a/src/gui/Window.qml +++ b/src/gui/Window.qml @@ -28,6 +28,8 @@ ApplicationWindow { property var theme: null property var themeRules: null property string settingsFolder + property bool startInTray + property string loadQml readonly property var visibleMenus: ({}) readonly property var visiblePopups: ({}) @@ -98,7 +100,7 @@ ApplicationWindow { minimumHeight: theme ? theme.minimumSupportedHeight : 120 width: Math.min(screen.width, 1152) height: Math.min(screen.height, 768) - visible: ArgumentParser.ready && ! ArgumentParser.startInTray + visible: ! startInTray color: "transparent" onClosing: if (py.ready && settings.General.close_to_tray) { @@ -123,8 +125,8 @@ ApplicationWindow { focus: true scale: py.ready ? 1 : 0.5 source: - ArgumentParser.ready && py.ready ? - (ArgumentParser.loadQml || "UI.qml") : + py.ready ? + (loadQml || "UI.qml") : "" Behavior on scale { HNumberAnimation { overshoot: 3; factor: 1.2 } } diff --git a/src/gui/qmldir b/src/gui/qmldir index cfa35aef..c46000b8 100644 --- a/src/gui/qmldir +++ b/src/gui/qmldir @@ -1,2 +1 @@ singleton ModelStore 0.1 ModelStore.qml -singleton ArgumentParser 0.1 ArgumentParser.qml diff --git a/src/main.cpp b/src/main.cpp index b4035b39..0530598a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include #ifdef Q_OS_UNIX @@ -372,6 +374,38 @@ int main(int argc, char *argv[]) { // because migrate displays a popup dialog QApplication app(argc, argv); + QCommandLineParser args; + + QCommandLineOption startInTrayOption(QStringList() << "t" << "start-in-tray", + "Start in the system tray, without a visible window."); + args.addOption(startInTrayOption); + + QCommandLineOption loadQmlOption(QStringList() << "l" << "load-qml", + "Override the file to be loaded as src/gui/UI.qml", "PATH"); + args.addOption(loadQmlOption); + + QCommandLineOption helpOption(QStringList() << "h" << "help", + "Displays help on commandline options."); + args.addOption(helpOption); + + args.addVersionOption(); + + args.process(app); + + if (args.isSet(helpOption)) { + std::cout << args.helpText().toStdString() << std::endl + << "Environment variables:" << std::endl + << " MOMENT_CONFIG_DIR Override the configuration folder" + << std::endl + << " MOMENT_DATA_DIR Override the application data folder" + << std::endl + << " MOMENT_CACHE_DIR Override the cache and downloads folder" + << std::endl + << " http_proxy Override the General.proxy setting, see " + << "settings.py" << std::endl; + exit(EXIT_SUCCESS); + } + if (shouldMigrateFromMirage()) tryMigrateFromMirage(); QString customConfigDir(qEnvironmentVariable("MOMENT_CONFIG_DIR")); @@ -489,7 +523,10 @@ int main(int argc, char *argv[]) { app.exit(EXIT_FAILURE); } - component.create(objectContext)->setProperty("settingsFolder", "file://"+settingsFolder); + QObject *comp = component.create(objectContext); + comp->setProperty("settingsFolder", "file://"+settingsFolder); + comp->setProperty("startInTray", args.isSet(startInTrayOption)); + comp->setProperty("loadQml", args.value(loadQmlOption)); // Finally, execute the app. Return its exit code after clearing the lock. int exit_code = app.exec();