-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathForecastStore.cpp
More file actions
124 lines (105 loc) · 4.02 KB
/
Copy pathForecastStore.cpp
File metadata and controls
124 lines (105 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "ForecastStore.h"
#include "weatherApi.h"
#include <QJsonObject>
#include <QDateTime>
#include <QDebug>
ForecastStore::ForecastStore(QObject* parent) : QObject(parent) {}
void ForecastStore::setWeatherApi(WeatherAPI* api) {
if (m_api)
disconnect(m_api, nullptr, this, nullptr);
m_api = api;
if (m_api) {
connect(m_api, &WeatherAPI::weatherDailyReady,
this, &ForecastStore::onWeatherDailyReady);
connect(m_api, &WeatherAPI::weatherHourlyReady,
this, &ForecastStore::onWeatherHourlyReady);
}
}
QString ForecastStore::mode() const {
return m_range.contains('h') ? "hourly" : "daily";
}
void ForecastStore::setCities(const QVariantList& cities) {
m_cities = cities;
qDebug() << "[ForecastStore] setCities count:" << m_cities.size();
emit citiesChanged();
refreshAll();
}
void ForecastStore::setRange(const QString& range) {
if (m_range == range) return;
m_range = range;
qDebug() << "[ForecastStore] setRange:" << range;
emit rangeChanged();
emit modeChanged();
refreshAll();
}
void ForecastStore::refreshAll() {
if (!m_api || m_cities.isEmpty()) {
qDebug() << "[ForecastStore] refreshAll skip: api=" << (m_api != nullptr) << "cities=" << m_cities.size();
return;
}
bool isHourly = m_range.contains('h');
int count = qMin(m_cities.size(), 4);
qDebug() << "[ForecastStore] refreshAll mode=" << (isHourly ? "hourly" : "daily") << "range=" << m_range << "count=" << count;
for (int i = 0; i < count; ++i) {
QString id = m_cities[i].toMap()["id"].toString();
QString name = m_cities[i].toMap()["name"].toString();
qDebug() << "[ForecastStore] requesting" << m_range << "for" << name << id;
if (isHourly)
m_api->weatherHourly(m_range, id);
else
m_api->weatherDaily(m_range, id);
}
}
// ---- 数据预处理:JSON → QVariantList 图表坐标 ----
void ForecastStore::onWeatherDailyReady(const QString& loc, const QJsonArray& daily) {
QVariantList points;
QString iconDay, textDay;
for (const QJsonValue& val : daily) {
QJsonObject obj = val.toObject();
QVariantMap pt;
QDateTime dt = QDateTime::fromString(obj["fxDate"].toString(), "yyyy-MM-dd");
pt["x"] = dt.isValid() ? dt.toMSecsSinceEpoch() : 0LL;
pt["yMax"] = obj["tempMax"].toString().toDouble();
pt["yMin"] = obj["tempMin"].toString().toDouble();
points.append(pt);
if (iconDay.isEmpty()) {
iconDay = obj["iconDay"].toString();
textDay = obj["textDay"].toString();
}
}
// 写时复制:创建新 map 确保 QML 检测到引用变化
QVariantMap newData = m_chartData;
newData[loc + "_daily"] = points;
QVariantMap info = newData[loc + "_info"].toMap();
info["iconDay"] = iconDay;
info["textDay"] = textDay;
newData[loc + "_info"] = info;
m_chartData = newData;
qDebug() << "[ForecastStore] dailyReady" << loc << "points:" << points.size() << textDay;
emit chartDataChanged();
}
void ForecastStore::onWeatherHourlyReady(const QString& loc, const QJsonArray& hourly) {
QVariantList points;
QString icon, text;
for (const QJsonValue& val : hourly) {
QJsonObject obj = val.toObject();
QVariantMap pt;
QDateTime dt = QDateTime::fromString(obj["fxTime"].toString(), Qt::ISODate);
pt["x"] = dt.isValid() ? dt.toMSecsSinceEpoch() : 0LL;
pt["y"] = obj["temp"].toString().toDouble();
points.append(pt);
if (icon.isEmpty()) {
icon = obj["icon"].toString();
text = obj["text"].toString();
}
}
QVariantMap newData = m_chartData;
newData[loc + "_hourly"] = points;
QVariantMap info = newData[loc + "_info"].toMap();
info["icon"] = icon;
info["text"] = text;
newData[loc + "_info"] = info;
m_chartData = newData;
qDebug() << "[ForecastStore] hourlyReady" << loc << "points:" << points.size() << text;
emit chartDataChanged();
}