plasmoid: Basic code cleanup

This commit is contained in:
ivan tkachenko 2024-07-01 03:03:57 +05:00
parent 1f164e3860
commit 90946829bf
No known key found for this signature in database
GPG key ID: AF72731B7C654CB3
17 changed files with 456 additions and 336 deletions

View file

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

View file

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

View file

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

View file

@ -1,62 +1,80 @@
/**
* 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.plasma.core as PlasmaCore
import org.kde.kdeconnect
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
property alias device: checker.device
required property KDEConnect.DeviceDbusInterface device
readonly property alias available: checker.available
readonly property PluginChecker pluginChecker: PluginChecker {
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "battery"
device: root.device
}
property bool charging: battery ? battery.isCharging : false
property int charge: battery ? battery.charge : -1
property string displayString: (available && charge > -1) ? ((charging) ? (i18n("%1% charging", charge)) : (i18n("%1%", charge))) : i18n("No info")
property variant battery: null
readonly property bool charging: battery?.isCharging ?? false
readonly property int charge: battery?.charge ?? -1
readonly property string displayString: {
if (available && charge > -1) {
if (charging) {
return i18n("%1% charging", charge);
} else {
return i18n("%1%", charge);
}
} else {
return i18n("No info");
}
}
property KDEConnect.BatteryDbusInterface battery
/**
* Suggests an icon name to use for the current battery level
*/
readonly property string iconName: {
charge < 0 ?
"battery-missing-symbolic" :
charge < 10 ?
charging ?
"battery-empty-charging-symbolic" :
"battery-empty-symbolic" :
charge < 25 ?
charging ?
"battery-caution-charging-symbolic" :
"battery-caution-symbolic" :
charge < 50 ?
charging ?
"battery-low-charging-symbolic" :
"battery-low-symbolic" :
charge < 75 ?
charging ?
"battery-good-charging-symbolic" :
"battery-good-symbolic" :
charging ?
"battery-full-charging-symbolic":
"battery-full-symbolic"
if (charge < 0) {
return "battery-missing-symbolic";
} else if (charge < 10) {
return charging
? "battery-empty-charging-symbolic"
: "battery-empty-symbolic";
} else if (charge < 25) {
return charging
? "battery-caution-charging-symbolic"
: "battery-caution-symbolic";
} else if (charge < 50) {
return charging
? "battery-low-charging-symbolic"
: "battery-low-symbolic";
} else if (charge < 75) {
return charging
? "battery-good-charging-symbolic"
: "battery-good-symbolic";
} else {
return charging
? "battery-full-charging-symbolic"
: "battery-full-symbolic";
}
}
onAvailableChanged: {
if (available) {
battery = DeviceBatteryDbusInterfaceFactory.create(device.id())
battery = KDEConnect.DeviceBatteryDbusInterfaceFactory.create(device.id());
} else {
battery = null
battery = null;
}
}
}

View file

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

View file

