Merge lp:~qqworini/ubuntu-rssreader-app/editable-topic-name into lp:~ubuntu-shorts-dev/ubuntu-rssreader-app/trunk

Proposed by Joey Chan
Status: Superseded
Proposed branch: lp:~qqworini/ubuntu-rssreader-app/editable-topic-name
Merge into: lp:~ubuntu-shorts-dev/ubuntu-rssreader-app/trunk
Diff against target: 510 lines (+213/-121)
4 files modified
.bzrignore (+1/-0)
databasemodule_v2.js (+16/-1)
feeds/TopicComponent.qml (+144/-28)
feeds/TopicManagement.qml (+52/-92)
To merge this branch: bzr merge lp:~qqworini/ubuntu-rssreader-app/editable-topic-name
Reviewer Review Type Date Requested Status
Ubuntu Phone Apps Jenkins Bot continuous-integration Needs Fixing
Ubuntu Shorts Developers Pending
Review via email: mp+181072@code.launchpad.net

This proposal has been superseded by a proposal from 2013-08-22.

Commit message

new feature: editable topic name and removable topic item

Description of the change

new feature: editable topic name and removable topic item

To post a comment you must log in.
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Needs Fixing (continuous-integration)
45. By Joey Chan

new feature: editable topic name and removable topic item

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2013-05-23 10:56:53 +0000
+++ .bzrignore 2013-08-22 15:37:02 +0000
@@ -5,3 +5,4 @@
5debian/*.debhelper.log5debian/*.debhelper.log
6debian/*.substvars6debian/*.substvars
7RE:\.?[^.]+7RE:\.?[^.]+
8./ubuntu-rssreader-app.qmlproject
89
=== modified file 'databasemodule_v2.js'
--- databasemodule_v2.js 2013-08-08 15:15:39 +0000
+++ databasemodule_v2.js 2013-08-22 15:37:02 +0000
@@ -167,6 +167,21 @@
167 return dbResult167 return dbResult
168}168}
169169
170function deleteFeedByTagId(tagId)
171{
172 var db = openStdDataBase()
173 var dbResult
174 db.transaction(function (tx) {
175// ensureFeedTableExists(tx)
176 tx.executeSql('PRAGMA foreign_keys = ON;') // enable foreign key support
177 dbResult = tx.executeSql('delete from feed where exists (select 1 from feed_tag where feed_tag.feed_id = feed.id and feed_tag.tag_id = ?)',
178 [tagId])
179 console.log("feed delete by tag id, AFFECTED ROWS: ", dbResult.rowsAffected)
180 }
181 )
182 return dbResult
183}
184
170// select feeds without of topic (tag).185// select feeds without of topic (tag).
171function loadFeedsWithoutTopic()186function loadFeedsWithoutTopic()
172{187{
@@ -515,7 +530,7 @@
515530
516 db.transaction(function(tx) {531 db.transaction(function(tx) {
517 dbResult = tx.executeSql("DELETE FROM feed_tag WHERE feed_id = ? AND tag_id = ?", [feedId, tagId])532 dbResult = tx.executeSql("DELETE FROM feed_tag WHERE feed_id = ? AND tag_id = ?", [feedId, tagId])
518 console.log("feed_tag delete by feedId and tagId: ", dbResult.rows.length)533 console.log("feed_tag delete by feedId and tagId: ", dbResult.rowsAffected)
519 }534 }
520 )535 )
521 return dbResult;536 return dbResult;
522537
=== modified file 'feeds/TopicComponent.qml'
--- feeds/TopicComponent.qml 2013-08-03 10:06:36 +0000
+++ feeds/TopicComponent.qml 2013-08-22 15:37:02 +0000
@@ -16,14 +16,13 @@
16 property bool isExpended: false16 property bool isExpended: false
17 property string topicName17 property string topicName
18 property int topicId18 property int topicId
19 property int modelIndex
1920
20// onClicked: isExpended = !isExpended ;21// onClicked: isExpended = !isExpended ;
2122
22 onStateChanged:23 onStateChanged:{
23 {24 if (isExpended){
24 if (isExpended)25 reloadFeed()
25 {
26 reloadFeed() ;
27 }26 }
28 }27 }
2928
@@ -31,37 +30,154 @@
31 NumberAnimation { duration: 150; easing.type: Easing.OutQuad }30 NumberAnimation { duration: 150; easing.type: Easing.OutQuad }
32 }31 }
3332
34 function reloadFeed ()33 function reloadFeed (){
35 {34 feedModel.clear()
36// for (var j=0; j < columnFeeds.children.length; j++)35 var feeds_tag = DB.loadFeedsFromTag(topicId)
37// {36 for (var i=0; i< feeds_tag.rows.length; i++){
38// columnFeeds.children[j].destroy() ;
39// }
40 feedModel.clear() ;
41 var feeds_tag = DB.loadFeedsFromTag(topicId) ;
42// var feed_array = [] ;
43 for (var i=0; i< feeds_tag.rows.length; i++)
44 {
45// feed_array.push(feeds_tag.rows.item(i)) ;
46// var component = Qt.createComponent("./FeedComponent.qml");
47// var sprite = component.createObject(columnFeeds, {"text": feeds_tag.rows[i].title});
48 feedModel.append(feeds_tag.rows[i]) ;37 feedModel.append(feeds_tag.rows[i]) ;
49 }38 }
50// columnFeeds.height = columnFeeds.childrenRect.height ;
51// return feed_array ;
52 }39 }
5340
54 Column41 Column{
55 {
56 id: columnContent42 id: columnContent
57 anchors{ left: parent.left; right: parent.right }43 anchors{ left: parent.left; right: parent.right }
5844
59 ListItem.Standard45 Item
60 {46 {
61 id: headerTopic47 anchors{ left: parent.left; right: parent.right }
62 text: topicName48 height: units.gu(5)
6349
64 onClicked: isExpended = !isExpended ;50 ListItem.Base{
51 id: headerTopic
52 removable: true
53 height: units.gu(5)
54
55 onClicked: isExpended = !isExpended
56
57 onItemRemoved:{
58 console.log("item about to be removed: ", topicComponent.topicId)
59// itemCancelDelete.startCounting()
60 var result = DB.deleteFeedByTagId(topicComponent.topicId)
61 if (result.rowsAffected == undefined)
62 {
63 topicManagement.reloadTopics()
64 }
65 result = DB.deleteTag(topicComponent.topicId)
66// topicManagement.reloadTopics()
67 if (result.rowsAffected == 1)
68 {
69 topicManagement.removeModelItem(topicComponent.modelIndex)
70 }
71 else
72 {
73 topicManagement.reloadTopics()
74 }
75 }
76
77 Row{
78 id: rowTopicContent
79 anchors
80 {
81 top: parent.top; bottom: parent.bottom; left: parent.left;
82 leftMargin: units.gu(0); topMargin: units.gu(1); bottomMargin: units.gu(1);
83 }
84 spacing: units.gu(2)
85
86 property bool isEditing: false
87
88 Image{
89 anchors
90 {
91 top: parent.top; bottom: parent.bottom;
92 topMargin: units.gu(0.5); bottomMargin: units.gu(0.5);
93 }
94 fillMode: Image.PreserveAspectFit
95 source: Qt.resolvedUrl("../icons_tmp/compose.svg")
96 smooth: true
97
98 MouseArea{
99 anchors { fill: parent; margins: units.gu(-1) }
100 onClicked:
101 {
102 if (rowTopicContent.isEditing)
103 {
104 var result = DB.updateTag(topicComponent.topicId, inputTopicName.text)
105 if (result.rowsAffected == 1)
106 {
107 labelTopicName.text = inputTopicName.text
108 }
109 else
110 {
111 inputTopicName.text = labelTopicName.text
112 }
113 }
114 else
115 {}
116 rowTopicContent.isEditing = !rowTopicContent.isEditing
117 }
118 }
119 }
120
121 Label{
122 id: labelTopicName
123 anchors.verticalCenter: parent.verticalCenter
124 text: topicName
125 width: rowTopicContent.isEditing ? 0 : paintedWidth
126 opacity: rowTopicContent.isEditing ? 0 : 1
127
128 // Behavior on width { UbuntuNumberAnimation{} }
129 }
130
131 TextField{
132 id: inputTopicName
133 anchors.verticalCenter: parent.verticalCenter
134 text: topicName
135 width: rowTopicContent.isEditing ? headerTopic.width - units.gu(15) : 0
136 opacity: rowTopicContent.isEditing ? 1 : 0
137 hasClearButton: true
138 activeFocusOnPress: true
139
140 Behavior on width { UbuntuNumberAnimation{} }
141
142 Connections {
143 target: Qt.inputMethod
144 onVisibleChanged: {
145 if (!Qt.inputMethod.visible) {
146 topicComponent.focus = true
147 }
148 }
149 }
150 }
151 }
152
153 Image{
154 id: imgArrow
155 anchors
156 {
157 right: parent.right; top: parent.top; bottom: parent.bottom;
158 topMargin: units.gu(1.5); bottomMargin: units.gu(1.5); rightMargin: units.gu(2)
159 }
160 fillMode: Image.PreserveAspectFit
161 source: Qt.resolvedUrl("../icons_tmp/go-to.svg")
162 smooth: true
163
164 Behavior on rotation { UbuntuNumberAnimation{} }
165
166 states: [
167 State {
168 name: "expended"
169 when: topicComponent.isExpended
170
171 PropertyChanges
172 {
173 target: imgArrow
174 rotation: 90
175 }
176 }
177 ]
178 }
179 }
180
65 }181 }
66182
67 ListView183 ListView
68184
=== modified file 'feeds/TopicManagement.qml'
--- feeds/TopicManagement.qml 2013-08-08 17:17:28 +0000
+++ feeds/TopicManagement.qml 2013-08-22 15:37:02 +0000
@@ -10,9 +10,6 @@
10 objectName: "topicmanagement"10 objectName: "topicmanagement"
11 id: topicManagement11 id: topicManagement
1212
13// width: units.gu(50)
14// height: units.gu(75)
15
16 title: i18n.tr("Management")13 title: i18n.tr("Management")
17 flickable: content14 flickable: content
18 tools: ToolbarItems {15 tools: ToolbarItems {
@@ -29,31 +26,26 @@
2926
30 Component.onCompleted:27 Component.onCompleted:
31 {28 {
32 reloadTopics () ;29 reloadTopics ()
33 }30 }
3431
35 function reloadTopics ()32 function reloadTopics ()
36 {33 {
37 topicModel.clear() ;34 topicModel.clear()
38// for (var j=0; j < topicColumn.children.length; j++)35 var topics = DB.loadTags()
39// {36 for (var i=0; i < topics.rows.length; i++){
40// topicColumn.children[j].destroy() ;
41// }
42
43 var topics = DB.loadTags() ;
44 for (var i=0; i < topics.rows.length; i++)
45 {
46 topicModel.append(37 topicModel.append(
47 {38 {
48 "id": topics.rows[i].id39 "id": topics.rows[i].id
49 ,"name": topics.rows[i].name40 ,"name": topics.rows[i].name
50 });41 })
51
52// var component = Qt.createComponent("./TopicComponent.qml");
53// var sprite = component.createObject(topicColumn, {"topicName": topics.rows[i].name});
54 }42 }
55 }43 }
5644
45 function removeModelItem (modelIndex){
46 topicModel.remove(modelIndex)
47 }
48
57 function reloadPageContent() {49 function reloadPageContent() {
5850
59 }51 }
@@ -64,8 +56,7 @@
64 contentHeight: contentItem.childrenRect.height56 contentHeight: contentItem.childrenRect.height
65 boundsBehavior: (contentHeight > topicManagement.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds57 boundsBehavior: (contentHeight > topicManagement.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
6658
67 Column59 Column{
68 {
69 anchors{ left: parent.left; right: parent.right }60 anchors{ left: parent.left; right: parent.right }
7061
71 Item {62 Item {
@@ -74,22 +65,19 @@
74 anchors{ left: parent.left; right: parent.right }65 anchors{ left: parent.left; right: parent.right }
75 height: units.gu(8)66 height: units.gu(8)
7667
77 UbuntuShape68 UbuntuShape{
78 {
79 id: uAddTopic69 id: uAddTopic
80 anchors { fill: parent; margins: units.gu(1) }70 anchors { fill: parent; margins: units.gu(1) }
81 gradientColor: "goldenrod"71 gradientColor: "goldenrod"
82 radius: "medium"72 radius: "medium"
8373
84 Label74 Label{
85 {
86 text: i18n.tr("Add a Topic")75 text: i18n.tr("Add a Topic")
87 fontSize: "large"76 fontSize: "large"
88 anchors.centerIn: parent77 anchors.centerIn: parent
89 }78 }
9079
91 MouseArea80 MouseArea{
92 {
93 id: maAddTopic81 id: maAddTopic
94 anchors.fill: parent82 anchors.fill: parent
95 onClicked: pageStack.push(createTopicPage)83 onClicked: pageStack.push(createTopicPage)
@@ -110,8 +98,7 @@
110 }98 }
111 }99 }
112100
113 ListView101 ListView {
114 {
115 id: topicList102 id: topicList
116 anchors{ left: parent.left; right: parent.right }103 anchors{ left: parent.left; right: parent.right }
117 height: contentItem.childrenRect.height104 height: contentItem.childrenRect.height
@@ -120,15 +107,8 @@
120107
121 signal collapseAllItem()108 signal collapseAllItem()
122109
123 function collapseAll()110 function collapseAll(){
124 {111 collapseAllItem()
125// console.log("topicList length", topicList.contentItem.children.length) ;
126// for (var j=0; j < topicList.contentItem.children.length; j++)
127// {
128// console.log("topicList children", topicList.contentItem.children[j]) ;
129// topicList.contentItem.children[j].isExpended = false ;
130// }
131 collapseAllItem() ;
132 }112 }
133113
134 displaced: Transition {114 displaced: Transition {
@@ -149,78 +129,64 @@
149 anchors{ left: parent.left; right: parent.right }129 anchors{ left: parent.left; right: parent.right }
150 height: topicItem.height130 height: topicItem.height
151131
152// onPressAndHold:132 TopicComponent{
153// {
154// delegateRoot.drag.target = icon
155// }
156
157 TopicComponent
158 {
159 id: topicItem133 id: topicItem
160 topicName: model.name134 topicName: model.name
161 topicId: model.id135 topicId: model.id
136 modelIndex: index
162// isExpended: delegateRoot.isExpended137// isExpended: delegateRoot.isExpended
163 }138 }
164139
165 DropArea {140 DropArea {
166 anchors { fill: parent; margins: 0 }141 anchors { fill: parent; margins: 0 }
167142
168 onEntered:143 onEntered:{
169 {
170// console.log("enter", drag.source)144// console.log("enter", drag.source)
171 topicItem.selected = true ;145 topicItem.selected = true
172 }146 }
173147
174 onExited:148 onExited:{
175 {
176// console.log("exit", drag.source)149// console.log("exit", drag.source)
177 topicItem.selected = false ;150 topicItem.selected = false
178 }151 }
179152
180 onDropped:153 onDropped:{
181 {154// console.log("drop", drag.source)
182// console.log("drop", drag.source) ;155 topicItem.selected = false
183 topicItem.selected = false ;156 drag.source.opacity = 0
184 drag.source.opacity = 0 ;157 console.log("dropped item feed id", drag.source.feedId)
185 console.log("dropped item feed id", drag.source.feedId) ;158 console.log("dropped item topic id", drag.source.topicId)
186 console.log("dropped item topic id", drag.source.topicId) ;159 DB.deleteFeedTag(drag.source.feedId, drag.source.topicId)
187 DB.deleteFeedTag(drag.source.feedId, drag.source.topicId) ;160 DB.addFeedTag(drag.source.feedId, model.id)
188 DB.addFeedTag(drag.source.feedId, model.id) ;161 delegateRoot.isExpended = true
189 delegateRoot.isExpended = true ;
190 }162 }
191 }163 }
192164
193 Connections165 Connections{
194 {
195 id: connTopicList166 id: connTopicList
196 target: topicList167 target: topicList
197168
198 onCollapseAllItem:169 onCollapseAllItem:
199 {170 {
200 delegateRoot.isExpended = false ;171 delegateRoot.isExpended = false
201 }172 }
202 }173 }
203174
204 Connections175 Connections{
205 {
206 id: connEditFeed0176 id: connEditFeed0
207 target: editFeed177 target: editFeed
208178
209 onApply:179 onApply:{
210 {180 if (model.id == newTopicId || model.id == previousTopicId){
211 if (model.id == newTopicId || model.id == previousTopicId)181 topicItem.reloadFeed()
212 {182 topicItem.isExpended = true
213 topicItem.reloadFeed() ;
214 topicItem.isExpended = true ;
215 }183 }
216 }184 }
217185
218 onDeleteFeed:186 onDeleteFeed:{
219 {187 if (model.id == topicId){
220 if (model.id == topicId)188 topicItem.reloadFeed()
221 {189 topicItem.isExpended = true
222 topicItem.reloadFeed() ;
223 topicItem.isExpended = true ;
224 }190 }
225 }191 }
226 }192 }
@@ -231,31 +197,25 @@
231 } // column197 } // column
232 } // flickable198 } // flickable
233199
234 Connections200 Connections{
235 {
236 id: connAddTopic201 id: connAddTopic
237 target: createTopicPage202 target: createTopicPage
238203
239 onTopicAdded:204 onTopicAdded:{
240 {205 reloadTopics()
241 reloadTopics() ;
242 }206 }
243 }207 }
244208
245 Connections209 Connections {
246 {
247 id: connAddFeed210 id: connAddFeed
248 target: chooseTopicPage211 target: chooseTopicPage
249212
250 onFeedAdded:213 onFeedAdded:{
251 {214 reloadTopics()
252 reloadTopics() ;215 for (var i=0; i<topicModel.count; i++){
253 for (var i=0; i<topicModel.count; i++)216 if (topicModel.get(i).id == topicId){
254 {217 topicList.currentIndex = i
255 if (topicModel.get(i).id == topicId)218 topicList.currentItem.isExpended = true
256 {
257 topicList.currentIndex = i ;
258 topicList.currentItem.isExpended = true ;
259 }219 }
260 }220 }
261 }221 }

Subscribers

People subscribed via source and target branches