diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-23 23:10:33 +0800 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-05-23 23:10:33 +0800 |
| commit | 95b0c2d3fef9d46790938214e19f945b496a9223 (patch) | |
| tree | 8e614fa565cf47d0ccd307861bd05d619e7b45d9 | |
| parent | internal: fix anim typo (diff) | |
| download | caelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.tar.gz caelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.tar.bz2 caelestia-shell-95b0c2d3fef9d46790938214e19f945b496a9223.zip | |
dashboard: add weather
| -rw-r--r-- | config/DashboardConfig.qml | 1 | ||||
| -rw-r--r-- | modules/dashboard/Dash.qml | 10 | ||||
| -rw-r--r-- | modules/dashboard/dash/Weather.qml | 77 | ||||
| -rw-r--r-- | utils/Icons.qml | 109 |
4 files changed, 138 insertions, 59 deletions
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: { |