summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml206
1 files changed, 206 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml b/raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml
new file mode 100644
index 0000000..5c57b65
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Modules/DankDash/WeatherForecastCard.qml
@@ -0,0 +1,206 @@
+import QtQuick
+import qs.Common
+import qs.Services
+import qs.Widgets
+
+Rectangle {
+ id: root
+ radius: Theme.cornerRadius
+
+ property var date: null
+ property var daily: true
+ property var forecastData: null
+ property var dense: false
+
+ readonly property bool isCurrent: {
+ if (daily) {
+ date ? WeatherService.calendarDayDifference(new Date(), date) === 0 : false;
+ } else {
+ date ? WeatherService.calendarHourDifference(new Date(), date) === 0 : false;
+ }
+ }
+
+ readonly property string dateText: {
+ if (daily)
+ return root.forecastData?.day ?? "--";
+ if (!root.forecastData?.rawTime)
+ return root.forecastData?.time ?? "--";
+ try {
+ const date = new Date(root.forecastData.rawTime);
+ const format = SettingsData.use24HourClock ? "HH:mm" : "h:mm AP";
+ return date.toLocaleTimeString(Qt.locale(), format);
+ } catch (e) {
+ return root.forecastData?.time ?? "--";
+ }
+ }
+
+ readonly property var minTemp: WeatherService.formatTemp(root.forecastData?.tempMin)
+ readonly property var maxTemp: WeatherService.formatTemp(root.forecastData?.tempMax)
+ readonly property string minMaxTempText: (minTemp ?? "--") + "/" + (maxTemp ?? "--")
+
+ readonly property var temp: WeatherService.formatTemp(root.forecastData?.temp)
+ readonly property string tempText: temp ?? "--"
+
+ readonly property var feelsLikeTemp: WeatherService.formatTemp(root.forecastData?.feelsLike)
+ readonly property string feelsLikeText: feelsLikeTemp ?? "--"
+
+ readonly property var humidity: WeatherService.formatPercent(root.forecastData?.humidity)
+ readonly property string humidityText: humidity ?? "--"
+
+ readonly property var wind: {
+ SettingsData.windSpeedUnit;
+ SettingsData.useFahrenheit;
+ return WeatherService.formatSpeed(root.forecastData?.wind);
+ }
+ readonly property string windText: wind ?? "--"
+
+ readonly property var pressure: {
+ SettingsData.useFahrenheit;
+ return WeatherService.formatPressure(root.forecastData?.pressure);
+ }
+ readonly property string pressureText: pressure ?? "--"
+
+ readonly property var precipitation: root.forecastData?.precipitationProbability
+ readonly property string precipitationText: precipitation + "%" ?? "--"
+
+ readonly property var visibility: WeatherService.formatVisibility(root.forecastData?.visibility)
+ readonly property string visibilityText: visibility ?? "--"
+
+ readonly property var values: daily ? [] : [
+ {
+ "name"// 'name': "Temperature",
+ :
+ // 'text': root.tempText,
+ // 'icon': "thermometer"
+ // }, {
+ // 'name': "Feels Like",
+ // 'text': root.feelsLikeText,
+ // 'icon': "thermostat"
+ // }, {
+ I18n.tr("Humidity"),
+ "text": root.humidityText,
+ "icon": "humidity_low"
+ },
+ {
+ "name": I18n.tr("Wind Speed"),
+ "text": root.windText,
+ "icon": "air"
+ },
+ {
+ "name": I18n.tr("Pressure"),
+ "text": root.pressureText,
+ "icon": "speed"
+ },
+ {
+ "name": I18n.tr("Precipitation Chance"),
+ "text": root.precipitationText,
+ "icon": "rainy"
+ },
+ {
+ "name": I18n.tr("Visibility"),
+ "text": root.visibilityText,
+ "icon": "wb_sunny"
+ }
+ ]
+
+ color: isCurrent ? Theme.withAlpha(Theme.primary, 0.1) : Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency)
+ border.color: isCurrent ? Theme.withAlpha(Theme.primary, 0.3) : "transparent"
+ border.width: isCurrent ? 1 : 0
+
+ Column {
+ anchors.centerIn: parent
+ spacing: Theme.spacingXS
+
+ StyledText {
+ text: root.forecastData != null ? root.dateText : I18n.tr("Forecast Not Available")
+ font.pixelSize: Theme.fontSizeSmall
+ color: root.isCurrent ? Theme.primary : (root.forecastData ? Theme.surfaceText : Theme.outline)
+ font.weight: root.isCurrent ? Font.Medium : Font.Normal
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ Row {
+ anchors.horizontalCenter: parent.horizontalCenter
+ spacing: Theme.spacingM
+ visible: root.forecastData != null
+
+ Column {
+ spacing: Theme.spacingXS
+
+ DankIcon {
+ name: root.forecastData ? WeatherService.getWeatherIcon(root.forecastData.wCode || 0, root.forecastData.isDay ?? true) : "cloud"
+ size: Theme.iconSize
+ color: root.isCurrent ? Theme.primary : Theme.withAlpha(Theme.primary, 0.8)
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ StyledText {
+ text: root.daily ? root.minMaxTempText : root.tempText
+ font.pixelSize: Theme.fontSizeSmall
+ color: root.isCurrent ? Theme.primary : Theme.surfaceText
+ font.weight: Font.Medium
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ StyledText {
+ text: root.feelsLikeText
+ font.pixelSize: Theme.fontSizeSmall
+ color: root.isCurrent ? Theme.primary : Theme.surfaceText
+ font.weight: Font.Medium
+ anchors.horizontalCenter: parent.horizontalCenter
+ visible: !root.daily
+ }
+ }
+
+ Column {
+ id: detailsColumn
+ spacing: 2
+ visible: !root.dense
+ width: implicitWidth
+
+ states: [
+ State {
+ name: "dense"
+ when: root.dense
+ PropertyChanges {
+ target: detailsColumn
+ opacity: 0
+ width: 0
+ }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ NumberAnimation {
+ properties: "opacity,width"
+ duration: Theme.shortDuration
+ easing.type: Theme.standardEasing
+ }
+ }
+ ]
+
+ Repeater {
+ model: root.values.length
+ Row {
+ spacing: 2
+
+ DankIcon {
+ name: root.values[index].icon
+ size: 8
+ color: Theme.withAlpha(Theme.surfaceText, 0.6)
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ StyledText {
+ text: root.values[index].text
+ font.pixelSize: Theme.fontSizeSmall - 2
+ color: Theme.withAlpha(Theme.surfaceText, 0.6)
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ }
+ }
+ }
+ }
+ }
+}