1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
import QtQuick 2.0
import Ubuntu.Components 0.1
import "dateExt.js" as DateExt
Item {
id: bubbleOverLay
property var delegate;
property var day;
property int hourHeight: units.gu(10)
property var model;
MouseArea {
anchors.fill: parent
objectName: "mouseArea"
onPressAndHold: {
var selectedDate = new Date(day);
var hour = parseInt(mouseY / hourHeight);
selectedDate.setHours(hour)
pageStack.push(Qt.resolvedUrl("NewEvent.qml"), {"date":selectedDate, "model":eventModel});
}
}
TimeSeparator {
id: separator
objectName: "separator"
width: bubbleOverLay.width
visible: false
z:1
}
QtObject {
id: intern
property var now : new Date();
property var eventMap;
property var unUsedEvents: new Array;
}
function showEventDetails(event) {
pageStack.push(Qt.resolvedUrl("EventDetails.qml"), {"event":event,"model":model});
}
WorkerScript {
id: eventLayoutHelper
source: "EventLayoutHelper.js"
onMessage: {
layoutEvents(messageObject.schedules,messageObject.maxDepth);
}
}
function layoutEvents(array, depth) {
var width = bubbleOverLay.width;
var offset = width/(depth+1);
for(var i=0; i < array.length ; ++i) {
var schedule = array[i];
var x = (schedule.depth) * offset
var w = width - x;
var event = intern.eventMap[schedule.id];
bubbleOverLay.createEvent(event , x, w);
}
}
function createEvents() {
if(!bubbleOverLay || bubbleOverLay == undefined) {
return;
}
destroyAllChildren();
var eventMap = {};
var allSchs = [];
var startDate = new Date(day).midnight();
var endDate = new Date(day).endOfDay();
var items = model.getItems(startDate,endDate);
for(var i = 0; i < items.length; ++i) {
var event = items[i];
if(event.allDay) {
continue;
}
var schedule = {"startDateTime": event.startDateTime, "endDateTime": event.endDateTime,"id":event.itemId };
allSchs.push(schedule);
eventMap[event.itemId] = event;
}
intern.eventMap = eventMap;
eventLayoutHelper.sendMessage(allSchs);
if( intern.now.isSameDay( bubbleOverLay.day ) ) {
bubbleOverLay.showSeparator(intern.now.getHours());
}
}
function destroyAllChildren() {
for( var i = children.length - 1; i >= 0; --i ) {
if( children[i].objectName === "mouseArea" ) {
continue;
}
children[i].visible = false;
if( children[i].objectName !== "separator") {
children[i].clicked.disconnect( bubbleOverLay.showEventDetails );
intern.unUsedEvents.push(children[i])
}
}
}
function createEvent( event, x, width ) {
var eventBubble;
if( intern.unUsedEvents.length == 0) {
eventBubble = delegate.createObject(bubbleOverLay);
} else {
eventBubble = intern.unUsedEvents.pop();
}
var hour = event.startDateTime.getHours();
var yPos = (( event.startDateTime.getMinutes() * hourHeight) / 60) + hour * hourHeight
eventBubble.y = yPos;
var durationMin = (event.endDateTime.getHours() - event.startDateTime.getHours()) * 60;
durationMin += (event.endDateTime.getMinutes() - event.startDateTime.getMinutes());
var height = (durationMin * hourHeight )/ 60;
eventBubble.height = (height > eventBubble.minimumHeight) ? height:eventBubble.minimumHeight ;
eventBubble.model = bubbleOverLay.model
eventBubble.x = x;
eventBubble.width = width;
eventBubble.event = event
eventBubble.visible = true;
eventBubble.clicked.connect( bubbleOverLay.showEventDetails );
}
function showSeparator(hour) {
var y = ((intern.now.getMinutes() * hourHeight) / 60) + hour * hourHeight;
separator.y = y;
separator.visible = true;
}
}
|