Merge lp:~nik90/podbird/new-navigation-structure into lp:podbird/devel

Proposed by Nekhelesh Ramananthan
Status: Merged
Merged at revision: 119
Proposed branch: lp:~nik90/podbird/new-navigation-structure
Merge into: lp:podbird/devel
Diff against target: 1075 lines (+304/-250)
8 files modified
app/components/TabsList.qml (+2/-10)
app/podbird.qml (+4/-17)
app/ui/EpisodesPage.qml (+7/-10)
app/ui/EpisodesTab.qml (+165/-85)
app/ui/PodcastsTab.qml (+5/-13)
app/ui/SearchPage.qml (+4/-14)
app/ui/SettingsPage.qml (+14/-0)
po/podbird.nik90.pot (+103/-101)
To merge this branch: bzr merge lp:~nik90/podbird/new-navigation-structure
Reviewer Review Type Date Requested Status
Podbird Developers Pending
Review via email: mp+288203@code.launchpad.net

Commit message

- Added new navigation structure which involves combining the SearchTab and PodcastsTab
- Moved WhatsNewTab into a bigger tab called EpisodesTab which also shows Downloaded episodes (globally)
- Added back button in search mode
- Moved podcast grid/list view option into the settings page

Description of the change

- Added new navigation structure which involves combining the SearchTab and PodcastsTab
- Moved WhatsNewTab into a bigger tab called EpisodesTab which also shows Downloaded episodes (globally)
- Added back button in search mode
- Moved podcast grid/list view option into the settings page

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'app/components/TabsList.qml'
--- app/components/TabsList.qml 2016-03-04 10:40:54 +0000
+++ app/components/TabsList.qml 2016-03-05 16:56:57 +0000
@@ -26,7 +26,7 @@
2626
27 children: [27 children: [
28 Action {28 Action {
29 text: i18n.tr("What's New")29 text: i18n.tr("Episodes")
30 visible: currentTab !== 030 visible: currentTab !== 0
31 onTriggered: {31 onTriggered: {
32 tabs.selectedTabIndex = 032 tabs.selectedTabIndex = 0
@@ -42,19 +42,11 @@
42 },42 },
4343
44 Action {44 Action {
45 text: i18n.tr("Add New Podcasts")45 text: i18n.tr("Settings")
46 visible: currentTab !== 246 visible: currentTab !== 2
47 onTriggered: {47 onTriggered: {
48 tabs.selectedTabIndex = 248 tabs.selectedTabIndex = 2
49 }49 }
50 },
51
52 Action {
53 text: i18n.tr("Settings")
54 visible: currentTab !== 3
55 onTriggered: {
56 tabs.selectedTabIndex = 3
57 }
58 }50 }
59 ]51 ]
60}52}
6153
=== modified file 'app/podbird.qml'
--- app/podbird.qml 2016-03-04 10:40:54 +0000
+++ app/podbird.qml 2016-03-05 16:56:57 +0000
@@ -56,7 +56,7 @@
56 // visible on application start.56 // visible on application start.
57 function refreshModels() {57 function refreshModels() {
58 if (tabs.selectedTabIndex === 0) {58 if (tabs.selectedTabIndex === 0) {
59 whatsNewTab.refreshModel()59 episodesTab.refreshModel()
60 } else if (tabs.selectedTabIndex === 1) {60 } else if (tabs.selectedTabIndex === 1) {
61 podcastPage.item.refreshModel()61 podcastPage.item.refreshModel()
62 }62 }
@@ -246,9 +246,9 @@
246 }246 }
247 }247 }
248248
249 WhatsNewTab {249 EpisodesTab {
250 id: whatsNewTab250 id: episodesTab
251 objectName: "whatsNewTab"251 objectName: "episodesTab"
252 }252 }
253253
254 Tab {254 Tab {
@@ -264,19 +264,6 @@
264 }264 }
265265
266 Tab {266 Tab {
267 id: searchTab
268
269 // Dynamically load/unload the search tab as required
270 page: Loader {
271 parent: searchTab
272 anchors.left: parent.left
273 anchors.right: parent.right
274 anchors.bottom: parent.bottom
275 source: (tabs.selectedTab === searchTab) ? Qt.resolvedUrl("ui/SearchPage.qml") : ""
276 }
277 }
278
279 Tab {
280 id: settingsTab267 id: settingsTab
281268
282 // Dynamically load/unload the settings tab as required269 // Dynamically load/unload the settings tab as required
283270
=== modified file 'app/ui/EpisodesPage.qml'
--- app/ui/EpisodesPage.qml 2016-03-04 10:40:54 +0000
+++ app/ui/EpisodesPage.qml 2016-03-05 16:56:57 +0000
@@ -105,17 +105,14 @@
105 name: "search"105 name: "search"
106 head: episodesPage.head106 head: episodesPage.head
107107
108 actions: [108 backAction: Action {
109 Action {109 iconName: "back"
110 iconName: "edit-clear"110 onTriggered: {
111 text: i18n.tr("Cancel")111 episodeList.forceActiveFocus()
112 onTriggered: {112 episodesPage.state = "default"
113 episodeList.forceActiveFocus()113 episodeList.positionViewAtBeginning()
114 episodesPage.state = "default"
115 episodeList.positionViewAtBeginning()
116 }
117 }114 }
118 ]115 }
119116
120 contents: Loader {117 contents: Loader {
121 id: searchField118 id: searchField
122119
=== renamed file 'app/ui/WhatsNewTab.qml' => 'app/ui/EpisodesTab.qml'
--- app/ui/WhatsNewTab.qml 2016-03-04 10:40:54 +0000
+++ app/ui/EpisodesTab.qml 2016-03-05 16:56:57 +0000
@@ -26,7 +26,7 @@
26import "../components"26import "../components"
2727
28Tab {28Tab {
29 id: whatsNewTab29 id: episodesTab
3030
31 property var today: new Date()31 property var today: new Date()
32 property int dayToMs: 8640000032 property int dayToMs: 86400000
@@ -38,14 +38,14 @@
38 }38 }
3939
40 page: Page {40 page: Page {
41 id: whatsNewPage41 id: episodesPage
4242
43 header: standardHeader43 header: standardHeader
4444
45 PageHeader {45 PageHeader {
46 id: standardHeader46 id: standardHeader
47 visible: whatsNewPage.header === standardHeader47 visible: episodesPage.header === standardHeader
48 title: i18n.tr("What's New")48 title: i18n.tr("Episodes")
4949
50 StyleHints {50 StyleHints {
51 backgroundColor: podbird.appTheme.background51 backgroundColor: podbird.appTheme.background
@@ -61,47 +61,87 @@
61 iconName: "search"61 iconName: "search"
62 text: i18n.tr("Search Episode")62 text: i18n.tr("Search Episode")
63 onTriggered: {63 onTriggered: {
64 whatsNewPage.header = searchHeader64 episodesPage.header = searchHeader
65 searchField.item.forceActiveFocus()65 searchField.item.forceActiveFocus()
66 }66 }
67 },67 },
6868
69 Action {69 Action {
70 iconName: "select"70 iconName: "select"
71 visible: episodesPageHeaderSections.selectedIndex === 0
71 text: i18n.tr("Mark all listened")72 text: i18n.tr("Mark all listened")
72 onTriggered: {73 onTriggered: {
73 var db = Podcasts.init();74 var db = Podcasts.init();
74 db.transaction(function (tx) {75 db.transaction(function (tx) {
75 for (var i=0; i<whatsNewModel.count; i++) {76 for (var i=0; i<episodesModel.count; i++) {
76 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [whatsNewModel.get(i).guid]);77 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodesModel.get(i).guid]);
77 }78 }
78 whatsNewModel.clear()79 episodesModel.clear()
79 });80 });
80 }81 }
81 },82 },
8283
83 Action {84 Action {
84 iconName: "save"85 iconName: "save"
86 visible: episodesPageHeaderSections.selectedIndex === 0
85 text: i18n.tr("Download all")87 text: i18n.tr("Download all")
86 onTriggered: {88 onTriggered: {
87 var db = Podcasts.init();89 var db = Podcasts.init();
88 db.transaction(function (tx) {90 db.transaction(function (tx) {
89 for (var i=0; i<whatsNewModel.count; i++) {91 for (var i=0; i<episodesModel.count; i++) {
90 if (!whatsNewModel.get(i).downloadedfile) {92 if (!episodesModel.get(i).downloadedfile) {
91 whatsNewModel.setProperty(i, "queued", 1)93 episodesModel.setProperty(i, "queued", 1)
92 tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [whatsNewModel.get(i).guid]);94 tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodesModel.get(i).guid]);
93 downloader.addDownload(whatsNewModel.get(i).guid, whatsNewModel.get(i).audiourl);95 downloader.addDownload(episodesModel.get(i).guid, episodesModel.get(i).audiourl);
94 }96 }
95 }97 }
96 });98 });
99 }
100 },
101
102 Action {
103 iconName: "delete"
104 text: i18n.tr("Delete all")
105 visible: episodesPageHeaderSections.selectedIndex === 1
106 onTriggered: {
107 var db = Podcasts.init();
108 db.transaction(function (tx) {
109 for (var i=0; i<episodesModel.count; i++) {
110 if (episodesModel.get(i).downloadedfile) {
111 fileManager.deleteFile(episodesModel.get(i).downloadedfile);
112 tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(i).guid]);
113 episodesModel.setProperty(i, "downloadedfile", "")
114 }
115 }
116 });
117 refreshModel();
97 }118 }
98 }119 }
99 ]120 ]
121
122 extension: Sections {
123 id: episodesPageHeaderSections
124
125 anchors {
126 left: parent.left
127 leftMargin: units.gu(2)
128 bottom: parent.bottom
129 }
130
131 StyleHints {
132 selectedSectionColor: podbird.appTheme.focusText
133 }
134
135 model: [i18n.tr("What's New"), i18n.tr("Downloaded")]
136 onSelectedIndexChanged: {
137 refreshModel();
138 }
139 }
100 }140 }
101141
102 PageHeader {142 PageHeader {
103 id: searchHeader143 id: searchHeader
104 visible: whatsNewPage.header === searchHeader144 visible: episodesPage.header === searchHeader
105145
106 StyleHints {146 StyleHints {
107 backgroundColor: podbird.appTheme.background147 backgroundColor: podbird.appTheme.background
@@ -109,19 +149,18 @@
109149
110 contents: Loader {150 contents: Loader {
111 id: searchField151 id: searchField
112 sourceComponent: whatsNewPage.header === searchHeader ? searchFieldComponent : undefined152 sourceComponent: episodesPage.header === searchHeader ? searchFieldComponent : undefined
113 anchors.left: parent ? parent.left : undefined153 anchors.left: parent ? parent.left : undefined
114 anchors.right: parent ? parent.right : undefined154 anchors.right: parent ? parent.right : undefined
115 anchors.verticalCenter: parent ? parent.verticalCenter : undefined155 anchors.verticalCenter: parent ? parent.verticalCenter : undefined
116 }156 }
117157
118 trailingActionBar.actions: [158 leadingActionBar.actions: [
119 Action {159 Action {
120 iconName: "edit-clear"160 iconName: "back"
121 text: i18n.tr("Cancel")
122 onTriggered: {161 onTriggered: {
123 episodeList.forceActiveFocus()162 episodeList.forceActiveFocus()
124 whatsNewPage.header = standardHeader163 episodesPage.header = standardHeader
125 }164 }
126 }165 }
127 ]166 ]
@@ -146,28 +185,28 @@
146 verticalCenterOffset: Qt.inputMethod.visible ? units.gu(4) : 0185 verticalCenterOffset: Qt.inputMethod.visible ? units.gu(4) : 0
147 }186 }
148187
149 sourceComponent: whatsNewModel.count === 0 || sortedEpisodeModel.count === 0 ? emptyStateComponent : undefined188 sourceComponent: episodesModel.count === 0 || sortedEpisodeModel.count === 0 ? emptyStateComponent : undefined
150 }189 }
151190
152 Component {191 Component {
153 id: emptyStateComponent192 id: emptyStateComponent
154 EmptyState {193 EmptyState {
155 icon.source: whatsNewModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg")194 icon.source: episodesModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg")
156 title: whatsNewModel.count === 0 ? i18n.tr("No New Episodes") : i18n.tr("No Episodes Found")195 title: episodesModel.count === 0 ? i18n.tr("No New Episodes") : i18n.tr("No Episodes Found")
157 subTitle: whatsNewModel.count === 0 ? i18n.tr("No more episodes to listen to!") : i18n.tr("No Episodes found matching the search term.")196 subTitle: episodesModel.count === 0 ? i18n.tr("No more episodes to listen to!") : i18n.tr("No Episodes found matching the search term.")
158 }197 }
159 }198 }
160199
161 ListModel {200 ListModel {
162 id: whatsNewModel201 id: episodesModel
163 }202 }
164203
165 SortFilterModel {204 SortFilterModel {
166 id: sortedEpisodeModel205 id: sortedEpisodeModel
167 model: whatsNewModel206 model: episodesModel
168 filter.property: "name"207 filter.property: "name"
169 filter.pattern: whatsNewPage.state === "search" && searchField.status == Loader.Ready ? RegExp(searchField.item.text, "gi")208 filter.pattern: episodesPage.header === searchHeader && searchField.status == Loader.Ready ? RegExp(searchField.item.text, "gi")
170 : RegExp("", "gi")209 : RegExp("", "gi")
171 }210 }
172211
173 onVisibleChanged: {212 onVisibleChanged: {
@@ -176,7 +215,7 @@
176 if (downloader.downloadingGuid != "")215 if (downloader.downloadingGuid != "")
177 tempGuid = downloader.downloadingGuid216 tempGuid = downloader.downloadingGuid
178 } else {217 } else {
179 whatsNewPage.header = standardHeader218 episodesPage.header = standardHeader
180 }219 }
181 }220 }
182221
@@ -187,16 +226,16 @@
187 db.transaction(function (tx) {226 db.transaction(function (tx) {
188 /*227 /*
189 If tempGuid is NULL, then the episode currently being downloaded is not found within228 If tempGuid is NULL, then the episode currently being downloaded is not found within
190 this podcast. On the other hand, if it is within this podcast, then update the whatsNewModel229 this podcast. On the other hand, if it is within this podcast, then update the episodesModel
191 with the downloadedfile location we just received from the downloader.230 with the downloadedfile location we just received from the downloader.
192 */231 */
193 if (tempGuid != "NULL") {232 if (tempGuid != "NULL") {
194 var rs2 = tx.executeSql("SELECT downloadedfile FROM Episode WHERE guid=?", [tempGuid]);233 var rs2 = tx.executeSql("SELECT downloadedfile FROM Episode WHERE guid=?", [tempGuid]);
195 for (var i=0; i<whatsNewModel.count; i++) {234 for (var i=0; i<episodesModel.count; i++) {
196 if (whatsNewModel.get(i).guid == tempGuid) {235 if (episodesModel.get(i).guid == tempGuid) {
197 console.log("[LOG]: Setting episode download URL to " + rs2.rows.item(0).downloadedfile)236 console.log("[LOG]: Setting episode download URL to " + rs2.rows.item(0).downloadedfile)
198 whatsNewModel.setProperty(i, "downloadedfile", rs2.rows.item(0).downloadedfile)237 episodesModel.setProperty(i, "downloadedfile", rs2.rows.item(0).downloadedfile)
199 whatsNewModel.setProperty(i, "queued", 0)238 episodesModel.setProperty(i, "queued", 0)
200 break239 break
201 }240 }
202 }241 }
@@ -252,7 +291,7 @@
252 }291 }
253 }292 }
254293
255 UbuntuListView {294 ListView {
256 id: episodeList295 id: episodeList
257296
258 Component.onCompleted: {297 Component.onCompleted: {
@@ -264,23 +303,21 @@
264 }303 }
265304
266 anchors {305 anchors {
267 top: whatsNewPage.header.bottom306 top: episodesPage.header.bottom
268 left: parent.left307 left: parent.left
269 right: parent.right308 right: parent.right
270 bottom: parent.bottom309 bottom: parent.bottom
271 }310 }
272311
273 clip: true312 clip: true
274
275 model: sortedEpisodeModel313 model: sortedEpisodeModel
276 currentIndex: -1
277 section.property: "diff"314 section.property: "diff"
278 section.labelPositioning: ViewSection.InlineLabels315 section.labelPositioning: ViewSection.InlineLabels
279316
280 section.delegate: Rectangle {317 section.delegate: Rectangle {
281 width: parent.width318 width: parent.width
282 color: "Transparent"319 color: "Transparent"
283 height: header.implicitHeight + units.gu(2)320 height: header.text !== "" ? header.implicitHeight + units.gu(2) : units.gu(0)
284 Label {321 Label {
285 id: header322 id: header
286 anchors {323 anchors {
@@ -299,8 +336,13 @@
299 return i18n.tr("Yesterday")336 return i18n.tr("Yesterday")
300 }337 }
301338
302 else if (section === "Older")339 else if (section === "Older") {
303 return i18n.tr("Older")340 return i18n.tr("Older")
341 }
342
343 else {
344 return ""
345 }
304 }346 }
305 }347 }
306 }348 }
@@ -372,24 +414,36 @@
372 db.transaction(function (tx) {414 db.transaction(function (tx) {
373 tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [model.guid]);415 tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [model.guid]);
374 });416 });
375 whatsNewModel.setProperty(model.index, "downloadedfile", "")417 episodesModel.setProperty(model.index, "downloadedfile", "")
418 if (episodesPageHeaderSections.selectedIndex === 1) {
419 episodesModel.remove(model.index, 1)
420 }
376 } else {421 } else {
377 db.transaction(function (tx) {422 db.transaction(function (tx) {
378 tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [model.guid]);423 tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [model.guid]);
379 });424 });
380 whatsNewModel.setProperty(model.index, "queued", 1)425 episodesModel.setProperty(model.index, "queued", 1)
381 downloader.addDownload(model.guid, model.audiourl);426 downloader.addDownload(model.guid, model.audiourl);
382 }427 }
383 }428 }
384 },429 },
385430
386 Action {431 Action {
387 iconName: "select"432 iconName: model.listened ? "view-collapse" : "select"
388 onTriggered: {433 onTriggered: {
389 var db = Podcasts.init();434 var db = Podcasts.init();
390 db.transaction(function (tx) {435 db.transaction(function (tx) {
391 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid])436 if (model.listened) {
392 whatsNewModel.remove(model.index, 1)437 tx.executeSql("UPDATE Episode SET listened=0 WHERE guid=?", [model.guid])
438 episodesModel.setProperty(model.index, "listened", 0)
439 }
440 else {
441 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid])
442 episodesModel.setProperty(model.index, "listened", 1)
443 if (episodesPage.head.sections.selectedIndex === 0) {
444 episodesModel.remove(model.index, 1)
445 }
446 }
393 });447 });
394 }448 }
395 },449 },
@@ -397,7 +451,7 @@
397 Action {451 Action {
398 iconName: "info"452 iconName: "info"
399 onTriggered: {453 onTriggered: {
400 var popup = PopupUtils.open(episodeDescriptionDialog, whatsNewTab);454 var popup = PopupUtils.open(episodeDescriptionDialog, episodesTab);
401 popup.description = model.description455 popup.description = model.description
402 }456 }
403 }457 }
@@ -437,44 +491,70 @@
437 }491 }
438492
439 function refreshModel() {493 function refreshModel() {
440 var today = new Date()494 var i, j, episode
441 var dayToMs = 86400000; //1 * 24 * 60 * 60 * 1000
442 var i, j, episode, diff
443 var todayCount, yesterdayCount
444
445 whatsNewModel.clear()
446 todayCount = 0
447 yesterdayCount = 0
448
449 var db = Podcasts.init()495 var db = Podcasts.init()
450 db.transaction(function (tx) {496
451 var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC");497 episodesModel.clear()
452 for (i=0; i < rs.rows.length; i++) {498
453 var podcast = rs.rows.item(i);499 // Episode Model for the what's new view
454 var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]);500 if (episodesPageHeaderSections.selectedIndex === 0) {
455 for (j=0; j < rs2.rows.length; j++) {501 var today = new Date()
456 episode = rs2.rows.item(j)502 var dayToMs = 86400000; //1 * 24 * 60 * 60 * 1000
457 diff = Math.floor((today - episode.published)/dayToMs)503 var todayCount, yesterdayCount, diff
458 if (diff < 7 && !episode.listened) {504
459 if (diff < 1) {505 todayCount = 0
460 whatsNewModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Today"})506 yesterdayCount = 0
461 todayCount++;507
462 } else if (diff < 2) {508 db.transaction(function (tx) {
463 whatsNewModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Yesterday"})509 var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC");
464 yesterdayCount++;510 for (i=0; i < rs.rows.length; i++) {
465 } else {511 var podcast = rs.rows.item(i);
466 whatsNewModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Older"})512 var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]);
467 }513 for (j=0; j < rs2.rows.length; j++) {
468 } else if (diff >= 7){514 episode = rs2.rows.item(j)
469 break515 diff = Math.floor((today - episode.published)/dayToMs)
470 }516 if (diff < 7 && !episode.listened) {
471 }517 if (diff < 1) {
472518 episodesModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Today"})
473 if (podcast.lastupdate === null && !episodesUpdating) {519 todayCount++;
474 updateEpisodesDatabase();520 } else if (diff < 2) {
475 }521 episodesModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Yesterday"})
476 }522 yesterdayCount++;
477 });523 } else {
524 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Older"})
525 }
526 } else if (diff >= 7){
527 break
528 }
529 }
530
531 if (podcast.lastupdate === null && !episodesUpdating) {
532 updateEpisodesDatabase();
533 }
534 }
535 });
536 }
537
538 // Episode Model for the downloaded view
539 else if (episodesPageHeaderSections.selectedIndex === 1) {
540 db.transaction(function (tx) {
541 var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC");
542 for (i=0; i < rs.rows.length; i++) {
543 var podcast = rs.rows.item(i);
544 var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]);
545 for (j=0; j < rs2.rows.length; j++) {
546 episode = rs2.rows.item(j)
547 if (episode.downloadedfile) {
548 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Null"})
549 }
550 }
551
552 if (podcast.lastupdate === null && !episodesUpdating) {
553 updateEpisodesDatabase();
554 }
555 }
556 });
557 }
478558
479 episodesUpdating = false;559 episodesUpdating = false;
480 }560 }
481561
=== modified file 'app/ui/PodcastsTab.qml'
--- app/ui/PodcastsTab.qml 2016-03-04 10:40:54 +0000
+++ app/ui/PodcastsTab.qml 2016-03-05 16:56:57 +0000
@@ -61,10 +61,10 @@
61 }61 }
62 },62 },
63 Action {63 Action {
64 iconName: podbird.settings.showListView ? "view-grid-symbolic" : "view-list-symbolic"64 iconName: "add"
65 text: podbird.settings.showListView ? i18n.tr("Grid View") : i18n.tr("List View")65 text: i18n.tr("Add New Podcasts")
66 onTriggered: {66 onTriggered: {
67 podbird.settings.showListView = !podbird.settings.showListView67 mainStack.push(Qt.resolvedUrl("SearchPage.qml"))
68 }68 }
69 }69 }
70 ]70 ]
@@ -86,21 +86,13 @@
86 anchors.verticalCenter: parent.verticalCenter86 anchors.verticalCenter: parent.verticalCenter
87 }87 }
8888
89 trailingActionBar.actions: [89 leadingActionBar.actions: [
90 Action {90 Action {
91 iconName: "edit-clear"91 iconName: "back"
92 text: i18n.tr("Cancel")
93 onTriggered: {92 onTriggered: {
94 viewLoader.item.forceActiveFocus()93 viewLoader.item.forceActiveFocus()
95 podcastPage.header = standardHeader94 podcastPage.header = standardHeader
96 }95 }
97 },
98 Action {
99 iconName: podbird.settings.showListView ? "view-grid-symbolic" : "view-list-symbolic"
100 text: podbird.settings.showListView ? i18n.tr("Grid View") : i18n.tr("List View")
101 onTriggered: {
102 podbird.settings.showListView = !podbird.settings.showListView
103 }
104 }96 }
105 ]97 ]
106 }98 }
10799
=== modified file 'app/ui/SearchPage.qml'
--- app/ui/SearchPage.qml 2016-03-04 10:40:54 +0000
+++ app/ui/SearchPage.qml 2016-03-05 16:56:57 +0000
@@ -28,10 +28,6 @@
2828
29 property var xhr: new XMLHttpRequest;29 property var xhr: new XMLHttpRequest;
3030
31 TabsList {
32 id: tabsList
33 }
34
35 header: standardHeader31 header: standardHeader
3632
37 PageHeader {33 PageHeader {
@@ -44,11 +40,6 @@
44 backgroundColor: podbird.appTheme.background40 backgroundColor: podbird.appTheme.background
45 }41 }
4642
47 leadingActionBar {
48 numberOfSlots: 0
49 actions: tabsList.actions
50 }
51
52 trailingActionBar.actions: [43 trailingActionBar.actions: [
53 Action {44 Action {
54 iconName: "search"45 iconName: "search"
@@ -87,10 +78,9 @@
87 anchors.verticalCenter: parent.verticalCenter78 anchors.verticalCenter: parent.verticalCenter
88 }79 }
8980
90 trailingActionBar.actions: [81 leadingActionBar.actions: [
91 Action {82 Action {
92 iconName: "edit-clear"83 iconName: "back"
93 text: i18n.tr("Cancel")
94 onTriggered: {84 onTriggered: {
95 resultsView.forceActiveFocus()85 resultsView.forceActiveFocus()
96 searchResults.clear()86 searchResults.clear()
@@ -294,7 +284,7 @@
294 }284 }
295 });285 });
296 }286 }
297 tabs.selectedTabIndex = 1;287 mainStack.pop();
298 }288 }
299 }289 }
300 }290 }
@@ -443,7 +433,7 @@
443 Podcasts.subscribe(artist, name, feed, image);433 Podcasts.subscribe(artist, name, feed, image);
444 imageDownloader.feed = feed;434 imageDownloader.feed = feed;
445 imageDownloader.download(image);435 imageDownloader.download(image);
446 tabs.selectedTabIndex = 1;436 mainStack.pop();
447 } else {437 } else {
448 PopupUtils.open(subscribeFailedDialog);438 PopupUtils.open(subscribeFailedDialog);
449 searchPage.header = addHeader439 searchPage.header = addHeader
450440
=== modified file 'app/ui/SettingsPage.qml'
--- app/ui/SettingsPage.qml 2016-03-04 10:40:54 +0000
+++ app/ui/SettingsPage.qml 2016-03-05 16:56:57 +0000
@@ -146,6 +146,20 @@
146 onClicked: mainStack.push(Qt.resolvedUrl("../settings/ThemeSetting.qml"))146 onClicked: mainStack.push(Qt.resolvedUrl("../settings/ThemeSetting.qml"))
147 }147 }
148148
149 ListItem {
150 ListItemLayout {
151 id: gridViewLayout
152 title.text: i18n.tr("Displays podcasts in a list view")
153 Switch {
154 SlotsLayout.position: SlotsLayout.Last
155 checked: podbird.settings.showListView
156 onClicked: podbird.settings.showListView = checked
157 }
158 }
159 divider.visible: false
160 height: gridViewLayout.height
161 }
162
149 HeaderListItem {163 HeaderListItem {
150 title.text: i18n.tr("Playback Settings")164 title.text: i18n.tr("Playback Settings")
151 }165 }
152166
=== modified file 'po/podbird.nik90.pot'
--- po/podbird.nik90.pot 2016-03-04 10:40:54 +0000
+++ po/podbird.nik90.pot 2016-03-05 16:56:57 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: \n"9"Project-Id-Version: \n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2016-03-04 16:09+0530\n"11"POT-Creation-Date: 2016-03-05 22:22+0530\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"
@@ -18,7 +18,7 @@
18"Content-Transfer-Encoding: 8bit\n"18"Content-Transfer-Encoding: 8bit\n"
19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"19"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2020
21#: ../app/components/TabsList.qml:29 ../app/ui/WhatsNewTab.qml:4821#: ../app/components/TabsList.qml:29 ../app/ui/EpisodesTab.qml:135
22msgid "What's New"22msgid "What's New"
23msgstr ""23msgstr ""
2424
@@ -26,11 +26,7 @@
26msgid "Podcasts"26msgid "Podcasts"
27msgstr ""27msgstr ""
2828
29#: ../app/components/TabsList.qml:45 ../app/ui/SearchPage.qml:4129#: ../app/components/TabsList.qml:45 ../app/ui/SettingsPage.qml:32
30msgid "Add New Podcasts"
31msgstr ""
32
33#: ../app/components/TabsList.qml:53 ../app/ui/SettingsPage.qml:32
34msgid "Settings"30msgid "Settings"
35msgstr ""31msgstr ""
3632
@@ -65,7 +61,7 @@
6561
66#. TRANSLATORS: About as in information about the app62#. TRANSLATORS: About as in information about the app
67#: ../app/settings/About.qml:28 ../app/settings/About.qml:4763#: ../app/settings/About.qml:28 ../app/settings/About.qml:47
68#: ../app/ui/SettingsPage.qml:20864#: ../app/ui/SettingsPage.qml:222
69msgid "About"65msgid "About"
70msgstr ""66msgstr ""
7167
@@ -143,7 +139,7 @@
143#: ../app/settings/DownloadSetting.qml:34139#: ../app/settings/DownloadSetting.qml:34
144#: ../app/settings/DownloadSetting.qml:35140#: ../app/settings/DownloadSetting.qml:35
145#: ../app/settings/DownloadSetting.qml:36141#: ../app/settings/DownloadSetting.qml:36
146#: ../app/settings/DownloadSetting.qml:37 ../app/ui/EpisodesPage.qml:347142#: ../app/settings/DownloadSetting.qml:37 ../app/ui/EpisodesPage.qml:344
147#, qt-format143#, qt-format
148msgid "%1 episode"144msgid "%1 episode"
149msgid_plural "%1 episodes"145msgid_plural "%1 episodes"
@@ -168,68 +164,106 @@
168msgid "Podcast"164msgid "Podcast"
169msgstr ""165msgstr ""
170166
171#: ../app/ui/EpisodesPage.qml:74 ../app/ui/WhatsNewTab.qml:62167#: ../app/ui/EpisodesPage.qml:74 ../app/ui/EpisodesTab.qml:62
172msgid "Search Episode"168msgid "Search Episode"
173msgstr ""169msgstr ""
174170
175#: ../app/ui/EpisodesPage.qml:83 ../app/ui/WhatsNewTab.qml:71171#: ../app/ui/EpisodesPage.qml:83 ../app/ui/EpisodesTab.qml:72
176msgid "Mark all listened"172msgid "Mark all listened"
177msgstr ""173msgstr ""
178174
179#: ../app/ui/EpisodesPage.qml:94 ../app/ui/EpisodesPage.qml:188175#: ../app/ui/EpisodesPage.qml:94 ../app/ui/EpisodesPage.qml:185
180#: ../app/ui/SearchPage.qml:276176#: ../app/ui/SearchPage.qml:266
181msgid "Unsubscribe"177msgid "Unsubscribe"
182msgstr ""178msgstr ""
183179
184#: ../app/ui/EpisodesPage.qml:111 ../app/ui/EpisodesPage.qml:205180#: ../app/ui/EpisodesPage.qml:137 ../app/ui/EpisodesTab.qml:173
185#: ../app/ui/PodcastsTab.qml:92 ../app/ui/SearchPage.qml:93
186#: ../app/ui/SearchPage.qml:131 ../app/ui/SettingsPage.qml:83
187#: ../app/ui/SettingsPage.qml:118 ../app/ui/WhatsNewTab.qml:121
188msgid "Cancel"
189msgstr ""
190
191#: ../app/ui/EpisodesPage.qml:140 ../app/ui/WhatsNewTab.qml:134
192msgid "Search episode"181msgid "Search episode"
193msgstr ""182msgstr ""
194183
195#: ../app/ui/EpisodesPage.qml:185184#: ../app/ui/EpisodesPage.qml:182
196msgid "Unsubscribe Confirmation"185msgid "Unsubscribe Confirmation"
197msgstr ""186msgstr ""
198187
199#: ../app/ui/EpisodesPage.qml:186188#: ../app/ui/EpisodesPage.qml:183
200#, qt-format189#, qt-format
201msgid "Are you sure you want to unsubscribe from <b>%1</b>?"190msgid "Are you sure you want to unsubscribe from <b>%1</b>?"
202msgstr ""191msgstr ""
203192
204#: ../app/ui/EpisodesPage.qml:227 ../app/ui/WhatsNewTab.qml:234193#: ../app/ui/EpisodesPage.qml:202 ../app/ui/SearchPage.qml:121
194#: ../app/ui/SettingsPage.qml:83 ../app/ui/SettingsPage.qml:118
195msgid "Cancel"
196msgstr ""
197
198#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:273
205msgid "Episode Description"199msgid "Episode Description"
206msgstr ""200msgstr ""
207201
208#: ../app/ui/EpisodesPage.qml:239 ../app/ui/SearchPage.qml:180202#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:285
209#: ../app/ui/WhatsNewTab.qml:246203#: ../app/ui/SearchPage.qml:170
210msgid "Close"204msgid "Close"
211msgstr ""205msgstr ""
212206
213#: ../app/ui/EpisodesPage.qml:267207#: ../app/ui/EpisodesPage.qml:264
214msgid "No episodes found"208msgid "No episodes found"
215msgstr ""209msgstr ""
216210
217#: ../app/ui/EpisodesPage.qml:268211#: ../app/ui/EpisodesPage.qml:265
218msgid "No episodes found matching the search term."212msgid "No episodes found matching the search term."
219msgstr ""213msgstr ""
220214
221#: ../app/ui/EpisodesPage.qml:364215#: ../app/ui/EpisodesPage.qml:361
222msgid "Unheard"216msgid "Unheard"
223msgstr ""217msgstr ""
224218
225#: ../app/ui/EpisodesPage.qml:391219#: ../app/ui/EpisodesPage.qml:388
226msgid "Listened"220msgid "Listened"
227msgstr ""221msgstr ""
228222
229#: ../app/ui/EpisodesPage.qml:416223#: ../app/ui/EpisodesPage.qml:413 ../app/ui/EpisodesTab.qml:135
230msgid "Downloaded"224msgid "Downloaded"
231msgstr ""225msgstr ""
232226
227#: ../app/ui/EpisodesTab.qml:48
228msgid "Episodes"
229msgstr ""
230
231#: ../app/ui/EpisodesTab.qml:87
232msgid "Download all"
233msgstr ""
234
235#: ../app/ui/EpisodesTab.qml:104
236msgid "Delete all"
237msgstr ""
238
239#: ../app/ui/EpisodesTab.qml:195
240msgid "No New Episodes"
241msgstr ""
242
243#: ../app/ui/EpisodesTab.qml:195
244msgid "No Episodes Found"
245msgstr ""
246
247#: ../app/ui/EpisodesTab.qml:196
248msgid "No more episodes to listen to!"
249msgstr ""
250
251#: ../app/ui/EpisodesTab.qml:196
252msgid "No Episodes found matching the search term."
253msgstr ""
254
255#: ../app/ui/EpisodesTab.qml:332
256msgid "Today"
257msgstr ""
258
259#: ../app/ui/EpisodesTab.qml:336
260msgid "Yesterday"
261msgstr ""
262
263#: ../app/ui/EpisodesTab.qml:340
264msgid "Older"
265msgstr ""
266
233#: ../app/ui/NowPlayingPage.qml:29267#: ../app/ui/NowPlayingPage.qml:29
234msgid "Now Playing"268msgid "Now Playing"
235msgstr ""269msgstr ""
@@ -246,106 +280,102 @@
246msgid "+%1s"280msgid "+%1s"
247msgstr ""281msgstr ""
248282
249#: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:55283#: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:46
250#: ../app/ui/SearchPage.qml:162284#: ../app/ui/SearchPage.qml:152
251msgid "Search Podcast"285msgid "Search Podcast"
252msgstr ""286msgstr ""
253287
254#: ../app/ui/PodcastsTab.qml:65 ../app/ui/PodcastsTab.qml:100288#: ../app/ui/PodcastsTab.qml:65 ../app/ui/SearchPage.qml:37
255msgid "Grid View"289msgid "Add New Podcasts"
256msgstr ""290msgstr ""
257291
258#: ../app/ui/PodcastsTab.qml:65 ../app/ui/PodcastsTab.qml:100292#: ../app/ui/PodcastsTab.qml:104
259msgid "List View"
260msgstr ""
261
262#: ../app/ui/PodcastsTab.qml:112
263msgid "Search podcast"293msgid "Search podcast"
264msgstr ""294msgstr ""
265295
266#: ../app/ui/PodcastsTab.qml:142296#: ../app/ui/PodcastsTab.qml:134
267msgid "No Podcast Subscriptions"297msgid "No Podcast Subscriptions"
268msgstr ""298msgstr ""
269299
270#: ../app/ui/PodcastsTab.qml:142300#: ../app/ui/PodcastsTab.qml:134
271msgid "No Podcasts Found"301msgid "No Podcasts Found"
272msgstr ""302msgstr ""
273303
274#: ../app/ui/PodcastsTab.qml:143304#: ../app/ui/PodcastsTab.qml:135
275msgid ""305msgid ""
276"You haven't subscribed to any podcasts yet, visit the 'Find New Podcasts' "306"You haven't subscribed to any podcasts yet, visit the 'Find New Podcasts' "
277"page to add some."307"page to add some."
278msgstr ""308msgstr ""
279309
280#: ../app/ui/PodcastsTab.qml:144 ../app/ui/SearchPage.qml:210310#: ../app/ui/PodcastsTab.qml:136 ../app/ui/SearchPage.qml:200
281msgid "No podcasts found matching the search term."311msgid "No podcasts found matching the search term."
282msgstr ""312msgstr ""
283313
284#: ../app/ui/PodcastsTab.qml:182 ../app/ui/PodcastsTab.qml:230314#: ../app/ui/PodcastsTab.qml:174 ../app/ui/PodcastsTab.qml:222
285#, qt-format315#, qt-format
286msgid "%1 unheard episode"316msgid "%1 unheard episode"
287msgid_plural "%1 unheard episodes"317msgid_plural "%1 unheard episodes"
288msgstr[0] ""318msgstr[0] ""
289msgstr[1] ""319msgstr[1] ""
290320
291#: ../app/ui/SearchPage.qml:63321#: ../app/ui/SearchPage.qml:54
292msgid "Add Podcast"322msgid "Add Podcast"
293msgstr ""323msgstr ""
294324
295#: ../app/ui/SearchPage.qml:123325#: ../app/ui/SearchPage.qml:113
296msgid "Save Podcast"326msgid "Save Podcast"
297msgstr ""327msgstr ""
298328
299#: ../app/ui/SearchPage.qml:150329#: ../app/ui/SearchPage.qml:140
300msgid "Feed URL"330msgid "Feed URL"
301msgstr ""331msgstr ""
302332
303#: ../app/ui/SearchPage.qml:177333#: ../app/ui/SearchPage.qml:167
304msgid "Unable to subscribe"334msgid "Unable to subscribe"
305msgstr ""335msgstr ""
306336
307#: ../app/ui/SearchPage.qml:178337#: ../app/ui/SearchPage.qml:168
308msgid "Please check the URL and try again"338msgid "Please check the URL and try again"
309msgstr ""339msgstr ""
310340
311#: ../app/ui/SearchPage.qml:208341#: ../app/ui/SearchPage.qml:198
312msgid "Looking to add a new Podcast?"342msgid "Looking to add a new Podcast?"
313msgstr ""343msgstr ""
314344
315#: ../app/ui/SearchPage.qml:208345#: ../app/ui/SearchPage.qml:198
316msgid "No Podcasts found"346msgid "No Podcasts found"
317msgstr ""347msgstr ""
318348
319#: ../app/ui/SearchPage.qml:209349#: ../app/ui/SearchPage.qml:199
320msgid ""350msgid ""
321"Click the 'magnifier' at the top to search or the 'plus' button to add by URL"351"Click the 'magnifier' at the top to search or the 'plus' button to add by URL"
322msgstr ""352msgstr ""
323353
324#: ../app/ui/SearchPage.qml:276354#: ../app/ui/SearchPage.qml:266
325msgid "Subscribe"355msgid "Subscribe"
326msgstr ""356msgstr ""
327357
328#. TRANSLATORS: The first argument here is the date of when the podcast was last updated followed by358#. TRANSLATORS: The first argument here is the date of when the podcast was last updated followed by
329#. the podcast description.359#. the podcast description.
330#: ../app/ui/SearchPage.qml:315360#: ../app/ui/SearchPage.qml:305
331#, qt-format361#, qt-format
332msgid ""362msgid ""
333"Last Updated: %1\n"363"Last Updated: %1\n"
334"%2"364"%2"
335msgstr ""365msgstr ""
336366
337#: ../app/ui/SearchPage.qml:372367#: ../app/ui/SearchPage.qml:362
338msgid "Not Available"368msgid "Not Available"
339msgstr ""369msgstr ""
340370
341#. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they371#. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they
342#. want to seek forward when pressing on this button.372#. want to seek forward when pressing on this button.
343#: ../app/ui/SettingsPage.qml:63 ../app/ui/SettingsPage.qml:155373#: ../app/ui/SettingsPage.qml:63 ../app/ui/SettingsPage.qml:169
344msgid "Skip forward"374msgid "Skip forward"
345msgstr ""375msgstr ""
346376
347#: ../app/ui/SettingsPage.qml:70 ../app/ui/SettingsPage.qml:105377#: ../app/ui/SettingsPage.qml:70 ../app/ui/SettingsPage.qml:105
348#: ../app/ui/SettingsPage.qml:156 ../app/ui/SettingsPage.qml:163378#: ../app/ui/SettingsPage.qml:170 ../app/ui/SettingsPage.qml:177
349#, qt-format379#, qt-format
350msgid "%1 seconds"380msgid "%1 seconds"
351msgstr ""381msgstr ""
@@ -356,7 +386,7 @@
356386
357#. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they387#. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they
358#. want to seek backward when pressing on this button.388#. want to seek backward when pressing on this button.
359#: ../app/ui/SettingsPage.qml:98 ../app/ui/SettingsPage.qml:162389#: ../app/ui/SettingsPage.qml:98 ../app/ui/SettingsPage.qml:176
360msgid "Skip back"390msgid "Skip back"
361msgstr ""391msgstr ""
362392
@@ -366,73 +396,45 @@
366msgid "General Settings"396msgid "General Settings"
367msgstr ""397msgstr ""
368398
369#: ../app/ui/SettingsPage.qml:150399#: ../app/ui/SettingsPage.qml:152
400msgid "Displays podcasts in a list view"
401msgstr ""
402
403#: ../app/ui/SettingsPage.qml:164
370msgid "Playback Settings"404msgid "Playback Settings"
371msgstr ""405msgstr ""
372406
373#: ../app/ui/SettingsPage.qml:168407#: ../app/ui/SettingsPage.qml:182
374msgid "Podcast Episode Settings"408msgid "Podcast Episode Settings"
375msgstr ""409msgstr ""
376410
377#: ../app/ui/SettingsPage.qml:174411#: ../app/ui/SettingsPage.qml:188
378msgid "Automatically delete old episodes"412msgid "Automatically delete old episodes"
379msgstr ""413msgstr ""
380414
381#: ../app/ui/SettingsPage.qml:176415#: ../app/ui/SettingsPage.qml:190
382msgid ""416msgid ""
383"Delete episodes that are older than a given number of days for each podcast"417"Delete episodes that are older than a given number of days for each podcast"
384msgstr ""418msgstr ""
385419
386#: ../app/ui/SettingsPage.qml:188420#: ../app/ui/SettingsPage.qml:202
387msgid "Automatically download new episodes"421msgid "Automatically download new episodes"
388msgstr ""422msgstr ""
389423
390#: ../app/ui/SettingsPage.qml:190424#: ../app/ui/SettingsPage.qml:204
391msgid "Default number of new episodes to download for each podcast"425msgid "Default number of new episodes to download for each podcast"
392msgstr ""426msgstr ""
393427
394#. TRANSLATORS: Shortened form of "Miscellaneous" which is shown to denote other setting options428#. TRANSLATORS: Shortened form of "Miscellaneous" which is shown to denote other setting options
395#. that doesn't fit into any other category.429#. that doesn't fit into any other category.
396#: ../app/ui/SettingsPage.qml:202430#: ../app/ui/SettingsPage.qml:216
397msgid "Misc."431msgid "Misc."
398msgstr ""432msgstr ""
399433
400#: ../app/ui/SettingsPage.qml:218434#: ../app/ui/SettingsPage.qml:232
401msgid "Report Bug"435msgid "Report Bug"
402msgstr ""436msgstr ""
403437
404#: ../app/ui/WhatsNewTab.qml:85
405msgid "Download all"
406msgstr ""
407
408#: ../app/ui/WhatsNewTab.qml:156
409msgid "No New Episodes"
410msgstr ""
411
412#: ../app/ui/WhatsNewTab.qml:156
413msgid "No Episodes Found"
414msgstr ""
415
416#: ../app/ui/WhatsNewTab.qml:157
417msgid "No more episodes to listen to!"
418msgstr ""
419
420#: ../app/ui/WhatsNewTab.qml:157
421msgid "No Episodes found matching the search term."
422msgstr ""
423
424#: ../app/ui/WhatsNewTab.qml:295
425msgid "Today"
426msgstr ""
427
428#: ../app/ui/WhatsNewTab.qml:299
429msgid "Yesterday"
430msgstr ""
431
432#: ../app/ui/WhatsNewTab.qml:303
433msgid "Older"
434msgstr ""
435
436#: ../app/welcomewizard/Slide1.qml:42438#: ../app/welcomewizard/Slide1.qml:42
437msgid "Welcome to Podbird"439msgid "Welcome to Podbird"
438msgstr ""440msgstr ""

Subscribers

People subscribed via source and target branches