File indexing completed on 2024-05-12 17:07:07

0001 /*
0002     SPDX-FileCopyrightText: 2015-2016 Ivan Cukic <ivan.cukic@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "ExtraActivitiesInterface.h"
0008 
0009 #include <KActionCollection>
0010 #include <KActivities/Info>
0011 #include <KGlobalAccel>
0012 #include <KLocalizedString>
0013 #include <QAction>
0014 
0015 #include <memory>
0016 #include <utils/d_ptr_implementation.h>
0017 
0018 #include "common/dbus/common.h"
0019 #include "features_interface.h"
0020 
0021 #define ENABLE_QJSVALUE_CONTINUATION
0022 #include "utils/continue_with.h"
0023 
0024 class ExtraActivitiesInterface::Private
0025 {
0026 public:
0027     Private(ExtraActivitiesInterface *q)
0028         : features(new org::kde::ActivityManager::Features(QStringLiteral(KAMD_DBUS_SERVICE),
0029                                                            QStringLiteral(KAMD_DBUS_FEATURES_PATH),
0030                                                            QDBusConnection::sessionBus(),
0031                                                            q))
0032         , activitiesActionCollection(new KActionCollection(q, QStringLiteral("ActivityManager")))
0033     {
0034         activitiesActionCollection->setComponentDisplayName(i18n("Activities"));
0035         activitiesActionCollection->setConfigGlobal(true);
0036     }
0037 
0038     ~Private()
0039     {
0040     }
0041 
0042     QAction *actionForActivity(const QString &activity)
0043     {
0044         if (!activityActions.contains(activity)) {
0045             auto action = activitiesActionCollection->addAction(QStringLiteral("switch-to-activity-") + activity);
0046 
0047             activityActions[activity] = action;
0048             action->setProperty("isConfigurationAction", true);
0049 
0050             KGlobalAccel::self()->setShortcut(action, {});
0051         }
0052 
0053         return activityActions[activity];
0054     }
0055 
0056     std::unique_ptr<org::kde::ActivityManager::Features> features;
0057     std::unique_ptr<KActionCollection> activitiesActionCollection;
0058     QHash<QString, QAction *> activityActions;
0059 };
0060 
0061 ExtraActivitiesInterface::ExtraActivitiesInterface(QObject *parent)
0062     : QObject(parent)
0063     , d(this)
0064 {
0065 }
0066 
0067 ExtraActivitiesInterface::~ExtraActivitiesInterface()
0068 {
0069 }
0070 
0071 void ExtraActivitiesInterface::setIsPrivate(const QString &activity, bool isPrivate, QJSValue callback)
0072 {
0073     auto result = d->features->SetValue(QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/") + activity, QDBusVariant(isPrivate));
0074 
0075     auto *watcher = new QDBusPendingCallWatcher(result, this);
0076 
0077     QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [callback](QDBusPendingCallWatcher *watcher) mutable {
0078         callback.call();
0079         watcher->deleteLater();
0080     });
0081 }
0082 
0083 void ExtraActivitiesInterface::getIsPrivate(const QString &activity, QJSValue callback)
0084 {
0085     auto result = d->features->GetValue(QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/") + activity);
0086 
0087     auto *watcher = new QDBusPendingCallWatcher(result, this);
0088 
0089     QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [callback, result](QDBusPendingCallWatcher *watcher) mutable {
0090         QDBusPendingReply<QDBusVariant> reply = *watcher;
0091         callback.call({reply.value().variant().toBool()});
0092         watcher->deleteLater();
0093     });
0094 }
0095 
0096 void ExtraActivitiesInterface::setShortcut(const QString &activity, const QKeySequence &keySequence)
0097 {
0098     auto action = d->actionForActivity(activity);
0099 
0100     KGlobalAccel::self()->setShortcut(action, {keySequence}, KGlobalAccel::NoAutoloading);
0101 }
0102 
0103 QKeySequence ExtraActivitiesInterface::shortcut(const QString &activity)
0104 {
0105     auto action = d->actionForActivity(activity);
0106 
0107     const auto shortcuts = KGlobalAccel::self()->shortcut(action);
0108     return (shortcuts.isEmpty()) ? QKeySequence() : shortcuts.first();
0109 }