Merge lp:~nik90/podbird/add-favourites-view into lp:podbird/devel
- add-favourites-view
- Merge into devel
Proposed by
Nekhelesh Ramananthan
Status: | Merged |
---|---|
Merged at revision: | 122 |
Proposed branch: | lp:~nik90/podbird/add-favourites-view |
Merge into: | lp:podbird/devel |
Diff against target: |
329 lines (+134/-35) 4 files modified
app/podcasts.js (+10/-8) app/ui/EpisodesPage.qml (+16/-2) app/ui/EpisodesTab.qml (+73/-10) po/podbird.nik90.pot (+35/-15) |
To merge this branch: | bzr merge lp:~nik90/podbird/add-favourites-view |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Podbird Developers | Pending | ||
Review via email: mp+288208@code.launchpad.net |
Commit message
Added the ability to favourite episodes and see a list of all favourited episodes.
Description of the change
Added the ability to favourite episodes and see a list of all favourited episodes.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'app/podcasts.js' |
2 | --- app/podcasts.js 2016-03-04 10:04:32 +0000 |
3 | +++ app/podcasts.js 2016-03-05 21:27:27 +0000 |
4 | @@ -21,17 +21,18 @@ |
5 | |
6 | db.transaction(function(tx) { |
7 | tx.executeSql('CREATE TABLE IF NOT EXISTS Podcast(artist TEXT, name TEXT, description TEXT, feed TEXT, image TEXT, lastupdate TIMESTAMP)'); |
8 | - tx.executeSql('CREATE TABLE IF NOT EXISTS Episode(guid TEXT, podcast INTEGER, name TEXT, subtitle TEXT, description TEXT, duration INTEGER, audiourl TEXT, downloadedfile TEXT, published TIMESTAMP, queued BOOLEAN, listened BOOLEAN, position INTEGER, FOREIGN KEY(podcast) REFERENCES Podcast(rowid))'); |
9 | + tx.executeSql('CREATE TABLE IF NOT EXISTS Episode(guid TEXT, podcast INTEGER, name TEXT, subtitle TEXT, description TEXT, duration INTEGER, audiourl TEXT, downloadedfile TEXT, published TIMESTAMP, queued BOOLEAN, listened BOOLEAN, favourited BOOLEAN, position INTEGER, FOREIGN KEY(podcast) REFERENCES Podcast(rowid))'); |
10 | }); |
11 | |
12 | /* |
13 | - Schema Upgrade to v1.1 which adds a new queued boolean variable which is needed to track the queued status |
14 | - of a episode properly. |
15 | + Schema Upgrade to v1.2 which adds a new favourited boolean variable which is needed to track the favourite status |
16 | + of an episode. |
17 | */ |
18 | - if (db.version == "1.0") { |
19 | - db.changeVersion("1.0", "1.1", function(tx) { |
20 | - tx.executeSql('ALTER TABLE Episode ADD queued BOOLEAN'); |
21 | - tx.executeSql('UPDATE Episode SET queued=0'); |
22 | + if (db.version != "1.2") { |
23 | + console.log("Upgrading database from %1 -> v1.2".arg(db.version)) |
24 | + db.changeVersion(db.version, "1.2", function(tx) { |
25 | + tx.executeSql('ALTER TABLE Episode ADD favourited BOOLEAN'); |
26 | + tx.executeSql('UPDATE Episode SET favourited=?', [false]); |
27 | }); |
28 | } |
29 | |
30 | @@ -110,13 +111,14 @@ |
31 | db.transaction(function(tx2) { |
32 | var ers = tx2.executeSql("SELECT rowid FROM Episode WHERE guid=?", [track.guid]); |
33 | if (ers.rows.length === 0) { |
34 | - tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?)", [pid, |
35 | + tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, favourited, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?, ?)", [pid, |
36 | track.name, |
37 | track.description, |
38 | track.audiourl, |
39 | track.guid, |
40 | false, |
41 | false, |
42 | + false, |
43 | track.duration, |
44 | track.published]); |
45 | } |
46 | |
47 | === modified file 'app/ui/EpisodesPage.qml' |
48 | --- app/ui/EpisodesPage.qml 2016-03-05 17:07:27 +0000 |
49 | +++ app/ui/EpisodesPage.qml 2016-03-05 21:27:27 +0000 |
50 | @@ -523,6 +523,20 @@ |
51 | }, |
52 | |
53 | Action { |
54 | + iconName: model.favourited ? "unlike" : "like" |
55 | + onTriggered: { |
56 | + var db = Podcasts.init(); |
57 | + db.transaction(function (tx) { |
58 | + if (model.favourited) |
59 | + tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid]) |
60 | + else |
61 | + tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid]) |
62 | + refreshModel(); |
63 | + }); |
64 | + } |
65 | + }, |
66 | + |
67 | + Action { |
68 | iconName: "info" |
69 | onTriggered: { |
70 | var popup = PopupUtils.open(episodeDescriptionDialog, episodesPage); |
71 | @@ -581,10 +595,10 @@ |
72 | for(i = 0; i < rs.rows.length; i++) { |
73 | episode = rs.rows.item(i); |
74 | if (!episode.listened) { |
75 | - episodeModel.insert(newCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued}); |
76 | + episodeModel.insert(newCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited}); |
77 | newCount++; |
78 | } else { |
79 | - episodeModel.insert(i,{"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued}); |
80 | + episodeModel.insert(i,{"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited}); |
81 | } |
82 | } |
83 | }); |
84 | |
85 | === modified file 'app/ui/EpisodesTab.qml' |
86 | --- app/ui/EpisodesTab.qml 2016-03-05 17:07:27 +0000 |
87 | +++ app/ui/EpisodesTab.qml 2016-03-05 21:27:27 +0000 |
88 | @@ -132,7 +132,7 @@ |
89 | selectedSectionColor: podbird.appTheme.focusText |
90 | } |
91 | |
92 | - model: [i18n.tr("What's New"), i18n.tr("Downloaded")] |
93 | + model: [i18n.tr("What's New"), i18n.tr("Downloaded"), i18n.tr("Favourites")] |
94 | onSelectedIndexChanged: { |
95 | refreshModel(); |
96 | } |
97 | @@ -192,8 +192,30 @@ |
98 | id: emptyStateComponent |
99 | EmptyState { |
100 | icon.source: episodesModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg") |
101 | - title: episodesModel.count === 0 ? i18n.tr("No New Episodes") : i18n.tr("No Episodes Found") |
102 | - subTitle: episodesModel.count === 0 ? i18n.tr("No more episodes to listen to!") : i18n.tr("No Episodes found matching the search term.") |
103 | + title: { |
104 | + if (episodesModel.count === 0 && episodesPage.header === standardHeader) { |
105 | + if (episodesPageHeaderSections.selectedIndex === 0) |
106 | + return i18n.tr("No New Episodes") |
107 | + else if (episodesPageHeaderSections.selectedIndex === 1) |
108 | + return i18n.tr("No Downloaded Episodes") |
109 | + else if (episodesPageHeaderSections.selectedIndex === 2) |
110 | + return i18n.tr("No Favourited Episodes") |
111 | + } else { |
112 | + return i18n.tr("No Episodes Found") |
113 | + } |
114 | + } |
115 | + subTitle: { |
116 | + if (episodesModel.count === 0 && episodesPage.header === standardHeader) { |
117 | + if (episodesPageHeaderSections.selectedIndex === 0) |
118 | + return i18n.tr("No more episodes to listen to!") |
119 | + else if (episodesPageHeaderSections.selectedIndex === 1) |
120 | + return i18n.tr("No episodes have been downloaded for offline listening") |
121 | + else if (episodesPageHeaderSections.selectedIndex === 2) |
122 | + return i18n.tr("No episodes have been favourited.") |
123 | + } else { |
124 | + return i18n.tr("No Episodes found matching the search term.") |
125 | + } |
126 | + } |
127 | } |
128 | } |
129 | |
130 | @@ -440,9 +462,29 @@ |
131 | else { |
132 | tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid]) |
133 | episodesModel.setProperty(model.index, "listened", 1) |
134 | - if (episodesPage.head.sections.selectedIndex === 0) { |
135 | - episodesModel.remove(model.index, 1) |
136 | - } |
137 | + if (episodesPageHeaderSections.selectedIndex === 0) { |
138 | + episodesModel.remove(model.index, 1) |
139 | + } |
140 | + } |
141 | + }); |
142 | + } |
143 | + }, |
144 | + |
145 | + Action { |
146 | + iconName: model.favourited ? "unlike" : "like" |
147 | + onTriggered: { |
148 | + var db = Podcasts.init(); |
149 | + db.transaction(function (tx) { |
150 | + if (model.favourited) { |
151 | + tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid]) |
152 | + episodesModel.setProperty(model.index, "favourited", 0) |
153 | + if (episodesPageHeaderSections.selectedIndex === 2) { |
154 | + episodesModel.remove(model.index, 1) |
155 | + } |
156 | + } |
157 | + else { |
158 | + tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid]) |
159 | + episodesModel.setProperty(model.index, "favourited", 1) |
160 | } |
161 | }); |
162 | } |
163 | @@ -515,13 +557,13 @@ |
164 | diff = Math.floor((today - episode.published)/dayToMs) |
165 | if (diff < 7 && !episode.listened) { |
166 | if (diff < 1) { |
167 | - episodesModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Today"}) |
168 | + episodesModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Today"}) |
169 | todayCount++; |
170 | } else if (diff < 2) { |
171 | - episodesModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Yesterday"}) |
172 | + episodesModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Yesterday"}) |
173 | yesterdayCount++; |
174 | } else { |
175 | - episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Older"}) |
176 | + episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Older"}) |
177 | } |
178 | } else if (diff >= 7){ |
179 | break |
180 | @@ -545,7 +587,28 @@ |
181 | for (j=0; j < rs2.rows.length; j++) { |
182 | episode = rs2.rows.item(j) |
183 | if (episode.downloadedfile) { |
184 | - episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Null"}) |
185 | + episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Null"}) |
186 | + } |
187 | + } |
188 | + |
189 | + if (podcast.lastupdate === null && !episodesUpdating) { |
190 | + updateEpisodesDatabase(); |
191 | + } |
192 | + } |
193 | + }); |
194 | + } |
195 | + |
196 | + // Episode Model for the favourites view |
197 | + else if (episodesPageHeaderSections.selectedIndex === 2) { |
198 | + db.transaction(function (tx) { |
199 | + var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC"); |
200 | + for (i=0; i < rs.rows.length; i++) { |
201 | + var podcast = rs.rows.item(i); |
202 | + var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]); |
203 | + for (j=0; j < rs2.rows.length; j++) { |
204 | + episode = rs2.rows.item(j) |
205 | + if (episode.favourited) { |
206 | + episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Null"}) |
207 | } |
208 | } |
209 | |
210 | |
211 | === modified file 'po/podbird.nik90.pot' |
212 | --- po/podbird.nik90.pot 2016-03-05 17:30:32 +0000 |
213 | +++ po/podbird.nik90.pot 2016-03-05 21:27:27 +0000 |
214 | @@ -8,7 +8,7 @@ |
215 | msgstr "" |
216 | "Project-Id-Version: \n" |
217 | "Report-Msgid-Bugs-To: \n" |
218 | -"POT-Creation-Date: 2016-03-05 22:39+0530\n" |
219 | +"POT-Creation-Date: 2016-03-06 01:51+0530\n" |
220 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
221 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
222 | "Language-Team: LANGUAGE <LL@li.org>\n" |
223 | @@ -44,17 +44,17 @@ |
224 | msgid "No podcasts listened to today" |
225 | msgstr "" |
226 | |
227 | -#: ../app/podcasts.js:180 |
228 | +#: ../app/podcasts.js:182 |
229 | #, no-c-format, qt-format |
230 | msgid "%1 hr %2 min" |
231 | msgstr "" |
232 | |
233 | -#: ../app/podcasts.js:189 |
234 | +#: ../app/podcasts.js:191 |
235 | #, no-c-format, qt-format |
236 | msgid "%1 hr" |
237 | msgstr "" |
238 | |
239 | -#: ../app/podcasts.js:197 |
240 | +#: ../app/podcasts.js:199 |
241 | #, no-c-format, qt-format |
242 | msgid "%1 min" |
243 | msgstr "" |
244 | @@ -195,11 +195,11 @@ |
245 | msgid "Cancel" |
246 | msgstr "" |
247 | |
248 | -#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:273 |
249 | +#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:295 |
250 | msgid "Episode Description" |
251 | msgstr "" |
252 | |
253 | -#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:285 |
254 | +#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:307 |
255 | #: ../app/ui/SearchPage.qml:170 |
256 | msgid "Close" |
257 | msgstr "" |
258 | @@ -236,31 +236,51 @@ |
259 | msgid "What's New" |
260 | msgstr "" |
261 | |
262 | -#: ../app/ui/EpisodesTab.qml:195 |
263 | +#: ../app/ui/EpisodesTab.qml:135 |
264 | +msgid "Favourites" |
265 | +msgstr "" |
266 | + |
267 | +#: ../app/ui/EpisodesTab.qml:198 |
268 | msgid "No New Episodes" |
269 | msgstr "" |
270 | |
271 | -#: ../app/ui/EpisodesTab.qml:195 |
272 | +#: ../app/ui/EpisodesTab.qml:200 |
273 | +msgid "No Downloaded Episodes" |
274 | +msgstr "" |
275 | + |
276 | +#: ../app/ui/EpisodesTab.qml:202 |
277 | +msgid "No Favourited Episodes" |
278 | +msgstr "" |
279 | + |
280 | +#: ../app/ui/EpisodesTab.qml:204 |
281 | msgid "No Episodes Found" |
282 | msgstr "" |
283 | |
284 | -#: ../app/ui/EpisodesTab.qml:196 |
285 | +#: ../app/ui/EpisodesTab.qml:210 |
286 | msgid "No more episodes to listen to!" |
287 | msgstr "" |
288 | |
289 | -#: ../app/ui/EpisodesTab.qml:196 |
290 | +#: ../app/ui/EpisodesTab.qml:212 |
291 | +msgid "No episodes have been downloaded for offline listening" |
292 | +msgstr "" |
293 | + |
294 | +#: ../app/ui/EpisodesTab.qml:214 |
295 | +msgid "No episodes have been favourited." |
296 | +msgstr "" |
297 | + |
298 | +#: ../app/ui/EpisodesTab.qml:216 |
299 | msgid "No Episodes found matching the search term." |
300 | msgstr "" |
301 | |
302 | -#: ../app/ui/EpisodesTab.qml:332 |
303 | +#: ../app/ui/EpisodesTab.qml:354 |
304 | msgid "Today" |
305 | msgstr "" |
306 | |
307 | -#: ../app/ui/EpisodesTab.qml:336 |
308 | +#: ../app/ui/EpisodesTab.qml:358 |
309 | msgid "Yesterday" |
310 | msgstr "" |
311 | |
312 | -#: ../app/ui/EpisodesTab.qml:340 |
313 | +#: ../app/ui/EpisodesTab.qml:362 |
314 | msgid "Older" |
315 | msgstr "" |
316 | |
317 | @@ -509,10 +529,10 @@ |
318 | msgid "Finish" |
319 | msgstr "" |
320 | |
321 | -#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:1 |
322 | +#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:1 |
323 | msgid "The chirpiest podcast manager for Ubuntu" |
324 | msgstr "" |
325 | |
326 | -#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:2 |
327 | +#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:2 |
328 | msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;" |
329 | msgstr "" |