@ -1,32 +1,44 @@
/*
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.Layouts
import org.kde.kirigami as Kirigami
import org.kde.plasma.plasmoid
DropArea {
onEntered: {
id: root
required property PlasmoidItem plasmoidItem
onEntered: drag => {
if (drag.hasUrls) {
root.expanded = true;
root.plasmoidItem.expanded = true;
}
}
MouseArea {
id: kdeConnectMouseArea
anchors.fill: parent
onClicked: {
root.expanded = !root.expanded;
property bool wasExpanded: false
onPressed: mouse => {
wasExpanded = root.plasmoidItem.expanded;
}
onClicked: mouse => {
root.plasmoidItem.expanded = !root.plasmoidItem.expanded;
}
}
Kirigami.Icon {
id: kdeConnectIcon
anchors.fill: parent
source: plasmoid.icon
source: Plasmoid.icon
}
}

View file

@ -1,24 +1,27 @@
/**
* 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.plasma.core as PlasmaCore
import org.kde.kdeconnect
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
property alias device: checker.device
readonly property alias available: checker.available
readonly property bool ready: connectivity
required property KDEConnect.DeviceDbusInterface device
readonly property PluginChecker pluginChecker: PluginChecker {
readonly property alias available: checker.available
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "connectivity_report"
device: root.device
}
/**
@ -37,20 +40,22 @@ QtObject {
* The parsing from Android values into these strings is handled in the
* [ConnectivityReportPlugin.networkTypeToString method](https://invent.kde.org/network/kdeconnect-android/-/blob/master/src/org/kde/kdeconnect/Plugins/ConnectivityReportPlugin/ConnectivityReportPlugin.java#L82)
*/
readonly property string networkType: connectivity ? connectivity.cellularNetworkType : i18n("Unknown")
readonly property string networkType: connectivity?.cellularNetworkType ?? i18n("Unknown")
/**
* Reports a value between 0 and 4 (inclusive) which represents the strength of the cellular connection
*/
readonly property int signalStrength: connectivity ? connectivity.cellularNetworkStrength : -1
property string displayString: {
if (ready) {
readonly property int signalStrength: connectivity?.cellularNetworkStrength ?? -1
readonly property string displayString: {
if (connectivity !== null) {
return `${networkType} ${signalStrength}/4`;
} else {
return i18n("No signal");
}
}
property variant connectivity: null
property KDEConnect.ConnectivityReportDbusInterface connectivity
/**
* Suggests an icon name to use for the current signal level
@ -60,27 +65,27 @@ QtObject {
*/
readonly property string iconName: {
// Firstly, get the name prefix which represents the signal strength
var signalStrengthIconName =
(signalStrength < 0 || !ready) ?
const signalStrengthIconName =
(signalStrength < 0 || connectivity === null) ?
// As long as the signal strength is nonsense or the plugin reports as non-ready,
// show us as disconnected
"network-mobile-off" :
(signalStrength == 0) ?
(signalStrength === 0) ?
"network-mobile-0" :
(signalStrength == 1) ?
(signalStrength === 1) ?
"network-mobile-20" :
(signalStrength == 2) ?
(signalStrength === 2) ?
"network-mobile-60" :
(signalStrength == 3) ?
(signalStrength === 3) ?
"network-mobile-80" :
(signalStrength == 4) ?
(signalStrength === 4) ?
"network-mobile-100" :
// Since all possible values are enumerated above, this default case should never be hit.
// However, I need it in order for my ternary syntax to be valid!
"network-mobile-available"
"network-mobile-available";
// If we understand the network type, append to the icon name to show the type
var networkTypeSuffix =
const networkTypeSuffix =
(networkType === "5G") ?
// No icon for this case!
"" :
@ -110,15 +115,16 @@ QtObject {
// GSconnect just uses the 2g icon
// No icon for this case!
"" :
"" // We didn't recognize the network type. Don't append anything.
return signalStrengthIconName + networkTypeSuffix
""; // We didn't recognize the network type. Don't append anything.
return signalStrengthIconName + networkTypeSuffix;
}
onAvailableChanged: {
if (available) {
connectivity = DeviceConnectivityReportDbusInterfaceFactory.create(device.id())
connectivity = KDEConnect.DeviceConnectivityReportDbusInterfaceFactory.create(device.id());
} else {
connectivity = null
connectivity = null;
}
}
}

View file

@ -1,24 +1,25 @@
/**
* 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
*/
import QtQuick
import QtQuick.Layouts
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.components as PlasmaComponents
import org.kde.kdeconnect
import QtQuick.Controls
import org.kde.kirigami as Kirigami
import org.kde.plasma.extras as PlasmaExtras
import QtQuick.Dialogs
import QtCore
import QtQuick
import QtQuick.Dialogs as QtDialogs
import QtQuick.Layouts
PlasmaComponents.ItemDelegate
{
import org.kde.kdeconnect as KDEConnect
import org.kde.kirigami as Kirigami
import org.kde.plasma.components as PlasmaComponents
import org.kde.plasma.core as PlasmaCore
import org.kde.plasma.extras as PlasmaExtras
PlasmaComponents.ItemDelegate {
id: root
readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId)
readonly property KDEConnect.DeviceDbusInterface device: KDEConnect.DeviceDbusInterfaceFactory.create(model.deviceId)
hoverEnabled: false
down: false
@ -35,23 +36,10 @@ PlasmaComponents.ItemDelegate
id: fileDropArea
anchors.fill: parent
onDropped: {
onDropped: drop => {
if (drop.hasUrls) {
var urls = [];
for (var v in drop.urls) {
if (drop.urls[v] != null) {
if (urls.indexOf(drop.urls[v].toString()) == -1) {
urls.push(drop.urls[v].toString());
}
}
}
var i;
for (i = 0; i < urls.length; i++) {
share.plugin.shareUrl(urls[i]);
}
const urls = new Set(drop.urls.map(url => url.toString()));
urls.forEach(url => share.plugin.shareUrl(url));
}
drop.accepted = true;
}
@ -68,8 +56,7 @@ PlasmaComponents.ItemDelegate
contentItem: ColumnLayout {
spacing: Kirigami.Units.smallSpacing
RowLayout
{
RowLayout {
width: parent.width
spacing: Kirigami.Units.smallSpacing
@ -119,9 +106,10 @@ PlasmaComponents.ItemDelegate
}
}
}
RowLayout
{
RowLayout {
id: connectionInformation
visible: connectivity.available
spacing: Kirigami.Units.smallSpacing
@ -147,10 +135,10 @@ PlasmaComponents.ItemDelegate
}
}
RowLayout
{
RowLayout {
id: batteryInformation
visible: (battery.available && battery.charge > -1)
visible: battery.available && battery.charge > -1
spacing: Kirigami.Units.smallSpacing
Kirigami.Icon {
@ -171,6 +159,7 @@ PlasmaComponents.ItemDelegate
PlasmaComponents.ToolButton {
id: overflowMenu
icon.name: "application-menu"
checked: menu.status === PlasmaExtras.Menu.Open
@ -181,35 +170,35 @@ PlasmaComponents.ItemDelegate
visualParent: overflowMenu
placement: PlasmaExtras.Menu.BottomPosedLeftAlignedPopup
//Share
PlasmaExtras.MenuItem
{
property FileDialog data: FileDialog {
// Share
PlasmaExtras.MenuItem {
id: shareFile
readonly property QtDialogs.FileDialog data: QtDialogs.FileDialog {
id: fileDialog
title: i18n("Please choose a file")
currentFolder: StandardPaths.writableLocation(StandardPaths.HomeLocation)
fileMode: FileDialog.OpenFiles
fileMode: QtDialogs.FileDialog.OpenFiles
onAccepted: fileDialog.selectedFiles.forEach(url => share.plugin.shareUrl(url))
}
id: shareFile
icon: "document-share"
visible: share.available
text: i18n("Share file")
onClicked: fileDialog.open()
}
//Clipboard
PlasmaExtras.MenuItem
{
property Clipboard data: Clipboard {
// Clipboard
PlasmaExtras.MenuItem {
id: sendclipboard
readonly property Clipboard data: Clipboard {
id: clipboard
device: root.device
}
id: sendclipboard
icon: "klipper"
visible: clipboard.available && clipboard.clipboard.isAutoShareDisabled
visible: clipboard.clipboard?.isAutoShareDisabled ?? false
text: i18n("Send Clipboard")
onClicked: {
@ -218,15 +207,15 @@ PlasmaComponents.ItemDelegate
}
//Find my phone
PlasmaExtras.MenuItem
{
property FindMyPhone data: FindMyPhone {
// Find my phone
PlasmaExtras.MenuItem {
id: ring
readonly property FindMyPhone data: FindMyPhone {
id: findmyphone
device: root.device
}
id: ring
icon: "irc-voice"
visible: findmyphone.available
text: i18n("Ring my phone")
@ -236,15 +225,15 @@ PlasmaComponents.ItemDelegate
}
}
//SFTP
PlasmaExtras.MenuItem
{
property Sftp data: Sftp {
// SFTP
PlasmaExtras.MenuItem {
id: browse
readonly property Sftp data: Sftp {
id: sftp
device: root.device
}
id: browse
icon: "document-open-folder"
visible: sftp.available
text: i18n("Browse this device")
@ -254,10 +243,9 @@ PlasmaComponents.ItemDelegate
}
}
//SMS
PlasmaExtras.MenuItem
{
property SMS data: SMS {
// SMS
PlasmaExtras.MenuItem {
readonly property SMS data: SMS {
id: sms
device: root.device
}
@ -274,7 +262,7 @@ PlasmaComponents.ItemDelegate
}
}
//RemoteKeyboard
// RemoteKeyboard
PlasmaComponents.ItemDelegate {
visible: remoteKeyboard.remoteState
Layout.fillWidth: true
@ -288,7 +276,7 @@ PlasmaComponents.ItemDelegate
text: i18n("Remote Keyboard")
}
RemoteKeyboard {
KDEConnect.RemoteKeyboard {
id: remoteKeyboard
device: root.device
Layout.fillWidth: true
@ -296,9 +284,9 @@ PlasmaComponents.ItemDelegate
}
}
//Notifications
// Notifications
PlasmaComponents.ItemDelegate {
visible: notificationsModel.count>0
visible: notificationsModel.count > 0
enabled: true
Layout.fillWidth: true
@ -314,19 +302,23 @@ PlasmaComponents.ItemDelegate
visible: notificationsModel.isAnyDimissable;
Layout.alignment: Qt.AlignRight
icon.name: "edit-clear-history"
ToolTip.text: i18n("Dismiss all notifications")
PlasmaComponents.ToolTip.text: i18n("Dismiss all notifications")
onClicked: notificationsModel.dismissAll();
}
}
}
Repeater {
id: notificationsView
model: NotificationsModel {
model: KDEConnect.NotificationsModel {
id: notificationsModel
deviceId: root.device.id()
}
delegate: PlasmaComponents.ItemDelegate {
id: listitem
enabled: true
onClicked: checked = !checked
Layout.fillWidth: true
@ -349,7 +341,7 @@ PlasmaComponents.ItemDelegate
PlasmaComponents.Label {
id: notificationLabel
text: appName + ": " + (title.length>0 ? (appName==title?notitext:title+": "+notitext) : model.name)
text: appName + ": " + (title.length > 0 ? (appName == title ? notitext : title + ": " + notitext) : model.name)
elide: listitem.checked ? Text.ElideNone : Text.ElideRight
maximumLineCount: listitem.checked ? 0 : 1
wrapMode: Text.WordWrap
@ -361,7 +353,7 @@ PlasmaComponents.ItemDelegate
visible: repliable
enabled: repliable && !replying
icon.name: "mail-reply-sender"
ToolTip.text: i18n("Reply")
PlasmaComponents.ToolTip.text: i18n("Reply")
onClicked: { replying = true; replyTextField.forceActiveFocus(); }
}
@ -371,7 +363,7 @@ PlasmaComponents.ItemDelegate
enabled: dismissable
Layout.alignment: Qt.AlignRight
icon.name: "window-close"
ToolTip.text: i18n("Dismiss")
PlasmaComponents.ToolTip.text: i18n("Dismiss")
onClicked: dbusInterface.dismiss();
}
}
@ -401,12 +393,12 @@ PlasmaComponents.ItemDelegate
placeholderText: i18nc("@info:placeholder", "Reply to %1…", appName)
wrapMode: TextEdit.Wrap
Layout.fillWidth: true
Keys.onPressed: {
if ((event.key == Qt.Key_Return || event.key == Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) {
Keys.onPressed: event => {
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && !(event.modifiers & Qt.ShiftModifier)) {
replySendButton.clicked();
event.accepted = true;
}
if (event.key == Qt.Key_Escape) {
if (event.key === Qt.Key_Escape) {
replyCancelButton.clicked();
event.accepted = true;
}
@ -431,13 +423,13 @@ PlasmaComponents.ItemDelegate
}
RemoteCommands {
id: rc
id: remoteCommands
device: root.device
}
// Commands
RowLayout {
visible: rc.available
visible: remoteCommands.available
width: parent.width
spacing: Kirigami.Units.smallSpacing
@ -446,25 +438,28 @@ PlasmaComponents.ItemDelegate
Layout.fillWidth: true
}
PlasmaComponents.Button
{
PlasmaComponents.Button {
id: addCommandButton
icon.name: "list-add"
ToolTip.text: i18n("Add command")
onClicked: rc.plugin.editCommands()
visible: rc.plugin && rc.plugin.canAddCommand
PlasmaComponents.ToolTip.text: i18n("Add command")
onClicked: remoteCommands.plugin.editCommands()
visible: remoteCommands.plugin?.canAddCommand ?? false
}
}
Repeater {
id: commandsView
visible: rc.available
model: RemoteCommandsModel {
visible: remoteCommands.available
model: KDEConnect.RemoteCommandsModel {
id: commandsModel
deviceId: rc.device.id()
deviceId: remoteCommands.device.id()
}
delegate: PlasmaComponents.ItemDelegate {
enabled: true
onClicked: rc.plugin.triggerCommand(key)
onClicked: remoteCommands.plugin?.triggerCommand(key)
Layout.fillWidth: true
contentItem: PlasmaComponents.Label {

View file

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

View file

@ -1,40 +1,43 @@
/**
* 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
*/
import QtQuick
import QtQuick.Controls
import org.kde.plasma.core as PlasmaCore
import QtQuick.Controls as QQC2
import QtQuick.Layouts
import org.kde.config as KConfig
import org.kde.kcmutils as KCMUtils
import org.kde.kdeconnect as KDEConnect
import org.kde.kirigami as Kirigami
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.extras as PlasmaExtras
import org.kde.kdeconnect as KdeConnect
import QtQuick.Layouts
import org.kde.kquickcontrolsaddons
import org.kde.kirigami as Kirigami
import org.kde.kcmutils as KCMUtils
import org.kde.config as KConfig
PlasmaExtras.Representation {
id: kdeconnect
property alias devicesModel: devicesView.model
collapseMarginsHint: true
KdeConnect.DevicesModel {
KDEConnect.DevicesModel {
id: allDevicesModel
}
KdeConnect.DevicesModel {
KDEConnect.DevicesModel {
id: pairedDevicesModel
displayFilter: KdeConnect.DevicesModel.Paired
displayFilter: KDEConnect.DevicesModel.Paired
}
PlasmaComponents3.ScrollView {
id: dialogItem
anchors.fill: parent
contentItem: ListView {
id: devicesView
spacing: Kirigami.Units.smallSpacing
delegate: DeviceDelegate {
@ -55,16 +58,16 @@ PlasmaExtras.Representation {
text: {
if (pairedDevicesModel.count >= 0) {
return pairedDevicesModel.count == 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count)
} else if (allDevicesModel.count == 0) {
return pairedDevicesModel.count === 0 ? i18n("No paired devices") : i18np("Paired device is unavailable", "All paired devices are unavailable", pairedDevicesModel.count)
} else if (allDevicesModel.count === 0) {
return i18n("Install KDE Connect on your Android device to integrate it with Plasma!")
}
}
helpfulAction: Action {
helpfulAction: QQC2.Action {
text: i18n("Pair a Device…")
icon.name: "list-add"
onTriggered: KCMUtils.KCMLauncher.openSystemSettings("kcm_kdeconnect")
enabled: pairedDevicesModel.count == 0 && KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect")
enabled: pairedDevicesModel.count === 0 && KConfig.KAuthorized.authorizeControlModule("kcm_kdeconnect")
}
PlasmaComponents3.Button {

View file

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

View file

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

View file

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

View file

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

View file

@ -1,23 +1,29 @@
/**
* SPDX-FileCopyrightText: 2021 Aleix Pol i Gonzalez <aleixpol@kde.org>
* SPDX-FileCopyrightText: 2021 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
*/
import QtQuick
import org.kde.plasma.core as PlasmaCore
import org.kde.kdeconnect
pragma ComponentBehavior: Bound
import QtQuick
import org.kde.kdeconnect as KDEConnect
QtObject {
id: root
required property KDEConnect.DeviceDbusInterface device
QtObject
{
property alias device: checker.device
readonly property alias available: checker.available
readonly property PluginChecker pluginChecker: PluginChecker {
readonly property KDEConnect.PluginChecker pluginChecker: KDEConnect.PluginChecker {
id: checker
pluginName: "virtualmonitor"
device: root.device
}
readonly property QtObject plugin: available ? VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
readonly property KDEConnect.VirtualmonitorDbusInterface plugin:
available ? KDEConnect.VirtualmonitorDbusInterfaceFactory.create(device.id()) : null
}

View file

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