[plasma/plasma-bigscreen] kcms/kdeconnect/ui: kcms/kdeconnect: add plugins page

Devin Lin <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit d796e6c37c0041f462f7d9e613b22f5c54c22a05 by Devin Lin, on behalf of User8395.
Committed on 31/07/2026 at 02:55.
Pushed by devinlin into branch 'master'.

kcms/kdeconnect: add plugins page

BUG: 522247

Adds a page to manage KDE Connect plugins for a specific device.

An issue that has arisen is that the config pages for the specific plugins are not keyboard navigation friendly, and each config QML would have to be modified in [network/kdeconnect-kde](https://invent.kde.org/network/kdeconnect-kde) to support keyboard navigation and/or make it fit within the Bigscreen UI.

![Screencast_20260726_145008](/uploads/59da1af025d7fcf4634c91d7c692f552/Screencast_20260726_145008.webm)

M  +4    -0    kcms/kdeconnect/ui/DeviceConnectionSidebar.qml
A  +96   -0    kcms/kdeconnect/ui/PluginsPage.qml     [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
M  +10   -0    kcms/kdeconnect/ui/delegates/PairedView.qml

https://invent.kde.org/plasma/plasma-bigscreen/-/commit/d796e6c37c0041f462f7d9e613b22f5c54c22a05

diff --git a/kcms/kdeconnect/ui/DeviceConnectionSidebar.qml b/kcms/kdeconnect/ui/DeviceConnectionSidebar.qml
index a1a85f08..315a15ef 100644
--- a/kcms/kdeconnect/ui/DeviceConnectionSidebar.qml
+++ b/kcms/kdeconnect/ui/DeviceConnectionSidebar.qml
@@ -98,6 +98,10 @@ Bigscreen.SidebarOverlay {
                     root.close()
                     connectionView.forceActiveFocus();
                 }
+                onPluginsPage: {
+                    root.close()
+                    kcm.push("PluginsPage.qml", { currentDevice })
+                }
             }
 
             Delegates.Unreachable { 
diff --git a/kcms/kdeconnect/ui/PluginsPage.qml b/kcms/kdeconnect/ui/PluginsPage.qml
new file mode 100644
index 00000000..9ffa964f
--- /dev/null
+++ b/kcms/kdeconnect/ui/PluginsPage.qml
@@ -0,0 +1,96 @@
+/*
+ * SPDX-FileCopyrightText: 2026 User8395 <[email protected]>
+ * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+import QtQuick.Layouts
+import QtQuick
+import QtQuick.Window
+import QtQuick.Controls as QQC2
+
+import org.kde.kirigami as Kirigami
+import org.kde.kcmutils as KCM
+import org.kde.bigscreen as Bigscreen
+import org.kde.kdeconnect
+
+Bigscreen.ScrollablePage {
+    id: pluginsPage
+
+    property QtObject currentDevice
+
+    title: i18nc("%1 is the device name", "Plugin Settings for %1 ", currentDevice.name)
+    
+    leftPadding: Kirigami.Units.smallSpacing
+    topPadding: Kirigami.Units.smallSpacing
+    rightPadding: Kirigami.Units.smallSpacing
+    bottomPadding: Kirigami.Units.smallSpacing
+
+    Component.onCompleted: {
+        pluginList.forceActiveFocus()
+    }
+
+    PluginModel {
+        id: pluginModel
+        deviceId: currentDevice.id()
+    }
+
+    ColumnLayout {
+        KeyNavigation.left: root.KeyNavigation.left
+        spacing: 0
+
+        ListView {
+            id: pluginList
+            clip: true
+            spacing: Kirigami.Units.smallSpacing
+
+            Layout.fillWidth: true
+            implicitHeight: contentHeight
+
+            model: pluginModel            
+
+            delegate: Bigscreen.SwitchDelegate {
+                id: pluginDelegate
+                width: model.configSource != "" ? pluginList.width - Kirigami.Units.gridUnit * 5 : pluginList.width
+                KeyNavigation.right: model.configSource != "" ? pluginConfigButton : null
+
+                text: model.name
+                description: model.description
+                icon.name: model.iconName
+                checked: model.isChecked
+
+                onToggled: model.isChecked = checked
+
+                Bigscreen.ButtonDelegate {
+                    id: pluginConfigButton
+                    visible: model.configSource != "" 
+
+                    width: Kirigami.Units.gridUnit * 5
+                    height: pluginDelegate.height
+                    anchors.left: pluginDelegate.right
+
+                    onClicked: {
+                        pluginConfigDialog.open()
+                    }
+                    
+                    contentItem: Kirigami.Icon {
+                        source: 'settings-configure'
+                        Layout.alignment: Qt.AlignCenter
+                    }
+
+                    Bigscreen.Dialog {
+                        id: pluginConfigDialog
+                        title: model.name
+                        standardButtons: Bigscreen.Dialog.Close
+
+                        onOpened: pluginConfigLoader.forceActiveFocus()
+
+                        contentItem: Loader {
+                            id: pluginConfigLoader
+                            source: model.configSource
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/kcms/kdeconnect/ui/delegates/PairedView.qml b/kcms/kdeconnect/ui/delegates/PairedView.qml
index 91a28199..c4d27f27 100644
--- a/kcms/kdeconnect/ui/delegates/PairedView.qml
+++ b/kcms/kdeconnect/ui/delegates/PairedView.qml
@@ -20,6 +20,7 @@ Item {
     Layout.fillHeight: true
 
     signal unpairRequested()
+    signal pluginsPage()
 
     onActiveFocusChanged: {
         if (activeFocus) {
@@ -42,6 +43,15 @@ Item {
             onClicked: root.unpairRequested()
             text: i18n("Unpair")
             icon.name: 'network-disconnect'
+            KeyNavigation.down: pluginsBtn
+        }
+
+        Bigscreen.ButtonDelegate {
+            id: pluginsBtn
+            onClicked: root.pluginsPage()
+            text: i18n("Plugin Settings")
+            icon.name: 'settings-configure'
+            KeyNavigation.up: unpairBtn
         }
 
         Item { Layout.fillHeight: true }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.