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",
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,
1,
0,

View file

@ -1,43 +1,36 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQml
import org.kde.kdeconnect as KDEConnect
import QtQml 2.2
import org.kde.kdeconnect 1.0
QtObject {
id: prop
property QtObject object
property QtObject object: null
property string read
property string change: read + "Changed"
property string change: read+"Changed"
Component.onCompleted: {
get();
}
Component.onCompleted: get();
onChangeChanged: {
if (object) {
const signal = object[change];
if (signal) {
signal.connect(valueReceived);
var theSignal = object[change];
if (theSignal) {
theSignal.connect(valueReceived);
} else {
console.warn(`couldn't find signal ${change} for ${object}`);
console.warn("couldn't find signal", change, "for", object)
}
}
}
function valueReceived(value: var): void {
if (!value) {
function valueReceived(val) {
if (!val) {
get();
} else {
_value = value;
_value = val;
}
}
@ -45,26 +38,18 @@ QtObject {
property var _value: defaultValue
readonly property var value: _value
readonly property KDEConnect.DBusAsyncResponse __response: KDEConnect.DBusAsyncResponse {
readonly property var v: 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(): void {
if (object) {
const method = object[read];
if (method) {
response.setPendingCall(method());
}
}
function get() {
response.setPendingCall(object[read]());
}
}

View file

@ -1,71 +1,47 @@
/**
* SPDX-FileCopyrightText: 2014 Samoilenko Yuri <kinnalru@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
*/
pragma ComponentBehavior: Bound
import QtQml
import org.kde.kdeconnect as KDEConnect
import QtQml 2.2
import org.kde.kdeconnect 1.0
QtObject {
id: root
property KDEConnect.DeviceDbusInterface device
property string pluginName
property bool available
property string iconName
property alias device: conn.target
property string pluginName: ""
property bool available: false
property string iconName: ""
readonly property Connections connection: Connections {
id: conn
target: root.device
function onPluginsChanged(): void {
function onPluginsChanged() {
root.pluginsChanged();
}
}
Component.onCompleted: {
pluginsChanged();
}
Component.onCompleted: pluginsChanged()
readonly property KDEConnect.DBusAsyncResponse __availableResponse: KDEConnect.DBusAsyncResponse {
readonly property var v: DBusAsyncResponse {
id: availableResponse
autoDelete: false
onSuccess: result => {
root.available = result;
}
onError: message => {
root.available = false;
}
onSuccess: (result) => { root.available = result; }
onError: () => { root.available = false }
}
function pluginsChanged(): void {
if (device) {
availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName));
iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName));
}
function pluginsChanged() {
availableResponse.setPendingCall(device.hasPlugin("kdeconnect_" + pluginName))
iconResponse.setPendingCall(device.pluginIconName("kdeconnect_" + pluginName))
}
readonly property KDEConnect.DBusAsyncResponse __iconResponse: KDEConnect.DBusAsyncResponse {
readonly property var vv: DBusAsyncResponse {
id: iconResponse
autoDelete: false
onSuccess: result => {
root.iconName = result;
}
onError: message => {
root.iconName = "";
}
onSuccess: (result) => { root.iconName = result; }
onError: () => { root.iconName = "" }
}
}

View file

@ -1,108 +1,102 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick 2.1
import org.kde.kdeconnect 1.0
import QtQuick.Controls 2.4
import QtQuick
import QtQuick.Controls as QQC2
TextField {
import org.kde.kdeconnect as KDEConnect
QQC2.TextField {
id: root
property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
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 {
target: root.remoteKeyboard
function onKeyPressReceived(key: string, specialKey: int, shift: bool, ctrl: bool, alt: bool): void {
target: remoteKeyboard
function onKeyPressReceived() {
//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
const pos = cursorPosition;
else if (specialKey == 1) { // Backspace -> delete left
var 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
const pos = cursorPosition;
} else if (specialKey == 13) { // Delete -> delete right
var 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
let sanitized = "";
for (let i = 0; i < key.length; i++) {
if (key.charCodeAt(i) > 31) {
var sanitized = "";
for (var 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:
const pos = cursorPosition;
var 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: KeyEvent): void {
function sendEvent(event) {
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);
event.accepted = true
}
}
Keys.onPressed: event => {
if (available) {
Keys.onPressed: {
if (available)
sendEvent(event);
}
event.accepted = true;
}
onAvailableChanged: {
if (available && device !== null) {
remoteKeyboard = KDEConnect.RemoteKeyboardDbusInterfaceFactory.create(device.id());
if (available) {
remoteKeyboard = RemoteKeyboardDbusInterfaceFactory.create(device.id());
//remoteKeyboard.keyPressReceived.connect(keyPressReceived);
remoteKeyboard.remoteStateChanged.connect(remoteStateChanged);
} else {
remoteKeyboard = null;
remoteKeyboard = null
}
}
}

View file

@ -1,80 +1,62 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "battery"
device: root.device
}
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
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
/**
* Suggests an icon name to use for the current battery level
*/
readonly property string iconName: {
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";
}
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"
}
onAvailableChanged: {
if (available) {
battery = KDEConnect.DeviceBatteryDbusInterfaceFactory.create(device.id());
battery = DeviceBatteryDbusInterfaceFactory.create(device.id())
} else {
battery = null;
battery = null
}
}
}

View file

@ -1,32 +1,28 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "clipboard"
device: root.device
}
property KDEConnect.ClipboardDbusInterface clipboard
property variant clipboard: null
function sendClipboard(): void {
function sendClipboard() {
if (clipboard) {
clipboard.sendClipboard();
}
@ -34,9 +30,9 @@ QtObject {
onAvailableChanged: {
if (available) {
clipboard = KDEConnect.ClipboardDbusInterfaceFactory.create(device.id());
clipboard = ClipboardDbusInterfaceFactory.create(device.id())
} else {
clipboard = null;
clipboard = null
}
}
}

View file

@ -1,44 +1,32 @@
/**
* 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-FileCopyrightText: 2014-2015 Frederic St-Pierre <me@fredericstpierre.com>
pragma ComponentBehavior: Bound
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
import QtQuick
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasmoid
DropArea {
id: root
required property PlasmoidItem plasmoidItem
onEntered: drag => {
onEntered: {
if (drag.hasUrls) {
root.plasmoidItem.expanded = true;
root.expanded = true;
}
}
MouseArea {
id: kdeConnectMouseArea
anchors.fill: parent
property bool wasExpanded: false
onPressed: mouse => {
wasExpanded = root.plasmoidItem.expanded;
}
onClicked: mouse => {
root.plasmoidItem.expanded = !root.plasmoidItem.expanded;
onClicked: {
root.expanded = !root.expanded;
}
}
Kirigami.Icon {
id: kdeConnectIcon
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: 2024 ivan tkachenko <me@ratijas.tk>
*
* 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.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
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
pluginName: "connectivity_report"
device: root.device
}
/**
@ -40,22 +37,20 @@ 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?.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
*/
readonly property int signalStrength: connectivity?.cellularNetworkStrength ?? -1
readonly property string displayString: {
if (connectivity !== null) {
readonly property int signalStrength: connectivity ? connectivity.cellularNetworkStrength : -1
property string displayString: {
if (ready) {
return `${networkType} ${signalStrength}/4`;
} else {
return i18n("No signal");
}
}
property KDEConnect.ConnectivityReportDbusInterface connectivity
property variant connectivity: null
/**
* Suggests an icon name to use for the current signal level
@ -65,27 +60,27 @@ QtObject {
*/
readonly property string iconName: {
// Firstly, get the name prefix which represents the signal strength
const signalStrengthIconName =
(signalStrength < 0 || connectivity === null) ?
var signalStrengthIconName =
(signalStrength < 0 || !ready) ?
// 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
const networkTypeSuffix =
var networkTypeSuffix =
(networkType === "5G") ?
// No icon for this case!
"" :
@ -115,16 +110,15 @@ 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 = KDEConnect.DeviceConnectivityReportDbusInterfaceFactory.create(device.id());
connectivity = DeviceConnectivityReportDbusInterfaceFactory.create(device.id())
} else {
connectivity = null;
connectivity = null
}
}
}

View file

@ -1,79 +1,28 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtCore
import QtQuick
import QtQuick.Dialogs as QtDialogs
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.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
PlasmaComponents.ItemDelegate {
PlasmaComponents.ItemDelegate
{
id: root
required property int index
required property var model
readonly property KDEConnect.DeviceDbusInterface device: KDEConnect.DeviceDbusInterfaceFactory.create(model.deviceId)
readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId)
hoverEnabled: 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 {
id: prompt
visible: false
@ -82,83 +31,27 @@ PlasmaComponents.ItemDelegate {
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 {
id: fileDropArea
anchors.fill: parent
onDropped: drop => {
onDropped: {
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;
}
@ -175,14 +68,30 @@ PlasmaComponents.ItemDelegate {
contentItem: ColumnLayout {
spacing: Kirigami.Units.smallSpacing
RowLayout {
RowLayout
{
width: parent.width
spacing: Kirigami.Units.smallSpacing
Battery {
id: battery
device: root.device
}
Connectivity {
id: connectivity
device: root.device
}
VirtualMonitor {
id: virtualmonitor
device: root.device
}
PlasmaComponents.Label {
id: deviceName
elide: Text.ElideRight
text: root.model.name
text: model.name
Layout.fillWidth: true
textFormat: Text.PlainText
}
@ -210,10 +119,9 @@ PlasmaComponents.ItemDelegate {
}
}
}
RowLayout {
RowLayout
{
id: connectionInformation
visible: connectivity.available
spacing: Kirigami.Units.smallSpacing
@ -239,10 +147,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 {
@ -263,15 +171,110 @@ PlasmaComponents.ItemDelegate {
PlasmaComponents.ToolButton {
id: overflowMenu
icon.name: "application-menu"
checked: menu.status === PlasmaExtras.Menu.Open
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()
}
}
}
}
}
// RemoteKeyboard
//RemoteKeyboard
PlasmaComponents.ItemDelegate {
visible: remoteKeyboard.remoteState
Layout.fillWidth: true
@ -285,7 +288,7 @@ PlasmaComponents.ItemDelegate {
text: i18n("Remote Keyboard")
}
KDEConnect.RemoteKeyboard {
RemoteKeyboard {
id: remoteKeyboard
device: root.device
Layout.fillWidth: true
@ -293,9 +296,9 @@ PlasmaComponents.ItemDelegate {
}
}
// Notifications
//Notifications
PlasmaComponents.ItemDelegate {
visible: notificationsModel.count > 0
visible: notificationsModel.count>0
enabled: true
Layout.fillWidth: true
@ -311,26 +314,19 @@ PlasmaComponents.ItemDelegate {
visible: notificationsModel.isAnyDimissable;
Layout.alignment: Qt.AlignRight
icon.name: "edit-clear-history"
PlasmaComponents.ToolTip.text: i18n("Dismiss all notifications")
ToolTip.text: i18n("Dismiss all notifications")
onClicked: notificationsModel.dismissAll();
}
}
}
Repeater {
id: notificationsView
model: KDEConnect.NotificationsModel {
model: NotificationsModel {
id: notificationsModel
deviceId: root.model.deviceId
deviceId: root.device.id()
}
delegate: PlasmaComponents.ItemDelegate {
id: listitem
required property int index
required property var model
enabled: true
onClicked: checked = !checked
Layout.fillWidth: true
@ -345,79 +341,72 @@ PlasmaComponents.ItemDelegate {
Kirigami.Icon {
id: notificationIcon
source: listitem.model.appIcon
width: (valid && listitem.model.appIcon !== "") ? dismissButton.width : 0
source: appIcon
width: (valid && appIcon.length) ? dismissButton.width : 0
height: width
Layout.alignment: Qt.AlignLeft
}
PlasmaComponents.Label {
id: notificationLabel
text: {
const { appName, notitext, title } = listitem.model;
const description = title !== "" ? (appName === title ? notitext : `${title}: ${notitext}`) : notitext;
return `${appName}: ${description}`;
}
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.Wrap
wrapMode: Text.WordWrap
Layout.fillWidth: true
}
PlasmaComponents.ToolButton {
id: replyButton
visible: listitem.model.repliable
enabled: listitem.model.repliable && !listitem.replying
visible: repliable
enabled: repliable && !replying
icon.name: "mail-reply-sender"
PlasmaComponents.ToolTip.text: i18n("Reply")
onClicked: {
listitem.replying = true;
replyTextField.forceActiveFocus();
}
ToolTip.text: i18n("Reply")
onClicked: { replying = true; replyTextField.forceActiveFocus(); }
}
PlasmaComponents.ToolButton {
id: dismissButton
visible: notificationsModel.isAnyDimissable;
enabled: listitem.model.dismissable
enabled: dismissable
Layout.alignment: Qt.AlignRight
icon.name: "window-close"
PlasmaComponents.ToolTip.text: i18n("Dismiss")
onClicked: listitem.model.dbusInterface.dismiss();
ToolTip.text: i18n("Dismiss")
onClicked: dbusInterface.dismiss();
}
}
RowLayout {
visible: listitem.replying
visible: replying
width: notificationLabel.width + replyButton.width + dismissButton.width + Kirigami.Units.smallSpacing * 2
spacing: Kirigami.Units.smallSpacing
PlasmaComponents.Button {
id: replyCancelButton
Layout.alignment: Qt.AlignBottom
id: replyCancelButton
text: i18n("Cancel")
display: PlasmaComponents.AbstractButton.IconOnly
PlasmaComponents.ToolTip {
text: replyCancelButton.text
text: parent.text
}
icon.name: "dialog-cancel"
onClicked: {
replyTextField.text = "";
listitem.replying = false;
replying = false;
}
}
PlasmaComponents.TextArea {
id: replyTextField
placeholderText: i18nc("@info:placeholder", "Reply to %1…", listitem.model.appName)
placeholderText: i18nc("@info:placeholder", "Reply to %1…", appName)
wrapMode: TextEdit.Wrap
Layout.fillWidth: true
Keys.onPressed: event => {
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) {
Keys.onPressed: {
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;
}
@ -429,11 +418,11 @@ PlasmaComponents.ItemDelegate {
id: replySendButton
text: i18n("Send")
icon.name: "document-send"
enabled: replyTextField.text !== ""
enabled: replyTextField.text
onClicked: {
listitem.model.dbusInterface.sendReply(replyTextField.text);
dbusInterface.sendReply(replyTextField.text);
replyTextField.text = "";
listitem.replying = false;
replying = false;
}
}
}
@ -441,9 +430,14 @@ PlasmaComponents.ItemDelegate {
}
}
RemoteCommands {
id: rc
device: root.device
}
// Commands
RowLayout {
visible: remoteCommands.available
visible: rc.available
width: parent.width
spacing: Kirigami.Units.smallSpacing
@ -452,43 +446,37 @@ PlasmaComponents.ItemDelegate {
Layout.fillWidth: true
}
PlasmaComponents.Button {
PlasmaComponents.Button
{
id: addCommandButton
icon.name: "list-add"
PlasmaComponents.ToolTip.text: i18n("Add command")
onClicked: remoteCommands.plugin.editCommands()
visible: remoteCommands.plugin?.canAddCommand ?? false
ToolTip.text: i18n("Add command")
onClicked: rc.plugin.editCommands()
visible: rc.plugin && rc.plugin.canAddCommand
}
}
Repeater {
id: commandsView
visible: remoteCommands.available
model: KDEConnect.RemoteCommandsModel {
visible: rc.available
model: RemoteCommandsModel {
id: commandsModel
deviceId: root.model.deviceId
deviceId: rc.device.id()
}
delegate: PlasmaComponents.ItemDelegate {
id: commandDelegate
required property int index
required property var model
enabled: true
onClicked: {
remoteCommands.plugin?.triggerCommand(commandDelegate.model.key);
}
onClicked: rc.plugin.triggerCommand(key)
Layout.fillWidth: true
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: 2024 ivan tkachenko <me@ratijas.tk>
*
* 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.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "findmyphone"
device: root.device
}
property KDEConnect.FindMyPhoneDbusInterface findMyPhone
property variant findMyPhone: null
function ring(): void {
function ring() {
if (findMyPhone) {
findMyPhone.ring();
}
@ -34,9 +30,9 @@ QtObject {
onAvailableChanged: {
if (available) {
findMyPhone = KDEConnect.FindMyPhoneDbusInterfaceFactory.create(device.id());
findMyPhone = FindMyPhoneDbusInterfaceFactory.create(device.id())
} else {
findMyPhone = null;
findMyPhone = null
}
}
}

View file

@ -1,45 +1,40 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
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 QtQuick.Controls
import org.kde.plasma.core as PlasmaCore
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
clip: true
@ -62,16 +57,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: QQC2.Action {
helpfulAction: 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 {

View file

@ -1,29 +1,24 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "remotecommands"
device: root.device
}
property KDEConnect.RemoteCommandsDbusInterface plugin:
available ? KDEConnect.RemoteCommandsDbusInterfaceFactory.create(device.id()) : null
property variant plugin: available ? RemoteCommandsDbusInterfaceFactory.create(device.id()) : null
}

View file

@ -1,29 +1,25 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "sms"
device: root.device
}
readonly property KDEConnect.SmsDbusInterface plugin:
available ? KDEConnect.SmsDbusInterfaceFactory.create(device.id()) : null
readonly property variant plugin: available ? SmsDbusInterfaceFactory.create(device.id()) : null
}

View file

@ -1,42 +1,37 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "sftp"
device: root.device
}
property KDEConnect.SftpDbusInterface sftp
property variant sftp: null
function browse(): void {
if (sftp) {
function browse() {
if (sftp)
sftp.startBrowsing();
}
}
onAvailableChanged: {
if (available) {
sftp = KDEConnect.SftpDbusInterfaceFactory.create(device.id());
sftp = SftpDbusInterfaceFactory.create(device.id())
} else {
sftp = null;
sftp = null
}
}
}

View file

@ -1,29 +1,25 @@
/**
* 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
*/
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "share"
device: root.device
}
property KDEConnect.ShareDbusInterface plugin:
available ? KDEConnect.ShareDbusInterfaceFactory.create(device.id()) : null
property variant plugin: available ? ShareDbusInterfaceFactory.create(device.id()) : null
}

View file

@ -1,29 +1,23 @@
/**
* SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2024 ivan tkachenko <me@ratijas.tk>
* SPDX-FileCopyrightText: 2021 Aleix Pol i Gonzalez <aleixpol@kde.org>
*
* 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
required property KDEConnect.DeviceDbusInterface device
QtObject
{
property alias device: checker.device
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
readonly property PluginChecker pluginChecker: PluginChecker {
id: checker
pluginName: "virtualmonitor"
device: root.device
}
readonly property KDEConnect.VirtualmonitorDbusInterface plugin:
available ? KDEConnect.VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
readonly property QtObject plugin: available ? VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
}

View file

@ -1,61 +1,65 @@
/**
* 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
*/
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: [
PlasmaCore.Types.TopEdge,
PlasmaCore.Types.RightEdge,
PlasmaCore.Types.BottomEdge,
PlasmaCore.Types.LeftEdge,
].includes(Plasmoid.location)
readonly property bool inPanel: (plasmoid.location == PlasmaCore.Types.TopEdge
|| plasmoid.location == PlasmaCore.Types.RightEdge
|| plasmoid.location == PlasmaCore.Types.BottomEdge
|| plasmoid.location == PlasmaCore.Types.LeftEdge)
KDEConnect.DevicesModel {
id: connectedDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired | KDEConnect.DevicesModel.Reachable
DevicesModel {
id: connectDeviceModel
displayFilter: DevicesModel.Paired | DevicesModel.Reachable
}
KDEConnect.DevicesModel {
DevicesModel {
id: pairedDeviceModel
displayFilter: KDEConnect.DevicesModel.Paired
displayFilter: DevicesModel.Paired
}
Plasmoid.icon: inPanel
? "kdeconnect-tray-symbolic"
: "kdeconnect-tray"
Plasmoid.icon: {
let iconName = "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 {
devicesModel: connectedDeviceModel
devicesModel: connectDeviceModel
}
compactRepresentation: CompactRepresentation {
plasmoidItem: root
}
PlasmaCore.Action {
id: configureAction
text: i18n("KDE Connect Settings…")
icon.name: "configure"
visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect")
onTriggered: checked => {
visible: KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect");
onTriggered: {
KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect");
}
}