diff --git a/applets/digital-clock/package/contents/ui/CalendarView.qml b/applets/digital-clock/package/contents/ui/CalendarView.qml index 8bf93401f..bce64e357 100644 --- a/applets/digital-clock/package/contents/ui/CalendarView.qml +++ b/applets/digital-clock/package/contents/ui/CalendarView.qml @@ -25,6 +25,7 @@ import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.calendar 2.0 as PlasmaCalendar import org.kde.plasma.components 3.0 as PlasmaComponents3 import org.kde.plasma.extras 2.0 as PlasmaExtras +import org.kde.plasma.private.digitalclock 1.0 // Top-level layout containing: // - Left column with world clock and agenda view @@ -80,18 +81,27 @@ PlasmaExtras.Representation { text: monthView.currentDate.toLocaleDateString(Qt.locale(), Locale.LongFormat) } } - // Heading text - PlasmaExtras.Heading { - visible: agenda.visible + RowLayout { + // Heading text + PlasmaExtras.Heading { + visible: agenda.visible - Layout.fillWidth: true - Layout.leftMargin: calendar.paddings + Layout.fillWidth: true + Layout.leftMargin: calendar.paddings - level: 2 + level: 2 - text: i18n("Events") - maximumLineCount: 1 - elide: Text.ElideRight + text: i18n("Events") + maximumLineCount: 1 + elide: Text.ElideRight + } + PlasmaComponents3.ToolButton { + visible: agenda.visible && ApplicationIntegration.korganizerInstalled + text: i18nc("@action:button Add event", "Add...") + Layout.rightMargin: calendar.paddings + icon.name: "list-add" + onClicked: ApplicationIntegration.launchKorganizer() + } } } diff --git a/applets/digital-clock/plugin/CMakeLists.txt b/applets/digital-clock/plugin/CMakeLists.txt index 332bde8de..0c19f6938 100644 --- a/applets/digital-clock/plugin/CMakeLists.txt +++ b/applets/digital-clock/plugin/CMakeLists.txt @@ -12,14 +12,18 @@ set(digitalclockplugin_SRCS timezonesi18n.cpp digitalclockplugin.cpp clipboardmenu.cpp + applicationintegration.cpp ) add_library(digitalclockplugin SHARED ${digitalclockplugin_SRCS}) -target_link_libraries(digitalclockplugin Qt::Core - Qt::Qml - Qt::Widgets # for QAction... - KF5::CoreAddons - KF5::I18n) +target_link_libraries(digitalclockplugin + PRIVATE + Qt::Core + Qt::Qml + Qt::Widgets # for QAction... + KF5::CoreAddons + KF5::KIOGui + KF5::I18n) install(TARGETS digitalclockplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/plasma/private/digitalclock) diff --git a/applets/digital-clock/plugin/applicationintegration.cpp b/applets/digital-clock/plugin/applicationintegration.cpp new file mode 100644 index 000000000..5931b0106 --- /dev/null +++ b/applets/digital-clock/plugin/applicationintegration.cpp @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2021 Carl Schwan +// SPDX-Licence-Identifier: SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + +#include "applicationintegration.h" +#include + +ApplicationIntegration::ApplicationIntegration(QObject *parent) + : QObject(parent) + , m_korganizerService(KService::serviceByDesktopName(QStringLiteral("org.kde.korganizer"))) +{ +} + +bool ApplicationIntegration::korganizerInstalled() const +{ + return m_korganizerService != nullptr; +} + +void ApplicationIntegration::launchKorganizer() const +{ + Q_ASSERT(m_korganizerService); + + auto job = new KIO::ApplicationLauncherJob(m_korganizerService); + job->start(); +} diff --git a/applets/digital-clock/plugin/applicationintegration.h b/applets/digital-clock/plugin/applicationintegration.h new file mode 100644 index 000000000..1573d0e96 --- /dev/null +++ b/applets/digital-clock/plugin/applicationintegration.h @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2021 Carl Schwan +// SPDX-Licence-Identifier: SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + +#pragma once +#include +#include + +class ApplicationIntegration : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool korganizerInstalled READ korganizerInstalled CONSTANT) + +public: + explicit ApplicationIntegration(QObject *parent = nullptr); + ~ApplicationIntegration() = default; + + bool korganizerInstalled() const; + Q_INVOKABLE void launchKorganizer() const; + +private: + KService::Ptr m_korganizerService; +}; diff --git a/applets/digital-clock/plugin/digitalclockplugin.cpp b/applets/digital-clock/plugin/digitalclockplugin.cpp index 6d70750fa..ee574a691 100644 --- a/applets/digital-clock/plugin/digitalclockplugin.cpp +++ b/applets/digital-clock/plugin/digitalclockplugin.cpp @@ -17,6 +17,7 @@ */ #include "digitalclockplugin.h" +#include "applicationintegration.h" #include "clipboardmenu.h" #include "timezonemodel.h" #include "timezonesi18n.h" @@ -48,4 +49,10 @@ void DigitalClockPlugin::registerTypes(const char *uri) qmlRegisterSingletonType(uri, 1, 0, "TimezonesI18n", timezonesi18n_singletontype_provider); qmlRegisterSingletonType(uri, 1, 0, "ClipboardMenu", clipboardMenu_singletontype_provider); + + qmlRegisterSingletonType(uri, 1, 0, "ApplicationIntegration", [](QQmlEngine *engine, QJSEngine *scriptEngine) { + Q_UNUSED(engine); + Q_UNUSED(scriptEngine); + return new ApplicationIntegration(); + }); }