Revert changes to QML incompatible with Qt 6.6 and older

- Revert "plasmoid: Port to pragma ComponentBehavior: Bound"
  This reverts commit 9ee0b23727.

- Revert "plasmoid: Flatten plugin controllers, menu and other non-graphical components"
  This reverts commit d2ee2bfdd8.

- Revert "plasmoid: Basic code cleanup"
  This reverts commit 90946829bf.
This commit is contained in:
Albert Vaca Cintora 2024-09-04 00:36:25 +02:00
parent 622708aa63
commit f3fa818cbf
No known key found for this signature in database
17 changed files with 444 additions and 583 deletions

View file

@ -71,19 +71,6 @@ void KdeConnectDeclarativePlugin::registerTypes(const char *uri)
"RemoteKeyboardDbusInterface", "RemoteKeyboardDbusInterface",
QStringLiteral("You're not supposed to instantiate interfaces")); QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<DeviceDbusInterface>(uri, 1, 0, "DeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces")); qmlRegisterUncreatableType<DeviceDbusInterface>(uri, 1, 0, "DeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<BatteryDbusInterface>(uri, 1, 0, "BatteryDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<ConnectivityReportDbusInterface>(uri,
1,
0,
"ConnectivityReportDbusInterface",
QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<SftpDbusInterface>(uri, 1, 0, "SftpDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<SmsDbusInterface>(uri, 1, 0, "SmsDbusInterface", QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<VirtualmonitorDbusInterface>(uri,
1,
0,
"VirtualmonitorDbusInterface",
QStringLiteral("You're not supposed to instantiate interfaces"));
qmlRegisterUncreatableType<RemoteCommandsDbusInterface>(uri, qmlRegisterUncreatableType<RemoteCommandsDbusInterface>(uri,
1, 1,
0, 0,

View file

@ -1,43 +1,36 @@
/** /**
* SPDX-FileCopyrightText: 2016 Aleix Pol Gonzalez <aleixpol@kde.org> * SPDX-FileCopyrightText: 2016 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound import QtQml 2.2
import org.kde.kdeconnect 1.0
import QtQml
import org.kde.kdeconnect as KDEConnect
QtObject { QtObject {
id: prop id: prop
property QtObject object: null
property QtObject object
property string read property string read
property string change: read+"Changed" property string change: read+"Changed"
Component.onCompleted: { Component.onCompleted: get();
get();
}
onChangeChanged: { onChangeChanged: {
if (object) { if (object) {
const signal = object[change]; var theSignal = object[change];
if (signal) { if (theSignal) {
signal.connect(valueReceived); theSignal.connect(valueReceived);
} else { } else {
console.warn(`couldn't find signal ${change} for ${object}`); console.warn("couldn't find signal", change, "for", object)
} }
} }
} }
function valueReceived(value: var): void { function valueReceived(val) {
if (!value) { if (!val) {
get(); get();
} else { } else {
_value = value; _value = val;
} }
} }
@ -45,26 +38,18 @@ QtObject {
property var _value: defaultValue property var _value: defaultValue
readonly property var value: _value readonly property var value: _value
readonly property KDEConnect.DBusAsyncResponse __response: KDEConnect.DBusAsyncResponse { readonly property var v: DBusAsyncResponse {
id: response id: response
autoDelete: false autoDelete: false
onSuccess: result => { onSuccess: result => {
prop._value = result; prop._value = result;
} }
onError: message => { 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(): void { function get() {
if (object) { response.setPendingCall(object[read]());
const method = object[read];
if (method) {
response.setPendingCall(method());
}
}
} }
} }

View file

@ -1,71 +1,47 @@
/** /**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com> * SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2016 David Kahles <david.kahles96@gmail.com> * SPDX-FileCopyrightText: 2016 David Kahles <david.kahles96@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound import QtQml 2.2
import org.kde.kdeconnect 1.0
import QtQml
import org.kde.kdeconnect as KDEConnect
QtObject { QtObject {
id: root id: root
property KDEConnect.DeviceDbusInterface device property alias device: conn.target
property string pluginName property string pluginName: ""
property bool available property bool available: false
property string iconName property string iconName: ""
readonly property Connections connection: Connections { readonly property Connections connection: Connections {
id: conn id: conn
function onPluginsChanged() {
target: root.device
function onPluginsChanged(): void {
root.pluginsChanged(); root.pluginsChanged();
} }
} }
Component.onCompleted: { Component.onCompleted: pluginsChanged()
pluginsChanged();
}
readonly property KDEConnect.DBusAsyncResponse __availableResponse: KDEConnect.DBusAsyncResponse { readonly property var v: DBusAsyncResponse {
id: availableResponse id: availableResponse
autoDelete: false autoDelete: false
onSuccess: (result) => { root.available = result; }
onSuccess: result => { onError: () => { root.available = false }
root.available = result;
} }
onError: message => { function pluginsChanged() {
root.available = false; availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName))
} iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName))
} }
function pluginsChanged(): void { readonly property var vv: DBusAsyncResponse {
if (device) {
availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName));
iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName));
}
}
readonly property KDEConnect.DBusAsyncResponse __iconResponse: KDEConnect.DBusAsyncResponse {
id: iconResponse id: iconResponse
autoDelete: false autoDelete: false
onSuccess: (result) => { root.iconName = result; }
onSuccess: result => { onError: () => { root.iconName = "" }
root.iconName = result;
}
onError: message => {
root.iconName = "";
}
} }
} }

View file

@ -1,77 +1,70 @@
/** /**
* SPDX-FileCopyrightText: 2017 Holger Kaelberer <holger.k@elberer.de> * SPDX-FileCopyrightText: 2017 Holger Kaelberer <holger.k@elberer.de>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound import QtQuick 2.1
import org.kde.kdeconnect 1.0
import QtQuick.Controls 2.4
import QtQuick TextField {
import QtQuick.Controls as QQC2
import org.kde.kdeconnect as KDEConnect
QQC2.TextField {
id: root id: root
property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "remotekeyboard" pluginName: "remotekeyboard"
device: root.device
} }
property KDEConnect.RemoteKeyboardDbusInterface remoteKeyboard property var remoteKeyboard: null
readonly property bool remoteState: available && remoteKeyboard ? remoteKeyboard.remoteState : false readonly property bool remoteState: available ? remoteKeyboard.remoteState : false
Connections { Connections {
target: root.remoteKeyboard target: remoteKeyboard
function onKeyPressReceived() {
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); //console.log("XXX received keypress key=" + key + " special=" + specialKey + " shift=" + shift + " ctrl=" + ctrl + " text=" + text + " cursorPos=" + cursorPosition);
// interpret some special keys: // interpret some special keys:
if (specialKey === 12 || specialKey === 14) { // Return/Esc -> clear if (specialKey == 12 || specialKey == 14) // Return/Esc -> clear
text = ""; text = "";
} else if (specialKey === 4 // Left else if (specialKey == 4 // Left
&& cursorPosition > 0) { && cursorPosition > 0)
--cursorPosition; --cursorPosition;
} else if (specialKey === 6 // Right else if (specialKey == 6 // Right
&& cursorPosition < text.length) { && cursorPosition < text.length)
++cursorPosition; ++cursorPosition;
} else if (specialKey === 1) { // Backspace -> delete left else if (specialKey == 1) { // Backspace -> delete left
const pos = cursorPosition; var pos = cursorPosition;
if (pos > 0) { if (pos > 0) {
text = text.substring(0, pos-1) text = text.substring(0, pos-1)
+ text.substring(pos, text.length); + text.substring(pos, text.length);
cursorPosition = pos - 1; cursorPosition = pos - 1;
} }
} else if (specialKey === 13) { // Delete -> delete right } else if (specialKey == 13) { // Delete -> delete right
const pos = cursorPosition; var pos = cursorPosition;
if (pos < text.length) { if (pos < text.length) {
text = text.substring(0, pos) text = text.substring(0, pos)
+ text.substring(pos+1, text.length); + text.substring(pos+1, text.length);
cursorPosition = pos; // seems to be set to text.length automatically! cursorPosition = pos; // seems to be set to text.length automatically!
} }
} else if (specialKey === 10) { // Home } else if (specialKey == 10) // Home
cursorPosition = 0; cursorPosition = 0;
} else if (specialKey == 11) { // End else if (specialKey == 11) // End
cursorPosition = text.length; cursorPosition = text.length;
} else { else {
// echo visible keys // echo visible keys
let sanitized = ""; var sanitized = "";
for (let i = 0; i < key.length; i++) { for (var i = 0; i < key.length; i++) {
if (key.charCodeAt(i) > 31) { if (key.charCodeAt(i) > 31)
sanitized += key.charAt(i); sanitized += key.charAt(i);
} }
}
if (sanitized.length > 0 && !ctrl && !alt) { if (sanitized.length > 0 && !ctrl && !alt) {
// insert sanitized at current pos: // insert sanitized at current pos:
const pos = cursorPosition; var pos = cursorPosition;
text = text.substring(0, pos) text = text.substring(0, pos)
+ sanitized + sanitized
+ text.substring(pos, text.length); + text.substring(pos, text.length);
@ -82,27 +75,28 @@ QQC2.TextField {
} }
} }
function sendEvent(event: KeyEvent): void {
function sendEvent(event) {
if (remoteKeyboard) { if (remoteKeyboard) {
const transEvent = JSON.parse(JSON.stringify(event)); // transform to anonymous object var transEvent = JSON.parse(JSON.stringify(event)); // transform to anonymous object
remoteKeyboard.sendQKeyEvent(transEvent); remoteKeyboard.sendQKeyEvent(transEvent);
event.accepted = true event.accepted = true
} }
} }
Keys.onPressed: event => { Keys.onPressed: {
if (available) { if (available)
sendEvent(event); sendEvent(event);
}
event.accepted = true; event.accepted = true;
} }
onAvailableChanged: { onAvailableChanged: {
if (available && device !== null) { if (available) {
remoteKeyboard = KDEConnect.RemoteKeyboardDbusInterfaceFactory.create(device.id()); remoteKeyboard = RemoteKeyboardDbusInterfaceFactory.create(device.id());
//remoteKeyboard.keyPressReceived.connect(keyPressReceived);
remoteKeyboard.remoteStateChanged.connect(remoteStateChanged); remoteKeyboard.remoteStateChanged.connect(remoteStateChanged);
} else { } else {
remoteKeyboard = null; remoteKeyboard = null
} }
} }
} }

View file

@ -1,80 +1,62 @@
/** /**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com> * SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "battery" pluginName: "battery"
device: root.device
} }
readonly property bool charging: battery?.isCharging ?? false property bool charging: battery ? battery.isCharging : false
readonly property int charge: battery?.charge ?? -1 property int charge: battery ? battery.charge : -1
property string displayString: (available && charge > -1) ? ((charging) ? (i18n("%1% charging", charge)) : (i18n("%1%", charge))) : i18n("No info")
readonly property string displayString: { property variant battery: null
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 * Suggests an icon name to use for the current battery level
*/ */
readonly property string iconName: { readonly property string iconName: {
if (charge < 0) { charge < 0 ?
return "battery-missing-symbolic"; "battery-missing-symbolic" :
} else if (charge < 10) { charge < 10 ?
return charging charging ?
? "battery-empty-charging-symbolic" "battery-empty-charging-symbolic" :
: "battery-empty-symbolic"; "battery-empty-symbolic" :
} else if (charge < 25) { charge < 25 ?
return charging charging ?
? "battery-caution-charging-symbolic" "battery-caution-charging-symbolic" :
: "battery-caution-symbolic"; "battery-caution-symbolic" :
} else if (charge < 50) { charge < 50 ?
return charging charging ?
? "battery-low-charging-symbolic" "battery-low-charging-symbolic" :
: "battery-low-symbolic"; "battery-low-symbolic" :
} else if (charge < 75) { charge < 75 ?
return charging charging ?
? "battery-good-charging-symbolic" "battery-good-charging-symbolic" :
: "battery-good-symbolic"; "battery-good-symbolic" :
} else { charging ?
return charging "battery-full-charging-symbolic":
? "battery-full-charging-symbolic" "battery-full-symbolic"
: "battery-full-symbolic";
}
} }
onAvailableChanged: { onAvailableChanged: {
if (available) { if (available) {
battery = KDEConnect.DeviceBatteryDbusInterfaceFactory.create(device.id()); battery = DeviceBatteryDbusInterfaceFactory.create(device.id())
} else { } else {
battery = null; battery = null
} }
} }
} }

View file

@ -1,32 +1,28 @@
/** /**
* SPDX-FileCopyrightText: 2021 Yaman Qalieh <ybq987@gmail.com> * SPDX-FileCopyrightText: 2021 Yaman Qalieh <ybq987@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "clipboard" pluginName: "clipboard"
device: root.device
} }
property KDEConnect.ClipboardDbusInterface clipboard property variant clipboard: null
function sendClipboard(): void { function sendClipboard() {
if (clipboard) { if (clipboard) {
clipboard.sendClipboard(); clipboard.sendClipboard();
} }
@ -34,9 +30,9 @@ QtObject {
onAvailableChanged: { onAvailableChanged: {
if (available) { if (available) {
clipboard = KDEConnect.ClipboardDbusInterfaceFactory.create(device.id()); clipboard = ClipboardDbusInterfaceFactory.create(device.id())
} else { } else {
clipboard = null; clipboard = null
} }
} }
} }

View file

@ -1,44 +1,32 @@
/** /*
* SPDX-FileCopyrightText: 2014-2015 Frederic St-Pierre <me@fredericstpierre.com> SPDX-FileCopyrightText: 2014-2015 Frederic St-Pierre <me@fredericstpierre.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* 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
import QtQuick.Layouts
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
import org.kde.plasma.plasmoid
DropArea { DropArea {
id: root onEntered: {
required property PlasmoidItem plasmoidItem
onEntered: drag => {
if (drag.hasUrls) { if (drag.hasUrls) {
root.plasmoidItem.expanded = true; root.expanded = true;
} }
} }
MouseArea { MouseArea {
id: kdeConnectMouseArea
anchors.fill: parent anchors.fill: parent
property bool wasExpanded: false onClicked: {
root.expanded = !root.expanded;
onPressed: mouse => {
wasExpanded = root.plasmoidItem.expanded;
}
onClicked: mouse => {
root.plasmoidItem.expanded = !root.plasmoidItem.expanded;
} }
} }
Kirigami.Icon { Kirigami.Icon {
id: kdeConnectIcon
anchors.fill: parent anchors.fill: parent
source: Plasmoid.icon source: plasmoid.icon
} }
} }

View file

@ -1,27 +1,24 @@
/** /**
* SPDX-FileCopyrightText: 2021 David Shlemayev <david.shlemayev@gmail.com> * SPDX-FileCopyrightText: 2021 David Shlemayev <david.shlemayev@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property bool ready: connectivity
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "connectivity_report" pluginName: "connectivity_report"
device: root.device
} }
/** /**
@ -40,22 +37,20 @@ QtObject {
* The parsing from Android values into these strings is handled in the * 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) * [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?.cellularNetworkType ?? i18n("Unknown") readonly property string networkType: connectivity ? connectivity.cellularNetworkType : i18n("Unknown")
/** /**
* Reports a value between 0 and 4 (inclusive) which represents the strength of the cellular connection * Reports a value between 0 and 4 (inclusive) which represents the strength of the cellular connection
*/ */
readonly property int signalStrength: connectivity?.cellularNetworkStrength ?? -1 readonly property int signalStrength: connectivity ? connectivity.cellularNetworkStrength : -1
property string displayString: {
readonly property string displayString: { if (ready) {
if (connectivity !== null) {
return `${networkType} ${signalStrength}/4`; return `${networkType} ${signalStrength}/4`;
} else { } else {
return i18n("No signal"); return i18n("No signal");
} }
} }
property variant connectivity: null
property KDEConnect.ConnectivityReportDbusInterface connectivity
/** /**
* Suggests an icon name to use for the current signal level * Suggests an icon name to use for the current signal level
@ -65,27 +60,27 @@ QtObject {
*/ */
readonly property string iconName: { readonly property string iconName: {
// Firstly, get the name prefix which represents the signal strength // Firstly, get the name prefix which represents the signal strength
const signalStrengthIconName = var signalStrengthIconName =
(signalStrength < 0 || connectivity === null) ? (signalStrength < 0 || !ready) ?
// As long as the signal strength is nonsense or the plugin reports as non-ready, // As long as the signal strength is nonsense or the plugin reports as non-ready,
// show us as disconnected // show us as disconnected
"network-mobile-off" : "network-mobile-off" :
(signalStrength === 0) ? (signalStrength == 0) ?
"network-mobile-0" : "network-mobile-0" :
(signalStrength === 1) ? (signalStrength == 1) ?
"network-mobile-20" : "network-mobile-20" :
(signalStrength === 2) ? (signalStrength == 2) ?
"network-mobile-60" : "network-mobile-60" :
(signalStrength === 3) ? (signalStrength == 3) ?
"network-mobile-80" : "network-mobile-80" :
(signalStrength === 4) ? (signalStrength == 4) ?
"network-mobile-100" : "network-mobile-100" :
// Since all possible values are enumerated above, this default case should never be hit. // 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! // 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 // If we understand the network type, append to the icon name to show the type
const networkTypeSuffix = var networkTypeSuffix =
(networkType === "5G") ? (networkType === "5G") ?
// No icon for this case! // No icon for this case!
"" : "" :
@ -115,16 +110,15 @@ QtObject {
// GSconnect just uses the 2g icon // GSconnect just uses the 2g icon
// No icon for this case! // No icon for this case!
"" : "" :
""; // We didn't recognize the network type. Don't append anything. "" // We didn't recognize the network type. Don't append anything.
return signalStrengthIconName + networkTypeSuffix
return signalStrengthIconName + networkTypeSuffix;
} }
onAvailableChanged: { onAvailableChanged: {
if (available) { if (available) {
connectivity = KDEConnect.DeviceConnectivityReportDbusInterfaceFactory.create(device.id()); connectivity = DeviceConnectivityReportDbusInterfaceFactory.create(device.id())
} else { } else {
connectivity = null; connectivity = null
} }
} }
} }

View file

@ -1,79 +1,28 @@
/** /**
* SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtCore
import QtQuick import QtQuick
import QtQuick.Dialogs as QtDialogs
import QtQuick.Layouts import QtQuick.Layouts
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.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 org.kde.plasma.extras as PlasmaExtras
import QtQuick.Dialogs
import QtCore
PlasmaComponents.ItemDelegate { PlasmaComponents.ItemDelegate
{
id: root id: root
readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId)
required property int index
required property var model
readonly property KDEConnect.DeviceDbusInterface device: KDEConnect.DeviceDbusInterfaceFactory.create(model.deviceId)
hoverEnabled: false hoverEnabled: false
down: false down: false
Battery {
id: battery
device: root.device
}
Clipboard {
id: clipboard
device: root.device
}
Connectivity {
id: connectivity
device: root.device
}
FindMyPhone {
id: findmyphone
device: root.device
}
RemoteCommands {
id: remoteCommands
device: root.device
}
Sftp {
id: sftp
device: root.device
}
Share {
id: share
device: root.device
}
SMS {
id: sms
device: root.device
}
VirtualMonitor {
id: virtualmonitor
device: root.device
}
Kirigami.PromptDialog { Kirigami.PromptDialog {
id: prompt id: prompt
visible: false visible: false
@ -82,83 +31,27 @@ PlasmaComponents.ItemDelegate {
title: i18n("Virtual Monitor is not available") title: i18n("Virtual Monitor is not available")
} }
QtDialogs.FileDialog {
id: fileDialog
title: i18n("Please choose a file")
currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
fileMode: QtDialogs.FileDialog.OpenFiles
onAccepted: {
selectedFiles.forEach(url => share.plugin.shareUrl(url));
}
}
PlasmaExtras.Menu {
id: menu
visualParent: overflowMenu
placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup
// Share
PlasmaExtras.MenuItem {
icon: "document-share"
visible: share.available
text: i18n("Share file")
onClicked: fileDialog.open()
}
// Clipboard
PlasmaExtras.MenuItem {
icon: "klipper"
visible: clipboard.clipboard?.isAutoShareDisabled ?? false
text: i18n("Send Clipboard")
onClicked: {
clipboard.sendClipboard()
}
}
// Find my phone
PlasmaExtras.MenuItem {
icon: "irc-voice"
visible: findmyphone.available
text: i18n("Ring my phone")
onClicked: {
findmyphone.ring()
}
}
// SFTP
PlasmaExtras.MenuItem {
icon: "document-open-folder"
visible: sftp.available
text: i18n("Browse this device")
onClicked: {
sftp.browse()
}
}
// SMS
PlasmaExtras.MenuItem {
icon: "message-new"
visible: sms.available
text: i18n("SMS Messages")
onClicked: {
sms.plugin.launchApp()
}
}
}
DropArea { DropArea {
id: fileDropArea id: fileDropArea
anchors.fill: parent anchors.fill: parent
onDropped: drop => { onDropped: {
if (drop.hasUrls) { if (drop.hasUrls) {
const urls = new Set(drop.urls.map(url => url.toString()));
urls.forEach(url => share.plugin.shareUrl(url)); 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]);
}
} }
drop.accepted = true; drop.accepted = true;
} }
@ -175,14 +68,30 @@ PlasmaComponents.ItemDelegate {
contentItem: ColumnLayout { contentItem: ColumnLayout {
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
RowLayout { RowLayout
{
width: parent.width width: parent.width
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
Battery {
id: battery
device: root.device
}
Connectivity {
id: connectivity
device: root.device
}
VirtualMonitor {
id: virtualmonitor
device: root.device
}
PlasmaComponents.Label { PlasmaComponents.Label {
id: deviceName id: deviceName
elide: Text.ElideRight elide: Text.ElideRight
text: root.model.name text: model.name
Layout.fillWidth: true Layout.fillWidth: true
textFormat: Text.PlainText textFormat: Text.PlainText
} }
@ -210,10 +119,9 @@ PlasmaComponents.ItemDelegate {
} }
} }
} }
RowLayout
RowLayout { {
id: connectionInformation id: connectionInformation
visible: connectivity.available visible: connectivity.available
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
@ -239,10 +147,10 @@ PlasmaComponents.ItemDelegate {
} }
} }
RowLayout { RowLayout
{
id: batteryInformation id: batteryInformation
visible: (battery.available && battery.charge > -1)
visible: battery.available && battery.charge > -1
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
Kirigami.Icon { Kirigami.Icon {
@ -263,11 +171,106 @@ PlasmaComponents.ItemDelegate {
PlasmaComponents.ToolButton { PlasmaComponents.ToolButton {
id: overflowMenu id: overflowMenu
icon.name: "application-menu" icon.name: "application-menu"
checked: menu.status === PlasmaExtras.Menu.Open checked: menu.status === PlasmaExtras.Menu.Open
onPressed: menu.openRelative() onPressed: menu.openRelative()
PlasmaExtras.Menu {
id: menu
visualParent: overflowMenu
placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup
//Share
PlasmaExtras.MenuItem
{
property FileDialog data: FileDialog {
id: fileDialog
title: i18n("Please choose a file")
currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
fileMode: 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 {
id: clipboard
device: root.device
}
id: sendclipboard
icon: "klipper"
visible: clipboard.available && clipboard.clipboard.isAutoShareDisabled
text: i18n("Send Clipboard")
onClicked: {
clipboard.sendClipboard()
}
}
//Find my phone
PlasmaExtras.MenuItem
{
property FindMyPhone data: FindMyPhone {
id: findmyphone
device: root.device
}
id: ring
icon: "irc-voice"
visible: findmyphone.available
text: i18n("Ring my phone")
onClicked: {
findmyphone.ring()
}
}
//SFTP
PlasmaExtras.MenuItem
{
property Sftp data: Sftp {
id: sftp
device: root.device
}
id: browse
icon: "document-open-folder"
visible: sftp.available
text: i18n("Browse this device")
onClicked: {
sftp.browse()
}
}
//SMS
PlasmaExtras.MenuItem
{
property SMS data: SMS {
id: sms
device: root.device
}
icon: "message-new"
visible: sms.available
text: i18n("SMS Messages")
onClicked: {
sms.plugin.launchApp()
}
}
}
} }
} }
@ -285,7 +288,7 @@ PlasmaComponents.ItemDelegate {
text: i18n("Remote Keyboard") text: i18n("Remote Keyboard")
} }
KDEConnect.RemoteKeyboard { RemoteKeyboard {
id: remoteKeyboard id: remoteKeyboard
device: root.device device: root.device
Layout.fillWidth: true Layout.fillWidth: true
@ -311,26 +314,19 @@ PlasmaComponents.ItemDelegate {
visible: notificationsModel.isAnyDimissable; visible: notificationsModel.isAnyDimissable;
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
icon.name: "edit-clear-history" icon.name: "edit-clear-history"
PlasmaComponents.ToolTip.text: i18n("Dismiss all notifications") ToolTip.text: i18n("Dismiss all notifications")
onClicked: notificationsModel.dismissAll(); onClicked: notificationsModel.dismissAll();
} }
} }
} }
Repeater { Repeater {
id: notificationsView id: notificationsView
model: NotificationsModel {
model: KDEConnect.NotificationsModel {
id: notificationsModel id: notificationsModel
deviceId: root.model.deviceId deviceId: root.device.id()
} }
delegate: PlasmaComponents.ItemDelegate { delegate: PlasmaComponents.ItemDelegate {
id: listitem id: listitem
required property int index
required property var model
enabled: true enabled: true
onClicked: checked = !checked onClicked: checked = !checked
Layout.fillWidth: true Layout.fillWidth: true
@ -345,79 +341,72 @@ PlasmaComponents.ItemDelegate {
Kirigami.Icon { Kirigami.Icon {
id: notificationIcon id: notificationIcon
source: listitem.model.appIcon source: appIcon
width: (valid && listitem.model.appIcon !== "") ? dismissButton.width : 0 width: (valid && appIcon.length) ? dismissButton.width : 0
height: width height: width
Layout.alignment: Qt.AlignLeft Layout.alignment: Qt.AlignLeft
} }
PlasmaComponents.Label { PlasmaComponents.Label {
id: notificationLabel id: notificationLabel
text: { text: appName + ": " + (title.length>0 ? (appName==title?notitext:title+": "+notitext) : model.name)
const { appName, notitext, title } = listitem.model;
const description = title !== "" ? (appName === title ? notitext : `${title}: ${notitext}`) : notitext;
return `${appName}: ${description}`;
}
elide: listitem.checked ? Text.ElideNone : Text.ElideRight elide: listitem.checked ? Text.ElideNone : Text.ElideRight
maximumLineCount: listitem.checked ? 0 : 1 maximumLineCount: listitem.checked ? 0 : 1
wrapMode: Text.Wrap wrapMode: Text.WordWrap
Layout.fillWidth: true Layout.fillWidth: true
} }
PlasmaComponents.ToolButton { PlasmaComponents.ToolButton {
id: replyButton id: replyButton
visible: listitem.model.repliable visible: repliable
enabled: listitem.model.repliable && !listitem.replying enabled: repliable && !replying
icon.name: "mail-reply-sender" icon.name: "mail-reply-sender"
PlasmaComponents.ToolTip.text: i18n("Reply") ToolTip.text: i18n("Reply")
onClicked: { onClicked: { replying = true; replyTextField.forceActiveFocus(); }
listitem.replying = true;
replyTextField.forceActiveFocus();
}
} }
PlasmaComponents.ToolButton { PlasmaComponents.ToolButton {
id: dismissButton id: dismissButton
visible: notificationsModel.isAnyDimissable; visible: notificationsModel.isAnyDimissable;
enabled: listitem.model.dismissable enabled: dismissable
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
icon.name: "window-close" icon.name: "window-close"
PlasmaComponents.ToolTip.text: i18n("Dismiss") ToolTip.text: i18n("Dismiss")
onClicked: listitem.model.dbusInterface.dismiss(); onClicked: dbusInterface.dismiss();
} }
} }
RowLayout { RowLayout {
visible: listitem.replying visible: replying
width: notificationLabel.width + replyButton.width + dismissButton.width + Kirigami.Units.smallSpacing * 2 width: notificationLabel.width + replyButton.width + dismissButton.width + Kirigami.Units.smallSpacing * 2
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Button { PlasmaComponents.Button {
id: replyCancelButton
Layout.alignment: Qt.AlignBottom Layout.alignment: Qt.AlignBottom
id: replyCancelButton
text: i18n("Cancel") text: i18n("Cancel")
display: PlasmaComponents.AbstractButton.IconOnly display: PlasmaComponents.AbstractButton.IconOnly
PlasmaComponents.ToolTip { PlasmaComponents.ToolTip {
text: replyCancelButton.text text: parent.text
} }
icon.name: "dialog-cancel" icon.name: "dialog-cancel"
onClicked: { onClicked: {
replyTextField.text = ""; replyTextField.text = "";
listitem.replying = false; replying = false;
} }
} }
PlasmaComponents.TextArea { PlasmaComponents.TextArea {
id: replyTextField id: replyTextField
placeholderText: i18nc("@info:placeholder", "Reply to %1…", listitem.model.appName) placeholderText: i18nc("@info:placeholder", "Reply to %1…", appName)
wrapMode: TextEdit.Wrap wrapMode: TextEdit.Wrap
Layout.fillWidth: true Layout.fillWidth: true
Keys.onPressed: event => { Keys.onPressed: {
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) { if ((event.key == Qt.Key_Return || event.key == Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) {
replySendButton.clicked(); replySendButton.clicked();
event.accepted = true; event.accepted = true;
} }
if (event.key === Qt.Key_Escape) { if (event.key == Qt.Key_Escape) {
replyCancelButton.clicked(); replyCancelButton.clicked();
event.accepted = true; event.accepted = true;
} }
@ -429,11 +418,11 @@ PlasmaComponents.ItemDelegate {
id: replySendButton id: replySendButton
text: i18n("Send") text: i18n("Send")
icon.name: "document-send" icon.name: "document-send"
enabled: replyTextField.text !== "" enabled: replyTextField.text
onClicked: { onClicked: {
listitem.model.dbusInterface.sendReply(replyTextField.text); dbusInterface.sendReply(replyTextField.text);
replyTextField.text = ""; replyTextField.text = "";
listitem.replying = false; replying = false;
} }
} }
} }
@ -441,9 +430,14 @@ PlasmaComponents.ItemDelegate {
} }
} }
RemoteCommands {
id: rc
device: root.device
}
// Commands // Commands
RowLayout { RowLayout {
visible: remoteCommands.available visible: rc.available
width: parent.width width: parent.width
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
@ -452,43 +446,37 @@ PlasmaComponents.ItemDelegate {
Layout.fillWidth: true Layout.fillWidth: true
} }
PlasmaComponents.Button { PlasmaComponents.Button
{
id: addCommandButton id: addCommandButton
icon.name: "list-add" icon.name: "list-add"
PlasmaComponents.ToolTip.text: i18n("Add command") ToolTip.text: i18n("Add command")
onClicked: remoteCommands.plugin.editCommands() onClicked: rc.plugin.editCommands()
visible: remoteCommands.plugin?.canAddCommand ?? false visible: rc.plugin && rc.plugin.canAddCommand
} }
} }
Repeater { Repeater {
id: commandsView id: commandsView
visible: rc.available
visible: remoteCommands.available model: RemoteCommandsModel {
model: KDEConnect.RemoteCommandsModel {
id: commandsModel id: commandsModel
deviceId: root.model.deviceId deviceId: rc.device.id()
} }
delegate: PlasmaComponents.ItemDelegate { delegate: PlasmaComponents.ItemDelegate {
id: commandDelegate
required property int index
required property var model
enabled: true enabled: true
onClicked: rc.plugin.triggerCommand(key)
onClicked: {
remoteCommands.plugin?.triggerCommand(commandDelegate.model.key);
}
Layout.fillWidth: true Layout.fillWidth: true
contentItem: PlasmaComponents.Label { contentItem: PlasmaComponents.Label {
text: `${commandDelegate.model.name}\n${commandDelegate.model.command}` text: name + "\n" + command
} }
} }
} }
// Share
Share {
id: share
device: root.device
}
} }
} }

View file

@ -1,32 +1,28 @@
/** /**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com> * SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "findmyphone" pluginName: "findmyphone"
device: root.device
} }
property KDEConnect.FindMyPhoneDbusInterface findMyPhone property variant findMyPhone: null
function ring(): void { function ring() {
if (findMyPhone) { if (findMyPhone) {
findMyPhone.ring(); findMyPhone.ring();
} }
@ -34,9 +30,9 @@ QtObject {
onAvailableChanged: { onAvailableChanged: {
if (available) { if (available) {
findMyPhone = KDEConnect.FindMyPhoneDbusInterfaceFactory.create(device.id()); findMyPhone = FindMyPhoneDbusInterfaceFactory.create(device.id())
} else { } else {
findMyPhone = null; findMyPhone = null
} }
} }
} }

View file

@ -1,45 +1,40 @@
/** /**
* SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com> * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Controls as QQC2 import QtQuick.Controls
import QtQuick.Layouts import org.kde.plasma.core as PlasmaCore
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.components as PlasmaComponents3
import org.kde.plasma.extras as PlasmaExtras 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 { PlasmaExtras.Representation {
id: kdeconnect id: kdeconnect
property alias devicesModel: devicesView.model property alias devicesModel: devicesView.model
collapseMarginsHint: true collapseMarginsHint: true
KDEConnect.DevicesModel { KdeConnect.DevicesModel {
id: allDevicesModel id: allDevicesModel
} }
KdeConnect.DevicesModel {
KDEConnect.DevicesModel {
id: pairedDevicesModel id: pairedDevicesModel
displayFilter: KDEConnect.DevicesModel.Paired displayFilter: KdeConnect.DevicesModel.Paired
} }
PlasmaComponents3.ScrollView { PlasmaComponents3.ScrollView {
id: dialogItem
anchors.fill: parent anchors.fill: parent
contentItem: ListView { contentItem: ListView {
id: devicesView id: devicesView
spacing: Kirigami.Units.smallSpacing spacing: Kirigami.Units.smallSpacing
clip: true clip: true
@ -62,16 +57,16 @@ PlasmaExtras.Representation {
text: { text: {
if (pairedDevicesModel.count >= 0) { if (pairedDevicesModel.count >= 0) {
return pairedDevicesModel.count === 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count) 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) { } else if (allDevicesModel.count == 0) {
return i18n("Install KDE Connect on your Android device to integrate it with Plasma!") return i18n("Install KDE Connect on your Android device to integrate it with Plasma!")
} }
} }
helpfulAction: QQC2.Action { helpfulAction: Action {
text: i18n("Pair a Device…") text: i18n("Pair a Device…")
icon.name: "list-add" icon.name: "list-add"
onTriggered: KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect") 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 { PlasmaComponents3.Button {

View file

@ -1,29 +1,24 @@
/** /**
* SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de> * SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "remotecommands" pluginName: "remotecommands"
device: root.device
} }
property KDEConnect.RemoteCommandsDbusInterface plugin: property variant plugin: available ? RemoteCommandsDbusInterfaceFactory.create(device.id()) : null
available ? KDEConnect.RemoteCommandsDbusInterfaceFactory.create(device.id()) : null
} }

View file

@ -1,29 +1,25 @@
/** /**
* SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org> * SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "sms" pluginName: "sms"
device: root.device
} }
readonly property KDEConnect.SmsDbusInterface plugin: readonly property variant plugin: available ? SmsDbusInterfaceFactory.create(device.id()) : null
available ? KDEConnect.SmsDbusInterfaceFactory.create(device.id()) : null
} }

View file

@ -1,42 +1,37 @@
/** /**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com> * SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@gmail.com>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "sftp" pluginName: "sftp"
device: root.device
} }
property KDEConnect.SftpDbusInterface sftp property variant sftp: null
function browse(): void { function browse() {
if (sftp) { if (sftp)
sftp.startBrowsing(); sftp.startBrowsing();
} }
}
onAvailableChanged: { onAvailableChanged: {
if (available) { if (available) {
sftp = KDEConnect.SftpDbusInterfaceFactory.create(device.id()); sftp = SftpDbusInterfaceFactory.create(device.id())
} else { } else {
sftp = null; sftp = null
} }
} }
} }

View file

@ -1,29 +1,25 @@
/** /**
* SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de> * SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect as KDEConnect import org.kde.kdeconnect
QtObject { QtObject {
id: root id: root
required property KDEConnect.DeviceDbusInterface device property alias device: checker.device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "share" pluginName: "share"
device: root.device
} }
property KDEConnect.ShareDbusInterface plugin: property variant plugin: available ? ShareDbusInterfaceFactory.create(device.id()) : null
available ? KDEConnect.ShareDbusInterfaceFactory.create(device.id()) : null
} }

View file

@ -1,29 +1,23 @@
/** /**
* SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org> * SPDX-FileCopyrightText: 2021 Aleix Pol i Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
import org.kde.kdeconnect as KDEConnect QtObject
{
QtObject { property alias device: checker.device
id: root
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker { readonly property PluginChecker pluginChecker: PluginChecker {
id: checker id: checker
pluginName: "virtualmonitor" pluginName: "virtualmonitor"
device: root.device
} }
readonly property KDEConnect.VirtualmonitorDbusInterface plugin: readonly property QtObject plugin: available ? VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
available ? KDEConnect.VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
} }

View file

@ -1,61 +1,65 @@
/** /**
* SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org> * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* *
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
*/ */
pragma ComponentBehavior: Bound
import QtQuick 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.core as PlasmaCore
import org.kde.plasma.plasmoid 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 id: root
readonly property bool inPanel: [ readonly property bool inPanel: (plasmoid.location == PlasmaCore.Types.TopEdge
PlasmaCore.Types.TopEdge, || plasmoid.location == PlasmaCore.Types.RightEdge
PlasmaCore.Types.RightEdge, || plasmoid.location == PlasmaCore.Types.BottomEdge
PlasmaCore.Types.BottomEdge, || plasmoid.location == PlasmaCore.Types.LeftEdge)
PlasmaCore.Types.LeftEdge,
].includes(Plasmoid.location)
KDEConnect.DevicesModel { DevicesModel {
id: connectedDeviceModel id: connectDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired | KDEConnect.DevicesModel.Reachable displayFilter: DevicesModel.Paired | DevicesModel.Reachable
} }
KDEConnect.DevicesModel { DevicesModel {
id: pairedDeviceModel id: pairedDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired displayFilter: DevicesModel.Paired
} }
Plasmoid.icon: inPanel Plasmoid.icon: {
? "kdeconnect-tray-symbolic" let iconName = "kdeconnect-tray";
: "kdeconnect-tray"
Plasmoid.status: connectedDeviceModel.count > 0 ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus if (inPanel) {
return "kdeconnect-tray-symbolic";
}
return iconName;
}
Binding {
target: plasmoid
property: "status"
value: (connectDeviceModel.count > 0) ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus
}
fullRepresentation: FullRepresentation { fullRepresentation: FullRepresentation {
devicesModel: connectedDeviceModel devicesModel: connectDeviceModel
} }
compactRepresentation: CompactRepresentation { compactRepresentation: CompactRepresentation {
plasmoidItem: root
} }
PlasmaCore.Action { PlasmaCore.Action {
id: configureAction id: configureAction
text: i18n("KDE Connect Settings…") text: i18n("KDE Connect Settings…")
icon.name: "configure" icon.name: "configure"
visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect") visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect");
onTriggered: checked => { onTriggered: {
KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect"); KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect");
} }
} }