1 #include "weatherwidget.h"\r
2 \r
3 #include "forecastdata.h"\r
4 #include "forecastdatawidget.h"\r
5 #include "globalsettings.h"\r
6 #include "weatherdata.h"\r
7 #include "weatherdatawidget.h"\r
8 #include "utilities.h"\r
9 \r
10 WeatherWidget::WeatherWidget(QWidget *parent) :\r
11 QWidget(parent)\r
12 {\r
13 //grab an instance of the global settings\r
14 m_globalSettings = GlobalSettings::getInstance();\r
15 \r
16 setObjectName("weatherWidget");\r
17 setMaximumWidth(parent->width()/1.7);\r
18 setAttribute(Qt::WA_StyledBackground,true);\r
19 \r
20 m_weatherData = NULL;\r
21 // set initial clock time in case no web access\r
22 clock = new QTime(16,18);\r
23 weatherDataWidget = new WeatherDataWidget(this);\r
24 connect(this, SIGNAL(valueChanged()), weatherDataWidget, SLOT(updateData()));\r
25 \r
26 forecastDataWidget = new ForecastDataWidget(this);\r
27 connect(this, SIGNAL(valueChanged()), forecastDataWidget, SLOT(updateData()));\r
28 connect(this, SIGNAL(valueChanged()), this, SLOT(updateData()));\r
29 \r
30 buildStatusWidget();\r
31 \r
32 // create final layout\r
33 QVBoxLayout *mainLayout = new QVBoxLayout;\r
34 \r
35 mainLayout->addWidget(weatherDataWidget, 3);\r
36 mainLayout->addWidget(forecastDataWidget, 5);\r
37 \r
38 mainLayout->setSpacing(1);\r
39 mainLayout->addWidget(statusStackedWidget, 0);\r
40 mainLayout->setAlignment(statusStackedWidget, Qt::AlignBottom);\r
41 \r
42 // show layout\r
43 setLayout(mainLayout);\r
44 m_currentStatus = WeatherWidget::Updating;\r
45 }\r
46 \r
47 void WeatherWidget::buildStatusWidget()\r
48 {\r
49 //create status layout for the first status string\r
50 statusLabel = new QLabel("Connecting...");\r
51 statusLabel->setObjectName("statusLabel");\r
52 statusMovieLabel = new QLabel;\r
53 statusMovie = new QMovie(":/Images/ajax-loader.gif");\r
54 statusMovieLabel->setMovie(statusMovie);\r
55 statusMovie->start();\r
56 \r
57 QHBoxLayout *statusLayoutPage1 = new QHBoxLayout;\r
58 statusLayoutPage1->addStretch();\r
59 statusLayoutPage1->addWidget(statusMovieLabel);\r
60 statusLayoutPage1->addWidget(statusLabel);\r
61 statusLayoutPage1->addStretch();\r
62 statusLayoutPage1->setContentsMargins(0,0,0,0);\r
63 \r
64 //container for a centered label and status image so it can be added\r
65 //to the stacked widget\r
66 QWidget* statusWidgetPage1 = new QWidget;\r
67 statusWidgetPage1->setLayout(statusLayoutPage1);\r
68 \r
69 //create the status layout for the second status string\r
70 statusLabel2 = new QLabel("Connecting...");\r
71 statusLabel2->setObjectName("statusLabel2");\r
72 \r
73 QHBoxLayout *statusLayoutPage2 = new QHBoxLayout;\r
74 statusLayoutPage2->addStretch();\r
75 statusLayoutPage2->addWidget(statusLabel2);\r
76 statusLayoutPage2->addStretch();\r
77 statusLayoutPage2->setContentsMargins(0,0,0,0);\r
78 \r
79 //container for a centered label and status image so it can be added\r
80 //to the stacked widget\r
81 QWidget* statusWidgetPage2 = new QWidget;\r
82 statusWidgetPage2->setLayout(statusLayoutPage2);\r
83 \r
84 //create the stacked widget so we can alternate between messages if they're too\r
85 //long to fit on a single screen\r
86 statusStackedWidget = new QStackedWidget;\r
87 connect(&statusMessageTimer, SIGNAL(timeout()), this, SLOT(advanceStatusWidget()));\r
88 \r
89 statusStackedWidget->addWidget(statusWidgetPage1);\r
90 statusStackedWidget->addWidget(statusWidgetPage2);\r
91 \r
92 statusStackedWidget->setContentsMargins(0,0,0,0);\r
93 }\r
94 \r
95 void WeatherWidget::setCity(QString city)\r
96 {\r
97 // set city from string passed form setting screen\r
98 // format city string correctly to display properly\r
99 QStringList cityList = city.split(",");\r
100 QString cityShort = cityList.at(0);\r
101 if(cityShort.size() > 9) {\r
102 cityShort.resize(9);\r
103 }\r
104 QString countryShort;\r
105 \r
106 if(cityList.at(1).size() < 3) {\r
107 countryShort = cityList.at(1);\r
108 } else if (cityList.at(1) == "Japan") {\r
109 countryShort.append("JP");\r
110 } else if (cityList.at(1) == "South Korea") {\r
111 countryShort.append("KR");\r
112 } else if (cityList.at(1) == "Mexico") {\r
113 countryShort.append("MX");\r
114 } else if (cityList.at(1) == "India") {\r
115 countryShort.append("IN");\r
116 } else if (cityList.at(1) == "Indonesia") {\r
117 countryShort.append("ID");\r
118 } else if (cityList.at(1) == "Brazil") {\r
119 countryShort.append("BR");\r
120 } else if (cityList.at(1) == "China") {\r
121 countryShort.append("CN");\r
122 } else if (cityList.at(1) == "Germany") {\r
123 countryShort.append("DE");\r
124 }else if (cityList.at(1) == "Russia") {\r
125 countryShort.append("RU");\r
126 } else if (cityList.at(1) == "Egypt") {\r
127 countryShort.append("EG");\r
128 } else if (cityList.at(1) == "South Africa") {\r
129 countryShort.append("ZA");\r
130 } else if (cityList.at(1) == "Taiwan") {\r
131 countryShort.append("TW");\r
132 }\r
133 \r
134 \r
135 \r
136 }\r
137 \r
138 void WeatherWidget::setWeatherData(WeatherData *weatherData)\r
139 {\r
140 m_weatherData = weatherData;\r
141 \r
142 weatherDataWidget->setData(weatherData);\r
143 weatherDataWidget->updateData();\r
144 \r
145 forecastDataWidget->setData(weatherData->forecastData());\r
146 forecastDataWidget->updateData();\r
147 }\r
148 \r
149 WeatherData * WeatherWidget::weatherData()\r
150 {\r
151 return m_weatherData;\r
152 }\r
153 \r
154 void WeatherWidget::setStatusUpdated()\r
155 {\r
156 statusMessageTimer.stop();\r
157 \r
158 //start on the first status message\r
159 statusStackedWidget->setCurrentIndex(0);\r
160 \r
161 statusMovieLabel->setVisible(false);\r
162 statusMovie->stop();\r
163 if(m_weatherData)\r
164 {\r
165 QString updatedString = m_weatherData->lastUpdated().toString("MMM d 'at' ") + formatTimeString(m_weatherData->lastUpdated().time(), m_globalSettings->timeFormat());\r
166 statusLabel->setText("Updated " + updatedString);\r
167 }\r
168 else\r
169 statusLabel->setText("Updated");\r
170 \r
171 m_currentStatus = WeatherWidget::UpdateSuccess;\r
172 }\r
173 \r
174 void WeatherWidget::setStatusUpdating()\r
175 {\r
176 statusMessageTimer.stop();\r
177 \r
178 //start on the first status message\r
179 statusStackedWidget->setCurrentIndex(0);\r
180 \r
181 statusMovieLabel->setVisible(true);\r
182 statusMovie->start();\r
183 statusLabel->setText("Updating...");\r
184 \r
185 m_currentStatus = WeatherWidget::Updating;\r
186 }\r
187 \r
188 void WeatherWidget::setStatusFailed()\r
189 {\r
190 //return if were already in a failed state\r
191 if(m_currentStatus == WeatherWidget::UpdateFailed)\r
192 return;\r
193 \r
194 //start on the first status message\r
195 statusStackedWidget->setCurrentIndex(0);\r
196 \r
197 //stop the updating movie and hide it\r
198 statusMovie->stop();\r
199 statusMovieLabel->setVisible(false);\r
200 \r
201 QString updatedString;\r
202 \r
203 //generate a string to say when the last update occurred\r
204 if(m_weatherData)\r
205 updatedString = m_weatherData->lastUpdated().toString("MMM d ") + formatTimeString(m_weatherData->lastUpdated().time(), m_globalSettings->timeFormat());\r
206 else\r
207 updatedString = "Never";\r
208 \r
209 statusLabel->setText("Update Failed");\r
210 statusLabel2->setText("Last Update " + updatedString);\r
211 \r
212 //switch between failure message and last update message every 3 seconds\r
213 statusMessageTimer.start(3000);\r
214 \r
215 m_currentStatus = WeatherWidget::UpdateFailed;\r
216 }\r
217 \r
218 void WeatherWidget::advanceStatusWidget()\r
219 {\r
220 //add one to the current widget and mod 2 to toggle between the two pages\r
221 statusStackedWidget->setCurrentIndex((statusStackedWidget->currentIndex()+1)%2);\r
222 }\r
223 \r
224 void WeatherWidget::updateData()\r
225 {\r
226 if(m_currentStatus == WeatherWidget::UpdateSuccess)\r
227 setStatusUpdated();\r
228 }\r
229 \r
230 void WeatherWidget::mousePressEvent(QMouseEvent *e)\r
231 {\r
232 if(m_currentStatus == WeatherWidget::UpdateFailed)\r
233 emit(webReloadRequested());\r
234 else if(m_currentStatus == WeatherWidget::UpdateSuccess && m_weatherData->lastUpdated().addSecs(10) < QDateTime::currentDateTime())\r
235 emit webReloadRequested();\r
236 e->accept();\r
237 }\r
238 \r
239 QVariantHash WeatherWidget::getCurrentData()\r
240 {\r
241 QVariantHash data;\r
242 data.insert("weatherCurrent", weatherDataWidget->getCurrentData());\r
243 data.insert("weatherForecast", forecastDataWidget->getCurrentData());\r
244 return data;\r
245 }\r