File indexing completed on 2024-05-19 05:55:48

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 #include "temperaturechartdata.h"
0010 
0011 #include <QDateTimeAxis>
0012 #include <QPointF>
0013 #include <QSplineSeries>
0014 #include <QValueAxis>
0015 
0016 #include "global.h"
0017 
0018 QVariantList TemperatureChartData::weatherData() const
0019 {
0020     return m_weatherData;
0021 }
0022 
0023 void TemperatureChartData::setWeatherData(const QVariantList &weatherData)
0024 {
0025     m_weatherData = weatherData;
0026     Q_EMIT weatherDataChanged();
0027 
0028     updateData();
0029 }
0030 
0031 void TemperatureChartData::updateData()
0032 {
0033     if (!m_series) {
0034         return;
0035     }
0036 
0037     m_series->clear();
0038 
0039     QList<QPointF> result;
0040     result.reserve(m_weatherData.size());
0041 
0042     double minTemp = std::numeric_limits<double>::max();
0043     double maxTemp = std::numeric_limits<double>::min();
0044 
0045     for (const QVariant &dayVariant : std::as_const(m_weatherData)) {
0046         const auto day = dayVariant.value<KWeatherCore::DailyWeatherForecast>();
0047 
0048         const double dayMinTemp = KWeather::convertTemp(day.minTemp(), KWeatherSettings::self()->temperatureUnits());
0049         const double dayMaxTemp = KWeather::convertTemp(day.maxTemp(), KWeatherSettings::self()->temperatureUnits());
0050 
0051         result.append(QPointF(day.date().startOfDay().toMSecsSinceEpoch(), dayMaxTemp));
0052         minTemp = std::min<double>(dayMinTemp, minTemp);
0053         maxTemp = std::max<double>(dayMaxTemp, maxTemp);
0054     }
0055 
0056     // make enough room for the curve
0057     m_maxTempLimit = maxTemp + 5;
0058     m_minTempLimit = minTemp - 5;
0059 
0060     Q_EMIT maxTempLimitChanged();
0061     Q_EMIT minTempLimitChanged();
0062 
0063     m_series->replace(result);
0064 
0065     if (!m_weatherData.isEmpty()) {
0066         m_axisX->setRange(m_weatherData.first().value<KWeatherCore::DailyWeatherForecast>().date().startOfDay(),
0067                           m_weatherData.last().value<KWeatherCore::DailyWeatherForecast>().date().startOfDay());
0068     }
0069 }
0070 
0071 void TemperatureChartData::initSeries(QAbstractSeries *series)
0072 {
0073     m_series = static_cast<QSplineSeries *>(series);
0074     updateData();
0075 }
0076 
0077 void TemperatureChartData::initAxes(QObject *axisX, QObject *axisY)
0078 {
0079     m_axisX = static_cast<QDateTimeAxis *>(axisX);
0080     m_axisY = static_cast<QValueAxis *>(axisY);
0081 }
0082 
0083 double TemperatureChartData::maxTempLimit() const
0084 {
0085     return m_maxTempLimit;
0086 }
0087 double TemperatureChartData::minTempLimit() const
0088 {
0089     return m_minTempLimit;
0090 }
0091 
0092 #include "moc_temperaturechartdata.cpp"