[neon/neon-packaging/plasma-bigscreen/Neon/unstable] debian/patches: test out devin's new patches

Carlos De Maine null at kde.org
Tue Jun 17 04:39:09 BST 2025


Git commit 4a25d8106da55c6df3cf71a9aaa98f6e01f5f71a by Carlos De Maine.
Committed on 17/06/2025 at 03:39.
Pushed by carlosdem into branch 'Neon/unstable'.

test out devin's new patches

A  +329  -0    debian/patches/nlin_fixmediacenter.diff
A  +2    -0    debian/patches/series
A  +1166 -0    debian/patches/work_devinlin_settingsapp.diff

https://invent.kde.org/neon/neon-packaging/plasma-bigscreen/-/commit/4a25d8106da55c6df3cf71a9aaa98f6e01f5f71a

diff --git a/debian/patches/nlin_fixmediacenter.diff b/debian/patches/nlin_fixmediacenter.diff
new file mode 100644
index 0000000..534f1a0
--- /dev/null
+++ b/debian/patches/nlin_fixmediacenter.diff
@@ -0,0 +1,329 @@
+diff --git a/kcm/ui/+mediacenter/DeviceMap.qml b/kcm/ui/+mediacenter/DeviceMap.qml
+index 992c0816f95cf38424fe1bcf30fd2a9f9a3703bc..b8bbcd6a2af61a4c02f9838414b0cf7ee8a99490 100644
+--- a/kcm/ui/+mediacenter/DeviceMap.qml
++++ b/kcm/ui/+mediacenter/DeviceMap.qml
+@@ -1,16 +1,17 @@
+ /*
+     SPDX-FileCopyrightText: 2020 Aditya Mehra <aix.m at outlook.com>
+-    
++
+     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
+ */
+ 
+ import QtQuick 2.14
+ import QtQuick.Layouts 1.14
+ import QtQuick.Controls 2.14
+-import org.kde.plasma.components 2.0 as PlasmaComponents
++
+ import org.kde.kirigami 2.12 as Kirigami
+ import org.kde.kitemmodels 1.0 as KItemModels
+ import org.kde.private.kcm.remotecontrollers 1.0
++
+ import "./delegates" as Delegates
+ 
+ Item {
+@@ -53,9 +54,9 @@ Item {
+             ListView {
+                 id: buttonMapRepeater
+                 anchors.fill: parent
+-                model: KItemModels.KSortFilterProxyModel { 
++                model: KItemModels.KSortFilterProxyModel {
+                     sourceModel: kcm.keyMapModel
+-                    filterRole: "DeviceTypeRole"
++                    filterRoleName: "DeviceTypeRole"
+                     filterRowCallback: function(source_row, source_parent) {
+                         var filter_device = deviceMap.deviceType == 0 ? "CEC" : "GAMEPAD"
+                         return sourceModel.data(sourceModel.index(source_row, 0, source_parent), KeyMapModel.DeviceTypeRole).indexOf(filter_device) !== -1;
+diff --git a/kcm/ui/+mediacenter/DeviceSetupView.qml b/kcm/ui/+mediacenter/DeviceSetupView.qml
+index 220ade7448236dd2015ab873527f9b826285df29..1ce485860afea5c7ea12a8d37a4167dfeb3f61e0 100644
+--- a/kcm/ui/+mediacenter/DeviceSetupView.qml
++++ b/kcm/ui/+mediacenter/DeviceSetupView.qml
+@@ -9,12 +9,14 @@ import QtQuick 2.14
+ import QtQuick.Layouts 1.14
+ import QtQuick.Controls 2.14
+ import org.kde.plasma.core 2.0 as PlasmaCore
+-import org.kde.kirigami 2.20 as Kirigami
+-import org.kde.plasma.components 2.0 as PlasmaComponents2
+-import org.kde.plasma.components 3.0 as PlasmaComponents
+-import org.kde.mycroft.bigscreen 1.0 as BigScreen
+ import Qt5Compat.GraphicalEffects
+ 
++import org.kde.kirigami 2.20 as Kirigami
++import org.kde.plasma.components as PlasmaComponents
++import org.kde.plasma.extras as PlasmaExtras
++import org.kde.bigscreen 1.0 as BigScreen
++
++
+ Rectangle {
+     id: deviceView
+     color: Kirigami.Theme.backgroundColor
+@@ -35,13 +37,13 @@ Rectangle {
+             deviceView.ignoreEvent = false
+         }
+     }
+-    
++
+     onActiveFocusChanged: {
+         if(activeFocus){
+             deviceMapView.forceActiveFocus()
+         }
+     }
+-    
++
+     ColumnLayout {
+         id: colLayoutSettingsItem
+         clip: true
+@@ -58,7 +60,7 @@ Rectangle {
+             Layout.fillWidth: true
+             Layout.preferredHeight: parent.height * 0.10
+         }
+-        
++
+         Item {
+             Layout.fillWidth: true
+             Layout.preferredHeight: dIcon.height + (label2.height + Kirigami.Units.largeSpacing * 2)
+@@ -66,23 +68,23 @@ Rectangle {
+ 
+             Rectangle {
+                 id: dIcon
+-                anchors.top: headrSept.bottom
++                anchors.top: parent.top
+                 anchors.topMargin: Kirigami.Units.largeSpacing
+                 anchors.horizontalCenter: parent.horizontalCenter
+                 width: Kirigami.Units.iconSizes.huge
+                 height: width
+                 radius: 100
+                 color: Kirigami.Theme.backgroundColor
+-                
++
+                 Kirigami.Icon {
+                     id: deviceIconStatus
+                     anchors.centerIn: parent
+                     width: Kirigami.Units.iconSizes.large
+                     height: width
+-                    source: currentDevice.deviceIconName
++                    source: currentDevice ? currentDevice.deviceIconName : ''
+                 }
+             }
+-            
++
+             Kirigami.Heading {
+                 id: label2
+                 width: parent.width
+@@ -94,7 +96,7 @@ Rectangle {
+                 maximumLineCount: 2
+                 elide: Text.ElideRight
+                 color: PlasmaCore.ColorScope.textColor
+-                text: i18n(currentDevice.deviceName)
++                text: currentDevice ? currentDevice.deviceName : ''
+             }
+ 
+             Kirigami.Separator {
+@@ -123,15 +125,15 @@ Rectangle {
+         anchors.margins: Kirigami.Units.largeSpacing * 2
+         height: Kirigami.Units.gridUnit * 2
+ 
+-        PlasmaComponents2.Button {
++        PlasmaComponents.Button {
+             id: backBtnSettingsItem
+-            iconSource: "arrow-left"
++            icon.name: "arrow-left"
+             Layout.alignment: Qt.AlignLeft
+ 
+             KeyNavigation.up: deviceMapView
+             KeyNavigation.down: deviceMapView
+ 
+-            PlasmaComponents2.Highlight {
++            PlasmaExtras.Highlight {
+                 z: -2
+                 anchors.fill: parent
+                 anchors.margins: -Kirigami.Units.gridUnit / 4
+diff --git a/kcm/ui/+mediacenter/delegates/DeviceDelegate.qml b/kcm/ui/+mediacenter/delegates/DeviceDelegate.qml
+index bafa9f20b2809d457f572ec002b57d52e694eab0..00a467d399fb554578fed5e129c72f7fad3cf777 100644
+--- a/kcm/ui/+mediacenter/delegates/DeviceDelegate.qml
++++ b/kcm/ui/+mediacenter/delegates/DeviceDelegate.qml
+@@ -8,12 +8,12 @@
+ import QtQuick 2.14
+ import QtQuick.Layouts 1.14
+ import QtQuick.Controls 2.14
++import Qt5Compat.GraphicalEffects
++
+ import org.kde.plasma.core 2.0 as PlasmaCore
+-import org.kde.kirigami 2.20 as Kirigami
+-import org.kde.plasma.components 2.0 as PlasmaComponents2
+-import org.kde.plasma.components 3.0 as PlasmaComponents
+-import org.kde.mycroft.bigscreen 1.0 as BigScreen
+-import QtGraphicalEffects 1.14
++import org.kde.kirigami as Kirigami
++import org.kde.plasma.components as PlasmaComponents
++import org.kde.bigscreen 1.0 as BigScreen
+ 
+ BigScreen.AbstractDelegate {
+     id: delegate
+@@ -22,18 +22,18 @@ BigScreen.AbstractDelegate {
+     implicitHeight: listView.height
+     property QtObject device: model
+     property var deviceType: model.deviceType
+-    
++
+     Behavior on implicitWidth {
+         NumberAnimation {
+             duration: Kirigami.Units.longDuration
+             easing.type: Easing.InOutQuad
+         }
+     }
+-    
++
+     Keys.onReturnPressed: {
+         clicked();
+     }
+-    
++
+     onClicked: {
+         listView.currentIndex = index
+         deviceSetupView.forceActiveFocus()
+@@ -41,13 +41,13 @@ BigScreen.AbstractDelegate {
+ 
+     contentItem: Item {
+         id: deviceItemLayout
+-        
++
+         Item {
+             id: deviceSvgIcon
+             width: Kirigami.Units.iconSizes.huge
+             height: width
+             y: deviceItemLayout.height / 2 - deviceSvgIcon.height / 2
+-            
++
+             Kirigami.Icon {
+                 anchors.centerIn: parent
+                 source: model.deviceIconName
+@@ -55,10 +55,10 @@ BigScreen.AbstractDelegate {
+                 height: width
+             }
+         }
+-        
++
+         ColumnLayout {
+             id: textLayout
+-            
++
+             anchors {
+                 left: deviceSvgIcon.right
+                 right: deviceItemLayout.right
+diff --git a/kcm/ui/+mediacenter/main.qml b/kcm/ui/+mediacenter/main.qml
+index 6b2fd03765904afa68114b86f81c922b701460a8..73d4d73181c2536033d980cc41122277d42ad85b 100644
+--- a/kcm/ui/+mediacenter/main.qml
++++ b/kcm/ui/+mediacenter/main.qml
+@@ -5,15 +5,17 @@
+ 
+ */
+ 
+-import QtQuick.Layouts 1.14
+-import QtQuick 2.14
+-import QtQuick.Window 2.14
+-import QtQuick.Controls 2.14
+-import org.kde.kirigami 2.20 as Kirigami
+-import org.kde.plasma.components 2.0 as PlasmaComponents
++import QtQuick
++import QtQuick.Layouts
++import QtQuick.Window
++import QtQuick.Controls
++
++import org.kde.kirigami as Kirigami
++import org.kde.plasma.components as PlasmaComponents
+ import org.kde.kcmutils as KCM
+-import org.kde.mycroft.bigscreen 1.0 as BigScreen
++import org.kde.bigscreen 1.0 as BigScreen
+ import org.kde.private.kcm.remotecontrollers 1.0
++
+ import "+mediacenter/delegates" as Delegates
+ 
+ KCM.SimpleKCM {
+@@ -67,49 +69,6 @@ KCM.SimpleKCM {
+             }
+         }
+ 
+-        Item {
+-            id: footerMain
+-            anchors.left: parent.left
+-            anchors.right: deviceSetupView.left
+-            anchors.leftMargin: -Kirigami.Units.largeSpacing
+-            anchors.bottom: parent.bottom
+-            implicitHeight: Kirigami.Units.gridUnit * 2
+-
+-            Button {
+-                id: kcmcloseButton
+-                implicitHeight: Kirigami.Units.gridUnit * 2
+-                width: supportedControllers.count > 0 ? parent.width : (root.width + Kirigami.Units.largeSpacing)
+-
+-                background: Rectangle {
+-                    color: kcmcloseButton.activeFocus ? Kirigami.Theme.highlightColor : Kirigami.Theme.backgroundColor
+-                }
+-
+-                contentItem: Item {
+-                    RowLayout {
+-                        anchors.centerIn: parent
+-                        Kirigami.Icon {
+-                            Layout.preferredWidth: Kirigami.Units.iconSizes.small
+-                            Layout.preferredHeight: Kirigami.Units.iconSizes.small
+-                            source: "window-close"
+-                        }
+-                        Label {
+-                            text: i18n("Exit")
+-                        }
+-                    }
+-                }
+-
+-                Keys.onUpPressed: connectionView.forceActiveFocus()
+-
+-                onClicked: {
+-                    Window.window.close()
+-                }
+-
+-                Keys.onReturnPressed: {
+-                    Window.window.close()
+-                }
+-            }
+-        }
+-
+         Item {
+             clip: true
+             anchors.left: parent.left
+@@ -125,12 +84,12 @@ KCM.SimpleKCM {
+                 BigScreen.TileView {
+                     id: connectionView
+                     focus: true
+-                    model:  supportedControllers
++                    model: supportedControllers
+                     Layout.alignment: Qt.AlignTop
+                     cellWidth: (Kirigami.Units.iconSizes.huge + Kirigami.Units.largeSpacing*6)
+                     title: supportedControllers.count > 0 ? i18n("Found Devices") : i18n("No Devices Found")
+                     currentIndex: 0
+-                    delegate: Delegates.DeviceDelegate{}
++                    delegate: Delegates.DeviceDelegate {}
+                     navigationDown: kcmcloseButton
+                     Behavior on x {
+                         NumberAnimation {
+@@ -138,7 +97,7 @@ KCM.SimpleKCM {
+                             easing.type: Easing.InOutQuad
+                         }
+                     }
+-                    
++
+                     onCurrentItemChanged: {
+                         deviceSetupView.currentDevice = currentItem.device
+                         deviceSetupView.deviceType = currentItem.deviceType
+@@ -196,9 +155,9 @@ KCM.SimpleKCM {
+             Connections {
+                 target: kcm
+                 onGamepadKeyPressed: {
+-                    if(keySetupGamepadPopUp.opened) {
+-                        if(kcm.gamepadKeyConfig("ButtonEnter") == keyCode) {
+-                            deviceSetupView.ignoreEvent = true       
++                    if (keySetupGamepadPopUp.opened) {
++                        if (kcm.gamepadKeyConfig("ButtonEnter") == keyCode) {
++                            deviceSetupView.ignoreEvent = true
+                         }
+                         kcm.setGamepadKeyConfig(keySetupGamepadPopUp.keyType[1], keyCode)
+                         keySetupGamepadPopUp.close()
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..4a72fdb
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,2 @@
+work_devinlin_settingsapp.diff
+work_devinlin_fixmediacenter.diff
diff --git a/debian/patches/work_devinlin_settingsapp.diff b/debian/patches/work_devinlin_settingsapp.diff
new file mode 100644
index 0000000..ed27d5b
--- /dev/null
+++ b/debian/patches/work_devinlin_settingsapp.diff
@@ -0,0 +1,1166 @@
+diff --git a/components/qml/AbstractDelegate.qml b/components/qml/AbstractDelegate.qml
+index c3ce0333f3306b409344f4599039cb1b8a268ab2..b006f9c137ccb275eb8f2d95096f9cae0eed47b3 100644
+--- a/components/qml/AbstractDelegate.qml
++++ b/components/qml/AbstractDelegate.qml
+@@ -28,14 +28,14 @@ QQC2.ItemDelegate {
+         return null;
+     }
+     readonly property bool isCurrent: {//print(text+index+" "+listView.currentIndex+activeFocus+" "+listView.moving)
+-        listView.currentIndex == index && activeFocus && !listView.moving
++        listView && listView.currentIndex == index && activeFocus && !listView.moving
+     }
+ 
+     highlighted: isCurrent
+     property int shadowSize: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
+     property int borderSize: Kirigami.Units.smallSpacing
+     property int baseRadius: 6
+-    
++
+     z: isCurrent ? 2 : 0
+ 
+     onClicked: {
+diff --git a/components/qml/KCMAbstractDelegate.qml b/components/qml/KCMAbstractDelegate.qml
+index 69ed75bbfaf8cc2d8e650fdc35eab761052b84a0..90bbe5b4daf46c6f42f51c3036927235e3cf4cab 100644
+--- a/components/qml/KCMAbstractDelegate.qml
++++ b/components/qml/KCMAbstractDelegate.qml
+@@ -6,13 +6,17 @@
+ import QtQuick
+ import QtQuick.Layouts
+ import QtQuick.Controls
++
+ import org.kde.plasma.components as PlasmaComponents
+ import org.kde.kirigami as Kirigami
+ 
+ AbstractDelegate {
+     id: delegate
+-    implicitWidth: listView.cellWidth * 2.5
+-    implicitHeight: listView.height + Kirigami.Units.largeSpacing
++
++    property var listView: ListView.view
++    implicitWidth: listView ? listView.cellWidth * 2.5 : 0
++    implicitHeight: listView ? listView.height + Kirigami.Units.largeSpacing : 0
++
+     property alias itemIcon: contentItemSvgIcon.source
+     property alias itemLabel: contentItemLabel.text
+     property alias itemLabelVisible: contentItemLabel.visible
+@@ -37,7 +41,7 @@ AbstractDelegate {
+     }
+ 
+     Keys.onLeftPressed: (event)=> {
+-        if(listView.currentIndex == 0){
++        if(listView && listView.currentIndex == 0){
+             settingMenuItemFocus()
+         } else {
+             event.accepted = false
+@@ -46,17 +50,17 @@ AbstractDelegate {
+ 
+     contentItem: Item {
+         id: contentItemLayout
+-        
++
+         Kirigami.Icon {
+             id: contentItemSvgIcon
+             width: Kirigami.Units.iconSizes.huge
+             height: width
+             y: contentItemLayout.height/2 - contentItemSvgIcon.height/2
+         }
+-        
++
+         ColumnLayout {
+             id: textLayout
+-            
++
+             anchors {
+                 left: contentItemSvgIcon.right
+                 right: contentItemLayout.right
+@@ -77,7 +81,7 @@ AbstractDelegate {
+                 color: Kirigami.Theme.textColor
+                 font: itemLabelFont
+             }
+-            
++
+             PlasmaComponents.Label {
+                 id: contentItemSubLabel
+                 Layout.fillWidth: true
+@@ -91,7 +95,7 @@ AbstractDelegate {
+                 font.pixelSize: contentItemLabel.font.pixelSize * 0.8
+             }
+         }
+-        
++
+         Item {
+             id: contentItemRepresentationLayout
+             anchors.right: parent.right
+@@ -102,8 +106,8 @@ AbstractDelegate {
+             Kirigami.Icon {
+                 id: contentItemTickIcon
+                 anchors.centerIn: parent
+-                width: listView.currentIndex == index && delegate.activeFocus ? Kirigami.Units.iconSizes.medium : Kirigami.Units.iconSizes.smallMedium
+-                height: listView.currentIndex == index && delegate.activeFocus ? Kirigami.Units.iconSizes.medium : Kirigami.Units.iconSizes.smallMedium
++                width: listView && listView.currentIndex == index && delegate.activeFocus ? Kirigami.Units.iconSizes.medium : Kirigami.Units.iconSizes.smallMedium
++                height: listView && listView.currentIndex == index && delegate.activeFocus ? Kirigami.Units.iconSizes.medium : Kirigami.Units.iconSizes.smallMedium
+             }
+         }
+     }
+diff --git a/containments/homescreen/package/contents/ui/ConfigWindow.qml b/containments/homescreen/package/contents/ui/ConfigWindow.qml
+deleted file mode 100644
+index 37cdc557d0326f1c41a6d059d8a346ef5d5cb285..0000000000000000000000000000000000000000
+--- a/containments/homescreen/package/contents/ui/ConfigWindow.qml
++++ /dev/null
+@@ -1,427 +0,0 @@
+-/*
+-    SPDX-FileCopyrightText: 2019 Marco Martin <mart at kde.org>
+-    SPDX-FileCopyrightText: 2019 Aditya Mehra <aix.m at outlook.com>
+-
+-    SPDX-License-Identifier: GPL-2.0-or-later
+-*/
+-
+-import QtQuick
+-import QtQuick.Layouts
+-import QtQuick.Window
+-import QtQuick.Controls as Controls
+-import org.kde.kirigami as Kirigami
+-import org.kde.bigscreen as Bigscreen
+-import org.kde.private.biglauncher 
+-import org.kde.plasma.private.nanoshell as NanoShell
+-
+-NanoShell.FullScreenOverlay {
+-    id: overlay
+-    width: Screen.desktopAvailableWidth
+-    height: Screen.desktopAvailableHeight
+-    visible: false
+-    color: "transparent"
+-    property var currentModuleName
+-    property var loadedKCMPage: null
+-
+-    Timer {
+-        id: timer
+-        function setTimeout(cb, delayTime) {
+-            timer.interval = delayTime;
+-            timer.repeat = false;
+-            timer.triggered.connect(cb);
+-            timer.triggered.connect(function release() {
+-                timer.triggered.disconnect(cb);
+-                timer.triggered.disconnect(release);
+-            });
+-            timer.start();
+-        }
+-    }
+-
+-    function showOverlay(moduleName=undefined) {
+-        if (!overlay.visible) {
+-            overlay.visible = true;
+-            timer.setTimeout(function () {
+-                menu.open();
+-                settingsKCMMenu.children[0].forceActiveFocus();
+-            }, 100);
+-        }
+-
+-        if (moduleName === undefined) {
+-            openModule(plasmoid.kcmsListModel.get(0).kcmId);
+-        } else {
+-            openModule(moduleName);
+-        }
+-    }
+-
+-    function hideOverlay() {
+-        if (overlay.visible) {
+-            timer.setTimeout(function () {
+-                menu.close();
+-            }, 200);
+-            overlay.visible = false;
+-        }
+-    }
+-
+-    function openModule(path) {
+-        if (path.indexOf("kcm_mediacenter_wallpaper") != -1) {
+-            hideOverlay();
+-            root.configureWallpaper();
+-        }
+-        
+-        module.path = path;
+-        while (pageStack.count >= 1) {
+-            pageStack.clear();
+-        }
+-        loadedKCMPage = kcmContainer.createObject(pageStack, {"kcm": module.kcm, "internalPage": module.kcm.mainUi, "lastSettingMenuItem": settingItemAtLastIndex()});
+-        pageStack.push(loadedKCMPage);
+-        currentModuleName = module.name;
+-    }
+-
+-    function settingItemAtLastIndex() {
+-        return settingsKCMMenu.children[settingsKCMMenu.lastIndex]
+-    }
+-
+-    Module {
+-        id: module
+-    }
+-
+-
+-    Kirigami.ShadowedRectangle {
+-        id: configContentItem
+-        color: Kirigami.Theme.backgroundColor
+-        anchors.fill: parent
+-
+-        Item {
+-            id: menu
+-            width: Screen.desktopAvailableWidth * 0.3
+-            height: parent.height
+-            opacity: 0
+-            x: -menu.width
+-
+-            function open() {
+-                menu.opacity = 1;
+-                menu.x = 0;
+-            }
+-            function close() {
+-                menu.opacity = 0;
+-                menu.x = -menu.width;
+-            }
+-
+-            Behavior on opacity {
+-                NumberAnimation {
+-                    duration: 50
+-                }
+-            }
+-
+-            Behavior on x {
+-                NumberAnimation {
+-                    duration: 50
+-                }
+-            }
+-
+-            Item {
+-                id: settingsHeader
+-                height: parent.height * 0.065
+-                anchors.top: parent.top
+-                anchors.left: parent.left
+-                anchors.right: parent.right
+-                anchors.margins: Kirigami.Units.largeSpacing
+-
+-                Kirigami.Heading {
+-                    id: settingsTitle
+-                    text: i18n("Settings")
+-                    anchors.fill: parent
+-                    anchors.margins: Kirigami.Units.largeSpacing
+-                    verticalAlignment: Text.AlignBottom
+-                    horizontalAlignment: Text.AlignLeft
+-                    font.bold: true
+-                    color: Kirigami.Theme.textColor
+-                    fontSizeMode: Text.Fit
+-                    minimumPixelSize: 16
+-                    font.pixelSize: 32
+-                }
+-            }
+-
+-            Kirigami.Separator {
+-                id: settingsSeparator
+-                anchors.top: settingsHeader.bottom
+-                anchors.left: parent.left
+-                anchors.right: parent.right
+-                Kirigami.Theme.colorSet: Kirigami.Theme.Button
+-                Kirigami.Theme.inherit: false
+-                color: Kirigami.Theme.backgroundColor
+-                height: 2
+-            }
+-
+-            ColumnLayout {
+-                id: settingsKCMMenu
+-                anchors.top: settingsSeparator.bottom
+-                anchors.left: parent.left
+-                anchors.right: parent.right
+-                anchors.margins: Kirigami.Units.largeSpacing
+-                property var lastIndex: 0
+-
+-                Repeater {
+-                    id: settingsKCMMenuModel
+-                    model: plasmoid.kcmsListModel
+-
+-                    delegate: Controls.Button {
+-                        id: kcmButton
+-                        property var modelData: typeof model !== "undefined" ? model : null
+-                        Layout.fillWidth: true
+-                        Layout.preferredHeight: Kirigami.Units.gridUnit * 5
+-                        Keys.onEscapePressed: hideOverlay()
+-
+-                        leftPadding: Kirigami.Units.gridUnit * 2
+-
+-                        onFocusChanged: {
+-                            if(focus) {
+-                                settingsKCMMenu.lastIndex = index;
+-                            }
+-                        }
+-
+-                        Keys.onDownPressed: {
+-                            if (index < settingsKCMMenuModel.count - 1) {
+-                                settingsKCMMenu.children[index + 1].forceActiveFocus();
+-                            } else {
+-                                kcmcloseButton.forceActiveFocus();
+-                            }
+-                        }
+-                        Keys.onUpPressed: {
+-                            if (index > 0) {
+-                                settingsKCMMenu.children[index - 1].forceActiveFocus();
+-                            } else {
+-                                kcmcloseButton.forceActiveFocus();
+-                            }
+-                        }
+-
+-                        // The about-distro KCM is not a native bigscreen kcm, so it eats keyboard inputs and softlocks us
+-                        KeyNavigation.right: (currentModuleName == "kcm_about-distro") ? null :  loadedKCMPage 
+-
+-                        onClicked: {
+-                            openModule(modelData.kcmId);
+-                        }
+-
+-                        Keys.onReturnPressed: {
+-                            openModule(modelData.kcmId);
+-                        }
+-
+-                        background: Rectangle {
+-                            id: kcmButtonBackground
+-                            Kirigami.Theme.colorSet: Kirigami.Theme.Button
+-                            Kirigami.Theme.inherit: false
+-                            color: (modelData.kcmId === currentModuleName) ? Kirigami.Theme.highlightColor : Kirigami.Theme.backgroundColor
+-                            radius: Kirigami.Units.largeSpacing
+-                            border.color: kcmButton.activeFocus ? Kirigami.Theme.linkColor : ((modelData.kcmId === currentModuleName) ? Kirigami.Theme.highlightColor : Kirigami.Theme.backgroundColor)
+-                            border.width: 3        
+-
+-                            Behavior on color {
+-                                ColorAnimation {
+-                                    duration: 100
+-                                }
+-                            }
+-                                         
+-                        }
+-
+-                        contentItem: Item {                            
+-                            RowLayout {
+-                                id: kcmButtonLayout
+-                                anchors.fill: parent
+-                                spacing: Kirigami.Units.gridUnit
+-
+-                                Kirigami.Icon {
+-                                    id: kcmButtonIcon
+-                                    source: modelData.kcmIconName
+-                                    Layout.alignment: Qt.AlignLeft
+-                                    Layout.preferredHeight: Kirigami.Units.iconSizes.large
+-                                    Layout.preferredWidth: kcmButtonIcon.height
+-                                }
+-
+-                                Kirigami.Heading {
+-                                    id: kcmButtonLabel
+-                                    text: modelData.kcmName
+-                                    wrapMode: Text.WordWrap
+-                                    elide: Text.ElideRight
+-                                    Layout.alignment: Qt.AlignLeft
+-                                    Layout.fillWidth: true
+-                                }
+-                            }
+-                        }
+-                    }
+-                }
+-            }
+-        }
+-
+-        Item {
+-            id: kcmContainerHolder
+-            anchors.left: menu.right
+-            anchors.right: parent.right
+-            anchors.margins: Kirigami.Units.largeSpacing
+-            width: parent.width - menu.width
+-            height: parent.height
+-            opacity: kcmPresent ? 1 : 0
+-            property bool kcmPresent: true
+-
+-            Controls.StackView {
+-                id: pageStack
+-                anchors.fill: parent
+-
+-                pushEnter: Transition {
+-                    PropertyAnimation {
+-                        property: "opacity"
+-                        from: 0
+-                        to:1
+-                        duration: 100
+-                    }
+-                }
+-                pushExit: Transition {
+-                    PropertyAnimation {
+-                        property: "opacity"
+-                        from: 1
+-                        to:0
+-                        duration: 100
+-                    }
+-                }
+-                popEnter: Transition {
+-                    PropertyAnimation {
+-                        property: "opacity"
+-                        from: 0
+-                        to:1
+-                        duration: 100
+-                    }
+-                }
+-                popExit: Transition {
+-                    PropertyAnimation {
+-                        property: "opacity"
+-                        from: 1
+-                        to:0
+-                        duration: 100
+-                    }
+-                }
+-            }
+-        }
+-        
+-        Component {
+-            id: kcmContainer
+-            Kirigami.Page {
+-                id: container
+-
+-                property QtObject kcm
+-                property Item internalPage
+-                property Item lastSettingMenuItem
+-                property bool suppressDeletion: false
+-
+-                title: internalPage.title
+-
+-                header: Item {
+-                    id: headerAreaTop
+-                    height: parent.height * 0.075
+-                    anchors.top: parent.bottom
+-                    anchors.left: parent.left
+-                    anchors.right: parent.right
+-                    anchors.margins: Kirigami.Units.largeSpacing
+-
+-                    Kirigami.Heading {
+-                        id: settingsTitle
+-                        text: internalPage.title
+-                        anchors.fill: parent
+-                        anchors.margins: Kirigami.Units.largeSpacing
+-                        verticalAlignment: Text.AlignBottom
+-                        horizontalAlignment: Text.AlignLeft
+-                        font.bold: true
+-                        color: Kirigami.Theme.textColor
+-                        fontSizeMode: Text.Fit
+-                        minimumPixelSize: 16
+-                        font.pixelSize: 32
+-                    }
+-
+-                    Kirigami.Separator {
+-                        id: settingsSeparator
+-                        anchors.top: headerAreaTop.bottom
+-                        anchors.left: parent.left
+-                        anchors.right: parent.right
+-                        Kirigami.Theme.colorSet: Kirigami.Theme.Button
+-                        Kirigami.Theme.inherit: false
+-                        color: Kirigami.Theme.backgroundColor
+-                        height: 2
+-                    }
+-                }
+-
+-                topPadding: 0
+-                leftPadding: 0
+-                rightPadding: 0
+-                bottomPadding: 0
+-
+-                flickable: internalPage.flickable
+-                actions: [internalPage.actions.main, internalPage.contextualActions]
+-
+-                onInternalPageChanged: {
+-                    internalPage.parent = contentItem;
+-                    internalPage.anchors.fill = contentItem;
+-                }
+-                onActiveFocusChanged: {
+-                    if (activeFocus) {
+-                        internalPage.forceActiveFocus();
+-                    }
+-                }
+-
+-                Component.onCompleted: {
+-                    // setting a binding seems to not work, add them manually
+-                    for (let action of internalPage.actions) {
+-                        actions.push(action);
+-                    }
+-                    if (kcm.load !== undefined) {
+-                        kcm.load();
+-                    }
+-                }
+-
+-                data: [
+-                    Connections {
+-                        target: internalPage
+-                        function onActionsChanged() {
+-                            root.actions.clear();
+-                            for (let action of internalPage.actions) {
+-                                root.actions.push(action);
+-                            }
+-                        }
+-                    },
+-                    Connections {
+-                        target: kcm
+-                        function onPagePushed(page) {
+-                            pageStack.push(kcmContainer.createObject(pageStack, {"internalPage": page}));
+-                        }
+-                        function onPageRemoved() {
+-                            pageStack.pop();
+-                            hideOverlay();
+-                        }
+-                        function onNeedsSaveChanged() {
+-                            if (kcm.needsSave) {
+-                                kcm.save();
+-                            }
+-                        }
+-                    },
+-                    Connections {
+-                        target: pageStack
+-                        function onPageRemoved(page) {
+-                            if (kcm.needsSave) {
+-                                kcm.save();
+-                            }
+-                            if (page == container && !container.suppressDeletion) {
+-                                page.destroy();
+-                            }
+-                        }
+-                    },
+-                    Connections {
+-                        target: kcm
+-                        function onCurrentIndexChanged(index) {
+-                            const index_with_offset = index + 1;
+-                            if (index_with_offset !== pageStack.currentIndex) {
+-                                pageStack.currentIndex = index_with_offset;
+-                            }
+-                        }
+-                    }
+-                ]
+-            }
+-        }
+-    }
+-}
+diff --git a/containments/homescreen/package/contents/ui/HomeScreen.qml b/containments/homescreen/package/contents/ui/HomeScreen.qml
+index ec48f6e27df0b5701b5de551d134b6caff45ff38..b1113f82fb8596f3757dc433c78f55bbdec4ceaa 100644
+--- a/containments/homescreen/package/contents/ui/HomeScreen.qml
++++ b/containments/homescreen/package/contents/ui/HomeScreen.qml
+@@ -13,6 +13,7 @@ import org.kde.plasma.plasmoid
+ import org.kde.plasma.core as PlasmaCore
+ import org.kde.kquickcontrolsaddons
+ import org.kde.kirigami as Kirigami
++import org.kde.bigscreen as Bigscreen
+ 
+ import "launcher"
+ 
+@@ -23,7 +24,8 @@ Item {
+     readonly property real rightMargin: leftMargin
+ 
+     // Whether to blur the wallpaper background
+-    readonly property bool blurBackground: launcher.scrolledDown
++    readonly property bool blurBackground: launcher.scrolledDown || root.Window.activeFocusItem === null
++    readonly property bool darkenBackground: launcher.scrolledDown
+ 
+     property real zoomScale: 1
+ 
+@@ -62,6 +64,7 @@ Item {
+ 
+     transitions: [
+         Transition {
++            to: "focused"
+             ParallelAnimation {
+                 OpacityAnimator { duration: 300 }
+                 NumberAnimation { target: root; property: 'zoomScale'; duration: 600; easing.type: Easing.OutExpo }
+diff --git a/containments/homescreen/package/contents/ui/indicators/AbstractIndicator.qml b/containments/homescreen/package/contents/ui/indicators/AbstractIndicator.qml
+index 8211f1e13715c1d72dd064ebd17c85a1c4dcae3d..3d7f6c3a30047377fc97506243510ab46d279845 100644
+--- a/containments/homescreen/package/contents/ui/indicators/AbstractIndicator.qml
++++ b/containments/homescreen/package/contents/ui/indicators/AbstractIndicator.qml
+@@ -12,8 +12,12 @@ import org.kde.bigscreen as Bigscreen
+ import org.kde.kirigami as Kirigami
+ import org.kde.ksvg as KSvg
+ 
+-PlasmaComponents.Button {
++PlasmaComponents.ToolButton {
+     id: button
++
++    Kirigami.Theme.inherit: false
++    Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
++
+     Layout.preferredWidth: height
+ 
+     leftPadding: Kirigami.Units.smallSpacing
+diff --git a/containments/homescreen/package/contents/ui/main.qml b/containments/homescreen/package/contents/ui/main.qml
+index d83be15b24cc012fa1f161718c81d33e32f4db72..0e5ff49d2f1714d58b8cf990c333ddd31bcbfc9d 100644
+--- a/containments/homescreen/package/contents/ui/main.qml
++++ b/containments/homescreen/package/contents/ui/main.qml
+@@ -14,6 +14,7 @@ import org.kde.plasma.core as PlasmaCore
+ import org.kde.kquickcontrolsaddons
+ 
+ import "launcher"
++import "settings" as Settings
+ 
+ ContainmentItem {
+     id: root
+@@ -81,7 +82,7 @@ ContainmentItem {
+         id: feedbackWindow
+     }
+ 
+-    ConfigWindow {
++    Settings.ConfigWindow {
+         id: configWindow
+     }
+ 
+@@ -124,7 +125,7 @@ ContainmentItem {
+     Rectangle {
+         anchors.fill: parent
+         color: 'black'
+-        opacity: homeScreen.blurBackground ? 0.7 : 0.4
++        opacity: homeScreen.darkenBackground ? 0.7 : 0.4
+         Behavior on opacity { NumberAnimation { duration: 500 } }
+     }
+ 
+diff --git a/containments/homescreen/package/contents/ui/settings/ConfigWindow.qml b/containments/homescreen/package/contents/ui/settings/ConfigWindow.qml
+new file mode 100644
+index 0000000000000000000000000000000000000000..ada9e81ff5def1b69775d637a591fc01552bf664
+--- /dev/null
++++ b/containments/homescreen/package/contents/ui/settings/ConfigWindow.qml
+@@ -0,0 +1,392 @@
++// SPDX-FileCopyrightText: 2019 Marco Martin <mart at kde.org>
++// SPDX-FileCopyrightText: 2019 Aditya Mehra <aix.m at outlook.com>
++// SPDX-FileCopyrightText: 2025 Devin Lin <devin at kde.org>
++// SPDX-License-Identifier: GPL-2.0-or-later
++
++import QtQuick
++import QtQuick.Layouts
++import QtQuick.Window
++import QtQuick.Controls as Controls
++
++import org.kde.kirigami as Kirigami
++import org.kde.bigscreen as Bigscreen
++import org.kde.private.biglauncher
++import org.kde.plasma.private.nanoshell as NanoShell
++import org.kde.plasma.extras as PlasmaExtras
++import org.kde.plasma.plasmoid
++
++NanoShell.FullScreenOverlay {
++    id: root
++
++    flags: Qt.FramelessWindowHint
++    color: 'transparent'
++
++    property string currentModuleName
++    property var loadedKCMPage: null
++
++    property var settingsKCMMenu: menu.listView
++
++    // Height of header components (shared between the two panes)
++    readonly property real headerHeight: Kirigami.Units.gridUnit * 7
++
++    // HACK: some KCMs we don't want to navigate to because we lose focus
++    // The about-distro KCM is not a native bigscreen kcm, so it eats keyboard inputs and softlocks us
++    readonly property bool isCurrentModuleFocusable: currentModuleName != "kcm_about-distro"
++
++    // Timer utility with callback
++    Timer {
++        id: timer
++        function setTimeout(cb, delayTime) {
++            timer.interval = delayTime;
++            timer.repeat = false;
++            timer.triggered.connect(cb);
++            timer.triggered.connect(function release() {
++                timer.triggered.disconnect(cb);
++                timer.triggered.disconnect(release);
++            });
++            timer.start();
++        }
++    }
++
++    function showOverlay(moduleName=undefined) {
++        if (!root.visible) {
++            root.showFullScreen();
++            timer.setTimeout(function () {
++                settingsKCMMenu.forceActiveFocus();
++            }, 100);
++        }
++
++        if (moduleName === undefined) {
++            openModule(plasmoid.kcmsListModel.get(0).kcmId);
++        } else {
++            openModule(moduleName);
++        }
++    }
++
++    function hideOverlay() {
++        if (root.visible) {
++            root.close();
++        }
++    }
++
++    // Open KCM with a given path
++    function openModule(path) {
++        module.path = path;
++        while (pageStack.count >= 1) {
++            pageStack.clear();
++        }
++
++        if (path.indexOf("kcm_mediacenter_wallpaper") != -1) {
++            // HACK: Special page for wallpaper selector
++            // TODO: create proper wallpaper KCM
++            loadedKCMPage = wallpaperKcm.createObject(pageStack, {});
++            pageStack.push(loadedKCMPage);
++            currentModuleName = 'kcm_mediacenter_wallpaper';
++        } else {
++            // Load page for KCM
++            loadedKCMPage = kcmContainer.createObject(pageStack, {"kcm": module.kcm, "internalPage": module.kcm.mainUi});
++            pageStack.push(loadedKCMPage);
++            currentModuleName = module.name;
++        }
++    }
++
++    onVisibleChanged: {
++        if (visible) {
++            opacityAnim.to = 1;
++            opacityAnim.restart();
++        }
++    }
++
++    onClosing: (close) => {
++        if (configContentItem.opacity !== 0) {
++            close.accepted = false;
++            opacityAnim.to = 0;
++            opacityAnim.restart();
++        }
++    }
++
++    Module {
++        id: module
++    }
++
++    Item {
++        id: configContentItem
++        anchors.fill: parent
++
++        opacity: 0
++        NumberAnimation on opacity {
++            id: opacityAnim
++            duration: 400
++            easing.type: Easing.OutCubic
++            onFinished: {
++                if (configContentItem.opacity === 0) {
++                    root.close();
++                }
++            }
++        }
++
++        // Close settings when escape is pressed
++        Keys.onEscapePressed: hideOverlay()
++
++        // Sidebar (left panel)
++        ConfigWindowSidebar {
++            id: menu
++            headerHeight: root.headerHeight
++
++            anchors.top: parent.top
++            anchors.left: parent.left
++            anchors.bottom: parent.bottom
++            width: Math.max(Kirigami.Units.gridUnit * 20, parent.width * 0.20)
++
++            currentModuleName: root.currentModuleName
++
++            KeyNavigation.right: root.isCurrentModuleFocusable ? loadedKCMPage : null
++            KeyNavigation.tab: KeyNavigation.right
++        }
++
++        // Shadow
++        Rectangle {
++            width: Kirigami.Units.largeSpacing
++            anchors.top: parent.top
++            anchors.right: menu.right
++            anchors.bottom: parent.bottom
++            opacity: 0.1
++
++            gradient: Gradient {
++                orientation: Gradient.Horizontal
++                GradientStop { position: 0.0; color: 'transparent' }
++                GradientStop { position: 1.0; color: 'black' }
++            }
++        }
++
++        // Settings module (right panel)
++        Rectangle {
++            id: kcmContainerHolder
++            color: Kirigami.Theme.backgroundColor
++
++            anchors {
++                left: menu.right
++                right: parent.right
++                top: parent.top
++                bottom: parent.bottom
++            }
++
++            property bool kcmPresent: true
++
++            Controls.StackView {
++                id: pageStack
++                anchors.fill: parent
++
++                pushEnter: Transition {
++                    PropertyAnimation { property: "opacity"; from: 0; to: 1; duration: 100 }
++                }
++                pushExit: Transition {
++                    PropertyAnimation { property: "opacity"; from: 1; to: 0; duration: 100 }
++                }
++                popEnter: Transition {
++                    PropertyAnimation { property: "opacity"; from: 0; to: 1; duration: 100 }
++                }
++                popExit: Transition {
++                    PropertyAnimation { property: "opacity"; from: 1; to: 0; duration: 100 }
++                }
++            }
++        }
++
++        Component {
++            id: wallpaperKcm
++            Kirigami.Page {
++                id: container
++
++                KeyNavigation.left: root.isCurrentModuleFocusable ? root.settingsKCMMenu : null
++                KeyNavigation.backtab: KeyNavigation.left
++
++                onActiveFocusChanged: {
++                    if (activeFocus) {
++                        wallpaperSelectorDelegate.forceActiveFocus();
++                    }
++                }
++
++                topPadding: 0
++                leftPadding: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
++                rightPadding: leftPadding
++                bottomPadding: 0
++
++                header: Item {
++                    id: headerAreaTop
++                    height: root.headerHeight
++                    width: parent.width
++
++                    Kirigami.Heading {
++                        id: settingsTitle
++                        text: i18n('Wallpaper')
++                        anchors.fill: parent
++
++                        padding: container.leftPadding
++                        verticalAlignment: Text.AlignBottom
++                        horizontalAlignment: Text.AlignLeft
++
++                        font.weight: Font.Light
++
++                        color: Kirigami.Theme.textColor
++                        fontSizeMode: Text.Fit
++                        minimumPixelSize: 16
++                        font.pixelSize: 32
++                    }
++                }
++
++                ColumnLayout {
++                    anchors.fill: parent
++
++                    Bigscreen.AbstractDelegate {
++                        id: wallpaperSelectorDelegate
++                        highlighted: activeFocus
++                        Layout.fillWidth: true
++
++                        // Open wallpaper selector
++                        onClicked: {
++                            root.hideOverlay();
++                            Plasmoid.internalAction("configure").trigger();
++                        }
++
++                        contentItem: RowLayout {
++                            Kirigami.Heading {
++                                Layout.fillWidth: true
++                                text: i18n('Open wallpaper selector')
++                            }
++                            Kirigami.Icon {
++                                Layout.alignment: Qt.AlignCenter
++                                source: 'arrow-right'
++                                implicitWidth: Kirigami.Units.iconSizes.smallMedium
++                                implicitHeight: Kirigami.Units.iconSizes.smallMedium
++                            }
++                        }
++                    }
++                    Item { Layout.fillHeight: true }
++                }
++            }
++        }
++
++        Component {
++            id: kcmContainer
++            Kirigami.Page {
++                id: container
++
++                property QtObject kcm
++                property Item internalPage
++                property bool suppressDeletion: false
++
++                title: internalPage.title
++
++                KeyNavigation.left: root.isCurrentModuleFocusable ? root.settingsKCMMenu : null
++                KeyNavigation.backtab: KeyNavigation.left
++
++                header: Item {
++                    id: headerAreaTop
++                    height: root.headerHeight
++                    width: parent.width
++
++                    Kirigami.Heading {
++                        id: settingsTitle
++                        text: internalPage ? internalPage.title : ''
++                        anchors.fill: parent
++
++                        padding: container.leftPadding
++                        verticalAlignment: Text.AlignBottom
++                        horizontalAlignment: Text.AlignLeft
++
++                        font.weight: Font.Light
++
++                        color: Kirigami.Theme.textColor
++                        fontSizeMode: Text.Fit
++                        minimumPixelSize: 16
++                        font.pixelSize: 32
++                    }
++                }
++
++                topPadding: 0
++                leftPadding: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
++                rightPadding: leftPadding
++                bottomPadding: 0
++
++                flickable: internalPage ? internalPage.flickable : null
++                actions: (internalPage && internalPage.actions) ? internalPage.actions : []
++
++                onInternalPageChanged: {
++                    if (internalPage) {
++                        internalPage.parent = contentItem;
++                        internalPage.anchors.fill = contentItem;
++                    }
++                }
++                onActiveFocusChanged: {
++                    if (activeFocus && internalPage && root.isCurrentModuleFocusable) {
++                        internalPage.forceActiveFocus();
++                    }
++                    if (activeFocus && !root.isCurrentModuleFocusable) {
++                        // Return focus to sidebar if this module is not focusable
++                        root.settingsKCMMenu.forceActiveFocus();
++                    }
++                }
++
++                Component.onCompleted: {
++                    // setting a binding seems to not work, add them manually
++                    if (internalPage && internalPage.actions) {
++                        for (let action of internalPage.actions) {
++                            actions.push(action);
++                        }
++                    }
++                    if (kcm.load !== undefined) {
++                        kcm.load();
++                    }
++                }
++
++                data: [
++                    Connections {
++                        target: internalPage
++                        function onActionsChanged() {
++                            root.actions.clear();
++                            for (let action of internalPage.actions) {
++                                root.actions.push(action);
++                            }
++                        }
++                    },
++                    Connections {
++                        target: kcm
++                        function onPagePushed(page) {
++                            pageStack.push(kcmContainer.createObject(pageStack, {"internalPage": page}));
++                        }
++                        function onPageRemoved() {
++                            pageStack.pop();
++                            hideOverlay();
++                        }
++                        function onNeedsSaveChanged() {
++                            if (kcm.needsSave) {
++                                kcm.save();
++                            }
++                        }
++                    },
++                    Connections {
++                        target: pageStack
++                        // TODO: this doesn't exist in StackView, find alternative
++                        // function onPageRemoved(page) {
++                        //     if (kcm.needsSave) {
++                        //         kcm.save();
++                        //     }
++                        //     if (page == container && !container.suppressDeletion) {
++                        //         page.destroy();
++                        //     }
++                        // }
++                    },
++                    Connections {
++                        target: kcm
++                        function onCurrentIndexChanged(index) {
++                            const index_with_offset = index + 1;
++                            if (index_with_offset !== pageStack.currentIndex) {
++                                pageStack.currentIndex = index_with_offset;
++                            }
++                        }
++                    }
++                ]
++            }
++        }
++    }
++}
+diff --git a/containments/homescreen/package/contents/ui/settings/ConfigWindowSidebar.qml b/containments/homescreen/package/contents/ui/settings/ConfigWindowSidebar.qml
+new file mode 100644
+index 0000000000000000000000000000000000000000..b09ed403ce208522773a0a0e480a661082e2a0ef
+--- /dev/null
++++ b/containments/homescreen/package/contents/ui/settings/ConfigWindowSidebar.qml
+@@ -0,0 +1,146 @@
++// SPDX-FileCopyrightText: 2019 Marco Martin <mart at kde.org>
++// SPDX-FileCopyrightText: 2019 Aditya Mehra <aix.m at outlook.com>
++// SPDX-FileCopyrightText: 2025 Devin Lin <devin at kde.org>
++// SPDX-License-Identifier: GPL-2.0-or-later
++
++import QtQuick
++import QtQuick.Layouts
++import QtQuick.Window
++import QtQuick.Controls as Controls
++
++import org.kde.kirigami as Kirigami
++import org.kde.bigscreen as Bigscreen
++import org.kde.private.biglauncher
++import org.kde.plasma.private.nanoshell as NanoShell
++import org.kde.plasma.extras as PlasmaExtras
++import org.kde.plasma.plasmoid
++
++Rectangle {
++    id: root
++
++    property string currentModuleName
++    property real headerHeight
++
++    property var listView: settingsKCMMenu
++
++    readonly property real horizontalMargin: Kirigami.Units.gridUnit + Kirigami.Units.largeSpacing
++
++    // Translucent background
++    color: Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 0.8)
++
++    width: Math.max(Kirigami.Units.gridUnit * 20, parent.width * 0.20)
++    height: parent.height
++
++    ColumnLayout {
++        anchors.fill: parent
++
++        // Header
++        Item {
++            id: settingsHeader
++            Layout.fillWidth: true
++            Layout.preferredHeight: root.headerHeight
++
++            Kirigami.Heading {
++                id: settingsTitle
++                text: i18n("Settings")
++                anchors.fill: parent
++
++                padding: root.horizontalMargin
++                verticalAlignment: Text.AlignBottom
++                horizontalAlignment: Text.AlignLeft
++
++                font.weight: Font.Light
++
++                color: Kirigami.Theme.textColor
++                fontSizeMode: Text.Fit
++                minimumPixelSize: 16
++                font.pixelSize: 32
++            }
++        }
++
++        // Settings module list
++        ListView {
++            id: settingsKCMMenu
++
++            Layout.fillWidth: true
++            Layout.fillHeight: true
++            leftMargin: menu.horizontalMargin
++            rightMargin: menu.horizontalMargin
++            topMargin: Kirigami.Units.largeSpacing
++            bottomMargin: Kirigami.Units.largeSpacing
++
++            model: plasmoid.kcmsListModel
++            spacing: Kirigami.Units.largeSpacing
++            keyNavigationEnabled: true
++
++            onCurrentItemChanged: {
++                if (currentItem) {
++                    currentItem.forceActiveFocus();
++                    currentItem.clicked();
++                }
++            }
++
++            delegate: Controls.Button {
++                id: kcmButton
++                property var modelData: typeof model !== "undefined" ? model : null
++
++                width: settingsKCMMenu.width - settingsKCMMenu.leftMargin - settingsKCMMenu.rightMargin
++
++                leftPadding: Kirigami.Units.gridUnit * 2
++                rightPadding: Kirigami.Units.gridUnit * 2
++                topPadding: Kirigami.Units.largeSpacing
++                bottomPadding: Kirigami.Units.largeSpacing
++
++                onClicked: openModule(modelData.kcmId);
++                Keys.onReturnPressed: openModule(modelData.kcmId);
++
++                Connections {
++                    target: root
++                    function onCurrentModuleNameChanged() {
++                        if (modelData.kcmId === currentModuleName) {
++                            settingsKCMMenu.currentIndex = model.index;
++                        }
++                    }
++                }
++
++                background: Rectangle {
++                    id: kcmButtonBackground
++                    color: (modelData.kcmId == currentModuleName || kcmButton.ListView.isCurrentItem) ?
++                            Qt.rgba(Kirigami.Theme.highlightColor.r, Kirigami.Theme.highlightColor.g, Kirigami.Theme.highlightColor.b, 0.2) : 'transparent'
++                    radius: Kirigami.Units.cornerRadius
++
++                    Kirigami.Theme.inherit: false
++                    Kirigami.Theme.colorSet: Kirigami.Theme.Button
++
++                    border.width: 2
++                    border.color: (modelData.kcmId === currentModuleName || kcmButton.ListView.isCurrentItem) ? Kirigami.Theme.highlightColor : 'transparent'
++
++                    scale: (settingsKCMMenu.activeFocus) ? 1.05 : 1.0
++                    Behavior on scale { NumberAnimation {} }
++                }
++
++                contentItem: RowLayout {
++                    id: kcmButtonLayout
++                    spacing: Kirigami.Units.gridUnit
++
++                    Kirigami.Icon {
++                        id: kcmButtonIcon
++                        source: modelData.kcmIconName
++                        Layout.alignment: Qt.AlignLeft
++                        Layout.preferredHeight: Kirigami.Units.iconSizes.medium
++                        Layout.preferredWidth: kcmButtonIcon.height
++                    }
++
++                    Kirigami.Heading {
++                        id: kcmButtonLabel
++                        text: modelData.kcmName
++                        wrapMode: Text.Wrap
++                        elide: Text.ElideRight
++                        font.weight: Font.Medium
++                        Layout.fillWidth: true
++                    }
++                }
++            }
++        }
++    }
++}
+\ No newline at end of file


More information about the Neon-commits mailing list