From dca0b7c217ebd2d2e830381dfc2830d3f7d155ea Mon Sep 17 00:00:00 2001 From: Damocles Date: Sun, 12 Apr 2026 17:03:45 +0200 Subject: [PATCH] battery critical blink animation --- modules/Battery.qml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/Battery.qml b/modules/Battery.qml index 5a060c3..6e0970e 100644 --- a/modules/Battery.qml +++ b/modules/Battery.qml @@ -18,9 +18,17 @@ M.BarSection { readonly property var dev: UPower.displayDevice readonly property real pct: (dev?.percentage ?? 0) * 100 readonly property bool charging: dev?.state === UPowerDeviceState.Charging - property color _stateColor: charging ? M.Theme.base0B : pct < 15 ? M.Theme.base09 : pct < 30 ? M.Theme.base0A : M.Theme.base08 + readonly property bool _critical: pct < 15 && !charging + property color _stateColor: charging ? M.Theme.base0B : _critical ? M.Theme.base09 : pct < 30 ? M.Theme.base0A : M.Theme.base08 + property real _blinkOpacity: 1 - Behavior on _stateColor { ColorAnimation { duration: 300 } } + SequentialAnimation { + running: root._critical + loops: Animation.Infinite + NumberAnimation { target: root; property: "_blinkOpacity"; to: 0.2; duration: 400; easing.type: Easing.InOutQuad } + NumberAnimation { target: root; property: "_blinkOpacity"; to: 1; duration: 400; easing.type: Easing.InOutQuad } + onRunningChanged: if (!running) root._blinkOpacity = 1 + } property bool _warnSent: false property bool _critSent: false @@ -49,12 +57,14 @@ M.BarSection { return icons[Math.min(10, Math.floor(root.pct / 10))]; } color: root._stateColor + opacity: root._blinkOpacity font.pixelSize: M.Theme.fontSize + 2 anchors.verticalCenter: parent.verticalCenter } M.BarLabel { label: Math.round(root.pct) + "%" color: root._stateColor + opacity: root._blinkOpacity anchors.verticalCenter: parent.verticalCenter } }