Warning, /utilities/kweather/src/qml/FlatLocationForecast.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-FileCopyrightText: 2020 Han Young <hanyoung@protonmail.com>
0003  * SPDX-FileCopyrightText: 2020 Devin Lin <espidev@gmail.com>
0004  * SPDX-FileCopyrightText: 2021 Nicolas Fella <nicolas.fella@gmx.de>
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 import QtQuick
0010 import QtQuick.Controls
0011 import QtQuick.Layouts
0012 import QtQuick.Shapes
0013 
0014 import org.kde.kirigami as Kirigami
0015 import org.kde.kweather
0016 
0017 Kirigami.ScrollablePage {
0018     id: root
0019 
0020     background: null // transparent, since there is a page behind
0021 
0022     property var weatherLocation
0023     property var selectedDay: dailyListView.currentItem ? dailyListView.currentItem.weather : weatherLocation.dayForecasts[0]
0024 
0025     property bool inView: false
0026 
0027     // swipe down to refresh
0028     supportsRefreshing: true
0029     onRefreshingChanged: {
0030         if (refreshing) {
0031             weatherLocation.update();
0032         }
0033     }
0034 
0035     Connections {
0036         target: weatherLocation
0037         ignoreUnknownSignals: true
0038         function onStopLoadingIndicator() {
0039             root.refreshing = false;
0040 
0041             // flat mode loads all locations at once, only show one notification for the current item
0042             if (root.ListView.isCurrentItem) {
0043                 showPassiveNotification(i18n("Weather refreshed for %1", weatherLocation.name));
0044             }
0045         }
0046     }
0047 
0048     // all elements are in a column
0049     ColumnLayout {
0050         spacing: 0
0051         RowLayout {
0052             Layout.alignment: Qt.AlignHCenter
0053             Kirigami.Icon {
0054                 id: weatherIcon
0055                 source: weatherLocation.currentHourForecast ? weatherLocation.currentHourForecast.weatherIcon : "weather-none-available"
0056                 Layout.preferredHeight: width
0057                 Layout.preferredWidth: root.width * 0.8 - headerText.width
0058                 Layout.maximumHeight: Kirigami.Theme.defaultFont.pointSize * 15
0059                 Layout.maximumWidth: Kirigami.Theme.defaultFont.pointSize * 15
0060                 Layout.minimumHeight: Kirigami.Theme.defaultFont.pointSize * 5
0061                 Layout.minimumWidth: Kirigami.Theme.defaultFont.pointSize * 5
0062                 smooth: true
0063             }
0064 
0065             // weather header
0066             ColumnLayout {
0067                 id: headerText
0068                 RowLayout {
0069                     spacing: 0
0070                     Label {
0071                         font.pointSize: Kirigami.Theme.defaultFont.pointSize * 3
0072                         font.weight: Font.Light
0073                         font.family: lightHeadingFont.name
0074                         text: weatherLocation.currentHourForecast ? Math.round(Formatter.convertTemp(weatherLocation.currentHourForecast.temperature, settingsModel.temperatureUnits)) : ""
0075                     }
0076                     Label {
0077                         Layout.alignment: Qt.AlignTop
0078                         Layout.topMargin: Kirigami.Units.largeSpacing
0079                         font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.5
0080                         font.weight: Font.Light
0081                         font.family: lightHeadingFont.name
0082                         text: Formatter.formatTemperatureUnitDegrees(settingsModel.temperatureUnits)
0083                     }
0084                 }
0085                 Label {
0086                     font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.3
0087                     font.weight: Font.Bold
0088                     text: weatherLocation.currentHourForecast ? weatherLocation.currentHourForecast.weatherDescription : ""
0089                 }
0090                 Label {
0091                     color: Kirigami.Theme.disabledTextColor
0092                     Layout.topMargin: Kirigami.Units.largeSpacing
0093                     font.pointSize: Kirigami.Theme.defaultFont.pointSize * 0.9
0094                     text: i18n("Updated at %1", weatherLocation.lastUpdated)
0095                 }
0096             }
0097         }
0098 
0099         PageIndicator {
0100             visible: Kirigami.Settings.isMobile
0101             Layout.topMargin: Kirigami.Units.largeSpacing
0102             Layout.alignment: Qt.AlignHCenter
0103             opacity: forecastView.count > 1 ? 1 : 0
0104             count: forecastView.count
0105             currentIndex: forecastView.currentIndex
0106         }
0107 
0108         // daily view
0109         Label {
0110             text: i18n("Daily")
0111             font.pointSize: Math.round(Kirigami.Theme.defaultFont.pointSize * 1.2)
0112             Layout.topMargin: Kirigami.Units.largeSpacing
0113         }
0114 
0115         Kirigami.Separator {
0116             Layout.fillWidth: true
0117             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0118         }
0119 
0120         WeatherStrip {
0121             id: dailyListView
0122             selectable: true
0123             Layout.fillWidth: true
0124             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0125             spacing: Kirigami.Units.largeSpacing
0126 
0127             highlightMoveDuration: 250
0128             highlightMoveVelocity: -1
0129             highlight: Rectangle {
0130                 color: Kirigami.Theme.focusColor
0131                 border {
0132                     color: Kirigami.Theme.focusColor
0133                     width: 1
0134                 }
0135                 radius: 4
0136                 opacity: 0.3
0137                 focus: true
0138             }
0139 
0140             model: weatherLocation.dayForecasts
0141             delegate: WeatherDayDelegate {
0142                 weather: modelData
0143                 textColor: Kirigami.Theme.textColor
0144                 secondaryTextColor: Kirigami.Theme.disabledTextColor
0145             }
0146 
0147             onCurrentIndexChanged: {
0148                 weatherLocation.selectedDay = currentIndex
0149             }
0150         }
0151 
0152         // hourly view
0153         Label {
0154             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0155             text: i18n("Hourly")
0156             font.pointSize: Math.round(Kirigami.Theme.defaultFont.pointSize * 1.2)
0157         }
0158 
0159         Kirigami.Separator {
0160             Layout.fillWidth: true
0161             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0162         }
0163 
0164         WeatherStrip {
0165             id: hourlyListView
0166             selectable: false
0167             implicitHeight: Kirigami.Units.gridUnit * 10.5
0168             Layout.fillWidth: true
0169             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0170 
0171             model: weatherLocation.hourForecasts
0172 
0173             delegate: WeatherHourDelegate {
0174                 weather: modelData
0175                 textColor: Kirigami.Theme.textColor
0176                 secondaryTextColor: Kirigami.Theme.disabledTextColor
0177             }
0178         }
0179 
0180         InfoCard {
0181             Layout.fillWidth: true
0182             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0183         }
0184 
0185         SunriseCard {
0186             Layout.fillWidth: true
0187             Layout.topMargin: Kirigami.Units.largeSpacing * 2
0188             selectedDay: root.selectedDay
0189         }
0190     }
0191 }
0192