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

« back to all changes in this revision

Viewing changes to AllDayEventComponent.qml

  • Committer: Frank Mertens
  • Date: 2013-03-22 01:32:02 UTC
  • mto: This revision was merged to the branch mainline in revision 11.
  • Revision ID: frank@cyblogic.de-20130322013202-19s6th508vgo971t
Added more complex test case in preparation for integration of the diary view.

To run the tests and load the test data run 'qmlscene calendarTest.qml' once.

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.Popups 1.0
21
 
 
22
 
import "dateExt.js" as DateExt
23
 
import "ViewType.js" as ViewType
24
 
 
25
 
Item {
26
 
    id: root
27
 
 
28
 
    property var allDayEvents;
29
 
    property var startDay: DateExt.today();
30
 
    property var model;
31
 
 
32
 
    property int type: ViewType.ViewTypeWeek
33
 
 
34
 
    width: parent.width
35
 
 
36
 
    function getAllDayEvents(startDate, endDate) {
37
 
        var map = {};
38
 
        var items = model.getItems(startDate,endDate);
39
 
        for(var i = 0 ; i < items.length ; ++i) {
40
 
            var event = items[(i)];
41
 
            if( event && event.allDay ) {
42
 
                for(var d = event.startDateTime; d <= event.endDateTime; d = d.addDays(1)) {
43
 
                    var key = Qt.formatDateTime(d, "dd-MMM-yyyy");
44
 
                    if( !(key in map)) {
45
 
                        map[key] = [];
46
 
                    }
47
 
                    map[key].push(event);
48
 
                }
49
 
            }
50
 
        }
51
 
        return map;
52
 
    }
53
 
 
54
 
    function createAllDayEvents() {
55
 
        if(!startDay || startDay === undefined) {
56
 
            return;
57
 
        }
58
 
        var sd = startDay.midnight();
59
 
        var ed = sd.addDays( (type == ViewType.ViewTypeDay) ? 1 : 7);
60
 
        allDayEvents = getAllDayEvents(sd,ed);
61
 
    }
62
 
 
63
 
    Repeater{
64
 
        model: type == ViewType.ViewTypeWeek ? 7 : 1
65
 
        delegate: Button {
66
 
            id: allDayButton
67
 
 
68
 
            property var events;
69
 
            gradient: UbuntuColors.orangeGradient
70
 
 
71
 
            x: type === ViewType.ViewTypeWeek ? root.width/7*index : 0
72
 
            height: units.gu(3)
73
 
            clip: true
74
 
            width: parent.width/ (type == ViewType.ViewTypeWeek ? 7 : 1)
75
 
            visible: !allDayButton.events || allDayButton.events.length === 0 ? false : true
76
 
 
77
 
            onClicked: {
78
 
                if(!allDayButton.events || allDayButton.events.length === 0) {
79
 
                    return;
80
 
                }
81
 
 
82
 
                if(type == ViewType.ViewTypeWeek) {
83
 
                    PopupUtils.open(popoverComponent, root,{"events": allDayButton.events})
84
 
                } else {
85
 
                    if( allDayButton.events.length > 1 ) {
86
 
                        PopupUtils.open(popoverComponent, root,{"events": allDayButton.events})
87
 
                    } else {
88
 
                        pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":allDayButton.events[0],"model": root.model});
89
 
                    }
90
 
                }
91
 
            }
92
 
 
93
 
            Connections{
94
 
                target: root
95
 
                onAllDayEventsChanged:{
96
 
                    var sd = startDay.midnight();
97
 
                    sd = sd.addDays(index);
98
 
                    var key  = Qt.formatDateTime(sd, "dd-MMM-yyyy");
99
 
                    events = allDayEvents[key];
100
 
 
101
 
                    if(!events || events.length === 0) {
102
 
                        text = "";
103
 
                        return;
104
 
                    }
105
 
 
106
 
                    if(type == ViewType.ViewTypeWeek) {
107
 
                        // TRANSLATORS: the first parameter refers to the number of all-day events
108
 
                        // on a given day. "Ev." is short form for "Events".
109
 
                        // Please keep the translation of "Ev." to 3 characters only, as the week view
110
 
                        // where it's shown has limited space
111
 
                        text =  i18n.tr("%1 ev.").arg(events.length)
112
 
                    } else {
113
 
                        if( events.length > 1) {
114
 
                           // TRANSLATORS: the argument refers to the number of all day events
115
 
                           text = i18n.tr("%1 all day event", "%1 all day events", events.length).arg(events.length)
116
 
                        } else {
117
 
                            text = events[0].displayLabel;
118
 
                        }
119
 
                    }
120
 
                }
121
 
            }
122
 
        }
123
 
    }
124
 
 
125
 
    Component {
126
 
        id: popoverComponent
127
 
 
128
 
        Popover {
129
 
            id: popover
130
 
 
131
 
            property var events;
132
 
 
133
 
            ListView{
134
 
                id: allDayEventsList
135
 
 
136
 
                property var delegateHight: units.gu(4);
137
 
                property int maxEventToDisplay: 3;
138
 
 
139
 
                clip: true
140
 
                visible: true
141
 
                width: parent.width
142
 
                height: ( delegateHight * (events.length > maxEventToDisplay ? maxEventToDisplay : events.length) ) + units.gu(1)
143
 
                model: popover.events
144
 
                anchors {
145
 
                    top: parent.top; topMargin: units.gu(1); bottomMargin: units.gu(1)
146
 
                }
147
 
 
148
 
                delegate: Label{
149
 
                    text: modelData.displayLabel;
150
 
                    anchors.horizontalCenter: parent.horizontalCenter
151
 
                    color: "black"
152
 
                    height: allDayEventsList.delegateHight
153
 
 
154
 
                    MouseArea{
155
 
                        anchors.fill: parent
156
 
                        onClicked: {
157
 
                            popover.hide();
158
 
                            pageStack.push(Qt.resolvedUrl("EventDetails.qml"),{"event":modelData,"model": root.model});
159
 
                        }
160
 
                    }
161
 
                }
162
 
            }
163
 
        }
164
 
    }
165
 
}