Merge lp:~ahayzen/music-app/remix-defer-loading-pages into lp:music-app/remix
- remix-defer-loading-pages
- Merge into remix
Status: | Merged |
---|---|
Approved by: | Victor Thompson |
Approved revision: | 705 |
Merged at revision: | 703 |
Proposed branch: | lp:~ahayzen/music-app/remix-defer-loading-pages |
Merge into: | lp:music-app/remix |
Diff against target: |
677 lines (+242/-133) 14 files modified
MusicAlbums.qml (+15/-7) MusicArtists.qml (+11/-3) MusicGenres.qml (+14/-7) MusicNowPlaying.qml (+18/-4) MusicPlaylists.qml (+31/-8) MusicStart.qml (+17/-10) MusicTracks.qml (+8/-2) MusicaddtoPlaylist.qml (+3/-0) Player.qml (+72/-56) common/AlbumsPage.qml (+14/-7) common/ListItemActions/AddToPlaylist.qml (+10/-3) common/SongsPage.qml (+24/-7) music-app.qml (+2/-15) tests/autopilot/music_app/__init__.py (+3/-4) |
To merge this branch: | bzr merge lp:~ahayzen/music-app/remix-defer-loading-pages |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Victor Thompson | Approve | ||
Ubuntu Phone Apps Jenkins Bot | continuous-integration | Approve | |
Review via email:
|
Commit message
* Defer loading of page
* Async load MediaPlayer object
Description of the change
* Defer loading of pages
* Async load MediaPlayer object
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
- 703. By Andrew Hayzen
-
* Fix for autopilot
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
FAILED: Continuous integration, rev:703
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 704. By Andrew Hayzen
-
* Fix for pyflakes
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:704
http://
Executed test runs:
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Victor Thompson (vthompson) wrote : | # |
A few comments/questions:
1. Should the "Error handling" conditions check for normal equality rather than strict? i.e. == instead of === so 'undefined' might also be matched? Or does createObject() only return 'null' for all error conditions?
2. See small nit pick inline.
- 705. By Andrew Hayzen
-
* Fix for using === instead of ==
* Fix for comment grammar
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Andrew Hayzen (ahayzen) wrote : | # |
Fixed please retest :)
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote : | # |
PASSED: Continuous integration, rev:705
http://
Executed test runs:
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'MusicAlbums.qml' |
2 | --- MusicAlbums.qml 2014-10-24 12:41:57 +0000 |
3 | +++ MusicAlbums.qml 2014-10-26 16:21:02 +0000 |
4 | @@ -48,13 +48,21 @@ |
5 | secondaryText: model.artist |
6 | |
7 | onClicked: { |
8 | - songsPage.album = model.title; |
9 | - songsPage.covers = [{art: model.art}] |
10 | - songsPage.genre = undefined |
11 | - songsPage.isAlbum = true |
12 | - songsPage.line1 = model.artist |
13 | - songsPage.line2 = model.title |
14 | - songsPage.title = i18n.tr("Album") |
15 | + var comp = Qt.createComponent("common/SongsPage.qml") |
16 | + var songsPage = comp.createObject(mainPageStack, |
17 | + { |
18 | + "album": model.title, |
19 | + "covers": [{art: model.art}], |
20 | + "isAlbum": true, |
21 | + "genre": undefined, |
22 | + "title": i18n.tr("Album"), |
23 | + "line1": model.artist, |
24 | + "line2": model.title, |
25 | + }); |
26 | + |
27 | + if (songsPage == null) { // Error Handling |
28 | + console.log("Error creating object"); |
29 | + } |
30 | |
31 | mainPageStack.push(songsPage) |
32 | } |
33 | |
34 | === modified file 'MusicArtists.qml' |
35 | --- MusicArtists.qml 2014-10-24 12:41:57 +0000 |
36 | +++ MusicArtists.qml 2014-10-26 16:21:02 +0000 |
37 | @@ -72,9 +72,17 @@ |
38 | |
39 | |
40 | onClicked: { |
41 | - albumsPage.artist = model.artist; |
42 | - albumsPage.covers = artistCard.coverSources |
43 | - albumsPage.title = i18n.tr("Artist") |
44 | + var comp = Qt.createComponent("common/AlbumsPage.qml") |
45 | + var albumsPage = comp.createObject(mainPageStack, |
46 | + { |
47 | + "artist": model.artist, |
48 | + "covers": artistCard.coverSources, |
49 | + "title": i18n.tr("Artist"), |
50 | + }); |
51 | + |
52 | + if (albumsPage == null) { // Error Handling |
53 | + console.log("Error creating object"); |
54 | + } |
55 | |
56 | mainPageStack.push(albumsPage) |
57 | } |
58 | |
59 | === modified file 'MusicGenres.qml' |
60 | --- MusicGenres.qml 2014-10-24 12:41:57 +0000 |
61 | +++ MusicGenres.qml 2014-10-26 16:21:02 +0000 |
62 | @@ -82,14 +82,21 @@ |
63 | } |
64 | |
65 | onClicked: { |
66 | - songsPage.covers = genreCard.coverSources |
67 | - songsPage.album = undefined |
68 | - songsPage.isAlbum = true |
69 | - songsPage.genre = model.genre; |
70 | - songsPage.title = i18n.tr("Genre") |
71 | - songsPage.line2 = model.genre |
72 | - songsPage.line1 = i18n.tr("Genre") |
73 | + var comp = Qt.createComponent("common/SongsPage.qml") |
74 | + var songsPage = comp.createObject(mainPageStack, |
75 | + { |
76 | + "covers": genreCard.coverSources, |
77 | + "album": undefined, |
78 | + "isAlbum": true, |
79 | + "genre": model.genre, |
80 | + "title": i18n.tr("Genre"), |
81 | + "line2": model.genre, |
82 | + "line1": i18n.tr("Genre") |
83 | + }); |
84 | |
85 | + if (songsPage == null) { // Error Handling |
86 | + console.log("Error creating object"); |
87 | + } |
88 | |
89 | mainPageStack.push(songsPage) |
90 | } |
91 | |
92 | === modified file 'MusicNowPlaying.qml' |
93 | --- MusicNowPlaying.qml 2014-10-24 12:41:57 +0000 |
94 | +++ MusicNowPlaying.qml 2014-10-26 16:21:02 +0000 |
95 | @@ -82,8 +82,14 @@ |
96 | items.push(makeDict(trackQueue.model.get(i))); |
97 | } |
98 | |
99 | - chosenElements = items; |
100 | - mainPageStack.push(addtoPlaylist) |
101 | + var comp = Qt.createComponent("MusicaddtoPlaylist.qml") |
102 | + var addToPlaylist = comp.createObject(mainPageStack, {"chosenElements": items}); |
103 | + |
104 | + if (addToPlaylist == null) { // Error Handling |
105 | + console.log("Error creating object"); |
106 | + } |
107 | + |
108 | + mainPageStack.push(addToPlaylist) |
109 | } |
110 | }, |
111 | Action { |
112 | @@ -136,8 +142,14 @@ |
113 | items.push(makeDict(trackQueue.model.get(queuelist.selectedItems[i]))); |
114 | } |
115 | |
116 | - chosenElements = items; |
117 | - mainPageStack.push(addtoPlaylist) |
118 | + var comp = Qt.createComponent("MusicaddtoPlaylist.qml") |
119 | + var addToPlaylist = comp.createObject(mainPageStack, {"chosenElements": items}); |
120 | + |
121 | + if (addToPlaylist == null) { // Error Handling |
122 | + console.log("Error creating object"); |
123 | + } |
124 | + |
125 | + mainPageStack.push(addToPlaylist) |
126 | |
127 | queuelist.closeSelection() |
128 | } |
129 | @@ -266,7 +278,9 @@ |
130 | id: progressSliderMusic |
131 | anchors.left: parent.left |
132 | anchors.right: parent.right |
133 | + maximumValue: player.duration // load value at startup |
134 | objectName: "progressSliderShape" |
135 | + value: player.position // load value at startup |
136 | |
137 | function formatValue(v) { |
138 | if (seeking) { // update position label while dragging |
139 | |
140 | === modified file 'MusicPlaylists.qml' |
141 | --- MusicPlaylists.qml 2014-10-24 12:41:57 +0000 |
142 | +++ MusicPlaylists.qml 2014-10-26 16:21:02 +0000 |
143 | @@ -34,8 +34,20 @@ |
144 | // Remember to keep the translation short to fit the screen width |
145 | title: i18n.tr("Playlists") |
146 | |
147 | - property string playlistTracks: "" |
148 | - property string inPlaylist: "" |
149 | + property bool changed: false |
150 | + |
151 | + onVisibleChanged: { |
152 | + if (changed) { |
153 | + changed = false |
154 | + refreshWaitTimer.start() |
155 | + } |
156 | + } |
157 | + |
158 | + Timer { // FIXME: workaround for when the playlist is deleted and the delegate being deleting causes freezing |
159 | + id: refreshWaitTimer |
160 | + interval: 250 |
161 | + onTriggered: playlistModel.filterPlaylists() |
162 | + } |
163 | |
164 | head { |
165 | actions: [ |
166 | @@ -62,12 +74,23 @@ |
167 | |
168 | onClicked: { |
169 | albumTracksModel.filterPlaylistTracks(name) |
170 | - songsPage.isAlbum = false |
171 | - songsPage.line1 = i18n.tr("Playlist") |
172 | - songsPage.line2 = model.name |
173 | - songsPage.covers = coverSources |
174 | - songsPage.genre = undefined |
175 | - songsPage.title = i18n.tr("Playlist") |
176 | + |
177 | + var comp = Qt.createComponent("common/SongsPage.qml") |
178 | + var songsPage = comp.createObject(mainPageStack, |
179 | + { |
180 | + "album": undefined, |
181 | + "covers": coverSources, |
182 | + "isAlbum": false, |
183 | + "genre": undefined, |
184 | + "page": playlistsPage, |
185 | + "title": i18n.tr("Playlist"), |
186 | + "line1": i18n.tr("Playlist"), |
187 | + "line2": model.name, |
188 | + }); |
189 | + |
190 | + if (songsPage == null) { // Error Handling |
191 | + console.log("Error creating object"); |
192 | + } |
193 | |
194 | mainPageStack.push(songsPage) |
195 | } |
196 | |
197 | === modified file 'MusicStart.qml' |
198 | --- MusicStart.qml 2014-10-24 12:41:57 +0000 |
199 | +++ MusicStart.qml 2014-10-26 16:21:02 +0000 |
200 | @@ -59,16 +59,23 @@ |
201 | onClicked: { |
202 | if (type === "playlist") { |
203 | albumTracksModel.filterPlaylistTracks(model.key) |
204 | - } else { |
205 | - songsPage.album = title; |
206 | - } |
207 | - songsPage.genre = undefined; |
208 | - |
209 | - songsPage.line1 = secondaryText |
210 | - songsPage.line2 = primaryText |
211 | - songsPage.covers = coverSources |
212 | - songsPage.isAlbum = (type === "album") |
213 | - songsPage.title = songsPage.isAlbum ? i18n.tr("Album") : i18n.tr("Playlist") |
214 | + } |
215 | + |
216 | + var comp = Qt.createComponent("common/SongsPage.qml") |
217 | + var songsPage = comp.createObject(mainPageStack, |
218 | + { |
219 | + "album": type !== "playlist" ? title : undefined, |
220 | + "covers": coverSources, |
221 | + "isAlbum": (type === "album"), |
222 | + "genre": undefined, |
223 | + "title": (type === "album") ? i18n.tr("Album") : i18n.tr("Playlist"), |
224 | + "line1": secondaryText, |
225 | + "line2": primaryText, |
226 | + }); |
227 | + |
228 | + if (songsPage == null) { // Error Handling |
229 | + console.log("Error creating object"); |
230 | + } |
231 | |
232 | mainPageStack.push(songsPage) |
233 | } |
234 | |
235 | === modified file 'MusicTracks.qml' |
236 | --- MusicTracks.qml 2014-10-24 12:41:57 +0000 |
237 | +++ MusicTracks.qml 2014-10-26 16:21:02 +0000 |
238 | @@ -66,8 +66,14 @@ |
239 | items.push(makeDict(tracklist.model.get(tracklist.selectedItems[i], tracklist.model.RoleModelData))); |
240 | } |
241 | |
242 | - chosenElements = items; |
243 | - mainPageStack.push(addtoPlaylist) |
244 | + var comp = Qt.createComponent("MusicaddtoPlaylist.qml") |
245 | + var addToPlaylist = comp.createObject(mainPageStack, {"chosenElements": items}); |
246 | + |
247 | + if (addToPlaylist == null) { // Error Handling |
248 | + console.log("Error creating object"); |
249 | + } |
250 | + |
251 | + mainPageStack.push(addToPlaylist) |
252 | |
253 | tracklist.closeSelection() |
254 | } |
255 | |
256 | === modified file 'MusicaddtoPlaylist.qml' |
257 | --- MusicaddtoPlaylist.qml 2014-10-24 12:41:57 +0000 |
258 | +++ MusicaddtoPlaylist.qml 2014-10-26 16:21:02 +0000 |
259 | @@ -41,6 +41,8 @@ |
260 | title: i18n.tr("Select playlist") |
261 | visible: false |
262 | |
263 | + property var chosenElements: [] |
264 | + |
265 | head { |
266 | actions: [ |
267 | Action { |
268 | @@ -84,6 +86,7 @@ |
269 | } |
270 | |
271 | playlistModel.filterPlaylists(); |
272 | + albumTracksModel.filterPlaylistTracks(name) |
273 | |
274 | musicToolbar.goBack(); // go back to the previous page |
275 | } |
276 | |
277 | === modified file 'Player.qml' |
278 | --- Player.qml 2014-10-24 12:41:57 +0000 |
279 | +++ Player.qml 2014-10-26 16:21:02 +0000 |
280 | @@ -38,14 +38,14 @@ |
281 | property string currentMetaFile: "" |
282 | property string currentMetaTitle: "" |
283 | property int currentIndex: -1 |
284 | - property alias duration: mediaPlayer.duration |
285 | - property bool isPlaying: player.playbackState === MediaPlayer.PlayingState |
286 | - property alias playbackState: mediaPlayer.playbackState |
287 | - property alias position: mediaPlayer.position |
288 | + property int duration: 1 |
289 | + readonly property bool isPlaying: player.playbackState === MediaPlayer.PlayingState |
290 | + readonly property var playbackState: mediaPlayerLoader.status == Loader.Ready ? mediaPlayerLoader.item.playbackState : MediaPlayer.StoppedState |
291 | + property int position: 0 |
292 | property alias repeat: settings.repeat |
293 | property alias shuffle: settings.shuffle |
294 | - property alias source: mediaPlayer.source |
295 | - property alias volume: mediaPlayer.volume |
296 | + readonly property string source: mediaPlayerLoader.status == Loader.Ready ? mediaPlayerLoader.item.source : "" |
297 | + readonly property double volume: mediaPlayerLoader.status == Loader.Ready ? mediaPlayerLoader.item.volume : 1.0 |
298 | |
299 | signal stopped() |
300 | |
301 | @@ -62,10 +62,10 @@ |
302 | onCountChanged: { |
303 | if (trackQueue.model.count === 1) { |
304 | player.currentIndex = 0; |
305 | - player.source = Qt.resolvedUrl(trackQueue.model.get(0).filename) |
306 | + mediaPlayerLoader.item.source = Qt.resolvedUrl(trackQueue.model.get(0).filename) |
307 | } else if (trackQueue.model.count === 0) { |
308 | player.currentMetaFile = "" |
309 | - player.source = "" |
310 | + mediaPlayerLoader.item.source = "" |
311 | } |
312 | } |
313 | } |
314 | @@ -132,18 +132,18 @@ |
315 | } |
316 | |
317 | function pause() { |
318 | - mediaPlayer.pause(); |
319 | + mediaPlayerLoader.item.pause(); |
320 | } |
321 | |
322 | function play() { |
323 | - mediaPlayer.play(); |
324 | + mediaPlayerLoader.item.play(); |
325 | } |
326 | |
327 | function playSong(filepath, index) { |
328 | - player.stop(); |
329 | + stop(); |
330 | currentIndex = index; |
331 | - player.source = Qt.resolvedUrl(filepath); |
332 | - player.play(); |
333 | + setSource(filepath); |
334 | + play(); |
335 | } |
336 | |
337 | function previousSong(startPlaying) { |
338 | @@ -151,61 +151,77 @@ |
339 | } |
340 | |
341 | function seek(position) { |
342 | - mediaPlayer.seek(position); |
343 | + mediaPlayerLoader.item.seek(position); |
344 | + } |
345 | + |
346 | + function setSource(filepath) { |
347 | + mediaPlayerLoader.item.source = Qt.resolvedUrl(filepath); |
348 | + } |
349 | + |
350 | + function setVolume(volume) { |
351 | + mediaPlayerLoader.item.volume = volume |
352 | } |
353 | |
354 | function stop() { |
355 | - mediaPlayer.stop(); |
356 | + mediaPlayerLoader.item.stop(); |
357 | } |
358 | |
359 | function toggle() { |
360 | if (player.playbackState == MediaPlayer.PlayingState) { |
361 | - player.pause() |
362 | + pause() |
363 | } |
364 | else { |
365 | - player.play() |
366 | + play() |
367 | } |
368 | } |
369 | |
370 | - MediaPlayer { |
371 | - id: mediaPlayer |
372 | - muted: false |
373 | - |
374 | - onSourceChanged: { |
375 | - // Force invalid source to "" |
376 | - if (source === undefined || source === false) { |
377 | - source = "" |
378 | - return |
379 | - } |
380 | - |
381 | - if (source === "") { |
382 | - currentIndex = -1 |
383 | - player.stop() |
384 | - } |
385 | - else { |
386 | - var obj = trackQueue.model.get(player.currentIndex); |
387 | - currentMetaAlbum = obj.album; |
388 | - |
389 | - if (obj.art !== undefined) { // FIXME: protect against not art property in playlists |
390 | - currentMetaArt = obj.art; |
391 | - } |
392 | - |
393 | - currentMetaArtist = obj.author; |
394 | - currentMetaFile = obj.filename; |
395 | - currentMetaTitle = obj.title; |
396 | - } |
397 | - |
398 | - console.log("Source: " + source.toString()) |
399 | - console.log("Index: " + currentIndex) |
400 | - } |
401 | - |
402 | - onStatusChanged: { |
403 | - if (status == MediaPlayer.EndOfMedia) { |
404 | - nextSong(true, false) // next track |
405 | - } |
406 | - } |
407 | - |
408 | - onStopped: player.stopped() |
409 | + Loader { |
410 | + id: mediaPlayerLoader |
411 | + asynchronous: true |
412 | + sourceComponent: Component { |
413 | + MediaPlayer { |
414 | + muted: false |
415 | + |
416 | + onDurationChanged: player.duration = duration |
417 | + onPositionChanged: player.position = position |
418 | + |
419 | + onSourceChanged: { |
420 | + // Force invalid source to "" |
421 | + if (source === undefined || source === false) { |
422 | + source = "" |
423 | + return |
424 | + } |
425 | + |
426 | + if (source === "") { |
427 | + player.currentIndex = -1 |
428 | + player.stop() |
429 | + } |
430 | + else { |
431 | + var obj = trackQueue.model.get(player.currentIndex); |
432 | + player.currentMetaAlbum = obj.album; |
433 | + |
434 | + if (obj.art !== undefined) { // FIXME: protect against no art property in playlists |
435 | + player.currentMetaArt = obj.art; |
436 | + } |
437 | + |
438 | + player.currentMetaArtist = obj.author; |
439 | + player.currentMetaFile = obj.filename; |
440 | + player.currentMetaTitle = obj.title; |
441 | + } |
442 | + |
443 | + console.log("Source: " + source.toString()) |
444 | + console.log("Index: " + player.currentIndex) |
445 | + } |
446 | + |
447 | + onStatusChanged: { |
448 | + if (status == MediaPlayer.EndOfMedia) { |
449 | + nextSong(true, false) // next track |
450 | + } |
451 | + } |
452 | + |
453 | + onStopped: player.stopped() |
454 | + } |
455 | + } |
456 | } |
457 | } |
458 | |
459 | |
460 | === modified file 'common/AlbumsPage.qml' |
461 | --- common/AlbumsPage.qml 2014-10-24 12:41:57 +0000 |
462 | +++ common/AlbumsPage.qml 2014-10-26 16:21:02 +0000 |
463 | @@ -136,14 +136,21 @@ |
464 | secondaryTextVisible: false |
465 | |
466 | onClicked: { |
467 | - songsPage.album = model.title; |
468 | + var comp = Qt.createComponent("SongsPage.qml") |
469 | + var songsPage = comp.createObject(mainPageStack, |
470 | + { |
471 | + "album": model.title, |
472 | + "covers": [{art: model.art}], |
473 | + "isAlbum": true, |
474 | + "genre": undefined, |
475 | + "title": i18n.tr("Album"), |
476 | + "line1": model.artist, |
477 | + "line2": model.title, |
478 | + }); |
479 | |
480 | - songsPage.line1 = model.artist |
481 | - songsPage.line2 = model.title |
482 | - songsPage.isAlbum = true |
483 | - songsPage.covers = [{art: model.art}] |
484 | - songsPage.genre = undefined |
485 | - songsPage.title = i18n.tr("Album") |
486 | + if (songsPage == null) { // Error Handling |
487 | + console.log("Error creating object"); |
488 | + } |
489 | |
490 | mainPageStack.push(songsPage) |
491 | } |
492 | |
493 | === modified file 'common/ListItemActions/AddToPlaylist.qml' |
494 | --- common/ListItemActions/AddToPlaylist.qml 2014-10-24 12:41:57 +0000 |
495 | +++ common/ListItemActions/AddToPlaylist.qml 2014-10-26 16:21:02 +0000 |
496 | @@ -27,8 +27,15 @@ |
497 | property bool primed: false |
498 | |
499 | onTriggered: { |
500 | - chosenElements = [makeDict(model)]; |
501 | - console.debug("Debug: Add track to playlist"); |
502 | - mainPageStack.push(addtoPlaylist) |
503 | + console.debug("Debug: Add track to playlist"); |
504 | + |
505 | + var comp = Qt.createComponent("../../MusicaddtoPlaylist.qml") |
506 | + var addToPlaylist = comp.createObject(mainPageStack, {"chosenElements": [makeDict(model)]}); |
507 | + |
508 | + if (addToPlaylist == null) { // Error Handling |
509 | + console.log("Error creating object"); |
510 | + } |
511 | + |
512 | + mainPageStack.push(addToPlaylist) |
513 | } |
514 | } |
515 | |
516 | === modified file 'common/SongsPage.qml' |
517 | --- common/SongsPage.qml 2014-10-24 12:41:57 +0000 |
518 | +++ common/SongsPage.qml 2014-10-26 16:21:02 +0000 |
519 | @@ -41,6 +41,7 @@ |
520 | property string file: "" |
521 | property string year: "" |
522 | |
523 | + property var page |
524 | property alias album: songsModel.album |
525 | property alias genre: songsModel.genre |
526 | |
527 | @@ -113,8 +114,14 @@ |
528 | items.push(makeDict(albumtrackslist.model.get(albumtrackslist.selectedItems[i], albumtrackslist.model.RoleModelData))); |
529 | } |
530 | |
531 | - chosenElements = items; |
532 | - mainPageStack.push(addtoPlaylist) |
533 | + var comp = Qt.createComponent("../MusicaddtoPlaylist.qml") |
534 | + var addToPlaylist = comp.createObject(mainPageStack, {"chosenElements": items}); |
535 | + |
536 | + if (addToPlaylist == null) { // Error Handling |
537 | + console.log("Error creating object"); |
538 | + } |
539 | + |
540 | + mainPageStack.push(addToPlaylist) |
541 | |
542 | albumtrackslist.closeSelection() |
543 | } |
544 | @@ -138,13 +145,20 @@ |
545 | visible: songStackPage.line1 === i18n.tr("Playlist") |
546 | onTriggered: { |
547 | for (var i=0; i < albumtrackslist.selectedItems.length; i++) { |
548 | - Playlists.removeFromPlaylist(songStackPage.line2, albumtrackslist.selectedItems[i] - i) |
549 | + Playlists.removeFromPlaylist(songStackPage.line2, albumtrackslist.selectedItems[i]) |
550 | + |
551 | + // Update indexes as an index has been removed |
552 | + for (var j=i + 1; j < albumtrackslist.selectedItems.length; j++) { |
553 | + if (albumtrackslist.selectedItems[j] > albumtrackslist.selectedItems[i]) { |
554 | + albumtrackslist.selectedItems[j]--; |
555 | + } |
556 | + } |
557 | } |
558 | |
559 | albumtrackslist.closeSelection() |
560 | |
561 | + songStackPage.page.changed = true |
562 | albumTracksModel.filterPlaylistTracks(songStackPage.line2) |
563 | - playlistModel.filterPlaylists() |
564 | } |
565 | } |
566 | ] |
567 | @@ -371,8 +385,8 @@ |
568 | onTriggered: { |
569 | Playlists.removeFromPlaylist(songStackPage.line2, model.i) |
570 | |
571 | + songStackPage.page.changed = true |
572 | albumTracksModel.filterPlaylistTracks(songStackPage.line2) |
573 | - playlistModel.filterPlaylists() |
574 | } |
575 | } |
576 | } |
577 | @@ -488,13 +502,16 @@ |
578 | // removing playlist |
579 | Playlists.removePlaylist(dialogRemovePlaylist.oldPlaylistName) |
580 | |
581 | - playlistModel.filterPlaylists(); |
582 | - |
583 | if (Library.recentContainsPlaylist(dialogRemovePlaylist.oldPlaylistName)) { |
584 | Library.recentRemovePlaylist(dialogRemovePlaylist.oldPlaylistName) |
585 | recentModel.filterRecent() |
586 | } |
587 | |
588 | + if (songStackPage.page !== undefined) { |
589 | + songStackPage.page.changed = true |
590 | + songStackPage.page = undefined |
591 | + } |
592 | + |
593 | PopupUtils.close(dialogRemovePlaylist) |
594 | |
595 | musicToolbar.goBack() |
596 | |
597 | === modified file 'music-app.qml' |
598 | --- music-app.qml 2014-10-25 02:58:47 +0000 |
599 | +++ music-app.qml 2014-10-26 16:21:02 +0000 |
600 | @@ -562,7 +562,6 @@ |
601 | // VARIABLES |
602 | property string musicName: i18n.tr("Music") |
603 | property string appVersion: '1.2' |
604 | - property var chosenElements: [] |
605 | property bool toolbarShown: musicToolbar.visible |
606 | property bool selectedAlbum: false |
607 | |
608 | @@ -649,7 +648,7 @@ |
609 | tabs.pushNowPlaying(); |
610 | } |
611 | else { |
612 | - player.source = file; |
613 | + player.setSource(file); |
614 | } |
615 | } |
616 | |
617 | @@ -998,7 +997,7 @@ |
618 | var comp = Qt.createComponent("MusicNowPlaying.qml") |
619 | var nowPlaying = comp.createObject(mainPageStack, {}); |
620 | |
621 | - if (nowPlaying === null) { // Error Handling |
622 | + if (nowPlaying == null) { // Error Handling |
623 | console.log("Error creating object"); |
624 | } |
625 | |
626 | @@ -1025,18 +1024,6 @@ |
627 | ensurePopulated(selectedTab); |
628 | } |
629 | } // end of tabs |
630 | - |
631 | - SongsPage { |
632 | - id: songsPage |
633 | - } |
634 | - |
635 | - AlbumsPage { |
636 | - id: albumsPage |
637 | - } |
638 | - |
639 | - MusicaddtoPlaylist { |
640 | - id: addtoPlaylist |
641 | - } |
642 | } |
643 | |
644 | Page { |
645 | |
646 | === modified file 'tests/autopilot/music_app/__init__.py' |
647 | --- tests/autopilot/music_app/__init__.py 2014-10-24 12:55:02 +0000 |
648 | +++ tests/autopilot/music_app/__init__.py 2014-10-26 16:21:02 +0000 |
649 | @@ -52,7 +52,7 @@ |
650 | self.player = self.app.select_single(Player, objectName='player') |
651 | |
652 | def get_add_to_playlist_page(self): |
653 | - return self.app.wait_select_single(Page11, |
654 | + return self.app.wait_select_single(MusicaddtoPlaylist, |
655 | objectName="addToPlaylistPage") |
656 | |
657 | def get_albums_page(self): |
658 | @@ -215,9 +215,9 @@ |
659 | objectName="addToPlaylistCardItem" + str(i))) |
660 | |
661 | |
662 | -class Page11(MusicAlbums, MusicArtists, MusicTracks, MusicaddtoPlaylist): |
663 | +class Page11(MusicAlbums, MusicArtists, MusicTracks): |
664 | """ |
665 | - FIXME: Represents MusicTracks MusicArtists MusicAlbums MusicaddtoPlaylists |
666 | + FIXME: Represents MusicTracks MusicArtists MusicAlbums |
667 | due to bug 1341671 and bug 1337004 they all appear as Page11 |
668 | Therefore this class 'contains' all of them for now |
669 | Once the bugs are fixed Page11 should be swapped for MusicTracks etc |
670 | @@ -226,7 +226,6 @@ |
671 | super(MusicAlbums, self).__init__(*args) |
672 | super(MusicArtists, self).__init__(*args) |
673 | super(MusicTracks, self).__init__(*args) |
674 | - super(MusicaddtoPlaylist, self).__init__(*args) |
675 | |
676 | |
677 | class Player(UbuntuUIToolkitCustomProxyObjectBase): |
FAILED: Continuous integration, rev:702 91.189. 93.70:8080/ job/music- app-remix- ci/164/ 91.189. 93.70:8080/ job/generic- mediumtests- utopic- python3/ 1263 91.189. 93.70:8080/ job/generic- mediumtests- utopic- python3/ 1263/artifact/ work/output/ *zip*/output. zip 91.189. 93.70:8080/ job/music- app-remix- utopic- amd64-ci/ 164
http://
Executed test runs:
UNSTABLE: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild: 91.189. 93.70:8080/ job/music- app-remix- ci/164/ rebuild
http://