Merge lp:~nik90/podbird/add-batch-actions into lp:podbird/devel
- add-batch-actions
- Merge into devel
Proposed by
Nekhelesh Ramananthan
Status: | Merged |
---|---|
Merged at revision: | 134 |
Proposed branch: | lp:~nik90/podbird/add-batch-actions |
Merge into: | lp:podbird/devel |
Prerequisite: | lp:~nik90/podbird/migrate-to-download-manager |
Diff against target: |
685 lines (+315/-134) 7 files modified
app/components/CustomSectionHeader.qml (+47/-0) app/podbird.qml (+2/-2) app/podcasts.js (+1/-0) app/ui/EpisodesPage.qml (+2/-2) app/ui/EpisodesTab.qml (+209/-90) app/ui/Queue.qml (+0/-6) po/podbird.nik90.pot (+54/-34) |
To merge this branch: | bzr merge lp:~nik90/podbird/add-batch-actions |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Podbird Developers | Pending | ||
Review via email: mp+289237@code.launchpad.net |
Commit message
Description of the change
- Adds multiselect list view which allows users to quickly add/mark episodes as favourites, listened, add-to-queue, download, delete.
- Also fixes a bug where playlist doesn't show metadata of locally saved episodes.
To post a comment you must log in.
- 145. By Nekhelesh Ramananthan
-
removed unneeded select all signal
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === added file 'app/components/CustomSectionHeader.qml' |
2 | --- app/components/CustomSectionHeader.qml 1970-01-01 00:00:00 +0000 |
3 | +++ app/components/CustomSectionHeader.qml 2016-03-16 15:35:46 +0000 |
4 | @@ -0,0 +1,47 @@ |
5 | +/* |
6 | + * Copyright 2016 Podbird Team |
7 | + * |
8 | + * This file is part of Podbird. |
9 | + * |
10 | + * Podbird is free software; you can redistribute it and/or modify |
11 | + * it under the terms of the GNU General Public License as published by |
12 | + * the Free Software Foundation; version 3. |
13 | + * |
14 | + * Podbird is distributed in the hope that it will be useful, |
15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | + * GNU General Public License for more details. |
18 | + * |
19 | + * You should have received a copy of the GNU General Public License |
20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
21 | + */ |
22 | + |
23 | +import QtQuick 2.4 |
24 | +import Ubuntu.Components 1.3 |
25 | + |
26 | +Item { |
27 | + id: customSectionHeader |
28 | + |
29 | + property alias title: headerText.text |
30 | + |
31 | + height: headerText.text !== "" ? headerText.implicitHeight + divider.height + headerText.anchors.topMargin + headerText.anchors.bottomMargin |
32 | + : units.gu(0) |
33 | + |
34 | + anchors { left: parent.left; right: parent.right; margins: units.gu(2) } |
35 | + |
36 | + Label { |
37 | + id: headerText |
38 | + color: podbird.appTheme.baseText |
39 | + font.weight: Font.DemiBold |
40 | + anchors { top: parent.top; topMargin: units.gu(2); bottom: parent.bottom; bottomMargin: units.gu(2) } |
41 | + width: parent.width |
42 | + } |
43 | + |
44 | + Rectangle { |
45 | + id: divider |
46 | + color: settings.themeName === "Dark.qml" ? "#888888" : "#cdcdcd" |
47 | + width: parent.width |
48 | + height: units.dp(1) |
49 | + anchors.bottom: parent.bottom |
50 | + } |
51 | +} |
52 | |
53 | === modified file 'app/podbird.qml' |
54 | --- app/podbird.qml 2016-03-16 15:35:46 +0000 |
55 | +++ app/podbird.qml 2016-03-16 15:35:46 +0000 |
56 | @@ -221,16 +221,16 @@ |
57 | Podcasts.clearQueue() |
58 | |
59 | // Add episode to queue |
60 | - player.playlist.addItem(Qt.resolvedUrl(url)) |
61 | Podcasts.addItemToQueue(guid, image, name, artist, url) |
62 | + player.playlist.addItem(url) |
63 | |
64 | // Play episode |
65 | player.play() |
66 | } |
67 | |
68 | function addEpisodeToQueue(guid, image, name, artist, url) { |
69 | - player.playlist.addItem(Qt.resolvedUrl(url)) |
70 | Podcasts.addItemToQueue(guid, image, name, artist, url) |
71 | + player.playlist.addItem(url) |
72 | |
73 | // If added episode is the first one in the queue, then set the current metadata |
74 | // so that the bottom player controls will be shown, allowing the user to play |
75 | |
76 | === modified file 'app/podcasts.js' |
77 | --- app/podcasts.js 2016-03-16 15:35:46 +0000 |
78 | +++ app/podcasts.js 2016-03-16 15:35:46 +0000 |
79 | @@ -49,6 +49,7 @@ |
80 | var rs = tx.executeSql("INSERT OR REPLACE INTO Queue (ind, guid, image, name, artist, url) VALUES (?, ?, ?, ?, ?, ?)", [ind, guid, image, name, artist, url]); |
81 | if (rs.rowsAffected > 0) { |
82 | console.log("[LOG]: QUEUE add OK") |
83 | + console.log("[LOG]: URL Added to queue: " + url) |
84 | } else { |
85 | console.log("[LOG]: QUEUE add FAIL") |
86 | } |
87 | |
88 | === modified file 'app/ui/EpisodesPage.qml' |
89 | --- app/ui/EpisodesPage.qml 2016-03-16 15:35:46 +0000 |
90 | +++ app/ui/EpisodesPage.qml 2016-03-16 15:35:46 +0000 |
91 | @@ -518,7 +518,7 @@ |
92 | Action { |
93 | iconName: "add-to-playlist" |
94 | onTriggered: { |
95 | - var url = model.downloadedfile ? model.downloadedfile : model.audiourl |
96 | + var url = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl |
97 | player.addEpisodeToQueue(model.guid, model.image, model.name, model.artist, url) |
98 | } |
99 | }, |
100 | @@ -550,7 +550,7 @@ |
101 | onClicked: { |
102 | Haptics.play() |
103 | if (currentGuid !== model.guid) { |
104 | - currentUrl = model.downloadedfile ? model.downloadedfile : model.audiourl; |
105 | + currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl; |
106 | player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl) |
107 | } |
108 | } |
109 | |
110 | === modified file 'app/ui/EpisodesTab.qml' |
111 | --- app/ui/EpisodesTab.qml 2016-03-16 15:35:46 +0000 |
112 | +++ app/ui/EpisodesTab.qml 2016-03-16 15:35:46 +0000 |
113 | @@ -64,62 +64,6 @@ |
114 | episodesPage.header = searchHeader |
115 | searchField.item.forceActiveFocus() |
116 | } |
117 | - }, |
118 | - |
119 | - Action { |
120 | - iconName: "select" |
121 | - visible: episodesPageHeaderSections.selectedIndex === 0 |
122 | - text: i18n.tr("Mark all listened") |
123 | - onTriggered: { |
124 | - var db = Podcasts.init(); |
125 | - db.transaction(function (tx) { |
126 | - for (var i=0; i<episodesModel.count; i++) { |
127 | - tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodesModel.get(i).guid]); |
128 | - } |
129 | - episodesModel.clear() |
130 | - }); |
131 | - } |
132 | - }, |
133 | - |
134 | - Action { |
135 | - iconName: "save" |
136 | - visible: episodesPageHeaderSections.selectedIndex !== 1 |
137 | - text: i18n.tr("Download all") |
138 | - onTriggered: { |
139 | - var db = Podcasts.init(); |
140 | - db.transaction(function (tx) { |
141 | - for (var i=0; i<episodesModel.count; i++) { |
142 | - if (!episodesModel.get(i).downloadedfile) { |
143 | - episodesModel.setProperty(i, "queued", 1) |
144 | - tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodesModel.get(i).guid]); |
145 | - if (episodesModel.get(i).audiourl) { |
146 | - podbird.downloadEpisode(episodesModel.get(i).image, episodesModel.get(i).name, episodesModel.get(i).guid, episodesModel.get(i).audiourl) |
147 | - } else { |
148 | - console.log("[ERROR]: Invalid download url: " + episodesModel.get(i).audiourl) |
149 | - } |
150 | - } |
151 | - } |
152 | - }); |
153 | - } |
154 | - }, |
155 | - |
156 | - Action { |
157 | - iconName: "delete" |
158 | - text: i18n.tr("Delete all") |
159 | - visible: episodesPageHeaderSections.selectedIndex === 1 |
160 | - onTriggered: { |
161 | - var db = Podcasts.init(); |
162 | - db.transaction(function (tx) { |
163 | - for (var i=0; i<episodesModel.count; i++) { |
164 | - if (episodesModel.get(i).downloadedfile) { |
165 | - fileManager.deleteFile(episodesModel.get(i).downloadedfile); |
166 | - tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(i).guid]); |
167 | - episodesModel.setProperty(i, "downloadedfile", "") |
168 | - } |
169 | - } |
170 | - }); |
171 | - refreshModel(); |
172 | - } |
173 | } |
174 | ] |
175 | |
176 | @@ -177,6 +121,169 @@ |
177 | } |
178 | } |
179 | |
180 | + PageHeader { |
181 | + id: selectionHeader |
182 | + visible: episodeList.ViewItems.selectMode |
183 | + |
184 | + onVisibleChanged: { |
185 | + if (visible) { |
186 | + episodesPage.header = selectionHeader |
187 | + } |
188 | + } |
189 | + |
190 | + StyleHints { |
191 | + backgroundColor: podbird.appTheme.background |
192 | + } |
193 | + |
194 | + leadingActionBar.actions: [ |
195 | + Action { |
196 | + iconName: "back" |
197 | + text: i18n.tr("Back") |
198 | + onTriggered: { |
199 | + episodeList.closeSelection() |
200 | + } |
201 | + } |
202 | + ] |
203 | + |
204 | + trailingActionBar { |
205 | + numberOfSlots: 6 |
206 | + actions: [ |
207 | + Action { |
208 | + iconName: "select" |
209 | + text: i18n.tr("Mark Listened") |
210 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
211 | + onTriggered: { |
212 | + var db = Podcasts.init(); |
213 | + db.transaction(function (tx) { |
214 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
215 | + var index = episodeList.ViewItems.selectedIndices[i] |
216 | + tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodesModel.get(index).guid]); |
217 | + } |
218 | + }); |
219 | + |
220 | + refreshModel(); |
221 | + episodeList.closeSelection() |
222 | + } |
223 | + }, |
224 | + |
225 | + Action { |
226 | + iconName: "save" |
227 | + text: i18n.tr("Download episode(s)") |
228 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
229 | + visible: episodesPageHeaderSections.selectedIndex !== 1 |
230 | + |
231 | + onTriggered: { |
232 | + var db = Podcasts.init(); |
233 | + db.transaction(function (tx) { |
234 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
235 | + var index = episodeList.ViewItems.selectedIndices[i] |
236 | + if (!episodesModel.get(index).downloadedfile) { |
237 | + episodesModel.setProperty(index, "queued", 1) |
238 | + tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodesModel.get(index).guid]); |
239 | + if (episodesModel.get(index).audiourl) { |
240 | + podbird.downloadEpisode(episodesModel.get(index).image, episodesModel.get(index).name, episodesModel.get(index).guid, episodesModel.get(index).audiourl) |
241 | + } else { |
242 | + console.log("[ERROR]: Invalid download url: " + episodesModel.get(index).audiourl) |
243 | + } |
244 | + } |
245 | + } |
246 | + }); |
247 | + |
248 | + refreshModel(); |
249 | + episodeList.closeSelection() |
250 | + } |
251 | + }, |
252 | + |
253 | + Action { |
254 | + iconName: "delete" |
255 | + text: i18n.tr("Delete episode(s)") |
256 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
257 | + |
258 | + onTriggered: { |
259 | + var db = Podcasts.init(); |
260 | + db.transaction(function (tx) { |
261 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
262 | + var index = episodeList.ViewItems.selectedIndices[i] |
263 | + if (episodesModel.get(index).downloadedfile) { |
264 | + fileManager.deleteFile(episodesModel.get(index).downloadedfile); |
265 | + tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(index).guid]); |
266 | + episodesModel.setProperty(index, "downloadedfile", "") |
267 | + } |
268 | + } |
269 | + }); |
270 | + |
271 | + refreshModel(); |
272 | + episodeList.closeSelection() |
273 | + } |
274 | + }, |
275 | + |
276 | + Action { |
277 | + iconName: "like" |
278 | + text: i18n.tr("Favourite episode(s)") |
279 | + visible: episodesPageHeaderSections.selectedIndex !== 2 |
280 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
281 | + |
282 | + onTriggered: { |
283 | + var db = Podcasts.init(); |
284 | + db.transaction(function (tx) { |
285 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
286 | + var index = episodeList.ViewItems.selectedIndices[i] |
287 | + if (!episodesModel.get(index).favourited) { |
288 | + tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [episodesModel.get(index).guid]) |
289 | + episodesModel.setProperty(index, "favourited", 1) |
290 | + } |
291 | + } |
292 | + }); |
293 | + |
294 | + refreshModel(); |
295 | + episodeList.closeSelection() |
296 | + } |
297 | + }, |
298 | + |
299 | + Action { |
300 | + iconName: "unlike" |
301 | + text: i18n.tr("Unfavourite episode(s)") |
302 | + visible: episodesPageHeaderSections.selectedIndex === 2 |
303 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
304 | + |
305 | + onTriggered: { |
306 | + var db = Podcasts.init(); |
307 | + db.transaction(function (tx) { |
308 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
309 | + var index = episodeList.ViewItems.selectedIndices[i] |
310 | + if (episodesModel.get(index).favourited) { |
311 | + tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [episodesModel.get(index).guid]) |
312 | + episodesModel.setProperty(index, "favourited", 0) |
313 | + } |
314 | + } |
315 | + }); |
316 | + |
317 | + refreshModel(); |
318 | + episodeList.closeSelection() |
319 | + } |
320 | + }, |
321 | + |
322 | + Action { |
323 | + iconName: "add-to-playlist" |
324 | + text: i18n.tr("Add to queue") |
325 | + enabled: episodeList.ViewItems.selectedIndices.length !== 0 |
326 | + |
327 | + onTriggered: { |
328 | + for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) { |
329 | + var index = episodeList.ViewItems.selectedIndices[i] |
330 | + if (episodesModel.get(index).audiourl) { |
331 | + var url = episodesModel.get(index).downloadedfile ? "file://" + episodesModel.get(index).downloadedfile : episodesModel.get(index).audiourl |
332 | + player.addEpisodeToQueue(episodesModel.get(index).guid, episodesModel.get(index).image, episodesModel.get(index).name, episodesModel.get(index).artist, url) |
333 | + } |
334 | + } |
335 | + |
336 | + episodeList.closeSelection() |
337 | + } |
338 | + } |
339 | + ] |
340 | + } |
341 | + } |
342 | + |
343 | Loader { |
344 | id: emptyState |
345 | |
346 | @@ -319,6 +426,9 @@ |
347 | ListView { |
348 | id: episodeList |
349 | |
350 | + signal clearSelection() |
351 | + signal closeSelection() |
352 | + |
353 | Component.onCompleted: { |
354 | // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition |
355 | // for Flickable.maximumFlickVelocity and Flickable.flickDeceleration |
356 | @@ -342,8 +452,8 @@ |
357 | visible: height !== 0 |
358 | height: downloader.downloads.length > 0 && episodesPageHeaderSections.selectedIndex === 1 ? childrenRect.height : 0 |
359 | |
360 | - HeaderListItem { |
361 | - title.text: i18n.tr("Downloads in progress") |
362 | + CustomSectionHeader { |
363 | + title: i18n.tr("Downloads in progress") |
364 | } |
365 | |
366 | Repeater { |
367 | @@ -382,40 +492,31 @@ |
368 | } |
369 | } |
370 | |
371 | - HeaderListItem { |
372 | - title.text: i18n.tr("Downloaded episodes") |
373 | + CustomSectionHeader { |
374 | + title: i18n.tr("Downloaded episodes") |
375 | visible: sortedEpisodeModel.count !== 0 || episodesModel.count !== 0 |
376 | } |
377 | } |
378 | |
379 | section.property: "diff" |
380 | section.labelPositioning: ViewSection.InlineLabels |
381 | - section.delegate: ListItem { |
382 | - height: headerText.title.text !== "" ? headerText.height + divider.height : units.gu(0) |
383 | - divider.anchors.leftMargin: units.gu(2) |
384 | - divider.anchors.rightMargin: units.gu(2) |
385 | - |
386 | - ListItemLayout { |
387 | - id: headerText |
388 | - title.text: { |
389 | - if (section === "Today") { |
390 | - return i18n.tr("Today") |
391 | - } |
392 | - |
393 | - else if (section === "Yesterday") { |
394 | - return i18n.tr("Yesterday") |
395 | - } |
396 | - |
397 | - else if (section === "Older") { |
398 | - return i18n.tr("Older") |
399 | - } |
400 | - |
401 | - else { |
402 | - return "" |
403 | - } |
404 | - } |
405 | - title.color: podbird.appTheme.baseText |
406 | - title.font.weight: Font.DemiBold |
407 | + section.delegate: CustomSectionHeader { |
408 | + title: { |
409 | + if (section === "Today") { |
410 | + return i18n.tr("Today") |
411 | + } |
412 | + |
413 | + else if (section === "Yesterday") { |
414 | + return i18n.tr("Yesterday") |
415 | + } |
416 | + |
417 | + else if (section === "Older") { |
418 | + return i18n.tr("Older") |
419 | + } |
420 | + |
421 | + else { |
422 | + return "" |
423 | + } |
424 | } |
425 | } |
426 | |
427 | @@ -526,7 +627,7 @@ |
428 | Action { |
429 | iconName: "add-to-playlist" |
430 | onTriggered: { |
431 | - var url = model.downloadedfile ? model.downloadedfile : model.audiourl |
432 | + var url = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl |
433 | player.addEpisodeToQueue(model.guid, model.image, model.name, model.artist, url) |
434 | } |
435 | }, |
436 | @@ -563,11 +664,29 @@ |
437 | |
438 | onClicked: { |
439 | Haptics.play() |
440 | - if (currentGuid !== model.guid) { |
441 | - currentUrl = model.downloadedfile ? model.downloadedfile : model.audiourl; |
442 | - player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl) |
443 | + if (selectMode) { |
444 | + selected = !selected |
445 | + } else { |
446 | + if (currentGuid !== model.guid) { |
447 | + currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl; |
448 | + player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl) |
449 | + } |
450 | } |
451 | } |
452 | + |
453 | + onPressAndHold: { |
454 | + ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode |
455 | + } |
456 | + } |
457 | + |
458 | + onClearSelection: { |
459 | + ViewItems.selectedIndices = [] |
460 | + } |
461 | + |
462 | + onCloseSelection: { |
463 | + clearSelection() |
464 | + ViewItems.selectMode = false |
465 | + episodesPage.header = standardHeader |
466 | } |
467 | |
468 | Scrollbar { |
469 | |
470 | === modified file 'app/ui/Queue.qml' |
471 | --- app/ui/Queue.qml 2016-03-13 23:53:33 +0000 |
472 | +++ app/ui/Queue.qml 2016-03-16 15:35:46 +0000 |
473 | @@ -69,13 +69,7 @@ |
474 | onTriggered: { |
475 | player.playlist.removeItem(index) |
476 | var source = model.source |
477 | - |
478 | source = source.toString() |
479 | - |
480 | - if (source.indexOf("file://") === 0) { |
481 | - source = source.substring(7); |
482 | - } |
483 | - |
484 | Podcasts.removeItemFromQueue(source) |
485 | } |
486 | } |
487 | |
488 | === modified file 'po/podbird.nik90.pot' |
489 | --- po/podbird.nik90.pot 2016-03-16 15:35:46 +0000 |
490 | +++ po/podbird.nik90.pot 2016-03-16 15:35:46 +0000 |
491 | @@ -8,7 +8,7 @@ |
492 | msgstr "" |
493 | "Project-Id-Version: \n" |
494 | "Report-Msgid-Bugs-To: \n" |
495 | -"POT-Creation-Date: 2016-03-16 04:57+0530\n" |
496 | +"POT-Creation-Date: 2016-03-16 20:58+0530\n" |
497 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
498 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
499 | "Language-Team: LANGUAGE <LL@li.org>\n" |
500 | @@ -34,17 +34,17 @@ |
501 | msgid "Skip" |
502 | msgstr "" |
503 | |
504 | -#: ../app/podcasts.js:281 |
505 | +#: ../app/podcasts.js:282 |
506 | #, no-c-format, qt-format |
507 | msgid "%1 hr %2 min" |
508 | msgstr "" |
509 | |
510 | -#: ../app/podcasts.js:290 |
511 | +#: ../app/podcasts.js:291 |
512 | #, no-c-format, qt-format |
513 | msgid "%1 hr" |
514 | msgstr "" |
515 | |
516 | -#: ../app/podcasts.js:298 |
517 | +#: ../app/podcasts.js:299 |
518 | #, no-c-format, qt-format |
519 | msgid "%1 min" |
520 | msgstr "" |
521 | @@ -158,7 +158,7 @@ |
522 | msgid "Search Episode" |
523 | msgstr "" |
524 | |
525 | -#: ../app/ui/EpisodesPage.qml:82 ../app/ui/EpisodesTab.qml:72 |
526 | +#: ../app/ui/EpisodesPage.qml:82 |
527 | msgid "Mark all listened" |
528 | msgstr "" |
529 | |
530 | @@ -167,7 +167,7 @@ |
531 | msgid "Unsubscribe" |
532 | msgstr "" |
533 | |
534 | -#: ../app/ui/EpisodesPage.qml:136 ../app/ui/EpisodesTab.qml:176 |
535 | +#: ../app/ui/EpisodesPage.qml:136 ../app/ui/EpisodesTab.qml:120 |
536 | msgid "Search episode" |
537 | msgstr "" |
538 | |
539 | @@ -185,11 +185,11 @@ |
540 | msgid "Cancel" |
541 | msgstr "" |
542 | |
543 | -#: ../app/ui/EpisodesPage.qml:223 ../app/ui/EpisodesTab.qml:298 |
544 | +#: ../app/ui/EpisodesPage.qml:223 ../app/ui/EpisodesTab.qml:405 |
545 | msgid "Episode Description" |
546 | msgstr "" |
547 | |
548 | -#: ../app/ui/EpisodesPage.qml:235 ../app/ui/EpisodesTab.qml:310 |
549 | +#: ../app/ui/EpisodesPage.qml:235 ../app/ui/EpisodesTab.qml:417 |
550 | #: ../app/ui/SearchPage.qml:170 |
551 | msgid "Close" |
552 | msgstr "" |
553 | @@ -214,75 +214,95 @@ |
554 | msgid "Downloaded" |
555 | msgstr "" |
556 | |
557 | -#: ../app/ui/EpisodesTab.qml:87 |
558 | -msgid "Download all" |
559 | -msgstr "" |
560 | - |
561 | -#: ../app/ui/EpisodesTab.qml:108 |
562 | -msgid "Delete all" |
563 | -msgstr "" |
564 | - |
565 | -#: ../app/ui/EpisodesTab.qml:138 |
566 | +#: ../app/ui/EpisodesTab.qml:82 |
567 | msgid "Recent" |
568 | msgstr "" |
569 | |
570 | -#: ../app/ui/EpisodesTab.qml:138 |
571 | +#: ../app/ui/EpisodesTab.qml:82 |
572 | msgid "Downloads" |
573 | msgstr "" |
574 | |
575 | -#: ../app/ui/EpisodesTab.qml:138 |
576 | +#: ../app/ui/EpisodesTab.qml:82 |
577 | msgid "Favourites" |
578 | msgstr "" |
579 | |
580 | -#: ../app/ui/EpisodesTab.qml:201 |
581 | +#: ../app/ui/EpisodesTab.qml:141 |
582 | +msgid "Back" |
583 | +msgstr "" |
584 | + |
585 | +#: ../app/ui/EpisodesTab.qml:153 |
586 | +msgid "Mark Listened" |
587 | +msgstr "" |
588 | + |
589 | +#: ../app/ui/EpisodesTab.qml:171 |
590 | +msgid "Download episode(s)" |
591 | +msgstr "" |
592 | + |
593 | +#: ../app/ui/EpisodesTab.qml:199 |
594 | +msgid "Delete episode(s)" |
595 | +msgstr "" |
596 | + |
597 | +#: ../app/ui/EpisodesTab.qml:222 |
598 | +msgid "Favourite episode(s)" |
599 | +msgstr "" |
600 | + |
601 | +#: ../app/ui/EpisodesTab.qml:245 |
602 | +msgid "Unfavourite episode(s)" |
603 | +msgstr "" |
604 | + |
605 | +#: ../app/ui/EpisodesTab.qml:268 |
606 | +msgid "Add to queue" |
607 | +msgstr "" |
608 | + |
609 | +#: ../app/ui/EpisodesTab.qml:308 |
610 | msgid "No New Episodes" |
611 | msgstr "" |
612 | |
613 | -#: ../app/ui/EpisodesTab.qml:203 |
614 | +#: ../app/ui/EpisodesTab.qml:310 |
615 | msgid "No Downloaded Episodes" |
616 | msgstr "" |
617 | |
618 | -#: ../app/ui/EpisodesTab.qml:205 |
619 | +#: ../app/ui/EpisodesTab.qml:312 |
620 | msgid "No Favourited Episodes" |
621 | msgstr "" |
622 | |
623 | -#: ../app/ui/EpisodesTab.qml:207 |
624 | +#: ../app/ui/EpisodesTab.qml:314 |
625 | msgid "No Episodes Found" |
626 | msgstr "" |
627 | |
628 | -#: ../app/ui/EpisodesTab.qml:213 |
629 | +#: ../app/ui/EpisodesTab.qml:320 |
630 | msgid "No more episodes to listen to!" |
631 | msgstr "" |
632 | |
633 | -#: ../app/ui/EpisodesTab.qml:215 |
634 | +#: ../app/ui/EpisodesTab.qml:322 |
635 | msgid "No episodes have been downloaded for offline listening" |
636 | msgstr "" |
637 | |
638 | -#: ../app/ui/EpisodesTab.qml:217 |
639 | +#: ../app/ui/EpisodesTab.qml:324 |
640 | msgid "No episodes have been favourited." |
641 | msgstr "" |
642 | |
643 | -#: ../app/ui/EpisodesTab.qml:219 |
644 | +#: ../app/ui/EpisodesTab.qml:326 |
645 | msgid "No Episodes found matching the search term." |
646 | msgstr "" |
647 | |
648 | -#: ../app/ui/EpisodesTab.qml:346 |
649 | +#: ../app/ui/EpisodesTab.qml:457 |
650 | msgid "Downloads in progress" |
651 | msgstr "" |
652 | |
653 | -#: ../app/ui/EpisodesTab.qml:386 |
654 | +#: ../app/ui/EpisodesTab.qml:497 |
655 | msgid "Downloaded episodes" |
656 | msgstr "" |
657 | |
658 | -#: ../app/ui/EpisodesTab.qml:402 |
659 | +#: ../app/ui/EpisodesTab.qml:507 |
660 | msgid "Today" |
661 | msgstr "" |
662 | |
663 | -#: ../app/ui/EpisodesTab.qml:406 |
664 | +#: ../app/ui/EpisodesTab.qml:511 |
665 | msgid "Yesterday" |
666 | msgstr "" |
667 | |
668 | -#: ../app/ui/EpisodesTab.qml:410 |
669 | +#: ../app/ui/EpisodesTab.qml:515 |
670 | msgid "Older" |
671 | msgstr "" |
672 | |
673 | @@ -539,10 +559,10 @@ |
674 | msgid "Finish" |
675 | msgstr "" |
676 | |
677 | -#: /home/krnekhelesh/Development/add-download-manager-build/po/Podbird.desktop.in.h:1 |
678 | +#: /home/krnekhelesh/Development/add-batch-actions-build/po/Podbird.desktop.in.h:1 |
679 | msgid "The chirpiest podcast manager for Ubuntu" |
680 | msgstr "" |
681 | |
682 | -#: /home/krnekhelesh/Development/add-download-manager-build/po/Podbird.desktop.in.h:2 |
683 | +#: /home/krnekhelesh/Development/add-batch-actions-build/po/Podbird.desktop.in.h:2 |
684 | msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;" |
685 | msgstr "" |