~pkunal-parmar/ubuntu-calendar-app/Minor-Performance

« back to all changes in this revision

Viewing changes to EventDetails.qml

  • Committer: Kunal Parmar
  • Date: 2013-06-01 11:55:55 UTC
  • mto: This revision was merged to the branch mainline in revision 44.
  • Revision ID: pkunal.parmar@gmail.com-20130601115555-s4f3xnclukk50zu6
Typo TimeSeperator.qml->TimeSeparator.qml fixed

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2013-2014 Canonical Ltd
3
 
 *
4
 
 * This file is part of Ubuntu Calendar App
5
 
 *
6
 
 * Ubuntu Calendar App is free software: you can redistribute it and/or modify
7
 
 * it under the terms of the GNU General Public License version 3 as
8
 
 * published by the Free Software Foundation.
9
 
 *
10
 
 * Ubuntu Calendar App is distributed in the hope that it will be useful,
11
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 * GNU General Public License for more details.
14
 
 *
15
 
 * You should have received a copy of the GNU General Public License
16
 
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 
 */
18
 
import QtQuick 2.3
19
 
import Ubuntu.Components 1.1
20
 
import Ubuntu.Components.ListItems 1.0 as ListItem
21
 
import Ubuntu.Components.Themes.Ambiance 1.0
22
 
import Ubuntu.Components.Popups 1.0
23
 
import QtOrganizer 5.0
 
1
import QtQuick 2.0
 
2
import Ubuntu.Components 0.1
 
3
import Ubuntu.Components.Popups 0.1
 
4
import Ubuntu.Components.ListItems 0.1
24
5
 
25
 
import "Defines.js" as Defines
 
6
import "dataService.js" as DataService
26
7
 
