File indexing completed on 2025-04-20 07:58:50
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 }