define("dojo/dnd/TimedMoveable", ["../main", "./Moveable"], function(dojo) { // module: // dojo/dnd/TimedMoveable // summary: // TODOC /*===== dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], { // timeout: Number // delay move by this number of ms, // accumulating position changes during the timeout timeout: 0 }); =====*/ // precalculate long expressions var oldOnMove = dojo.dnd.Moveable.prototype.onMove; dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, { // summary: // A specialized version of Moveable to support an FPS throttling. // This class puts an upper restriction on FPS, which may reduce // the CPU load. The additional parameter "timeout" regulates // the delay before actually moving the moveable object. // object attributes (for markup) timeout: 40, // in ms, 40ms corresponds to 25 fps constructor: function(node, params){ // summary: // an object that makes a node moveable with a timer // node: Node||String // a node (or node's id) to be moved // params: dojo.dnd.__TimedMoveableArgs // object with additional parameters. // sanitize parameters if(!params){ params = {}; } if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){ this.timeout = params.timeout; } }, onMoveStop: function(/* dojo.dnd.Mover */ mover){ if(mover._timer){ // stop timer clearTimeout(mover._timer); // reflect the last received position oldOnMove.call(this, mover, mover._leftTop) } dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments); }, onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ mover._leftTop = leftTop; if(!mover._timer){ var _t = this; // to avoid using dojo.hitch() mover._timer = setTimeout(function(){ // we don't have any pending requests mover._timer = null; // reflect the last received position oldOnMove.call(_t, mover, mover._leftTop); }, this.timeout); } } }); return dojo.dnd.TimedMoveable; });