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

« back to all changes in this revision

Viewing changes to EventBubble.qml

  • Committer: Kunal Parmar
  • Date: 2014-01-18 03:11:01 UTC
  • mto: This revision was merged to the branch mainline in revision 186.
  • Revision ID: pkunal.parmar@gmail.com-20140118031101-cif3k2wdidy9us8s
Print statement removed

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
 
 
19
 
import QtQuick 2.3
20
 
import Ubuntu.Components 1.1
21
 
import QtOrganizer 5.0
 
1
import QtQuick 2.0
 
2
import Ubuntu.Components 0.1
22
3
 
23
4
Item{
24
5
    id: infoBubble
25
6
 
26
7
    property var event;
27
 
    property var model;
28
8
 
29
9
    property int type: narrowType
30
10
    property int wideType: 1;
31
11
    property int narrowType: 2;
32
12
 
33
 
    property int depthInRow: 0;
34
 
    property int sizeOfRow:0
35
 
 
36
 
    property Flickable flickable;
37
 
 
38
 
    readonly property int minimumHeight: type == wideType
39
 
                                         ? eventDetails.item.timeLabelHeight + /*top-bottom margin*/ units.gu(2)
40
 
                                         : units.gu(2)
41
 
 
42
13
    signal clicked(var event);
43
14
 
44
15
    UbuntuShape{
45
16
        id: bg
46
17
        anchors.fill: parent
47
 
    }
48
 
 
49
 
    function resize() {
50
 
        var offset = parent.width/sizeOfRow;
51
 
        x = (depthInRow) * offset;
52
 
        width = parent.width - x;
53
 
    }
54
 
 
55
 
    Connections{
56
 
        target: parent
57
 
        onWidthChanged:{
58
 
            resize();
59
 
        }
 
18
        color: "white"
60
19
    }
61
20
 
62
21
    onEventChanged: {
63
 
        resize();
64
 
        assingnBgColor();
65
 
    }
66
 
 
67
 
    function assingnBgColor() {
68
 
        if (model && event ) {
69
 
            var collection = model.collection( event.collectionId );
70
 
            var now = new Date();
71
 
            if( event.endDateTime >= now) {
72
 
                bg.color = collection.color
73
 
            } else {
74
 
                //if event is on past then add some white color to original color
75
 
                bg.color = Qt.tint( collection.color, "#aaffffff" );
76
 
                return;
77
 
            }
78
 
        }
79
 
    }
80
 
 
81
 
    function layoutBubbleDetails() {
82
 
        if( !flickable || flickable === undefined ) {
 
22
        setDetails();
 
23
    }
 
24
 
 
25
    Component.onCompleted: {
 
26
        setDetails();
 
27
    }
 
28
 
 
29
    function setDetails() {
 
30
        if(event === null || event === undefined) {
83
31
            return;
84
32
        }
85
33
 
86
 
        if( infoBubble.y < flickable.contentY && infoBubble.height > flickable.height) {
87
 
            var y = (flickable.contentY - infoBubble.y) * 1.2;
88
 
            if( ( y + eventDetails.item.height + units.gu(2)) > infoBubble.height) {
89
 
                y = infoBubble.height - eventDetails.item.height - units.gu(2);
90
 
            }
91
 
            eventDetails.item.y = y;
92
 
        }
93
 
    }
94
 
 
95
 
    Loader {
96
 
        id:eventDetails
97
 
        sourceComponent: type == wideType ? detailsComponent : undefined
98
 
    }
99
 
 
100
 
    Component {
101
 
        id:detailsComponent
102
 
 
103
 
        Item {
104
 
 
105
 
            id: detailsItems
106
 
            property alias timeLabelHeight : timeLabel.height
107
 
 
108
 
            width: parent.width
109
 
            height: detailsColumn.height
110
 
 
111
 
            Column {
112
 
                id: detailsColumn
113
 
 
114
 
                anchors {
115
 
                    top: parent.top
116
 
                    left: parent.left
117
 
                    right: parent.right
118
 
                    margins: units.gu(0.5)
119
 
                }
120
 
 
121
 
                Label {
122
 
                    id: timeLabel
123
 
                    objectName: "timeLabel"
124
 
                    color: "White"
125
 
                    fontSize:"small"
126
 
                    font.bold: true
127
 
                    width: parent.width
128
 
                }
129
 
 
130
 
                Label {
131
 
                    id: titleLabel
132
 
                    objectName: "titleLabel"
133
 
                    color: "White"
134
 
                    fontSize: "small"
135
 
                    width: parent.width
136
 
                    wrapMode: Text.WrapAtWordBoundaryOrAnywhere
137
 
                }
138
 
 
139
 
                Label {
140
 
                    id: descriptionLabel
141
 
                    color: "White"
142
 
                    fontSize: "x-small"
143
 
                    width: parent.width
144
 
                }
145
 
            }
146
 
 
147
 
            onHeightChanged: {
148
 
                layoutBubbleDetails();
149
 
            }
150
 
 
151
 
            Connections {
152
 
                target: infoBubble
153
 
                onFlickableChanged: {
154
 
                    if (flickable && infoBubble.height > flickable.height) {
155
 
                        flickable.onContentYChanged.connect(layoutBubbleDetails);
156
 
                    }
157
 
                }
158
 
 
159
 
                onHeightChanged: {
160
 
                    if(flickable && infoBubble.height > flickable.height) {
161
 
                        flickable.onContentYChanged.connect(layoutBubbleDetails);
162
 
                    }
163
 
                }
164
 
 
165
 
                onEventChanged: {
166
 
                    setDetails();
167
 
                }
168
 
            }
169
 
 
170
 
            function setDetails() {
171
 
                if(event === null || event === undefined) {
172
 
                    return;
173
 
                }
174
 
 
175
 
                var startTime = event.startDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat)
176
 
                var endTime = event.endDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat)
177
 
 
178
 
                if (type === wideType) {
179
 
                    timeLabel.text = ""
180
 
                    titleLabel.text = ""
181
 
                    descriptionLabel.text = ""
182
 
                    //height is less then set only event title
183
 
                    if( infoBubble.height > minimumHeight ) {
184
 
                        //on wide type show all details
185
 
                        if( infoBubble.height > titleLabel.y + titleLabel.height + units.gu(1)) {
186
 
                            // TRANSLATORS: the first argument (%1) refers to a start time for an event,
187
 
                            // while the second one (%2) refers to the end time
188
 
                            var timeString = i18n.tr("%1 - %2").arg(startTime).arg(endTime)
189
 
                            timeLabel.text = timeString
190
 
                            titleLabel.text = event.displayLabel
191
 
                        } else if ( event.displayLabel ) {
192
 
                            // TRANSLATORS: the first argument (%1) refers to a start time for an event,
193
 
                            // while the second one (%2) refers to title of event
194
 
                            timeLabel.text = i18n.tr("%1 - %2").arg(startTime).arg(event.displayLabel);
195
 
                        }
196
 
 
197
 
                        if (event.description) {
198
 
                            descriptionLabel.text = event.description
199
 
                            //descriptionText = event.description
200
 
                            //If content is too much don't display.
201
 
                            if (infoBubble.height < descriptionLabel.y + descriptionLabel.height + units.gu(1)) {
202
 
                                descriptionLabel.text = ""
203
 
                            }
204
 
                        }
205
 
 
206
 
                        layoutBubbleDetails();
207
 
                    } else if (event.displayLabel){
208
 
                        eventDetails.item.timeLableText = event.displayLabel;
209
 
                    }
210
 
                }
211
 
            }
212
 
        }
213
 
    }
