From 90946829bfdfd328b3a8f5dc3af892cd9252b652 Mon Sep 17 00:00:00 2001 From: ivan tkachenko Date: Mon, 1 Jul 2024 03:03:57 +0500 Subject: [PATCH] plasmoid: Basic code cleanup --- .../kdeconnectdeclarativeplugin.cpp | 13 ++ declarativeplugin/qml/DBusProperty.qml | 49 ++++-- declarativeplugin/qml/PluginChecker.qml | 60 +++++-- declarativeplugin/qml/RemoteKeyboard.qml | 90 +++++----- plasmoid/package/contents/ui/Battery.qml | 82 +++++---- plasmoid/package/contents/ui/Clipboard.qml | 22 ++- .../contents/ui/CompactRepresentation.qml | 36 ++-- plasmoid/package/contents/ui/Connectivity.qml | 56 +++--- .../package/contents/ui/DeviceDelegate.qml | 163 +++++++++--------- plasmoid/package/contents/ui/FindMyPhone.qml | 22 ++- .../contents/ui/FullRepresentation.qml | 35 ++-- .../package/contents/ui/RemoteCommands.qml | 17 +- plasmoid/package/contents/ui/SMS.qml | 18 +- plasmoid/package/contents/ui/Sftp.qml | 25 +-- plasmoid/package/contents/ui/Share.qml | 18 +- .../package/contents/ui/VirtualMonitor.qml | 26 +-- plasmoid/package/contents/ui/main.qml | 60 +++---- 17 files changed, 456 insertions(+), 336 deletions(-) diff --git a/declarativeplugin/kdeconnectdeclarativeplugin.cpp b/declarativeplugin/kdeconnectdeclarativeplugin.cpp index b99ab8eae..e07f6624c 100644 --- a/declarativeplugin/kdeconnectdeclarativeplugin.cpp +++ b/declarativeplugin/kdeconnectdeclarativeplugin.cpp @@ -71,6 +71,19 @@ void KdeConnectDeclarativePlugin::registerTypes(const char *uri) "RemoteKeyboardDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); qmlRegisterUncreatableType(uri, 1, 0, "DeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); + qmlRegisterUncreatableType(uri, 1, 0, "BatteryDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); + qmlRegisterUncreatableType(uri, + 1, + 0, + "ConnectivityReportDbusInterface", + QStringLiteral("You're not supposed to instantiate interfaces")); + qmlRegisterUncreatableType(uri, 1, 0, "SftpDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); + qmlRegisterUncreatableType(uri, 1, 0, "SmsDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); + qmlRegisterUncreatableType(uri, + 1, + 0, + "VirtualmonitorDbusInterface", + QStringLiteral("You're not supposed to instantiate interfaces")); qmlRegisterUncreatableType(uri, 1, 0, diff --git a/declarativeplugin/qml/DBusProperty.qml b/declarativeplugin/qml/DBusProperty.qml index beabb5e3d..1ea6fda94 100644 --- a/declarativeplugin/qml/DBusProperty.qml +++ b/declarativeplugin/qml/DBusProperty.qml @@ -1,36 +1,43 @@ /** * SPDX-FileCopyrightText: 2016 Aleix Pol Gonzalez + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQml 2.2 -import org.kde.kdeconnect 1.0 +pragma ComponentBehavior: Bound + +import QtQml + +import org.kde.kdeconnect as KDEConnect QtObject { id: prop - property QtObject object: null - property string read - property string change: read+"Changed" - Component.onCompleted: get(); + property QtObject object + property string read + property string change: read + "Changed" + + Component.onCompleted: { + get(); + } onChangeChanged: { if (object) { - var theSignal = object[change]; - if (theSignal) { - theSignal.connect(valueReceived); + const signal = object[change]; + if (signal) { + signal.connect(valueReceived); } else { - console.warn("couldn't find signal", change, "for", object) + console.warn(`couldn't find signal ${change} for ${object}`); } } } - function valueReceived(val) { - if (!val) { + function valueReceived(value: var): void { + if (!value) { get(); } else { - _value = val; + _value = value; } } @@ -38,18 +45,26 @@ QtObject { property var _value: defaultValue readonly property var value: _value - readonly property var v: DBusAsyncResponse { + readonly property KDEConnect.DBusAsyncResponse __response: KDEConnect.DBusAsyncResponse { id: response + autoDelete: false + onSuccess: result => { prop._value = result; } + onError: message => { - console.warn("failed call", prop.object, prop.read, prop.change, message) + console.warn("failed call", prop.object, prop.read, prop.change, message); } } - function get() { - response.setPendingCall(object[read]()); + function get(): void { + if (object) { + const method = object[read]; + if (method) { + response.setPendingCall(method()); + } + } } } diff --git a/declarativeplugin/qml/PluginChecker.qml b/declarativeplugin/qml/PluginChecker.qml index 632e42334..d16db2500 100644 --- a/declarativeplugin/qml/PluginChecker.qml +++ b/declarativeplugin/qml/PluginChecker.qml @@ -1,47 +1,71 @@ /** * SPDX-FileCopyrightText: 2014 Samoilenko Yuri * SPDX-FileCopyrightText: 2016 David Kahles + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQml 2.2 -import org.kde.kdeconnect 1.0 +pragma ComponentBehavior: Bound + +import QtQml + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: conn.target - property string pluginName: "" - property bool available: false - property string iconName: "" + property KDEConnect.DeviceDbusInterface device + property string pluginName + property bool available + property string iconName readonly property Connections connection: Connections { id: conn - function onPluginsChanged() { + + target: root.device + + function onPluginsChanged(): void { root.pluginsChanged(); } } - Component.onCompleted: pluginsChanged() + Component.onCompleted: { + pluginsChanged(); + } - readonly property var v: DBusAsyncResponse { + readonly property KDEConnect.DBusAsyncResponse __availableResponse: KDEConnect.DBusAsyncResponse { id: availableResponse + autoDelete: false - onSuccess: (result) => { root.available = result; } - onError: () => { root.available = false } + + onSuccess: result => { + root.available = result; + } + + onError: message => { + root.available = false; + } } - function pluginsChanged() { - availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName)) - iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName)) + function pluginsChanged(): void { + if (device) { + availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName)); + iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName)); + } } - readonly property var vv: DBusAsyncResponse { + readonly property KDEConnect.DBusAsyncResponse __iconResponse: KDEConnect.DBusAsyncResponse { id: iconResponse + autoDelete: false - onSuccess: (result) => { root.iconName = result; } - onError: () => { root.iconName = "" } + + onSuccess: result => { + root.iconName = result; + } + + onError: message => { + root.iconName = ""; + } } } diff --git a/declarativeplugin/qml/RemoteKeyboard.qml b/declarativeplugin/qml/RemoteKeyboard.qml index 34eec8b88..737195029 100644 --- a/declarativeplugin/qml/RemoteKeyboard.qml +++ b/declarativeplugin/qml/RemoteKeyboard.qml @@ -1,102 +1,108 @@ /** * SPDX-FileCopyrightText: 2017 Holger Kaelberer + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQuick 2.1 -import org.kde.kdeconnect 1.0 -import QtQuick.Controls 2.4 +pragma ComponentBehavior: Bound -TextField { +import QtQuick +import QtQuick.Controls as QQC2 +import org.kde.kdeconnect as KDEConnect + +QQC2.TextField { id: root - property alias device: checker.device + property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "remotekeyboard" + device: root.device } - property var remoteKeyboard: null + property KDEConnect.RemoteKeyboardDbusInterface remoteKeyboard - readonly property bool remoteState: available ? remoteKeyboard.remoteState : false + readonly property bool remoteState: available && remoteKeyboard ? remoteKeyboard.remoteState : false Connections { - target: remoteKeyboard - function onKeyPressReceived() { + target: root.remoteKeyboard + + function onKeyPressReceived(key: string, specialKey: int, shift: bool, ctrl: bool, alt: bool): void { //console.log("XXX received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + text + " cursorPos=" + cursorPosition); // interpret some special keys: - if (specialKey == 12 || specialKey == 14) // Return/Esc -> clear + if (specialKey === 12 || specialKey === 14) { // Return/Esc -> clear text = ""; - else if (specialKey == 4 // Left - && cursorPosition > 0) + } else if (specialKey === 4 // Left + && cursorPosition > 0) { --cursorPosition; - else if (specialKey == 6 // Right - && cursorPosition < text.length) + } else if (specialKey === 6 // Right + && cursorPosition < text.length) { ++cursorPosition; - else if (specialKey == 1) { // Backspace -> delete left - var pos = cursorPosition; + } else if (specialKey === 1) { // Backspace -> delete left + const pos = cursorPosition; if (pos > 0) { - text = text.substring(0, pos-1) - + text.substring(pos, text.length); + text = text.substring(0, pos - 1) + + text.substring(pos, text.length); cursorPosition = pos - 1; } - } else if (specialKey == 13) { // Delete -> delete right - var pos = cursorPosition; + } else if (specialKey === 13) { // Delete -> delete right + const pos = cursorPosition; if (pos < text.length) { - text = text.substring(0, pos) - + text.substring(pos+1, text.length); + text = text.substring(0, pos) + + text.substring(pos + 1, text.length); cursorPosition = pos; // seems to be set to text.length automatically! } - } else if (specialKey == 10) // Home + } else if (specialKey === 10) { // Home cursorPosition = 0; - else if (specialKey == 11) // End + } else if (specialKey == 11) { // End cursorPosition = text.length; - else { + } else { // echo visible keys - var sanitized = ""; - for (var i = 0; i < key.length; i++) { - if (key.charCodeAt(i) > 31) + let sanitized = ""; + for (let i = 0; i < key.length; i++) { + if (key.charCodeAt(i) > 31) { sanitized += key.charAt(i); + } } if (sanitized.length > 0 && !ctrl && !alt) { // insert sanitized at current pos: - var pos = cursorPosition; + const pos = cursorPosition; text = text.substring(0, pos) - + sanitized - + text.substring(pos, text.length); + + sanitized + + text.substring(pos, text.length); cursorPosition = pos + 1; // seems to be set to text.length automatically! } } -// console.log("XXX After received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + text + " cursorPos=" + cursorPosition); + // console.log("XXX After received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + text + " cursorPos=" + cursorPosition); } } - - function sendEvent(event) { + function sendEvent(event: KeyEvent): void { if (remoteKeyboard) { - var transEvent = JSON.parse(JSON.stringify(event)); // transform to anonymous object + const transEvent = JSON.parse(JSON.stringify(event)); // transform to anonymous object remoteKeyboard.sendQKeyEvent(transEvent); event.accepted = true } } - Keys.onPressed: { - if (available) + Keys.onPressed: event => { + if (available) { sendEvent(event); + } event.accepted = true; } onAvailableChanged: { - if (available) { - remoteKeyboard = RemoteKeyboardDbusInterfaceFactory.create(device.id()); - //remoteKeyboard.keyPressReceived.connect(keyPressReceived); + if (available && device !== null) { + remoteKeyboard = KDEConnect.RemoteKeyboardDbusInterfaceFactory.create(device.id()); remoteKeyboard.remoteStateChanged.connect(remoteStateChanged); } else { - remoteKeyboard = null + remoteKeyboard = null; } } } diff --git a/plasmoid/package/contents/ui/Battery.qml b/plasmoid/package/contents/ui/Battery.qml index fe204fe5e..e68ad6080 100644 --- a/plasmoid/package/contents/ui/Battery.qml +++ b/plasmoid/package/contents/ui/Battery.qml @@ -1,62 +1,80 @@ /** * SPDX-FileCopyrightText: 2014 Samoilenko Yuri + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "battery" + device: root.device } - property bool charging: battery ? battery.isCharging : false - property int charge: battery ? battery.charge : -1 - property string displayString: (available && charge > -1) ? ((charging) ? (i18n("%1% charging", charge)) : (i18n("%1%", charge))) : i18n("No info") - property variant battery: null + readonly property bool charging: battery?.isCharging ?? false + readonly property int charge: battery?.charge ?? -1 + + readonly property string displayString: { + if (available && charge > -1) { + if (charging) { + return i18n("%1% charging", charge); + } else { + return i18n("%1%", charge); + } + } else { + return i18n("No info"); + } + } + + property KDEConnect.BatteryDbusInterface battery /** * Suggests an icon name to use for the current battery level */ readonly property string iconName: { - charge < 0 ? - "battery-missing-symbolic" : - charge < 10 ? - charging ? - "battery-empty-charging-symbolic" : - "battery-empty-symbolic" : - charge < 25 ? - charging ? - "battery-caution-charging-symbolic" : - "battery-caution-symbolic" : - charge < 50 ? - charging ? - "battery-low-charging-symbolic" : - "battery-low-symbolic" : - charge < 75 ? - charging ? - "battery-good-charging-symbolic" : - "battery-good-symbolic" : - charging ? - "battery-full-charging-symbolic": - "battery-full-symbolic" + if (charge < 0) { + return "battery-missing-symbolic"; + } else if (charge < 10) { + return charging + ? "battery-empty-charging-symbolic" + : "battery-empty-symbolic"; + } else if (charge < 25) { + return charging + ? "battery-caution-charging-symbolic" + : "battery-caution-symbolic"; + } else if (charge < 50) { + return charging + ? "battery-low-charging-symbolic" + : "battery-low-symbolic"; + } else if (charge < 75) { + return charging + ? "battery-good-charging-symbolic" + : "battery-good-symbolic"; + } else { + return charging + ? "battery-full-charging-symbolic" + : "battery-full-symbolic"; + } } onAvailableChanged: { if (available) { - battery = DeviceBatteryDbusInterfaceFactory.create(device.id()) + battery = KDEConnect.DeviceBatteryDbusInterfaceFactory.create(device.id()); } else { - battery = null + battery = null; } } } diff --git a/plasmoid/package/contents/ui/Clipboard.qml b/plasmoid/package/contents/ui/Clipboard.qml index fb8f4ccad..d7b1b0e10 100644 --- a/plasmoid/package/contents/ui/Clipboard.qml +++ b/plasmoid/package/contents/ui/Clipboard.qml @@ -1,28 +1,32 @@ /** * SPDX-FileCopyrightText: 2021 Yaman Qalieh + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "clipboard" + device: root.device } - property variant clipboard: null + property KDEConnect.ClipboardDbusInterface clipboard - function sendClipboard() { + function sendClipboard(): void { if (clipboard) { clipboard.sendClipboard(); } @@ -30,9 +34,9 @@ QtObject { onAvailableChanged: { if (available) { - clipboard = ClipboardDbusInterfaceFactory.create(device.id()) + clipboard = KDEConnect.ClipboardDbusInterfaceFactory.create(device.id()); } else { - clipboard = null + clipboard = null; } } } diff --git a/plasmoid/package/contents/ui/CompactRepresentation.qml b/plasmoid/package/contents/ui/CompactRepresentation.qml index 762b3380c..4d9b4976f 100644 --- a/plasmoid/package/contents/ui/CompactRepresentation.qml +++ b/plasmoid/package/contents/ui/CompactRepresentation.qml @@ -1,32 +1,44 @@ -/* - SPDX-FileCopyrightText: 2014-2015 Frederic St-Pierre +/** + * SPDX-FileCopyrightText: 2014-2015 Frederic St-Pierre + * SPDX-FileCopyrightText: 2024 ivan tkachenko + * + * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + */ - SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL -*/ +pragma ComponentBehavior: Bound import QtQuick -import QtQuick.Layouts + import org.kde.kirigami as Kirigami +import org.kde.plasma.plasmoid DropArea { - onEntered: { + id: root + + required property PlasmoidItem plasmoidItem + + onEntered: drag => { if (drag.hasUrls) { - root.expanded = true; + root.plasmoidItem.expanded = true; } } MouseArea { - id: kdeConnectMouseArea anchors.fill: parent - onClicked: { - root.expanded = !root.expanded; + property bool wasExpanded: false + + onPressed: mouse => { + wasExpanded = root.plasmoidItem.expanded; + } + + onClicked: mouse => { + root.plasmoidItem.expanded = !root.plasmoidItem.expanded; } } Kirigami.Icon { - id: kdeConnectIcon anchors.fill: parent - source: plasmoid.icon + source: Plasmoid.icon } } diff --git a/plasmoid/package/contents/ui/Connectivity.qml b/plasmoid/package/contents/ui/Connectivity.qml index 9b58eb778..ea24653f2 100644 --- a/plasmoid/package/contents/ui/Connectivity.qml +++ b/plasmoid/package/contents/ui/Connectivity.qml @@ -1,24 +1,27 @@ /** * SPDX-FileCopyrightText: 2021 David Shlemayev + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device - readonly property alias available: checker.available - readonly property bool ready: connectivity + required property KDEConnect.DeviceDbusInterface device - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property alias available: checker.available + + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "connectivity_report" + device: root.device } /** @@ -37,20 +40,22 @@ QtObject { * The parsing from Android values into these strings is handled in the * [ConnectivityReportPlugin.networkTypeToString method](https://invent.kde.org/network/kdeconnect-android/-/blob/master/src/org/kde/kdeconnect/Plugins/ConnectivityReportPlugin/ConnectivityReportPlugin.java#L82) */ - readonly property string networkType: connectivity ? connectivity.cellularNetworkType : i18n("Unknown") + readonly property string networkType: connectivity?.cellularNetworkType ?? i18n("Unknown") /** * Reports a value between 0 and 4 (inclusive) which represents the strength of the cellular connection */ - readonly property int signalStrength: connectivity ? connectivity.cellularNetworkStrength : -1 - property string displayString: { - if (ready) { + readonly property int signalStrength: connectivity?.cellularNetworkStrength ?? -1 + + readonly property string displayString: { + if (connectivity !== null) { return `${networkType} ${signalStrength}/4`; } else { return i18n("No signal"); } } - property variant connectivity: null + + property KDEConnect.ConnectivityReportDbusInterface connectivity /** * Suggests an icon name to use for the current signal level @@ -60,27 +65,27 @@ QtObject { */ readonly property string iconName: { // Firstly, get the name prefix which represents the signal strength - var signalStrengthIconName = - (signalStrength < 0 || !ready) ? + const signalStrengthIconName = + (signalStrength < 0 || connectivity === null) ? // As long as the signal strength is nonsense or the plugin reports as non-ready, // show us as disconnected "network-mobile-off" : - (signalStrength == 0) ? + (signalStrength === 0) ? "network-mobile-0" : - (signalStrength == 1) ? + (signalStrength === 1) ? "network-mobile-20" : - (signalStrength == 2) ? + (signalStrength === 2) ? "network-mobile-60" : - (signalStrength == 3) ? + (signalStrength === 3) ? "network-mobile-80" : - (signalStrength == 4) ? + (signalStrength === 4) ? "network-mobile-100" : // Since all possible values are enumerated above, this default case should never be hit. // However, I need it in order for my ternary syntax to be valid! - "network-mobile-available" + "network-mobile-available"; // If we understand the network type, append to the icon name to show the type - var networkTypeSuffix = + const networkTypeSuffix = (networkType === "5G") ? // No icon for this case! "" : @@ -110,15 +115,16 @@ QtObject { // GSconnect just uses the 2g icon // No icon for this case! "" : - "" // We didn't recognize the network type. Don't append anything. - return signalStrengthIconName + networkTypeSuffix + ""; // We didn't recognize the network type. Don't append anything. + + return signalStrengthIconName + networkTypeSuffix; } onAvailableChanged: { if (available) { - connectivity = DeviceConnectivityReportDbusInterfaceFactory.create(device.id()) + connectivity = KDEConnect.DeviceConnectivityReportDbusInterfaceFactory.create(device.id()); } else { - connectivity = null + connectivity = null; } } } diff --git a/plasmoid/package/contents/ui/DeviceDelegate.qml b/plasmoid/package/contents/ui/DeviceDelegate.qml index 386d944fb..966f1bced 100644 --- a/plasmoid/package/contents/ui/DeviceDelegate.qml +++ b/plasmoid/package/contents/ui/DeviceDelegate.qml @@ -1,24 +1,25 @@ /** * SPDX-FileCopyrightText: 2013 Albert Vaca + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQuick -import QtQuick.Layouts -import org.kde.plasma.core as PlasmaCore -import org.kde.plasma.components as PlasmaComponents -import org.kde.kdeconnect -import QtQuick.Controls -import org.kde.kirigami as Kirigami -import org.kde.plasma.extras as PlasmaExtras -import QtQuick.Dialogs import QtCore +import QtQuick +import QtQuick.Dialogs as QtDialogs +import QtQuick.Layouts -PlasmaComponents.ItemDelegate -{ +import org.kde.kdeconnect as KDEConnect +import org.kde.kirigami as Kirigami +import org.kde.plasma.components as PlasmaComponents +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.extras as PlasmaExtras + +PlasmaComponents.ItemDelegate { id: root - readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId) + + readonly property KDEConnect.DeviceDbusInterface device: KDEConnect.DeviceDbusInterfaceFactory.create(model.deviceId) hoverEnabled: false down: false @@ -35,23 +36,10 @@ PlasmaComponents.ItemDelegate id: fileDropArea anchors.fill: parent - onDropped: { + onDropped: drop => { if (drop.hasUrls) { - - var urls = []; - - for (var v in drop.urls) { - if (drop.urls[v] != null) { - if (urls.indexOf(drop.urls[v].toString()) == -1) { - urls.push(drop.urls[v].toString()); - } - } - } - - var i; - for (i = 0; i < urls.length; i++) { - share.plugin.shareUrl(urls[i]); - } + const urls = new Set(drop.urls.map(url => url.toString())); + urls.forEach(url => share.plugin.shareUrl(url)); } drop.accepted = true; } @@ -68,8 +56,7 @@ PlasmaComponents.ItemDelegate contentItem: ColumnLayout { spacing: Kirigami.Units.smallSpacing - RowLayout - { + RowLayout { width: parent.width spacing: Kirigami.Units.smallSpacing @@ -119,9 +106,10 @@ PlasmaComponents.ItemDelegate } } } - RowLayout - { + + RowLayout { id: connectionInformation + visible: connectivity.available spacing: Kirigami.Units.smallSpacing @@ -147,10 +135,10 @@ PlasmaComponents.ItemDelegate } } - RowLayout - { + RowLayout { id: batteryInformation - visible: (battery.available && battery.charge > -1) + + visible: battery.available && battery.charge > -1 spacing: Kirigami.Units.smallSpacing Kirigami.Icon { @@ -171,6 +159,7 @@ PlasmaComponents.ItemDelegate PlasmaComponents.ToolButton { id: overflowMenu + icon.name: "application-menu" checked: menu.status === PlasmaExtras.Menu.Open @@ -181,35 +170,35 @@ PlasmaComponents.ItemDelegate visualParent: overflowMenu placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup - //Share - PlasmaExtras.MenuItem - { - property FileDialog data: FileDialog { + // Share + PlasmaExtras.MenuItem { + id: shareFile + + readonly property QtDialogs.FileDialog data: QtDialogs.FileDialog { id: fileDialog title: i18n("Please choose a file") currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation) - fileMode: FileDialog.OpenFiles + fileMode: QtDialogs.FileDialog.OpenFiles onAccepted: fileDialog.selectedFiles.forEach(url => share.plugin.shareUrl(url)) } - id: shareFile icon: "document-share" visible: share.available text: i18n("Share file") onClicked: fileDialog.open() } - //Clipboard - PlasmaExtras.MenuItem - { - property Clipboard data: Clipboard { + // Clipboard + PlasmaExtras.MenuItem { + id: sendclipboard + + readonly property Clipboard data: Clipboard { id: clipboard device: root.device } - id: sendclipboard icon: "klipper" - visible: clipboard.available && clipboard.clipboard.isAutoShareDisabled + visible: clipboard.clipboard?.isAutoShareDisabled ?? false text: i18n("Send Clipboard") onClicked: { @@ -218,15 +207,15 @@ PlasmaComponents.ItemDelegate } - //Find my phone - PlasmaExtras.MenuItem - { - property FindMyPhone data: FindMyPhone { + // Find my phone + PlasmaExtras.MenuItem { + id: ring + + readonly property FindMyPhone data: FindMyPhone { id: findmyphone device: root.device } - id: ring icon: "irc-voice" visible: findmyphone.available text: i18n("Ring my phone") @@ -236,15 +225,15 @@ PlasmaComponents.ItemDelegate } } - //SFTP - PlasmaExtras.MenuItem - { - property Sftp data: Sftp { + // SFTP + PlasmaExtras.MenuItem { + id: browse + + readonly property Sftp data: Sftp { id: sftp device: root.device } - id: browse icon: "document-open-folder" visible: sftp.available text: i18n("Browse this device") @@ -254,10 +243,9 @@ PlasmaComponents.ItemDelegate } } - //SMS - PlasmaExtras.MenuItem - { - property SMS data: SMS { + // SMS + PlasmaExtras.MenuItem { + readonly property SMS data: SMS { id: sms device: root.device } @@ -274,7 +262,7 @@ PlasmaComponents.ItemDelegate } } - //RemoteKeyboard + // RemoteKeyboard PlasmaComponents.ItemDelegate { visible: remoteKeyboard.remoteState Layout.fillWidth: true @@ -288,7 +276,7 @@ PlasmaComponents.ItemDelegate text: i18n("Remote Keyboard") } - RemoteKeyboard { + KDEConnect.RemoteKeyboard { id: remoteKeyboard device: root.device Layout.fillWidth: true @@ -296,9 +284,9 @@ PlasmaComponents.ItemDelegate } } - //Notifications + // Notifications PlasmaComponents.ItemDelegate { - visible: notificationsModel.count>0 + visible: notificationsModel.count > 0 enabled: true Layout.fillWidth: true @@ -314,19 +302,23 @@ PlasmaComponents.ItemDelegate visible: notificationsModel.isAnyDimissable; Layout.alignment: Qt.AlignRight icon.name: "edit-clear-history" - ToolTip.text: i18n("Dismiss all notifications") + PlasmaComponents.ToolTip.text: i18n("Dismiss all notifications") onClicked: notificationsModel.dismissAll(); } } } + Repeater { id: notificationsView - model: NotificationsModel { + + model: KDEConnect.NotificationsModel { id: notificationsModel deviceId: root.device.id() } + delegate: PlasmaComponents.ItemDelegate { id: listitem + enabled: true onClicked: checked = !checked Layout.fillWidth: true @@ -349,7 +341,7 @@ PlasmaComponents.ItemDelegate PlasmaComponents.Label { id: notificationLabel - text: appName + ": " + (title.length>0 ? (appName==title?notitext:title+": "+notitext) : model.name) + text: appName + ": " + (title.length > 0 ? (appName == title ? notitext : title + ": " + notitext) : model.name) elide: listitem.checked ? Text.ElideNone : Text.ElideRight maximumLineCount: listitem.checked ? 0 : 1 wrapMode: Text.WordWrap @@ -361,7 +353,7 @@ PlasmaComponents.ItemDelegate visible: repliable enabled: repliable && !replying icon.name: "mail-reply-sender" - ToolTip.text: i18n("Reply") + PlasmaComponents.ToolTip.text: i18n("Reply") onClicked: { replying = true; replyTextField.forceActiveFocus(); } } @@ -371,7 +363,7 @@ PlasmaComponents.ItemDelegate enabled: dismissable Layout.alignment: Qt.AlignRight icon.name: "window-close" - ToolTip.text: i18n("Dismiss") + PlasmaComponents.ToolTip.text: i18n("Dismiss") onClicked: dbusInterface.dismiss(); } } @@ -401,12 +393,12 @@ PlasmaComponents.ItemDelegate placeholderText: i18nc("@info:placeholder", "Reply to %1…", appName) wrapMode: TextEdit.Wrap Layout.fillWidth: true - Keys.onPressed: { - if ((event.key == Qt.Key_Return || event.key == Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) { + Keys.onPressed: event => { + if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) { replySendButton.clicked(); event.accepted = true; } - if (event.key == Qt.Key_Escape) { + if (event.key === Qt.Key_Escape) { replyCancelButton.clicked(); event.accepted = true; } @@ -431,13 +423,13 @@ PlasmaComponents.ItemDelegate } RemoteCommands { - id: rc + id: remoteCommands device: root.device } // Commands RowLayout { - visible: rc.available + visible: remoteCommands.available width: parent.width spacing: Kirigami.Units.smallSpacing @@ -446,25 +438,28 @@ PlasmaComponents.ItemDelegate Layout.fillWidth: true } - PlasmaComponents.Button - { + PlasmaComponents.Button { id: addCommandButton icon.name: "list-add" - ToolTip.text: i18n("Add command") - onClicked: rc.plugin.editCommands() - visible: rc.plugin && rc.plugin.canAddCommand + PlasmaComponents.ToolTip.text: i18n("Add command") + onClicked: remoteCommands.plugin.editCommands() + visible: remoteCommands.plugin?.canAddCommand ?? false } } + Repeater { id: commandsView - visible: rc.available - model: RemoteCommandsModel { + + visible: remoteCommands.available + + model: KDEConnect.RemoteCommandsModel { id: commandsModel - deviceId: rc.device.id() + deviceId: remoteCommands.device.id() } + delegate: PlasmaComponents.ItemDelegate { enabled: true - onClicked: rc.plugin.triggerCommand(key) + onClicked: remoteCommands.plugin?.triggerCommand(key) Layout.fillWidth: true contentItem: PlasmaComponents.Label { diff --git a/plasmoid/package/contents/ui/FindMyPhone.qml b/plasmoid/package/contents/ui/FindMyPhone.qml index 422be4aa7..aaa11f4b9 100644 --- a/plasmoid/package/contents/ui/FindMyPhone.qml +++ b/plasmoid/package/contents/ui/FindMyPhone.qml @@ -1,28 +1,32 @@ /** * SPDX-FileCopyrightText: 2014 Samoilenko Yuri + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "findmyphone" + device: root.device } - property variant findMyPhone: null + property KDEConnect.FindMyPhoneDbusInterface findMyPhone - function ring() { + function ring(): void { if (findMyPhone) { findMyPhone.ring(); } @@ -30,9 +34,9 @@ QtObject { onAvailableChanged: { if (available) { - findMyPhone = FindMyPhoneDbusInterfaceFactory.create(device.id()) + findMyPhone = KDEConnect.FindMyPhoneDbusInterfaceFactory.create(device.id()); } else { - findMyPhone = null + findMyPhone = null; } } } diff --git a/plasmoid/package/contents/ui/FullRepresentation.qml b/plasmoid/package/contents/ui/FullRepresentation.qml index 4ec38c4e4..ef3d73fb9 100644 --- a/plasmoid/package/contents/ui/FullRepresentation.qml +++ b/plasmoid/package/contents/ui/FullRepresentation.qml @@ -1,40 +1,43 @@ /** * SPDX-FileCopyrightText: 2013 Albert Vaca + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ import QtQuick -import QtQuick.Controls -import org.kde.plasma.core as PlasmaCore +import QtQuick.Controls as QQC2 +import QtQuick.Layouts + +import org.kde.config as KConfig +import org.kde.kcmutils as KCMUtils +import org.kde.kdeconnect as KDEConnect +import org.kde.kirigami as Kirigami import org.kde.plasma.components as PlasmaComponents3 import org.kde.plasma.extras as PlasmaExtras -import org.kde.kdeconnect as KdeConnect -import QtQuick.Layouts -import org.kde.kquickcontrolsaddons -import org.kde.kirigami as Kirigami -import org.kde.kcmutils as KCMUtils -import org.kde.config as KConfig PlasmaExtras.Representation { id: kdeconnect + property alias devicesModel: devicesView.model + collapseMarginsHint: true - KdeConnect.DevicesModel { + KDEConnect.DevicesModel { id: allDevicesModel } - KdeConnect.DevicesModel { + + KDEConnect.DevicesModel { id: pairedDevicesModel - displayFilter: KdeConnect.DevicesModel.Paired + displayFilter: KDEConnect.DevicesModel.Paired } PlasmaComponents3.ScrollView { - id: dialogItem anchors.fill: parent contentItem: ListView { id: devicesView + spacing: Kirigami.Units.smallSpacing delegate: DeviceDelegate { @@ -55,16 +58,16 @@ PlasmaExtras.Representation { text: { if (pairedDevicesModel.count >= 0) { - return pairedDevicesModel.count == 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count) - } else if (allDevicesModel.count == 0) { + return pairedDevicesModel.count === 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count) + } else if (allDevicesModel.count === 0) { return i18n("Install KDE Connect on your Android device to integrate it with Plasma!") } } - helpfulAction: Action { + helpfulAction: QQC2.Action { text: i18n("Pair a Device…") icon.name: "list-add" onTriggered: KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect") - enabled: pairedDevicesModel.count == 0 && KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect") + enabled: pairedDevicesModel.count === 0 && KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect") } PlasmaComponents3.Button { diff --git a/plasmoid/package/contents/ui/RemoteCommands.qml b/plasmoid/package/contents/ui/RemoteCommands.qml index e9c388c5a..4eec58306 100644 --- a/plasmoid/package/contents/ui/RemoteCommands.qml +++ b/plasmoid/package/contents/ui/RemoteCommands.qml @@ -1,24 +1,29 @@ /** * SPDX-FileCopyrightText: 2018 Nicolas Fella + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "remotecommands" + device: root.device } - property variant plugin: available ? RemoteCommandsDbusInterfaceFactory.create(device.id()) : null + property KDEConnect.RemoteCommandsDbusInterface plugin: + available ? KDEConnect.RemoteCommandsDbusInterfaceFactory.create(device.id()) : null } diff --git a/plasmoid/package/contents/ui/SMS.qml b/plasmoid/package/contents/ui/SMS.qml index 9d615efe2..39b951fd2 100644 --- a/plasmoid/package/contents/ui/SMS.qml +++ b/plasmoid/package/contents/ui/SMS.qml @@ -1,25 +1,29 @@ /** * SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "sms" + device: root.device } - readonly property variant plugin: available ? SmsDbusInterfaceFactory.create(device.id()) : null + readonly property KDEConnect.SmsDbusInterface plugin: + available ? KDEConnect.SmsDbusInterfaceFactory.create(device.id()) : null } - diff --git a/plasmoid/package/contents/ui/Sftp.qml b/plasmoid/package/contents/ui/Sftp.qml index 0a426fc0a..a032969fb 100644 --- a/plasmoid/package/contents/ui/Sftp.qml +++ b/plasmoid/package/contents/ui/Sftp.qml @@ -1,37 +1,42 @@ /** * SPDX-FileCopyrightText: 2014 Samoilenko Yuri + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "sftp" + device: root.device } - property variant sftp: null + property KDEConnect.SftpDbusInterface sftp - function browse() { - if (sftp) + function browse(): void { + if (sftp) { sftp.startBrowsing(); + } } onAvailableChanged: { if (available) { - sftp = SftpDbusInterfaceFactory.create(device.id()) + sftp = KDEConnect.SftpDbusInterfaceFactory.create(device.id()); } else { - sftp = null + sftp = null; } } } diff --git a/plasmoid/package/contents/ui/Share.qml b/plasmoid/package/contents/ui/Share.qml index 319984865..a55450feb 100644 --- a/plasmoid/package/contents/ui/Share.qml +++ b/plasmoid/package/contents/ui/Share.qml @@ -1,25 +1,29 @@ /** * SPDX-FileCopyrightText: 2018 Nicolas Fella + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect + +import org.kde.kdeconnect as KDEConnect QtObject { - id: root - property alias device: checker.device + required property KDEConnect.DeviceDbusInterface device + readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "share" + device: root.device } - property variant plugin: available ? ShareDbusInterfaceFactory.create(device.id()) : null + property KDEConnect.ShareDbusInterface plugin: + available ? KDEConnect.ShareDbusInterfaceFactory.create(device.id()) : null } - diff --git a/plasmoid/package/contents/ui/VirtualMonitor.qml b/plasmoid/package/contents/ui/VirtualMonitor.qml index 2438214a1..b7b693697 100644 --- a/plasmoid/package/contents/ui/VirtualMonitor.qml +++ b/plasmoid/package/contents/ui/VirtualMonitor.qml @@ -1,23 +1,29 @@ /** - * SPDX-FileCopyrightText: 2021 Aleix Pol i Gonzalez + * SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ -import QtQuick -import org.kde.plasma.core as PlasmaCore -import org.kde.kdeconnect +pragma ComponentBehavior: Bound + +import QtQuick + +import org.kde.kdeconnect as KDEConnect + +QtObject { + id: root + + required property KDEConnect.DeviceDbusInterface device -QtObject -{ - property alias device: checker.device readonly property alias available: checker.available - readonly property PluginChecker pluginChecker: PluginChecker { + readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { id: checker pluginName: "virtualmonitor" + device: root.device } - readonly property QtObject plugin: available ? VirtualmonitorDbusInterfaceFactory.create(device.id()) : null + readonly property KDEConnect.VirtualmonitorDbusInterface plugin: + available ? KDEConnect.VirtualmonitorDbusInterfaceFactory.create(device.id()) : null } - diff --git a/plasmoid/package/contents/ui/main.qml b/plasmoid/package/contents/ui/main.qml index 6aad1e95d..8ac2d87cf 100644 --- a/plasmoid/package/contents/ui/main.qml +++ b/plasmoid/package/contents/ui/main.qml @@ -1,65 +1,61 @@ /** * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez + * SPDX-FileCopyrightText: 2024 ivan tkachenko * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ +pragma ComponentBehavior: Bound + import QtQuick + +import org.kde.config as KConfig +import org.kde.kcmutils as KCMUtils +import org.kde.kdeconnect as KDEConnect +import org.kde.kquickcontrolsaddons as KQuickControlsAddons import org.kde.plasma.core as PlasmaCore import org.kde.plasma.plasmoid -import org.kde.kquickcontrolsaddons -import org.kde.kdeconnect -import org.kde.kcmutils as KCMUtils -import org.kde.config as KConfig -PlasmoidItem -{ +PlasmoidItem { id: root - readonly property bool inPanel: (plasmoid.location == PlasmaCore.Types.TopEdge - || plasmoid.location == PlasmaCore.Types.RightEdge - || plasmoid.location == PlasmaCore.Types.BottomEdge - || plasmoid.location == PlasmaCore.Types.LeftEdge) + readonly property bool inPanel: [ + PlasmaCore.Types.TopEdge, + PlasmaCore.Types.RightEdge, + PlasmaCore.Types.BottomEdge, + PlasmaCore.Types.LeftEdge, + ].includes(Plasmoid.location) - DevicesModel { - id: connectDeviceModel - displayFilter: DevicesModel.Paired | DevicesModel.Reachable + KDEConnect.DevicesModel { + id: connectedDeviceModel + displayFilter: KDEConnect.DevicesModel.Paired | KDEConnect.DevicesModel.Reachable } - DevicesModel { + KDEConnect.DevicesModel { id: pairedDeviceModel - displayFilter: DevicesModel.Paired + displayFilter: KDEConnect.DevicesModel.Paired } - Plasmoid.icon: { - let iconName = "kdeconnect-tray"; + Plasmoid.icon: inPanel + ? "kdeconnect-tray-symbolic" + : "kdeconnect-tray" - if (inPanel) { - return "kdeconnect-tray-symbolic"; - } - - return iconName; - } - - Binding { - target: plasmoid - property: "status" - value: (connectDeviceModel.count > 0) ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus - } + Plasmoid.status: connectedDeviceModel.count > 0 ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus fullRepresentation: FullRepresentation { - devicesModel: connectDeviceModel + devicesModel: connectedDeviceModel } compactRepresentation: CompactRepresentation { + plasmoidItem: root } PlasmaCore.Action { id: configureAction text: i18n("KDE Connect Settings…") icon.name: "configure" - visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect"); - onTriggered: { + visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect") + onTriggered: checked => { KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect"); } }