diff --git a/nix/hm-module.nix b/nix/hm-module.nix index 8480617..c64c8ac 100644 --- a/nix/hm-module.nix +++ b/nix/hm-module.nix @@ -121,11 +121,6 @@ in default = true; description = "Show volume slider on the lock screen."; }; - weather = lib.mkOption { - type = lib.types.bool; - default = true; - description = "Show weather summary on the lock screen."; - }; }; notifications = moduleOpt "notifications" { timeout = lib.mkOption { diff --git a/shell/applets/WeatherApplet.qml b/shell/applets/WeatherApplet.qml deleted file mode 100644 index 0421bf5..0000000 --- a/shell/applets/WeatherApplet.qml +++ /dev/null @@ -1,41 +0,0 @@ -import QtQuick -import "../services" as S - -Column { - id: root - - required property color accentColor - - // Weather icon + summary - Item { - width: parent.width - height: 28 - - Text { - anchors.left: parent.left - anchors.leftMargin: 12 - anchors.verticalCenter: parent.verticalCenter - text: S.WeatherService.icon - color: root.accentColor - font.pixelSize: S.Theme.fontSize + 2 - font.family: S.Theme.fontFamily - } - } - - // Forecast details from wttrbar tooltip - Text { - width: parent.width - 24 - anchors.horizontalCenter: parent.horizontalCenter - text: S.WeatherService.tooltip - color: S.Theme.base05 - font.pixelSize: S.Theme.fontSize - 2 - font.family: S.Theme.fontFamily - wrapMode: Text.WordWrap - lineHeight: 1.3 - } - - Item { - width: 1 - height: 4 - } -} diff --git a/shell/applets/qmldir b/shell/applets/qmldir index 13113c1..1cfc65a 100644 --- a/shell/applets/qmldir +++ b/shell/applets/qmldir @@ -11,5 +11,4 @@ MprisApplet 1.0 MprisApplet.qml NetworkApplet 1.0 NetworkApplet.qml TemperatureApplet 1.0 TemperatureApplet.qml VolumeApplet 1.0 VolumeApplet.qml -WeatherApplet 1.0 WeatherApplet.qml # keep-sorted end diff --git a/shell/lock/LockWidgets.qml b/shell/lock/LockWidgets.qml index 40e157b..90f105b 100644 --- a/shell/lock/LockWidgets.qml +++ b/shell/lock/LockWidgets.qml @@ -27,34 +27,13 @@ Item { } implicitHeight: _widgetContent.implicitHeight - visible: _weatherCard.visible || _mprisCard.visible || _volumeCard.visible || _backlightCard.visible || _notifPills.visible + visible: _mprisCard.visible || _volumeCard.visible || _backlightCard.visible || _notifPills.visible Column { id: _widgetContent width: parent.width spacing: 12 - // Weather widget - Rectangle { - id: _weatherCard - width: parent.width - height: _weatherContent.implicitHeight + 16 - radius: S.Theme.radius + 2 - color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7) - border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3) - border.width: 1 - visible: (S.Modules.lock.weather ?? true) && S.WeatherService.available - - C.WeatherApplet { - id: _weatherContent - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - anchors.topMargin: 8 - accentColor: S.Theme.base0C - } - } - // Notification pills LockNotifPills { id: _notifPills diff --git a/shell/modules/WeatherModule.qml b/shell/modules/WeatherModule.qml index b9f7f02..a1bff49 100644 --- a/shell/modules/WeatherModule.qml +++ b/shell/modules/WeatherModule.qml @@ -1,53 +1,41 @@ import QtQuick -import Quickshell +import Quickshell.Io import "." as M import "../services" as S -import "../applets" as C M.BarSection { id: root spacing: S.Theme.moduleSpacing - tooltip: "" - visible: S.Modules.weather.enable && S.WeatherService.available + tooltip: root.weatherTooltip - property bool _pinned: false - readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered - readonly property bool _showPanel: _anyHover || _pinned + property string weatherTooltip: "" - on_AnyHoverChanged: { - if (_anyHover) - _unpinTimer.stop(); - else if (_pinned) - _unpinTimer.start(); + Process { + id: proc + running: true + command: ["wttrbar"].concat(S.Modules.weather.args) + stdout: StdioCollector { + onStreamFinished: { + try { + const data = JSON.parse(text); + label.icon = data.text ?? ""; + root.weatherTooltip = data.tooltip ?? ""; + } catch (e) { + label.icon = ""; + root.weatherTooltip = ""; + } + } + } } - Timer { - id: _unpinTimer - interval: 500 - onTriggered: root._pinned = false + interval: S.Modules.weather.interval || 3600000 + running: true + repeat: true + onTriggered: proc.running = true } M.BarIcon { - icon: S.WeatherService.icon + id: label anchors.verticalCenter: parent.verticalCenter - TapHandler { - onTapped: root._pinned = !root._pinned - } - } - - M.HoverPanel { - id: hoverPanel - showPanel: root._showPanel - screen: QsWindow.window?.screen ?? null - anchorItem: root - accentColor: root.accentColor - panelNamespace: "nova-weather" - panelTitle: "Weather" - contentWidth: 280 - - C.WeatherApplet { - width: hoverPanel.contentWidth - accentColor: root.accentColor - } } } diff --git a/shell/services/BatteryService.qml b/shell/services/BatteryService.qml index 057feb5..dc64642 100644 --- a/shell/services/BatteryService.qml +++ b/shell/services/BatteryService.qml @@ -11,22 +11,19 @@ QtObject { readonly property var dev: UPower.displayDevice readonly property bool available: dev?.isLaptopBattery ?? false - readonly property real percent: { - const p = dev?.percentage; - return (p !== undefined && p !== null && !isNaN(p)) ? p * 100 : 0; - } + readonly property real pct: (dev?.percentage ?? 0) * 100 readonly property bool charging: dev?.state === UPowerDeviceState.Charging readonly property real changeRate: dev?.changeRate ?? 0 readonly property int timeToFull: dev?.timeToFull ?? 0 readonly property int timeToEmpty: dev?.timeToEmpty ?? 0 readonly property bool healthSupported: dev?.healthSupported ?? false - readonly property real healthPercent: (dev?.healthPercentage ?? 1) * 100 + readonly property real healthPct: (dev?.healthPercentage ?? 1) * 100 readonly property int critThresh: S.Modules.battery.critical || 15 readonly property int warnThresh: S.Modules.battery.warning || 25 - readonly property bool critical: percent < critThresh && !charging + readonly property bool critical: pct < critThresh && !charging - readonly property color stateColor: charging ? S.Theme.base0B : critical ? S.Theme.base09 : percent < warnThresh ? S.Theme.base0A : S.Theme.base05 + readonly property color stateColor: charging ? S.Theme.base0B : critical ? S.Theme.base09 : pct < warnThresh ? S.Theme.base0A : S.Theme.base05 // 24h history (1440 samples @ 60s) property var history: [] @@ -37,7 +34,7 @@ QtObject { repeat: true triggeredOnStart: true onTriggered: { - const h = root.history.concat([root.percent]); + const h = root.history.concat([root.pct]); root.history = h.length > 1440 ? h.slice(h.length - 1440) : h; } } @@ -52,15 +49,15 @@ QtObject { root._warnSent = false; root._critSent = false; } - function onPercentChanged() { + function onPctChanged() { if (root.charging) return; - if (root.percent < root.critThresh && !root._critSent) { + if (root.pct < root.critThresh && !root._critSent) { root._critSent = true; root._warnSent = true; _notifProc.command = ["notify-send", "--urgency=critical", "--icon=battery-low", "--category=device", "Very Low Battery", "Connect to power now!"]; _notifProc.running = true; - } else if (root.percent < root.warnThresh && !root._warnSent) { + } else if (root.pct < root.warnThresh && !root._warnSent) { root._warnSent = true; _notifProc.command = ["notify-send", "--icon=battery-caution", "--category=device", "Low Battery"]; _notifProc.running = true; diff --git a/shell/services/Modules.qml b/shell/services/Modules.qml index f9ea948..d7d112d 100644 --- a/shell/services/Modules.qml +++ b/shell/services/Modules.qml @@ -98,8 +98,7 @@ QtObject { screenshot: true, notifications: true, mpris: true, - volume: true, - weather: true + volume: true }) property var statsDaemon: ({ interval: -1 diff --git a/shell/services/WeatherService.qml b/shell/services/WeatherService.qml deleted file mode 100644 index ed89fac..0000000 --- a/shell/services/WeatherService.qml +++ /dev/null @@ -1,42 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell -import Quickshell.Io -import "." as S - -QtObject { - id: root - - property string icon: "" - property string tooltip: "" - readonly property bool available: icon !== "" - - property Process _proc: Process { - running: S.Modules.weather.enable - command: ["wttrbar"].concat(S.Modules.weather.args) - stdout: StdioCollector { - onStreamFinished: { - try { - const data = JSON.parse(text); - root.icon = data.text ?? ""; - root.tooltip = data.tooltip ?? ""; - } catch (e) { - root.icon = ""; - root.tooltip = ""; - } - } - } - } - - property Timer _poll: Timer { - interval: S.Modules.weather.interval || 3600000 - running: S.Modules.weather.enable - repeat: true - onTriggered: root._proc.running = true - } - - function refresh() { - _proc.running = true; - } -} diff --git a/shell/services/qmldir b/shell/services/qmldir index 901fd4e..339d03e 100644 --- a/shell/services/qmldir +++ b/shell/services/qmldir @@ -15,5 +15,4 @@ singleton PowerProfileService 1.0 PowerProfileService.qml singleton ScreenshotService 1.0 ScreenshotService.qml singleton SystemStats 1.0 SystemStats.qml singleton Theme 1.0 Theme.qml -singleton WeatherService 1.0 WeatherService.qml # keep-sorted end