Merge lp:~nik90/podbird/new-navigation-structure into lp:podbird/devel
- new-navigation-structure
- Merge into 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 |
Related bugs: |
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
1 | === modified file 'app/components/TabsList.qml' | |||
2 | --- app/components/TabsList.qml 2016-03-04 10:40:54 +0000 | |||
3 | +++ app/components/TabsList.qml 2016-03-05 16:56:57 +0000 | |||
4 | @@ -26,7 +26,7 @@ | |||
5 | 26 | 26 | ||
6 | 27 | children: [ | 27 | children: [ |
7 | 28 | Action { | 28 | Action { |
9 | 29 | text: i18n.tr("What's New") | 29 | text: i18n.tr("Episodes") |
10 | 30 | visible: currentTab !== 0 | 30 | visible: currentTab !== 0 |
11 | 31 | onTriggered: { | 31 | onTriggered: { |
12 | 32 | tabs.selectedTabIndex = 0 | 32 | tabs.selectedTabIndex = 0 |
13 | @@ -42,19 +42,11 @@ | |||
14 | 42 | }, | 42 | }, |
15 | 43 | 43 | ||
16 | 44 | Action { | 44 | Action { |
18 | 45 | text: i18n.tr("Add New Podcasts") | 45 | text: i18n.tr("Settings") |
19 | 46 | visible: currentTab !== 2 | 46 | visible: currentTab !== 2 |
20 | 47 | onTriggered: { | 47 | onTriggered: { |
21 | 48 | tabs.selectedTabIndex = 2 | 48 | tabs.selectedTabIndex = 2 |
22 | 49 | } | 49 | } |
23 | 50 | }, | ||
24 | 51 | |||
25 | 52 | Action { | ||
26 | 53 | text: i18n.tr("Settings") | ||
27 | 54 | visible: currentTab !== 3 | ||
28 | 55 | onTriggered: { | ||
29 | 56 | tabs.selectedTabIndex = 3 | ||
30 | 57 | } | ||
31 | 58 | } | 50 | } |
32 | 59 | ] | 51 | ] |
33 | 60 | } | 52 | } |
34 | 61 | 53 | ||
35 | === modified file 'app/podbird.qml' | |||
36 | --- app/podbird.qml 2016-03-04 10:40:54 +0000 | |||
37 | +++ app/podbird.qml 2016-03-05 16:56:57 +0000 | |||
38 | @@ -56,7 +56,7 @@ | |||
39 | 56 | // visible on application start. | 56 | // visible on application start. |
40 | 57 | function refreshModels() { | 57 | function refreshModels() { |
41 | 58 | if (tabs.selectedTabIndex === 0) { | 58 | if (tabs.selectedTabIndex === 0) { |
43 | 59 | whatsNewTab.refreshModel() | 59 | episodesTab.refreshModel() |
44 | 60 | } else if (tabs.selectedTabIndex === 1) { | 60 | } else if (tabs.selectedTabIndex === 1) { |
45 | 61 | podcastPage.item.refreshModel() | 61 | podcastPage.item.refreshModel() |
46 | 62 | } | 62 | } |
47 | @@ -246,9 +246,9 @@ | |||
48 | 246 | } | 246 | } |
49 | 247 | } | 247 | } |
50 | 248 | 248 | ||
54 | 249 | WhatsNewTab { | 249 | EpisodesTab { |
55 | 250 | id: whatsNewTab | 250 | id: episodesTab |
56 | 251 | objectName: "whatsNewTab" | 251 | objectName: "episodesTab" |
57 | 252 | } | 252 | } |
58 | 253 | 253 | ||
59 | 254 | Tab { | 254 | Tab { |
60 | @@ -264,19 +264,6 @@ | |||
61 | 264 | } | 264 | } |
62 | 265 | 265 | ||
63 | 266 | Tab { | 266 | Tab { |
64 | 267 | id: searchTab | ||
65 | 268 | |||
66 | 269 | // Dynamically load/unload the search tab as required | ||
67 | 270 | page: Loader { | ||
68 | 271 | parent: searchTab | ||
69 | 272 | anchors.left: parent.left | ||
70 | 273 | anchors.right: parent.right | ||
71 | 274 | anchors.bottom: parent.bottom | ||
72 | 275 | source: (tabs.selectedTab === searchTab) ? Qt.resolvedUrl("ui/SearchPage.qml") : "" | ||
73 | 276 | } | ||
74 | 277 | } | ||
75 | 278 | |||
76 | 279 | Tab { | ||
77 | 280 | id: settingsTab | 267 | id: settingsTab |
78 | 281 | 268 | ||
79 | 282 | // Dynamically load/unload the settings tab as required | 269 | // Dynamically load/unload the settings tab as required |
80 | 283 | 270 | ||
81 | === modified file 'app/ui/EpisodesPage.qml' | |||
82 | --- app/ui/EpisodesPage.qml 2016-03-04 10:40:54 +0000 | |||
83 | +++ app/ui/EpisodesPage.qml 2016-03-05 16:56:57 +0000 | |||
84 | @@ -105,17 +105,14 @@ | |||
85 | 105 | name: "search" | 105 | name: "search" |
86 | 106 | head: episodesPage.head | 106 | head: episodesPage.head |
87 | 107 | 107 | ||
97 | 108 | actions: [ | 108 | backAction: Action { |
98 | 109 | Action { | 109 | iconName: "back" |
99 | 110 | iconName: "edit-clear" | 110 | onTriggered: { |
100 | 111 | text: i18n.tr("Cancel") | 111 | episodeList.forceActiveFocus() |
101 | 112 | onTriggered: { | 112 | episodesPage.state = "default" |
102 | 113 | episodeList.forceActiveFocus() | 113 | episodeList.positionViewAtBeginning() |
94 | 114 | episodesPage.state = "default" | ||
95 | 115 | episodeList.positionViewAtBeginning() | ||
96 | 116 | } | ||
103 | 117 | } | 114 | } |
105 | 118 | ] | 115 | } |
106 | 119 | 116 | ||
107 | 120 | contents: Loader { | 117 | contents: Loader { |
108 | 121 | id: searchField | 118 | id: searchField |
109 | 122 | 119 | ||
110 | === renamed file 'app/ui/WhatsNewTab.qml' => 'app/ui/EpisodesTab.qml' | |||
111 | --- app/ui/WhatsNewTab.qml 2016-03-04 10:40:54 +0000 | |||
112 | +++ app/ui/EpisodesTab.qml 2016-03-05 16:56:57 +0000 | |||
113 | @@ -26,7 +26,7 @@ | |||
114 | 26 | import "../components" | 26 | import "../components" |
115 | 27 | 27 | ||
116 | 28 | Tab { | 28 | Tab { |
118 | 29 | id: whatsNewTab | 29 | id: episodesTab |
119 | 30 | 30 | ||
120 | 31 | property var today: new Date() | 31 | property var today: new Date() |
121 | 32 | property int dayToMs: 86400000 | 32 | property int dayToMs: 86400000 |
122 | @@ -38,14 +38,14 @@ | |||
123 | 38 | } | 38 | } |
124 | 39 | 39 | ||
125 | 40 | page: Page { | 40 | page: Page { |
127 | 41 | id: whatsNewPage | 41 | id: episodesPage |
128 | 42 | 42 | ||
129 | 43 | header: standardHeader | 43 | header: standardHeader |
130 | 44 | 44 | ||
131 | 45 | PageHeader { | 45 | PageHeader { |
132 | 46 | id: standardHeader | 46 | id: standardHeader |
135 | 47 | visible: whatsNewPage.header === standardHeader | 47 | visible: episodesPage.header === standardHeader |
136 | 48 | title: i18n.tr("What's New") | 48 | title: i18n.tr("Episodes") |
137 | 49 | 49 | ||
138 | 50 | StyleHints { | 50 | StyleHints { |
139 | 51 | backgroundColor: podbird.appTheme.background | 51 | backgroundColor: podbird.appTheme.background |
140 | @@ -61,47 +61,87 @@ | |||
141 | 61 | iconName: "search" | 61 | iconName: "search" |
142 | 62 | text: i18n.tr("Search Episode") | 62 | text: i18n.tr("Search Episode") |
143 | 63 | onTriggered: { | 63 | onTriggered: { |
145 | 64 | whatsNewPage.header = searchHeader | 64 | episodesPage.header = searchHeader |
146 | 65 | searchField.item.forceActiveFocus() | 65 | searchField.item.forceActiveFocus() |
147 | 66 | } | 66 | } |
148 | 67 | }, | 67 | }, |
149 | 68 | 68 | ||
150 | 69 | Action { | 69 | Action { |
151 | 70 | iconName: "select" | 70 | iconName: "select" |
152 | 71 | visible: episodesPageHeaderSections.selectedIndex === 0 | ||
153 | 71 | text: i18n.tr("Mark all listened") | 72 | text: i18n.tr("Mark all listened") |
154 | 72 | onTriggered: { | 73 | onTriggered: { |
155 | 73 | var db = Podcasts.init(); | 74 | var db = Podcasts.init(); |
156 | 74 | db.transaction(function (tx) { | 75 | db.transaction(function (tx) { |
159 | 75 | for (var i=0; i<whatsNewModel.count; i++) { | 76 | for (var i=0; i<episodesModel.count; i++) { |
160 | 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]); |
161 | 77 | } | 78 | } |
163 | 78 | whatsNewModel.clear() | 79 | episodesModel.clear() |
164 | 79 | }); | 80 | }); |
165 | 80 | } | 81 | } |
166 | 81 | }, | 82 | }, |
167 | 82 | 83 | ||
168 | 83 | Action { | 84 | Action { |
169 | 84 | iconName: "save" | 85 | iconName: "save" |
170 | 86 | visible: episodesPageHeaderSections.selectedIndex === 0 | ||
171 | 85 | text: i18n.tr("Download all") | 87 | text: i18n.tr("Download all") |
172 | 86 | onTriggered: { | 88 | onTriggered: { |
173 | 87 | var db = Podcasts.init(); | 89 | var db = Podcasts.init(); |
174 | 88 | db.transaction(function (tx) { | 90 | db.transaction(function (tx) { |
183 | 89 | for (var i=0; i<whatsNewModel.count; i++) { | 91 | for (var i=0; i<episodesModel.count; i++) { |
184 | 90 | if (!whatsNewModel.get(i).downloadedfile) { | 92 | if (!episodesModel.get(i).downloadedfile) { |
185 | 91 | whatsNewModel.setProperty(i, "queued", 1) | 93 | episodesModel.setProperty(i, "queued", 1) |
186 | 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]); |
187 | 93 | downloader.addDownload(whatsNewModel.get(i).guid, whatsNewModel.get(i).audiourl); | 95 | downloader.addDownload(episodesModel.get(i).guid, episodesModel.get(i).audiourl); |
188 | 94 | } | 96 | } |
189 | 95 | } | 97 | } |
190 | 96 | }); | 98 | }); |
191 | 99 | } | ||
192 | 100 | }, | ||
193 | 101 | |||
194 | 102 | Action { | ||
195 | 103 | iconName: "delete" | ||
196 | 104 | text: i18n.tr("Delete all") | ||
197 | 105 | visible: episodesPageHeaderSections.selectedIndex === 1 | ||
198 | 106 | onTriggered: { | ||
199 | 107 | var db = Podcasts.init(); | ||
200 | 108 | db.transaction(function (tx) { | ||
201 | 109 | for (var i=0; i<episodesModel.count; i++) { | ||
202 | 110 | if (episodesModel.get(i).downloadedfile) { | ||
203 | 111 | fileManager.deleteFile(episodesModel.get(i).downloadedfile); | ||
204 | 112 | tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(i).guid]); | ||
205 | 113 | episodesModel.setProperty(i, "downloadedfile", "") | ||
206 | 114 | } | ||
207 | 115 | } | ||
208 | 116 | }); | ||
209 | 117 | refreshModel(); | ||
210 | 97 | } | 118 | } |
211 | 98 | } | 119 | } |
212 | 99 | ] | 120 | ] |
213 | 121 | |||
214 | 122 | extension: Sections { | ||
215 | 123 | id: episodesPageHeaderSections | ||
216 | 124 | |||
217 | 125 | anchors { | ||
218 | 126 | left: parent.left | ||
219 | 127 | leftMargin: units.gu(2) | ||
220 | 128 | bottom: parent.bottom | ||
221 | 129 | } | ||
222 | 130 | |||
223 | 131 | StyleHints { | ||
224 | 132 | selectedSectionColor: podbird.appTheme.focusText | ||
225 | 133 | } | ||
226 | 134 | |||
227 | 135 | model: [i18n.tr("What's New"), i18n.tr("Downloaded")] | ||
228 | 136 | onSelectedIndexChanged: { | ||
229 | 137 | refreshModel(); | ||
230 | 138 | } | ||
231 | 139 | } | ||
232 | 100 | } | 140 | } |
233 | 101 | 141 | ||
234 | 102 | PageHeader { | 142 | PageHeader { |
235 | 103 | id: searchHeader | 143 | id: searchHeader |
237 | 104 | visible: whatsNewPage.header === searchHeader | 144 | visible: episodesPage.header === searchHeader |
238 | 105 | 145 | ||
239 | 106 | StyleHints { | 146 | StyleHints { |
240 | 107 | backgroundColor: podbird.appTheme.background | 147 | backgroundColor: podbird.appTheme.background |
241 | @@ -109,19 +149,18 @@ | |||
242 | 109 | 149 | ||
243 | 110 | contents: Loader { | 150 | contents: Loader { |
244 | 111 | id: searchField | 151 | id: searchField |
246 | 112 | sourceComponent: whatsNewPage.header === searchHeader ? searchFieldComponent : undefined | 152 | sourceComponent: episodesPage.header === searchHeader ? searchFieldComponent : undefined |
247 | 113 | anchors.left: parent ? parent.left : undefined | 153 | anchors.left: parent ? parent.left : undefined |
248 | 114 | anchors.right: parent ? parent.right : undefined | 154 | anchors.right: parent ? parent.right : undefined |
249 | 115 | anchors.verticalCenter: parent ? parent.verticalCenter : undefined | 155 | anchors.verticalCenter: parent ? parent.verticalCenter : undefined |
250 | 116 | } | 156 | } |
251 | 117 | 157 | ||
253 | 118 | trailingActionBar.actions: [ | 158 | leadingActionBar.actions: [ |
254 | 119 | Action { | 159 | Action { |
257 | 120 | iconName: "edit-clear" | 160 | iconName: "back" |
256 | 121 | text: i18n.tr("Cancel") | ||
258 | 122 | onTriggered: { | 161 | onTriggered: { |
259 | 123 | episodeList.forceActiveFocus() | 162 | episodeList.forceActiveFocus() |
261 | 124 | whatsNewPage.header = standardHeader | 163 | episodesPage.header = standardHeader |
262 | 125 | } | 164 | } |
263 | 126 | } | 165 | } |
264 | 127 | ] | 166 | ] |
265 | @@ -146,28 +185,28 @@ | |||
266 | 146 | verticalCenterOffset: Qt.inputMethod.visible ? units.gu(4) : 0 | 185 | verticalCenterOffset: Qt.inputMethod.visible ? units.gu(4) : 0 |
267 | 147 | } | 186 | } |
268 | 148 | 187 | ||
270 | 149 | sourceComponent: whatsNewModel.count === 0 || sortedEpisodeModel.count === 0 ? emptyStateComponent : undefined | 188 | sourceComponent: episodesModel.count === 0 || sortedEpisodeModel.count === 0 ? emptyStateComponent : undefined |
271 | 150 | } | 189 | } |
272 | 151 | 190 | ||
273 | 152 | Component { | 191 | Component { |
274 | 153 | id: emptyStateComponent | 192 | id: emptyStateComponent |
275 | 154 | EmptyState { | 193 | EmptyState { |
279 | 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") |
280 | 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") |
281 | 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.") |
282 | 158 | } | 197 | } |
283 | 159 | } | 198 | } |
284 | 160 | 199 | ||
285 | 161 | ListModel { | 200 | ListModel { |
287 | 162 | id: whatsNewModel | 201 | id: episodesModel |
288 | 163 | } | 202 | } |
289 | 164 | 203 | ||
290 | 165 | SortFilterModel { | 204 | SortFilterModel { |
291 | 166 | id: sortedEpisodeModel | 205 | id: sortedEpisodeModel |
293 | 167 | model: whatsNewModel | 206 | model: episodesModel |
294 | 168 | filter.property: "name" | 207 | filter.property: "name" |
297 | 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") |
298 | 170 | : RegExp("", "gi") | 209 | : RegExp("", "gi") |
299 | 171 | } | 210 | } |
300 | 172 | 211 | ||
301 | 173 | onVisibleChanged: { | 212 | onVisibleChanged: { |
302 | @@ -176,7 +215,7 @@ | |||
303 | 176 | if (downloader.downloadingGuid != "") | 215 | if (downloader.downloadingGuid != "") |
304 | 177 | tempGuid = downloader.downloadingGuid | 216 | tempGuid = downloader.downloadingGuid |
305 | 178 | } else { | 217 | } else { |
307 | 179 | whatsNewPage.header = standardHeader | 218 | episodesPage.header = standardHeader |
308 | 180 | } | 219 | } |
309 | 181 | } | 220 | } |
310 | 182 | 221 | ||
311 | @@ -187,16 +226,16 @@ | |||
312 | 187 | db.transaction(function (tx) { | 226 | db.transaction(function (tx) { |
313 | 188 | /* | 227 | /* |
314 | 189 | If tempGuid is NULL, then the episode currently being downloaded is not found within | 228 | If tempGuid is NULL, then the episode currently being downloaded is not found within |
316 | 190 | this podcast. On the other hand, if it is within this podcast, then update the whatsNewModel | 229 | this podcast. On the other hand, if it is within this podcast, then update the episodesModel |
317 | 191 | with the downloadedfile location we just received from the downloader. | 230 | with the downloadedfile location we just received from the downloader. |
318 | 192 | */ | 231 | */ |
319 | 193 | if (tempGuid != "NULL") { | 232 | if (tempGuid != "NULL") { |
320 | 194 | var rs2 = tx.executeSql("SELECT downloadedfile FROM Episode WHERE guid=?", [tempGuid]); | 233 | var rs2 = tx.executeSql("SELECT downloadedfile FROM Episode WHERE guid=?", [tempGuid]); |
323 | 195 | for (var i=0; i<whatsNewModel.count; i++) { | 234 | for (var i=0; i<episodesModel.count; i++) { |
324 | 196 | if (whatsNewModel.get(i).guid == tempGuid) { | 235 | if (episodesModel.get(i).guid == tempGuid) { |
325 | 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) |
328 | 198 | whatsNewModel.setProperty(i, "downloadedfile", rs2.rows.item(0).downloadedfile) | 237 | episodesModel.setProperty(i, "downloadedfile", rs2.rows.item(0).downloadedfile) |
329 | 199 | whatsNewModel.setProperty(i, "queued", 0) | 238 | episodesModel.setProperty(i, "queued", 0) |
330 | 200 | break | 239 | break |
331 | 201 | } | 240 | } |
332 | 202 | } | 241 | } |
333 | @@ -252,7 +291,7 @@ | |||
334 | 252 | } | 291 | } |
335 | 253 | } | 292 | } |
336 | 254 | 293 | ||
338 | 255 | UbuntuListView { | 294 | ListView { |
339 | 256 | id: episodeList | 295 | id: episodeList |
340 | 257 | 296 | ||
341 | 258 | Component.onCompleted: { | 297 | Component.onCompleted: { |
342 | @@ -264,23 +303,21 @@ | |||
343 | 264 | } | 303 | } |
344 | 265 | 304 | ||
345 | 266 | anchors { | 305 | anchors { |
347 | 267 | top: whatsNewPage.header.bottom | 306 | top: episodesPage.header.bottom |
348 | 268 | left: parent.left | 307 | left: parent.left |
349 | 269 | right: parent.right | 308 | right: parent.right |
350 | 270 | bottom: parent.bottom | 309 | bottom: parent.bottom |
351 | 271 | } | 310 | } |
352 | 272 | 311 | ||
353 | 273 | clip: true | 312 | clip: true |
354 | 274 | |||
355 | 275 | model: sortedEpisodeModel | 313 | model: sortedEpisodeModel |
356 | 276 | currentIndex: -1 | ||
357 | 277 | section.property: "diff" | 314 | section.property: "diff" |
358 | 278 | section.labelPositioning: ViewSection.InlineLabels | 315 | section.labelPositioning: ViewSection.InlineLabels |
359 | 279 | 316 | ||
360 | 280 | section.delegate: Rectangle { | 317 | section.delegate: Rectangle { |
361 | 281 | width: parent.width | 318 | width: parent.width |
362 | 282 | color: "Transparent" | 319 | color: "Transparent" |
364 | 283 | height: header.implicitHeight + units.gu(2) | 320 | height: header.text !== "" ? header.implicitHeight + units.gu(2) : units.gu(0) |
365 | 284 | Label { | 321 | Label { |
366 | 285 | id: header | 322 | id: header |
367 | 286 | anchors { | 323 | anchors { |
368 | @@ -299,8 +336,13 @@ | |||
369 | 299 | return i18n.tr("Yesterday") | 336 | return i18n.tr("Yesterday") |
370 | 300 | } | 337 | } |
371 | 301 | 338 | ||
373 | 302 | else if (section === "Older") | 339 | else if (section === "Older") { |
374 | 303 | return i18n.tr("Older") | 340 | return i18n.tr("Older") |
375 | 341 | } | ||
376 | 342 | |||
377 | 343 | else { | ||
378 | 344 | return "" | ||
379 | 345 | } | ||
380 | 304 | } | 346 | } |
381 | 305 | } | 347 | } |
382 | 306 | } | 348 | } |
383 | @@ -372,24 +414,36 @@ | |||
384 | 372 | db.transaction(function (tx) { | 414 | db.transaction(function (tx) { |
385 | 373 | tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [model.guid]); | 415 | tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [model.guid]); |
386 | 374 | }); | 416 | }); |
388 | 375 | whatsNewModel.setProperty(model.index, "downloadedfile", "") | 417 | episodesModel.setProperty(model.index, "downloadedfile", "") |
389 | 418 | if (episodesPageHeaderSections.selectedIndex === 1) { | ||
390 | 419 | episodesModel.remove(model.index, 1) | ||
391 | 420 | } | ||
392 | 376 | } else { | 421 | } else { |
393 | 377 | db.transaction(function (tx) { | 422 | db.transaction(function (tx) { |
394 | 378 | tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [model.guid]); | 423 | tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [model.guid]); |
395 | 379 | }); | 424 | }); |
397 | 380 | whatsNewModel.setProperty(model.index, "queued", 1) | 425 | episodesModel.setProperty(model.index, "queued", 1) |
398 | 381 | downloader.addDownload(model.guid, model.audiourl); | 426 | downloader.addDownload(model.guid, model.audiourl); |
399 | 382 | } | 427 | } |
400 | 383 | } | 428 | } |
401 | 384 | }, | 429 | }, |
402 | 385 | 430 | ||
403 | 386 | Action { | 431 | Action { |
405 | 387 | iconName: "select" | 432 | iconName: model.listened ? "view-collapse" : "select" |
406 | 388 | onTriggered: { | 433 | onTriggered: { |
407 | 389 | var db = Podcasts.init(); | 434 | var db = Podcasts.init(); |
408 | 390 | db.transaction(function (tx) { | 435 | db.transaction(function (tx) { |
411 | 391 | tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid]) | 436 | if (model.listened) { |
412 | 392 | whatsNewModel.remove(model.index, 1) | 437 | tx.executeSql("UPDATE Episode SET listened=0 WHERE guid=?", [model.guid]) |
413 | 438 | episodesModel.setProperty(model.index, "listened", 0) | ||
414 | 439 | } | ||
415 | 440 | else { | ||
416 | 441 | tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid]) | ||
417 | 442 | episodesModel.setProperty(model.index, "listened", 1) | ||
418 | 443 | if (episodesPage.head.sections.selectedIndex === 0) { | ||
419 | 444 | episodesModel.remove(model.index, 1) | ||
420 | 445 | } | ||
421 | 446 | } | ||
422 | 393 | }); | 447 | }); |
423 | 394 | } | 448 | } |
424 | 395 | }, | 449 | }, |
425 | @@ -397,7 +451,7 @@ | |||
426 | 397 | Action { | 451 | Action { |
427 | 398 | iconName: "info" | 452 | iconName: "info" |
428 | 399 | onTriggered: { | 453 | onTriggered: { |
430 | 400 | var popup = PopupUtils.open(episodeDescriptionDialog, whatsNewTab); | 454 | var popup = PopupUtils.open(episodeDescriptionDialog, episodesTab); |
431 | 401 | popup.description = model.description | 455 | popup.description = model.description |
432 | 402 | } | 456 | } |
433 | 403 | } | 457 | } |
434 | @@ -437,44 +491,70 @@ | |||
435 | 437 | } | 491 | } |
436 | 438 | 492 | ||
437 | 439 | function refreshModel() { | 493 | function refreshModel() { |
447 | 440 | var today = new Date() | 494 | var i, j, episode |
439 | 441 | var dayToMs = 86400000; //1 * 24 * 60 * 60 * 1000 | ||
440 | 442 | var i, j, episode, diff | ||
441 | 443 | var todayCount, yesterdayCount | ||
442 | 444 | |||
443 | 445 | whatsNewModel.clear() | ||
444 | 446 | todayCount = 0 | ||
445 | 447 | yesterdayCount = 0 | ||
446 | 448 | |||
448 | 449 | var db = Podcasts.init() | 495 | var db = Podcasts.init() |
477 | 450 | db.transaction(function (tx) { | 496 | |
478 | 451 | var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC"); | 497 | episodesModel.clear() |
479 | 452 | for (i=0; i < rs.rows.length; i++) { | 498 | |
480 | 453 | var podcast = rs.rows.item(i); | 499 | // Episode Model for the what's new view |
481 | 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) { |
482 | 455 | for (j=0; j < rs2.rows.length; j++) { | 501 | var today = new Date() |
483 | 456 | episode = rs2.rows.item(j) | 502 | var dayToMs = 86400000; //1 * 24 * 60 * 60 * 1000 |
484 | 457 | diff = Math.floor((today - episode.published)/dayToMs) | 503 | var todayCount, yesterdayCount, diff |
485 | 458 | if (diff < 7 && !episode.listened) { | 504 | |
486 | 459 | if (diff < 1) { | 505 | todayCount = 0 |
487 | 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 |
488 | 461 | todayCount++; | 507 | |
489 | 462 | } else if (diff < 2) { | 508 | db.transaction(function (tx) { |
490 | 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"); |
491 | 464 | yesterdayCount++; | 510 | for (i=0; i < rs.rows.length; i++) { |
492 | 465 | } else { | 511 | var podcast = rs.rows.item(i); |
493 | 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]); |
494 | 467 | } | 513 | for (j=0; j < rs2.rows.length; j++) { |
495 | 468 | } else if (diff >= 7){ | 514 | episode = rs2.rows.item(j) |
496 | 469 | break | 515 | diff = Math.floor((today - episode.published)/dayToMs) |
497 | 470 | } | 516 | if (diff < 7 && !episode.listened) { |
498 | 471 | } | 517 | if (diff < 1) { |
499 | 472 | 518 | 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"}) | |
500 | 473 | if (podcast.lastupdate === null && !episodesUpdating) { | 519 | todayCount++; |
501 | 474 | updateEpisodesDatabase(); | 520 | } else if (diff < 2) { |
502 | 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"}) |
503 | 476 | } | 522 | yesterdayCount++; |
504 | 477 | }); | 523 | } else { |
505 | 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"}) | ||
506 | 525 | } | ||
507 | 526 | } else if (diff >= 7){ | ||
508 | 527 | break | ||
509 | 528 | } | ||
510 | 529 | } | ||
511 | 530 | |||
512 | 531 | if (podcast.lastupdate === null && !episodesUpdating) { | ||
513 | 532 | updateEpisodesDatabase(); | ||
514 | 533 | } | ||
515 | 534 | } | ||
516 | 535 | }); | ||
517 | 536 | } | ||
518 | 537 | |||
519 | 538 | // Episode Model for the downloaded view | ||
520 | 539 | else if (episodesPageHeaderSections.selectedIndex === 1) { | ||
521 | 540 | db.transaction(function (tx) { | ||
522 | 541 | var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC"); | ||
523 | 542 | for (i=0; i < rs.rows.length; i++) { | ||
524 | 543 | var podcast = rs.rows.item(i); | ||
525 | 544 | var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]); | ||
526 | 545 | for (j=0; j < rs2.rows.length; j++) { | ||
527 | 546 | episode = rs2.rows.item(j) | ||
528 | 547 | if (episode.downloadedfile) { | ||
529 | 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"}) | ||
530 | 549 | } | ||
531 | 550 | } | ||
532 | 551 | |||
533 | 552 | if (podcast.lastupdate === null && !episodesUpdating) { | ||
534 | 553 | updateEpisodesDatabase(); | ||
535 | 554 | } | ||
536 | 555 | } | ||
537 | 556 | }); | ||
538 | 557 | } | ||
539 | 478 | 558 | ||
540 | 479 | episodesUpdating = false; | 559 | episodesUpdating = false; |
541 | 480 | } | 560 | } |
542 | 481 | 561 | ||
543 | === modified file 'app/ui/PodcastsTab.qml' | |||
544 | --- app/ui/PodcastsTab.qml 2016-03-04 10:40:54 +0000 | |||
545 | +++ app/ui/PodcastsTab.qml 2016-03-05 16:56:57 +0000 | |||
546 | @@ -61,10 +61,10 @@ | |||
547 | 61 | } | 61 | } |
548 | 62 | }, | 62 | }, |
549 | 63 | Action { | 63 | Action { |
552 | 64 | iconName: podbird.settings.showListView ? "view-grid-symbolic" : "view-list-symbolic" | 64 | iconName: "add" |
553 | 65 | text: podbird.settings.showListView ? i18n.tr("Grid View") : i18n.tr("List View") | 65 | text: i18n.tr("Add New Podcasts") |
554 | 66 | onTriggered: { | 66 | onTriggered: { |
556 | 67 | podbird.settings.showListView = !podbird.settings.showListView | 67 | mainStack.push(Qt.resolvedUrl("SearchPage.qml")) |
557 | 68 | } | 68 | } |
558 | 69 | } | 69 | } |
559 | 70 | ] | 70 | ] |
560 | @@ -86,21 +86,13 @@ | |||
561 | 86 | anchors.verticalCenter: parent.verticalCenter | 86 | anchors.verticalCenter: parent.verticalCenter |
562 | 87 | } | 87 | } |
563 | 88 | 88 | ||
565 | 89 | trailingActionBar.actions: [ | 89 | leadingActionBar.actions: [ |
566 | 90 | Action { | 90 | Action { |
569 | 91 | iconName: "edit-clear" | 91 | iconName: "back" |
568 | 92 | text: i18n.tr("Cancel") | ||
570 | 93 | onTriggered: { | 92 | onTriggered: { |
571 | 94 | viewLoader.item.forceActiveFocus() | 93 | viewLoader.item.forceActiveFocus() |
572 | 95 | podcastPage.header = standardHeader | 94 | podcastPage.header = standardHeader |
573 | 96 | } | 95 | } |
574 | 97 | }, | ||
575 | 98 | Action { | ||
576 | 99 | iconName: podbird.settings.showListView ? "view-grid-symbolic" : "view-list-symbolic" | ||
577 | 100 | text: podbird.settings.showListView ? i18n.tr("Grid View") : i18n.tr("List View") | ||
578 | 101 | onTriggered: { | ||
579 | 102 | podbird.settings.showListView = !podbird.settings.showListView | ||
580 | 103 | } | ||
581 | 104 | } | 96 | } |
582 | 105 | ] | 97 | ] |
583 | 106 | } | 98 | } |
584 | 107 | 99 | ||
585 | === modified file 'app/ui/SearchPage.qml' | |||
586 | --- app/ui/SearchPage.qml 2016-03-04 10:40:54 +0000 | |||
587 | +++ app/ui/SearchPage.qml 2016-03-05 16:56:57 +0000 | |||
588 | @@ -28,10 +28,6 @@ | |||
589 | 28 | 28 | ||
590 | 29 | property var xhr: new XMLHttpRequest; | 29 | property var xhr: new XMLHttpRequest; |
591 | 30 | 30 | ||
592 | 31 | TabsList { | ||
593 | 32 | id: tabsList | ||
594 | 33 | } | ||
595 | 34 | |||
596 | 35 | header: standardHeader | 31 | header: standardHeader |
597 | 36 | 32 | ||
598 | 37 | PageHeader { | 33 | PageHeader { |
599 | @@ -44,11 +40,6 @@ | |||
600 | 44 | backgroundColor: podbird.appTheme.background | 40 | backgroundColor: podbird.appTheme.background |
601 | 45 | } | 41 | } |
602 | 46 | 42 | ||
603 | 47 | leadingActionBar { | ||
604 | 48 | numberOfSlots: 0 | ||
605 | 49 | actions: tabsList.actions | ||
606 | 50 | } | ||
607 | 51 | |||
608 | 52 | trailingActionBar.actions: [ | 43 | trailingActionBar.actions: [ |
609 | 53 | Action { | 44 | Action { |
610 | 54 | iconName: "search" | 45 | iconName: "search" |
611 | @@ -87,10 +78,9 @@ | |||
612 | 87 | anchors.verticalCenter: parent.verticalCenter | 78 | anchors.verticalCenter: parent.verticalCenter |
613 | 88 | } | 79 | } |
614 | 89 | 80 | ||
616 | 90 | trailingActionBar.actions: [ | 81 | leadingActionBar.actions: [ |
617 | 91 | Action { | 82 | Action { |
620 | 92 | iconName: "edit-clear" | 83 | iconName: "back" |
619 | 93 | text: i18n.tr("Cancel") | ||
621 | 94 | onTriggered: { | 84 | onTriggered: { |
622 | 95 | resultsView.forceActiveFocus() | 85 | resultsView.forceActiveFocus() |
623 | 96 | searchResults.clear() | 86 | searchResults.clear() |
624 | @@ -294,7 +284,7 @@ | |||
625 | 294 | } | 284 | } |
626 | 295 | }); | 285 | }); |
627 | 296 | } | 286 | } |
629 | 297 | tabs.selectedTabIndex = 1; | 287 | mainStack.pop(); |
630 | 298 | } | 288 | } |
631 | 299 | } | 289 | } |
632 | 300 | } | 290 | } |
633 | @@ -443,7 +433,7 @@ | |||
634 | 443 | Podcasts.subscribe(artist, name, feed, image); | 433 | Podcasts.subscribe(artist, name, feed, image); |
635 | 444 | imageDownloader.feed = feed; | 434 | imageDownloader.feed = feed; |
636 | 445 | imageDownloader.download(image); | 435 | imageDownloader.download(image); |
638 | 446 | tabs.selectedTabIndex = 1; | 436 | mainStack.pop(); |
639 | 447 | } else { | 437 | } else { |
640 | 448 | PopupUtils.open(subscribeFailedDialog); | 438 | PopupUtils.open(subscribeFailedDialog); |
641 | 449 | searchPage.header = addHeader | 439 | searchPage.header = addHeader |
642 | 450 | 440 | ||
643 | === modified file 'app/ui/SettingsPage.qml' | |||
644 | --- app/ui/SettingsPage.qml 2016-03-04 10:40:54 +0000 | |||
645 | +++ app/ui/SettingsPage.qml 2016-03-05 16:56:57 +0000 | |||
646 | @@ -146,6 +146,20 @@ | |||
647 | 146 | onClicked: mainStack.push(Qt.resolvedUrl("../settings/ThemeSetting.qml")) | 146 | onClicked: mainStack.push(Qt.resolvedUrl("../settings/ThemeSetting.qml")) |
648 | 147 | } | 147 | } |
649 | 148 | 148 | ||
650 | 149 | ListItem { | ||
651 | 150 | ListItemLayout { | ||
652 | 151 | id: gridViewLayout | ||
653 | 152 | title.text: i18n.tr("Displays podcasts in a list view") | ||
654 | 153 | Switch { | ||
655 | 154 | SlotsLayout.position: SlotsLayout.Last | ||
656 | 155 | checked: podbird.settings.showListView | ||
657 | 156 | onClicked: podbird.settings.showListView = checked | ||
658 | 157 | } | ||
659 | 158 | } | ||
660 | 159 | divider.visible: false | ||
661 | 160 | height: gridViewLayout.height | ||
662 | 161 | } | ||
663 | 162 | |||
664 | 149 | HeaderListItem { | 163 | HeaderListItem { |
665 | 150 | title.text: i18n.tr("Playback Settings") | 164 | title.text: i18n.tr("Playback Settings") |
666 | 151 | } | 165 | } |
667 | 152 | 166 | ||
668 | === modified file 'po/podbird.nik90.pot' | |||
669 | --- po/podbird.nik90.pot 2016-03-04 10:40:54 +0000 | |||
670 | +++ po/podbird.nik90.pot 2016-03-05 16:56:57 +0000 | |||
671 | @@ -8,7 +8,7 @@ | |||
672 | 8 | msgstr "" | 8 | msgstr "" |
673 | 9 | "Project-Id-Version: \n" | 9 | "Project-Id-Version: \n" |
674 | 10 | "Report-Msgid-Bugs-To: \n" | 10 | "Report-Msgid-Bugs-To: \n" |
676 | 11 | "POT-Creation-Date: 2016-03-04 16:09+0530\n" | 11 | "POT-Creation-Date: 2016-03-05 22:22+0530\n" |
677 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
678 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
679 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
680 | @@ -18,7 +18,7 @@ | |||
681 | 18 | "Content-Transfer-Encoding: 8bit\n" | 18 | "Content-Transfer-Encoding: 8bit\n" |
682 | 19 | "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" | 19 | "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
683 | 20 | 20 | ||
685 | 21 | #: ../app/components/TabsList.qml:29 ../app/ui/WhatsNewTab.qml:48 | 21 | #: ../app/components/TabsList.qml:29 ../app/ui/EpisodesTab.qml:135 |
686 | 22 | msgid "What's New" | 22 | msgid "What's New" |
687 | 23 | msgstr "" | 23 | msgstr "" |
688 | 24 | 24 | ||
689 | @@ -26,11 +26,7 @@ | |||
690 | 26 | msgid "Podcasts" | 26 | msgid "Podcasts" |
691 | 27 | msgstr "" | 27 | msgstr "" |
692 | 28 | 28 | ||
698 | 29 | #: ../app/components/TabsList.qml:45 ../app/ui/SearchPage.qml:41 | 29 | #: ../app/components/TabsList.qml:45 ../app/ui/SettingsPage.qml:32 |
694 | 30 | msgid "Add New Podcasts" | ||
695 | 31 | msgstr "" | ||
696 | 32 | |||
697 | 33 | #: ../app/components/TabsList.qml:53 ../app/ui/SettingsPage.qml:32 | ||
699 | 34 | msgid "Settings" | 30 | msgid "Settings" |
700 | 35 | msgstr "" | 31 | msgstr "" |
701 | 36 | 32 | ||
702 | @@ -65,7 +61,7 @@ | |||
703 | 65 | 61 | ||
704 | 66 | #. TRANSLATORS: About as in information about the app | 62 | #. TRANSLATORS: About as in information about the app |
705 | 67 | #: ../app/settings/About.qml:28 ../app/settings/About.qml:47 | 63 | #: ../app/settings/About.qml:28 ../app/settings/About.qml:47 |
707 | 68 | #: ../app/ui/SettingsPage.qml:208 | 64 | #: ../app/ui/SettingsPage.qml:222 |
708 | 69 | msgid "About" | 65 | msgid "About" |
709 | 70 | msgstr "" | 66 | msgstr "" |
710 | 71 | 67 | ||
711 | @@ -143,7 +139,7 @@ | |||
712 | 143 | #: ../app/settings/DownloadSetting.qml:34 | 139 | #: ../app/settings/DownloadSetting.qml:34 |
713 | 144 | #: ../app/settings/DownloadSetting.qml:35 | 140 | #: ../app/settings/DownloadSetting.qml:35 |
714 | 145 | #: ../app/settings/DownloadSetting.qml:36 | 141 | #: ../app/settings/DownloadSetting.qml:36 |
716 | 146 | #: ../app/settings/DownloadSetting.qml:37 ../app/ui/EpisodesPage.qml:347 | 142 | #: ../app/settings/DownloadSetting.qml:37 ../app/ui/EpisodesPage.qml:344 |
717 | 147 | #, qt-format | 143 | #, qt-format |
718 | 148 | msgid "%1 episode" | 144 | msgid "%1 episode" |
719 | 149 | msgid_plural "%1 episodes" | 145 | msgid_plural "%1 episodes" |
720 | @@ -168,68 +164,106 @@ | |||
721 | 168 | msgid "Podcast" | 164 | msgid "Podcast" |
722 | 169 | msgstr "" | 165 | msgstr "" |
723 | 170 | 166 | ||
725 | 171 | #: ../app/ui/EpisodesPage.qml:74 ../app/ui/WhatsNewTab.qml:62 | 167 | #: ../app/ui/EpisodesPage.qml:74 ../app/ui/EpisodesTab.qml:62 |
726 | 172 | msgid "Search Episode" | 168 | msgid "Search Episode" |
727 | 173 | msgstr "" | 169 | msgstr "" |
728 | 174 | 170 | ||
730 | 175 | #: ../app/ui/EpisodesPage.qml:83 ../app/ui/WhatsNewTab.qml:71 | 171 | #: ../app/ui/EpisodesPage.qml:83 ../app/ui/EpisodesTab.qml:72 |
731 | 176 | msgid "Mark all listened" | 172 | msgid "Mark all listened" |
732 | 177 | msgstr "" | 173 | msgstr "" |
733 | 178 | 174 | ||
736 | 179 | #: ../app/ui/EpisodesPage.qml:94 ../app/ui/EpisodesPage.qml:188 | 175 | #: ../app/ui/EpisodesPage.qml:94 ../app/ui/EpisodesPage.qml:185 |
737 | 180 | #: ../app/ui/SearchPage.qml:276 | 176 | #: ../app/ui/SearchPage.qml:266 |
738 | 181 | msgid "Unsubscribe" | 177 | msgid "Unsubscribe" |
739 | 182 | msgstr "" | 178 | msgstr "" |
740 | 183 | 179 | ||
749 | 184 | #: ../app/ui/EpisodesPage.qml:111 ../app/ui/EpisodesPage.qml:205 | 180 | #: ../app/ui/EpisodesPage.qml:137 ../app/ui/EpisodesTab.qml:173 |
742 | 185 | #: ../app/ui/PodcastsTab.qml:92 ../app/ui/SearchPage.qml:93 | ||
743 | 186 | #: ../app/ui/SearchPage.qml:131 ../app/ui/SettingsPage.qml:83 | ||
744 | 187 | #: ../app/ui/SettingsPage.qml:118 ../app/ui/WhatsNewTab.qml:121 | ||
745 | 188 | msgid "Cancel" | ||
746 | 189 | msgstr "" | ||
747 | 190 | |||
748 | 191 | #: ../app/ui/EpisodesPage.qml:140 ../app/ui/WhatsNewTab.qml:134 | ||
750 | 192 | msgid "Search episode" | 181 | msgid "Search episode" |
751 | 193 | msgstr "" | 182 | msgstr "" |
752 | 194 | 183 | ||
754 | 195 | #: ../app/ui/EpisodesPage.qml:185 | 184 | #: ../app/ui/EpisodesPage.qml:182 |
755 | 196 | msgid "Unsubscribe Confirmation" | 185 | msgid "Unsubscribe Confirmation" |
756 | 197 | msgstr "" | 186 | msgstr "" |
757 | 198 | 187 | ||
759 | 199 | #: ../app/ui/EpisodesPage.qml:186 | 188 | #: ../app/ui/EpisodesPage.qml:183 |
760 | 200 | #, qt-format | 189 | #, qt-format |
761 | 201 | msgid "Are you sure you want to unsubscribe from <b>%1</b>?" | 190 | msgid "Are you sure you want to unsubscribe from <b>%1</b>?" |
762 | 202 | msgstr "" | 191 | msgstr "" |
763 | 203 | 192 | ||
765 | 204 | #: ../app/ui/EpisodesPage.qml:227 ../app/ui/WhatsNewTab.qml:234 | 193 | #: ../app/ui/EpisodesPage.qml:202 ../app/ui/SearchPage.qml:121 |
766 | 194 | #: ../app/ui/SettingsPage.qml:83 ../app/ui/SettingsPage.qml:118 | ||
767 | 195 | msgid "Cancel" | ||
768 | 196 | msgstr "" | ||
769 | 197 | |||
770 | 198 | #: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:273 | ||
771 | 205 | msgid "Episode Description" | 199 | msgid "Episode Description" |
772 | 206 | msgstr "" | 200 | msgstr "" |
773 | 207 | 201 | ||
776 | 208 | #: ../app/ui/EpisodesPage.qml:239 ../app/ui/SearchPage.qml:180 | 202 | #: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:285 |
777 | 209 | #: ../app/ui/WhatsNewTab.qml:246 | 203 | #: ../app/ui/SearchPage.qml:170 |
778 | 210 | msgid "Close" | 204 | msgid "Close" |
779 | 211 | msgstr "" | 205 | msgstr "" |
780 | 212 | 206 | ||
782 | 213 | #: ../app/ui/EpisodesPage.qml:267 | 207 | #: ../app/ui/EpisodesPage.qml:264 |
783 | 214 | msgid "No episodes found" | 208 | msgid "No episodes found" |
784 | 215 | msgstr "" | 209 | msgstr "" |
785 | 216 | 210 | ||
787 | 217 | #: ../app/ui/EpisodesPage.qml:268 | 211 | #: ../app/ui/EpisodesPage.qml:265 |
788 | 218 | msgid "No episodes found matching the search term." | 212 | msgid "No episodes found matching the search term." |
789 | 219 | msgstr "" | 213 | msgstr "" |
790 | 220 | 214 | ||
792 | 221 | #: ../app/ui/EpisodesPage.qml:364 | 215 | #: ../app/ui/EpisodesPage.qml:361 |
793 | 222 | msgid "Unheard" | 216 | msgid "Unheard" |
794 | 223 | msgstr "" | 217 | msgstr "" |
795 | 224 | 218 | ||
797 | 225 | #: ../app/ui/EpisodesPage.qml:391 | 219 | #: ../app/ui/EpisodesPage.qml:388 |
798 | 226 | msgid "Listened" | 220 | msgid "Listened" |
799 | 227 | msgstr "" | 221 | msgstr "" |
800 | 228 | 222 | ||
802 | 229 | #: ../app/ui/EpisodesPage.qml:416 | 223 | #: ../app/ui/EpisodesPage.qml:413 ../app/ui/EpisodesTab.qml:135 |
803 | 230 | msgid "Downloaded" | 224 | msgid "Downloaded" |
804 | 231 | msgstr "" | 225 | msgstr "" |
805 | 232 | 226 | ||
806 | 227 | #: ../app/ui/EpisodesTab.qml:48 | ||
807 | 228 | msgid "Episodes" | ||
808 | 229 | msgstr "" | ||
809 | 230 | |||
810 | 231 | #: ../app/ui/EpisodesTab.qml:87 | ||
811 | 232 | msgid "Download all" | ||
812 | 233 | msgstr "" | ||
813 | 234 | |||
814 | 235 | #: ../app/ui/EpisodesTab.qml:104 | ||
815 | 236 | msgid "Delete all" | ||
816 | 237 | msgstr "" | ||
817 | 238 | |||
818 | 239 | #: ../app/ui/EpisodesTab.qml:195 | ||
819 | 240 | msgid "No New Episodes" | ||
820 | 241 | msgstr "" | ||
821 | 242 | |||
822 | 243 | #: ../app/ui/EpisodesTab.qml:195 | ||
823 | 244 | msgid "No Episodes Found" | ||
824 | 245 | msgstr "" | ||
825 | 246 | |||
826 | 247 | #: ../app/ui/EpisodesTab.qml:196 | ||
827 | 248 | msgid "No more episodes to listen to!" | ||
828 | 249 | msgstr "" | ||
829 | 250 | |||
830 | 251 | #: ../app/ui/EpisodesTab.qml:196 | ||
831 | 252 | msgid "No Episodes found matching the search term." | ||
832 | 253 | msgstr "" | ||
833 | 254 | |||
834 | 255 | #: ../app/ui/EpisodesTab.qml:332 | ||
835 | 256 | msgid "Today" | ||
836 | 257 | msgstr "" | ||
837 | 258 | |||
838 | 259 | #: ../app/ui/EpisodesTab.qml:336 | ||
839 | 260 | msgid "Yesterday" | ||
840 | 261 | msgstr "" | ||
841 | 262 | |||
842 | 263 | #: ../app/ui/EpisodesTab.qml:340 | ||
843 | 264 | msgid "Older" | ||
844 | 265 | msgstr "" | ||
845 | 266 | |||
846 | 233 | #: ../app/ui/NowPlayingPage.qml:29 | 267 | #: ../app/ui/NowPlayingPage.qml:29 |
847 | 234 | msgid "Now Playing" | 268 | msgid "Now Playing" |
848 | 235 | msgstr "" | 269 | msgstr "" |
849 | @@ -246,106 +280,102 @@ | |||
850 | 246 | msgid "+%1s" | 280 | msgid "+%1s" |
851 | 247 | msgstr "" | 281 | msgstr "" |
852 | 248 | 282 | ||
855 | 249 | #: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:55 | 283 | #: ../app/ui/PodcastsTab.qml:57 ../app/ui/SearchPage.qml:46 |
856 | 250 | #: ../app/ui/SearchPage.qml:162 | 284 | #: ../app/ui/SearchPage.qml:152 |
857 | 251 | msgid "Search Podcast" | 285 | msgid "Search Podcast" |
858 | 252 | msgstr "" | 286 | msgstr "" |
859 | 253 | 287 | ||
869 | 254 | #: ../app/ui/PodcastsTab.qml:65 ../app/ui/PodcastsTab.qml:100 | 288 | #: ../app/ui/PodcastsTab.qml:65 ../app/ui/SearchPage.qml:37 |
870 | 255 | msgid "Grid View" | 289 | msgid "Add New Podcasts" |
871 | 256 | msgstr "" | 290 | msgstr "" |
872 | 257 | 291 | ||
873 | 258 | #: ../app/ui/PodcastsTab.qml:65 ../app/ui/PodcastsTab.qml:100 | 292 | #: ../app/ui/PodcastsTab.qml:104 |
865 | 259 | msgid "List View" | ||
866 | 260 | msgstr "" | ||
867 | 261 | |||
868 | 262 | #: ../app/ui/PodcastsTab.qml:112 | ||
874 | 263 | msgid "Search podcast" | 293 | msgid "Search podcast" |
875 | 264 | msgstr "" | 294 | msgstr "" |
876 | 265 | 295 | ||
878 | 266 | #: ../app/ui/PodcastsTab.qml:142 | 296 | #: ../app/ui/PodcastsTab.qml:134 |
879 | 267 | msgid "No Podcast Subscriptions" | 297 | msgid "No Podcast Subscriptions" |
880 | 268 | msgstr "" | 298 | msgstr "" |
881 | 269 | 299 | ||
883 | 270 | #: ../app/ui/PodcastsTab.qml:142 | 300 | #: ../app/ui/PodcastsTab.qml:134 |
884 | 271 | msgid "No Podcasts Found" | 301 | msgid "No Podcasts Found" |
885 | 272 | msgstr "" | 302 | msgstr "" |
886 | 273 | 303 | ||
888 | 274 | #: ../app/ui/PodcastsTab.qml:143 | 304 | #: ../app/ui/PodcastsTab.qml:135 |
889 | 275 | msgid "" | 305 | msgid "" |
890 | 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' " |
891 | 277 | "page to add some." | 307 | "page to add some." |
892 | 278 | msgstr "" | 308 | msgstr "" |
893 | 279 | 309 | ||
895 | 280 | #: ../app/ui/PodcastsTab.qml:144 ../app/ui/SearchPage.qml:210 | 310 | #: ../app/ui/PodcastsTab.qml:136 ../app/ui/SearchPage.qml:200 |
896 | 281 | msgid "No podcasts found matching the search term." | 311 | msgid "No podcasts found matching the search term." |
897 | 282 | msgstr "" | 312 | msgstr "" |
898 | 283 | 313 | ||
900 | 284 | #: ../app/ui/PodcastsTab.qml:182 ../app/ui/PodcastsTab.qml:230 | 314 | #: ../app/ui/PodcastsTab.qml:174 ../app/ui/PodcastsTab.qml:222 |
901 | 285 | #, qt-format | 315 | #, qt-format |
902 | 286 | msgid "%1 unheard episode" | 316 | msgid "%1 unheard episode" |
903 | 287 | msgid_plural "%1 unheard episodes" | 317 | msgid_plural "%1 unheard episodes" |
904 | 288 | msgstr[0] "" | 318 | msgstr[0] "" |
905 | 289 | msgstr[1] "" | 319 | msgstr[1] "" |
906 | 290 | 320 | ||
908 | 291 | #: ../app/ui/SearchPage.qml:63 | 321 | #: ../app/ui/SearchPage.qml:54 |
909 | 292 | msgid "Add Podcast" | 322 | msgid "Add Podcast" |
910 | 293 | msgstr "" | 323 | msgstr "" |
911 | 294 | 324 | ||
913 | 295 | #: ../app/ui/SearchPage.qml:123 | 325 | #: ../app/ui/SearchPage.qml:113 |
914 | 296 | msgid "Save Podcast" | 326 | msgid "Save Podcast" |
915 | 297 | msgstr "" | 327 | msgstr "" |
916 | 298 | 328 | ||
918 | 299 | #: ../app/ui/SearchPage.qml:150 | 329 | #: ../app/ui/SearchPage.qml:140 |
919 | 300 | msgid "Feed URL" | 330 | msgid "Feed URL" |
920 | 301 | msgstr "" | 331 | msgstr "" |
921 | 302 | 332 | ||
923 | 303 | #: ../app/ui/SearchPage.qml:177 | 333 | #: ../app/ui/SearchPage.qml:167 |
924 | 304 | msgid "Unable to subscribe" | 334 | msgid "Unable to subscribe" |
925 | 305 | msgstr "" | 335 | msgstr "" |
926 | 306 | 336 | ||
928 | 307 | #: ../app/ui/SearchPage.qml:178 | 337 | #: ../app/ui/SearchPage.qml:168 |
929 | 308 | msgid "Please check the URL and try again" | 338 | msgid "Please check the URL and try again" |
930 | 309 | msgstr "" | 339 | msgstr "" |
931 | 310 | 340 | ||
933 | 311 | #: ../app/ui/SearchPage.qml:208 | 341 | #: ../app/ui/SearchPage.qml:198 |
934 | 312 | msgid "Looking to add a new Podcast?" | 342 | msgid "Looking to add a new Podcast?" |
935 | 313 | msgstr "" | 343 | msgstr "" |
936 | 314 | 344 | ||
938 | 315 | #: ../app/ui/SearchPage.qml:208 | 345 | #: ../app/ui/SearchPage.qml:198 |
939 | 316 | msgid "No Podcasts found" | 346 | msgid "No Podcasts found" |
940 | 317 | msgstr "" | 347 | msgstr "" |
941 | 318 | 348 | ||
943 | 319 | #: ../app/ui/SearchPage.qml:209 | 349 | #: ../app/ui/SearchPage.qml:199 |
944 | 320 | msgid "" | 350 | msgid "" |
945 | 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" |
946 | 322 | msgstr "" | 352 | msgstr "" |
947 | 323 | 353 | ||
949 | 324 | #: ../app/ui/SearchPage.qml:276 | 354 | #: ../app/ui/SearchPage.qml:266 |
950 | 325 | msgid "Subscribe" | 355 | msgid "Subscribe" |
951 | 326 | msgstr "" | 356 | msgstr "" |
952 | 327 | 357 | ||
953 | 328 | #. TRANSLATORS: The first argument here is the date of when the podcast was last updated followed by | 358 | #. TRANSLATORS: The first argument here is the date of when the podcast was last updated followed by |
954 | 329 | #. the podcast description. | 359 | #. the podcast description. |
956 | 330 | #: ../app/ui/SearchPage.qml:315 | 360 | #: ../app/ui/SearchPage.qml:305 |
957 | 331 | #, qt-format | 361 | #, qt-format |
958 | 332 | msgid "" | 362 | msgid "" |
959 | 333 | "Last Updated: %1\n" | 363 | "Last Updated: %1\n" |
960 | 334 | "%2" | 364 | "%2" |
961 | 335 | msgstr "" | 365 | msgstr "" |
962 | 336 | 366 | ||
964 | 337 | #: ../app/ui/SearchPage.qml:372 | 367 | #: ../app/ui/SearchPage.qml:362 |
965 | 338 | msgid "Not Available" | 368 | msgid "Not Available" |
966 | 339 | msgstr "" | 369 | msgstr "" |
967 | 340 | 370 | ||
968 | 341 | #. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they | 371 | #. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they |
969 | 342 | #. want to seek forward when pressing on this button. | 372 | #. want to seek forward when pressing on this button. |
971 | 343 | #: ../app/ui/SettingsPage.qml:63 ../app/ui/SettingsPage.qml:155 | 373 | #: ../app/ui/SettingsPage.qml:63 ../app/ui/SettingsPage.qml:169 |
972 | 344 | msgid "Skip forward" | 374 | msgid "Skip forward" |
973 | 345 | msgstr "" | 375 | msgstr "" |
974 | 346 | 376 | ||
975 | 347 | #: ../app/ui/SettingsPage.qml:70 ../app/ui/SettingsPage.qml:105 | 377 | #: ../app/ui/SettingsPage.qml:70 ../app/ui/SettingsPage.qml:105 |
977 | 348 | #: ../app/ui/SettingsPage.qml:156 ../app/ui/SettingsPage.qml:163 | 378 | #: ../app/ui/SettingsPage.qml:170 ../app/ui/SettingsPage.qml:177 |
978 | 349 | #, qt-format | 379 | #, qt-format |
979 | 350 | msgid "%1 seconds" | 380 | msgid "%1 seconds" |
980 | 351 | msgstr "" | 381 | msgstr "" |
981 | @@ -356,7 +386,7 @@ | |||
982 | 356 | 386 | ||
983 | 357 | #. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they | 387 | #. TRANSLATORS: This strings refers to the seeking of the episode playback. Users can set how far they |
984 | 358 | #. want to seek backward when pressing on this button. | 388 | #. want to seek backward when pressing on this button. |
986 | 359 | #: ../app/ui/SettingsPage.qml:98 ../app/ui/SettingsPage.qml:162 | 389 | #: ../app/ui/SettingsPage.qml:98 ../app/ui/SettingsPage.qml:176 |
987 | 360 | msgid "Skip back" | 390 | msgid "Skip back" |
988 | 361 | msgstr "" | 391 | msgstr "" |
989 | 362 | 392 | ||
990 | @@ -366,73 +396,45 @@ | |||
991 | 366 | msgid "General Settings" | 396 | msgid "General Settings" |
992 | 367 | msgstr "" | 397 | msgstr "" |
993 | 368 | 398 | ||
995 | 369 | #: ../app/ui/SettingsPage.qml:150 | 399 | #: ../app/ui/SettingsPage.qml:152 |
996 | 400 | msgid "Displays podcasts in a list view" | ||
997 | 401 | msgstr "" | ||
998 | 402 | |||
999 | 403 | #: ../app/ui/SettingsPage.qml:164 | ||
1000 | 370 | msgid "Playback Settings" | 404 | msgid "Playback Settings" |
1001 | 371 | msgstr "" | 405 | msgstr "" |
1002 | 372 | 406 | ||
1004 | 373 | #: ../app/ui/SettingsPage.qml:168 | 407 | #: ../app/ui/SettingsPage.qml:182 |
1005 | 374 | msgid "Podcast Episode Settings" | 408 | msgid "Podcast Episode Settings" |
1006 | 375 | msgstr "" | 409 | msgstr "" |
1007 | 376 | 410 | ||
1009 | 377 | #: ../app/ui/SettingsPage.qml:174 | 411 | #: ../app/ui/SettingsPage.qml:188 |
1010 | 378 | msgid "Automatically delete old episodes" | 412 | msgid "Automatically delete old episodes" |
1011 | 379 | msgstr "" | 413 | msgstr "" |
1012 | 380 | 414 | ||
1014 | 381 | #: ../app/ui/SettingsPage.qml:176 | 415 | #: ../app/ui/SettingsPage.qml:190 |
1015 | 382 | msgid "" | 416 | msgid "" |
1016 | 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" |
1017 | 384 | msgstr "" | 418 | msgstr "" |
1018 | 385 | 419 | ||
1020 | 386 | #: ../app/ui/SettingsPage.qml:188 | 420 | #: ../app/ui/SettingsPage.qml:202 |
1021 | 387 | msgid "Automatically download new episodes" | 421 | msgid "Automatically download new episodes" |
1022 | 388 | msgstr "" | 422 | msgstr "" |
1023 | 389 | 423 | ||
1025 | 390 | #: ../app/ui/SettingsPage.qml:190 | 424 | #: ../app/ui/SettingsPage.qml:204 |
1026 | 391 | msgid "Default number of new episodes to download for each podcast" | 425 | msgid "Default number of new episodes to download for each podcast" |
1027 | 392 | msgstr "" | 426 | msgstr "" |
1028 | 393 | 427 | ||
1029 | 394 | #. TRANSLATORS: Shortened form of "Miscellaneous" which is shown to denote other setting options | 428 | #. TRANSLATORS: Shortened form of "Miscellaneous" which is shown to denote other setting options |
1030 | 395 | #. that doesn't fit into any other category. | 429 | #. that doesn't fit into any other category. |
1032 | 396 | #: ../app/ui/SettingsPage.qml:202 | 430 | #: ../app/ui/SettingsPage.qml:216 |
1033 | 397 | msgid "Misc." | 431 | msgid "Misc." |
1034 | 398 | msgstr "" | 432 | msgstr "" |
1035 | 399 | 433 | ||
1037 | 400 | #: ../app/ui/SettingsPage.qml:218 | 434 | #: ../app/ui/SettingsPage.qml:232 |
1038 | 401 | msgid "Report Bug" | 435 | msgid "Report Bug" |
1039 | 402 | msgstr "" | 436 | msgstr "" |
1040 | 403 | 437 | ||
1041 | 404 | #: ../app/ui/WhatsNewTab.qml:85 | ||
1042 | 405 | msgid "Download all" | ||
1043 | 406 | msgstr "" | ||
1044 | 407 | |||
1045 | 408 | #: ../app/ui/WhatsNewTab.qml:156 | ||
1046 | 409 | msgid "No New Episodes" | ||
1047 | 410 | msgstr "" | ||
1048 | 411 | |||
1049 | 412 | #: ../app/ui/WhatsNewTab.qml:156 | ||
1050 | 413 | msgid "No Episodes Found" | ||
1051 | 414 | msgstr "" | ||
1052 | 415 | |||
1053 | 416 | #: ../app/ui/WhatsNewTab.qml:157 | ||
1054 | 417 | msgid "No more episodes to listen to!" | ||
1055 | 418 | msgstr "" | ||
1056 | 419 | |||
1057 | 420 | #: ../app/ui/WhatsNewTab.qml:157 | ||
1058 | 421 | msgid "No Episodes found matching the search term." | ||
1059 | 422 | msgstr "" | ||
1060 | 423 | |||
1061 | 424 | #: ../app/ui/WhatsNewTab.qml:295 | ||
1062 | 425 | msgid "Today" | ||
1063 | 426 | msgstr "" | ||
1064 | 427 | |||
1065 | 428 | #: ../app/ui/WhatsNewTab.qml:299 | ||
1066 | 429 | msgid "Yesterday" | ||
1067 | 430 | msgstr "" | ||
1068 | 431 | |||
1069 | 432 | #: ../app/ui/WhatsNewTab.qml:303 | ||
1070 | 433 | msgid "Older" | ||
1071 | 434 | msgstr "" | ||
1072 | 435 | |||
1073 | 436 | #: ../app/welcomewizard/Slide1.qml:42 | 438 | #: ../app/welcomewizard/Slide1.qml:42 |
1074 | 437 | msgid "Welcome to Podbird" | 439 | msgid "Welcome to Podbird" |
1075 | 438 | msgstr "" | 440 | msgstr "" |