[483] | 1 | define(['dojo', 'dijit', 'dijit/_Widget', 'dijit/_TemplatedMixin'],function(dojo, dijit, _Widget, _TemplatedMixin){ |
---|
| 2 | |
---|
| 3 | return dojo.declare("dojox.av.widget.ProgressSlider", [_Widget, _TemplatedMixin], { |
---|
| 4 | // summary: |
---|
| 5 | // A custom slider widget to use with dojox.av.widget.Player. |
---|
| 6 | // description: |
---|
| 7 | // Displays the current playhead position of the media. Has two |
---|
| 8 | // progress bars: one for playhead position, and one for download |
---|
| 9 | // progress. |
---|
| 10 | |
---|
| 11 | templateString: dojo.cache("dojox.av.widget","resources/ProgressSlider.html"), |
---|
| 12 | postCreate: function(){ |
---|
| 13 | // summary: |
---|
| 14 | // Initialize slider. |
---|
| 15 | |
---|
| 16 | this.seeking = false; |
---|
| 17 | this.handleWidth = dojo.marginBox(this.handle).w; |
---|
| 18 | var dim = dojo.coords(this.domNode); |
---|
| 19 | this.finalWidth = dim.w |
---|
| 20 | this.width = dim.w-this.handleWidth; |
---|
| 21 | this.x = dim.x; |
---|
| 22 | |
---|
| 23 | dojo.setSelectable(this.domNode, false); |
---|
| 24 | dojo.setSelectable(this.handle, false); |
---|
| 25 | }, |
---|
| 26 | setMedia: function(/* Object */med, playerWidget){ |
---|
| 27 | // summary: |
---|
| 28 | // A common method to set the media in all Player widgets. |
---|
| 29 | // May do connections and initializations. |
---|
| 30 | |
---|
| 31 | this.playerWidget = playerWidget; |
---|
| 32 | this.media = med; |
---|
| 33 | dojo.connect(this.media, "onMetaData", this, function(data){ |
---|
| 34 | if(data && data.duration){ |
---|
| 35 | this.duration = data.duration; |
---|
| 36 | } |
---|
| 37 | }); |
---|
| 38 | dojo.connect(this.media, "onEnd", this, function(){ |
---|
| 39 | dojo.disconnect(this.posCon); |
---|
| 40 | this.setHandle(this.duration); |
---|
| 41 | }); |
---|
| 42 | dojo.connect(this.media, "onStart", this, function(){ |
---|
| 43 | this.posCon = dojo.connect(this.media, "onPosition", this, "setHandle"); |
---|
| 44 | }); |
---|
| 45 | |
---|
| 46 | dojo.connect(this.media, "onDownloaded", this, function(percent){ |
---|
| 47 | this.setLoadedPosition(percent*.01); |
---|
| 48 | this.width = this.finalWidth * .01 * percent; |
---|
| 49 | }); |
---|
| 50 | |
---|
| 51 | }, |
---|
| 52 | onDrag: function(/* HTMLEvent */ evt){ |
---|
| 53 | // summary: |
---|
| 54 | // Fired when the mouse is moved. Sets the slider. |
---|
| 55 | |
---|
| 56 | var x = evt.clientX - this.x; |
---|
| 57 | if(x<0) x = 0; |
---|
| 58 | if(x>this.width-this.handleWidth) x=this.width-this.handleWidth; |
---|
| 59 | |
---|
| 60 | var p = x/this.finalWidth; |
---|
| 61 | this.media.seek( this.duration * p ); |
---|
| 62 | dojo.style(this.handle, "marginLeft", x+"px"); |
---|
| 63 | dojo.style(this.progressPosition, "width", x+"px"); |
---|
| 64 | }, |
---|
| 65 | startDrag: function(){ |
---|
| 66 | // summary: |
---|
| 67 | // Fired onmousedown of the slider handle. |
---|
| 68 | |
---|
| 69 | dojo.setSelectable(this.playerWidget.domNode, false); |
---|
| 70 | this.seeking = true; |
---|
| 71 | this.cmove = dojo.connect(dojo.doc, "mousemove", this, "onDrag"); |
---|
| 72 | this.cup = dojo.connect(dojo.doc, "mouseup", this, "endDrag"); |
---|
| 73 | }, |
---|
| 74 | endDrag: function(){ |
---|
| 75 | // summary: |
---|
| 76 | // Fired on document.onmouseup. |
---|
| 77 | |
---|
| 78 | dojo.setSelectable(this.playerWidget.domNode, true); |
---|
| 79 | this.seeking = false; |
---|
| 80 | if(this.cmove) dojo.disconnect(this.cmove); |
---|
| 81 | if(this.cup) dojo.disconnect(this.cup); |
---|
| 82 | this.handleOut(); |
---|
| 83 | }, |
---|
| 84 | |
---|
| 85 | setHandle: function(time){ |
---|
| 86 | // summary: |
---|
| 87 | // Sets the slider handle (when it is not being dragged) |
---|
| 88 | |
---|
| 89 | if(!this.seeking){ |
---|
| 90 | var w = this.width-this.handleWidth; |
---|
| 91 | var p = time/this.duration; |
---|
| 92 | var x = p*w; |
---|
| 93 | |
---|
| 94 | dojo.style(this.handle, "marginLeft", x+"px"); |
---|
| 95 | dojo.style(this.progressPosition, "width", x+"px"); |
---|
| 96 | } |
---|
| 97 | }, |
---|
| 98 | |
---|
| 99 | setLoadedPosition: function(decimal){ |
---|
| 100 | // summary: |
---|
| 101 | // Sets the download progress bar to the percentage of how much |
---|
| 102 | // the media has been downloaded. |
---|
| 103 | dojo.style(this.progressLoaded, "width", (this.finalWidth*decimal)+"px"); |
---|
| 104 | }, |
---|
| 105 | |
---|
| 106 | handleOver: function(){ |
---|
| 107 | // summary: |
---|
| 108 | // Highlights the slider handle on mouseover, and |
---|
| 109 | // stays highlighted during drag. |
---|
| 110 | |
---|
| 111 | dojo.addClass(this.handle, "over"); |
---|
| 112 | }, |
---|
| 113 | handleOut: function(){ |
---|
| 114 | // summary: |
---|
| 115 | // Unhighlights handle onmouseover, or on endDrag. |
---|
| 116 | |
---|
| 117 | if(!this.seeking){ |
---|
| 118 | dojo.removeClass(this.handle, "over"); |
---|
| 119 | } |
---|
| 120 | }, |
---|
| 121 | onResize: function(playerDimensions){ |
---|
| 122 | // summary: |
---|
| 123 | // Handles player resize. Need to recalculate the width of |
---|
| 124 | // position an download bars. |
---|
| 125 | var dim = dojo.coords(this.domNode); |
---|
| 126 | this.finalWidth = dim.w; |
---|
| 127 | |
---|
| 128 | } |
---|
| 129 | |
---|
| 130 | }); |
---|
| 131 | |
---|
| 132 | }); |
---|