214
 
 
215
 
    MouseArea {
 
34
        // TRANSLATORS: this is a time formatting string,
 
35
        // see http://qt-project.org/doc/qt-5.0/qtqml/qml-qtquick2-date.html#details for valid expressions
 
36
        var timeFormat = i18n.tr("hh:mm");
 
37
        var startTime = event.startDateTime.toLocaleTimeString(Qt.locale(), timeFormat)
 
38
        var endTime = event.endDateTime.toLocaleTimeString(Qt.locale(), timeFormat)
 
39
        // TRANSLATORS: the first argument (%1) refers to a start time for an event,
 
40
        // while the second one (%2) refers to the end time
 
41
        var timeString = i18n.tr("%1 - %2").arg(startTime).arg(endTime)
 
42
 
 
43
        timeLabel.text = ""
 
44
        titleLabel.text = ""
 
45
        descriptionLabel.text = ""
 
46
 
 
47
        if( type == wideType) {
 
48
            timeLabel.text = timeString
 
49
 
 
50
            if( event.displayLabel)
 
51
                titleLabel.text = event.displayLabel;
 
52
 
 
53
            if( event.description)
 
54
                descriptionLabel.text = event.description
 
55
        } else {
 
56
            timeLabel.text = startTime
 
57
        }
 
58
    }
 
59
 
 
60
    Column{
 
61
        width: parent.width
 
62
        Row{
 
63
            width: parent.width
 
64
 
 
65
            Rectangle{
 
66
                width: units.gu(1)
 
67
                radius: width/2
 
68
                height: width
 
69
                color: "#715772"
 
70
                anchors.verticalCenter: parent.verticalCenter
 
71
                antialiasing: true
 
72
            }
 
73
 
 
74
            Label{
 
75
                id: timeLabel
 
76
                fontSize:"small";
 
77
                color:"gray"
 
78
                width: parent.width
 
79
            }
 
80
        }
 
81
 
 
82
        Label{
 
83
            id: titleLabel
 
84
            x: units.gu(1)
 
85
            fontSize:"small";
 
86
            color:"black"
 
87
            wrapMode: Text.WrapAtWordBoundaryOrAnywhere
 
88
            width: parent.width
 
89
            visible: type == wideType
 
90
        }
 
91
 
 
92
        Label{
 
93
            id: descriptionLabel
 
94
            x: units.gu(1)
 
95
            fontSize:"small";
 
96
            color:"gray"
 
97
            wrapMode: Text.WrapAtWordBoundaryOrAnywhere
 
98
            width: parent.width
 
99
            visible: type == wideType
 
100
        }
 
101
    }
 
102
 
 
103
    MouseArea{
216
104
        anchors.fill: parent
217
105
        onClicked: {
218
106
            infoBubble.clicked(event);