Warning, /plasma/plasma-workspace/applets/brightness/package/contents/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2011 Sebastian Kügler <sebas@kde.org> 0003 SPDX-FileCopyrightText: 2011 Viranch Mehta <viranch.mehta@gmail.com> 0004 SPDX-FileCopyrightText: 2013-2015 Kai Uwe Broulik <kde@privat.broulik.de> 0005 SPDX-FileCopyrightText: 2021-2022 ivan tkachenko <me@ratijas.tk> 0006 SPDX-FileCopyrightText: 2023 Natalie Clarius <natalie.clarius@kde.org 0007 0008 SPDX-License-Identifier: LGPL-2.0-or-later 0009 */ 0010 0011 import QtQuick 0012 import QtQuick.Layouts 0013 0014 import org.kde.coreaddons as KCoreAddons 0015 import org.kde.kcmutils // KCMLauncher 0016 import org.kde.config // KAuthorized 0017 import org.kde.notification 0018 import org.kde.plasma.core as PlasmaCore 0019 import org.kde.plasma.plasma5support as P5Support 0020 import org.kde.plasma.plasmoid 0021 import org.kde.kirigami as Kirigami 0022 import org.kde.kitemmodels as KItemModels 0023 0024 import org.kde.plasma.private.brightnesscontrolplugin 0025 0026 import "logic.js" as Logic 0027 0028 PlasmoidItem { 0029 id: brightnesscontrol 0030 0031 property QtObject pmSource: P5Support.DataSource { 0032 id: pmSource 0033 engine: "powermanagement" 0034 connectedSources: sources 0035 onSourceAdded: source => { 0036 disconnectSource(source); 0037 connectSource(source); 0038 } 0039 onSourceRemoved: source => { 0040 disconnectSource(source); 0041 } 0042 onDataChanged: { 0043 Logic.updateBrightness(brightnesscontrol, pmSource); 0044 } 0045 } 0046 property QtObject updateScreenBrightnessJob 0047 property QtObject updateKeyboardBrightnessJob 0048 0049 readonly property bool isScreenBrightnessAvailable: pmSource.data["PowerDevil"] && pmSource.data["PowerDevil"]["Screen Brightness Available"] ? true : false 0050 readonly property bool isKeyboardBrightnessAvailable: pmSource.data["PowerDevil"] && pmSource.data["PowerDevil"]["Keyboard Brightness Available"] ? true : false 0051 readonly property bool isBrightnessAvailable: isScreenBrightnessAvailable || isKeyboardBrightnessAvailable 0052 readonly property int maximumScreenBrightness: pmSource.data["PowerDevil"] ? pmSource.data["PowerDevil"]["Maximum Screen Brightness"] || 0 : 0 0053 readonly property int maximumKeyboardBrightness: pmSource.data["PowerDevil"] ? pmSource.data["PowerDevil"]["Maximum Keyboard Brightness"] || 0 : 0 0054 0055 readonly property bool inPanel: (Plasmoid.location === PlasmaCore.Types.TopEdge 0056 || Plasmoid.location === PlasmaCore.Types.RightEdge 0057 || Plasmoid.location === PlasmaCore.Types.BottomEdge 0058 || Plasmoid.location === PlasmaCore.Types.LeftEdge) 0059 0060 property bool disableBrightnessUpdate: true 0061 property int screenBrightness 0062 property int keyboardBrightness 0063 property int screenBrightnessPercent: maximumScreenBrightness ? Math.round(100 * screenBrightness / maximumScreenBrightness) : 0 0064 property int keyboardBrightnessPercent: maximumKeyboardBrightness ? Math.round(100 * keyboardBrightness / maximumKeyboardBrightness) : 0 0065 0066 NightColorMonitor { 0067 id: nightColorMonitor 0068 } 0069 NightColorInhibitor { 0070 id: nightColorInhibitor 0071 } 0072 property bool isNightColorActive: nightColorMonitor.running && nightColorMonitor.currentTemperature != 6500 0073 0074 function symbolicizeIconName(iconName) { 0075 const symbolicSuffix = "-symbolic"; 0076 if (iconName.endsWith(symbolicSuffix)) { 0077 return iconName; 0078 } 0079 0080 return iconName + symbolicSuffix; 0081 } 0082 0083 switchWidth: Kirigami.Units.gridUnit * 10 0084 switchHeight: Kirigami.Units.gridUnit * 10 0085 0086 Plasmoid.title: i18n("Brightness and Color") 0087 0088 LayoutMirroring.enabled: Qt.application.layoutDirection == Qt.RightToLeft 0089 LayoutMirroring.childrenInherit: true 0090 0091 Plasmoid.status: { 0092 return isScreenBrightnessAvailable || isKeyboardBrightnessAvailable || isNightColorActive ? PlasmaCore.Types.ActiveStatus : PlasmaCore.Types.PassiveStatus; 0093 } 0094 0095 toolTipMainText: { 0096 const parts = []; 0097 if (isScreenBrightnessAvailable) { 0098 parts.push(i18n("Screen brightness at %1%", screenBrightnessPercent)); 0099 } 0100 if (isKeyboardBrightnessAvailable) { 0101 parts.push(i18n("Keyboard brightness at %1%", keyboardBrightnessPercent)); 0102 } 0103 if (nightColorMonitor.enabled) { 0104 if (!nightColorMonitor.running) { 0105 parts.push(i18nc("Status", "Night Light off")); 0106 } else if (nightColorMonitor.currentTemperature != 6500) { 0107 parts.push(i18nc("Status; placeholder is a temperature", "Night Light at %1K", nightColorMonitor.currentTemperature)); 0108 } 0109 } 0110 0111 return parts.join("\n"); 0112 } 0113 0114 toolTipSubText: { 0115 const parts = []; 0116 if (isScreenBrightnessAvailable) { 0117 parts.push(i18n("Scroll to adjust screen brightness")); 0118 } 0119 if (nightColorMonitor.enabled) { 0120 parts.push(i18n("Middle-click to toggle Night Light")); 0121 } 0122 return parts.join("\n"); 0123 } 0124 0125 Plasmoid.icon: { 0126 let iconName = "brightness-high"; 0127 0128 if (nightColorMonitor.enabled) { 0129 if (!nightColorMonitor.running) { 0130 iconName = "redshift-status-off"; 0131 } else if (nightColorMonitor.currentTemperature != 6500) { 0132 if (nightColorMonitor.daylight) { 0133 iconName = "redshift-status-day"; 0134 } else { 0135 iconName = "redshift-status-on"; 0136 } 0137 } 0138 } 0139 0140 if (inPanel) { 0141 return symbolicizeIconName(iconName); 0142 } 0143 0144 return iconName; 0145 } 0146 0147 onScreenBrightnessChanged: { 0148 if (disableBrightnessUpdate) { 0149 return; 0150 } 0151 const service = pmSource.serviceForSource("PowerDevil"); 0152 const operation = service.operationDescription("setBrightness"); 0153 operation.brightness = screenBrightness; 0154 // show OSD only when the plasmoid isn't expanded since the moving slider is feedback enough 0155 operation.silent = brightnesscontrol.expanded; 0156 updateScreenBrightnessJob = service.startOperationCall(operation); 0157 updateScreenBrightnessJob.finished.connect(job => { 0158 Logic.updateBrightness(brightnesscontrol, pmSource); 0159 }); 0160 } 0161 0162 onKeyboardBrightnessChanged: { 0163 if (disableBrightnessUpdate) { 0164 return; 0165 } 0166 var service = pmSource.serviceForSource("PowerDevil"); 0167 var operation = service.operationDescription("setKeyboardBrightness"); 0168 operation.brightness = keyboardBrightness; 0169 // show OSD only when the plasmoid isn't expanded since the moving slider is feedback enough 0170 operation.silent = brightnesscontrol.expanded; 0171 updateKeyboardBrightnessJob = service.startOperationCall(operation); 0172 updateKeyboardBrightnessJob.finished.connect(job => { 0173 Logic.updateBrightness(brightnesscontrol, pmSource); 0174 }); 0175 } 0176 0177 compactRepresentation: CompactRepresentation { 0178 isBrightnessAvailable: brightnesscontrol.isScreenBrightnessAvailable 0179 0180 onWheel: wheel => { 0181 if (!brightnesscontrol.isScreenBrightnessAvailable) { 0182 return; 0183 } 0184 const delta = (wheel.inverted ? -1 : 1) * (wheel.angleDelta.y ? wheel.angleDelta.y : -wheel.angleDelta.x); 0185 0186 const maximumBrightness = brightnesscontrol.maximumScreenBrightness 0187 // Don't allow the UI to turn off the screen 0188 // Please see https://git.reviewboard.kde.org/r/122505/ for more information 0189 const minimumBrightness = (maximumBrightness > 100 ? 1 : 0) 0190 const stepSize = Math.max(1, maximumBrightness / 20) 0191 0192 let newBrightness; 0193 if (Math.abs(delta) < 120) { 0194 // Touchpad scrolling 0195 brightnessError += delta * stepSize / 120; 0196 const change = Math.round(brightnessError); 0197 brightnessError -= change; 0198 newBrightness = brightnesscontrol.screenBrightness + change; 0199 } else if (wheel.modifiers & Qt.ShiftModifier) { 0200 newBrightness = Math.round((Math.round(brightnesscontrol.screenBrightness * 100 / maximumBrightness) + delta/120) / 100 * maximumBrightness) 0201 } else { 0202 // Discrete/wheel scrolling 0203 newBrightness = Math.round(brightnesscontrol.screenBrightness/stepSize + delta/120) * stepSize; 0204 } 0205 brightnesscontrol.screenBrightness = Math.max(minimumBrightness, Math.min(maximumBrightness, newBrightness)); 0206 } 0207 0208 acceptedButtons: Qt.LeftButton | Qt.MiddleButton 0209 property bool wasExpanded: false 0210 onPressed: wasExpanded = brightnesscontrol.expanded 0211 onClicked: mouse => { 0212 if (mouse.button == Qt.MiddleButton) { 0213 toggleNightColorInhibition(); 0214 } else { 0215 brightnesscontrol.expanded = !wasExpanded; 0216 } 0217 } 0218 0219 function toggleNightColorInhibition() { 0220 if (!nightColorMonitor.available) { 0221 return; 0222 } 0223 switch (nightColorInhibitor.state) { 0224 case NightColorInhibitor.Inhibiting: 0225 case NightColorInhibitor.Inhibited: 0226 nightColorInhibitor.uninhibit(); 0227 break; 0228 case NightColorInhibitor.Uninhibiting: 0229 case NightColorInhibitor.Uninhibited: 0230 nightColorInhibitor.inhibit(); 0231 break; 0232 } 0233 } 0234 } 0235 0236 fullRepresentation: PopupDialog { 0237 id: dialogItem 0238 0239 readonly property var appletInterface: brightnesscontrol 0240 0241 Layout.minimumWidth: Kirigami.Units.gridUnit * 10 0242 Layout.maximumWidth: Kirigami.Units.gridUnit * 80 0243 Layout.preferredWidth: Kirigami.Units.gridUnit * 20 0244 0245 Layout.minimumHeight: Kirigami.Units.gridUnit * 10 0246 Layout.maximumHeight: Kirigami.Units.gridUnit * 40 0247 Layout.preferredHeight: implicitHeight 0248 0249 isBrightnessAvailable: brightnesscontrol.isBrightnessAvailable 0250 isScreenBrightnessAvailable: brightnesscontrol.isScreenBrightnessAvailable 0251 isKeyboardBrightnessAvailable: brightnesscontrol.isKeyboardBrightnessAvailable 0252 } // todo 0253 0254 Plasmoid.contextualActions: [ 0255 PlasmaCore.Action { 0256 id: configureNightLight 0257 icon.name: "configure" 0258 text: i18nc("@action:inmenu", "Configure Night Light…") 0259 visible: KAuthorized.authorize("kcm_nightcolor") 0260 priority: PlasmaCore.Action.LowPriority 0261 onTriggered: KCMLauncher.openSystemSettings("kcm_nightcolor") 0262 } 0263 ] 0264 0265 Component.onCompleted: { 0266 Logic.updateBrightness(brightnesscontrol, pmSource); 0267 Plasmoid.removeInternalAction("configure"); 0268 } 0269 }