diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -310,7 +310,7 @@ ) install(PROGRAMS - org.kde.korganizer.desktop korganizer-import.desktop + org.kde.korganizer.desktop korganizer-import.desktop korganizer-view.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) diff --git a/src/koapp.h b/src/koapp.h --- a/src/koapp.h +++ b/src/koapp.h @@ -48,7 +48,7 @@ Process calendar from URL \arg url. If url is empty open the default calendar based on the resource framework. */ - void processCalendar(const QUrl &url); + void processCalendar(const QUrl &url, bool show = true); }; #endif diff --git a/src/koapp.cpp b/src/koapp.cpp --- a/src/koapp.cpp +++ b/src/koapp.cpp @@ -38,6 +38,11 @@ #include #include +#include +#include + +#include + KOrganizerApp::KOrganizerApp(int &argc, char **argv[]) : KontactInterface::PimUniqueApplication(argc, argv) { @@ -64,11 +69,34 @@ } first = false; + QDBusConnection::sessionBus().interface()->startService(QStringLiteral("org.kde.korgac")); + QCommandLineParser parser; korganizer_options(&parser); parser.process(args); - QDBusConnection::sessionBus().interface()->startService(QStringLiteral("org.kde.korgac")); + + if (parser.isSet(QStringLiteral("view"))) { + processCalendar(QUrl(), false); + const auto url = QUrl{parser.value(QStringLiteral("view"))}; + auto fetchJob = new Akonadi::ItemFetchJob(Akonadi::Item::fromUrl(url), this); + fetchJob->fetchScope().fetchFullPayload(); + connect(fetchJob, &Akonadi::ItemFetchJob::result, + this, [](KJob *job) { + if (job->error()) { + KMessageBox::detailedSorry(nullptr, i18n("Failed to retrieve incidence from Akonadi"), job->errorText()); + return; + } + auto fetchJob = static_cast(job); + if (fetchJob->count() != 1) { + KMessageBox::sorry(nullptr, i18n("Failed to retrieve incidence from Akonadi: requested incidence doesn't exist.")); + return; + } + KOrg::MainWindow *korg = ActionManager::findInstance(QUrl()); + korg->actionManager()->view()->showIncidence(fetchJob->items().first()); + }); + return 0; + } // No filenames given => all other args are meaningless, show main Window if (parser.positionalArguments().isEmpty()) { @@ -105,23 +133,25 @@ return 0; } -void KOrganizerApp::processCalendar(const QUrl &url) +void KOrganizerApp::processCalendar(const QUrl &url, bool show) { KOrg::MainWindow *korg = ActionManager::findInstance(url); if (!korg) { bool hasDocument = !url.isEmpty(); korg = new KOrganizer(); korg->init(hasDocument); - korg->topLevelWidget()->show(); + if (show) { + korg->topLevelWidget()->show(); + } qCDebug(KORGANIZER_LOG) << url.url(); if (hasDocument) { korg->openURL(url); } else { // korg->view()->updateView(); } - } else { + } else if (show) { korg->topLevelWidget()->show(); } } diff --git a/src/korganizer-view.desktop b/src/korganizer-view.desktop new file mode 100644 --- /dev/null +++ b/src/korganizer-view.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Name=KOrganizer View +Comment=Display incidence specified by URL +Type=Application +Exec=korganizer --view %u +Icon=korganizer +Terminal=false +NoDisplay=true +MimeType=application/x-vnd.akonadi.calendar.event;application/x-vnd.akonadi.calendar.journal;application/x-vnd.akonadi.calendar.todo;text/calendar + +X-KDE-StartupNotify=true +X-DBUS-StartupType=Unique +X-DBUS-ServiceName=org.kde.korganizer diff --git a/src/korganizer_options.h b/src/korganizer_options.h --- a/src/korganizer_options.h +++ b/src/korganizer_options.h @@ -37,6 +37,9 @@ parser->addOption(QCommandLineOption( QStringList() << QStringLiteral("m") << QStringLiteral("merge"), i18n("Merge the specified files into an existing calendar"))); + parser->addOption(QCommandLineOption( + {QStringLiteral("view")}, + i18n("Display the specified incidence (by URL)"), QStringLiteral("url"))); parser->addPositionalArgument( QStringLiteral("calendars"),