Merge lp:~pkunal-parmar/ubuntu-calendar-app/EventView-Perf into lp:ubuntu-calendar-app

Proposed by Kunal Parmar
Status: Merged
Approved by: Mihir Soni
Approved revision: 240
Merged at revision: 235
Proposed branch: lp:~pkunal-parmar/ubuntu-calendar-app/EventView-Perf
Merge into: lp:ubuntu-calendar-app
Diff against target: 492 lines (+68/-105)
9 files modified
AllDayEventComponent.qml (+6/-16)
EventDetails.qml (+4/-4)
EventListModel.qml (+16/-6)
GlobalEventModel.js (+0/-9)
NewEvent.qml (+2/-4)
TimeLineBase.qml (+11/-24)
TimeLineBaseComponent.qml (+16/-0)
WeekView.qml (+4/-22)
calendar.qml (+9/-20)
To merge this branch: bzr merge lp:~pkunal-parmar/ubuntu-calendar-app/EventView-Perf
Reviewer Review Type Date Requested Status
Mihir Soni Approve
Ubuntu Phone Apps Jenkins Bot continuous-integration Approve
Review via email: mp+214369@code.launchpad.net

Commit message

fixes Bug #1301910

Now removing Global model and as suggested by renato, creating model for individual view and performing operation in scope of Organizer Model's thread.

Description of the change

fixes Bug #1301910

Now removing Global model and as suggested by renato, creating model for individual view and performing operation in scope of Organizer Model's thread.

To post a comment you must log in.
235. By Kunal Parmar

removed unnecessary print

236. By Kunal Parmar

commented out code removed

237. By Kunal Parmar

unnecessary import removed

Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Kunal Parmar (pkunal-parmar) wrote :
Revision history for this message
Mihir Soni (mihirsoni) wrote :

Kunal ,

it looks good to me and now it more smoother in transition.

off the topic, We have to change this architecture in all the places, like creating new event, editing & updating new event ?

Because after importing your branch, i tried to edit my event and try to save it , it gives me following console ouput.

TypeError: Cannot call method 'saveItem' of undefined

review: Needs Information
238. By Kunal Parmar

Edit case handled

Revision history for this message
Kunal Parmar (pkunal-parmar) wrote :

> Kunal ,
>
> it looks good to me and now it more smoother in transition.
>
> off the topic, We have to change this architecture in all the places, like
> creating new event, editing & updating new event ?
>
> Because after importing your branch, i tried to edit my event and try to save
> it , it gives me following console ouput.
>
> TypeError: Cannot call method 'saveItem' of undefined

Indeed, model was not set in edit case.
Other case should work, let me know if you face issue.

239. By Kunal Parmar

Command line argument case handled

240. By Kunal Parmar

AllDay event handled

Revision history for this message
Mihir Soni (mihirsoni) wrote :

Hi Kunal,

I am not sure is it my system fault or not ,

but i see little delay in getting reload the view , I have captured the video if you see i have created event with recurrence of daily :-

if you see when i switch days it is taking some delays to display the same event.

https://www.youtube.com/watch?v=0QJPfGHv-BQ&feature=youtu.be

review: Needs Information
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Kunal Parmar (pkunal-parmar) wrote :

If you are talking about delay in model refresh, then it not in our hand, as we are rendering event bubble async when model data is available.

As such I dont see any lag in GUI.

Revision history for this message
Mihir Soni (mihirsoni) wrote :

Okay kunal, got it.

Thanks i tested it apart from this everything looks good and works good.

Thanks a lot for your MR.

review: Approve
Revision history for this message
Kunal Parmar (pkunal-parmar) wrote :

ok, great, I am going to propose some more merge, that should help at certain extend to resolve that problem.
I guess as both day and week view is now trying to set date, EDS model is getting confused and rejects some requests. That's just my guess.

Revision history for this message
Mihir Soni (mihirsoni) wrote :

Thanks kunal,

Could you look at the Bug #1302439 ?

