Merge lp:~martin-borho/ubuntu-weather-app/reboot-real-weather-data into lp:ubuntu-weather-app
- reboot-real-weather-data
- Merge into reboot
Status: | Superseded |
---|---|
Proposed branch: | lp:~martin-borho/ubuntu-weather-app/reboot-real-weather-data |
Merge into: | lp:ubuntu-weather-app |
Diff against target: |
323 lines (+169/-47) 4 files modified
app/components/HomeGraphic.qml (+3/-1) app/ubuntu-weather-app.qml (+84/-11) app/ui/HomePage.qml (+81/-30) po/com.ubuntu.weather.pot (+1/-5) |
To merge this branch: | bzr merge lp:~martin-borho/ubuntu-weather-app/reboot-real-weather-data |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ubuntu Weather Developers | Pending | ||
Review via email: mp+249001@code.launchpad.net |
This proposal supersedes a proposal from 2015-02-07.
Commit message
Description of the change
Filled static prototype components with real weather data.
- 7. By Martin Borho
-
Filled static prototype components with real weather data.
Approved by Victor Thompson, Ubuntu Phone Apps Jenkins Bot.
- 8. By Andrew Hayzen
-
* Add bottom edge page listing the locations.
Approved by Victor Thompson, Ubuntu Phone Apps Jenkins Bot.
- 9. By Andrew Hayzen
-
* Use Settings API, with migration of data - deletion of old data not enabled yet.
Approved by Victor Thompson, Ubuntu Phone Apps Jenkins Bot.
- 10. By Andrew Hayzen
-
* Basic implementation of settings for Units, DataProvider and RefreshInterval. Fixes: https:/
/bugs.launchpad .net/bugs/ 1420609. Approved by Victor Thompson, Ubuntu Phone Apps Jenkins Bot.
- 11. By Martin Borho
-
Put locations in a Listview and all in a Flickable
- 12. By Martin Borho
-
removed snapMode for LocatioonPanes due to error
- 13. By Martin Borho
-
minor comments changes
- 14. By Martin Borho
-
added current property to settings
- 15. By Martin Borho
-
removed highlightMoveDu
ration - 16. By Martin Borho
-
currentIndex gets set from settings.current
- 17. By Martin Borho
-
formatting
- 18. By Martin Borho
-
pushing HomePage.qml directly to pagestack
Unmerged revisions
Preview Diff
1 | === modified file 'app/components/HomeGraphic.qml' |
2 | --- app/components/HomeGraphic.qml 2015-02-03 21:26:09 +0000 |
3 | +++ app/components/HomeGraphic.qml 2015-02-07 17:40:43 +0000 |
4 | @@ -23,6 +23,8 @@ |
5 | height: units.gu(32) |
6 | width: parent.width |
7 | |
8 | + property alias icon: iconLabel.text |
9 | + |
10 | // TODO: will be on 'rails' (horizontal listview?) to reveal hourly forecast |
11 | Image { |
12 | anchors { |
13 | @@ -36,10 +38,10 @@ |
14 | color: "#F00" |
15 | |
16 | Label { |
17 | + id: iconLabel |
18 | anchors { |
19 | centerIn: parent |
20 | } |
21 | - text: "IMAGE HERE!" |
22 | } |
23 | } |
24 | } |
25 | |
26 | === modified file 'app/ubuntu-weather-app.qml' |
27 | --- app/ubuntu-weather-app.qml 2015-02-06 15:35:49 +0000 |
28 | +++ app/ubuntu-weather-app.qml 2015-02-07 17:40:43 +0000 |
29 | @@ -41,20 +41,64 @@ |
30 | useDeprecatedToolbar: false |
31 | anchorToKeyboard: true |
32 | |
33 | + /* |
34 | + List of locations and their data, accessible through index |
35 | + */ |
36 | + property var locationsList: [] |
37 | + |
38 | + /* |
39 | + Index of Location before a refresh, to go back after |
40 | + */ |
41 | + property int indexAtRefresh: -1 |
42 | + |
43 | + /* |
44 | + Set default values for settings here |
45 | + */ |
46 | + property var settings: { |
47 | + "units": Qt.locale().measurementSystem === Locale.MetricSystem ? "metric" : "imperial", |
48 | + "wind_units": Qt.locale().measurementSystem === Locale.MetricSystem ? "kmh" : "mph", |
49 | + "precip_units": Qt.locale().measurementSystem === Locale.MetricSystem ? "mm" : "in", |
50 | + "service": "weatherchannel" |
51 | + } |
52 | + |
53 | + /* |
54 | + Scale symbols and labels. |
55 | + */ |
56 | + property string tempScale |
57 | + property string speedScale |
58 | + property string precipScale |
59 | + property string tempUnits |
60 | + property string windUnits |
61 | + property string precipUnits |
62 | + |
63 | + /* |
64 | + After reading the settings from storage and updating the default |
65 | + settings with the user selected ones, (re)load pages! |
66 | + */ |
67 | Component.onCompleted: { |
68 | - storage.getLocations(function(locations) { |
69 | - WeatherApi.sendRequest({ |
70 | - action: "updateData", |
71 | - params: { |
72 | - locations:locations, |
73 | - force:false, |
74 | - service: "weatherchannel", |
75 | - api_key: Key.twcKey |
76 | - } |
77 | - }, responseDataHandler) |
78 | + storage.getSettings(function(storedSettings) { |
79 | + for(var settingName in storedSettings) { |
80 | + settings[settingName] = storedSettings[settingName]; |
81 | + } |
82 | + setScalesAndLabels(); |
83 | + refreshData(); |
84 | }) |
85 | } |
86 | |
87 | + function setScalesAndLabels() { |
88 | + // set scales |
89 | + tempScale = String("°") + ((settings["units"] === "imperial") ? "F" : "C") |
90 | + speedScale = ((settings["wind_units"] === "mph") ? "mph" : "km/h") |
91 | + precipScale = ((settings["precip_units"] === "in") ? "in" : "mm") |
92 | + tempUnits = ((settings["units"] === 'imperial') ? 'imperial' : 'metric') |
93 | + windUnits = ((settings["wind_units"] === 'mph') ? 'imperial' : 'metric') |
94 | + precipUnits = ((settings["precip_units"] === 'in') ? 'imperial' : 'metric') |
95 | + } |
96 | + |
97 | + /* |
98 | + Handle response data from data backend. Checks if a location |
99 | + was updated and has to be stored again. |
100 | + */ |
101 | function responseDataHandler(messageObject) { |
102 | if(!messageObject.error) { |
103 | if(messageObject.action === "updateData") { |
104 | @@ -65,7 +109,7 @@ |
105 | } |
106 | }); |
107 | //print(JSON.stringify(messageObject.result)); |
108 | - //buildTabs(messageObject.result); |
109 | + fillPages(messageObject.result); |
110 | } |
111 | } else { |
112 | console.log(messageObject.error.msg+" / "+messageObject.error.request.url) |
113 | @@ -73,6 +117,35 @@ |
114 | } |
115 | } |
116 | |
117 | + /* Fill the location pages with their data. */ |
118 | + function fillPages(locations) { |
119 | + locationsList = locations; |
120 | + // refactor this when Location are in a ListView! |
121 | + homePage.renderData(); |
122 | + } |
123 | + |
124 | + /* |
125 | + Refresh data, either directly from storage or by checking against |
126 | + API instead. |
127 | + */ |
128 | + function refreshData(from_storage, force_refresh) { |
129 | + if(from_storage === true && force_refresh !== true) { |
130 | + storage.getLocations(fillPages); |
131 | + } else { |
132 | + storage.getLocations(function(locations) { |
133 | + WeatherApi.sendRequest({ |
134 | + action: "updateData", |
135 | + params: { |
136 | + locations:locations, |
137 | + force:force_refresh, |
138 | + service:settings["service"], |
139 | + api_key: Key.twcKey |
140 | + } |
141 | + }, responseDataHandler) |
142 | + }); |
143 | + } |
144 | + } |
145 | + |
146 | Data.Storage { |
147 | id: storage |
148 | } |
149 | |
150 | === modified file 'app/ui/HomePage.qml' |
151 | --- app/ui/HomePage.qml 2015-02-03 21:26:09 +0000 |
152 | +++ app/ui/HomePage.qml 2015-02-07 17:40:43 +0000 |
153 | @@ -24,14 +24,85 @@ |
154 | |
155 | Page { |
156 | // Set to null otherwise the header is shown (but blank) over the top of the listview |
157 | + id: locationPage |
158 | flickable: null |
159 | |
160 | + /* |
161 | + Data properties |
162 | + */ |
163 | + property string name; |
164 | + property string conditionText |
165 | + property int currentTemp |
166 | + property string todayMaxTemp |
167 | + property string todayMinTemp |
168 | + property string iconName |
169 | + |
170 | + // TODO map iconnames to source image names |
171 | + property var iconMap: { |
172 | + "moon": "moon.svg" |
173 | + // etc pp |
174 | + } |
175 | + |
176 | + /* |
177 | + Format date object by given format. |
178 | + */ |
179 | + function formatTimestamp(dateData, format) { |
180 | + var date = new Date(dateData.year, dateData.month, dateData.date, dateData.hours, dateData.minutes) |
181 | + return Qt.formatDate(date, i18n.tr(format)) |
182 | + } |
183 | + |
184 | + /* |
185 | + Extracts values from the location weather data and puts them into the appropriate components |
186 | + to display them. |
187 | + |
188 | + Attention: Data access happens through "weatherApp.locationList[]" by index, since complex |
189 | + data in models will lead to type problems. |
190 | + */ |
191 | + function renderData() { |
192 | + var index = Math.floor(Math.random()*weatherApp.locationsList.length), // TODO get this value from ListView.currentIndex later! |
193 | + data = weatherApp.locationsList[index], |
194 | + current = data.data[0].current, |
195 | + forecasts = data.data, |
196 | + forecastsLength = forecasts.length, |
197 | + today = forecasts[0], |
198 | + tempUnits = weatherApp.tempUnits, |
199 | + tempScale = weatherApp.tempScale; |
200 | + |
201 | + // set general location data |
202 | + name = data.location.adminName1; |
203 | + |
204 | + // set current temps and condition |
205 | + iconName = (current.icon) ? current.icon : "" |
206 | + conditionText = (current.condition.main) ? current.condition.main : current.condition; // difference TWC/OWM |
207 | + todayMaxTemp = (today[tempUnits].tempMax) ? Math.round(today[tempUnits].tempMax).toString() + tempScale: ""; |
208 | + todayMinTemp = Math.round(today[tempUnits].tempMin.toString()) + tempScale; |
209 | + currentTemp = Math.round(current[tempUnits].temp); |
210 | + |
211 | + // reset days list |
212 | + mainPageWeekdayListView.model.clear() |
213 | + |
214 | + // set daily forecasts |
215 | + if(forecastsLength > 0) { |
216 | + for(var x=1;x<forecastsLength;x++) { |
217 | + // print(JSON.stringify(forecasts[x][units])) |
218 | + var dayData = { |
219 | + day: formatTimestamp(forecasts[x].date, 'dddd'), |
220 | + low: Math.round(forecasts[x][tempUnits].tempMin).toString() + tempScale, |
221 | + high: (forecasts[x][tempUnits].tempMax !== undefined) ? Math.round(forecasts[x][tempUnits].tempMax).toString() + tempScale : "", |
222 | + image: (forecasts[x].icon !== undefined && iconMap[forecasts[x].icon] !== undefined) ? iconMap[forecasts[x].icon] + tempScale : "" |
223 | + } |
224 | + mainPageWeekdayListView.model.append(dayData); |
225 | + } |
226 | + } |
227 | + } |
228 | + |
229 | ListView { |
230 | id: mainPageWeekdayListView |
231 | anchors { |
232 | fill: parent |
233 | margins: units.gu(2) |
234 | } |
235 | + |
236 | header: Column { |
237 | anchors { |
238 | left: parent.left |
239 | @@ -40,50 +111,30 @@ |
240 | spacing: units.gu(1) |
241 | |
242 | HeaderRow { |
243 | - locationName: "Hackney" // TODO: non static |
244 | + locationName: locationPage.name |
245 | } |
246 | |
247 | HomeGraphic { |
248 | - |
249 | + icon: locationPage.iconName |
250 | } |
251 | |
252 | HomeTempInfo { |
253 | - description: i18n.tr("Rainy & windy") // TODO: non static |
254 | - high: "13°C" |
255 | - low: "10°C" |
256 | - now: "13°" // TODO: non static |
257 | + description: locationPage.conditionText |
258 | + high: locationPage.todayMaxTemp |
259 | + low: locationPage.todayMinTemp |
260 | + now: locationPage.currentTemp |
261 | } |
262 | |
263 | ListItem.ThinDivider { |
264 | |
265 | } |
266 | } |
267 | - model: ListModel { // TODO: non static |
268 | - ListElement { |
269 | - day: "Saturday" |
270 | - low: 12 |
271 | - high: 15 |
272 | - } |
273 | - ListElement { |
274 | - day: "Sunday" |
275 | - low: 14 |
276 | - high: 18 |
277 | - } |
278 | - ListElement { |
279 | - day: "Monday" |
280 | - low: 10 |
281 | - high: 11 |
282 | - } |
283 | - ListElement { |
284 | - day: "Tuesday" |
285 | - low: -7 |
286 | - high: 0 |
287 | - } |
288 | - } |
289 | + model: ListModel {} |
290 | + |
291 | delegate: DayDelegate { |
292 | day: model.day |
293 | - high: model.high + "°C" // TODO: non static |
294 | - low: model.low + "°C" |
295 | + high: model.high |
296 | + low: model.low |
297 | } |
298 | } |
299 | } |
300 | |
301 | === modified file 'po/com.ubuntu.weather.pot' |
302 | --- po/com.ubuntu.weather.pot 2015-02-03 21:26:09 +0000 |
303 | +++ po/com.ubuntu.weather.pot 2015-02-07 17:40:43 +0000 |
304 | @@ -8,7 +8,7 @@ |
305 | msgstr "" |
306 | "Project-Id-Version: ubuntu-weather-app\n" |
307 | "Report-Msgid-Bugs-To: \n" |
308 | -"POT-Creation-Date: 2015-02-03 21:25+0000\n" |
309 | +"POT-Creation-Date: 2015-02-07 18:30+0100\n" |
310 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
311 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
312 | "Language-Team: LANGUAGE <LL@li.org>\n" |
313 | @@ -21,10 +21,6 @@ |
314 | msgid "Today" |
315 | msgstr "" |
316 | |
317 | -#: ../app/ui/HomePage.qml:51 |
318 | -msgid "Rainy & windy" |
319 | -msgstr "" |
320 | - |
321 | #: ubuntu-weather-app.desktop.in.in.h:1 |
322 | msgid "Weather" |
323 | msgstr "" |