Warning, /plasma/powerdevil/osd/qml/OsdSelector.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.org> 0003 SPDX-FileCopyrightText: 2023 Natalie Clarius <natalie.clarius@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 import QtQuick 2.15 0009 import QtQuick.Controls 2.15 0010 import QtQuick.Layouts 1.10 0011 0012 //NOTE: PlasmaCore is still necessary to make KSvg load the correct plasma theme 0013 import org.kde.plasma.core as PlasmaCore 0014 import org.kde.plasma.components 3.0 as PlasmaComponents 0015 import org.kde.ksvg 1.0 as KSvg 0016 import org.kde.kirigami 2.20 as Kirigami 0017 0018 // import org.kde.KScreen 1.0 0019 0020 0021 Control { 0022 id: root 0023 property string infoText 0024 property var actions 0025 property var currentProfile 0026 signal clicked(string profile) 0027 0028 leftPadding: shadow.margins.left + background.margins.left 0029 rightPadding: shadow.margins.right + background.margins.right 0030 topPadding: shadow.margins.top + background.margins.top 0031 bottomPadding: shadow.margins.bottom + background.margins.bottom 0032 0033 contentItem : ColumnLayout { 0034 RowLayout { 0035 Repeater { 0036 id: actionRepeater 0037 property int currentIndex: model.findIndex(action => action.id === currentProfile) || 0 0038 model: root.actions 0039 delegate: PlasmaComponents.Button { 0040 property var profile: modelData.id 0041 0042 Accessible.name: modelData.label 0043 0044 icon.name: modelData.iconName 0045 icon.height: Kirigami.Units.gridUnit * 8 0046 icon.width: Kirigami.Units.gridUnit * 8 0047 0048 onClicked: root.clicked(modelData.id) 0049 onHoveredChanged: { 0050 if (hovered) { 0051 actionRepeater.currentIndex = index 0052 } 0053 } 0054 0055 activeFocusOnTab: true 0056 0057 // use checked only indirectly, since its binding will break 0058 property bool current: index == actionRepeater.currentIndex 0059 onCurrentChanged: { 0060 if (current) { 0061 checked = true 0062 root.infoText = modelData.label 0063 forceActiveFocus() 0064 } else { 0065 checked = false 0066 } 0067 } 0068 onActiveFocusChanged: { 0069 if (activeFocus) { 0070 actionRepeater.currentIndex = index 0071 } 0072 } 0073 } 0074 } 0075 } 0076 0077 Kirigami.Heading { 0078 text: root.infoText 0079 horizontalAlignment: Text.AlignHCenter 0080 maximumLineCount: 2 0081 wrapMode: Text.WordWrap 0082 0083 Layout.fillWidth: true 0084 Layout.margins: Math.floor(Kirigami.Units.smallSpacing / 2) 0085 } 0086 0087 // Shift current by delta, but do not wrap around when repeat is true. 0088 function wrappingAdd(count: int, current: int, delta: int, repeat: bool): int { 0089 const next = current + delta; 0090 // Rule out invalid states. 0091 if (count === 0 || current < 0 || current >= count) { 0092 return current; 0093 } 0094 // Don't wrap on autorepeat. 0095 if (repeat && (next < 0 || next >= count)) { 0096 return current; 0097 } 0098 // Add an extra `count`, so that wrapping % works predictably with positive values only. 0099 // This assumes that delta is not smaller than `-count` (usually just -1, 0 or +1). 0100 return (next + count) % count; 0101 } 0102 0103 function move(event) { 0104 actionRepeater.currentIndex = wrappingAdd(actionRepeater.count, actionRepeater.currentIndex, 0105 (event.key === Qt.Key_Left) ? -1 : 1, event.isAutoRepeat); 0106 } 0107 0108 Keys.onPressed: { 0109 switch (event.key) { 0110 case Qt.Key_Return: 0111 case Qt.Key_Enter: 0112 clicked(actionRepeater.itemAt(actionRepeater.currentIndex).profile) 0113 break 0114 case Qt.Key_Right: 0115 case Qt.Key_Left: 0116 move(event) 0117 break 0118 case Qt.Key_Escape: 0119 clicked("") 0120 break 0121 } 0122 } 0123 } 0124 0125 background: KSvg.FrameSvgItem { 0126 id: shadow 0127 imagePath: "dialogs/background" 0128 prefix: "shadow" 0129 0130 KSvg.FrameSvgItem { 0131 id: background 0132 anchors.leftMargin: shadow.margins.left 0133 anchors.rightMargin: shadow.margins.right 0134 anchors.topMargin: shadow.margins.top 0135 anchors.bottomMargin: shadow.margins.bottom 0136 anchors.fill: parent 0137 imagePath: "solid/dialogs/background" 0138 } 0139 } 0140 }