27
8
Page {
28
9
    id: root
29
 
    objectName: "eventDetails"
30
 
 
31
 
    property var event
32
 
    property var model
33
 
 
34
 
    anchors{
35
 
        left: parent.left
36
 
        right: parent.right
37
 
        bottom: parent.bottom
38
 
    }
39
 
 
40
 
    flickable: null
41
 
 
42
 
    title: i18n.tr("Event Details")
 
10
 
 
11
    property var event;
 
12
 
 
13
    anchors.fill: parent
 
14
    anchors.margins: units.gu(2)
43
15
 
44
16
    Component.onCompleted: {
45
 
        showEvent(event)
46
 
    }
47
 
 
48
 
    Connections{
49
 
        target: pageStack
50
 
        onCurrentPageChanged:{
51
 
            if( pageStack.currentPage === root) {
52
 
                showEvent(event)
53
 
            }
54
 
        }
55
 
    }
56
 
 
57
 
    RemindersModel {
58
 
        id: reminderModel
59
 
    }
60
 
 
61
 
    function updateCollection(event) {
62
 
        var collection = model.collection( event.collectionId );
63
 
        calendarIndicator.color = collection.color
64
 
        eventInfo.color=collection.color
65
 
        // TRANSLATORS: the first parameter refers to the name of event calendar.
66
 
        calendarName.text = i18n.tr("%1 Calendar").arg( collection.name)
67
 
    }
68
 
 
69
 
    function updateRecurrence( event ) {
70
 
        var index = 0;
71
 
        if (event.recurrence) {
72
 
            if(event.recurrence.recurrenceRules[0] !== undefined){
73
 
                var rule =  event.recurrence.recurrenceRules[0];
74
 
                repeatLabel.text = eventUtils.getRecurrenceString(rule)
75
 
            }
76
 
        }
77
 
    }
78
 
 
79
 
    function updateContacts(event) {
80
 
        var attendees = event.attendees;
 
17
        if( pageStack.header )
 
18
            pageStack.header.visible = false;
 
19
        showEvent(event);
 
20
    }
 
21
 
 
22
    Component.onDestruction: {
 
23
        if( pageStack.header )
 
24
            pageStack.header.visible = true;
 
25
    }
 
26
 
 
27
    function showEvent(e) {
 
28
 
 
29
        // FIXME: temp location in case there is no vanue is defined
 
30
        var location="-15.800513,-47.91378";
 
31
        //var location ="Terry' Cafe, 158 Great Suffold St, London, SE1 1PE";
 
32
 
 
33
        timeLabel.text = Qt.formatDateTime(e.startTime,"hh:mm") + " - " + Qt.formatDateTime(e.endTime,"hh:mm");
 
34
        dateLabel.text = Qt.formatDateTime(e.startTime,"ddd, d MMMM");
 
35
        titleLabel.text = e.title;
 
36
 
 
37
        locationLabel.text = location;
 
38
        if( e.message ) {
 
39
            descLabel.text = e.message;
 
40
        }
 
41
 
 
42
        var venues = []
 
43
        DataService.getVenues(e, venues)
 
44
        if( venues.length > 0 ) {
 
45
            //FIXME: what to do for multiple venue
 
46
            var place = venues[0];
 
47
            locationLabel.text = place.address;
 
48
            if( place.latitude && place.longitude) {
 
49
                location = place.latitude +"," + place.longitude;
 
50
            }
 
51
        }
 
52
 
 
53
        var attendees = []
 
54
        DataService.getAttendees(e, attendees)
81
55
        contactModel.clear();
82
 
        if( attendees !== undefined ) {
83
 
            for (var j = 0 ; j < attendees.length ; ++j) {
84
 
                contactModel.append( {"name": attendees[j].name,"participationStatus": attendees[j].participationStatus }  );
85
 
            }
86
 
        }
87
 
    }
88
 
 
89
 
    function updateReminder(event) {
90
 
        var reminder = event.detail( Detail.VisualReminder)
91
 
        if(reminder) {
92
 
            for(var i=0; i<reminderModel.count; i++) {
93
 
                if(reminder.secondsBeforeStart === reminderModel.get(i).value) {
94
 
                    reminderHeader.subText = reminderModel.get(i).label
95
 
                }
96
 
            }
97
 
        } else {
98
 
            reminderHeader.subText = reminderModel.get(0).label
99
 
        }
100
 
    }
101
 
 
102
 
    function updateLocation(event) {
103
 
        if( event.location ) {
104
 
            locationLabel.text = event.location
105
 
        }
106
 
    }
107
 
 
108
 
    function showEvent(e) {
109
 
        var startTime = e.startDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat)
110
 
        var endTime = e.endDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat)
111
 
 
112
 
        if( e.allDay ) {
113
 
            if( !e.startDateTime.isSameDay( e.endDateTime) ) {
114
 
                dateLabel.text = i18n.tr("%1 - %2 (All Day)")
115
 
                .arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat))
116
 
                .arg( e.endDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat))
117
 
            } else {
118
 
                dateLabel.text = i18n.tr("%1 (All Day)").arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat))
119
 
            }
120
 
        } else {
121
 
           dateLabel.text = e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " +startTime + " - "  + endTime;
122
 
        }
123
 
 
124
 
        if( e.itemType === Type.EventOccurrence ){
125
 
            var requestId = -1;
126
 
            model.onItemsFetched.connect( function(id,fetchedItems){
127
 
                if(requestId === id && fetchedItems.length > 0) {
128
 
                    internal.parentEvent = fetchedItems[0];
129
 
                    updateRecurrence(internal.parentEvent);
130
 
                    updateContacts(internal.parentEvent);
131
 
                }
132
 
            });
133
 
            requestId = model.fetchItems([e.parentId]);
134
 
        }
135
 
        // This is the event title
136
 
        if( e.displayLabel) {
137
 
            titleLabel.text = e.displayLabel;
138
 
        }
139
 
 
140
 
        if( e.description ) {
141
 
            descLabel.text = e.description;
142
 
        }
