File indexing completed on 2024-05-12 05:50:50

0001 // SPDX-FileCopyrightText: 2022 Felipe Kinoshita <kinofhek@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #include <QtGlobal>
0005 #ifdef Q_OS_ANDROID
0006 #include <QGuiApplication>
0007 #else
0008 #include <QApplication>
0009 #endif
0010 #include <QIcon>
0011 #include <QQmlApplicationEngine>
0012 #include <QQuickStyle>
0013 #include <QQuickWindow>
0014 #include <QUrl>
0015 #include <QtQml>
0016 
0017 #include <KAboutData>
0018 #include <KLocalizedContext>
0019 #include <KLocalizedString>
0020 #ifdef HAVE_KDBUSADDONS
0021 #include <KDBusService>
0022 #endif
0023 
0024 #ifdef Q_OS_WINDOWS
0025 #include <Windows.h>
0026 #endif
0027 
0028 constexpr auto APPLICATION_ID = "org.kde.francis";
0029 
0030 #include "app.h"
0031 #include "config.h"
0032 #include "controller.h"
0033 #include "version-francis.h"
0034 
0035 Q_DECL_EXPORT int main(int argc, char *argv[])
0036 {
0037 #ifdef Q_OS_ANDROID
0038     QGuiApplication app(argc, argv);
0039     QQuickStyle::setStyle(QStringLiteral("org.kde.breeze"));
0040 #else
0041     QApplication app(argc, argv);
0042     // Default to org.kde.desktop style unless the user forces another style
0043     if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) {
0044         QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
0045     }
0046 
0047 #endif
0048     QCoreApplication::setOrganizationName(QStringLiteral("KDE"));
0049     KLocalizedString::setApplicationDomain("francis");
0050 
0051     KAboutData aboutData(
0052         // The program name used internally.
0053         QStringLiteral("francis"),
0054         // A displayable program name string.
0055         i18nc("@title", "Francis"),
0056         // The program version string.
0057         QStringLiteral(FRANCIS_VERSION_STRING),
0058         // Short description of what the app does.
0059         i18n("Track your time"),
0060         // The license this code is released under.
0061         KAboutLicense::GPL_V3,
0062         // Copyright Statement.
0063         i18n("© KDE Community"));
0064     aboutData.addAuthor(i18nc("@info:credit", "Felipe Kinoshita"),
0065                         i18nc("@info:credit", "Author"),
0066                         QStringLiteral("kinofhek@gmail.com"),
0067                         QStringLiteral("https://fhek.gitlab.io"));
0068     aboutData.addAuthor(i18nc("@info:credit", "Carl Schwan"),
0069                         i18nc("@info:credit", "Maintainer"),
0070                         QStringLiteral("carl@carlschwan.eu"),
0071                         QStringLiteral("https://carlschwan.eu/"));
0072     aboutData.setBugAddress("https://bugs.kde.org/enter_bug.cgi?product=Francis");
0073     KAboutData::setApplicationData(aboutData);
0074     QGuiApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.francis")));
0075 
0076     QQmlApplicationEngine engine;
0077 
0078     auto config = Config::self();
0079     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "Config", config);
0080 
0081     App application;
0082     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "App", &application);
0083 
0084     qmlRegisterSingletonType(APPLICATION_ID, 1, 0, "About", [](QQmlEngine *engine, QJSEngine *) -> QJSValue {
0085         return engine->toScriptValue(KAboutData::applicationData());
0086     });
0087 
0088     Controller controller;
0089     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "Controller", &controller);
0090 
0091     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0092     engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
0093 
0094     if (engine.rootObjects().isEmpty()) {
0095         return -1;
0096     }
0097 
0098 #ifdef HAVE_KDBUSADDONS
0099     KDBusService service(KDBusService::Unique);
0100 #endif
0101 
0102     // Restore window size and position
0103     const auto rootObjects = engine.rootObjects();
0104     for (auto obj : rootObjects) {
0105         auto view = qobject_cast<QQuickWindow *>(obj);
0106         if (view) {
0107             if (view->isVisible()) {
0108                 application.restoreWindowGeometry(view);
0109             }
0110             break;
0111         }
0112     }
0113 
0114     return app.exec();
0115 }