129 lines
4 KiB
QML
129 lines
4 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import qs.Commons
|
|
import qs.Services
|
|
import qs.Widgets
|
|
|
|
// Weather overview card (placeholder data)
|
|
NBox {
|
|
id: root
|
|
|
|
readonly property bool weatherReady: (LocationService.data.weather !== null)
|
|
|
|
ColumnLayout {
|
|
id: content
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.margins: Style.marginM * scaling
|
|
spacing: Style.marginM * scaling
|
|
|
|
RowLayout {
|
|
spacing: Style.marginS * scaling
|
|
NIcon {
|
|
Layout.alignment: Qt.AlignVCenter
|
|
icon: weatherReady ? LocationService.weatherSymbolFromCode(LocationService.data.weather.current_weather.weathercode) : ""
|
|
font.pointSize: Style.fontSizeXXXL * 1.75 * scaling
|
|
color: Color.mPrimary
|
|
}
|
|
|
|
ColumnLayout {
|
|
spacing: Style.marginXXS * scaling
|
|
NText {
|
|
text: {
|
|
// Ensure the name is not too long if one had to specify the country
|
|
const chunks = Settings.data.location.name.split(",")
|
|
return chunks[0]
|
|
}
|
|
font.pointSize: Style.fontSizeL * scaling
|
|
font.weight: Style.fontWeightBold
|
|
}
|
|
|
|
RowLayout {
|
|
NText {
|
|
visible: weatherReady
|
|
text: {
|
|
if (!weatherReady) {
|
|
return ""
|
|
}
|
|
var temp = LocationService.data.weather.current_weather.temperature
|
|
var suffix = "C"
|
|
if (Settings.data.location.useFahrenheit) {
|
|
temp = LocationService.celsiusToFahrenheit(temp)
|
|
var suffix = "F"
|
|
}
|
|
temp = Math.round(temp)
|
|
return `${temp}°${suffix}`
|
|
}
|
|
font.pointSize: Style.fontSizeXL * scaling
|
|
font.weight: Style.fontWeightBold
|
|
}
|
|
|
|
NText {
|
|
text: weatherReady ? `(${LocationService.data.weather.timezone_abbreviation})` : ""
|
|
font.pointSize: Style.fontSizeXS * scaling
|
|
color: Color.mOnSurfaceVariant
|
|
visible: LocationService.data.weather
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
NDivider {
|
|
visible: weatherReady
|
|
Layout.fillWidth: true
|
|
}
|
|
|
|
RowLayout {
|
|
visible: weatherReady
|
|
Layout.fillWidth: true
|
|
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
|
spacing: Style.marginL * scaling
|
|
Repeater {
|
|
model: weatherReady ? LocationService.data.weather.daily.time : []
|
|
delegate: ColumnLayout {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
spacing: Style.marginL * scaling
|
|
NText {
|
|
text: {
|
|
var weatherDate = new Date(LocationService.data.weather.daily.time[index].replace(/-/g, "/"))
|
|
return Qt.formatDateTime(weatherDate, "ddd")
|
|
}
|
|
color: Color.mOnSurface
|
|
Layout.alignment: Qt.AlignHCenter
|
|
}
|
|
NIcon {
|
|
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
|
|
icon: LocationService.weatherSymbolFromCode(LocationService.data.weather.daily.weathercode[index])
|
|
font.pointSize: Style.fontSizeXXL * 1.6 * scaling
|
|
color: Color.mPrimary
|
|
}
|
|
NText {
|
|
Layout.alignment: Qt.AlignHCenter
|
|
text: {
|
|
var max = LocationService.data.weather.daily.temperature_2m_max[index]
|
|
var min = LocationService.data.weather.daily.temperature_2m_min[index]
|
|
if (Settings.data.location.useFahrenheit) {
|
|
max = LocationService.celsiusToFahrenheit(max)
|
|
min = LocationService.celsiusToFahrenheit(min)
|
|
}
|
|
max = Math.round(max)
|
|
min = Math.round(min)
|
|
return `${max}°/${min}°`
|
|
}
|
|
font.pointSize: Style.fontSizeXS * scaling
|
|
color: Color.mOnSurfaceVariant
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
RowLayout {
|
|
visible: !weatherReady
|
|
Layout.fillWidth: true
|
|
Layout.alignment: Qt.AlignHCenter
|
|
NBusyIndicator {}
|
|
}
|
|
}
|
|
}
|