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