Merge lp:~nik90/podbird/devel-branch-sync-3 into lp:podbird

Proposed by Nekhelesh Ramananthan
Status: Merged
Approved by: Michael Sheldon
Approved revision: 195
Merged at revision: 153
Proposed branch: lp:~nik90/podbird/devel-branch-sync-3
Merge into: lp:podbird
Prerequisite: lp:~nik90/podbird/devel-branch-sync-2
Diff against target: 2073 lines (+939/-590)
17 files modified
app/components/TabsList.qml (+58/-0)
app/podbird.qml (+15/-2)
app/settings/CleanSetting.qml (+9/-2)
app/settings/DownloadSetting.qml (+9/-2)
app/settings/ThemeSetting.qml (+9/-2)
app/themes/Dark.qml (+3/-3)
app/themes/Light.qml (+3/-3)
app/ui/EpisodesPage.qml (+222/-79)
app/ui/EpisodesTab.qml (+2/-0)
app/ui/FullPlayingView.qml (+304/-0)
app/ui/NowPlayingPage.qml (+16/-309)
app/ui/PodcastsTab.qml (+0/-7)
app/ui/Queue.qml (+74/-59)
app/ui/SearchPage.qml (+11/-2)
app/welcomewizard/Slide5.qml (+68/-0)
app/welcomewizard/WelcomeWizard.qml (+2/-1)
po/com.mikeasoft.podbird.pot (+134/-119)
To merge this branch: bzr merge lp:~nik90/podbird/devel-branch-sync-3
Reviewer Review Type Date Requested Status
Michael Sheldon Approve
Review via email: mp+289565@code.launchpad.net

Description of the change

This MP brings trunk to up to date with the latest Podbird Devel release 0.7.6. It includes the following fixes,

- Added multi-select mode to the Episodes Page
- Brought back the "Add new podcasts" as a separate tab
- Added plural forms for %1 seconds in the settings page
- Added support for reordering items in the queue
- Added welcome wizard slide explaining about the listitem actions and multi-select mode

To post a comment you must log in.
Revision history for this message
Michael Sheldon (michael-sheldon) wrote :

Seems to have the wrong icon for deleting podcasts

review: Needs Fixing
Revision history for this message
Michael Sheldon (michael-sheldon) wrote :

And another one (in diff comments)

193. By Nekhelesh Ramananthan

Changed icon to delete

Revision history for this message
Nekhelesh Ramananthan (nik90) wrote :

Reverted the icon change.

194. By Nekhelesh Ramananthan

merged prerequisite

195. By Nekhelesh Ramananthan

Removed hard coded colors

Revision history for this message
Michael Sheldon (michael-sheldon) wrote :

Looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'app/components/TabsList.qml'
2--- app/components/TabsList.qml 1970-01-01 00:00:00 +0000
3+++ app/components/TabsList.qml 2016-03-28 22:41:59 +0000
4@@ -0,0 +1,58 @@
5+/*
6+ * Copyright 2015-2016 Podbird Team
7+ *
8+ * This file is part of Podbird.
9+ *
10+ * Podbird is free software; you can redistribute it and/or modify
11+ * it under the terms of the GNU General Public License as published by
12+ * the Free Software Foundation; version 3.
13+ *
14+ * Podbird is distributed in the hope that it will be useful,
15+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+ * GNU General Public License for more details.
18+ *
19+ * You should have received a copy of the GNU General Public License
20+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21+ */
22+
23+import QtQuick 2.4
24+import Ubuntu.Components 1.3
25+
26+ActionList {
27+ id: tabsList
28+
29+ children: [
30+ Action {
31+ text: i18n.tr("Episodes")
32+ visible: tabs.selectedTab !== episodesTab
33+ onTriggered: {
34+ tabs.selectedTabIndex = 0
35+ }
36+ },
37+
38+ Action {
39+ text: i18n.tr("Add New Podcasts")
40+ visible: tabs.selectedTab !== searchTab
41+ onTriggered: {
42+ tabs.selectedTabIndex = 1
43+ }
44+ },
45+
46+ Action {
47+ text: i18n.tr("Podcasts")
48+ visible: tabs.selectedTab !== podcastTab
49+ onTriggered: {
50+ tabs.selectedTabIndex = 2
51+ }
52+ },
53+
54+ Action {
55+ text: i18n.tr("Settings")
56+ visible: tabs.selectedTab !== settingsTab
57+ onTriggered: {
58+ tabs.selectedTabIndex = 3
59+ }
60+ }
61+ ]
62+}
63
64=== added file 'app/graphics/listitemactions.png'
65Binary files app/graphics/listitemactions.png 1970-01-01 00:00:00 +0000 and app/graphics/listitemactions.png 2016-03-28 22:41:59 +0000 differ
66=== modified file 'app/podbird.qml'
67--- app/podbird.qml 2016-03-28 22:41:59 +0000
68+++ app/podbird.qml 2016-03-28 22:41:59 +0000
69@@ -54,9 +54,9 @@
70 // RefreshModel function to call refreshModel() function of the tab currently
71 // visible on application start.
72 function refreshModels() {
73- if (tabs.selectedTabIndex === 0) {
74+ if (tabs.selectedTab === episodesTab) {
75 episodesTab.refreshModel()
76- } else if (tabs.selectedTabIndex === 1) {
77+ } else if (tabs.selectedTab === podcastTab) {
78 podcastPage.item.refreshModel()
79 }
80 }
81@@ -323,6 +323,19 @@
82 }
83
84 Tab {
85+ id: searchTab
86+
87+ // Dynamically load/unload the search tab as required
88+ page: Loader {
89+ parent: searchTab
90+ anchors.left: parent.left
91+ anchors.right: parent.right
92+ anchors.bottom: parent.bottom
93+ source: (tabs.selectedTab === searchTab) ? Qt.resolvedUrl("ui/SearchPage.qml") : ""
94+ }
95+ }
96+
97+ Tab {
98 id: podcastTab
99
100 page: Loader {
101
102=== modified file 'app/settings/CleanSetting.qml'
103--- app/settings/CleanSetting.qml 2016-02-25 11:09:44 +0000
104+++ app/settings/CleanSetting.qml 2016-03-28 22:41:59 +0000
105@@ -24,7 +24,14 @@
106 id: cleanSettingPage
107
108 visible: false
109- title: i18n.tr("Delete older than")
110+
111+ header: PageHeader {
112+ title: i18n.tr("Delete older than")
113+ flickable: cleanup
114+ StyleHints {
115+ backgroundColor: podbird.appTheme.background
116+ }
117+ }
118
119 ListModel {
120 id: cleanupModel
121@@ -39,7 +46,7 @@
122 }
123 }
124
125- UbuntuListView {
126+ ListView {
127 id: cleanup
128
129 currentIndex: -1
130
131=== modified file 'app/settings/DownloadSetting.qml'
132--- app/settings/DownloadSetting.qml 2016-02-25 11:09:44 +0000
133+++ app/settings/DownloadSetting.qml 2016-03-28 22:41:59 +0000
134@@ -24,7 +24,14 @@
135 id: downloadSetting
136
137 visible: false
138- title: i18n.tr("Download at most")
139+
140+ header: PageHeader {
141+ title: i18n.tr("Download at most")
142+ flickable: download
143+ StyleHints {
144+ backgroundColor: podbird.appTheme.background
145+ }
146+ }
147
148 ListModel {
149 id: episodeDownloadNumber
150@@ -38,7 +45,7 @@
151 }
152 }
153
154- UbuntuListView {
155+ ListView {
156 id: download
157
158 currentIndex: -1
159
160=== modified file 'app/settings/ThemeSetting.qml'
161--- app/settings/ThemeSetting.qml 2016-02-25 11:09:44 +0000
162+++ app/settings/ThemeSetting.qml 2016-03-28 22:41:59 +0000
163@@ -24,7 +24,14 @@
164 id: themeSettingPage
165
166 visible: false
167- title: i18n.tr("Theme")
168+
169+ header: PageHeader {
170+ title: i18n.tr("Theme")
171+ flickable: themes
172+ StyleHints {
173+ backgroundColor: podbird.appTheme.background
174+ }
175+ }
176
177 ListModel {
178 id: themeModel
179@@ -37,7 +44,7 @@
180 }
181 }
182
183- UbuntuListView {
184+ ListView {
185 id: themes
186
187 currentIndex: -1
188
189=== modified file 'app/themes/Dark.qml'
190--- app/themes/Dark.qml 2016-03-28 22:41:59 +0000
191+++ app/themes/Dark.qml 2016-02-19 20:10:06 +0000
192@@ -33,9 +33,9 @@
193 property color baseIcon: "White"
194
195 // Button Colors
196- property color positiveActionButton: "#3EB34F" // UbuntuColors.green
197- property color negativeActionButton: "#ED3146" // UbuntuColors.red
198- property color neutralActionButton: "#5D5D5D" // UbuntuColors.coolGrey
199+ property color positiveActionButton: UbuntuColors.green
200+ property color negativeActionButton: UbuntuColors.red
201+ property color neutralActionButton: UbuntuColors.coolGrey
202
203 // Bottom Player Bar Colors
204 property color bottomBarBackground: "#15141A"
205
206=== modified file 'app/themes/Light.qml'
207--- app/themes/Light.qml 2016-03-28 22:41:59 +0000
208+++ app/themes/Light.qml 2016-02-19 20:10:06 +0000
209@@ -33,9 +33,9 @@
210 property color baseIcon: UbuntuColors.darkGrey
211
212 // Button Colors
213- property color positiveActionButton: "#3EB34F" // UbuntuColors.green
214- property color negativeActionButton: "#ED3146" // UbuntuColors.red
215- property color neutralActionButton: "#5D5D5D" // UbuntuColors.coolGrey
216+ property color positiveActionButton: UbuntuColors.green
217+ property color negativeActionButton: UbuntuColors.red
218+ property color neutralActionButton: UbuntuColors.coolGrey
219
220 // Bottom Player Bar Colors
221 property color bottomBarBackground: "#323435"
222
223=== modified file 'app/ui/EpisodesPage.qml'
224--- app/ui/EpisodesPage.qml 2016-03-28 22:41:59 +0000
225+++ app/ui/EpisodesPage.qml 2016-03-28 22:41:59 +0000
226@@ -29,8 +29,6 @@
227 id: episodesPage
228
229 visible: false
230- title: i18n.tr("Podcast")
231- flickable: null
232
233 property string episodeName
234 property string episodeId
235@@ -47,81 +45,205 @@
236 tempGuid = downloader.downloadingGuid
237 }
238
239- head.contents: Label {
240- text: title
241- anchors.fill: parent
242- anchors.margins: units.gu(0.5)
243- verticalAlignment: Text.AlignVCenter
244-
245- textSize: Label.XLarge
246- fontSizeMode: Text.Fit
247-
248- maximumLineCount: 3
249- minimumPointSize: 8
250- elide: Text.Right
251- wrapMode: Text.WordWrap
252- }
253-
254- state: "default"
255- states: [
256- PageHeadState {
257- name: "default"
258- head: episodesPage.head
259+ header: standardHeader
260+
261+ PageHeader {
262+ id: standardHeader
263+ title: i18n.tr("Podcast")
264+ flickable: null
265+
266+ StyleHints {
267+ backgroundColor: podbird.appTheme.background
268+ }
269+
270+ trailingActionBar.actions: [
271+ Action {
272+ iconName: "search"
273+ text: i18n.tr("Search Episode")
274+ onTriggered: {
275+ episodesPage.header = searchHeader
276+ searchField.item.forceActiveFocus()
277+ }
278+ },
279+
280+ Action {
281+ text: i18n.tr("Unsubscribe")
282+ iconName: "delete"
283+ onTriggered: {
284+ PopupUtils.open(confirmDeleteDialog, episodesPage);
285+ }
286+ }
287+ ]
288+ }
289+
290+ PageHeader {
291+ id: searchHeader
292+ visible: episodesPage.header === searchHeader
293+ flickable: null
294+
295+ leadingActionBar.actions: Action {
296+ iconName: "back"
297+ onTriggered: {
298+ episodeList.forceActiveFocus()
299+ episodesPage.header = standardHeader
300+ episodeList.positionViewAtBeginning()
301+ }
302+ }
303+
304+ StyleHints {
305+ backgroundColor: podbird.appTheme.background
306+ }
307+
308+ contents: Loader {
309+ id: searchField
310+ sourceComponent: episodesPage.header === searchHeader ? searchFieldComponent : undefined
311+ anchors.left: parent ? parent.left : undefined
312+ anchors.right: parent ? parent.right : undefined
313+ anchors.verticalCenter: parent ? parent.verticalCenter : undefined
314+ }
315+ }
316+
317+ PageHeader {
318+ id: selectionHeader
319+ visible: episodeList.ViewItems.selectMode
320+ // TRANSLATORS: This is the page title. Keep it short. Otherwise it will just be elided.
321+ title: i18n.tr("%1 item selected", "%1 items selected", episodeList.ViewItems.selectedIndices.length).arg(episodeList.ViewItems.selectedIndices.length)
322+
323+ onVisibleChanged: {
324+ if (visible) {
325+ episodesPage.header = selectionHeader
326+ }
327+ }
328+
329+ StyleHints {
330+ backgroundColor: podbird.appTheme.background
331+ }
332+
333+ leadingActionBar.actions: [
334+ Action {
335+ iconName: "back"
336+ text: i18n.tr("Back")
337+ onTriggered: {
338+ episodeList.closeSelection()
339+ }
340+ }
341+ ]
342+
343+ trailingActionBar {
344+ numberOfSlots: 6
345 actions: [
346 Action {
347- iconName: "search"
348- text: i18n.tr("Search Episode")
349- onTriggered: {
350- episodesPage.state = "search"
351- searchField.item.forceActiveFocus()
352- }
353- },
354-
355- Action {
356 iconName: "select"
357- text: i18n.tr("Mark all listened")
358- onTriggered: {
359- var db = Podcasts.init();
360- db.transaction(function (tx) {
361- tx.executeSql("UPDATE Episode SET listened=1 WHERE podcast=?", [episodeId]);
362- refreshModel();
363- });
364- }
365- },
366-
367- Action {
368- text: i18n.tr("Unsubscribe")
369+ text: i18n.tr("Mark Listened")
370+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
371+ visible: episodesPage.mode !== "listened"
372+ onTriggered: {
373+ var db = Podcasts.init();
374+ db.transaction(function (tx) {
375+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
376+ var index = episodeList.ViewItems.selectedIndices[i]
377+ tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodeModel.get(index).guid]);
378+ }
379+ });
380+
381+ refreshModel();
382+ episodeList.closeSelection()
383+ }
384+ },
385+
386+ Action {
387+ iconName: "save"
388+ text: i18n.tr("Download episode(s)")
389+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
390+ visible: episodesPage.mode !== "downloaded"
391+
392+ onTriggered: {
393+ var db = Podcasts.init();
394+ db.transaction(function (tx) {
395+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
396+ var index = episodeList.ViewItems.selectedIndices[i]
397+ if (!episodeModel.get(index).downloadedfile) {
398+ episodeModel.setProperty(index, "queued", 1)
399+ tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodeModel.get(index).guid]);
400+ if (episodeModel.get(index).audiourl) {
401+ podbird.downloadEpisode(episodeModel.get(index).image, episodeModel.get(index).name, episodeModel.get(index).guid, episodeModel.get(index).audiourl)
402+ } else {
403+ console.log("[ERROR]: Invalid download url: " + episodeModel.get(index).audiourl)
404+ }
405+ }
406+ }
407+ });
408+
409+ refreshModel();
410+ episodeList.closeSelection()
411+ }
412+ },
413+
414+ Action {
415 iconName: "delete"
416- onTriggered: {
417- PopupUtils.open(confirmDeleteDialog, episodesPage);
418+ text: i18n.tr("Delete episode(s)")
419+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
420+
421+ onTriggered: {
422+ var db = Podcasts.init();
423+ db.transaction(function (tx) {
424+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
425+ var index = episodeList.ViewItems.selectedIndices[i]
426+ if (episodeModel.get(index).downloadedfile) {
427+ fileManager.deleteFile(episodeModel.get(index).downloadedfile);
428+ tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodeModel.get(index).guid]);
429+ episodeModel.setProperty(index, "downloadedfile", "")
430+ }
431+ }
432+ });
433+
434+ refreshModel();
435+ episodeList.closeSelection()
436+ }
437+ },
438+
439+ Action {
440+ iconName: "like"
441+ text: i18n.tr("Favourite episode(s)")
442+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
443+
444+ onTriggered: {
445+ var db = Podcasts.init();
446+ db.transaction(function (tx) {
447+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
448+ var index = episodeList.ViewItems.selectedIndices[i]
449+ if (!episodeModel.get(index).favourited) {
450+ tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [episodeModel.get(index).guid])
451+ episodeModel.setProperty(index, "favourited", 1)
452+ }
453+ }
454+ });
455+
456+ refreshModel();
457+ episodeList.closeSelection()
458+ }
459+ },
460+
461+ Action {
462+ iconName: "add-to-playlist"
463+ text: i18n.tr("Add to queue")
464+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
465+
466+ onTriggered: {
467+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
468+ var index = episodeList.ViewItems.selectedIndices[i]
469+ if (episodeModel.get(index).audiourl) {
470+ var url = episodeModel.get(index).downloadedfile ? "file://" + episodeModel.get(index).downloadedfile : episodeModel.get(index).audiourl
471+ player.addEpisodeToQueue(episodeModel.get(index).guid, episodeModel.get(index).image, episodeModel.get(index).name, episodeModel.get(index).artist, url)
472+ }
473+ }
474+
475+ episodeList.closeSelection()
476 }
477 }
478-
479 ]
480- },
481-
482- PageHeadState {
483- name: "search"
484- head: episodesPage.head
485-
486- backAction: Action {
487- iconName: "back"
488- onTriggered: {
489- episodeList.forceActiveFocus()
490- episodesPage.state = "default"
491- episodeList.positionViewAtBeginning()
492- }
493- }
494-
495- contents: Loader {
496- id: searchField
497- sourceComponent: episodesPage.state === "search" ? searchFieldComponent : undefined
498- anchors.left: parent ? parent.left : undefined
499- anchors.right: parent ? parent.right : undefined
500- anchors.rightMargin: units.gu(2)
501- }
502 }
503- ]
504+ }
505
506 onVisibleChanged: {
507 if (!visible) {
508@@ -251,8 +373,8 @@
509 verticalCenterOffset: Qt.inputMethod.visible ? units.gu(4) : 0
510 }
511
512- sourceComponent: (episodesPage.state === "search" && sortedEpisodeModel.count === 0) ? emptyStateComponent
513- : undefined
514+ sourceComponent: (episodesPage.header === searchHeader && sortedEpisodeModel.count === 0) ? emptyStateComponent
515+ : undefined
516 }
517
518 Component {
519@@ -272,13 +394,16 @@
520 id: sortedEpisodeModel
521 model: episodeModel
522 filter.property: "name"
523- filter.pattern: episodesPage.state === "search" && searchField.status == Loader.Ready ? RegExp(searchField.item.text, "gi")
524- : RegExp("", "gi")
525+ filter.pattern: episodesPage.header === searchHeader && searchField.status == Loader.Ready ? RegExp(searchField.item.text, "gi")
526+ : RegExp("", "gi")
527 }
528
529 ListView {
530 id: episodeList
531
532+ signal clearSelection()
533+ signal closeSelection()
534+
535 Component.onCompleted: {
536 // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
537 // for Flickable.maximumFlickVelocity and Flickable.flickDeceleration
538@@ -287,7 +412,7 @@
539 flickDeceleration = flickDeceleration * scaleFactor;
540 }
541
542- anchors.fill: parent
543+ anchors { fill: parent; topMargin: episodesPage.header.height }
544 model: sortedEpisodeModel
545 clip: true
546
547@@ -297,8 +422,8 @@
548 id: coverArtContainer
549
550 width: episodesPage.width
551- visible: episodesPage.state !== "search" && sortedEpisodeModel.count !== 0
552- height: episodesPage.state !== "search" && sortedEpisodeModel.count !== 0 ? cover.height + units.gu(6) : 0
553+ visible: episodesPage.header !== searchHeader && sortedEpisodeModel.count !== 0
554+ height: episodesPage.header !== searchHeader && sortedEpisodeModel.count !== 0 ? cover.height + units.gu(6) : 0
555
556 Image {
557 id:cover
558@@ -548,11 +673,29 @@
559
560 onClicked: {
561 Haptics.play()
562- if (currentGuid !== model.guid) {
563- currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl;
564- player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl)
565+ if (selectMode) {
566+ selected = !selected
567+ } else {
568+ if (currentGuid !== model.guid) {
569+ currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl;
570+ player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl)
571+ }
572 }
573 }
574+
575+ onPressAndHold: {
576+ ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode
577+ }
578+ }
579+
580+ onClearSelection: {
581+ ViewItems.selectedIndices = []
582+ }
583+
584+ onCloseSelection: {
585+ clearSelection()
586+ ViewItems.selectMode = false
587+ episodesPage.header = standardHeader
588 }
589
590 PullToRefresh {
591
592=== modified file 'app/ui/EpisodesTab.qml'
593--- app/ui/EpisodesTab.qml 2016-03-28 22:41:59 +0000
594+++ app/ui/EpisodesTab.qml 2016-03-28 22:41:59 +0000
595@@ -124,6 +124,8 @@
596 PageHeader {
597 id: selectionHeader
598 visible: episodeList.ViewItems.selectMode
599+ // TRANSLATORS: This is the page title. Keep it short. Otherwise it will just be elided.
600+ title: i18n.tr("%1 item selected", "%1 items selected", episodeList.ViewItems.selectedIndices.length).arg(episodeList.ViewItems.selectedIndices.length)
601
602 onVisibleChanged: {
603 if (visible) {
604
605=== added file 'app/ui/FullPlayingView.qml'
606--- app/ui/FullPlayingView.qml 1970-01-01 00:00:00 +0000
607+++ app/ui/FullPlayingView.qml 2016-03-28 22:41:59 +0000
608@@ -0,0 +1,304 @@
609+/*
610+ * Copyright 2016 Podbird Team
611+ *
612+ * This file is part of Podbird.
613+ *
614+ * Podbird is free software; you can redistribute it and/or modify
615+ * it under the terms of the GNU General Public License as published by
616+ * the Free Software Foundation; version 3.
617+ *
618+ * Podbird is distributed in the hope that it will be useful,
619+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
620+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
621+ * GNU General Public License for more details.
622+ *
623+ * You should have received a copy of the GNU General Public License
624+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
625+ */
626+
627+import QtQuick 2.4
628+import QtMultimedia 5.6
629+import Ubuntu.Components 1.3
630+import "../podcasts.js" as Podcasts
631+import "../components"
632+
633+Item {
634+ id: nowPlayingItem
635+
636+ property bool isLandscapeMode: width > height
637+
638+ // Landscape rule
639+ states: [
640+ State {
641+ name: "landscape"
642+ when: nowPlayingItem.isLandscapeMode
643+
644+ PropertyChanges {
645+ target: blurredBackground
646+ width: nowPlayingItem.width/2.2
647+ height: nowPlayingItem.height
648+ }
649+
650+ AnchorChanges {
651+ target: blurredBackground
652+ anchors {
653+ top: nowPlayingItem.top
654+ left: parent.left
655+ right: undefined
656+ }
657+ }
658+
659+ AnchorChanges {
660+ target: dataContainer
661+ anchors {
662+ top: nowPlayingItem.top
663+ left: blurredBackground.right
664+ right: parent.right
665+ bottom: parent.bottom
666+ }
667+ }
668+ }
669+ ]
670+
671+ BlurredBackground {
672+ id: blurredBackground
673+
674+ anchors.left: parent.left
675+ anchors.top: nowPlayingItem.top
676+ anchors.right: parent.right
677+ height: title.lineCount === 1 ? nowPlayingItem.height/2.3 + units.gu(3)
678+ : nowPlayingItem.height/2.3
679+ art: currentImage
680+
681+ Image {
682+ width: Math.min(nowPlayingItem.width/2, nowPlayingItem.height/2)
683+ height: width
684+ sourceSize.height: width
685+ sourceSize.width: width
686+ source: currentImage
687+ asynchronous: true
688+ anchors.centerIn: parent
689+ }
690+ }
691+
692+ Item {
693+ id: dataContainer
694+
695+ anchors {
696+ top: blurredBackground.bottom
697+ left: parent.left
698+ right: parent.right
699+ bottom: parent.bottom
700+ margins: units.gu(2)
701+ bottomMargin: nowPlayingItem.isLandscapeMode ? units.gu(4) : units.gu(2)
702+ }
703+
704+ Label {
705+ id: title
706+ anchors.left: parent.left
707+ anchors.right: parent.right
708+ anchors.top: parent.top
709+ text: currentName
710+ elide: Text.ElideRight
711+ textSize: Label.Large
712+ maximumLineCount: 2
713+ wrapMode: Text.WordWrap
714+ color: podbird.appTheme.baseText
715+ }
716+
717+ Label {
718+ id: artist
719+ anchors.left: title.left
720+ anchors.right: title.right
721+ anchors.top: title.bottom
722+ anchors.topMargin: units.gu(1)
723+ text: currentArtist
724+ elide: Text.ElideRight
725+ textSize: Label.Small
726+ color: podbird.appTheme.baseSubText
727+ }
728+
729+ Slider {
730+ id: scrubber
731+
732+ anchors {
733+ left: parent.left
734+ right: parent.right
735+ bottom: controls.top
736+ bottomMargin: nowPlayingItem.isLandscapeMode && title.lineCount < 2 ? units.gu(4) : units.gu(2)
737+ }
738+
739+ live: true
740+ minimumValue: 0
741+ maximumValue: player.duration
742+ value: player.position
743+ height: units.gu(2)
744+
745+ onValueChanged: {
746+ if (pressed) {
747+ player.seek(value);
748+ }
749+ }
750+
751+ function formatValue(v) { return Podcasts.formatTime(v/1000); }
752+ StyleHints { foregroundColor: podbird.appTheme.focusText }
753+ }
754+
755+ Connections {
756+ target: player
757+ onPositionChanged: scrubber.value = player.position
758+ }
759+
760+ Label {
761+ id: startTime
762+ textSize: Label.Small
763+ anchors.left: scrubber.left
764+ anchors.top: scrubber.bottom
765+ color: podbird.appTheme.baseText
766+ text: Podcasts.formatTime(player.position / 1000)
767+ }
768+
769+ Label {
770+ id: endTime
771+ textSize: Label.Small
772+ anchors.right: scrubber.right
773+ anchors.top: scrubber.bottom
774+ color: podbird.appTheme.baseText
775+ text: Podcasts.formatTime(player.duration / 1000)
776+ }
777+
778+ Row {
779+ id: controls
780+
781+ anchors.bottom: parent.bottom
782+ anchors.horizontalCenter: parent.horizontalCenter
783+ spacing: units.gu(1)
784+
785+ AbstractButton {
786+ id: mediaBackwardButton
787+ width: units.gu(6)
788+ height: width
789+ anchors.verticalCenter: parent.verticalCenter
790+ enabled: player.playlist.canGoPrevious
791+ opacity: enabled ? 1.0 : 0.4
792+ onClicked: player.playlist.previous()
793+
794+ Icon {
795+ id: mediaBackwardIcon
796+ width: units.gu(3)
797+ height: width
798+ anchors.centerIn: parent
799+ color: podbird.appTheme.baseIcon
800+ name: "media-skip-backward"
801+ }
802+ }
803+
804+ AbstractButton {
805+ id: skipBackwardButton
806+ width: units.gu(6)
807+ height: width
808+ anchors.verticalCenter: parent.verticalCenter
809+ opacity: player.position === 0 ? 0.4 : 1.0
810+ onClicked: {
811+ if (player.position > 0) {
812+ player.seek(player.position - podbird.settings.skipBack * 1000);
813+ }
814+ }
815+
816+ Row {
817+ spacing: units.gu(1)
818+ anchors.centerIn: parent
819+
820+ Label {
821+ // TRANSLATORS: The string shown in the UI is -15s to denote the number of seconds that the podcast playback will skip backward.
822+ // xgettext: no-c-format
823+ text: i18n.tr("-%1s").arg(podbird.settings.skipBack)
824+ textSize: Label.XxSmall
825+ color: podbird.appTheme.baseText
826+ anchors.verticalCenter: skipBackwardIcon.verticalCenter
827+ }
828+
829+ Icon {
830+ id: skipBackwardIcon
831+ width: units.gu(3)
832+ height: width
833+ name: "media-seek-backward"
834+ color: podbird.appTheme.baseIcon
835+ }
836+ }
837+ }
838+
839+ AbstractButton {
840+ id: playButton
841+ width: units.gu(10)
842+ height: width
843+ opacity: playButton.pressed ? 0.4 : 1.0
844+ onClicked: player.playbackState === MediaPlayer.PlayingState ? player.pause() : player.play()
845+
846+ Icon {
847+ id: playIcon
848+ width: units.gu(6)
849+ height: width
850+ anchors.centerIn: parent
851+ color: podbird.appTheme.baseIcon
852+ name: player.playbackState === MediaPlayer.PlayingState ? "media-playback-pause"
853+ : "media-playback-start"
854+ }
855+ }
856+
857+ AbstractButton {
858+ id: skipForwardButton
859+ width: units.gu(6)
860+ height: width
861+ anchors.verticalCenter: parent.verticalCenter
862+ opacity: player.position === 0 ? 0.4 : 1.0
863+ onClicked: {
864+ if (player.position > 0) {
865+ player.seek(player.position + podbird.settings.skipForward * 1000);
866+ }
867+ }
868+
869+ Row {
870+ spacing: units.gu(1)
871+ anchors.centerIn: parent
872+
873+ Icon {
874+ id: skipForwardIcon
875+ width: units.gu(3)
876+ height: width
877+ name: "media-seek-forward"
878+ color: podbird.appTheme.baseIcon
879+ }
880+
881+ Label {
882+ // TRANSLATORS: The string shown in the UI is +15s to denote the number of seconds that the podcast playback will skip forward.
883+ // xgettext: no-c-format
884+ text: i18n.tr("+%1s").arg(podbird.settings.skipForward)
885+ textSize: Label.XxSmall
886+ color: podbird.appTheme.baseText
887+ anchors.verticalCenter: skipForwardIcon.verticalCenter
888+ }
889+ }
890+ }
891+
892+ AbstractButton {
893+ id: mediaForwardButton
894+ width: units.gu(6)
895+ height: width
896+ anchors.verticalCenter: parent.verticalCenter
897+ enabled: player.playlist.canGoNext
898+ opacity: enabled ? 1.0 : 0.4
899+ onClicked: player.playlist.next()
900+
901+ Icon {
902+ id: mediaForwardIcon
903+ width: units.gu(3)
904+ height: width
905+ anchors.centerIn: parent
906+ color: podbird.appTheme.baseIcon
907+ name: "media-skip-forward"
908+ }
909+ }
910+ }
911+ }
912+}
913
914=== modified file 'app/ui/NowPlayingPage.qml'
915--- app/ui/NowPlayingPage.qml 2016-03-28 22:41:59 +0000
916+++ app/ui/NowPlayingPage.qml 2016-03-28 22:41:59 +0000
917@@ -37,6 +37,18 @@
918 backgroundColor: podbird.appTheme.background
919 }
920
921+ leadingActionBar.actions: Action {
922+ iconName: "back"
923+ text: i18n.tr("Back")
924+ onTriggered: {
925+ if (nowPlayingPageSections.selectedIndex === 1 && currentViewLoader.item.ViewItems.dragMode) {
926+ currentViewLoader.item.ViewItems.dragMode = !currentViewLoader.item.ViewItems.dragMode
927+ } else {
928+ mainStack.pop()
929+ }
930+ }
931+ }
932+
933 trailingActionBar.actions: Action {
934 iconName: "delete"
935 visible: nowPlayingPageSections.selectedIndex === 1
936@@ -62,314 +74,9 @@
937 }
938 }
939
940- VisualItemModel {
941- id: tabs
942-
943- Item {
944- id: nowPlayingItem
945-
946- width: tabView.width
947- height: tabView.height
948-
949- property bool isLandscapeMode: nowPlayingPage.width > nowPlayingPage.height
950-
951- // Landscape rule
952- states: [
953- State {
954- name: "landscape"
955- when: nowPlayingItem.isLandscapeMode
956-
957- PropertyChanges {
958- target: blurredBackground
959- width: nowPlayingPage.width/2.2
960- height: nowPlayingPage.height
961- }
962-
963- AnchorChanges {
964- target: blurredBackground
965- anchors {
966- top: nowPlayingItem.top
967- left: parent.left
968- right: undefined
969- }
970- }
971-
972- AnchorChanges {
973- target: dataContainer
974- anchors {
975- top: nowPlayingItem.top
976- left: blurredBackground.right
977- right: parent.right
978- bottom: parent.bottom
979- }
980- }
981- }
982- ]
983-
984- BlurredBackground {
985- id: blurredBackground
986-
987- anchors.left: parent.left
988- anchors.top: nowPlayingItem.top
989- anchors.right: parent.right
990- height: title.lineCount === 1 ? nowPlayingPage.height/2.3 + units.gu(3)
991- : nowPlayingPage.height/2.3
992- art: currentImage
993-
994- Image {
995- width: Math.min(nowPlayingPage.width/2, nowPlayingPage.height/2)
996- height: width
997- sourceSize.height: width
998- sourceSize.width: width
999- source: currentImage
1000- asynchronous: true
1001- anchors.centerIn: parent
1002- }
1003- }
1004-
1005- Item {
1006- id: dataContainer
1007-
1008- anchors {
1009- top: blurredBackground.bottom
1010- left: parent.left
1011- right: parent.right
1012- bottom: parent.bottom
1013- margins: units.gu(2)
1014- bottomMargin: nowPlayingItem.isLandscapeMode ? units.gu(4) : units.gu(2)
1015- }
1016-
1017- Label {
1018- id: title
1019- anchors.left: parent.left
1020- anchors.right: parent.right
1021- anchors.top: parent.top
1022- text: currentName
1023- elide: Text.ElideRight
1024- textSize: Label.Large
1025- maximumLineCount: 2
1026- wrapMode: Text.WordWrap
1027- color: podbird.appTheme.baseText
1028- }
1029-
1030- Label {
1031- id: artist
1032- anchors.left: title.left
1033- anchors.right: title.right
1034- anchors.top: title.bottom
1035- anchors.topMargin: units.gu(1)
1036- text: currentArtist
1037- elide: Text.ElideRight
1038- textSize: Label.Small
1039- color: podbird.appTheme.baseSubText
1040- }
1041-
1042- Slider {
1043- id: scrubber
1044-
1045- anchors {
1046- left: parent.left
1047- right: parent.right
1048- bottom: controls.top
1049- bottomMargin: nowPlayingItem.isLandscapeMode && title.lineCount < 2 ? units.gu(4) : units.gu(2)
1050- }
1051-
1052- live: true
1053- minimumValue: 0
1054- maximumValue: player.duration
1055- value: player.position
1056- height: units.gu(2)
1057-
1058- onValueChanged: {
1059- if (pressed) {
1060- player.seek(value);
1061- }
1062- }
1063-
1064- function formatValue(v) { return Podcasts.formatTime(v/1000); }
1065- StyleHints { foregroundColor: podbird.appTheme.focusText }
1066- }
1067-
1068- Connections {
1069- target: player
1070- onPositionChanged: scrubber.value = player.position
1071- }
1072-
1073- Label {
1074- id: startTime
1075- textSize: Label.Small
1076- anchors.left: scrubber.left
1077- anchors.top: scrubber.bottom
1078- color: podbird.appTheme.baseText
1079- text: Podcasts.formatTime(player.position / 1000)
1080- }
1081-
1082- Label {
1083- id: endTime
1084- textSize: Label.Small
1085- anchors.right: scrubber.right
1086- anchors.top: scrubber.bottom
1087- color: podbird.appTheme.baseText
1088- text: Podcasts.formatTime(player.duration / 1000)
1089- }
1090-
1091- Row {
1092- id: controls
1093-
1094- anchors.bottom: parent.bottom
1095- anchors.horizontalCenter: parent.horizontalCenter
1096- spacing: units.gu(1)
1097-
1098- AbstractButton {
1099- id: mediaBackwardButton
1100- width: units.gu(6)
1101- height: width
1102- anchors.verticalCenter: parent.verticalCenter
1103- enabled: player.playlist.canGoPrevious
1104- opacity: enabled ? 1.0 : 0.4
1105- onClicked: player.playlist.previous()
1106-
1107- Icon {
1108- id: mediaBackwardIcon
1109- width: units.gu(3)
1110- height: width
1111- anchors.centerIn: parent
1112- color: podbird.appTheme.baseIcon
1113- name: "media-skip-backward"
1114- }
1115- }
1116-
1117- AbstractButton {
1118- id: skipBackwardButton
1119- width: units.gu(6)
1120- height: width
1121- anchors.verticalCenter: parent.verticalCenter
1122- opacity: player.position === 0 ? 0.4 : 1.0
1123- onClicked: {
1124- if (player.position > 0) {
1125- player.seek(player.position - podbird.settings.skipBack * 1000);
1126- }
1127- }
1128-
1129- Row {
1130- spacing: units.gu(1)
1131- anchors.centerIn: parent
1132-
1133- Label {
1134- // TRANSLATORS: The string shown in the UI is -15s to denote the number of seconds that the podcast playback will skip backward.
1135- // xgettext: no-c-format
1136- text: i18n.tr("-%1s").arg(podbird.settings.skipBack)
1137- textSize: Label.XxSmall
1138- color: podbird.appTheme.baseText
1139- anchors.verticalCenter: skipBackwardIcon.verticalCenter
1140- }
1141-
1142- Icon {
1143- id: skipBackwardIcon
1144- width: units.gu(3)
1145- height: width
1146- name: "media-seek-backward"
1147- color: podbird.appTheme.baseIcon
1148- }
1149- }
1150- }
1151-
1152- AbstractButton {
1153- id: playButton
1154- width: units.gu(10)
1155- height: width
1156- opacity: playButton.pressed ? 0.4 : 1.0
1157- onClicked: player.playbackState === MediaPlayer.PlayingState ? player.pause() : player.play()
1158-
1159- Icon {
1160- id: playIcon
1161- width: units.gu(6)
1162- height: width
1163- anchors.centerIn: parent
1164- color: podbird.appTheme.baseIcon
1165- name: player.playbackState === MediaPlayer.PlayingState ? "media-playback-pause"
1166- : "media-playback-start"
1167- }
1168- }
1169-
1170- AbstractButton {
1171- id: skipForwardButton
1172- width: units.gu(6)
1173- height: width
1174- anchors.verticalCenter: parent.verticalCenter
1175- opacity: player.position === 0 ? 0.4 : 1.0
1176- onClicked: {
1177- if (player.position > 0) {
1178- player.seek(player.position + podbird.settings.skipForward * 1000);
1179- }
1180- }
1181-
1182- Row {
1183- spacing: units.gu(1)
1184- anchors.centerIn: parent
1185-
1186- Icon {
1187- id: skipForwardIcon
1188- width: units.gu(3)
1189- height: width
1190- name: "media-seek-forward"
1191- color: podbird.appTheme.baseIcon
1192- }
1193-
1194- Label {
1195- // TRANSLATORS: The string shown in the UI is +15s to denote the number of seconds that the podcast playback will skip forward.
1196- // xgettext: no-c-format
1197- text: i18n.tr("+%1s").arg(podbird.settings.skipForward)
1198- textSize: Label.XxSmall
1199- color: podbird.appTheme.baseText
1200- anchors.verticalCenter: skipForwardIcon.verticalCenter
1201- }
1202- }
1203- }
1204-
1205- AbstractButton {
1206- id: mediaForwardButton
1207- width: units.gu(6)
1208- height: width
1209- anchors.verticalCenter: parent.verticalCenter
1210- enabled: player.playlist.canGoNext
1211- opacity: enabled ? 1.0 : 0.4
1212- onClicked: player.playlist.next()
1213-
1214- Icon {
1215- id: mediaForwardIcon
1216- width: units.gu(3)
1217- height: width
1218- anchors.centerIn: parent
1219- color: podbird.appTheme.baseIcon
1220- name: "media-skip-forward"
1221- }
1222- }
1223- }
1224- }
1225- }
1226-
1227- Queue {
1228- width: tabView.width
1229- height: tabView.height
1230- }
1231- }
1232-
1233- ListView {
1234- id: tabView
1235- model: tabs
1236- interactive: false
1237-
1238- anchors {
1239- top: nowPlayingPage.header.bottom
1240- left: parent.left
1241- right: parent.right
1242- bottom: parent.bottom
1243- }
1244-
1245- orientation: Qt.Horizontal
1246- snapMode: ListView.SnapOneItem
1247- currentIndex: nowPlayingPageSections.selectedIndex
1248- highlightMoveDuration: UbuntuAnimation.SlowDuration
1249+ Loader {
1250+ id: currentViewLoader
1251+ anchors { fill: parent; topMargin: nowPlayingPage.header.height }
1252+ source: nowPlayingPageSections.selectedIndex === 0 ? Qt.resolvedUrl("FullPlayingView.qml") : Qt.resolvedUrl("Queue.qml")
1253 }
1254 }
1255
1256=== modified file 'app/ui/PodcastsTab.qml'
1257--- app/ui/PodcastsTab.qml 2016-03-28 22:41:59 +0000
1258+++ app/ui/PodcastsTab.qml 2016-03-28 22:41:59 +0000
1259@@ -59,13 +59,6 @@
1260 podcastPage.header = searchHeader
1261 searchField.item.forceActiveFocus()
1262 }
1263- },
1264- Action {
1265- iconName: "add"
1266- text: i18n.tr("Add New Podcasts")
1267- onTriggered: {
1268- mainStack.push(Qt.resolvedUrl("SearchPage.qml"))
1269- }
1270 }
1271 ]
1272 }
1273
1274=== modified file 'app/ui/Queue.qml'
1275--- app/ui/Queue.qml 2016-03-28 22:41:59 +0000
1276+++ app/ui/Queue.qml 2016-03-28 22:41:59 +0000
1277@@ -19,70 +19,85 @@
1278 import QtQuick 2.4
1279 import Ubuntu.Components 1.3
1280 import "../podcasts.js" as Podcasts
1281-import "../components"
1282-
1283-Item {
1284- id: queuePage
1285-
1286- ListView {
1287- id: queueList
1288-
1289- anchors.fill: parent
1290- model: player.playlist
1291-
1292- delegate: ListItem {
1293- id: listItem
1294-
1295- height: layout.height
1296- divider.visible: false
1297-
1298- ListItemLayout {
1299- id: layout
1300-
1301- // Grab the metaData for the current index using its unique source url
1302- property var metaModel: player.metaForSource(model.source)
1303-
1304- Image {
1305- id: imgFrame
1306- width: units.gu(6)
1307- height: width
1308- source: Qt.resolvedUrl(layout.metaModel.image)
1309- sourceSize.height: width
1310- sourceSize.width: width
1311- SlotsLayout.position: SlotsLayout.First
1312- }
1313-
1314- title.text: layout.metaModel.name
1315- // #FIXME: Change this 2 to prevent title eliding when UITK is updated to rev > 1800
1316- title.maximumLineCount: 1
1317- title.color: player.playlist.currentIndex === index ? podbird.appTheme.focusText
1318- : podbird.appTheme.baseText
1319-
1320- subtitle.text: layout.metaModel.artist
1321- subtitle.color: podbird.appTheme.baseSubText
1322+
1323+ListView {
1324+ id: queueList
1325+
1326+ Component.onCompleted: {
1327+ // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
1328+ // for Flickable.maximumFlickVelocity and Flickable.flickDeceleration
1329+ var scaleFactor = units.gridUnit / 8;
1330+ maximumFlickVelocity = maximumFlickVelocity * scaleFactor;
1331+ flickDeceleration = flickDeceleration * scaleFactor;
1332+ }
1333+
1334+ model: player.playlist
1335+
1336+ delegate: ListItem {
1337+ id: listItem
1338+
1339+ height: layout.height
1340+ divider.visible: false
1341+
1342+ ListItemLayout {
1343+ id: layout
1344+
1345+ // Grab the metaData for the current index using its unique source url
1346+ property var metaModel: player.metaForSource(model.source)
1347+
1348+ Image {
1349+ id: imgFrame
1350+ width: units.gu(6)
1351+ height: width
1352+ source: Qt.resolvedUrl(layout.metaModel.image)
1353+ sourceSize.height: width
1354+ sourceSize.width: width
1355+ SlotsLayout.position: SlotsLayout.First
1356 }
1357
1358- leadingActions: ListItemActions {
1359- actions: [
1360- Action {
1361- iconName: "delete"
1362- onTriggered: {
1363- player.playlist.removeItem(index)
1364- var source = model.source
1365- source = source.toString()
1366- Podcasts.removeItemFromQueue(source)
1367- }
1368+ title.text: layout.metaModel.name
1369+ // #FIXME: Change this 2 to prevent title eliding when UITK is updated to rev > 1800
1370+ title.maximumLineCount: 1
1371+ title.color: player.playlist.currentIndex === index ? podbird.appTheme.focusText
1372+ : podbird.appTheme.baseText
1373+
1374+ subtitle.text: layout.metaModel.artist
1375+ subtitle.color: podbird.appTheme.baseSubText
1376+ }
1377+
1378+ leadingActions: ListItemActions {
1379+ actions: [
1380+ Action {
1381+ iconName: "delete"
1382+ onTriggered: {
1383+ player.playlist.removeItem(index)
1384+ var source = model.source
1385+ source = source.toString()
1386+ Podcasts.removeItemFromQueue(source)
1387 }
1388- ]
1389- }
1390-
1391- onClicked: {
1392- if (player.playlist.currentIndex === index) {
1393- player.toggle()
1394- } else {
1395- player.playlist.currentIndex = index
1396 }
1397+ ]
1398+ }
1399+
1400+ onClicked: {
1401+ if (player.playlist.currentIndex === index) {
1402+ player.toggle()
1403+ } else {
1404+ player.playlist.currentIndex = index
1405 }
1406 }
1407+
1408+ onPressAndHold: {
1409+ ListView.view.ViewItems.dragMode = !ListView.view.ViewItems.dragMode
1410+ }
1411+ }
1412+
1413+ ViewItems.onDragUpdated: {
1414+ // Only update the model when the listitem is dropped, not 'live'
1415+ if (event.status === ListItemDrag.Moving) {
1416+ event.accept = false
1417+ } else if (event.status === ListItemDrag.Dropped) {
1418+ player.playlist.moveItem(event.from, event.to)
1419+ }
1420 }
1421 }
1422
1423=== modified file 'app/ui/SearchPage.qml'
1424--- app/ui/SearchPage.qml 2016-03-28 22:41:59 +0000
1425+++ app/ui/SearchPage.qml 2016-03-28 22:41:59 +0000
1426@@ -28,6 +28,10 @@
1427
1428 property var xhr: new XMLHttpRequest;
1429
1430+ TabsList {
1431+ id: tabsList
1432+ }
1433+
1434 header: standardHeader
1435
1436 PageHeader {
1437@@ -40,6 +44,11 @@
1438 backgroundColor: podbird.appTheme.background
1439 }
1440
1441+ leadingActionBar {
1442+ numberOfSlots: 0
1443+ actions: tabsList.actions
1444+ }
1445+
1446 trailingActionBar.actions: [
1447 Action {
1448 iconName: "search"
1449@@ -284,7 +293,7 @@
1450 }
1451 });
1452 }
1453- mainStack.pop();
1454+ tabs.selectedTabIndex = 2;
1455 }
1456 }
1457 }
1458@@ -433,7 +442,7 @@
1459 Podcasts.subscribe(artist, name, feed, image);
1460 imageDownloader.feed = feed;
1461 imageDownloader.download(image);
1462- mainStack.pop();
1463+ tabs.selectedTabIndex = 2;
1464 } else {
1465 PopupUtils.open(subscribeFailedDialog);
1466 searchPage.header = addHeader
1467
1468=== added file 'app/welcomewizard/Slide5.qml'
1469--- app/welcomewizard/Slide5.qml 1970-01-01 00:00:00 +0000
1470+++ app/welcomewizard/Slide5.qml 2016-03-28 22:41:59 +0000
1471@@ -0,0 +1,68 @@
1472+/*
1473+ * Copyright 2016 Podbird Team
1474+ *
1475+ * This file is part of Podbird.
1476+ *
1477+ * Podbird is free software; you can redistribute it and/or modify
1478+ * it under the terms of the GNU General Public License as published by
1479+ * the Free Software Foundation; version 3.
1480+ *
1481+ * Podbird is distributed in the hope that it will be useful,
1482+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1483+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1484+ * GNU General Public License for more details.
1485+ *
1486+ * You should have received a copy of the GNU General Public License
1487+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1488+ */
1489+
1490+import QtQuick 2.4
1491+import Ubuntu.Components 1.3
1492+
1493+// Slide 5
1494+Component {
1495+ id: slide5
1496+ Item {
1497+ id: slide1Container
1498+
1499+ Image {
1500+ anchors {
1501+ top: parent.top
1502+ bottom: introductionText.top
1503+ bottomMargin: units.gu(6)
1504+ horizontalCenter: parent.horizontalCenter
1505+ }
1506+ fillMode: Image.PreserveAspectFit
1507+ source: Qt.resolvedUrl("../graphics/listitemactions.png")
1508+ }
1509+
1510+ Label {
1511+ id: introductionText
1512+ anchors.centerIn: parent
1513+ elide: Text.ElideRight
1514+ textSize: Label.XLarge
1515+ maximumLineCount: 2
1516+ text: i18n.tr("Touch Gestures")
1517+ horizontalAlignment: Text.AlignHCenter
1518+ width: parent.width
1519+ wrapMode: Text.WordWrap
1520+ }
1521+
1522+ Label {
1523+ id: finalMessage
1524+ anchors {
1525+ top: introductionText.bottom
1526+ bottom: parent.bottom
1527+ left: parent.left
1528+ right: parent.right
1529+ margins: units.gu(1)
1530+ topMargin: units.gu(4)
1531+ }
1532+ wrapMode: Text.WordWrap
1533+ horizontalAlignment: Text.AlignHCenter
1534+ linkColor: podbird.appTheme.linkText
1535+ text: i18n.tr("Episodes can be swiped left to reveal more actions. You can also multi-select them by long-pressing on an episode.")
1536+ onLinkActivated: Qt.openUrlExternally(link)
1537+ }
1538+ }
1539+}
1540
1541=== renamed file 'app/welcomewizard/Slide5.qml' => 'app/welcomewizard/Slide6.qml'
1542=== renamed file 'app/welcomewizard/Slide6.qml' => 'app/welcomewizard/Slide7.qml'
1543=== modified file 'app/welcomewizard/WelcomeWizard.qml'
1544--- app/welcomewizard/WelcomeWizard.qml 2016-02-19 20:10:06 +0000
1545+++ app/welcomewizard/WelcomeWizard.qml 2016-03-28 22:41:59 +0000
1546@@ -36,6 +36,7 @@
1547 Slide3{},
1548 Slide4{},
1549 Slide5{},
1550- Slide6{}
1551+ Slide6{},
1552+ Slide7{}
1553 ]
1554 }
1555
1556=== modified file 'po/com.mikeasoft.podbird.pot'
1557--- po/com.mikeasoft.podbird.pot 2016-03-28 22:41:59 +0000
1558+++ po/com.mikeasoft.podbird.pot 2016-03-28 22:41:59 +0000
1559@@ -8,7 +8,7 @@
1560 msgstr ""
1561 "Project-Id-Version: \n"
1562 "Report-Msgid-Bugs-To: \n"
1563-"POT-Creation-Date: 2016-03-19 19:13+0530\n"
1564+"POT-Creation-Date: 2016-03-19 19:22+0530\n"
1565 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1566 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1567 "Language-Team: LANGUAGE <LL@li.org>\n"
1568@@ -18,15 +18,19 @@
1569 "Content-Transfer-Encoding: 8bit\n"
1570 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
1571
1572-#: ../app/components/TabsList.qml:29 ../app/ui/EpisodesTab.qml:48
1573+#: ../app/components/TabsList.qml:27 ../app/ui/EpisodesTab.qml:48
1574 msgid "Episodes"
1575 msgstr ""
1576
1577-#: ../app/components/TabsList.qml:37 ../app/ui/PodcastsTab.qml:42
1578+#: ../app/components/TabsList.qml:35 ../app/ui/SearchPage.qml:41
1579+msgid "Add New Podcasts"
1580+msgstr ""
1581+
1582+#: ../app/components/TabsList.qml:43 ../app/ui/PodcastsTab.qml:42
1583 msgid "Podcasts"
1584 msgstr ""
1585
1586-#: ../app/components/TabsList.qml:45 ../app/ui/SettingsPage.qml:32
1587+#: ../app/components/TabsList.qml:51 ../app/ui/SettingsPage.qml:32
1588 msgid "Settings"
1589 msgstr ""
1590
1591@@ -74,30 +78,30 @@
1592 msgid "Source code available on %1"
1593 msgstr ""
1594
1595-#: ../app/settings/CleanSetting.qml:27
1596+#: ../app/settings/CleanSetting.qml:29
1597 msgid "Delete older than"
1598 msgstr ""
1599
1600-#: ../app/settings/CleanSetting.qml:33 ../app/settings/DownloadSetting.qml:33
1601+#: ../app/settings/CleanSetting.qml:40 ../app/settings/DownloadSetting.qml:40
1602 msgid "Never"
1603 msgstr ""
1604
1605-#: ../app/settings/CleanSetting.qml:34
1606+#: ../app/settings/CleanSetting.qml:41
1607 #, qt-format
1608 msgid "%1 day"
1609 msgid_plural "%1 days"
1610 msgstr[0] ""
1611 msgstr[1] ""
1612
1613-#: ../app/settings/CleanSetting.qml:35 ../app/settings/CleanSetting.qml:36
1614-#: ../app/settings/CleanSetting.qml:37
1615+#: ../app/settings/CleanSetting.qml:42 ../app/settings/CleanSetting.qml:43
1616+#: ../app/settings/CleanSetting.qml:44
1617 #, qt-format
1618 msgid "%1 month"
1619 msgid_plural "%1 months"
1620 msgstr[0] ""
1621 msgstr[1] ""
1622
1623-#: ../app/settings/CleanSetting.qml:38
1624+#: ../app/settings/CleanSetting.qml:45
1625 #, qt-format
1626 msgid "%1 year"
1627 msgid_plural "%1 years"
1628@@ -122,95 +126,124 @@
1629 msgid "Translators"
1630 msgstr ""
1631
1632-#: ../app/settings/DownloadSetting.qml:27
1633+#: ../app/settings/DownloadSetting.qml:29
1634 msgid "Download at most"
1635 msgstr ""
1636
1637-#: ../app/settings/DownloadSetting.qml:34
1638-#: ../app/settings/DownloadSetting.qml:35
1639-#: ../app/settings/DownloadSetting.qml:36
1640-#: ../app/settings/DownloadSetting.qml:37
1641+#: ../app/settings/DownloadSetting.qml:41
1642+#: ../app/settings/DownloadSetting.qml:42
1643+#: ../app/settings/DownloadSetting.qml:43
1644+#: ../app/settings/DownloadSetting.qml:44
1645 #, qt-format
1646 msgid "%1 episode"
1647 msgid_plural "%1 episodes"
1648 msgstr[0] ""
1649 msgstr[1] ""
1650
1651-#: ../app/settings/ThemeSetting.qml:27 ../app/ui/SettingsPage.qml:144
1652+#: ../app/settings/ThemeSetting.qml:29 ../app/ui/SettingsPage.qml:144
1653 msgid "Theme"
1654 msgstr ""
1655
1656 #. TRANSLATORS: Light Theme
1657-#: ../app/settings/ThemeSetting.qml:34 ../app/ui/SettingsPage.qml:145
1658+#: ../app/settings/ThemeSetting.qml:41 ../app/ui/SettingsPage.qml:145
1659 msgid "Light"
1660 msgstr ""
1661
1662 #. TRANSLATORS: Dark Theme
1663-#: ../app/settings/ThemeSetting.qml:36 ../app/ui/SettingsPage.qml:145
1664+#: ../app/settings/ThemeSetting.qml:43 ../app/ui/SettingsPage.qml:145
1665 msgid "Dark"
1666 msgstr ""
1667
1668-#: ../app/ui/EpisodesPage.qml:32
1669+#: ../app/ui/EpisodesPage.qml:52
1670 msgid "Podcast"
1671 msgstr ""
1672
1673-#: ../app/ui/EpisodesPage.qml:73 ../app/ui/EpisodesTab.qml:62
1674+#: ../app/ui/EpisodesPage.qml:62 ../app/ui/EpisodesTab.qml:62
1675 msgid "Search Episode"
1676 msgstr ""
1677
1678-#: ../app/ui/EpisodesPage.qml:82
1679-msgid "Mark all listened"
1680-msgstr ""
1681-
1682-#: ../app/ui/EpisodesPage.qml:93 ../app/ui/EpisodesPage.qml:184
1683-#: ../app/ui/SearchPage.qml:266
1684+#: ../app/ui/EpisodesPage.qml:70 ../app/ui/EpisodesPage.qml:306
1685+#: ../app/ui/SearchPage.qml:275
1686 msgid "Unsubscribe"
1687 msgstr ""
1688
1689-#: ../app/ui/EpisodesPage.qml:136 ../app/ui/EpisodesTab.qml:120
1690+#. TRANSLATORS: This is the page title. Keep it short. Otherwise it will just be elided.
1691+#: ../app/ui/EpisodesPage.qml:110 ../app/ui/EpisodesTab.qml:128
1692+#, qt-format
1693+msgid "%1 item selected"
1694+msgid_plural "%1 items selected"
1695+msgstr[0] ""
1696+msgstr[1] ""
1697+
1698+#: ../app/ui/EpisodesPage.qml:125 ../app/ui/EpisodesTab.qml:143
1699+#: ../app/ui/NowPlayingPage.qml:42
1700+msgid "Back"
1701+msgstr ""
1702+
1703+#: ../app/ui/EpisodesPage.qml:137 ../app/ui/EpisodesTab.qml:155
1704+msgid "Mark Listened"
1705+msgstr ""
1706+
1707+#: ../app/ui/EpisodesPage.qml:156 ../app/ui/EpisodesTab.qml:173
1708+msgid "Download episode(s)"
1709+msgstr ""
1710+
1711+#: ../app/ui/EpisodesPage.qml:184 ../app/ui/EpisodesTab.qml:201
1712+msgid "Delete episode(s)"
1713+msgstr ""
1714+
1715+#: ../app/ui/EpisodesPage.qml:207 ../app/ui/EpisodesTab.qml:224
1716+msgid "Favourite episode(s)"
1717+msgstr ""
1718+
1719+#: ../app/ui/EpisodesPage.qml:229 ../app/ui/EpisodesTab.qml:270
1720+msgid "Add to queue"
1721+msgstr ""
1722+
1723+#: ../app/ui/EpisodesPage.qml:258 ../app/ui/EpisodesTab.qml:120
1724 msgid "Search episode"
1725 msgstr ""
1726
1727-#: ../app/ui/EpisodesPage.qml:181
1728+#: ../app/ui/EpisodesPage.qml:303
1729 msgid "Unsubscribe Confirmation"
1730 msgstr ""
1731
1732-#: ../app/ui/EpisodesPage.qml:182
1733+#: ../app/ui/EpisodesPage.qml:304
1734 #, qt-format
1735 msgid "Are you sure you want to unsubscribe from <b>%1</b>?"
1736 msgstr ""
1737
1738-#: ../app/ui/EpisodesPage.qml:201 ../app/ui/SearchPage.qml:121
1739+#: ../app/ui/EpisodesPage.qml:323 ../app/ui/SearchPage.qml:130
1740 #: ../app/ui/SettingsPage.qml:83 ../app/ui/SettingsPage.qml:118
1741 msgid "Cancel"
1742 msgstr ""
1743
1744-#: ../app/ui/EpisodesPage.qml:223 ../app/ui/EpisodesTab.qml:405
1745+#: ../app/ui/EpisodesPage.qml:345 ../app/ui/EpisodesTab.qml:407
1746 msgid "Episode Description"
1747 msgstr ""
1748
1749-#: ../app/ui/EpisodesPage.qml:234 ../app/ui/EpisodesTab.qml:416
1750-#: ../app/ui/SearchPage.qml:170
1751+#: ../app/ui/EpisodesPage.qml:356 ../app/ui/EpisodesTab.qml:418
1752+#: ../app/ui/SearchPage.qml:179
1753 msgid "Close"
1754 msgstr ""
1755
1756-#: ../app/ui/EpisodesPage.qml:262
1757+#: ../app/ui/EpisodesPage.qml:384
1758 msgid "No episodes found"
1759 msgstr ""
1760
1761-#: ../app/ui/EpisodesPage.qml:263
1762+#: ../app/ui/EpisodesPage.qml:385
1763 msgid "No episodes found matching the search term."
1764 msgstr ""
1765
1766-#: ../app/ui/EpisodesPage.qml:377
1767+#: ../app/ui/EpisodesPage.qml:502
1768 msgid "Unheard"
1769 msgstr ""
1770
1771-#: ../app/ui/EpisodesPage.qml:394
1772+#: ../app/ui/EpisodesPage.qml:519
1773 msgid "Listened"
1774 msgstr ""
1775
1776-#: ../app/ui/EpisodesPage.qml:413
1777+#: ../app/ui/EpisodesPage.qml:538
1778 msgid "Downloaded"
1779 msgstr ""
1780
1781@@ -226,195 +259,167 @@
1782 msgid "Favourites"
1783 msgstr ""
1784
1785-#: ../app/ui/EpisodesTab.qml:141
1786-msgid "Back"
1787-msgstr ""
1788-
1789-#: ../app/ui/EpisodesTab.qml:153
1790-msgid "Mark Listened"
1791-msgstr ""
1792-
1793-#: ../app/ui/EpisodesTab.qml:171
1794-msgid "Download episode(s)"
1795-msgstr ""
1796-
1797-#: ../app/ui/EpisodesTab.qml:199
1798-msgid "Delete episode(s)"
1799-msgstr ""
1800-
1801-#: ../app/ui/EpisodesTab.qml:222
1802-msgid "Favourite episode(s)"
1803-msgstr ""
1804-
1805-#: ../app/ui/EpisodesTab.qml:245
1806+#: ../app/ui/EpisodesTab.qml:247
1807 msgid "Unfavourite episode(s)"
1808 msgstr ""
1809
1810-#: ../app/ui/EpisodesTab.qml:268
1811-msgid "Add to queue"
1812-msgstr ""
1813-
1814-#: ../app/ui/EpisodesTab.qml:308
1815+#: ../app/ui/EpisodesTab.qml:310
1816 msgid "No New Episodes"
1817 msgstr ""
1818
1819-#: ../app/ui/EpisodesTab.qml:310
1820+#: ../app/ui/EpisodesTab.qml:312
1821 msgid "No Downloaded Episodes"
1822 msgstr ""
1823
1824-#: ../app/ui/EpisodesTab.qml:312
1825+#: ../app/ui/EpisodesTab.qml:314
1826 msgid "No Favourited Episodes"
1827 msgstr ""
1828
1829-#: ../app/ui/EpisodesTab.qml:314
1830+#: ../app/ui/EpisodesTab.qml:316
1831 msgid "No Episodes Found"
1832 msgstr ""
1833
1834-#: ../app/ui/EpisodesTab.qml:320
1835+#: ../app/ui/EpisodesTab.qml:322
1836 msgid "No more episodes to listen to!"
1837 msgstr ""
1838
1839-#: ../app/ui/EpisodesTab.qml:322
1840+#: ../app/ui/EpisodesTab.qml:324
1841 msgid "No episodes have been downloaded for offline listening"
1842 msgstr ""
1843
1844-#: ../app/ui/EpisodesTab.qml:324
1845+#: ../app/ui/EpisodesTab.qml:326
1846 msgid "No episodes have been favourited."
1847 msgstr ""
1848
1849-#: ../app/ui/EpisodesTab.qml:326
1850+#: ../app/ui/EpisodesTab.qml:328
1851 msgid "No Episodes found matching the search term."
1852 msgstr ""
1853
1854-#: ../app/ui/EpisodesTab.qml:455
1855+#: ../app/ui/EpisodesTab.qml:457
1856 msgid "Downloads in progress"
1857 msgstr ""
1858
1859-#: ../app/ui/EpisodesTab.qml:495
1860+#: ../app/ui/EpisodesTab.qml:497
1861 msgid "Downloaded episodes"
1862 msgstr ""
1863
1864-#: ../app/ui/EpisodesTab.qml:505
1865+#: ../app/ui/EpisodesTab.qml:507
1866 msgid "Today"
1867 msgstr ""
1868
1869-#: ../app/ui/EpisodesTab.qml:509
1870+#: ../app/ui/EpisodesTab.qml:511
1871 msgid "Yesterday"
1872 msgstr ""
1873
1874-#: ../app/ui/EpisodesTab.qml:513
1875+#: ../app/ui/EpisodesTab.qml:515
1876 msgid "Older"
1877 msgstr ""
1878
1879+#. TRANSLATORS: The string shown in the UI is -15s to denote the number of seconds that the podcast playback will skip backward.
1880+#: ../app/ui/FullPlayingView.qml:215
1881+#, no-c-format, qt-format
1882+msgid "-%1s"
1883+msgstr ""
1884+
1885+#. TRANSLATORS: The string shown in the UI is +15s to denote the number of seconds that the podcast playback will skip forward.
1886+#: ../app/ui/FullPlayingView.qml:276
1887+#, no-c-format, qt-format
1888+msgid "+%1s"
1889+msgstr ""
1890+
1891 #: ../app/ui/NowPlayingPage.qml:34
1892 msgid "Now Playing"
1893 msgstr ""
1894
1895-#: ../app/ui/NowPlayingPage.qml:61
1896+#: ../app/ui/NowPlayingPage.qml:73
1897 msgid "Full view"
1898 msgstr ""
1899
1900-#: ../app/ui/NowPlayingPage.qml:61
1901+#: ../app/ui/NowPlayingPage.qml:73
1902 msgid "Queue"
1903 msgstr ""
1904
1905-#. TRANSLATORS: The string shown in the UI is -15s to denote the number of seconds that the podcast playback will skip backward.
1906-#: ../app/ui/NowPlayingPage.qml:261
1907-#, no-c-format, qt-format
1908-msgid "-%1s"
1909-msgstr ""
1910-
1911-#. TRANSLATORS: The string shown in the UI is +15s to denote the number of seconds that the podcast playback will skip forward.
1912-#: ../app/ui/NowPlayingPage.qml:322
1913-#, no-c-format, qt-format
1914-msgid "+%1s"
1915-msgstr ""
1916-
1917-#: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:46
1918-#: ../app/ui/SearchPage.qml:152
1919+#: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:55
1920+#: ../app/ui/SearchPage.qml:161
1921 msgid "Search Podcast"
1922 msgstr ""
1923
1924-#: ../app/ui/PodcastsTab.qml:65 ../app/ui/SearchPage.qml:37
1925-msgid "Add New Podcasts"
1926-msgstr ""
1927-
1928-#: ../app/ui/PodcastsTab.qml:104
1929+#: ../app/ui/PodcastsTab.qml:97
1930 msgid "Search podcast"
1931 msgstr ""
1932
1933-#: ../app/ui/PodcastsTab.qml:134
1934+#: ../app/ui/PodcastsTab.qml:127
1935 msgid "No Podcast Subscriptions"
1936 msgstr ""
1937
1938-#: ../app/ui/PodcastsTab.qml:134
1939+#: ../app/ui/PodcastsTab.qml:127
1940 msgid "No Podcasts Found"
1941 msgstr ""
1942
1943-#: ../app/ui/PodcastsTab.qml:135
1944+#: ../app/ui/PodcastsTab.qml:128
1945 msgid ""
1946 "You haven't subscribed to any podcasts yet, visit the 'Find New Podcasts' "
1947 "page to add some."
1948 msgstr ""
1949
1950-#: ../app/ui/PodcastsTab.qml:136 ../app/ui/SearchPage.qml:200
1951+#: ../app/ui/PodcastsTab.qml:129 ../app/ui/SearchPage.qml:209
1952 msgid "No podcasts found matching the search term."
1953 msgstr ""
1954
1955-#: ../app/ui/PodcastsTab.qml:222
1956+#: ../app/ui/PodcastsTab.qml:215
1957 #, qt-format
1958 msgid "%1 unheard episode"
1959 msgid_plural "%1 unheard episodes"
1960 msgstr[0] ""
1961 msgstr[1] ""
1962
1963-#: ../app/ui/SearchPage.qml:54
1964+#: ../app/ui/SearchPage.qml:63
1965 msgid "Add Podcast"
1966 msgstr ""
1967
1968-#: ../app/ui/SearchPage.qml:113
1969+#: ../app/ui/SearchPage.qml:122
1970 msgid "Save Podcast"
1971 msgstr ""
1972
1973-#: ../app/ui/SearchPage.qml:140
1974+#: ../app/ui/SearchPage.qml:149
1975 msgid "Feed URL"
1976 msgstr ""
1977
1978-#: ../app/ui/SearchPage.qml:167
1979+#: ../app/ui/SearchPage.qml:176
1980 msgid "Unable to subscribe"
1981 msgstr ""
1982
1983-#: ../app/ui/SearchPage.qml:168
1984+#: ../app/ui/SearchPage.qml:177
1985 msgid "Please check the URL and try again"
1986 msgstr ""
1987
1988-#: ../app/ui/SearchPage.qml:198
1989+#: ../app/ui/SearchPage.qml:207
1990 msgid "Looking to add a new Podcast?"
1991 msgstr ""
1992
1993-#: ../app/ui/SearchPage.qml:198
1994+#: ../app/ui/SearchPage.qml:207
1995 msgid "No Podcasts found"
1996 msgstr ""
1997
1998-#: ../app/ui/SearchPage.qml:199
1999+#: ../app/ui/SearchPage.qml:208
2000 msgid ""
2001 "Click the 'magnifier' at the top to search or the 'plus' button to add by URL"
2002 msgstr ""
2003
2004-#: ../app/ui/SearchPage.qml:266
2005+#: ../app/ui/SearchPage.qml:275
2006 msgid "Subscribe"
2007 msgstr ""
2008
2009 #. TRANSLATORS: The first argument here is the date of when the podcast was last updated followed by
2010 #. the podcast description.
2011-#: ../app/ui/SearchPage.qml:305
2012+#: ../app/ui/SearchPage.qml:314
2013 #, qt-format
2014 msgid ""
2015 "Last Updated: %1\n"
2016 "%2"
2017 msgstr ""
2018
2019-#: ../app/ui/SearchPage.qml:362
2020+#: ../app/ui/SearchPage.qml:371
2021 msgid "Not Available"
2022 msgstr ""
2023
2024@@ -536,33 +541,43 @@
2025 msgstr ""
2026
2027 #: ../app/welcomewizard/Slide5.qml:45
2028+msgid "Touch Gestures"
2029+msgstr ""
2030+
2031+#: ../app/welcomewizard/Slide5.qml:64
2032+msgid ""
2033+"Episodes can be swiped left to reveal more actions. You can also multi-"
2034+"select them by long-pressing on an episode."
2035+msgstr ""
2036+
2037+#: ../app/welcomewizard/Slide6.qml:45
2038 msgid "Support"
2039 msgstr ""
2040
2041 #. TRANSLATORS: The %1 points to a url defined in html format <a href=\link\>Link</a>.
2042-#: ../app/welcomewizard/Slide5.qml:65
2043+#: ../app/welcomewizard/Slide6.qml:65
2044 #, qt-format
2045 msgid ""
2046 "If you find any bugs or have any feature requests, let us know on our "
2047 "project page at %1"
2048 msgstr ""
2049
2050-#: ../app/welcomewizard/Slide6.qml:45
2051+#: ../app/welcomewizard/Slide7.qml:45
2052 msgid "Enjoy"
2053 msgstr ""
2054
2055-#: ../app/welcomewizard/Slide6.qml:62
2056+#: ../app/welcomewizard/Slide7.qml:62
2057 msgid "We hope you enjoy using Podbird!"
2058 msgstr ""
2059
2060-#: ../app/welcomewizard/Slide6.qml:76
2061+#: ../app/welcomewizard/Slide7.qml:76
2062 msgid "Finish"
2063 msgstr ""
2064
2065-#: /home/krnekhelesh/Development/devel-branch-sync-2-build/po/Podbird.desktop.in.h:1
2066+#: /home/krnekhelesh/Development/devel-branch-sync-3-build/po/Podbird.desktop.in.h:1
2067 msgid "The chirpiest podcast manager for Ubuntu"
2068 msgstr ""
2069
2070-#: /home/krnekhelesh/Development/devel-branch-sync-2-build/po/Podbird.desktop.in.h:2
2071+#: /home/krnekhelesh/Development/devel-branch-sync-3-build/po/Podbird.desktop.in.h:2
2072 msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;"
2073 msgstr ""

Subscribers

People subscribed via source and target branches