diff -r 7b55777486c3 -r 75ba66457232 src/js/widgets/sliceWidget.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/js/widgets/sliceWidget.js Fri Apr 06 16:55:34 2012 +0200 @@ -0,0 +1,163 @@ +/** A widget to create a new segment */ +IriSP.SliceWidget = function(Popcorn, config, Serializer) { + IriSP.Widget.call(this, Popcorn, config, Serializer); + +}; + +IriSP.SliceWidget.prototype = new IriSP.Widget(); + +IriSP.SliceWidget.prototype.draw = function() { + var templ = Mustache.to_html(IriSP.sliceWidget_template); + this.selector.append(templ); + + this.sliceZone = this.selector.find(".Ldt-sliceZone"); + + /* global variables used to keep the position and width + of the zone. + */ + this.zoneLeft = 0; + this.zoneWidth = 0; + + this.leftHandle = this.selector.find(".Ldt-sliceLeftHandle"); + this.rightHandle = this.selector.find(".Ldt-sliceRightHandle"); + + var left = this.selector.offset().left; + var top = this.selector.offset().top; + + // a bug in firefox makes it use the wrong format + if (!IriSP.jQuery.browser.mozilla) { + // contain the handles correctly - we cannot set + // containment: parent because it wouldn't allow to select the + // whole slice, so we have to compute a box in which the slice is + // allowed to move. + var containment = [left - 8, top, this.selector.width() + left, top]; + + // var containment = [left - 16, top, this.selector.width() + left - 8, top]; + this.leftHandle.draggable({axis: "x", + drag: IriSP.wrap(this, this.leftHandleDragged), + containment: containment + }); + + containment = [left, top, this.selector.width() + left, top]; + // containment = [left, top, this.selector.width() + left - 8, top]; + this.rightHandle.draggable({axis: "x", + drag: IriSP.wrap(this, this.rightHandleDragged), + containment: containment + }); + + } else { // firefox + // we need to define a containment specific to firefox. + + var containment = [left - 16, top, this.selector.width() + left - 8, top]; + this.leftHandle.draggable({axis: "x", + drag: IriSP.wrap(this, this.leftHandleDragged), + containment: containment + }); + + containment = [left, top, this.selector.width() + left - 8, top]; + this.rightHandle.draggable({axis: "x", + drag: IriSP.wrap(this, this.rightHandleDragged), + containment: containment + }); + } + + this.leftHandle.css("position", "absolute"); + this.rightHandle.css("position", "absolute"); + + this._Popcorn.listen("IriSP.SliceWidget.position", + IriSP.wrap(this, this.positionSliceHandler)); + + this._Popcorn.listen("IriSP.SliceWidget.show", IriSP.wrap(this, this.show)); + this._Popcorn.listen("IriSP.SliceWidget.hide", IriSP.wrap(this, this.hide)); + this.selector.hide(); +}; + +/** responds to an "IriSP.SliceWidget.position" message + @param params an array with the first element being the left distance in + percents and the second element the width of the slice in pixels +*/ +IriSP.SliceWidget.prototype.positionSliceHandler = function(params) { + left = params[0]; + width = params[1]; + + this.zoneLeft = left; + this.zoneWidth = width; + this.sliceZone.css("left", left + "px"); + this.sliceZone.css("width", width + "px"); + this.leftHandle.css("left", (left - 7) + "px"); + this.rightHandle.css("left", left + width + "px"); + + this._leftHandleOldLeft = left - 7; + this._rightHandleOldLeft = left + width; +}; + +/** handle a dragging of the left handle */ +IriSP.SliceWidget.prototype.leftHandleDragged = function(event, ui) { + /* we have a special variable, this._leftHandleOldLeft, to keep the + previous position of the handle. We do that to know in what direction + is the handle being dragged + */ + + var currentX = this.leftHandle.offset().left; + var rightHandleX = Math.floor(this.rightHandle.position()["left"]); + + var container_offset = this.selector.offset().left; + + if (Math.floor(ui.position.left) >= rightHandleX - 7) { + /* prevent the handle from moving past the right handle */ + ui.position.left = rightHandleX - 7; + } + + this.zoneWidth = rightHandleX - Math.floor(ui.position.left) - 7; + this.zoneLeft = Math.floor(ui.position.left) + 8; + + this.sliceZone.css("width", this.zoneWidth); + this.sliceZone.css("left", this.zoneLeft + "px"); + + this._leftHandleOldLeft = ui.position.left; + this.broadcastChanges(); + +}; + +/** handle a dragging of the right handle */ +IriSP.SliceWidget.prototype.rightHandleDragged = function(event, ui) { + /* we have a special variable, this._leftHandleOldLeft, to keep the + previous position of the handle. We do that to know in what direction + is the handle being dragged + */ + + var currentX = this.leftHandle.position()["left"]; + var leftHandleX = Math.floor(this.leftHandle.position()["left"]); + + var container_offset = this.selector.offset().left + this.selector.width(); + + if (Math.floor(ui.position.left) < leftHandleX + 7) { + /* prevent the handle from moving past the left handle */ + ui.position.left = leftHandleX + 7; + } + + this.zoneWidth = Math.floor(ui.position.left) - (leftHandleX + 7); + + this.sliceZone.css("width", this.zoneWidth); + //this.sliceZone.css("left", this.zoneLeft + "px"); + this._rightHandleOldLeft = Math.floor(this._rightHandleOldLeft); + this.broadcastChanges(); +}; + +/** tell to the world that the coordinates of the slice have + changed +*/ +IriSP.SliceWidget.prototype.broadcastChanges = function() { + var leftPercent = (this.zoneLeft / this.selector.width()) * 100; + var zonePercent = (this.zoneWidth / this.selector.width()) * 100; + + this._Popcorn.trigger("IriSP.SliceWidget.zoneChange", [leftPercent, zonePercent]); +}; + +IriSP.SliceWidget.prototype.show = function() { + this.selector.show(); +}; + +IriSP.SliceWidget.prototype.hide = function() { + this.selector.hide(); +}; \ No newline at end of file