1 IriSP.ArrowWidget = function(Popcorn, config, Serializer) { |
|
2 IriSP.Widget.call(this, Popcorn, config, Serializer); |
|
3 |
|
4 this._oldAnnotation = null; |
|
5 this._blockArrow = false; |
|
6 }; |
|
7 |
|
8 |
|
9 IriSP.ArrowWidget.prototype = new IriSP.Widget(); |
|
10 |
|
11 IriSP.ArrowWidget.prototype.clear = function() { |
|
12 |
|
13 }; |
|
14 |
|
15 IriSP.ArrowWidget.prototype.clearWidget = function() { |
|
16 }; |
|
17 |
|
18 IriSP.ArrowWidget.prototype.draw = function() { |
|
19 var templ = Mustache.to_html(IriSP.arrowWidget_template, {}); |
|
20 this.selector.append(templ); |
|
21 this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeUpdateHandler)); |
|
22 this._Popcorn.listen("IriSP.ArrowWidget.blockArrow", IriSP.wrap(this, this.blockArrow)); |
|
23 this._Popcorn.listen("IriSP.ArrowWidget.releaseArrow", IriSP.wrap(this, this.releaseArrow)); |
|
24 |
|
25 }; |
|
26 |
|
27 IriSP.ArrowWidget.prototype.timeUpdateHandler = function(percents) { |
|
28 if (this._blockArrow) |
|
29 return; |
|
30 |
|
31 var currentTime = this._Popcorn.currentTime(); |
|
32 var currentAnnotation = this._serializer.currentChapitre(currentTime); |
|
33 if (IriSP.null_or_undefined(currentAnnotation)) { |
|
34 var c_annots = this._serializer.currentAnnotation(currentTime) |
|
35 if (c_annots.length != 0) |
|
36 var currentAnnotation = c_annots[0]; // FIXME : use the others ? |
|
37 else |
|
38 return; |
|
39 } |
|
40 |
|
41 /* move the arrow only if the current annotation changes */ |
|
42 if (currentAnnotation != this._oldAnnotation) { |
|
43 var begin = (+ currentAnnotation.begin) / 1000; |
|
44 var end = (+ currentAnnotation.end) / 1000; |
|
45 |
|
46 var duration = this.getDuration() / 1000; |
|
47 var middle_time = (begin + end) / 2; |
|
48 var percents = middle_time / duration; |
|
49 |
|
50 // we need to apply a fix because the arrow has a certain length |
|
51 // it's half the length of the arrow (27 / 2). We need to convert |
|
52 // it in percents though. |
|
53 var totalWidth = this.selector.width(); |
|
54 var pixels = percents * totalWidth; |
|
55 var correction = (27 / 2); |
|
56 var corrected_pixels = pixels - correction; |
|
57 |
|
58 /* make sure that the arrow is aligned with the pattern |
|
59 of the widget under it */ |
|
60 if (corrected_pixels % 3 != 0) |
|
61 corrected_pixels -= (corrected_pixels % 3 - 1); |
|
62 |
|
63 /* don't move out of the screen */ |
|
64 if (corrected_pixels <= 0) |
|
65 corrected_pixels = 0; |
|
66 |
|
67 if (corrected_pixels <= 15) { |
|
68 this.selector.children(".Ldt-arrowWidget").removeClass("Ldt-arrowLeftEdge Ldt-arrowCenter Ldt-arrowRightEdge") |
|
69 .addClass("Ldt-arrowLeftEdge"); |
|
70 } else if (corrected_pixels >= totalWidth - 25) { |
|
71 this.selector.children(".Ldt-arrowWidget").removeClass("Ldt-arrowLeftEdge Ldt-arrowCenter Ldt-arrowRightEdge") |
|
72 .addClass("Ldt-arrowRightEdge"); |
|
73 } else { |
|
74 this.selector.children(".Ldt-arrowWidget").removeClass("Ldt-arrowLeftEdge Ldt-arrowCenter Ldt-arrowRightEdge") |
|
75 .addClass("Ldt-arrowCenter"); |
|
76 } |
|
77 |
|
78 this.selector.children(".Ldt-arrowWidget").animate({"left" : corrected_pixels + "px"}); |
|
79 |
|
80 this._oldAnnotation = currentAnnotation; |
|
81 } |
|
82 }; |
|
83 |
|
84 /** Block the arrow for instance when the user is annotating */ |
|
85 IriSP.ArrowWidget.prototype.blockArrow = function() { |
|
86 this._blockArrow = true; |
|
87 }; |
|
88 |
|
89 IriSP.ArrowWidget.prototype.releaseArrow = function() { |
|
90 this._blockArrow = false; |
|
91 }; |
|