[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