143
 
 
144
 
        updateCollection(e);
145
 
 
146
 
        updateContacts(e);
147
 
 
148
 
        updateRecurrence(e);
149
 
 
150
 
        updateReminder(e);
151
 
 
152
 
        updateLocation(e);
153
 
    }
154
 
 
155
 
    Keys.onEscapePressed: {
156
 
        pageStack.pop();
157
 
    }
158
 
 
159
 
    Keys.onPressed: {
160
 
        if ((event.key === Qt.Key_E) && ( event.modifiers & Qt.ControlModifier)) {
161
 
            pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event": root.event});
162
 
        }
163
 
    }
164
 
 
165
 
    head.actions: [
 
56
        for( var j = 0 ; j < attendees.length ; ++j ) {
 
57
            contactModel.append( {"name": attendees[j] } );
 
58
        }
 
59
 
 
60
        // FIXME: need to cache map image to avoid duplicate download every time
 
61
        var imageSrc = "http://maps.googleapis.com/maps/api/staticmap?center="+location+
 
62
                "&markers=color:blue|"+location+"&zoom=15&size="+mapContainer.width+
 
63
                "x"+mapContainer.height+"&sensor=false";
 
64
        mapImage.source=imageSrc;
 
65
    }
 
66
 
 
67
    tools: ToolbarActions {
166
68
        Action {
167
 
            text: i18n.tr("Delete");
168
 
            objectName: "delete"
169
 
            iconName: "delete"
 
69
            text: i18n.tr("Add invite");
170
70
            onTriggered: {
171
 
                var dialog = PopupUtils.open(Qt.resolvedUrl("DeleteConfirmationDialog.qml"),root,{"event": event});
172
 
                dialog.deleteEvent.connect( function(eventId){
173
 
                    model.removeItem(eventId);
174
 
                    pageStack.pop();
175
 
                });
 
71
                print(text + " not implemented");
176
72
            }
177
 
        },
178
 
 
 
73
        }
179
74
        Action {
180
75
            text: i18n.tr("Edit");
181
 
            objectName: "edit"
182
 
            iconName: "edit";
183
76
            onTriggered: {
184
 
                if( event.itemType === Type.EventOccurrence ) {
185
 
                    var dialog = PopupUtils.open(Qt.resolvedUrl("EditEventConfirmationDialog.qml"),root,{"event": event});
186
 
                    dialog.editEvent.connect( function(eventId){
187
 
                        if( eventId === event.parentId ) {
188
 
                            pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event":internal.parentEvent,"model":model});
189
 
                        } else {
190
 
                            pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event":event,"model":model});
191
 
                        }
192
 
                    });
193
 
                } else {
194
 
                    pageStack.push(Qt.resolvedUrl("NewEvent.qml"),{"event":event,"model":model});
195
 
                }
196
 
            }
197
 
        }
198
 
    ]
199
 
 
200
 
    EventUtils{
201
 
        id:eventUtils
202
 
    }
203
 
 
204
 
    QtObject{
205
 
        id: internal
206
 
        property var parentEvent;
207
 
    }
208
 
 
209
 
    Rectangle {
210
 
        id: bg
211
 
        color: "white"
212
 
        anchors.fill: parent
213
 
    }
214
 
 
215
 
    Scrollbar {
216
 
        flickableItem: flicable
217
 
        align: Qt.AlignTrailing
218
 
    }
219
 
 
220
 
    Flickable{
221
 
        id: flicable
222
 
 
223
 
        clip: interactive
224
 
        anchors.fill: parent
225
 
        interactive: contentHeight > height
226
 
 
227
 
        contentWidth: parent.width
228
 
        contentHeight: column.height + eventInfo.height + units.gu(3) /*top margin + spacing */
229
 
 
 
77
                print(text + " not implemented");
 
78
            }
 
79
        }
 
80
        active: true
 
81
        lock: false
 
