diff --git a/app/qml/PluginInfoPage.qml b/app/qml/PluginInfoPage.qml index c9607825e..a571c7aa4 100644 --- a/app/qml/PluginInfoPage.qml +++ b/app/qml/PluginInfoPage.qml @@ -22,27 +22,23 @@ import QtQuick 2.2 import QtQuick.Controls 2.2 import org.kde.kirigami 2.0 as Kirigami -Kirigami.ScrollablePage +Kirigami.Page { id: root property string configFile property string device - Loader { - id: loader + actions.main: loader.item.action + Loader { + anchors.fill: parent + id: loader Component.onCompleted: { setSource(configFile, { device: root.device }) } } - - actions.main: Kirigami.Action { - icon.name: "dialog-ok" - text: i18n("Apply") - onTriggered: loader.item.apply() - } } diff --git a/core/kdeconnectpluginconfig.cpp b/core/kdeconnectpluginconfig.cpp index fd97de0d4..953d81d83 100644 --- a/core/kdeconnectpluginconfig.cpp +++ b/core/kdeconnectpluginconfig.cpp @@ -59,14 +59,44 @@ KdeConnectPluginConfig::~KdeConnectPluginConfig() delete d->m_config; } -QVariant KdeConnectPluginConfig::get(const QString& key, const QVariant& defaultValue) +QString KdeConnectPluginConfig::getString(const QString& key, const QString& defaultValue) { if (!d->m_config) { loadConfig(); } d->m_config->sync(); - return d->m_config->value(key, defaultValue); + return d->m_config->value(key, defaultValue).toString(); +} + +bool KdeConnectPluginConfig::getBool(const QString& key, const bool defaultValue) +{ + if (!d->m_config) { + loadConfig(); + } + + d->m_config->sync(); + return d->m_config->value(key, defaultValue).toBool(); +} + +int KdeConnectPluginConfig::getInt(const QString& key, const int defaultValue) +{ + if (!d->m_config) { + loadConfig(); + } + + d->m_config->sync(); + return d->m_config->value(key, defaultValue).toInt(); +} + +QByteArray KdeConnectPluginConfig::getByteArray(const QString& key, const QByteArray defaultValue) +{ + if (!d->m_config) { + loadConfig(); + } + + d->m_config->sync(); + return d->m_config->value(key, defaultValue).toByteArray(); } QVariantList KdeConnectPluginConfig::getList(const QString& key, diff --git a/core/kdeconnectpluginconfig.h b/core/kdeconnectpluginconfig.h index a04d13faf..767e4a1c1 100644 --- a/core/kdeconnectpluginconfig.h +++ b/core/kdeconnectpluginconfig.h @@ -57,14 +57,10 @@ public: /** * Read a key-value pair from this config object */ - Q_SCRIPTABLE QVariant get(const QString& key, const QVariant& defaultValue); - - /** - * Convenience method that will convert the QVariant to whatever type for you - */ - template T get(const QString& key, const T& defaultValue = {}) { - return get(key, QVariant(defaultValue)).template value(); //Important note: Awesome template syntax is awesome - } + Q_SCRIPTABLE QString getString(const QString& key, const QString& defaultValue); + Q_SCRIPTABLE bool getBool(const QString& key, const bool defaultValue); + Q_SCRIPTABLE int getInt(const QString& key, const int defaultValue); + Q_SCRIPTABLE QByteArray getByteArray(const QString& key, const QByteArray defaultValue); QVariantList getList(const QString& key, const QVariantList& defaultValue = {}); diff --git a/declarativeplugin/kdeconnectdeclarativeplugin.cpp b/declarativeplugin/kdeconnectdeclarativeplugin.cpp index 2e5e38bd2..780609a7d 100644 --- a/declarativeplugin/kdeconnectdeclarativeplugin.cpp +++ b/declarativeplugin/kdeconnectdeclarativeplugin.cpp @@ -35,6 +35,7 @@ #include #include #include "core/kdeconnectpluginconfig.h" +#include "interfaces/commandsmodel.h" QObject* createDeviceDbusInterface(const QVariant& deviceId) { @@ -113,6 +114,7 @@ void KdeConnectDeclarativePlugin::registerTypes(const char* uri) qmlRegisterType(uri, 1, 0, "RemoteSinksModel"); qmlRegisterType(uri, 1, 0, "PluginModel"); qmlRegisterType(uri, 1, 0, "KdeConnectPluginConfig"); + qmlRegisterType(uri, 1, 0, "CommandsModel"); qmlRegisterUncreatableType(uri, 1, 0, "MprisDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); qmlRegisterUncreatableType(uri, 1, 0, "LockDeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); qmlRegisterUncreatableType(uri, 1, 0, "FindMyPhoneDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); diff --git a/interfaces/CMakeLists.txt b/interfaces/CMakeLists.txt index c4cf9543e..02c70c979 100644 --- a/interfaces/CMakeLists.txt +++ b/interfaces/CMakeLists.txt @@ -21,6 +21,7 @@ set(libkdeconnect_SRC remotecommandsmodel.cpp remotesinksmodel.cpp pluginmodel.cpp + commandsmodel.cpp # modeltest.cpp ) @@ -71,6 +72,7 @@ LINK_PUBLIC Qt5::DBus KF5::Service LINK_PRIVATE + kdeconnectcore KF5::ConfigCore KF5::I18n KF5::CoreAddons diff --git a/interfaces/commandsmodel.cpp b/interfaces/commandsmodel.cpp new file mode 100644 index 000000000..3b14747c0 --- /dev/null +++ b/interfaces/commandsmodel.cpp @@ -0,0 +1,157 @@ +/** + * Copyright 2019 Nicolas Fella + * + * 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 "commandsmodel.h" + +#include +#include +#include +#include + +#include + +CommandsModel::CommandsModel(QObject* parent) + : QAbstractListModel(parent) + , m_config() +{ + + m_config.setPluginName("kdeconnect_runcommand"); + connect(this, &QAbstractItemModel::rowsInserted, + this, &CommandsModel::rowsChanged); + connect(this, &QAbstractItemModel::rowsRemoved, + this, &CommandsModel::rowsChanged); +} + +QHash CommandsModel::roleNames() const +{ + //Role names for QML + QHash names = QAbstractItemModel::roleNames(); + names.insert(KeyRole, "key"); + names.insert(NameRole, "name"); + names.insert(CommandRole, "command"); + return names; +} + +CommandsModel::~CommandsModel() +{ +} + +QString CommandsModel::deviceId() const +{ + return m_deviceId; +} + +void CommandsModel::setDeviceId(const QString& deviceId) +{ + m_deviceId = deviceId; + m_config.setDeviceId(deviceId); + + refreshCommandList(); + + Q_EMIT deviceIdChanged(deviceId); +} + +void CommandsModel::refreshCommandList() +{ + const auto cmds = QJsonDocument::fromJson(m_config.getByteArray("commands", QByteArray())).object(); + + beginResetModel(); + m_commandList.clear(); + + for (auto it = cmds.constBegin(), itEnd = cmds.constEnd(); it!=itEnd; ++it) { + const QJsonObject cont = it->toObject(); + CommandEntry command; + command.key = it.key(); + command.name = cont.value(QStringLiteral("name")).toString(); + command.command = cont.value(QStringLiteral("command")).toString(); + m_commandList.append(command); + } + + endResetModel(); +} + +QVariant CommandsModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid() + || index.row() < 0 + || index.row() >= m_commandList.count()) + { + return QVariant(); + } + + CommandEntry command = m_commandList[index.row()]; + + switch (role) { + case KeyRole: + return command.key; + case NameRole: + return command.name; + case CommandRole: + return command.command; + default: + return QVariant(); + } +} + +int CommandsModel::rowCount(const QModelIndex& parent) const +{ + if (parent.isValid()) { + //Return size 0 if we are a child because this is not a tree + return 0; + } + + return m_commandList.count(); +} + +void CommandsModel::removeCommand(int index) +{ + beginRemoveRows(QModelIndex(), index, index); + m_commandList.remove(index); + endRemoveRows(); + saveCommands(); +} + +void CommandsModel::saveCommands() +{ + QJsonObject jsonConfig; + for (const CommandEntry &command : m_commandList) { + QJsonObject entry; + entry[QStringLiteral("name")] = command.name; + entry[QStringLiteral("command")] = command.command; + jsonConfig[command.key] = entry; + } + QJsonDocument document; + document.setObject(jsonConfig); + m_config.set(QStringLiteral("commands"), document.toJson(QJsonDocument::Compact)); +} + +void CommandsModel::addCommand(const QString& name, const QString& command) +{ + CommandEntry entry; + QString key = QUuid::createUuid().toString(); + DbusHelper::filterNonExportableCharacters(key); + entry.key = key; + entry.name = name; + entry.command = command; + beginInsertRows(QModelIndex(), m_commandList.size(), m_commandList.size()); + m_commandList.append(entry); + endInsertRows(); + saveCommands(); +} diff --git a/interfaces/commandsmodel.h b/interfaces/commandsmodel.h new file mode 100644 index 000000000..53532894b --- /dev/null +++ b/interfaces/commandsmodel.h @@ -0,0 +1,77 @@ +/** + * Copyright 2019 Nicolas Fella + * + * 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 . + */ + +#ifndef COMMANDSMODEL_H +#define COMMANDSMODEL_H + +#include +#include "interfaces/kdeconnectinterfaces_export.h" +#include "core/kdeconnectpluginconfig.h" + +struct CommandEntry { + QString key; + QString name; + QString command; +}; + +class KDECONNECTINTERFACES_EXPORT CommandsModel + : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(QString deviceId READ deviceId WRITE setDeviceId NOTIFY deviceIdChanged) + +public: + enum ModelRoles { + KeyRole, + NameRole, + CommandRole + }; + + explicit CommandsModel(QObject* parent = nullptr); + ~CommandsModel() override; + + QString deviceId() const; + void setDeviceId(const QString& deviceId); + + QVariant data(const QModelIndex& index, int role) const override; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + + QHash roleNames() const override; + + Q_SCRIPTABLE void removeCommand(int index); + Q_SCRIPTABLE void addCommand(const QString& name, const QString& command); + +private Q_SLOTS: + void refreshCommandList(); + +Q_SIGNALS: + void deviceIdChanged(const QString& value); + void rowsChanged(); + +private: + void saveCommands(); + + QVector m_commandList; + QString m_deviceId; + KdeConnectPluginConfig m_config; +}; + +#endif // DEVICESMODEL_H + diff --git a/plugins/findthisdevice/findthisdevice_config.cpp b/plugins/findthisdevice/findthisdevice_config.cpp index 601ca23b6..fc4c8d2a4 100644 --- a/plugins/findthisdevice/findthisdevice_config.cpp +++ b/plugins/findthisdevice/findthisdevice_config.cpp @@ -72,7 +72,7 @@ void FindThisDeviceConfig::load() { KCModule::load(); - const QString ringTone = config()->get(QStringLiteral("ringtone"), defaultSound()); + const QString ringTone = config()->getString(QStringLiteral("ringtone"), defaultSound()); m_ui->soundFileRequester->setText(ringTone); Q_EMIT changed(false); diff --git a/plugins/findthisdevice/findthisdeviceplugin.cpp b/plugins/findthisdevice/findthisdeviceplugin.cpp index f6aeaa3a9..2cc740df1 100644 --- a/plugins/findthisdevice/findthisdeviceplugin.cpp +++ b/plugins/findthisdevice/findthisdeviceplugin.cpp @@ -51,7 +51,7 @@ bool FindThisDevicePlugin::receivePacket(const NetworkPacket& np) { Q_UNUSED(np); - const QString soundFilename = config()->get(QStringLiteral("ringtone"), defaultSound()); + const QString soundFilename = config()->getString(QStringLiteral("ringtone"), defaultSound()); QUrl soundURL; #ifdef Q_OS_WIN diff --git a/plugins/findthisdevice/kdeconnect_findthisdevice_config.qml b/plugins/findthisdevice/kdeconnect_findthisdevice_config.qml index a5fde6f5d..e2d1b82d9 100644 --- a/plugins/findthisdevice/kdeconnect_findthisdevice_config.qml +++ b/plugins/findthisdevice/kdeconnect_findthisdevice_config.qml @@ -9,8 +9,10 @@ Kirigami.FormLayout { property string device - function apply() { - config.set("ringtone", path.text) + property var action: Kirigami.Action { + icon.name: "dialog-ok" + text: i18n("Apply") + onTriggered: config.set("ringtone", path.text) } FileDialog { diff --git a/plugins/pausemusic/kdeconnect_pausemusic_config.qml b/plugins/pausemusic/kdeconnect_pausemusic_config.qml new file mode 100644 index 000000000..e27c2e9e4 --- /dev/null +++ b/plugins/pausemusic/kdeconnect_pausemusic_config.qml @@ -0,0 +1,46 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.1 +import org.kde.kirigami 2.5 as Kirigami +import org.kde.kdeconnect 1.0 + +Kirigami.FormLayout { + + property string device + + KdeConnectPluginConfig { + id: config + deviceId: device + pluginName: "kdeconnect_pausemusic" + } + + Component.onCompleted: { + talking.checked = config.get("conditionTalking", false) + mute.checked = config.get("actionMute", false) + pause.checked = config.get("actionPause", true) + } + + RadioButton { + text: i18n("Pause as soon as phone rings") + checked: !talking.checked + } + + RadioButton { + id: talking + onCheckedChanged: config.set("conditionTalking", checked) + text: i18n("Pause only while talking") + } + + CheckBox { + id: pause + text: i18n("Pause media players") + onClicked: config.set("actionPause", checked) + } + + CheckBox { + id: mute + text: i18n("Mute system sound") + onClicked: config.set("actionMute", checked) + } + +} diff --git a/plugins/pausemusic/pausemusic_config.cpp b/plugins/pausemusic/pausemusic_config.cpp index fde7a3ba3..6a86968b7 100644 --- a/plugins/pausemusic/pausemusic_config.cpp +++ b/plugins/pausemusic/pausemusic_config.cpp @@ -55,12 +55,12 @@ void PauseMusicConfig::defaults() void PauseMusicConfig::load() { KCModule::load(); - bool talking = config()->get(QStringLiteral("conditionTalking"), false); + bool talking = config()->getBool(QStringLiteral("conditionTalking"), false); m_ui->rad_talking->setChecked(talking); m_ui->rad_ringing->setChecked(!talking); - bool pause = config()->get(QStringLiteral("actionPause"), true); - bool mute = config()->get(QStringLiteral("actionMute"), false); + bool pause = config()->getBool(QStringLiteral("actionPause"), true); + bool mute = config()->getBool(QStringLiteral("actionMute"), false); m_ui->check_pause->setChecked(pause); m_ui->check_mute->setChecked(mute); diff --git a/plugins/pausemusic/pausemusicplugin.cpp b/plugins/pausemusic/pausemusicplugin.cpp index 0b365fb6d..975686596 100644 --- a/plugins/pausemusic/pausemusicplugin.cpp +++ b/plugins/pausemusic/pausemusicplugin.cpp @@ -44,7 +44,7 @@ PauseMusicPlugin::PauseMusicPlugin(QObject* parent, const QVariantList& args) bool PauseMusicPlugin::receivePacket(const NetworkPacket& np) { - bool pauseOnlyWhenTalking = config()->get(QStringLiteral("conditionTalking"), false); + bool pauseOnlyWhenTalking = config()->getBool(QStringLiteral("conditionTalking"), false); if (pauseOnlyWhenTalking) { if (np.get(QStringLiteral("event")) != QLatin1String("talking")) { @@ -58,8 +58,8 @@ bool PauseMusicPlugin::receivePacket(const NetworkPacket& np) bool pauseConditionFulfilled = !np.get(QStringLiteral("isCancel")); - bool pause = config()->get(QStringLiteral("actionPause"), true); - bool mute = config()->get(QStringLiteral("actionMute"), false); + bool pause = config()->getBool(QStringLiteral("actionPause"), true); + bool mute = config()->getBool(QStringLiteral("actionMute"), false); if (pauseConditionFulfilled) { diff --git a/plugins/runcommand/kdeconnect_runcommand_config.qml b/plugins/runcommand/kdeconnect_runcommand_config.qml new file mode 100644 index 000000000..50b60a7bf --- /dev/null +++ b/plugins/runcommand/kdeconnect_runcommand_config.qml @@ -0,0 +1,106 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.5 +import org.kde.kirigami 2.4 as Kirigami +import QtQuick.Dialogs 1.2 +import org.kde.kdeconnect 1.0 + +ListView { + + Component.onCompleted: { + root.leftPadding = 0 + root.rightPadding = 0 + root.topPadding = 0 + root.bottomPadding = 0 + } + + property string device + + property var action: Kirigami.Action { + icon.name: "list-add" + text: i18n("Add command") + onTriggered: addDialog.open() + } + + model: CommandsModel { + id: commandModel + deviceId: device + } + + delegate: Kirigami.SwipeListItem { + width: parent.width + enabled: true + + Label { + text: i18n("%1
%2", name, command) + } + + actions: [ + Kirigami.Action { + icon.name: "delete" + onTriggered: commandModel.removeCommand(index) + } + ] + } + + Dialog { + id: addDialog + title: "Add command" + + standardButtons: StandardButton.Save | StandardButton.Cancel + + Kirigami.FormLayout { + TextField { + id: nameField + Kirigami.FormData.label: i18n("Name:") + } + TextField { + id: commandField + Kirigami.FormData.label: i18n("Command:") + } + + ComboBox { + Kirigami.FormData.label: i18n("Sample commands:") + textRole: "name" + model: ListModel { + id: sampleCommands + ListElement { + name: "Sample command" + command: "" + } + ListElement { + name: "Suspend" + command: "systemctl suspend" + } + ListElement { + name: "Maximum Brightness" + command: "qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.setBrightness `qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/BrightnessControl org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessMax`" + } + ListElement { + name: "Lock Screen" + command: "loginctl lock-session" + } + ListElement { + name: "Unlock Screen" + command: "loginctl unlock-session" + } + ListElement { + name: "Close All Vaults" + command: "qdbus org.kde.kded5 /modules/plasmavault closeAllVaults" + } + ListElement { + name: "Forcefully Close All Vaults" + command: "qdbus org.kde.kded5 /modules/plasmavault forceCloseAllVaults" + } + } + onActivated: { + if (index > 0) { + nameField.text = sampleCommands.get(index).name + commandField.text = sampleCommands.get(index).command + } + } + } + } + + onAccepted: commandModel.addCommand(nameField.text, commandField.text) + } +} diff --git a/plugins/runcommand/runcommand_config.cpp b/plugins/runcommand/runcommand_config.cpp index b8f904f70..233fc8a07 100644 --- a/plugins/runcommand/runcommand_config.cpp +++ b/plugins/runcommand/runcommand_config.cpp @@ -93,7 +93,7 @@ void RunCommandConfig::load() { KCModule::load(); - QJsonDocument jsonDocument = QJsonDocument::fromJson(config()->get(QStringLiteral("commands"), "{}")); + QJsonDocument jsonDocument = QJsonDocument::fromJson(config()->getByteArray(QStringLiteral("commands"), "{}")); QJsonObject jsonConfig = jsonDocument.object(); const QStringList keys = jsonConfig.keys(); for (const QString& key : keys) { diff --git a/plugins/runcommand/runcommandplugin.cpp b/plugins/runcommand/runcommandplugin.cpp index 941fdf611..255495c73 100644 --- a/plugins/runcommand/runcommandplugin.cpp +++ b/plugins/runcommand/runcommandplugin.cpp @@ -68,7 +68,7 @@ bool RunCommandPlugin::receivePacket(const NetworkPacket& np) } if (np.has(QStringLiteral("key"))) { - QJsonDocument commandsDocument = QJsonDocument::fromJson(config()->get(QStringLiteral("commands"), "{}")); + QJsonDocument commandsDocument = QJsonDocument::fromJson(config()->getByteArray(QStringLiteral("commands"), "{}")); QJsonObject commands = commandsDocument.object(); QString key = np.get(QStringLiteral("key")); QJsonValue value = commands[key]; @@ -94,7 +94,7 @@ void RunCommandPlugin::connected() void RunCommandPlugin::sendConfig() { - QString commands = config()->get(QStringLiteral("commands"),QStringLiteral("{}")); + QString commands = config()->getString(QStringLiteral("commands"),QStringLiteral("{}")); NetworkPacket np(PACKET_TYPE_RUNCOMMAND, {{"commandList", commands}}); #if KCMUTILS_VERSION >= QT_VERSION_CHECK(5, 45, 0) diff --git a/plugins/sendnotifications/kdeconnect_sendnotifications_config.qml b/plugins/sendnotifications/kdeconnect_sendnotifications_config.qml new file mode 100644 index 000000000..a52fbe932 --- /dev/null +++ b/plugins/sendnotifications/kdeconnect_sendnotifications_config.qml @@ -0,0 +1,50 @@ +import QtQuick 2.2 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.1 +import org.kde.kirigami 2.5 as Kirigami +import org.kde.kdeconnect 1.0 + +Kirigami.FormLayout { + + property string device + + KdeConnectPluginConfig { + id: config + deviceId: device + pluginName: "kdeconnect_sendnotifications" + } + + Component.onCompleted: { + persistent.checked = config.getBool("generalPersistent", false) + includeBody.checked = config.getBool("generalIncludeBody", true) + includeIcon.checked = config.getBool("generalSynchronizeIcons", true) + urgency.value = config.getInt("generalUrgency", 0) + } + + CheckBox { + id: persistent + text: i18n("Persistent notifications only") + onClicked: config.set("generalPersistent", checked) + } + + CheckBox { + id: includeBody + text: i18n("Include body") + onClicked: config.set("generalIncludeBody", checked) + } + + CheckBox { + id: includeIcon + text: i18n("Include icon") + onClicked: config.set("generalSynchronizeIcons", checked) + } + + SpinBox { + id: urgency + Kirigami.FormData.label: i18n("Minimum urgency level:") + from: 0 + to: 2 + onValueModified: config.set("generalUrgency", value) + } + +} diff --git a/plugins/sendnotifications/notificationslistener.cpp b/plugins/sendnotifications/notificationslistener.cpp index a12f99ad6..5e626d1db 100644 --- a/plugins/sendnotifications/notificationslistener.cpp +++ b/plugins/sendnotifications/notificationslistener.cpp @@ -217,7 +217,7 @@ uint NotificationsListener::Notify(const QString& appName, uint replacesId, if (!app.active) return 0; - if (timeout > 0 && m_plugin->config()->get(QStringLiteral("generalPersistent"), false)) + if (timeout > 0 && m_plugin->config()->getBool(QStringLiteral("generalPersistent"), false)) return 0; int urgency = -1; @@ -227,11 +227,11 @@ uint NotificationsListener::Notify(const QString& appName, uint replacesId, if (!ok) urgency = -1; } - if (urgency > -1 && urgency < m_plugin->config()->get(QStringLiteral("generalUrgency"), 0)) + if (urgency > -1 && urgency < m_plugin->config()->getInt(QStringLiteral("generalUrgency"), 0)) return 0; QString ticker = summary; - if (!body.isEmpty() && m_plugin->config()->get(QStringLiteral("generalIncludeBody"), true)) + if (!body.isEmpty() && m_plugin->config()->getBool(QStringLiteral("generalIncludeBody"), true)) ticker += QStringLiteral(": ") + body; if (app.blacklistExpression.isValid() && @@ -250,7 +250,7 @@ uint NotificationsListener::Notify(const QString& appName, uint replacesId, // clearability is pointless // sync any icon data? - if (m_plugin->config()->get(QStringLiteral("generalSynchronizeIcons"), true)) { + if (m_plugin->config()->getBool(QStringLiteral("generalSynchronizeIcons"), true)) { QSharedPointer iconSource; // try different image sources according to priorities in notifications- // spec version 1.2: diff --git a/plugins/sendnotifications/sendnotifications_config.cpp b/plugins/sendnotifications/sendnotifications_config.cpp index d6126b5d7..c05903fbd 100644 --- a/plugins/sendnotifications/sendnotifications_config.cpp +++ b/plugins/sendnotifications/sendnotifications_config.cpp @@ -88,13 +88,13 @@ void SendNotificationsConfig::loadApplications() void SendNotificationsConfig::load() { KCModule::load(); - bool persistent = config()->get(QStringLiteral("generalPersistent"), false); + bool persistent = config()->getBool(QStringLiteral("generalPersistent"), false); m_ui->check_persistent->setChecked(persistent); - bool body = config()->get(QStringLiteral("generalIncludeBody"), true); + bool body = config()->getBool(QStringLiteral("generalIncludeBody"), true); m_ui->check_body->setChecked(body); - bool icons = config()->get(QStringLiteral("generalSynchronizeIcons"), true); + bool icons = config()->getBool(QStringLiteral("generalSynchronizeIcons"), true); m_ui->check_icons->setChecked(icons); - int urgency = config()->get(QStringLiteral("generalUrgency"), 0); + int urgency = config()->getInt(QStringLiteral("generalUrgency"), 0); m_ui->spin_urgency->setValue(urgency); loadApplications(); diff --git a/plugins/share/kdeconnect_share_config.qml b/plugins/share/kdeconnect_share_config.qml index 5eb26f005..7e074a714 100644 --- a/plugins/share/kdeconnect_share_config.qml +++ b/plugins/share/kdeconnect_share_config.qml @@ -9,8 +9,10 @@ Kirigami.FormLayout { property string device - function apply() { - config.set("incoming_path", path.text) + property var action: Kirigami.Action { + icon.name: "dialog-ok" + text: i18n("Apply") + onTriggered: config.set("incoming_path", path.text) } FolderDialog { diff --git a/plugins/share/share_config.cpp b/plugins/share/share_config.cpp index a469c80c6..70b142126 100644 --- a/plugins/share/share_config.cpp +++ b/plugins/share/share_config.cpp @@ -59,7 +59,7 @@ void ShareConfig::load() KCModule::load(); const auto standardPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); - m_ui->kurlrequester->setText(config()->get(QStringLiteral("incoming_path"), standardPath)); + m_ui->kurlrequester->setText(config()->getString(QStringLiteral("incoming_path"), standardPath)); Q_EMIT changed(false); } diff --git a/plugins/share/shareplugin.cpp b/plugins/share/shareplugin.cpp index 080e3ca83..a98c786fc 100644 --- a/plugins/share/shareplugin.cpp +++ b/plugins/share/shareplugin.cpp @@ -49,7 +49,7 @@ SharePlugin::SharePlugin(QObject* parent, const QVariantList& args) QUrl SharePlugin::destinationDir() const { const QString defaultDownloadPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); - QUrl dir = QUrl::fromLocalFile(config()->get(QStringLiteral("incoming_path"), defaultDownloadPath)); + QUrl dir = QUrl::fromLocalFile(config()->getString(QStringLiteral("incoming_path"), defaultDownloadPath)); if (dir.path().contains(QLatin1String("%1"))) { dir.setPath(dir.path().arg(device()->name())); diff --git a/tests/testnotificationlistener.cpp b/tests/testnotificationlistener.cpp index 092cf56d7..4078377f6 100644 --- a/tests/testnotificationlistener.cpp +++ b/tests/testnotificationlistener.cpp @@ -204,9 +204,9 @@ void TestNotificationListener::testNotify() plugin->config()->set(QStringLiteral("generalPersistent"), false); plugin->config()->set(QStringLiteral("generalIncludeBody"), true); plugin->config()->set(QStringLiteral("generalUrgency"), 0); - QCOMPARE(plugin->config()->get("generalPersistent"), false); - QCOMPARE(plugin->config()->get("generalIncludeBody"), true); - QCOMPARE(plugin->config()->get("generalUrgency"), false); + QCOMPARE(plugin->config()->getBool("generalPersistent", false), false); + QCOMPARE(plugin->config()->getBool("generalIncludeBody", true), true); + QCOMPARE(plugin->config()->getBool("generalUrgency", false), false); // applications are modified directly: listener->getApplications().clear();