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
1=== modified file 'MusicStart.qml'
2--- MusicStart.qml 2014-09-20 15:41:33 +0000
3+++ MusicStart.qml 2014-10-20 18:24:24 +0000
4@@ -32,482 +32,45 @@
5
6 MusicPage {
7 id: mainpage
8- title: i18n.tr("Music")
9+ title: i18n.tr("Recent")
10
11- /* Dev button for search.
12- Button {
13- id: searchButton
14- text: i18n.tr("Search")
15- anchors.top: parent.top
16- anchors.topMargin: units.gu(2)
17- anchors.bottom: recentlyPlayed.top
18- anchors.bottomMargin: units.gu(1)
19- height: units.gu(4)
20- onClicked: {
21- PopupUtils.open(Qt.resolvedUrl("MusicSearch.qml"), mainView,
22- {
23- title: i18n.tr("Search")
24- } )
25- }
26+ head {
27+ actions: [
28+ Action {
29+ iconName: "delete"
30+ onTriggered: {
31+ Library.clearRecentHistory()
32+ recentModel.filterRecent()
33+ }
34+ }
35+ ]
36 }
37- */
38- Flickable{
39- id: musicFlickable
40- anchors.fill: parent
41-
42- width: mainpage.width
43- height: mainpage.height
44-
45- contentHeight: mainView.hasRecent ? recentlyPlayed.height + recentlist.height + genres.height + genrelist.height + albums.height + albumlist.height + units.gu(4)
46- : genres.height + genrelist.height + albums.height + albumlist.height + units.gu(3)
47- contentWidth: width
48-
49- focus: true
50-
51- ListItem.Standard {
52- id: recentlyPlayed
53- Label {
54- anchors {
55- verticalCenter: parent.verticalCenter
56- left: parent.left
57- leftMargin: units.gu(2)
58- }
59- text: i18n.tr("Recent")
60- color: styleMusic.common.music
61- }
62- visible: mainView.hasRecent
63- }
64-
65- ListView {
66- id: recentlist
67- anchors.top: recentlyPlayed.bottom
68- anchors.topMargin: units.gu(1)
69- width: parent.width
70- spacing: units.gu(1)
71- height: units.gu(18)
72- // TODO: Update when view counts are collected
73- model: recentModel.model
74- delegate: recentDelegate
75- header: Item {
76- id: recentSpacer
77- width: units.gu(1)
78- }
79- footer: Item {
80- id: clearRecent
81- width: recentlist.height - units.gu(2)
82- height: width
83- visible: mainView.hasRecent && !loading.visible
84- Button {
85- id: clearRecentButton
86- anchors.centerIn: parent
87- text: i18n.tr("Clear History")
88- onClicked: {
89- Library.clearRecentHistory()
90- mainView.hasRecent = false
91- recentModel.filterRecent()
92- }
93- }
94- }
95- orientation: ListView.Horizontal
96- visible: mainView.hasRecent
97-
98- Component {
99- id: recentDelegate
100- Item {
101- property string title: model.title
102- property string title2: model.title2 !== "Playlist" ? model.title2 : i18n.tr("Playlist")
103- property var covers: type === "playlist" ? Playlists.getPlaylistCovers(title) : (model.art !== undefined ? [{art: model.art}] : [{author: model.title2, album: model.title}])
104- property string type: model.type
105- property string time: model.time
106- property string key: model.key
107- id: recentItem
108- height: recentlist.height - units.gu(1)
109- width: height
110- CoverRow {
111- id: recentShape
112- anchors {
113- top: parent.top
114- left: parent.left
115- verticalCenter: parent.verticalCenter
116- }
117- count: recentItem.covers.length
118- size: recentItem.width
119- covers: recentItem.covers
120- spacing: units.gu(2)
121- }
122- Item { // Background so can see text in current state
123- id: albumBg
124- anchors {
125- bottom: parent.bottom
126- left: parent.left
127- right: parent.right
128- }
129- height: units.gu(6)
130- clip: true
131- UbuntuShape{
132- anchors {
133- bottom: parent.bottom
134- left: parent.left
135- right: parent.right
136- }
137- height: recentShape.height
138- radius: "medium"
139- color: styleMusic.common.black
140- opacity: 0.6
141- }
142- }
143- Label {
144- id: albumArtist
145- anchors.bottom: parent.bottom
146- anchors.bottomMargin: units.gu(3)
147- anchors.left: parent.left
148- anchors.leftMargin: units.gu(1)
149- anchors.right: parent.right
150- anchors.rightMargin: units.gu(1)
151- color: styleMusic.common.white
152- elide: Text.ElideRight
153- text: title
154- fontSize: "small"
155- font.weight: Font.DemiBold
156- }
157- Label {
158- id: albumLabel
159- anchors.left: parent.left
160- anchors.leftMargin: units.gu(1)
161- anchors.bottom: parent.bottom
162- anchors.bottomMargin: units.gu(1)
163- anchors.right: parent.right
164- anchors.rightMargin: units.gu(1)
165- color: styleMusic.common.white
166- elide: Text.ElideRight
167- text: title2
168- fontSize: "x-small"
169- }
170- MouseArea {
171- anchors.fill: parent
172- onClicked: {
173- if (type === "playlist") {
174- albumTracksModel.filterPlaylistTracks(key)
175- } else {
176- songsPage.album = title;
177- }
178- songsPage.genre = undefined;
179-
180- songsPage.line1 = title2
181- songsPage.line2 = title
182- songsPage.covers = recentItem.covers
183- songsPage.isAlbum = (type === "album")
184- songsPage.title = songsPage.isAlbum ? i18n.tr("Album") : i18n.tr("Playlist")
185-
186- mainPageStack.push(songsPage)
187- }
188-
189- // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
190- onPressedChanged: recentShape.pressed = pressed
191- }
192- }
193- }
194- }
195-
196- ListItem.ThinDivider {
197- id: genreDivider
198- anchors.top: mainView.hasRecent ? recentlist.bottom : parent.top
199- visible: genrelist.count > 1
200- }
201- ListItem.Standard {
202- id: genres
203- anchors.top: genreDivider.bottom
204- visible: genrelist.count > 1
205- Label {
206- anchors {
207- verticalCenter: parent.verticalCenter
208- left: parent.left
209- leftMargin: units.gu(2)
210- }
211- text: i18n.tr("Genres")
212- color: styleMusic.common.music
213- }
214- }
215- // TODO: add music genres. frequency of play? most tracks?
216- ListView {
217- id: genrelist
218- width: parent.width
219- anchors.top: genres.bottom
220- anchors.topMargin: units.gu(1)
221- spacing: units.gu(1)
222- height: units.gu(18)
223- visible: genrelist.count > 1
224- model: SortFilterModel {
225- id: genresModelFilter
226- model: GenresModel {
227- id: genresModel
228- store: musicStore
229- }
230- filter.property: "genre"
231- filter.pattern: /\S+/
232- }
233-
234- delegate: genreDelegate
235- header: Item {
236- id: genreSpacer
237- width: units.gu(1)
238- }
239- orientation: ListView.Horizontal
240-
241- Component {
242- id: genreDelegate
243- Item {
244- id: genreItem
245- objectName: "genreItemObject"
246- height: genrelist.height - units.gu(1)
247- width: height
248-
249- Repeater {
250- id: albumGenreModelRepeater
251- model: AlbumsModel {
252- genre: model.genre
253- store: musicStore
254- }
255-
256- delegate: Item {
257- property string art: model.art
258- }
259- property var covers: []
260- signal finished()
261-
262- onFinished: {
263- genreShape.count = count
264- genreShape.covers = covers
265- }
266- onItemAdded: {
267- covers.push({art: item.art});
268-
269- if (index === count - 1) {
270- finished();
271- }
272- }
273- }
274-
275- SongsModel {
276- id: songGenreModel
277- genre: model.genre
278- store: musicStore
279- }
280-
281- CoverRow {
282- id: genreShape
283- anchors {
284- top: parent.top
285- left: parent.left
286- verticalCenter: parent.verticalCenter
287- }
288- count: 0
289- size: genreItem.width
290- covers: []
291- spacing: units.gu(2)
292- }
293- MouseArea {
294- anchors.fill: parent
295- onClicked: {
296- songsPage.album = undefined
297- songsPage.covers = genreShape.covers
298- songsPage.genre = model.genre
299- songsPage.isAlbum = true
300- songsPage.line1 = i18n.tr("Genre")
301- songsPage.line2 = model.genre
302- songsPage.title = i18n.tr("Genre")
303-
304- mainPageStack.push(songsPage)
305- }
306-
307- // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
308- onPressedChanged: genreShape.pressed = pressed
309- }
310- Item { // Background so can see text in current state
311- id: genreBg
312- anchors {
313- bottom: parent.bottom
314- left: parent.left
315- right: parent.right
316- }
317- height: units.gu(5.5)
318- clip: true
319- UbuntuShape{
320- anchors {
321- bottom: parent.bottom
322- left: parent.left
323- right: parent.right
324- }
325- height: genreShape.height
326- radius: "medium"
327- color: styleMusic.common.black
328- opacity: 0.6
329- }
330- }
331- Label {
332- id: genreLabel
333- anchors.bottom: parent.bottom
334- anchors.bottomMargin: units.gu(1)
335- anchors.left: parent.left
336- anchors.leftMargin: units.gu(1)
337- anchors.right: parent.right
338- anchors.rightMargin: units.gu(1)
339- color: styleMusic.common.white
340- elide: Text.ElideRight
341- text: model.genre
342- fontSize: "small"
343- font.weight: Font.DemiBold
344- }
345- Label {
346- id: genreTotal
347- anchors.bottom: parent.bottom
348- anchors.bottomMargin: units.gu(3)
349- anchors.left: parent.left
350- anchors.leftMargin: units.gu(1)
351- anchors.right: parent.right
352- anchors.rightMargin: units.gu(1)
353- color: styleMusic.common.white
354- elide: Text.ElideRight
355- text: i18n.tr("%1 song", "%1 songs", songGenreModel.rowCount).arg(songGenreModel.rowCount)
356- fontSize: "x-small"
357- }
358- }
359- }
360- }
361-
362- ListItem.ThinDivider {
363- id: albumsDivider
364- anchors.top: genrelist.visible
365- ? genrelist.bottom
366- : (mainView.hasRecent ? recentlist.bottom : parent.top)
367- }
368- ListItem.Standard {
369- id: albums
370- Label {
371- anchors {
372- verticalCenter: parent.verticalCenter
373- left: parent.left
374- leftMargin: units.gu(2)
375- }
376- text: i18n.tr("Albums")
377- color: styleMusic.common.music
378- }
379- anchors.top: albumsDivider.bottom
380- }
381-
382- ListView {
383- id: albumlist
384- width: parent.width
385- anchors.top: albums.bottom
386- anchors.topMargin: units.gu(1)
387- spacing: units.gu(1)
388- height: units.gu(18)
389- model: SortFilterModel {
390- id: albumsModelFilter
391- property alias rowCount: albumsModel.rowCount
392- model: AlbumsModel {
393- id: albumsModel
394- store: musicStore
395- }
396- sort.property: "title"
397- sort.order: Qt.AscendingOrder
398- }
399- delegate: albumDelegate
400- header: Item {
401- id: albumSpacer
402- width: units.gu(1)
403- }
404- orientation: ListView.Horizontal
405-
406- Component {
407- id: albumDelegate
408- Item {
409- property string artist: model.artist
410- property string album: model.title
411- property var covers: [{art: model.art}]
412-
413- id: albumItem
414- objectName: "albumItemObject"
415- height: albumlist.height - units.gu(1)
416- width: height
417- CoverRow {
418- id: albumShape
419- anchors {
420- top: parent.top
421- left: parent.left
422- verticalCenter: parent.verticalCenter
423- }
424- count: albumItem.covers.length
425- size: albumItem.width
426- covers: albumItem.covers
427- spacing: units.gu(2)
428- }
429- MouseArea {
430- anchors.fill: parent
431- onClicked: {
432- songsPage.album = album
433- songsPage.covers = covers
434- songsPage.genre = undefined
435- songsPage.isAlbum = true
436- songsPage.line1 = artist
437- songsPage.line2 = album
438- songsPage.title = i18n.tr("Album")
439-
440- mainPageStack.push(songsPage)
441- }
442-
443- // TODO: If http://pad.lv/1354753 is fixed to expose whether the Shape should appear pressed, update this as well.
444- onPressedChanged: albumShape.pressed = pressed
445- }
446- Item { // Background so can see text in current state
447- id: albumBg
448- anchors {
449- bottom: parent.bottom
450- left: parent.left
451- right: parent.right
452- }
453- height: units.gu(6)
454- clip: true
455- UbuntuShape{
456- anchors {
457- bottom: parent.bottom
458- left: parent.left
459- right: parent.right
460- }
461- height: albumShape.height
462- radius: "medium"
463- color: styleMusic.common.black
464- opacity: 0.6
465- }
466- }
467- Label {
468- id: albumLabel
469- anchors.bottom: parent.bottom
470- anchors.bottomMargin: units.gu(1)
471- anchors.left: parent.left
472- anchors.leftMargin: units.gu(1)
473- anchors.right: parent.right
474- anchors.rightMargin: units.gu(1)
475- color: styleMusic.common.white
476- elide: Text.ElideRight
477- text: artist
478- fontSize: "x-small"
479- }
480- Label {
481- id: albumLabel2
482- anchors.bottom: parent.bottom
483- anchors.bottomMargin: units.gu(3)
484- anchors.left: parent.left
485- anchors.leftMargin: units.gu(1)
486- anchors.right: parent.right
487- anchors.rightMargin: units.gu(1)
488- color: styleMusic.common.white
489- elide: Text.ElideRight
490- text: album
491- fontSize: "small"
492- font.weight: Font.DemiBold
493- }
494- }
495+
496+ CardView {
497+ id: recentCardView
498+ model: recentModel.model
499+ delegate: Card {
500+ id: albumCard
501+ coverSources: model.type === "playlist" ? Playlists.getPlaylistCovers(title) : (model.art !== undefined ? [{art: model.art}] : [{author: model.title2, album: model.title}])
502+ objectName: "albumsPageGridItem" + index
503+ primaryText: model.title
504+ secondaryText: model.title2 !== "Playlist" ? model.title2 : i18n.tr("Playlist")
505+
506+ onClicked: {
507+ if (type === "playlist") {
508+ albumTracksModel.filterPlaylistTracks(model.key)
509+ } else {
510+ songsPage.album = title;
511+ }
512+ songsPage.genre = undefined;
513+
514+ songsPage.line1 = secondaryText
515+ songsPage.line2 = primaryText
516+ songsPage.covers = coverSources
517+ songsPage.isAlbum = (type === "album")
518+ songsPage.title = songsPage.isAlbum ? i18n.tr("Album") : i18n.tr("Playlist")
519+
520+ mainPageStack.push(songsPage)
521 }
522 }
523 }
524
525=== modified file 'common/SongsPage.qml'
526--- common/SongsPage.qml 2014-10-18 03:49:51 +0000
527+++ common/SongsPage.qml 2014-10-20 18:24:24 +0000
528@@ -121,11 +121,9 @@
529
530 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
531 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")
532- mainView.hasRecent = true
533 recentModel.filterRecent()
534 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
535 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
536- mainView.hasRecent = true
537 recentModel.filterRecent()
538 }
539 }
540@@ -161,11 +159,9 @@
541
542 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
543 Library.addRecent(songStackPage.line2, songStackPage.line1, songStackPage.covers[0], songStackPage.line2, "album")
544- mainView.hasRecent = true
545 recentModel.filterRecent()
546 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
547 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
548- mainView.hasRecent = true
549 recentModel.filterRecent()
550 }
551 }
552@@ -266,11 +262,9 @@
553
554 if (isAlbum && songStackPage.line1 !== i18n.tr("Genre")) {
555 Library.addRecent(songStackPage.line2, songStackPage.line1, model.art, songStackPage.line2, "album")
556- mainView.hasRecent = true
557 recentModel.filterRecent()
558 } else if (songStackPage.line1 === i18n.tr("Playlist")) {
559 Library.addRecent(songStackPage.line2, "Playlist", songStackPage.covers[0], songStackPage.line2, "playlist")
560- mainView.hasRecent = true
561 recentModel.filterRecent()
562 }
563 }
564@@ -413,7 +407,6 @@
565
566 if (Library.recentContainsPlaylist(dialogRemovePlaylist.oldPlaylistName)) {
567 Library.recentRemovePlaylist(dialogRemovePlaylist.oldPlaylistName)
568- mainView.hasRecent = !Library.isRecentEmpty()
569 recentModel.filterRecent()
570 }
571
572
573=== modified file 'music-app.qml'
574--- music-app.qml 2014-10-16 22:12:01 +0000
575+++ music-app.qml 2014-10-20 18:24:24 +0000
576@@ -211,7 +211,6 @@
577
578 // Add album to recent list
579 Library.addRecent(songsAlbumArtistModel.album, songsAlbumArtistModel.artist, songsAlbumArtistModel.art, songsAlbumArtistModel.album, "album")
580- mainView.hasRecent = true
581 recentModel.filterRecent()
582 }
583
584@@ -576,7 +575,9 @@
585 // TODO: Switch tabs back and forth to get the background color in the
586 // header to work properly.
587 tabs.selectedTabIndex = 1
588- tabs.selectedTabIndex = 0
589+
590+ // goto Recent if there are items otherwise go to Albums
591+ tabs.selectedTabIndex = Library.isRecentEmpty() ? 2 : 0
592
593 // Run post load
594 tabs.ensurePopulated(tabs.selectedTab);
595@@ -589,7 +590,6 @@
596 // VARIABLES
597 property string musicName: i18n.tr("Music")
598 property string appVersion: '1.2'
599- property bool hasRecent: !Library.isRecentEmpty()
600 property bool scrobble: false
601 property string lastfmusername
602 property string lastfmpassword
603
604=== modified file 'po/com.ubuntu.music.pot'
605--- po/com.ubuntu.music.pot 2014-10-14 15:46:07 +0000
606+++ po/com.ubuntu.music.pot 2014-10-20 18:24:24 +0000
607@@ -8,7 +8,7 @@
608 msgstr ""
609 "Project-Id-Version: music-app\n"
610 "Report-Msgid-Bugs-To: \n"
611-"POT-Creation-Date: 2014-10-14 16:45+0100\n"
612+"POT-Creation-Date: 2014-10-20 15:09+0100\n"
613 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
614 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
615 "Language-Team: LANGUAGE <LL@li.org>\n"
616@@ -54,12 +54,11 @@
617 msgid "You forgot to set your username and/or password"
618 msgstr ""
619
620-#: ../MusicAlbums.qml:29 ../MusicStart.qml:392
621+#: ../MusicAlbums.qml:29
622 msgid "Albums"
623 msgstr ""
624
625-#: ../MusicAlbums.qml:57 ../MusicStart.qml:200 ../MusicStart.qml:454
626-#: ../common/AlbumsPage.qml:146
627+#: ../MusicAlbums.qml:57 ../MusicStart.qml:71 ../common/AlbumsPage.qml:155
628 msgid "Album"
629 msgstr ""
630
631@@ -85,21 +84,19 @@
632 msgid "Playlists"
633 msgstr ""
634
635-#: ../MusicPlaylists.qml:61 ../MusicStart.qml:371
636-#: ../MusicaddtoPlaylist.qml:105 ../common/SongsPage.qml:220
637-#: ../common/SongsPage.qml:221
638+#: ../MusicPlaylists.qml:61 ../MusicaddtoPlaylist.qml:105
639+#: ../common/SongsPage.qml:228 ../common/SongsPage.qml:229
640 #, qt-format
641 msgid "%1 song"
642 msgid_plural "%1 songs"
643 msgstr[0] ""
644 msgstr[1] ""
645
646-#: ../MusicPlaylists.qml:66 ../MusicPlaylists.qml:70 ../MusicStart.qml:118
647-#: ../MusicStart.qml:200 ../common/SongsPage.qml:47
648-#: ../common/SongsPage.qml:126 ../common/SongsPage.qml:166
649-#: ../common/SongsPage.qml:176 ../common/SongsPage.qml:204
650-#: ../common/SongsPage.qml:239 ../common/SongsPage.qml:241
651-#: ../common/SongsPage.qml:259
652+#: ../MusicPlaylists.qml:66 ../MusicPlaylists.qml:70 ../MusicStart.qml:57
653+#: ../MusicStart.qml:71 ../common/SongsPage.qml:47 ../common/SongsPage.qml:125
654+#: ../common/SongsPage.qml:163 ../common/SongsPage.qml:172
655+#: ../common/SongsPage.qml:208 ../common/SongsPage.qml:247
656+#: ../common/SongsPage.qml:249 ../common/SongsPage.qml:266
657 msgid "Playlist"
658 msgstr ""
659
660@@ -194,30 +191,10 @@
661 msgid "Clean everything!"
662 msgstr ""
663
664-#: ../MusicStart.qml:35 ../music-app.qml:576 ../music-app.qml:1141
665-#: com.ubuntu.music_music.desktop.in.in.h:1
666-msgid "Music"
667-msgstr ""
668-
669-#: ../MusicStart.qml:75
670+#: ../MusicStart.qml:35
671 msgid "Recent"
672 msgstr ""
673
674-#: ../MusicStart.qml:103
675-msgid "Clear History"
676-msgstr ""
677-
678-#: ../MusicStart.qml:227
679-msgid "Genres"
680-msgstr ""
681-
682-#: ../MusicStart.qml:316 ../MusicStart.qml:318 ../common/SongsPage.qml:122
683-#: ../common/SongsPage.qml:162 ../common/SongsPage.qml:177
684-#: ../common/SongsPage.qml:205 ../common/SongsPage.qml:220
685-#: ../common/SongsPage.qml:255
686-msgid "Genre"
687-msgstr ""
688-
689 #: ../MusicToolbar.qml:150
690 msgid "Tap to shuffle music"
691 msgstr ""
692@@ -238,22 +215,22 @@
693 msgid "Shuffle"
694 msgstr ""
695
696-#: ../common/AlbumsPage.qml:72 ../common/SongsPage.qml:144
697+#: ../common/AlbumsPage.qml:72 ../common/SongsPage.qml:142
698 msgid "Queue all"
699 msgstr ""
700
701-#: ../common/AlbumsPage.qml:83 ../common/SongsPage.qml:155
702+#: ../common/AlbumsPage.qml:83 ../common/SongsPage.qml:153
703 msgid "Play all"
704 msgstr ""
705
706-#: ../common/AlbumsPage.qml:115
707+#: ../common/AlbumsPage.qml:124
708 #, qt-format
709 msgid "%1 album"
710 msgid_plural "%1 albums"
711 msgstr[0] ""
712 msgstr[1] ""
713
714-#: ../common/ListItemActions/AddToPlaylist.qml:25 ../music-app.qml:891
715+#: ../common/ListItemActions/AddToPlaylist.qml:25 ../music-app.qml:905
716 msgid "Add to playlist"
717 msgstr ""
718
719@@ -261,7 +238,7 @@
720 msgid "Add to Queue"
721 msgstr ""
722
723-#: ../common/ListItemActions/Remove.qml:27 ../common/SongsPage.qml:389
724+#: ../common/ListItemActions/Remove.qml:27 ../common/SongsPage.qml:400
725 msgid "Remove"
726 msgstr ""
727
728@@ -269,38 +246,44 @@
729 msgid "Loading..."
730 msgstr ""
731
732+#: ../common/SongsPage.qml:122 ../common/SongsPage.qml:160
733+#: ../common/SongsPage.qml:173 ../common/SongsPage.qml:209
734+#: ../common/SongsPage.qml:228 ../common/SongsPage.qml:263
735+msgid "Genre"
736+msgstr ""
737+
738 #. TRANSLATORS: this is a title of a dialog with a prompt to rename a playlist
739-#: ../common/SongsPage.qml:327
740+#: ../common/SongsPage.qml:333
741 msgid "Change name"
742 msgstr ""
743
744-#: ../common/SongsPage.qml:328
745+#: ../common/SongsPage.qml:334
746 msgid "Enter the new name of the playlist."
747 msgstr ""
748
749-#: ../common/SongsPage.qml:345
750+#: ../common/SongsPage.qml:351
751 msgid "Change"
752 msgstr ""
753
754-#: ../common/SongsPage.qml:361 ../music-app.qml:945
755+#: ../common/SongsPage.qml:372 ../music-app.qml:959
756 msgid "Playlist already exists"
757 msgstr ""
758
759-#: ../common/SongsPage.qml:365 ../music-app.qml:950
760+#: ../common/SongsPage.qml:376 ../music-app.qml:964
761 msgid "Please type in a name."
762 msgstr ""
763
764-#: ../common/SongsPage.qml:370 ../common/SongsPage.qml:403
765-#: ../music-app.qml:486 ../music-app.qml:956
766+#: ../common/SongsPage.qml:381 ../common/SongsPage.qml:420
767+#: ../music-app.qml:499 ../music-app.qml:970
768 msgid "Cancel"
769 msgstr ""
770
771 #. TRANSLATORS: this is a title of a dialog with a prompt to delete a playlist
772-#: ../common/SongsPage.qml:383
773+#: ../common/SongsPage.qml:394
774 msgid "Are you sure?"
775 msgstr ""
776
777-#: ../common/SongsPage.qml:384
778+#: ../common/SongsPage.qml:395
779 msgid "This will delete your playlist."
780 msgstr ""
781
782@@ -373,74 +356,79 @@
783 msgstr ""
784
785 #. TRANSLATORS: This string represents that the target destination filepath does not start with ~/Music/Imported/
786-#: ../music-app.qml:331
787+#: ../music-app.qml:342
788 msgid "Filepath must start with"
789 msgstr ""
790
791 #. TRANSLATORS: This string represents that a blank filepath destination has been used
792-#: ../music-app.qml:357
793+#: ../music-app.qml:368
794 msgid "Filepath must be a file"
795 msgstr ""
796
797 #. TRANSLATORS: This string represents that there was failure moving the file to the target destination
798-#: ../music-app.qml:363
799+#: ../music-app.qml:374
800 msgid "Failed to move file"
801 msgstr ""
802
803-#: ../music-app.qml:440
804+#: ../music-app.qml:453
805 msgid "Waiting for file(s)..."
806 msgstr ""
807
808-#: ../music-app.qml:459
809+#: ../music-app.qml:472
810 msgid "OK"
811 msgstr ""
812
813-#: ../music-app.qml:472
814+#: ../music-app.qml:485
815 msgid "Imported file not found"
816 msgstr ""
817
818-#: ../music-app.qml:476
819+#: ../music-app.qml:489
820 msgid "Wait"
821 msgstr ""
822
823 #. 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)
824-#: ../music-app.qml:497
825+#: ../music-app.qml:510
826 msgid "songs played today"
827 msgstr ""
828
829-#: ../music-app.qml:498
830+#: ../music-app.qml:511
831 msgid "No songs played today"
832 msgstr ""
833
834-#: ../music-app.qml:599
835+#: ../music-app.qml:591 ../music-app.qml:1155
836+#: com.ubuntu.music_music.desktop.in.in.h:1
837+msgid "Music"
838+msgstr ""
839+
840+#: ../music-app.qml:613
841 msgid "Debug: "
842 msgstr ""
843
844-#: ../music-app.qml:877
845+#: ../music-app.qml:891
846 msgid "Add to queue"
847 msgstr ""
848
849-#: ../music-app.qml:914
850+#: ../music-app.qml:928
851 msgid "New Playlist"
852 msgstr ""
853
854-#: ../music-app.qml:915
855+#: ../music-app.qml:929
856 msgid "Name your playlist."
857 msgstr ""
858
859-#: ../music-app.qml:919
860+#: ../music-app.qml:933
861 msgid "Name"
862 msgstr ""
863
864-#: ../music-app.qml:929
865+#: ../music-app.qml:943
866 msgid "Create"
867 msgstr ""
868
869-#: ../music-app.qml:1167
870+#: ../music-app.qml:1181
871 msgid "No music found"
872 msgstr ""
873
874-#: ../music-app.qml:1174
875+#: ../music-app.qml:1188
876 msgid "Please import music"
877 msgstr ""
878

Subscribers

People subscribed via source and target branches