82
    }
 
83
 
 
84
    Column{
 
85
        anchors.fill: parent
 
86
        spacing: units.gu(1)
 
87
 
 
88
        Item{
 
89
            width: parent.width
 
90
            height: timeLabel.height
 
91
            Label{
 
92
                id: timeLabel
 
93
                anchors.left: parent.left
 
94
                anchors.verticalCenter: parent.verticalCenter                
 
95
                fontSize: "large"
 
96
            }
 
97
            Label{
 
98
                id: dateLabel
 
99
                anchors.right: parent.right
 
100
                anchors.verticalCenter: parent.verticalCenter                
 
101
                fontSize: "small"
 
102
            }
 
103
        }
 
104
 
 
105
        Label{
 
106
            id: titleLabel            
 
107
            fontSize: "x-large"
 
108
            width: parent.width
 
109
            wrapMode: Text.WordWrap
 
110
        }
 
111
        ThinDivider{}
 
112
 
 
113
        Label{
 
114
            id: descLabel
 
115
            // FIXME: temporaty text, in ui there is no field to enter message
 
116
            text:"Hi both, please turn up on time, it gets really busy by 1pm! Anna x"
 
117
            wrapMode: Text.WordWrap            
 
118
            fontSize: "medium"
 
119
            width: parent.width
 
120
        }
 
121
 
 
122
        //map control with location
230
123
        Rectangle{
231
 
            id: eventInfo
232
 
 
233
 
            width: parent.width
234
 
            height: eventInfoList.height + units.gu(5)
235
 
 
236
 
            Column{
237
 
                id:eventInfoList
 
124
            id: mapContainer
 
125
            width:parent.width
 
126
            height: units.gu(25)
 
127
            Image {
 
128
                id: mapImage
 
129
                anchors.fill: parent
 
130
                opacity: 0.5
 
131
            }
 
132
            Label{
 
133
                id:locationLabel
 
134
                wrapMode: Text.WordWrap                
 
135
                fontSize: "medium"
 
136
                width: parent.width
 
137
                //color:"#c94212"
 
138
                color:"black"
238
139
 
239
140
                anchors {
240
141
                    left: parent.left
241
 
                    right: parent.right
242
 
                    top: parent.top
243
 
                    margins: units.gu(2)
244
 
                }
245
 
 
246
 
                spacing: units.gu(0.5)
247
 
 
248
 
                Label{
249
 
                    id: titleLabel
250
 
                    objectName: "titleLabel"
251
 
                    fontSize: "x-large"
252
 
                    width: parent.width
253
 
                    wrapMode: Text.WordWrap
254
 
                    color: "white"
255
 
                }
256
 
 
257
 
                Label{
258
 
                    id: dateLabel
259
 
                    objectName: "dateLabel"
260
 
                    color: "white"
261
 
                    fontSize: "medium"
262
 
                    width: parent.width
263
 
                    wrapMode: Text.WordWrap
264
 
                }
265
 
 
266
 
                Label{
267
 
                    id: repeatLabel
268
 
                    objectName: "repeatLabel"
269
 
                    color: "white"
270
 
                    fontSize: "small"
271
 
                    width: parent.width
272
 
                    wrapMode: Text.WordWrap
273
 
                    visible: repeatLabel.text !== ""
274
 
                }
275
 
 
276
 
                Label{
277
 
                    id: locationLabel
278
 
                    objectName: "locationLabel"
279
 
                    color: "white"
280
 
                    fontSize: "small"
281
 
                    width: parent.width
282
 
                    wrapMode: Text.WordWrap
283
 
                    visible: locationLabel.text !== ""
284
 
                }
285
 
            }
286
 
        }
287
 
 
288
 
        Column{
289
 
            id: column
290
 
 
291
 
            spacing: units.gu(1)
292
 
            anchors{
293
 
                top: eventInfo.bottom
294
 
                right: parent.right
295
 
                left:parent.left
296
 
                margins: units.gu(2)
297
 
            }
298
 
 
299
 
            Row{
300
 
                width: parent.width
301
 
                spacing: units.gu(1)
302
 
                UbuntuShape{
303
 
                    id: calendarIndicator
304
 
                    width: parent.height
305
 
                    height: width
306
 
                    anchors.verticalCenter: parent.verticalCenter
307
 
                }
308
 
                Label{
309
 
                    id:calendarName
310
 
                    objectName: "calendarName"
311
 
                    anchors.verticalCenter: parent.verticalCenter
312
 
                }
313
 
            }
314
 
 
315
 
            Label{
316
 
                id: descLabel
317
 
                objectName: "descriptionLabel"
318
 
                visible: text != ""
319
 
                width: parent.width
320
 
                wrapMode: Text.WordWrap
321
 
            }
322
 
 
323
 
            Column {
324
 
                anchors{
325
 
                    right: parent.right
326
 
                    left:parent.left
327
 
                    margins: units.gu(-2)
328
 
                }
329
 
 
330
 
                ListItem.Header {
331
 
                    text: i18n.tr("Guests")
332
 
                    visible: contactModel.count !== 0
333
 
                }
334
 
 
335
 
                //Guest Entery Model starts
336
 
                Column{
337
 
                    id: contactList
338
 
                    objectName: 'contactList'
339
 
 
340
 
                    anchors {
341
 
                        left: parent.left
342
 
                        right: parent.right
343
 
                    }
344
 
 
345
 
                    ListModel {
346
 
                        id: contactModel
347
 
                    }
348
 
 
349
 
                    Repeater{
350
 
                        model: contactModel
351
 
                        delegate: ListItem.Standard {
352
 
                            Label {
353
 
                                text: name
354
 
                                objectName: "eventGuest%1".arg(index)
355
 
                                color: UbuntuColors.midAubergine
356
 
                                anchors {
357
 
                                    left: parent.left
358
 
                                    leftMargin: units.gu(2)
359
 
                                    verticalCenter: parent.verticalCenter
360
 
                                }
361
 
                            }
362
 
 
363
 
                            control: CheckBox {
364
 
                                enabled: false
365
 
                                checked: participationStatus
366
 
                            }
367
 
                        }
368
 
                    }
369
 
                }
370
 
                //Guest Entries ends
371
 
 
372
 
                ListItem.Subtitled {
373
 
                    id: reminderHeader
374
 
                    text: i18n.tr("Reminder")
375
 
                }
 
142
                    leftMargin: units.gu(1)
 
143
                    bottom: parent.bottom
 
144
                    bottomMargin: units.gu(1)
 
145
                }
 
146
            }
 
147
        }
 
148
 
 
149
        Label{
 
150
            text: i18n.tr("People");            
 
151
            fontSize: "small"
 
152
        }
 
153
        ThinDivider{}
 
154
 
 
155
        //contact list view
 
156
        ListView {
 
157
            id:contactList
 
158
            width: parent.width
 
159
            height:  {
 
160
                var height = parent.height;
 
161
                //not considering the list view it self
 
162
                for( var i = 0; i < parent.children.length - 1 ; ++i) {
 
163
                    height -= parent.children[i].height;
 
164
                }
 
165
                height -= parent.children.length * parent.spacing;
 
166
            }
 
167
            clip: true
 
168
            model: ListModel {
 
169
                id: contactModel
 
170
            }
 
171
 
 
172
            Label{                
 
173
                fontSize: "medium"
 
174
                visible: contactModel.count <= 0
 
175
                anchors.verticalCenter: parent.verticalCenter
 
176
            }
 
177
 
 
178
            delegate: Standard{
 
179
                text: name
 
180
                icon: Qt.resolvedUrl("dummy.png")
 
181
                progression: true
376
182
            }
377
183
        }
378
184
    }