~renatofilho/ubuntu-calendar-app/optimize

« back to all changes in this revision

Viewing changes to calendar_canvas_worker.js

  • Committer: Renato Araujo Oliveira Filho
  • Date: 2016-02-29 13:35:03 UTC
  • Revision ID: renato.filho@canonical.com-20160229133503-e32ztw19v9wkvlc5
Use async function to calculate event layout.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
WorkerScript.onMessage = function(message) {
 
2
    var processedEvents =  dayEventsMap(message.events)
 
3
    WorkerScript.sendMessage({'reply': processedEvents})
 
4
}
 
5
 
 
6
function sortByStartAndSize(eventA, eventB)
 
7
{
 
8
    var sort = sortEventsByStart(eventA, eventB)
 
9
    if (sort === 0)
 
10
        sort = sortEventsBySize(eventA, eventB)
 
11
    return sort
 
12
}
 
13
 
 
14
function sortEventsByStart(eventA, eventB)
 
15
{
 
16
        if (eventA.startTime < eventB.startTime)
 
17
            return -1
 
18
        else if (eventA.startTime > eventB.startTime)
 
19
            return 1
 
20
        else
 
21
            return 0
 
22
}
 
23
 
 
24
function sortEventsBySize(eventA, eventB)
 
25
{
 
26
    var eventAEndTime = eventA.endTimeInSecs
 
27
    var eventBEndTime = eventB.endTimeInSecs
 
28
    if (eventAEndTime > eventBEndTime)
 
29
        return -1
 
30
    else if (eventAEndTime < eventBEndTime)
 
31
        return 1
 
32
    return 0
 
33
}
 
34
 
 
35
 
 
36
function findOptimalY(intersections)
 
37
{
 
38
    if (intersections.length === 0)
 
39
        return 0
 
40
 
 
41
    var found
 
42
    var optimalY = 0
 
43
    while(true) {
 
44
        found = false
 
45
        for(var i=0; i < intersections.length; i++) {
 
46
            if (optimalY === intersections[i].y) {
 
47
                found = true
 
48
                break
 
49
            }
 
50
        }
 
51
        if (found)
 
52
            optimalY++
 
53
        else
 
54
            return optimalY
 
55
    }
 
56
}
 
57
 
 
58
function dayEventsMap(eventsInfo)
 
59
{
 
60
    eventsInfo.sort(sortByStartAndSize)
 
61
 
 
62
    // intersections
 
63
    var lines = []
 
64
    for(var i=0; i < eventsInfo.length; i++) {
 
65
        var eventA = eventsInfo[i]
 
66
        line = [eventA]
 
67
        for(var y=0; y < eventsInfo.length; y++) {
 
68
            if (y === i)
 
69
                continue
 
70
            var eventB = eventsInfo[y]
 
71
            if ((eventA.startTime < eventB.endTime) &&
 
72
                (eventB.startTime < eventA.endTime)) {
 
73
                line.push(eventB)
 
74
            }
 
75
        }
 
76
        eventA.intersectionCount = line.length - 1
 
77
        lines.push(line)
 
78
    }
 
79
 
 
80
    // calculate y
 
81
    for (var l=0; l < lines.length; l++) {
 
82
        var time = -1
 
83
 
 
84
        var line = lines[l]
 
85
        var eventA = line[0]
 
86
        if (eventA.y === -1) {
 
87
            eventA.y = findOptimalY(line)
 
88
        }
 
89
        var time = eventA.startTime
 
90
        for (var i=1; i < line.length; i++) {
 
91
            var event = line[i]
 
92
            if ((event.startTime === time) && (event.y === -1)) {
 
93
                event.y = findOptimalY(line)
 
94
            }
 
95
        }
 
96
    }
 
97
 
 
98
    for (var l=0; l < lines.length; l++) {
 
99
        var line = lines[l]
 
100
        var eventA = line[0]
 
101
        var maxY = eventA.y
 
102
        for (var i=1; i < line.length; i++) {
 
103
            var event = line[i]
 
104
            if (maxY < event.y)
 
105
                maxY = event.y
 
106
        }
 
107
        if (maxY > 0)
 
108
            eventA.width = 1 / (maxY + 1)
 
109
    }
 
110
 
 
111
    return eventsInfo
 
112
}