1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
/*
SPDX-FileCopyrightText: 2011 Viranch Mehta <viranch.mehta@gmail.com>
SPDX-FileCopyrightText: 2013-2016 Kai Uwe Broulik <kde@privat.broulik.de>
SPDX-FileCopyrightText: 2023-2024 Natalie Clarius <natalie.clarius@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
import QtQuick
import org.kde.plasma.components as PlasmaComponents3
import org.kde.plasma.extras as PlasmaExtras
import org.kde.kirigami as Kirigami
import org.kde.plasma.workspace.dbus as DBus
PlasmaExtras.Representation {
id: dialog
required property DBus.Properties nightLightControl
readonly property Item firstItemAfterScreenBrightnessRepeater: keyboardBrightnessSlider.visible ? keyboardBrightnessSlider : keyboardBrightnessSlider.KeyNavigation.down
KeyNavigation.down: screenBrightnessRepeater.firstSlider ?? firstItemAfterScreenBrightnessRepeater
contentItem: PlasmaComponents3.ScrollView {
id: scrollView
focus: false
function positionViewAtItem(item) {
if (!PlasmaComponents3.ScrollBar.vertical.visible) {
return;
}
const rect = brightnessList.mapFromItem(item, 0, 0, item.width, item.height);
if (rect.y < scrollView.contentItem.contentY) {
scrollView.contentItem.contentY = rect.y;
} else if (rect.y + rect.height > scrollView.contentItem.contentY + scrollView.height) {
scrollView.contentItem.contentY = rect.y + rect.height - scrollView.height;
}
}
Column {
id: brightnessList
spacing: Kirigami.Units.smallSpacing * 2
Repeater {
id: screenBrightnessRepeater
model: screenBrightnessControl.displays
property Item firstSlider: screenBrightnessRepeater.itemAt(0)
property Item lastSlider: screenBrightnessRepeater.itemAt(count - 1)
BrightnessItem {
id: screenBrightnessSlider
required property int index
required property string displayName
required property string label
required property int brightness
required property int maxBrightness
property Item previousSlider: screenBrightnessRepeater.itemAt(index - 1)
property Item nextSlider: screenBrightnessRepeater.itemAt(index + 1)
width: scrollView.availableWidth
icon.name: "video-display-brightness"
text: label
type: BrightnessItem.Type.Screen
value: brightness
minimumValue: 0
maximumValue: maxBrightness
KeyNavigation.up: previousSlider ?? dialog.KeyNavigation.up
KeyNavigation.down: nextSlider ?? firstItemAfterScreenBrightnessRepeater
KeyNavigation.backtab: previousSlider ?? dialog.KeyNavigation.backtab
KeyNavigation.tab: KeyNavigation.down
stepSize: maxBrightness/100
onMoved: screenBrightnessControl.setBrightness(displayName, value)
onActiveFocusChanged: if (activeFocus) scrollView.positionViewAtItem(this)
}
// itemAt() doesn't cause bindings to be updated when the underlying items change,
// so let's do it by ourselves
onItemAdded: (index, item) => {
if (index == 0) {
firstSlider = item;
}
if (index > 0) {
itemAt(index - 1).nextSlider = item;
}
if (index + 1 < count) {
itemAt(index + 1).previousSlider = item;
}
if (index + 1 == count) {
lastSlider = item;
}
}
onItemRemoved: (index, item) => {
if (item == firstSlider) {
firstSlider = itemAt(0);
}
if (index > 0) {
itemAt(index - 1).nextSlider = itemAt(index);
}
if (index + 1 < count) {
itemAt(index + 1).previousSlider = itemAt(index);
}
if (item == lastSlider) {
lastSlider = itemAt(count - 1);
}
}
}
BrightnessItem {
id: keyboardBrightnessSlider
width: scrollView.availableWidth
icon.name: "input-keyboard-brightness"
text: i18n("Keyboard Backlight")
type: BrightnessItem.Type.Keyboard
value: keyboardBrightnessControl.brightness
maximumValue: keyboardBrightnessControl.brightnessMax
visible: keyboardBrightnessControl.isBrightnessAvailable
KeyNavigation.up: screenBrightnessRepeater.lastSlider ?? dialog.KeyNavigation.up
KeyNavigation.down: keyboardColorItem.visible ? keyboardColorItem : keyboardColorItem.KeyNavigation.down
KeyNavigation.backtab: KeyNavigation.up
KeyNavigation.tab: KeyNavigation.down
onMoved: keyboardBrightnessControl.brightness = value
onActiveFocusChanged: if (activeFocus) scrollView.positionViewAtItem(this)
// Manually dragging the slider around breaks the binding
Connections {
target: keyboardBrightnessControl
function onBrightnessChanged() {
keyboardBrightnessSlider.value = keyboardBrightnessControl.brightness;
}
}
}
KeyboardColorItem {
id: keyboardColorItem
width: scrollView.availableWidth
KeyNavigation.up: keyboardBrightnessSlider.visible ? keyboardBrightnessSlider : keyboardBrightnessSlider.KeyNavigation.up
KeyNavigation.down: nightLightItem
KeyNavigation.backtab: KeyNavigation.up
KeyNavigation.tab: KeyNavigation.down
text: i18n("Keyboard Color")
}
NightLightItem {
id: nightLightItem
width: scrollView.availableWidth
KeyNavigation.up: keyboardColorItem.visible ? keyboardColorItem : keyboardColorItem.KeyNavigation.up
KeyNavigation.backtab: KeyNavigation.up
text: i18n("Night Light")
nightLightControl: dialog.nightLightControl
}
}
}
}
|