Are you able to reproduce it ?

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'AllDayEventComponent.qml'
--- AllDayEventComponent.qml 2014-03-19 00:32:29 +0000
+++ AllDayEventComponent.qml 2014-04-05 06:36:44 +0000
@@ -3,7 +3,6 @@
3import Ubuntu.Components.Popups 0.13import Ubuntu.Components.Popups 0.1
44
5import "dateExt.js" as DateExt5import "dateExt.js" as DateExt
6import "GlobalEventModel.js" as GlobalModel
7import "ViewType.js" as ViewType6import "ViewType.js" as ViewType
87
9Rectangle{8Rectangle{
@@ -11,6 +10,7 @@
1110
12 property var allDayEvents;11 property var allDayEvents;
13 property var startDay: DateExt.today();12 property var startDay: DateExt.today();
13 property var model;
1414
15 property int type: ViewType.ViewTypeWeek15 property int type: ViewType.ViewTypeWeek
1616
@@ -20,10 +20,9 @@
2020
21 function getAllDayEvents(startDate, endDate) {21 function getAllDayEvents(startDate, endDate) {
22 var map = {};22 var map = {};
23 var itemIds = GlobalModel.globalModel().itemIds(startDate, endDate);23 var items = model.getItems(startDate,endDate);
24 for(var i = 0 ; i < itemIds.length ; ++i) {24 for(var i = 0 ; i < items.length ; ++i) {
25 var eventId = itemIds[(i)];25 var event = items[(i)];
26 var event = GlobalModel.globalModel().item(eventId);
27 if( event && event.allDay ) {26 if( event && event.allDay ) {
28 var key = Qt.formatDateTime(event.startDateTime, "dd-MMM-yyyy");27 var key = Qt.formatDateTime(event.startDateTime, "dd-MMM-yyyy");
29 if( !(key in map)) {28 if( !(key in map)) {
@@ -44,15 +43,6 @@
44 allDayEvents = getAllDayEvents(sd,ed);43 allDayEvents = getAllDayEvents(sd,ed);
45 }44 }
4645
47 Component.onCompleted: {
48 var model = GlobalModel.globalModel();
49 model.reloaded.connect(root.createAllDayEvents);
50 }
51
52 onStartDayChanged: {
53 createAllDayEvents();
54 }
55
56 Row {46 Row {
57 width: parent.width47 width: parent.width
58 anchors.verticalCenter: parent.verticalCenter48 anchors.verticalCenter: parent.verticalCenter
@@ -81,7 +71,7 @@
81 if( allDayLabel.events.length > 1 ) {71 if( allDayLabel.events.length > 1 ) {
82 PopupUtils.open(popoverComponent, root,{"events": allDayLabel.events})72 PopupUtils.open(popoverComponent, root,{"events": allDayLabel.events})
83 } else {73 } else {
84 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":allDayLabel.events[0]});74 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":allDayLabel.events[0],"model": model});
85 }75 }
86 }76 }
87 }77 }
@@ -148,7 +138,7 @@
148 anchors.fill: parent138 anchors.fill: parent
149 onClicked: {139 onClicked: {
150 popover.hide();140 popover.hide();
151 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":modelData});141 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":modelData,"model": model});
152 }142 }
153 }143 }
154 }144 }
155145
=== modified file 'EventDetails.qml'
--- EventDetails.qml 2014-04-04 02:27:33 +0000
+++ EventDetails.qml 2014-04-05 06:36:44 +0000
@@ -5,7 +5,6 @@
5import Ubuntu.Components.Themes.Ambiance 0.15import Ubuntu.Components.Themes.Ambiance 0.1
6import QtOrganizer 5.06import QtOrganizer 5.0
77
8import "GlobalEventModel.js" as GlobalModel
9import "Defines.js" as Defines8import "Defines.js" as Defines
109
11Page {10Page {
@@ -14,6 +13,8 @@
14 property var event;13 property var event;
15 property string headerColor :"black"14 property string headerColor :"black"
16 property string detailColor :"grey"15 property string detailColor :"grey"
16 property var model;
17
17 anchors.fill: parent18 anchors.fill: parent
18 Component.onCompleted: {19 Component.onCompleted: {
19 if( pageStack.header )20 if( pageStack.header )
@@ -101,8 +102,7 @@
101 text: i18n.tr("Delete");102 text: i18n.tr("Delete");
102 iconSource: "image://theme/delete,edit-delete-symbolic"103 iconSource: "image://theme/delete,edit-delete-symbolic"
103 onTriggered: {104 onTriggered: {
104 var eventModel = GlobalModel.globalModel();105 model.removeItem(event);
105 eventModel.removeItem(event);
106 pageStack.pop();106 pageStack.pop();
107 }107 }
108 }108 }
@@ -113,7 +113,7 @@
113 text: i18n.tr("Edit");113 text: i18n.tr("Edit");
114 iconSource: Qt.resolvedUrl("edit.svg");114 iconSource: Qt.resolvedUrl("edit.svg");
115 onTriggered: {115 onTriggered: {
116 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event":event});116 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event":event,"model":model});
117 }117 }
118 }118 }
119 }119 }
120120
=== modified file 'EventListModel.qml'
--- EventListModel.qml 2014-02-26 13:42:20 +0000
+++ EventListModel.qml 2014-04-05 06:36:44 +0000
@@ -1,16 +1,26 @@
1import QtQuick 2.01import QtQuick 2.0
2import "dateExt.js" as DateExt
3
4import QtOrganizer 5.02import QtOrganizer 5.0
53
6OrganizerModel {4OrganizerModel {
7 id: eventModel5 id: eventModel
8 manager:"eds"6 manager:"eds"
9 autoUpdate: false7
108 property var listeners:[];
11 signal reloaded9
10 function addModelChangeListener(listener){
11 listeners.push(listener);
12 }
13
14 function getItems(startDate, endDate){
15 return itemsByTimePeriod(startDate,endDate);
16 }
1217
13 onModelChanged: {18 onModelChanged: {
14 reloaded();19 if(listeners === undefined){
20 return;
21 }
22 for(var i=0; i < listeners.length ;++i){
23 (listeners[i])();
24 }
15 }25 }
16}26}
1727
=== removed file 'GlobalEventModel.js'
--- GlobalEventModel.js 2014-01-31 03:20:40 +0000
+++ GlobalEventModel.js 1970-01-01 00:00:00 +0000
@@ -1,9 +0,0 @@
1.pragma library
2
3var model;
4function globalModel() {
5 if( !model) {
6 model = Qt.createQmlObject('import QtQuick 2.0; EventListModel {}', Qt.application, 'EventListModel.globalModel()')
7 }
8 return model;
9}
100
=== modified file 'NewEvent.qml'
--- NewEvent.qml 2014-03-27 14:54:30 +0000
+++ NewEvent.qml 2014-04-05 06:36:44 +0000
@@ -6,7 +6,6 @@
6import Ubuntu.Components.Themes.Ambiance 0.16import Ubuntu.Components.Themes.Ambiance 0.1
7import QtOrganizer 5.07import QtOrganizer 5.0
88
9import "GlobalEventModel.js" as GlobalModel
10import "Defines.js" as Defines9import "Defines.js" as Defines
1110
12Page {11Page {
@@ -14,6 +13,7 @@
14 property var date: new Date();13 property var date: new Date();
1514
16 property var event:null;15 property var event:null;
16 property var model;
1717
18 property var startDate;18 property var startDate;
19 property var endDate;19 property var endDate;
@@ -35,7 +35,6 @@
35 endDate = new Date(date)35 endDate = new Date(date)
36 endDate.setMinutes( endDate.getMinutes() + 30)36 endDate.setMinutes( endDate.getMinutes() + 30)
37 }37 }
38 internal.eventModel = GlobalModel.globalModel();
3938
40 if(event === null){39 if(event === null){
41 isEdit =false;40 isEdit =false;
@@ -154,7 +153,7 @@
154 event.setDetail(audibleReminder);153 event.setDetail(audibleReminder);
155 }154 }
156155
157 internal.eventModel.saveItem(event);156 model.saveItem(event);
158 pageStack.pop();157 pageStack.pop();
159 }158 }
160 }159 }
@@ -426,7 +425,6 @@
426425
427 QtObject {426 QtObject {
428 id: internal427 id: internal
429 property var eventModel;
430428
431 function clearFocus() {429 function clearFocus() {
432 Qt.inputMethod.hide()430 Qt.inputMethod.hide()
433431
=== modified file 'TimeLineBase.qml'
--- TimeLineBase.qml 2014-03-26 14:39:17 +0000
+++ TimeLineBase.qml 2014-04-05 06:36:44 +0000
@@ -1,7 +1,6 @@
1import QtQuick 2.01import QtQuick 2.0
2import Ubuntu.Components 0.12import Ubuntu.Components 0.1
3import "dateExt.js" as DateExt3import "dateExt.js" as DateExt
4import "GlobalEventModel.js" as GlobalModel
54
6Item {5Item {
7 id: bubbleOverLay6 id: bubbleOverLay
@@ -10,49 +9,38 @@
10 property var day;9 property var day;
11 property int hourHeight: units.gu(10)10 property int hourHeight: units.gu(10)
1211
13 Component.onCompleted: {12 property var model;
14 intern.model = GlobalModel.globalModel();
15 intern.model.reloaded.connect(bubbleOverLay.createEvents);
16 }
17
18 onDayChanged: {
19 if( intern.model)
20 bubbleOverLay.createEvents();
21 }
2213
23 TimeSeparator{14 TimeSeparator{
24 id: separator15 id: separator
25 objectName: "separator"16 objectName: "separator"
26 width: bubbleOverLay.width17 width: bubbleOverLay.width
18 visible: false
27 z:119 z:1
28 }20 }
2921
30 QtObject {22 QtObject {
31 id: intern23 id: intern
32 property var now : new Date();24 property var now : new Date();
33 property var model;
34 }25 }
3526
36 function showEventDetails(event) {27 function showEventDetails(event) {
37 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":event});28 pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":event,"model":model});
38 }29 }
3930
40 function createEvents() {31 function createEvents() {
41 if(!bubbleOverLay || bubbleOverLay == undefined) {32 if(!bubbleOverLay || bubbleOverLay == undefined) {
42 return;33 return;
43 }34 }
4435 destroyAllChildren();
45 bubbleOverLay.destroyAllChildren();
4636
47 var startDate = new Date(day).midnight();37 var startDate = new Date(day).midnight();
48
49 var endDate = new Date(day).endOfDay();38 var endDate = new Date(day).endOfDay();
5039
51 var itemIds = intern.model.itemIds(startDate,endDate);40 var items = model.getItems(startDate,endDate);
52 for(var i = 0 ; i < itemIds.length ; ++i) {41 for(var i = 0 ; i < items.length ; ++i) {
53 var eventId = itemIds[(i)];42 var event = items[i];
54 var event = intern.model.item(eventId);43 if(event.allDay === false) {
55 if( event ) {
56 bubbleOverLay.createEvent(event,event.startDateTime.getHours());44 bubbleOverLay.createEvent(event,event.startDateTime.getHours());
57 }45 }
58 }46 }
@@ -64,10 +52,8 @@
6452
65 function destroyAllChildren() {53 function destroyAllChildren() {
66 for( var i = children.length - 1; i >= 0; --i ) {54 for( var i = children.length - 1; i >= 0; --i ) {
67 if( children[i].objectName === "separator") {55 children[i].visible = false;
68 children[i].visible = false;56 if( children[i].objectName !== "separator") {
69 } else {
70 children[i].visible = false;
71 children[i].destroy();57 children[i].destroy();
72 }58 }
73 }59 }
@@ -75,6 +61,7 @@
7561
76 function createEvent( event ,hour) {62 function createEvent( event ,hour) {
77 var eventBubble = delegate.createObject(bubbleOverLay);63 var eventBubble = delegate.createObject(bubbleOverLay);
64
78 eventBubble.clicked.connect( bubbleOverLay.showEventDetails );65 eventBubble.clicked.connect( bubbleOverLay.showEventDetails );
7966
80 var yPos = (( event.startDateTime.getMinutes() * hourHeight) / 60) + hour * hourHeight67 var yPos = (( event.startDateTime.getMinutes() * hourHeight) / 60) + hour * hourHeight
8168
=== modified file 'TimeLineBaseComponent.qml'
--- TimeLineBaseComponent.qml 2014-03-26 14:29:37 +0000
+++ TimeLineBaseComponent.qml 2014-04-05 06:36:44 +0000
@@ -27,6 +27,13 @@
27 }27 }
28 }28 }
2929
30 EventListModel {
31 id: mainModel
32 startPeriod: startDay.midnight();
33 endPeriod: type == ViewType.ViewTypeWeek ? startPeriod.addDays(7).endOfDay(): startPeriod.endOfDay()
34 }
35
36
30 Column {37 Column {
31 anchors.top: parent.top38 anchors.top: parent.top
3239
@@ -37,6 +44,10 @@
37 id: allDayContainer44 id: allDayContainer
38 type: root.type45 type: root.type
39 startDay: root.startDay46 startDay: root.startDay
47 model: mainModel
48 Component.onCompleted: {
49 model.addModelChangeListener(createAllDayEvents);
50 }
40 }51 }
4152
42 Flickable{53 Flickable{
@@ -75,6 +86,11 @@
75 height: parent.height86 height: parent.height
76 delegate: comp87 delegate: comp
77 day: startDay.addDays(index)88 day: startDay.addDays(index)
89
90 model: mainModel
91 Component.onCompleted: {
92 model.addModelChangeListener(createEvents);
93 }
78 }94 }
79 }95 }
80 }96 }
8197
=== modified file 'WeekView.qml'
--- WeekView.qml 2014-03-26 19:06:27 +0000
+++ WeekView.qml 2014-04-05 06:36:44 +0000
@@ -29,7 +29,7 @@
29 id: weekHeader29 id: weekHeader
30 objectName: "weekHeader"30 objectName: "weekHeader"
31 type: ViewType.ViewTypeWeek31 type: ViewType.ViewTypeWeek
32 date: weekViewPath.weekStart32 date: firstDay
3333
34 onDateSelected: {34 onDateSelected: {
35 root.dateSelected(date);35 root.dateSelected(date);
@@ -39,9 +39,6 @@
39 PathViewBase{39 PathViewBase{
40 id: weekViewPath40 id: weekViewPath
4141
42 property var visibleWeek: dayStart.weekStart(Qt.locale().firstDayOfWeek);
43 property var weekStart: weekViewPath.visibleWeek
44
45 width: parent.width42 width: parent.width
46 height: root.height - weekViewPath.y43 height: root.height - weekViewPath.y
4744
@@ -59,13 +56,11 @@
59 }56 }
6057
61 function nextWeek() {58 function nextWeek() {
62 var weekStartDay = visibleWeek.weekStart(Qt.locale().firstDayOfWeek);59 dayStart = firstDay.addDays(7);
63 dayStart = weekStartDay.addDays(7);
64 }60 }
6561
66 function previousWeek(){62 function previousWeek(){
67 var weekStartDay = visibleWeek.weekStart(Qt.locale().firstDayOfWeek);63 dayStart = firstDay.addDays(-7);
68 dayStart = weekStartDay.addDays(-7);
69 }64 }
7065
71 delegate: TimeLineBaseComponent {66 delegate: TimeLineBaseComponent {
@@ -76,7 +71,7 @@
76 width: parent.width71 width: parent.width
77 height: parent.height72 height: parent.height
7873
79 startDay: getWeekStart();74 startDay: firstDay.addDays( weekViewPath.indexType(index) * 7)
8075
81 Connections{76 Connections{
82 target: root77 target: root
@@ -102,19 +97,6 @@
102 value: contentY97 value: contentY
103 when: timeLineView.PathView.isCurrentItem98 when: timeLineView.PathView.isCurrentItem
104 }99 }
105
106 function getWeekStart() {
107 switch( weekViewPath.indexType(index)) {
108 case 0:
109 return weekViewPath.weekStart;
110 case -1:
111 var weekStartDay= weekViewPath.weekStart.weekStart(Qt.locale().firstDayOfWeek);
112 return weekStartDay.addDays(-7);
113 case 1:
114 var weekStartDay = weekViewPath.weekStart.weekStart(Qt.locale().firstDayOfWeek);
115 return weekStartDay.addDays(7);
116 }
117 }
118 }100 }
119 }101 }
120}102}
121103
=== modified file 'calendar.qml'
--- calendar.qml 2014-04-04 02:38:06 +0000
+++ calendar.qml 2014-04-05 06:36:44 +0000
@@ -3,7 +3,6 @@
3import Ubuntu.Components.Popups 0.13import Ubuntu.Components.Popups 0.1
44
5import "dateExt.js" as DateExt5import "dateExt.js" as DateExt
6import "GlobalEventModel.js" as GlobalModel
76
8MainView {7MainView {
9 id: mainView8 id: mainView
@@ -68,7 +67,6 @@
68 id: tabPage67 id: tabPage
6968
70 property var currentDay: DateExt.today();69 property var currentDay: DateExt.today();
71 property var globalModel;
7270
73 // Arguments on startup71 // Arguments on startup
74 property bool newevent: false;72 property bool newevent: false;
@@ -88,18 +86,6 @@
8886
89 if( !weekView.dayStart.isSameDay(currentDay))87 if( !weekView.dayStart.isSameDay(currentDay))
90 weekView.dayStart = currentDay88 weekView.dayStart = currentDay
91
92 setStartEndDateToModel();
93 }
94
95 function setStartEndDateToModel() {
96 if(globalModel) {
97 globalModel.startPeriod = new Date(currentDay.getFullYear(),0,1,0,0,0,0);
98 globalModel.endPeriod = new Date(currentDay.getFullYear(),11,31,0,0,0,0);
99 // only enable auto update after set the date interval
100 globalModel.autoUpdate = true
101 globalModel.update()
102 }
103 }89 }
10490
105 function newEvent() {91 function newEvent() {
@@ -124,7 +110,7 @@
124 endDate = new Date(endTime);110 endDate = new Date(endTime);
125 }111 }
126 }112 }
127 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"startDate": startDate, "endDate": endDate});113 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"startDate": startDate, "endDate": endDate, "model":eventModel});
128 }114 }
129115
130 // This function calculate the difference between --endtime and --starttime and choose the better view116 // This function calculate the difference between --endtime and --starttime and choose the better view
@@ -159,7 +145,6 @@
159145
160 if (endtimepattern.test(url))146 if (endtimepattern.test(url))
161 endtime = url.match(/endtime=(\d+)/)[0].replace("endtime=", '');147 endtime = url.match(/endtime=(\d+)/)[0].replace("endtime=", '');
162
163 }148 }
164149
165 Component.onCompleted: {150 Component.onCompleted: {
@@ -194,9 +179,6 @@
194 else {179 else {
195 tabs.selectedTabIndex= 1;180 tabs.selectedTabIndex= 1;
196 }181 }
197
198 globalModel = GlobalModel.globalModel();
199 setStartEndDateToModel();
200 } // End of Component.onCompleted:182 } // End of Component.onCompleted:
201183
202 // This is for wait that the app is load when newEvent is invoked by argument184 // This is for wait that the app is load when newEvent is invoked by argument
@@ -210,6 +192,13 @@
210 }192 }
211 }193 }
212194
195 EventListModel{
196 id: eventModel
197 //This model is just for newevent
198 //so we dont need any update
199 autoUpdate: false
200 }
201
213 ToolbarItems {202 ToolbarItems {
214 id: commonToolBar203 id: commonToolBar
215204
@@ -229,7 +218,7 @@
229 iconSource: Qt.resolvedUrl("new-event.svg");218 iconSource: Qt.resolvedUrl("new-event.svg");
230 text: i18n.tr("New Event");219 text: i18n.tr("New Event");
231 onTriggered: {220 onTriggered: {
232 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"date":tabPage.currentDay});221 pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"date":tabPage.currentDay,"model":eventModel});
233 }222 }
234 }223 }
235 }224 }

Subscribers

People subscribed via source and target branches

to status/vote changes: