diff --git a/Widgets/SidePanel/System.qml b/Widgets/SidePanel/System.qml index d004469..a929afb 100644 --- a/Widgets/SidePanel/System.qml +++ b/Widgets/SidePanel/System.qml @@ -11,14 +11,14 @@ import qs.Services import qs.Settings import qs.Widgets import qs.Widgets.LockScreen - + Rectangle { id: systemWidget - + property string uptimeText: "--:--" property bool panelVisible: false property var settingsModal: null - + function logout() { if (WorkspaceManager.isNiri) logoutProcessNiri.running = true; @@ -27,165 +27,163 @@ Rectangle { else console.warn("No supported compositor detected for logout"); } - + function suspend() { suspendProcess.running = true; } - + function shutdown() { shutdownProcess.running = true; } - + function reboot() { rebootProcess.running = true; } - + function updateSystemInfo() { uptimeProcess.running = true; } - + + width: 440 * Theme.scale(Screen) + height: 80 * Theme.scale(Screen) color: "transparent" - // anchors.horizontalCenterOffset: -2 + anchors.horizontalCenterOffset: -2 onPanelVisibleChanged: { if (panelVisible) updateSystemInfo(); - + } Component.onCompleted: { uptimeProcess.running = true; } - + Rectangle { id: card - + anchors.fill: parent color: Theme.surface - radius: 18 - + radius: 18 * Theme.scale(Screen) + ColumnLayout { anchors.fill: parent - anchors.margins: 18 * Theme.scale(screen) - spacing: 12 * Theme.scale(screen) - + anchors.margins: 18 * Theme.scale(Screen) + spacing: 12 * Theme.scale(Screen) + RowLayout { Layout.fillWidth: true - spacing: 12 * Theme.scale(screen) - + spacing: 12 * Theme.scale(Screen) + Rectangle { - width: 48 * Theme.scale(screen) - height: 48 * Theme.scale(screen) - radius: 24 + width: 48 * Theme.scale(Screen) + height: 48 * Theme.scale(Screen) + radius: 24 * Theme.scale(Screen) color: Theme.accentPrimary - + Rectangle { anchors.fill: parent color: "transparent" - radius: 24 + radius: 24 * Theme.scale(Screen) border.color: Theme.accentPrimary - border.width: 2 * Theme.scale(screen) + border.width: 2 * Theme.scale(Screen) z: 2 } - + Avatar { } - + } - + ColumnLayout { - spacing: 4 * Theme.scale(screen) + spacing: 4 * Theme.scale(Screen) Layout.fillWidth: true - + Text { text: Quickshell.env("USER") font.family: Theme.fontFamily - font.pixelSize: 16 * Theme.scale(screen) + font.pixelSize: 16 * Theme.scale(Screen) font.bold: true color: Theme.textPrimary } - + Text { text: "System Uptime: " + uptimeText font.family: Theme.fontFamily - font.pixelSize: 12 * Theme.scale(screen) + font.pixelSize: 12 * Theme.scale(Screen) color: Theme.textSecondary } - + } - + Item { Layout.fillWidth: true } - + Rectangle { id: settingsButton - - width: 32 * Theme.scale(screen) - height: 32 * Theme.scale(screen) - radius: 16 + + width: 32 * Theme.scale(Screen) + height: 32 * Theme.scale(Screen) + radius: 16 * Theme.scale(Screen) color: settingsButtonArea.containsMouse || settingsButtonArea.pressed ? Theme.accentPrimary : "transparent" border.color: Theme.accentPrimary - border.width: 1 * Theme.scale(screen) - + border.width: 1 * Theme.scale(Screen) + Text { - anchors.centerIn: parent - anchors.horizontalCenterOffset: -0.5 * Theme.scale(screen) + anchors.fill: parent text: "settings" font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) + font.pixelSize: 16 * Theme.scale(Screen) color: settingsButtonArea.containsMouse || settingsButtonArea.pressed ? Theme.backgroundPrimary : Theme.accentPrimary - font.variableAxes: { - "wght": (Font.Normal + Font.Bold) / 2 - } + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter } - + MouseArea { id: settingsButtonArea - + anchors.fill: parent cursorShape: Qt.PointingHandCursor hoverEnabled: true onClicked: { if (typeof settingsModal !== 'undefined' && settingsModal && settingsModal.openSettings) settingsModal.openSettings(); - + } } - + StyledTooltip { id: settingsTooltip - + text: "Settings" targetItem: settingsButton tooltipVisible: settingsButtonArea.containsMouse } - + } - + Rectangle { id: systemButton - - width: 32 * Theme.scale(screen) - height: 32 * Theme.scale(screen) - radius: 16 + + width: 32 * Theme.scale(Screen) + height: 32 * Theme.scale(Screen) + radius: width / 2 color: systemButtonArea.containsMouse || systemButtonArea.pressed ? Theme.accentPrimary : "transparent" border.color: Theme.accentPrimary - border.width: 1 * Theme.scale(screen) - + border.width: 1 * Theme.scale(Screen) + Text { - anchors.centerIn: parent - anchors.horizontalCenterOffset: -0.5 * Theme.scale(screen) + anchors.fill: parent text: "power_settings_new" font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) + font.pixelSize: 16 * Theme.scale(Screen) color: systemButtonArea.containsMouse || systemButtonArea.pressed ? Theme.backgroundPrimary : Theme.accentPrimary - font.variableAxes: { - "wght": (Font.Normal + Font.Bold) / 2 - } + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter } - + MouseArea { id: systemButtonArea - + anchors.fill: parent cursorShape: Qt.PointingHandCursor hoverEnabled: true @@ -193,84 +191,98 @@ Rectangle { systemMenu.visible = !systemMenu.visible; } } - + StyledTooltip { id: systemTooltip - + text: "Power Menu" targetItem: systemButton tooltipVisible: systemButtonArea.containsMouse } - + } - + } - + } - + } - + PanelWithOverlay { id: systemMenu - + anchors.top: systemButton.bottom anchors.right: systemButton.right - + Rectangle { - width: 160 * Theme.scale(screen) - height: 220 * Theme.scale(screen) + width: 160 * Theme.scale(Screen) + height: 220 * Theme.scale(Screen) color: Theme.surface - radius: 8 + radius: 8 * Theme.scale(Screen) border.color: Theme.outline - border.width: 1 * Theme.scale(screen) + border.width: 1 * Theme.scale(Screen) visible: true z: 9999 anchors.top: parent.top anchors.right: parent.right - anchors.rightMargin: 32 * Theme.scale(screen) - anchors.topMargin: systemButton.y + systemButton.height + 48 * Theme.scale(screen) - + anchors.rightMargin: 32 * Theme.scale(Screen) + anchors.topMargin: systemButton.y + systemButton.height + 48 * Theme.scale(Screen) + // Prevent closing when clicking in the panel bg MouseArea { anchors.fill: parent } - + ColumnLayout { anchors.fill: parent - anchors.margins: 8 * Theme.scale(screen) - spacing: 4 * Theme.scale(screen) - + anchors.margins: 8 * Theme.scale(Screen) + spacing: 4 * Theme.scale(Screen) + Rectangle { Layout.fillWidth: true - Layout.preferredHeight: 36 * Theme.scale(screen) - radius: 6 + Layout.preferredHeight: 36 * Theme.scale(Screen) + radius: 6 * Theme.scale(Screen) color: lockButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - - RowLayout { - anchors.fill: parent - anchors.margins: 12 * Theme.scale(screen) - spacing: 8 * Theme.scale(screen) - - Text { - text: "lock_outline" - font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) - color: lockButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 12 * Theme.scale(Screen) + anchors.rightMargin: 12 * Theme.scale(Screen) + + Row { + id: lockRow + spacing: 8 * Theme.scale(Screen) + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + text: "lock_outline" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 * Theme.scale(Screen) + color: lockButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } + + Text { + text: "Lock Screen" + font.family: Theme.fontFamily + font.pixelSize: 14 * Theme.scale(Screen) + color: lockButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } } - - Text { - text: "Lock Screen" - font.family: Theme.fontFamily - font.pixelSize: 14 * Theme.scale(screen) - color: lockButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary - Layout.fillWidth: true - } - } - + MouseArea { id: lockButtonArea - + anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor @@ -279,39 +291,53 @@ Rectangle { systemMenu.visible = false; } } - + } - + Rectangle { Layout.fillWidth: true - Layout.preferredHeight: 36 * Theme.scale(screen) - radius: 6 + Layout.preferredHeight: 36 * Theme.scale(Screen) + radius: 6 * Theme.scale(Screen) color: suspendButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - - RowLayout { - anchors.fill: parent - anchors.margins: 12 * Theme.scale(screen) - spacing: 8 * Theme.scale(screen) - - Text { - text: "bedtime" - font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) - color: suspendButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 12 * Theme.scale(Screen) + anchors.rightMargin: 12 * Theme.scale(Screen) + + Row { + id: suspendRow + spacing: 8 * Theme.scale(Screen) + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + text: "bedtime" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 * Theme.scale(Screen) + color: suspendButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } + + Text { + text: "Suspend" + font.pixelSize: 14 * Theme.scale(Screen) + color: suspendButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } } - - Text { - text: "Suspend" - font.pixelSize: 14 * Theme.scale(screen) - color: suspendButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary - Layout.fillWidth: true - } - } - + MouseArea { id: suspendButtonArea - + anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor @@ -320,40 +346,54 @@ Rectangle { systemMenu.visible = false; } } - + } - + Rectangle { Layout.fillWidth: true - Layout.preferredHeight: 36 * Theme.scale(screen) - radius: 6 + Layout.preferredHeight: 36 * Theme.scale(Screen) + radius: 6 * Theme.scale(Screen) color: rebootButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - - RowLayout { - anchors.fill: parent - anchors.margins: 12 * Theme.scale(screen) - spacing: 8 * Theme.scale(screen) - - Text { - text: "refresh" - font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) - color: rebootButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 12 * Theme.scale(Screen) + anchors.rightMargin: 12 * Theme.scale(Screen) + + Row { + id: rebootRow + spacing: 8 * Theme.scale(Screen) + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + text: "refresh" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 * Theme.scale(Screen) + color: rebootButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } + + Text { + text: "Reboot" + font.family: Theme.fontFamily + font.pixelSize: 14 * Theme.scale(Screen) + color: rebootButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } } - - Text { - text: "Reboot" - font.family: Theme.fontFamily - font.pixelSize: 14 * Theme.scale(screen) - color: rebootButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary - Layout.fillWidth: true - } - } - + MouseArea { id: rebootButtonArea - + anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor @@ -362,39 +402,53 @@ Rectangle { systemMenu.visible = false; } } - + } - + Rectangle { Layout.fillWidth: true - Layout.preferredHeight: 36 * Theme.scale(screen) - radius: 6 + Layout.preferredHeight: 36 * Theme.scale(Screen) + radius: 6 * Theme.scale(Screen) color: logoutButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - - RowLayout { - anchors.fill: parent - anchors.margins: 12 * Theme.scale(screen) - spacing: 8 * Theme.scale(screen) - - Text { - text: "exit_to_app" - font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) - color: logoutButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 12 * Theme.scale(Screen) + anchors.rightMargin: 12 * Theme.scale(Screen) + + Row { + id: logoutRow + spacing: 8 * Theme.scale(Screen) + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + text: "exit_to_app" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 * Theme.scale(Screen) + color: logoutButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } + + Text { + text: "Logout" + font.pixelSize: 14 * Theme.scale(Screen) + color: logoutButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } } - - Text { - text: "Logout" - font.pixelSize: 14 * Theme.scale(screen) - color: logoutButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary - Layout.fillWidth: true - } - } - + MouseArea { id: logoutButtonArea - + anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor @@ -403,39 +457,53 @@ Rectangle { systemMenu.visible = false; } } - + } - + Rectangle { Layout.fillWidth: true - Layout.preferredHeight: 36 * Theme.scale(screen) - radius: 6 + Layout.preferredHeight: 36 * Theme.scale(Screen) + radius: 6 * Theme.scale(Screen) color: shutdownButtonArea.containsMouse ? Theme.accentPrimary : "transparent" - - RowLayout { - anchors.fill: parent - anchors.margins: 12 * Theme.scale(screen) - spacing: 8 * Theme.scale(screen) - - Text { - text: "power_settings_new" - font.family: "Material Symbols Outlined" - font.pixelSize: 16 * Theme.scale(screen) - color: shutdownButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + + Item { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: 12 * Theme.scale(Screen) + anchors.rightMargin: 12 * Theme.scale(Screen) + + Row { + id: shutdownRow + spacing: 8 * Theme.scale(Screen) + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + + Text { + text: "power_settings_new" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 * Theme.scale(Screen) + color: shutdownButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } + + Text { + text: "Shutdown" + font.pixelSize: 14 * Theme.scale(Screen) + color: shutdownButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary + verticalAlignment: Text.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 1 * Theme.scale(Screen) + } } - - Text { - text: "Shutdown" - font.pixelSize: 14 * Theme.scale(screen) - color: shutdownButtonArea.containsMouse ? Theme.onAccent : Theme.textPrimary - Layout.fillWidth: true - } - } - + MouseArea { id: shutdownButtonArea - + anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor @@ -444,77 +512,81 @@ Rectangle { systemMenu.visible = false; } } - + } - + } - + } - + } - + Process { id: uptimeProcess - + command: ["sh", "-c", "uptime | awk -F 'up ' '{print $2}' | awk -F ',' '{print $1}' | xargs"] running: false - + stdout: StdioCollector { onStreamFinished: { uptimeText = this.text.trim(); uptimeProcess.running = false; } } - + } - + Process { id: shutdownProcess - + command: ["shutdown", "-h", "now"] running: false } - + Process { id: rebootProcess - + command: ["reboot"] running: false } - + Process { id: suspendProcess - + command: ["systemctl", "suspend"] running: false } - + Process { id: logoutProcessNiri - + command: ["niri", "msg", "action", "quit", "--skip-confirmation"] running: false } - + Process { id: logoutProcessHyprland - + command: ["hyprctl", "dispatch", "exit"] running: false } - + Process { id: logoutProcess - + command: ["loginctl", "terminate-user", Quickshell.env("USER")] running: false } - + Timer { interval: 60000 repeat: true running: panelVisible onTriggered: updateSystemInfo() } - -} + + LockScreen { + id: lockScreen + } + +} \ No newline at end of file diff --git a/Widgets/SidePanel/Weather.qml b/Widgets/SidePanel/Weather.qml index 8fbd840..bfad187 100644 --- a/Widgets/SidePanel/Weather.qml +++ b/Widgets/SidePanel/Weather.qml @@ -2,19 +2,23 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls import qs.Settings +import qs.Components import "../../Helpers/Weather.js" as WeatherHelper - + Rectangle { id: weatherRoot + width: 440 * Theme.scale(Screen) + height: 180 * Theme.scale(Screen) color: "transparent" - + anchors.horizontalCenterOffset: -2 + property string city: Settings.settings.weatherCity !== undefined ? Settings.settings.weatherCity : "" property var weatherData: null property string errorString: "" property bool isVisible: false property int lastFetchTime: 0 property bool isLoading: false - + // Auto-refetch weather when city changes Connections { target: Settings.settings @@ -26,31 +30,31 @@ Rectangle { } } } - + Component.onCompleted: { if (isVisible) { fetchCityWeather() } } - + function fetchCityWeather() { if (!city || city.trim() === "") { errorString = "No city configured"; return; } - + // Check if we should fetch new data (avoid fetching too frequently) var currentTime = Date.now(); var timeSinceLastFetch = currentTime - lastFetchTime; - + // Only skip if we have recent data AND lastFetchTime is not 0 (initial state) if (lastFetchTime > 0 && timeSinceLastFetch < 60000) { // 1 minute return; // Skip if last fetch was less than 1 minute ago } - + isLoading = true; errorString = ""; - + WeatherHelper.fetchCityWeather(city, function(result) { weatherData = result.weather; @@ -64,138 +68,139 @@ Rectangle { } ); } - + function startWeatherFetch() { isVisible = true // Force refresh when panel opens, regardless of time check lastFetchTime = 0; fetchCityWeather(); } - + function stopWeatherFetch() { isVisible = false } - + Rectangle { id: card anchors.fill: parent color: Theme.surface - radius: 18 - + radius: 18 * Theme.scale(Screen) + ColumnLayout { anchors.fill: parent - anchors.margins: 18 * Theme.scale(screen) - spacing: 12 * Theme.scale(screen) - - + anchors.margins: 18 * Theme.scale(Screen) + spacing: 12 * Theme.scale(Screen) + + RowLayout { - spacing: 12 * Theme.scale(screen) + spacing: 12 * Theme.scale(Screen) Layout.fillWidth: true - - + + RowLayout { - spacing: 12 * Theme.scale(screen) - Layout.preferredWidth: 140 * Theme.scale(screen) - + spacing: 12 * Theme.scale(Screen) + Layout.preferredWidth: 140 * Theme.scale(Screen) + + + Spinner { + id: loadingSpinner + running: isLoading + color: Theme.accentPrimary + size: 28 * Theme.scale(Screen) + Layout.alignment: Qt.AlignVCenter + visible: isLoading + } Text { id: weatherIcon - text: isLoading ? "sync" : (weatherData && weatherData.current_weather ? materialSymbolForCode(weatherData.current_weather.weathercode) : "cloud") + visible: !isLoading + text: weatherData && weatherData.current_weather ? materialSymbolForCode(weatherData.current_weather.weathercode) : "cloud" font.family: "Material Symbols Outlined" - font.pixelSize: 28 * Theme.scale(screen) + font.pixelSize: 28 * Theme.scale(Screen) verticalAlignment: Text.AlignVCenter - color: isLoading ? Theme.accentPrimary : Theme.accentPrimary + color: Theme.accentPrimary Layout.alignment: Qt.AlignVCenter - - // Add rotation animation for loading state - RotationAnimation on rotation { - running: isLoading - from: 0 - to: 360 - duration: 1000 - loops: Animation.Infinite - } } - + ColumnLayout { - spacing: 2 * Theme.scale(screen) + spacing: 2 * Theme.scale(Screen) RowLayout { - spacing: 4 * Theme.scale(screen) + spacing: 4 * Theme.scale(Screen) Text { text: city font.family: Theme.fontFamily - font.pixelSize: 14 * Theme.scale(screen) + font.pixelSize: 14 * Theme.scale(Screen) font.bold: true color: Theme.textPrimary } Text { text: weatherData && weatherData.timezone_abbreviation ? `(${weatherData.timezone_abbreviation})` : "" font.family: Theme.fontFamily - font.pixelSize: 10 * Theme.scale(screen) + font.pixelSize: 10 * Theme.scale(Screen) color: Theme.textSecondary - leftPadding: 2 * Theme.scale(screen) + leftPadding: 2 * Theme.scale(Screen) } } Text { text: weatherData && weatherData.current_weather ? ((Settings.settings.useFahrenheit !== undefined ? Settings.settings.useFahrenheit : false) ? `${Math.round(weatherData.current_weather.temperature * 9/5 + 32)}°F` : `${Math.round(weatherData.current_weather.temperature)}°C`) : ((Settings.settings.useFahrenheit !== undefined ? Settings.settings.useFahrenheit : false) ? "--°F" : "--°C") font.family: Theme.fontFamily - font.pixelSize: 24 * Theme.scale(screen) + font.pixelSize: 24 * Theme.scale(Screen) font.bold: true color: Theme.textPrimary } } } - + Item { Layout.fillWidth: true } } - - + + Rectangle { width: parent.width - height: 1 // Don't scale divider + height: 1 * Theme.scale(Screen) color: Qt.rgba(Theme.textSecondary.g, Theme.textSecondary.g, Theme.textSecondary.b, 0.12) Layout.fillWidth: true - Layout.topMargin: 2 * Theme.scale(screen) - Layout.bottomMargin: 2 * Theme.scale(screen) + Layout.topMargin: 2 * Theme.scale(Screen) + Layout.bottomMargin: 2 * Theme.scale(Screen) } - - + + RowLayout { - spacing: 12 * Theme.scale(screen) + spacing: 12 * Theme.scale(Screen) Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter visible: weatherData && weatherData.daily && weatherData.daily.time - + Repeater { model: weatherData && weatherData.daily && weatherData.daily.time ? 5 : 0 delegate: ColumnLayout { - spacing: 2 * Theme.scale(screen) + spacing: 2 * Theme.scale(Screen) Layout.alignment: Qt.AlignHCenter Text { - + text: Qt.formatDateTime(new Date(weatherData.daily.time[index]), "ddd") font.family: Theme.fontFamily - font.pixelSize: 12 * Theme.scale(screen) + font.pixelSize: 12 * Theme.scale(Screen) color: Theme.textSecondary horizontalAlignment: Text.AlignHCenter Layout.alignment: Qt.AlignHCenter } Text { - + text: materialSymbolForCode(weatherData.daily.weathercode[index]) font.family: "Material Symbols Outlined" - font.pixelSize: 22 * Theme.scale(screen) + font.pixelSize: 22 * Theme.scale(Screen) color: Theme.accentPrimary horizontalAlignment: Text.AlignHCenter Layout.alignment: Qt.AlignHCenter } Text { - + text: weatherData && weatherData.daily ? ((Settings.settings.useFahrenheit !== undefined ? Settings.settings.useFahrenheit : false) ? `${Math.round(weatherData.daily.temperature_2m_max[index] * 9/5 + 32)}° / ${Math.round(weatherData.daily.temperature_2m_min[index] * 9/5 + 32)}°` : `${Math.round(weatherData.daily.temperature_2m_max[index])}° / ${Math.round(weatherData.daily.temperature_2m_min[index])}°`) : ((Settings.settings.useFahrenheit !== undefined ? Settings.settings.useFahrenheit : false) ? "--° / --°" : "--° / --°") font.family: Theme.fontFamily - font.pixelSize: 12 * Theme.scale(screen) + font.pixelSize: 12 * Theme.scale(Screen) color: Theme.textPrimary horizontalAlignment: Text.AlignHCenter Layout.alignment: Qt.AlignHCenter @@ -203,21 +208,21 @@ Rectangle { } } } - - + + Text { text: errorString color: Theme.error visible: errorString !== "" font.family: Theme.fontFamily - font.pixelSize: 10 * Theme.scale(screen) + font.pixelSize: 10 * Theme.scale(Screen) horizontalAlignment: Text.AlignHCenter Layout.alignment: Qt.AlignHCenter } } } - - + + function materialSymbolForCode(code) { if (code === 0) return "sunny"; if (code === 1 || code === 2) return "partly_cloudy_day";