Merge lp:~ahayzen/music-app/remix-recent-card-view into lp:music-app/remix

Proposed by Andrew Hayzen
Status: Merged
Approved by: Victor Thompson
Approved revision: 676
Merged at revision: 679
Proposed branch: lp:~ahayzen/music-app/remix-recent-card-view
Merge into: lp:music-app/remix
Diff against target: 877 lines (+93/-549)
4 files modified
MusicStart.qml (+37/-474)
common/SongsPage.qml (+0/-7)
music-app.qml (+3/-3)
po/com.ubuntu.music.pot (+53/-65)
To merge this branch: bzr merge lp:~ahayzen/music-app/remix-recent-card-view
Reviewer Review Type Date Requested Status
Ubuntu Phone Apps Jenkins Bot continuous-integration Approve
Victor Thompson Approve
Review via email: mp+238636@code.launchpad.net

Commit message

* Use CardView in Recent Tab
* Use Recent as default if >0 recent items otherwise use Albums Tab

Description of the change

* Use CardView in Recent Tab
* Use Recent as default if >0 recent items otherwise use Albums Tab

Note we still need designs for an empty recent item state.

To post a comment you must log in.
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Victor Thompson (vthompson) wrote :

I think we may need some design input on the behavior for Recent as well. For instance, the "clear" icon (the X used the in the header in Recent) simply clears the recent list. We need to check with Jouni concerning 1) which icon we should use and 2) what the action should be. IMO, if we use the "delete" (trash can) icon, then simply clearing the recent list seems OK, but if we use the "clear" X icon, it seems like we might also want to go to the Albums tab. We may want to go to the Albums tab in either case, actually.

This is kind of subjective, but I think the phrase "Recently played" (or similar) might be better then "Recent". The other tabs have simple titles because they describe the type of data they contain. Again, I'd like design input.

We'll also want Design opinion on how the changes in startup tab ("Recent" or "Albums") affects how we configure the splash screen--which right now the splash has "Music" in the header.

Regardless, you'll want to also update the translatable strings before we merge this in. This looks very good overall, however.

review: Needs Fixing
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Victor Thompson (vthompson) wrote :

This change looks good, but we will still need to get design input. Let's opt to land this and tweak as necessary. LTGM!

