src/js/widgets/arrowWidget.js
branchnew-model
changeset 876 03967b6ada7c
parent 875 43629caa77bc
child 880 4c7b33bf2795
equal deleted inserted replaced
875:43629caa77bc 876:03967b6ada7c
     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 };