From 95b0c2d3fef9d46790938214e19f945b496a9223 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Fri, 23 May 2025 23:10:33 +0800 Subject: dashboard: add weather --- config/DashboardConfig.qml | 1 + modules/dashboard/Dash.qml | 10 ++-- modules/dashboard/dash/Weather.qml | 77 ++++++++++++++++++++++++++ utils/Icons.qml | 109 +++++++++++++++++++------------------ 4 files changed, 138 insertions(+), 59 deletions(-) create mode 100644 modules/dashboard/dash/Weather.qml diff --git a/config/DashboardConfig.qml b/config/DashboardConfig.qml index 0a41cfd..ea6db4f 100644 --- a/config/DashboardConfig.qml +++ b/config/DashboardConfig.qml @@ -17,5 +17,6 @@ Singleton { readonly property int mediaProgressSweep: 180 readonly property int mediaProgressThickness: 8 readonly property int resourceProgessThickness: 10 + readonly property int weatherWidth: 250 } } diff --git a/modules/dashboard/Dash.qml b/modules/dashboard/Dash.qml index c9923c7..5e619a3 100644 --- a/modules/dashboard/Dash.qml +++ b/modules/dashboard/Dash.qml @@ -11,20 +11,20 @@ GridLayout { columnSpacing: Appearance.spacing.normal Rect { + Layout.column: 2 Layout.columnSpan: 3 User {} } Rect { - // text: "toggles" - - Layout.column: 3 + // Layout.column: 3 + Layout.row: 0 Layout.columnSpan: 2 - Layout.preferredWidth: 250 + Layout.preferredWidth: DashboardConfig.sizes.weatherWidth Layout.fillHeight: true - Item {} + Weather {} } Rect { 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) + } + } +} diff --git a/utils/Icons.qml b/utils/Icons.qml index 504cdc5..3691ddf 100644 --- a/utils/Icons.qml +++ b/utils/Icons.qml @@ -52,59 +52,54 @@ Singleton { }) readonly property var weatherIcons: ({ - warning: "󰼯", - sunny: "󰖙", - clear: "󰖔", - partly_cloudy: "󰖕", - partly_cloudy_night: "󰼱", - cloudy: "󰖐", - overcast: "󰖕", - mist: "󰖑", - patchy_rain_nearby: "󰼳", - patchy_rain_possible: "󰼳", - patchy_snow_possible: "󰼴", - patchy_sleet_possible: "󰙿", - patchy_freezing_drizzle_possible: "󰙿", - thundery_outbreaks_possible: "󰙾", - blowing_snow: "󰼶", - blizzard: "󰼶", - fog: "󰖑", - freezing_fog: "󰖑", - patchy_light_drizzle: "󰼳", - light_drizzle: "󰼳", - freezing_drizzle: "󰙿", - heavy_freezing_drizzle: "󰙿", - patchy_light_rain: "󰼳", - light_rain: "󰼳", - moderate_rain_at_times: "󰖗", - moderate_rain: "󰼳", - heavy_rain_at_times: "󰖖", - heavy_rain: "󰖖", - light_freezing_rain: "󰙿", - moderate_or_heavy_freezing_rain: "󰙿", - light_sleet: "󰙿", - moderate_or_heavy_sleet: "󰙿", - patchy_light_snow: "󰼴", - light_snow: "󰼴", - patchy_moderate_snow: "󰼴", - moderate_snow: "󰼶", - patchy_heavy_snow: "󰼶", - heavy_snow: "󰼶", - ice_pellets: "󰖒", - light_rain_shower: "󰖖", - moderate_or_heavy_rain_shower: "󰖖", - torrential_rain_shower: "󰖖", - light_sleet_showers: "󰼵", - moderate_or_heavy_sleet_showers: "󰼵", - light_snow_showers: "󰼵", - moderate_or_heavy_snow_showers: "󰼵", - light_showers_of_ice_pellets: "󰖒", - moderate_or_heavy_showers_of_ice_pellets: "󰖒", - patchy_light_rain_with_thunder: "󰙾", - moderate_or_heavy_rain_with_thunder: "󰙾", - moderate_or_heavy_rain_in_area_with_thunder: "󰙾", - patchy_light_snow_with_thunder: "󰼶", - moderate_or_heavy_snow_with_thunder: "󰼶" + "113": "clear_day", + "116": "partly_cloudy_day", + "119": "cloud", + "122": "cloud", + "143": "foggy", + "176": "rainy", + "179": "rainy", + "182": "rainy", + "185": "rainy", + "200": "thunderstorm", + "227": "cloudy_snowing", + "230": "snowing_heavy", + "248": "foggy", + "260": "foggy", + "263": "rainy", + "266": "rainy", + "281": "rainy", + "284": "rainy", + "293": "rainy", + "296": "rainy", + "299": "rainy", + "302": "weather_hail", + "305": "rainy", + "308": "weather_hail", + "311": "rainy", + "314": "rainy", + "317": "rainy", + "320": "cloudy_snowing", + "323": "cloudy_snowing", + "326": "cloudy_snowing", + "329": "snowing_heavy", + "332": "snowing_heavy", + "335": "snowing", + "338": "snowing_heavy", + "350": "rainy", + "353": "rainy", + "356": "rainy", + "359": "weather_hail", + "362": "rainy", + "365": "rainy", + "368": "cloudy_snowing", + "371": "snowing", + "374": "rainy", + "377": "rainy", + "386": "thunderstorm", + "389": "thunderstorm", + "392": "thunderstorm", + "395": "snowing" }) readonly property var desktopEntrySubs: ({ @@ -157,7 +152,7 @@ Singleton { const categories = DesktopEntries.applications.values.find(app => app.id === name)?.categories; if (categories) - for (const [key, value] of Object.entries(this.categoryIcons)) + for (const [key, value] of Object.entries(categoryIcons)) if (categories.includes(key)) return value; return fallback; @@ -185,6 +180,12 @@ Singleton { return "bluetooth"; } + function getWeatherIcon(code: string): string { + if (weatherIcons.hasOwnProperty(code)) + return weatherIcons[code]; + return "air"; + } + FileView { path: "/etc/os-release" onLoaded: { -- cgit v1.2.3-freya