File indexing completed on 2024-04-28 16:42:55

0001 // SPDX-FileCopyrightText: 2019-2020 Jonah Brüchert <jbb@kaidan.im>
0002 // SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
0003 // SPDX-License-Identifier: GPL-2.0-or-later
0004 
0005 #include <QApplication>
0006 #include <QCommandLineParser>
0007 #include <QQmlApplicationEngine>
0008 #include <QtQml>
0009 #include <QUrl>
0010 #include <QIcon>
0011 
0012 #include <KLocalizedContext>
0013 #include <KLocalizedString>
0014 #include <KAboutData>
0015 
0016 #include "fontlistmodel.h"
0017 #include "terminalsettings.h"
0018 #include "savedcommandsmodel.h"
0019 #include "terminaltabmodel.h"
0020 #include "version.h"
0021 #include "util.h"
0022 #include "shellcommand.h"
0023 
0024 constexpr auto URI = "org.kde.qmlkonsole";
0025 
0026 Q_DECL_EXPORT int main(int argc, char *argv[])
0027 {
0028     QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0029     
0030     QApplication app(argc, argv);
0031     
0032     KLocalizedString::setApplicationDomain("qmlkonsole");
0033     KAboutData aboutData(QStringLiteral("qmlkonsole"),
0034                          QStringLiteral("QMLKonsole"),
0035                          QStringLiteral(QMLKONSOLE_VERSION_STRING),
0036                          QStringLiteral("Mobile terminal application"),
0037                          KAboutLicense::GPL,
0038                          i18n("© 2020-2022 KDE Community"));
0039     aboutData.setBugAddress("https://bugs.kde.org/enter_bug.cgi?product=QMLKonsole");
0040     aboutData.addAuthor(i18n("Jonah Brüchert"), QString(), QStringLiteral("jbb@kaidan.im"));
0041     aboutData.addAuthor(i18n("Devin Lin"), QString(), QStringLiteral("devin@kde.org"));
0042     KAboutData::setApplicationData(aboutData);
0043 
0044     qmlRegisterSingletonInstance<TerminalSettings>(URI, 1, 0, "TerminalSettings", TerminalSettings::self());
0045     qmlRegisterSingletonType<ShellCommand>(URI, 1, 0, "ShellCommand", [](QQmlEngine *, QJSEngine *) {
0046         return new ShellCommand();
0047     });
0048 
0049     QObject::connect(TerminalSettings::self(), &TerminalSettings::configChanged, QApplication::instance(), [] {
0050         TerminalSettings::self()->save();
0051         qDebug() << "saving config";
0052     });
0053 
0054     QQmlApplicationEngine engine;
0055     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0056 
0057     Util util;
0058     {
0059         QCommandLineParser parser;
0060         parser.addOption(QCommandLineOption(QStringLiteral("e"), i18n("Command to execute"), QStringLiteral("command")));
0061         parser.addOption(QCommandLineOption(QStringLiteral("workdir"), i18n("Set the initial working directory to 'dir'"), QStringLiteral("dir")));
0062         parser.addVersionOption();
0063         parser.addHelpOption();
0064         parser.process(app);
0065 
0066         QString initialCommand = parser.isSet(QStringLiteral("e")) ? parser.value(QStringLiteral("e")) : "";
0067         QString initialWorkDir = parser.isSet(QStringLiteral("workdir")) ? parser.value(QStringLiteral("workdir")) : QDir::currentPath();
0068         util.setInitialCommand(std::move(initialCommand));
0069         util.setInitialWorkDir(std::move(initialWorkDir));
0070     }
0071 
0072     qmlRegisterSingletonType<TerminalTabModel>(URI, 1, 0, "SavedCommandsModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0073         return SavedCommandsModel::self();
0074     });
0075     qmlRegisterSingletonType<TerminalTabModel>(URI, 1, 0, "TerminalTabModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0076         return TerminalTabModel::self();
0077     });
0078     qmlRegisterSingletonType<FontListSearchModel>(URI, 1, 0, "FontListSearchModel", [](QQmlEngine *, QJSEngine *) -> QObject * {
0079         return FontListSearchModel::self();
0080     });
0081     qmlRegisterSingletonInstance(URI, 1, 0, "Util", &util);
0082     qmlRegisterSingletonType(URI, 1, 0, "About", [](QQmlEngine *, QJSEngine *engine) {
0083         return engine->toScriptValue(KAboutData::applicationData());
0084     });
0085     
0086     engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
0087 
0088     if (engine.rootObjects().isEmpty()) {
0089         return -1;
0090     }
0091     
0092     // required for X11
0093     app.setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.qmlkonsole")));
0094     
0095     return app.exec();
0096 }