]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - apps/thermostat-demo.git/blob - weatherwidget.cpp
.project: Added Code Composer project
[apps/thermostat-demo.git] / weatherwidget.cpp
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