File indexing completed on 2024-04-21 05:54:14

0001 // SPDX-FileCopyrightText: 2022 Felipe Kinoshita <kinofhek@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #include <QIcon>
0005 #include <QQmlApplicationEngine>
0006 #include <QUrl>
0007 #include <QtQml>
0008 #include <QQuickStyle>
0009 #include <QQuickWindow>
0010 
0011 #include "about.h"
0012 #include "version-tasks.h"
0013 #include <KAboutData>
0014 #include <KLocalizedContext>
0015 #include <KLocalizedString>
0016 
0017 #ifndef Q_OS_ANDROID
0018 #include <QApplication>
0019 
0020 #include <KDBusService>
0021 #include <KWindowSystem>
0022 #else
0023 #include <QGuiApplication>
0024 #endif
0025 
0026 constexpr auto APPLICATION_ID = "org.kde.tasks";
0027 
0028 #include "config.h"
0029 #include "controller.h"
0030 #include "tasksmodel.h"
0031 
0032 Q_DECL_EXPORT int main(int argc, char *argv[])
0033 {
0034 #ifndef Q_OS_ANDROID
0035     QApplication app(argc, argv);
0036     QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
0037 #else
0038     QGuiApplication app(argc, argv);
0039     QQuickStyle::setStyle(QStringLiteral("org.kde.breeze"));
0040 #endif
0041 
0042     KLocalizedString::setApplicationDomain("toad");
0043 
0044     QCoreApplication::setOrganizationName(QStringLiteral("KDE"));
0045     QCoreApplication::setApplicationName(QStringLiteral("tasks"));
0046 
0047     KAboutData aboutData(
0048                          // The program name used internally.
0049                          QStringLiteral("tasks"),
0050                          // A displayable program name string.
0051                          i18nc("@title", "Tasks"),
0052                          // The program version string.
0053                          QStringLiteral(TASKS_VERSION_STRING),
0054                          // Short description of what the app does.
0055                          i18n("Organize your tasks"),
0056                          // The license this code is released under.
0057                          KAboutLicense::GPL,
0058                          // Copyright Statement.
0059                          i18n("© 2022 Felipe Kinoshita"));
0060     aboutData.addAuthor(i18nc("@info:credit", "Felipe Kinoshita"), i18nc("@info:credit", "Author"), QStringLiteral("kinofhek@gmail.com"), QStringLiteral("https://fhek.gitlab.io"));
0061     aboutData.setBugAddress("https://invent.kde.org/utilities/toad/-/issues/new");
0062     KAboutData::setApplicationData(aboutData);
0063     QGuiApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("org.kde.tasks")));
0064 
0065     QQmlApplicationEngine engine;
0066 
0067     auto config = Config::self();
0068 
0069     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "Config", config);
0070 
0071     AboutType about;
0072     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "AboutType", &about);
0073 
0074     Controller controller;
0075     qmlRegisterSingletonInstance(APPLICATION_ID, 1, 0, "Controller", &controller);
0076 
0077     qmlRegisterUncreatableType<TasksModel>(APPLICATION_ID, 1,0 , "TasksModel", QStringLiteral("Must be created from C++"));
0078     auto tasksModel = new TasksModel(qApp);
0079 
0080     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0081     engine.setInitialProperties(
0082         /* QMap<QString, QVariant> or QVariantMap */ {
0083             { QStringLiteral("tasksModel"), QVariant::fromValue(tasksModel) }
0084         }
0085     );
0086     engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
0087 
0088     if (engine.rootObjects().isEmpty()) {
0089         return -1;
0090     }
0091 
0092 #ifndef Q_OS_ANDROID
0093     KDBusService service(KDBusService::Unique);
0094 
0095     // Raise window when new instance is requested e.g middle click on taskmanager
0096     QObject::connect(&service, &KDBusService::activateRequested, &engine, [&engine](const QStringList & /*arguments*/, const QString & /*workingDirectory*/) {
0097         const auto rootObjects = engine.rootObjects();
0098         for (auto obj : rootObjects) {
0099             auto view = qobject_cast<QQuickWindow *>(obj);
0100             if (view) {
0101                 KWindowSystem::updateStartupId(view);
0102                 KWindowSystem::activateWindow(view);
0103                 return;
0104             }
0105         }
0106     });
0107 #endif
0108 
0109     // Restore window size and position
0110     const auto rootObjects = engine.rootObjects();
0111     for (auto obj : rootObjects) {
0112         auto view = qobject_cast<QQuickWindow *>(obj);
0113         if (view) {
0114             if (view->isVisible()) {
0115                 controller.restoreWindowGeometry(view);
0116             }
0117             break;
0118         }
0119     }
0120 
0121     return app.exec();
0122 }