summaryrefslogtreecommitdiff
path: root/modules/dashboard/dash/Weather.qml
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-05-23 23:10:33 +0800
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-05-23 23:10:33 +0800
commit95b0c2d3fef9d46790938214e19f945b496a9223 (patch)
tree8e614fa565cf47d0ccd307861bd05d619e7b45d9 /modules/dashboard/dash/Weather.qml
parentinternal: fix anim typo (diff)
downloadcaelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.tar.gz
caelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.tar.bz2
caelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.zip
dashboard: add weather
Diffstat (limited to 'modules/dashboard/dash/Weather.qml')
-rw-r--r--modules/dashboard/dash/Weather.qml77
1 files changed, 77 insertions, 0 deletions
diff --git a/modules/dashboard/dash/Weather.qml b/modules/dashboard/dash/Weather.qml
new file mode 100644
index 0000000..05c0174
--- /dev/null
+++ b/modules/dashboard/dash/Weather.qml
@@ -0,0 +1,77 @@
+import "root:/widgets"
+import "root:/services"
+import "root:/config"
+import "root:/utils"
+import Quickshell.Io
+import QtQuick
+
+Item {
+ id: root
+
+ property string icon
+ property string description
+ property real temperature
+
+ anchors.centerIn: parent
+
+ implicitWidth: icon.implicitWidth + info.implicitWidth + info.anchors.leftMargin
+
+ onVisibleChanged: wttrProc.running = true
+
+ Process {
+ id: wttrProc
+
+ running: true
+ command: ["fish", "-c", `curl "https://wttr.in/$(curl ipinfo.io | jq -r '.city' | string replace ' ' '%20')?format=j1" | jq -c '.current_condition[0] | {code: .weatherCode, desc: .weatherDesc[0].value, temp: .temp_C}'`]
+ stdout: SplitParser {
+ onRead: data => {
+ const json = JSON.parse(data);
+ root.icon = Icons.getWeatherIcon(json.code);
+ root.description = json.desc;
+ root.temperature = parseFloat(json.temp);
+ }
+ }
+ }
+
+ MaterialIcon {
+ id: icon
+
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: parent.left
+
+ animate: true
+ text: root.icon
+ color: Colours.palette.m3secondary
+ font.pointSize: root.parent.height / 2 || 1
+ }
+
+ Column {
+ id: info
+
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.left: icon.right
+ anchors.leftMargin: Appearance.spacing.large
+
+ spacing: Appearance.spacing.small
+
+ StyledText {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ animate: true
+ text: `${root.temperature}°C`
+ color: Colours.palette.m3primary
+ font.pointSize: Appearance.font.size.extraLarge
+ font.weight: 500
+ }
+
+ StyledText {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ animate: true
+ text: root.description
+
+ elide: Text.ElideRight
+ width: Math.min(implicitWidth, root.parent.width - icon.implicitWidth - info.anchors.leftMargin - Appearance.padding.large * 2)
+ }
+ }
+}