diff --git a/kcms/activities/CMakeLists.txt b/kcms/activities/CMakeLists.txt index 34de57a65..b06ce2643 100644 --- a/kcms/activities/CMakeLists.txt +++ b/kcms/activities/CMakeLists.txt @@ -1,89 +1,94 @@ # vim:set softtabstop=3 shiftwidth=3 tabstop=3 expandtab: project (KCMActivities) add_definitions(-DTRANSLATION_DOMAIN=\"kcm_activities5\") find_package (Qt5 REQUIRED NO_MODULE COMPONENTS Core Quick Sql Qml DBus) find_package (KF5KCMUtils ${KF5_DEP_VERSION} CONFIG REQUIRED) find_package (KF5Declarative ${KF5_DEP_VERSION} CONFIG REQUIRED) find_package (KF5XmlGui ${KF5_DEP_VERSION} CONFIG REQUIRED) find_package (KF5GlobalAccel ${KF5_DEP_VERSION} CONFIG REQUIRED) find_package (KF5Activities ${KF5_DEP_VERSION} CONFIG REQUIRED) set (KAMD_KCM_DATADIR ${KDE_INSTALL_DATADIR_KF5}/kactivitymanagerd/workspace/settings/ ) if (NOT IS_ABSOLUTE "${KDE_INSTALL_DATADIR_KF5}") set (KAMD_KCM_DATADIR "${CMAKE_INSTALL_PREFIX}/${KAMD_KCM_DATADIR}") endif () configure_file (kactivities-kcm-features.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/kactivities-kcm-features.h) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(imports) set (KAMD_KCM_SRCS kcm_activities.cpp MainConfigurationWidget.cpp ActivitiesTab.cpp SwitchingTab.cpp PrivacyTab.cpp BlacklistedApplicationsModel.cpp ExtraActivitiesInterface.cpp utils/dbusfuture_p.cpp ) ki18n_wrap_ui ( KAMD_KCM_SRCS ui/MainConfigurationWidgetBase.ui ui/PrivacyTabBase.ui ui/SwitchingTabBase.ui ) qt5_add_dbus_interface ( KAMD_KCM_SRCS common/dbus/org.kde.ActivityManager.Features.xml features_interface ) +kconfig_add_kcfg_files(KAMD_KCM_SRCS kactivitymanagerd_settings.kcfgc GENERATE_MOC) +kconfig_add_kcfg_files(KAMD_KCM_SRCS kactivitymanagerd_plugins_settings.kcfgc GENERATE_MOC) + add_library (kcm_activities MODULE ${KAMD_KCM_SRCS}) target_link_libraries (kcm_activities Qt5::Quick Qt5::Core Qt5::Sql Qt5::Qml Qt5::DBus KF5::KCMUtils KF5::I18n KF5::Service KF5::Declarative KF5::XmlGui KF5::GlobalAccel KF5::Activities ) install ( TARGETS kcm_activities DESTINATION ${KDE_INSTALL_PLUGINDIR} ) install ( FILES kcm_activities.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) install ( DIRECTORY qml/activitiesTab qml/privacyTab DESTINATION ${KAMD_KCM_DATADIR}/qml ) +install(FILES kactivitymanagerd_settings.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) +install(FILES kactivitymanagerd_plugins_settings.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) diff --git a/kcms/activities/ExtraActivitiesInterface.cpp b/kcms/activities/ExtraActivitiesInterface.cpp index 55fadc901..65a4b0be8 100644 --- a/kcms/activities/ExtraActivitiesInterface.cpp +++ b/kcms/activities/ExtraActivitiesInterface.cpp @@ -1,137 +1,136 @@ /* * Copyright (C) 2015 - 2016 by Ivan Cukic * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ExtraActivitiesInterface.h" #include #include #include #include #include #include #include #include "utils/dbusfuture_p.h" #include "features_interface.h" -#include "definitions.h" #include "common/dbus/common.h" #define ENABLE_QJSVALUE_CONTINUATION #include "utils/continue_with.h" class ExtraActivitiesInterface::Private { public: Private(ExtraActivitiesInterface *q) : features(new KAMD_DBUS_CLASS_INTERFACE(Features, Features, q)) , activitiesActionCollection(new KActionCollection(q, QStringLiteral("ActivityManager"))) { activitiesActionCollection->setComponentDisplayName(i18n("Activities")); activitiesActionCollection->setConfigGlobal(true); } ~Private() { } QAction *actionForActivity(const QString &activity) { if (!activityActions.contains(activity)) { auto action = activitiesActionCollection->addAction( QStringLiteral("switch-to-activity-") + activity); activityActions[activity] = action; action->setProperty("isConfigurationAction", true); KGlobalAccel::self()->setShortcut(action, {}); } return activityActions[activity]; } std::unique_ptr features; std::unique_ptr activitiesActionCollection; QHash activityActions; }; ExtraActivitiesInterface::ExtraActivitiesInterface(QObject *parent) : QObject(parent) , d(this) { } ExtraActivitiesInterface::~ExtraActivitiesInterface() { } void ExtraActivitiesInterface::setIsPrivate(const QString &activity, bool isPrivate, QJSValue callback) { auto result = d->features->SetValue( QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/") + activity, QDBusVariant(isPrivate)); auto *watcher = new QDBusPendingCallWatcher(result, this); QObject::connect( watcher, &QDBusPendingCallWatcher::finished, this, [callback] (QDBusPendingCallWatcher* watcher) mutable { callback.call(); watcher->deleteLater(); } ); } void ExtraActivitiesInterface::getIsPrivate(const QString &activity, QJSValue callback) { auto result = d->features->GetValue( QStringLiteral("org.kde.ActivityManager.Resources.Scoring/isOTR/") + activity); auto *watcher = new QDBusPendingCallWatcher(result, this); QObject::connect( watcher, &QDBusPendingCallWatcher::finished, this, [callback,result] (QDBusPendingCallWatcher* watcher) mutable { QDBusPendingReply reply = *watcher; callback.call({reply.value().variant().toBool()}); watcher->deleteLater(); } ); } void ExtraActivitiesInterface::setShortcut(const QString &activity, const QKeySequence &keySequence) { auto action = d->actionForActivity(activity); KGlobalAccel::self()->setShortcut(action, { keySequence }, KGlobalAccel::NoAutoloading); } QKeySequence ExtraActivitiesInterface::shortcut(const QString &activity) { auto action = d->actionForActivity(activity); const auto shortcuts = KGlobalAccel::self()->shortcut(action); return (shortcuts.isEmpty()) ? QKeySequence() : shortcuts.first(); } diff --git a/kcms/activities/PrivacyTab.cpp b/kcms/activities/PrivacyTab.cpp index 3036d97ec..57725875a 100644 --- a/kcms/activities/PrivacyTab.cpp +++ b/kcms/activities/PrivacyTab.cpp @@ -1,230 +1,228 @@ /* * Copyright (C) 2012 - 2016 by Ivan Cukic * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "PrivacyTab.h" +#include "kactivitymanagerd_settings.h" +#include "kactivitymanagerd_plugins_settings.h" #include #include #include #include #include #include #include #include #include #include "ui_PrivacyTabBase.h" #include "BlacklistedApplicationsModel.h" -#include "definitions.h" #include #include "kactivities-kcm-features.h" #include "common/dbus/common.h" #include "utils.h" class PrivacyTab::Private : public Ui::PrivacyTabBase { public: - KSharedConfig::Ptr mainConfig; - KSharedConfig::Ptr pluginConfig; + KActivityManagerdSettings *mainConfig; + KActivityManagerdPluginsSettings *pluginConfig; BlacklistedApplicationsModel *blacklistedApplicationsModel; QObject *viewBlacklistedApplicationsRoot; std::unique_ptr viewBlacklistedApplications; - Private() - : viewBlacklistedApplicationsRoot(nullptr) + Private(QObject *parent) + : mainConfig(new KActivityManagerdSettings(parent)) + , pluginConfig(new KActivityManagerdPluginsSettings(parent)) + , viewBlacklistedApplicationsRoot(nullptr) , viewBlacklistedApplications(nullptr) { } + + ~Private() + { + mainConfig->deleteLater(); + pluginConfig->deleteLater(); + } }; PrivacyTab::PrivacyTab(QWidget *parent) : QWidget(parent) - , d() + , d(this) { d->setupUi(this); - d->mainConfig = KSharedConfig::openConfig(QStringLiteral("kactivitymanagerdrc")); - d->pluginConfig = KSharedConfig::openConfig(QStringLiteral("kactivitymanagerd-pluginsrc")); - // Keep history initialization d->spinKeepHistory->setRange(0, INT_MAX); d->spinKeepHistory->setSpecialValueText(i18nc("unlimited number of months", "Forever")); connect(d->spinKeepHistory, SIGNAL(valueChanged(int)), this, SLOT(spinKeepHistoryValueChanged(int))); spinKeepHistoryValueChanged(0); // Clear recent history button auto menu = new QMenu(this); connect(menu->addAction(i18n("Forget the last hour")), &QAction::triggered, this, &PrivacyTab::forgetLastHour); connect(menu->addAction(i18n("Forget the last two hours")), &QAction::triggered, this, &PrivacyTab::forgetTwoHours); connect(menu->addAction(i18n("Forget a day")), &QAction::triggered, this, &PrivacyTab::forgetDay); connect(menu->addAction(i18n("Forget everything")), &QAction::triggered, this, &PrivacyTab::forgetAll); d->buttonClearRecentHistory->setMenu(menu); // Blacklist applications d->blacklistedApplicationsModel = new BlacklistedApplicationsModel(this); new QGridLayout(d->viewBlacklistedApplicationsContainer); d->viewBlacklistedApplications = createView(d->viewBlacklistedApplicationsContainer); d->viewBlacklistedApplications->rootContext()->setContextProperty( QStringLiteral("applicationModel"), d->blacklistedApplicationsModel); setViewSource(d->viewBlacklistedApplications, QStringLiteral("/qml/privacyTab/BlacklistApplicationView.qml")); // React to changes connect(d->radioRememberAllApplications, &QAbstractButton::toggled, this, &PrivacyTab::changed); connect(d->radioDontRememberApplications, &QAbstractButton::toggled, this, &PrivacyTab::changed); connect(d->spinKeepHistory, SIGNAL(valueChanged(int)), this, SIGNAL(changed())); connect(d->blacklistedApplicationsModel, &BlacklistedApplicationsModel::changed, this, &PrivacyTab::changed); connect(d->radioRememberSpecificApplications, &QAbstractButton::toggled, d->blacklistedApplicationsModel, &BlacklistedApplicationsModel::setEnabled); connect(d->radioRememberSpecificApplications, &QAbstractButton::toggled, d->viewBlacklistedApplicationsContainer, &QWidget::setEnabled); connect(d->radioRememberSpecificApplications, &QAbstractButton::toggled, d->checkBlacklistAllNotOnList, &QWidget::setEnabled); + connect(d->checkBlacklistAllNotOnList, &QAbstractButton::toggled, this, &PrivacyTab::changed); + defaults(); d->checkBlacklistAllNotOnList->setEnabled(false); d->blacklistedApplicationsModel->setEnabled(false); d->viewBlacklistedApplicationsContainer->setEnabled(false); d->messageWidget->setVisible(false); } PrivacyTab::~PrivacyTab() { } void PrivacyTab::defaults() { - d->radioRememberAllApplications->click(); - d->spinKeepHistory->setValue(0); d->blacklistedApplicationsModel->defaults(); + + d->radioRememberAllApplications->click(); + d->spinKeepHistory->setValue(d->pluginConfig->defaultKeepHistoryForValue()); + d->checkBlacklistAllNotOnList->setChecked(d->pluginConfig->defaultBlockedByDefaultValue()); } void PrivacyTab::load() { d->blacklistedApplicationsModel->load(); - const auto statisticsConfig - = d->pluginConfig->group(SQLITE_PLUGIN_CONFIG_KEY); - - const auto whatToRemember = static_cast(statisticsConfig.readEntry( - "what-to-remember", static_cast(AllApplications))); + const auto whatToRemember = static_cast(d->pluginConfig->whatToRemember()); d->radioRememberAllApplications->setChecked(whatToRemember == AllApplications); d->radioRememberSpecificApplications->setChecked(whatToRemember == SpecificApplications); d->radioDontRememberApplications->setChecked(whatToRemember == NoApplications); - d->spinKeepHistory->setValue( - statisticsConfig.readEntry("keep-history-for", 0)); - d->checkBlacklistAllNotOnList->setChecked( - statisticsConfig.readEntry("blocked-by-default", false)); + d->spinKeepHistory->setValue(d->pluginConfig->keepHistoryFor()); + d->checkBlacklistAllNotOnList->setChecked(d->pluginConfig->blockedByDefault()); } void PrivacyTab::save() { d->blacklistedApplicationsModel->save(); - auto statisticsConfig = d->pluginConfig->group(SQLITE_PLUGIN_CONFIG_KEY); - const auto whatToRemember = d->radioRememberSpecificApplications->isChecked() ? SpecificApplications : d->radioDontRememberApplications->isChecked() ? NoApplications : /* otherwise */ AllApplications; - statisticsConfig.writeEntry("what-to-remember", static_cast(whatToRemember)); - statisticsConfig.writeEntry("keep-history-for", d->spinKeepHistory->value()); - statisticsConfig.writeEntry("blocked-by-default", d->checkBlacklistAllNotOnList->isChecked()); - - statisticsConfig.sync(); - - auto pluginListConfig = d->mainConfig->group("Plugins"); + d->pluginConfig->setWhatToRemember(static_cast(whatToRemember)); + d->pluginConfig->setKeepHistoryFor(d->spinKeepHistory->value()); + d->pluginConfig->setBlockedByDefault(d->checkBlacklistAllNotOnList->isChecked()); - pluginListConfig.writeEntry("org.kde.ActivityManager.ResourceScoringEnabled", - whatToRemember != NoApplications); + d->pluginConfig->save(); - pluginListConfig.sync(); + d->mainConfig->setResourceScoringEnabled(whatToRemember != NoApplications); + d->mainConfig->save(); } void PrivacyTab::forget(int count, const QString &what) { KAMD_DBUS_DECL_INTERFACE(rankingsservice, Resources/Scoring, ResourcesScoring); rankingsservice.asyncCall(QStringLiteral("DeleteRecentStats"), QString(), count, what); d->messageWidget->animatedShow(); } void PrivacyTab::forgetLastHour() { forget(1, QStringLiteral("h")); } void PrivacyTab::forgetTwoHours() { forget(2, QStringLiteral("h")); } void PrivacyTab::forgetDay() { forget(1, QStringLiteral("d")); } void PrivacyTab::forgetAll() { forget(0, QStringLiteral("everything")); } void PrivacyTab::spinKeepHistoryValueChanged(int value) { static auto months = ki18ncp("unit of time. months to keep the history", " month", " months"); if (value) { d->spinKeepHistory->setPrefix( i18nc("for in 'keep history for 5 months'", "For ")); d->spinKeepHistory->setSuffix(months.subs(value).toString()); } } diff --git a/kcms/activities/SwitchingTab.cpp b/kcms/activities/SwitchingTab.cpp index e12edb00b..36733880e 100644 --- a/kcms/activities/SwitchingTab.cpp +++ b/kcms/activities/SwitchingTab.cpp @@ -1,129 +1,121 @@ /* * Copyright (C) 2012 - 2016 by Ivan Cukic * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "SwitchingTab.h" +#include "kactivitymanagerd_settings.h" #include #include #include #include #include "ui_SwitchingTabBase.h" #include #include class SwitchingTab::Private : public Ui::SwitchingTabBase { public: - KSharedConfig::Ptr mainConfig; + KActivityManagerdSettings mainConfig; KActionCollection *mainActionCollection; KActivities::Consumer activities; void createAction(const QString &actionName, const QString &actionText, const QList &sequence) { auto action = mainActionCollection->addAction(actionName); action->setProperty("isConfigurationAction", true); action->setText(actionText); KGlobalAccel::self()->setShortcut(action, sequence); } Private() : mainActionCollection(nullptr) { } }; SwitchingTab::SwitchingTab(QWidget *parent) : QWidget(parent) , d() { d->setupUi(this); - d->mainConfig = KSharedConfig::openConfig(QStringLiteral("kactivitymanagerdrc")); - // Shortcut config. The shortcut belongs to the component "plasmashell"! d->mainActionCollection = new KActionCollection(this, QStringLiteral("plasmashell")); d->mainActionCollection->setComponentDisplayName(i18n("Activity switching")); d->mainActionCollection->setConfigGlobal(true); d->createAction(QStringLiteral("next activity"), i18nc("@action", "Walk through activities"), { Qt::META + Qt::Key_Tab }); d->createAction(QStringLiteral("previous activity"), i18nc("@action", "Walk through activities (Reverse)"), { Qt::META + Qt::SHIFT + Qt::Key_Tab } ); d->scActivities->setActionTypes(KShortcutsEditor::GlobalAction); d->scActivities->addCollection(d->mainActionCollection); connect(d->scActivities, &KShortcutsEditor::keyChange, this, [this] { changed(); }); connect(d->checkRememberVirtualDesktop, &QAbstractButton::toggled, this, &SwitchingTab::changed); defaults(); } SwitchingTab::~SwitchingTab() { } void SwitchingTab::shortcutChanged(const QKeySequence &sequence) { QString actionName = sender() ? sender()->property("shortcutAction").toString() : QString(); if (actionName.isEmpty()) return; auto action = d->mainActionCollection->action(actionName); KGlobalAccel::self()->setShortcut(action, { sequence }, KGlobalAccel::NoAutoloading); d->mainActionCollection->writeSettings(); emit changed(); } void SwitchingTab::defaults() { d->checkRememberVirtualDesktop->setChecked(false); } void SwitchingTab::load() { - auto pluginListConfig = d->mainConfig->group("Plugins"); - d->checkRememberVirtualDesktop->setChecked(pluginListConfig.readEntry( - "org.kde.ActivityManager.VirtualDesktopSwitchEnabled", false)); + d->checkRememberVirtualDesktop->setChecked(d->mainConfig.virtualDesktopSwitchEnabled()); } void SwitchingTab::save() { - auto pluginListConfig = d->mainConfig->group("Plugins"); - - pluginListConfig.writeEntry( - "org.kde.ActivityManager.VirtualDesktopSwitchEnabled", - d->checkRememberVirtualDesktop->isChecked()); - - pluginListConfig.sync(); + d->mainConfig.setVirtualDesktopSwitchEnabled(d->checkRememberVirtualDesktop->isChecked()); + d->mainConfig.save(); } diff --git a/kcms/activities/kactivitymanagerd_plugins_settings.kcfg b/kcms/activities/kactivitymanagerd_plugins_settings.kcfg new file mode 100644 index 000000000..4b81d80f3 --- /dev/null +++ b/kcms/activities/kactivitymanagerd_plugins_settings.kcfg @@ -0,0 +1,21 @@ + + + + + + + + 0 + + + false + + + + 0 + + + diff --git a/kcms/activities/kactivitymanagerd_plugins_settings.kcfgc b/kcms/activities/kactivitymanagerd_plugins_settings.kcfgc new file mode 100644 index 000000000..1e6fab74b --- /dev/null +++ b/kcms/activities/kactivitymanagerd_plugins_settings.kcfgc @@ -0,0 +1,6 @@ +File=kactivitymanagerd_plugins_settings.kcfg +ClassName=KActivityManagerdPluginsSettings +Mutators=true +DefaultValueGetters=true +ParentInConstructor=true +GlobalEnums=true diff --git a/kcms/activities/kactivitymanagerd_settings.kcfg b/kcms/activities/kactivitymanagerd_settings.kcfg new file mode 100644 index 000000000..2e64fa72c --- /dev/null +++ b/kcms/activities/kactivitymanagerd_settings.kcfg @@ -0,0 +1,16 @@ + + + + + + + false + + + false + + + diff --git a/kcms/activities/kactivitymanagerd_settings.kcfgc b/kcms/activities/kactivitymanagerd_settings.kcfgc new file mode 100644 index 000000000..6ce81dc18 --- /dev/null +++ b/kcms/activities/kactivitymanagerd_settings.kcfgc @@ -0,0 +1,5 @@ +File=kactivitymanagerd_settings.kcfg +ClassName=KActivityManagerdSettings +Mutators=true +DefaultValueGetters=true +ParentInConstructor=true