review: Approve
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'MusicStart.qml'
--- MusicStart.qml 2014-09-20 15:41:33 +0000
+++ MusicStart.qml 2014-10-20 18:24:24 +0000
@@ -32,482 +32,45 @@
3232
33MusicPage {33MusicPage {
34 id: mainpage34 id: mainpage
35 title: i18n.tr("Music")35 title: i18n.tr("Recent")
3636
37 /* Dev button for search.37 head {
38 Button {38 actions: [
39 id: searchButton39 Action {
40 text: i18n.tr("Search")40 iconName: "delete"
41 anchors.top: parent.top41 onTriggered: {
42 anchors.topMargin: units.gu(2)42 Library.clearRecentHistory()
43 anchors.bottom: recentlyPlayed.top43 recentModel.filterRecent()
44 anchors.bottomMargin: units.gu(1)44 }
45 height: units.gu(4)45 }
46 onClicked: {46 ]
47 PopupUtils.open(Qt.resolvedUrl("MusicSearch.qml"), mainView,
48 {
49 title: i18n.tr("Search")
50 } )
51 }
52 }47 }
53 */48
54 Flickable{49 CardView {
55 id: musicFlickable50 id: recentCardView
56 anchors.fill: parent51 model: recentModel.model
5752 delegate: Card {
58 width: mainpage.width53 id: albumCard
59 height: mainpage.height54 coverSources: model.type === "playlist" ? Playlists.getPlaylistCovers(title) : (model.art !== undefined ? [{art: model.art}] : [{author: model.title2, album: model.title}])
6055 objectName: "albumsPageGridItem" + index
61 contentHeight: mainView.hasRecent ? recentlyPlayed.height + recentlist.height + genres.height + genrelist.height + albums.height + albumlist.height + units.gu(4)56 primaryText: model.title
62 : genres.height + genrelist.height + albums.height + albumlist.height + units.gu(3)57 secondaryText: model.title2 !== "Playlist" ? model.title2 : i18n.tr("Playlist")
63 contentWidth: width58
6459 onClicked: {
65 focus: true60 if (type === "playlist") {
6661 albumTracksModel.filterPlaylistTracks(model.key)
67 ListItem.Standard {62 } else {
68 id: recentlyPlayed63 songsPage.album = title;
69 Label {64 }
70 anchors {65 songsPage.genre = undefined;
71 verticalCenter: parent.verticalCenter66
72 left: parent.left67 songsPage.line1 = secondaryText
73 leftMargin: units.gu(2)68 songsPage.line2 = primaryText
74 }69 songsPage.covers = coverSources
75 text: i18n.tr("Recent")70 songsPage.isAlbum = (type === "album")
76 color: styleMusic.common.music71 songsPage.title = songsPage.isAlbum ? i18n.tr("Album") : i18n.tr("Playlist")
77 }72
78 visible: mainView.hasRecent73 mainPageStack.push(songsPage)
79 }
80
81 ListView {
82 id: recentlist
83 anchors.top: recentlyPlayed.bottom
84 anchors.topMargin: units.gu(1)
85 width: parent.width
86 spacing: units.gu(1)
87 height: units.gu(18)
88 // TODO: Update when view counts are collected
89 model: recentModel.model
90 delegate: recentDelegate
91 header: Item {
92 id: recentSpacer
93 width: units.gu(1)
94 }
95 footer: Item {
96 id: clearRecent
97 width: recentlist.height - units.gu(2)
98 height: width
99 visible: mainView.hasRecent && !loading.visible
100 Button {
101 id: clearRecentButton
102 anchors.centerIn: parent
103 text: i18n.tr("Clear History")
104 onClicked: {
105 Library.clearRecentHistory()
106 mainView.hasRecent = false
107 recentModel.filterRecent()
108 }
109 }
110 }
111 orientation: ListView.Horizontal
112 visible: mainView.hasRecent
113
114 Component {
115 id: recentDelegate
116 Item {
117 property string title: model.title
118 property string title2: model.title2 !== "Playlist" ? model.title2 : i18n.tr("Playlist")
119 property var covers: type === "playlist" ? Playlists.getPlaylistCovers(title) : (model.art !== undefined ? [{art: model.art}] : [{author: model.title2, album: model.title}])
120 property string type: model.type
121 property string time: model.time
122 property string key: model.key
123 id: recentItem
124 height: recentlist.height - units.gu(1)
125 width: height
126 CoverRow {
127 id: recentShape
128 anchors {
129 top: parent.top
130 left: parent.left
131 verticalCenter: parent.verticalCenter
132 }
133 count: recentItem.covers.length
134 size: recentItem.width
135 covers: recentItem.covers
136 spacing: units.gu(2)
137 }
138 Item { // Background so can see text in current state
139 id: albumBg
140 anchors {
141 bottom: parent.bottom
142 left: parent.left
143 right: parent.right
144 }
145 height: units.gu(6)
146 clip: true
147 UbuntuShape{
148 anchors {
149 bottom: parent.bottom
150 left: parent.left
151 right: parent.right
152 }
153 height: recentShape.height
154 radius: "medium"
155 color: styleMusic.common.black
156 opacity: 0.6
157 }
158 }
159 Label {
160 id: albumArtist
161 anchors.bottom: parent.bottom
162 anchors.bottomMargin: units.gu(3)
163 anchors.left: parent.left
164 anchors.leftMargin: units.gu(1)
165 anchors.right: parent.right
166 anchors.rightMargin: units.gu(1)
167 color: styleMusic.common.white
168 elide: Text.ElideRight
169 text: title
170 fontSize: "small"
171 font.weight: Font.DemiBold
172 }
173 Label {
174 id: albumLabel
175 anchors.left: parent.left
176 anchors.leftMargin: units.gu(1)
177 anchors.bottom: parent.bottom
178 anchors.bottomMargin: units.gu(1)
179 anchors.right: parent.right
180 anchors.rightMargin: units.gu(1)
181 color: styleMusic.common.white
182 elide: Text.ElideRight
183 text: title2
184 fontSize: "x-small"
185 }
186 MouseArea {
187 anchors.fill: parent
188 onClicked: {
189 if (type === "playlist") {
190 albumTracksModel.filterPlaylistTracks(key)
191 } else {
192 songsPage.album = title;
193 }
194 songsPage.genre = undefined;
195
196 songsPage.line1 = title2
197 songsPage.line2 = title
198 songsPage.covers = recentItem.covers
199 songsPage.isAlbum = (type === "album")
200 songsPage.title = songsPage.isAlbum ? i18n.tr("Album") : i18n.tr("Playlist")
201
202 mainPageStack.push(songsPage)
203 }
204
205 // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
206 onPressedChanged: recentShape.pressed = pressed
207 }
208 }
209 }
210 }
211
212 ListItem.ThinDivider {
213 id: genreDivider
214 anchors.top: mainView.hasRecent ? recentlist.bottom : parent.top
215 visible: genrelist.count > 1
216 }
217 ListItem.Standard {
218 id: genres
219 anchors.top: genreDivider.bottom
220 visible: genrelist.count > 1
221 Label {
222 anchors {
223 verticalCenter: parent.verticalCenter
224 left: parent.left
225 leftMargin: units.gu(2)
226 }
227 text: i18n.tr("Genres")
228 color: styleMusic.common.music
229 }
230 }
231 // TODO: add music genres. frequency of play? most tracks?
232 ListView {
233 id: genrelist
234 width: parent.width
235 anchors.top: genres.bottom
236 anchors.topMargin: units.gu(1)
237 spacing: units.gu(1)
238 height: units.gu(18)
239 visible: genrelist.count > 1
240 model: SortFilterModel {
241 id: genresModelFilter
242 model: GenresModel {
243 id: genresModel
244 store: musicStore
245 }
246 filter.property: "genre"
247 filter.pattern: /\S+/
248 }
249
250 delegate: genreDelegate
251 header: Item {
252 id: genreSpacer
253 width: units.gu(1)
254 }
255 orientation: ListView.Horizontal
256
257 Component {
258 id: genreDelegate
259 Item {
260 id: genreItem
261 objectName: "genreItemObject"
262 height: genrelist.height - units.gu(1)
263 width: height
264
265 Repeater {
266 id: albumGenreModelRepeater
267 model: AlbumsModel {
268 genre: model.genre
269 store: musicStore
270 }
271
272 delegate: Item {
273 property string art: model.art
274 }
275 property var covers: []
276 signal finished()
277
278 onFinished: {
279 genreShape.count = count
280 genreShape.covers = covers
281 }
282 onItemAdded: {
283 covers.push({art: item.art});
284
285 if (index === count - 1) {
286 finished();
287 }
288 }
289 }
290
291 SongsModel {
292 id: songGenreModel
293 genre: model.genre
294 store: musicStore
295 }
296
297 CoverRow {
298 id: genreShape
299 anchors {
300 top: parent.top
301 left: parent.left
302 verticalCenter: parent.verticalCenter
303 }
304 count: 0
305 size: genreItem.width
306 covers: []
307 spacing: units.gu(2)
308 }
309 MouseArea {
310 anchors.fill: parent
311 onClicked: {
312 songsPage.album = undefined
313 songsPage.covers = genreShape.covers
314 songsPage.genre = model.genre
315 songsPage.isAlbum = true
316 songsPage.line1 = i18n.tr("Genre")
317 songsPage.line2 = model.genre
318 songsPage.title = i18n.tr("Genre")
319
320 mainPageStack.push(songsPage)
321 }
322
323 // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
324 onPressedChanged: genreShape.pressed = pressed
325 }
326 Item { // Background so can see text in current state
327 id: genreBg
328 anchors {
329 bottom: parent.bottom
330 left: parent.left
331 right: parent.right
332 }
333 height: units.gu(5.5)
334 clip: true
335 UbuntuShape{
336 anchors {
337 bottom: parent.bottom
338 left: parent.left
339 right: parent.right
340 }
341 height: genreShape.height
342 radius: "medium"
343 color: styleMusic.common.black
344 opacity: 0.6
345 }
346 }
347 Label {
348 id: genreLabel
349 anchors.bottom: parent.bottom
350 anchors.bottomMargin: units.gu(1)
351 anchors.left: parent.left
352 anchors.leftMargin: units.gu(1)
353 anchors.right: parent.right
354 anchors.rightMargin: units.gu(1)
355 color: styleMusic.common.white
356 elide: Text.ElideRight
357 text: model.genre
358 fontSize: "small"
359 font.weight: Font.DemiBold
360 }
361 Label {
362 id: genreTotal
363 anchors.bottom: parent.bottom
364 anchors.bottomMargin: units.gu(3)
365 anchors.left: parent.left
366 anchors.leftMargin: units.gu(1)
367 anchors.right: parent.right
368 anchors.rightMargin: units.gu(1)
369 color: styleMusic.common.white
370 elide: Text.ElideRight
371 text: i18n.tr("%1 song", "%1 songs", songGenreModel.rowCount).arg(songGenreModel.rowCount)
372 fontSize: "x-small"
373 }
374 }
375 }
376 }
377
378 ListItem.ThinDivider {
379 id: albumsDivider
380 anchors.top: genrelist.visible
381 ? genrelist.bottom
382 : (mainView.hasRecent ? recentlist.bottom : parent.top)
383 }
384 ListItem.Standard {
385 id: albums
386 Label {
387 anchors {
388 verticalCenter: parent.verticalCenter
389 left: parent.left
390 leftMargin: units.gu(2)
391 }
392 text: i18n.tr("Albums")
393 color: styleMusic.common.music
394 }
395 anchors.top: albumsDivider.bottom
396 }
397
398 ListView {
399 id: albumlist
400 width: parent.width
401 anchors.top: albums.bottom
402 anchors.topMargin: units.gu(1)
403 spacing: units.gu(1)
404 height: units.gu(18)
405 model: SortFilterModel {
406 id: albumsModelFilter
407 property alias rowCount: albumsModel.rowCount
408 model: AlbumsModel {
409 id: albumsModel
410 store: musicStore
411 }
412 sort.property: "title"
413 sort.order: Qt.AscendingOrder
414 }
415 delegate: albumDelegate
416 header: Item {
417 id: albumSpacer
418 width: units.gu(1)
419 }
420 orientation: ListView.Horizontal
421
422 Component {
423 id: albumDelegate
424 Item {
425 property string artist: model.artist
426 property string album: model.title
427 property var covers: [{art: model.art}]
428
429 id: albumItem
430 objectName: "albumItemObject"
431 height: albumlist.height - units.gu(1)
432 width: height
433 CoverRow {
434 id: albumShape
435 anchors {
436 top: parent.top
437 left: parent.left
438 verticalCenter: parent.verticalCenter
439 }
440 count: albumItem.covers.length
441 size: albumItem.width
442 covers: albumItem.covers
443 spacing: units.gu(2)
444 }
445 MouseArea {
446 anchors.fill: parent
447 onClicked: {
448 songsPage.album = album
449 songsPage.covers = covers
450 songsPage.genre = undefined
451 songsPage.isAlbum = true
452 songsPage.line1 = artist
453 songsPage.line2 = album
454 songsPage.title = i18n.tr("Album")
455
456 mainPageStack.push(songsPage)
457 }
458
459 // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
460 onPressedChanged: albumShape.pressed = pressed
461 }
462 Item { // Background so can see text in current state
463 id: albumBg
464 anchors {
465 bottom: parent.bottom
466 left: parent.left
467 right: parent.right
468 }
469 height: units.gu(6)
470 clip: true
471 UbuntuShape{
472 anchors {
473 bottom: parent.bottom
474 left: parent.left
475 right: parent.right
476 }
477 height: albumShape.height
478 radius: "medium"
479 color: styleMusic.common.black
480 opacity: 0.6
481 }
482 }
483 Label {
484 id: albumLabel
485 anchors.bottom: parent.bottom
486 anchors.bottomMargin: units.gu(1)
487 anchors.left: parent.left
488 anchors.leftMargin: units.gu(1)
489 anchors.right: parent.right
490 anchors.rightMargin: units.gu(1)
491 color: styleMusic.common.white
492 elide: Text.ElideRight
493 text: artist
494 fontSize: "x-small"
495 }
496 Label {
497 id: albumLabel2
498 anchors.bottom: parent.bottom
499 anchors.bottomMargin: units.gu(3)
500 anchors.left: parent.left
501 anchors.leftMargin: units.gu(1)
502 anchors.right: parent.right
503 anchors.rightMargin: units.gu(1)
504 color: styleMusic.common.white
505 elide: Text.ElideRight
506 text: album
507 fontSize: "small"
508 font.weight: Font.DemiBold
509 }
510 }
511 }74 }
512 }75 }
513 }76 }
51477
=== modified file 'common/SongsPage.qml'
--- common/SongsPage.qml 2014-10-18 03:49:51 +0000
+++ common/SongsPage.qml 2014-10-20 18:24:24 +0000
@@ -121,11 +121,9 @@
121121
122 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {122 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
123 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")123 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")
124 mainView.hasRecent = true
125 recentModel.filterRecent()124 recentModel.filterRecent()
126 } else if (songStackPage.line1 === i18n.tr("Playlist")) {125 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
127 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")126 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
128 mainView.hasRecent = true
129 recentModel.filterRecent()127 recentModel.filterRecent()
130 }128 }
131 }129 }
@@ -161,11 +159,9 @@
161159
162 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {160 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
163 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")161 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")
164 mainView.hasRecent = true
165 recentModel.filterRecent()162 recentModel.filterRecent()
166 } else if (songStackPage.line1 === i18n.tr("Playlist")) {163 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
167 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")164 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
168 mainView.hasRecent = true
169 recentModel.filterRecent()165 recentModel.filterRecent()
170 }166 }
171 }167 }
@@ -266,11 +262,9 @@
266262
267 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {263 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
268 Library.addRecent(songStackPage.line2, songStackPage.line1, model.art, songStackPage.line2, "album")264 Library.addRecent(songStackPage.line2, songStackPage.line1, model.art, songStackPage.line2, "album")
269 mainView.hasRecent = true
270 recentModel.filterRecent()265 recentModel.filterRecent()
271 } else if (songStackPage.line1 === i18n.tr("Playlist")) {266 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
272 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")267 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
273 mainView.hasRecent = true
274 recentModel.filterRecent()268 recentModel.filterRecent()
275 }269 }
276 }270 }
@@ -413,7 +407,6 @@
413407
414 if (Library.recentContainsPlaylist(dialogRemovePlaylist.oldPlaylistName)) {408 if (Library.recentContainsPlaylist(dialogRemovePlaylist.oldPlaylistName)) {
415 Library.recentRemovePlaylist(dialogRemovePlaylist.oldPlaylistName)409 Library.recentRemovePlaylist(dialogRemovePlaylist.oldPlaylistName)
416 mainView.hasRecent = !Library.isRecentEmpty()
417 recentModel.filterRecent()410 recentModel.filterRecent()
418 }411 }
419412
420413
=== modified file 'music-app.qml'
--- music-app.qml 2014-10-16 22:12:01 +0000
+++ music-app.qml 2014-10-20 18:24:24 +0000
@@ -211,7 +211,6 @@
211211
212 // Add album to recent list212 // Add album to recent list
213 Library.addRecent(songsAlbumArtistModel.album, songsAlbumArtistModel.artist, songsAlbumArtistModel.art, songsAlbumArtistModel.album, "album")213 Library.addRecent(songsAlbumArtistModel.album, songsAlbumArtistModel.artist, songsAlbumArtistModel.art, songsAlbumArtistModel.album, "album")
214 mainView.hasRecent = true
215 recentModel.filterRecent()214 recentModel.filterRecent()
216 }215 }
217216
@@ -576,7 +575,9 @@
576 // TODO: Switch tabs back and forth to get the background color in the575 // TODO: Switch tabs back and forth to get the background color in the
577 // header to work properly.576 // header to work properly.
578 tabs.selectedTabIndex = 1577 tabs.selectedTabIndex = 1
579 tabs.selectedTabIndex = 0578
579 // goto Recent if there are items otherwise go to Albums
580 tabs.selectedTabIndex = Library.isRecentEmpty() ? 2 : 0
580581
581 // Run post load582 // Run post load
582 tabs.ensurePopulated(tabs.selectedTab);583 tabs.ensurePopulated(tabs.selectedTab);
@@ -589,7 +590,6 @@
589 // VARIABLES590 // VARIABLES
590 property string musicName: i18n.tr("Music")591 property string musicName: i18n.tr("Music")
591 property string appVersion: '1.2'592 property string appVersion: '1.2'
592 property bool hasRecent: !Library.isRecentEmpty()
593 property bool scrobble: false593 property bool scrobble: false
594 property string lastfmusername594 property string lastfmusername
595 property string lastfmpassword595 property string lastfmpassword
596596
=== modified file 'po/com.ubuntu.music.pot'
--- po/com.ubuntu.music.pot 2014-10-14 15:46:07 +0000
+++ po/com.ubuntu.music.pot 2014-10-20 18:24:24 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: music-app\n"9"Project-Id-Version: music-app\n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2014-10-14 16:45+0100\n"11"POT-Creation-Date: 2014-10-20 15:09+0100\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -54,12 +54,11 @@
54msgid "You forgot to set your username and/or password"54msgid "You forgot to set your username and/or password"
55msgstr ""55msgstr ""
5656
57#: ../MusicAlbums.qml:29 ../MusicStart.qml:39257#: ../MusicAlbums.qml:29
58msgid "Albums"58msgid "Albums"
59msgstr ""59msgstr ""
6060
61#: ../MusicAlbums.qml:57 ../MusicStart.qml:200 ../MusicStart.qml:45461#: ../MusicAlbums.qml:57 ../MusicStart.qml:71 ../common/AlbumsPage.qml:155
62#: ../common/AlbumsPage.qml:146
63msgid "Album"62msgid "Album"
64msgstr ""63msgstr ""
6564
@@ -85,21 +84,19 @@
85msgid "Playlists"84msgid "Playlists"
86msgstr ""85msgstr ""
8786
88#: ../MusicPlaylists.qml:61 ../MusicStart.qml:37187#: ../MusicPlaylists.qml:61 ../MusicaddtoPlaylist.qml:105
89#: ../MusicaddtoPlaylist.qml:105 ../common/SongsPage.qml:22088#: ../common/SongsPage.qml:228 ../common/SongsPage.qml:229
90#: ../common/SongsPage.qml:221
91#, qt-format89#, qt-format
92msgid "%1 song"90msgid "%1 song"
93msgid_plural "%1 songs"91msgid_plural "%1 songs"
94msgstr[0] ""92msgstr[0] ""
95msgstr[1] ""93msgstr[1] ""
9694
97#: ../MusicPlaylists.qml:66 ../MusicPlaylists.qml:70 ../MusicStart.qml:11895#: ../MusicPlaylists.qml:66 ../MusicPlaylists.qml:70 ../MusicStart.qml:57
98#: ../MusicStart.qml:200 ../common/SongsPage.qml:4796#: ../MusicStart.qml:71 ../common/SongsPage.qml:47 ../common/SongsPage.qml:125
99#: ../common/SongsPage.qml:126 ../common/SongsPage.qml:16697#: ../common/SongsPage.qml:163 ../common/SongsPage.qml:172
100#: ../common/SongsPage.qml:176 ../common/SongsPage.qml:20498#: ../common/SongsPage.qml:208 ../common/SongsPage.qml:247
101#: ../common/SongsPage.qml:239 ../common/SongsPage.qml:24199#: ../common/SongsPage.qml:249 ../common/SongsPage.qml:266
102#: ../common/SongsPage.qml:259
103msgid "Playlist"100msgid "Playlist"
104msgstr ""101msgstr ""
105102
@@ -194,30 +191,10 @@
194msgid "Clean everything!"191msgid "Clean everything!"
195msgstr ""192msgstr ""
196193
197#: ../MusicStart.qml:35 ../music-app.qml:576 ../music-app.qml:1141194#: ../MusicStart.qml:35
198#: com.ubuntu.music_music.desktop.in.in.h:1
199msgid "Music"
200msgstr ""
201
202#: ../MusicStart.qml:75
203msgid "Recent"195msgid "Recent"
204msgstr ""196msgstr ""
205197
206#: ../MusicStart.qml:103
207msgid "Clear History"
208msgstr ""
209
210#: ../MusicStart.qml:227
211msgid "Genres"
212msgstr ""
213
214#: ../MusicStart.qml:316 ../MusicStart.qml:318 ../common/SongsPage.qml:122
215#: ../common/SongsPage.qml:162 ../common/SongsPage.qml:177
216#: ../common/SongsPage.qml:205 ../common/SongsPage.qml:220
217#: ../common/SongsPage.qml:255
218msgid "Genre"
219msgstr ""
220
221#: ../MusicToolbar.qml:150198#: ../MusicToolbar.qml:150
222msgid "Tap to shuffle music"199msgid "Tap to shuffle music"
223msgstr ""200msgstr ""
@@ -238,22 +215,22 @@
238msgid "Shuffle"215msgid "Shuffle"
239msgstr ""216msgstr ""
240217
241#: ../common/AlbumsPage.qml:72 ../common/SongsPage.qml:144218#: ../common/AlbumsPage.qml:72 ../common/SongsPage.qml:142
242msgid "Queue all"219msgid "Queue all"
243msgstr ""220msgstr ""
244221
245#: ../common/AlbumsPage.qml:83 ../common/SongsPage.qml:155222#: ../common/AlbumsPage.qml:83 ../common/SongsPage.qml:153
246msgid "Play all"223msgid "Play all"
247msgstr ""224msgstr ""
248225
249#: ../common/AlbumsPage.qml:115226#: ../common/AlbumsPage.qml:124
250#, qt-format227#, qt-format
251msgid "%1 album"228msgid "%1 album"
252msgid_plural "%1 albums"229msgid_plural "%1 albums"
253msgstr[0] ""230msgstr[0] ""
254msgstr[1] ""231msgstr[1] ""
255232
256#: ../common/ListItemActions/AddToPlaylist.qml:25 ../music-app.qml:891233#: ../common/ListItemActions/AddToPlaylist.qml:25 ../music-app.qml:905
257msgid "Add to playlist"234msgid "Add to playlist"
258msgstr ""235msgstr ""
259236
@@ -261,7 +238,7 @@
261msgid "Add to Queue"238msgid "Add to Queue"
262msgstr ""239msgstr ""
263240
264#: ../common/ListItemActions/Remove.qml:27 ../common/SongsPage.qml:389241#: ../common/ListItemActions/Remove.qml:27 ../common/SongsPage.qml:400
265msgid "Remove"242msgid "Remove"
266msgstr ""243msgstr ""
267244
@@ -269,38 +246,44 @@
269msgid "Loading..."246msgid "Loading..."
270msgstr ""247msgstr ""
271248
249#: ../common/SongsPage.qml:122 ../common/SongsPage.qml:160
250#: ../common/SongsPage.qml:173 ../common/SongsPage.qml:209
251#: ../common/SongsPage.qml:228 ../common/SongsPage.qml:263
252msgid "Genre"
253msgstr ""
254
272#. TRANSLATORS: this is a title of a dialog with a prompt to rename a playlist255#. TRANSLATORS: this is a title of a dialog with a prompt to rename a playlist
273#: ../common/SongsPage.qml:327256#: ../common/SongsPage.qml:333
274msgid "Change name"257msgid "Change name"
275msgstr ""258msgstr ""
276259
277#: ../common/SongsPage.qml:328260#: ../common/SongsPage.qml:334
278msgid "Enter the new name of the playlist."261msgid "Enter the new name of the playlist."
279msgstr ""262msgstr ""
280263
281#: ../common/SongsPage.qml:345264#: ../common/SongsPage.qml:351
282msgid "Change"265msgid "Change"
283msgstr ""266msgstr ""
284267
285#: ../common/SongsPage.qml:361 ../music-app.qml:945268#: ../common/SongsPage.qml:372 ../music-app.qml:959
286msgid "Playlist already exists"269msgid "Playlist already exists"
287msgstr ""270msgstr ""
288271
289#: ../common/SongsPage.qml:365 ../music-app.qml:950272#: ../common/SongsPage.qml:376 ../music-app.qml:964
290msgid "Please type in a name."273msgid "Please type in a name."
291msgstr ""274msgstr ""
292275
293#: ../common/SongsPage.qml:370 ../common/SongsPage.qml:403276#: ../common/SongsPage.qml:381 ../common/SongsPage.qml:420
294#: ../music-app.qml:486 ../music-app.qml:956277#: ../music-app.qml:499 ../music-app.qml:970
295msgid "Cancel"278msgid "Cancel"
296msgstr ""279msgstr ""
297280
298#. TRANSLATORS: this is a title of a dialog with a prompt to delete a playlist281#. TRANSLATORS: this is a title of a dialog with a prompt to delete a playlist
299#: ../common/SongsPage.qml:383282#: ../common/SongsPage.qml:394
300msgid "Are you sure?"283msgid "Are you sure?"
301msgstr ""284msgstr ""
302285
303#: ../common/SongsPage.qml:384286#: ../common/SongsPage.qml:395
304msgid "This will delete your playlist."287msgid "This will delete your playlist."
305msgstr ""288msgstr ""
306289
@@ -373,74 +356,79 @@
373msgstr ""356msgstr ""
374357
375#. TRANSLATORS: This string represents that the target destination filepath does not start with ~/Music/Imported/358#. TRANSLATORS: This string represents that the target destination filepath does not start with ~/Music/Imported/
376#: ../music-app.qml:331359#: ../music-app.qml:342
377msgid "Filepath must start with"360msgid "Filepath must start with"
378msgstr ""361msgstr ""
379362
380#. TRANSLATORS: This string represents that a blank filepath destination has been used363#. TRANSLATORS: This string represents that a blank filepath destination has been used
381#: ../music-app.qml:357364#: ../music-app.qml:368
382msgid "Filepath must be a file"365msgid "Filepath must be a file"
383msgstr ""366msgstr ""
384367
385#. TRANSLATORS: This string represents that there was failure moving the file to the target destination368#. TRANSLATORS: This string represents that there was failure moving the file to the target destination
386#: ../music-app.qml:363369#: ../music-app.qml:374
387msgid "Failed to move file"370msgid "Failed to move file"
388msgstr ""371msgstr ""
389372
390#: ../music-app.qml:440373#: ../music-app.qml:453
391msgid "Waiting for file(s)..."374msgid "Waiting for file(s)..."
392msgstr ""375msgstr ""
393376
394#: ../music-app.qml:459377#: ../music-app.qml:472
395msgid "OK"378msgid "OK"
396msgstr ""379msgstr ""
397380
398#: ../music-app.qml:472381#: ../music-app.qml:485
399msgid "Imported file not found"382msgid "Imported file not found"
400msgstr ""383msgstr ""
401384
402#: ../music-app.qml:476385#: ../music-app.qml:489
403msgid "Wait"386msgid "Wait"
404msgstr ""387msgstr ""
405388
406#. TRANSLATORS: this refers to a number of songs greater than one. The actual number will be prepended to the string automatically (plural forms are not yet fully supported in usermetrics, the library that displays that string)389#. TRANSLATORS: this refers to a number of songs greater than one. The actual number will be prepended to the string automatically (plural forms are not yet fully supported in usermetrics, the library that displays that string)
407#: ../music-app.qml:497390#: ../music-app.qml:510
408msgid "songs played today"391msgid "songs played today"
409msgstr ""392msgstr ""
410393
411#: ../music-app.qml:498394#: ../music-app.qml:511
412msgid "No songs played today"395msgid "No songs played today"
413msgstr ""396msgstr ""
414397
415#: ../music-app.qml:599398#: ../music-app.qml:591 ../music-app.qml:1155
399#: com.ubuntu.music_music.desktop.in.in.h:1
400msgid "Music"
401msgstr ""
402
403#: ../music-app.qml:613
416msgid "Debug: "404msgid "Debug: "
417msgstr ""405msgstr ""
418406
419#: ../music-app.qml:877407#: ../music-app.qml:891
420msgid "Add to queue"408msgid "Add to queue"
421msgstr ""409msgstr ""
422410
423#: ../music-app.qml:914411#: ../music-app.qml:928
424msgid "New Playlist"412msgid "New Playlist"
425msgstr ""413msgstr ""
426414
427#: ../music-app.qml:915415#: ../music-app.qml:929
428msgid "Name your playlist."416msgid "Name your playlist."
429msgstr ""417msgstr ""
430418
431#: ../music-app.qml:919419#: ../music-app.qml:933
432msgid "Name"420msgid "Name"
433msgstr ""421msgstr ""
434422
435#: ../music-app.qml:929423#: ../music-app.qml:943
436msgid "Create"424msgid "Create"
437msgstr ""425msgstr ""
438426
439#: ../music-app.qml:1167427#: ../music-app.qml:1181
440msgid "No music found"428msgid "No music found"
441msgstr ""429msgstr ""
442430
443#: ../music-app.qml:1174431#: ../music-app.qml:1188
444msgid "Please import music"432msgid "Please import music"
445msgstr ""433msgstr ""
446434

Subscribers

People subscribed via source and target branches