File indexing completed on 2024-05-05 05:28:21

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Dimitris Kardarakos <dimkard@posteo.net>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include <QDir>
0008 #include <QDebug>
0009 #include <QQmlApplicationEngine>
0010 #include <QtQml>
0011 #include <QUrl>
0012 #include <QVariant>
0013 #include <QWindow>
0014 #include <QQuickStyle>
0015 
0016 #ifdef Q_OS_ANDROID
0017 #include <QGuiApplication>
0018 #else
0019 #include <QApplication>
0020 #endif
0021 
0022 #include <KAboutData>
0023 #include <KLocalizedContext>
0024 #include <KLocalizedString>
0025 #include <KCalendarCore/Incidence>
0026 #include <KCalendarCore/Attendee>
0027 #ifndef Q_OS_ANDROID
0028 #include <KDBusService>
0029 #endif
0030 #include "calindoriconfig.h"
0031 #include "localcalendar.h"
0032 #include "incidencealarmsmodel.h"
0033 #include "daysofmonthmodel.h"
0034 #include "recurrenceperiodmodel.h"
0035 #include "daysofmonthincidencemodel.h"
0036 #include "incidencemodel.h"
0037 #include "datahandler.h"
0038 #include "calendarcontroller.h"
0039 #include "attendeesmodel.h"
0040 #include "version.h"
0041 
0042 void handleArgument(DataHandler *dataHandler, const QStringList &args)
0043 {
0044     if (!args.isEmpty()) {
0045         const auto file = args.constFirst();
0046         const auto localUrl = QUrl::fromLocalFile(file);
0047         if (QFile::exists(localUrl.toLocalFile())) {
0048             dataHandler->importFromUrl(localUrl);
0049         } else {
0050             dataHandler->importFromUrl(QUrl::fromUserInput(file));
0051         }
0052     }
0053 }
0054 
0055 Q_DECL_EXPORT int main(int argc, char *argv[])
0056 {
0057     QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0058 #ifdef Q_OS_ANDROID
0059     QGuiApplication app(argc, argv);
0060 #else
0061     // set default style
0062     if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) {
0063         QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
0064     }
0065     // if using org.kde.desktop, ensure we use kde style if possible
0066     if (qEnvironmentVariableIsEmpty("QT_QPA_PLATFORMTHEME")) {
0067         qputenv("QT_QPA_PLATFORMTHEME", "kde");
0068     }
0069 
0070     QApplication app(argc, argv);
0071 #endif
0072     KLocalizedString::setApplicationDomain("calindori");
0073 
0074     KAboutData aboutData(QStringLiteral("calindori"), i18n("Calindori"), QStringLiteral(CALINDORI_VERSION_STRING), i18nc("@title", "Calendar application"), KAboutLicense::GPL_V3, i18nc("@info:credit", "(c) 2018-2022 The Calindori Team"));
0075 
0076     aboutData.setOrganizationDomain(QByteArray("kde.org"));
0077     aboutData.setProductName(QByteArray("calindori"));
0078 
0079     aboutData.addAuthor(i18nc("@info:credit", "Dimitris Kardarakos"), i18nc("@info:credit", "Developer"), QStringLiteral("dimkard@posteo.net"));
0080 
0081     aboutData.addAuthor(i18nc("@info:credit", "Nicolas Fella"), i18nc("@info:credit", "Developer"), QStringLiteral("nicolas.fella@gmx.de"));
0082     
0083     aboutData.addAuthor(i18nc("@info:credit", "Devin Lin"), i18nc("@info:credit", "Developer"), QStringLiteral("devin@kde.org"));
0084 
0085     aboutData.setHomepage(QStringLiteral("https://invent.kde.org/kde/calindori"));
0086 
0087     KAboutData::setApplicationData(aboutData);
0088 
0089     QCommandLineParser parser;
0090     aboutData.setupCommandLine(&parser);
0091     parser.process(app);
0092     aboutData.processCommandLine(&parser);
0093 
0094 #ifndef Q_OS_ANDROID
0095     KDBusService service(KDBusService::Unique);
0096 #endif
0097 
0098     QGuiApplication::setApplicationName(aboutData.componentName());
0099     QGuiApplication::setApplicationDisplayName(aboutData.displayName());
0100     QGuiApplication::setOrganizationDomain(aboutData.organizationDomain());
0101     QGuiApplication::setApplicationVersion(aboutData.version());
0102 
0103     qmlRegisterType<LocalCalendar>("org.kde.calindori", 0, 1, "LocalCalendar");
0104     qmlRegisterType<IncidenceAlarmsModel>("org.kde.calindori", 0, 1, "IncidenceAlarmsModel");
0105     qmlRegisterType<DaysOfMonthModel>("org.kde.calindori", 0, 1, "DaysOfMonthModel");
0106     qmlRegisterType<ReccurencePeriodModel>("org.kde.calindori", 0, 1, "ReccurencePeriodModel");
0107     qmlRegisterType<DaysOfMonthIncidenceModel>("org.kde.calindori", 0, 1, "DaysOfMonthIncidenceModel");
0108     qmlRegisterType<IncidenceModel>("org.kde.calindori", 0, 1, "IncidenceModel");
0109     qmlRegisterType<AttendeesModel>("org.kde.calindori", 0, 1, "AttendeesModel");
0110     qmlRegisterUncreatableType<KCalendarCore::Attendee>("org.kde.calindori", 0, 1, "CalendarAttendee", QStringLiteral("Use Enums"));
0111 
0112     qmlRegisterSingletonType<DataHandler>("org.kde.calindori", 0, 1, "DataHandler", [](QQmlEngine * engine, QJSEngine *) -> QObject* {
0113         auto instance = DataHandler::instance();
0114         engine->setObjectOwnership(instance, QQmlEngine::CppOwnership);
0115 
0116         return instance;
0117     });
0118 
0119     qmlRegisterSingletonInstance("org.kde.calindori", 0, 1, "CalindoriConfig", &CalindoriConfig::instance());
0120     qmlRegisterSingletonInstance("org.kde.calindori", 0, 1, "CalendarController", &CalendarController::instance());
0121 
0122     DataHandler dataHandler;
0123 
0124 #ifndef Q_OS_ANDROID
0125     QObject::connect(&service, &KDBusService::activateRequested, [&parser, &dataHandler](const QStringList & args, const QString & workingDir) {
0126         qDebug() << "remote activation" << args << workingDir;
0127         if (!args.isEmpty()) {
0128             QDir::setCurrent(workingDir);
0129             parser.parse(args);
0130             handleArgument(&dataHandler, parser.positionalArguments());
0131         }
0132         if (!QGuiApplication::allWindows().isEmpty()) {
0133             QGuiApplication::allWindows().at(0)->requestActivate();
0134         }
0135     });
0136 #endif
0137 
0138     QQmlApplicationEngine engine;
0139     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0140 
0141     ReccurencePeriodModel repeatModel;
0142     engine.rootContext()->setContextProperty(QStringLiteral("_repeatModel"), &repeatModel);
0143 
0144     engine.rootContext()->setContextProperty(QStringLiteral("_aboutData"), QVariant::fromValue(aboutData));
0145     engine.rootContext()->setContextProperty(QStringLiteral("_appLocale"), QLocale::system());
0146 
0147     engine.load(QUrl(QStringLiteral("qrc:///Main.qml")));
0148 
0149     if (engine.rootObjects().isEmpty()) {
0150         return -1;
0151     }
0152 
0153     handleArgument(&dataHandler, parser.positionalArguments());
0154 
0155     int ret = app.exec();
0156     return ret;
0157 }