Revision: 3259 http://vexi.svn.sourceforge.net/vexi/?rev=3259&view=rev Author: clrg Date: 2008-12-10 03:11:31 +0000 (Wed, 10 Dec 2008)
Log Message: ----------- Implement RMB relative dragging for scrollbars Modified Paths: -------------- trunk/widgets/org.vexi.widgets/src/org/vexi/lib/role/draggable.t trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/scrollbar.t Modified: trunk/widgets/org.vexi.widgets/src/org/vexi/lib/role/draggable.t =================================================================== (Binary files differ) Modified: trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/scrollbar.t =================================================================== --- trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/scrollbar.t 2008-12-10 02:32:44 UTC (rev 3258) +++ trunk/widgets/org.vexi.widgets/src/org/vexi/lib/widget/scrollbar.t 2008-12-10 03:11:31 UTC (rev 3259) @@ -35,13 +35,18 @@ var percentset; var trackpos; + // for efficient lookups + var max = vexi.math.max; + var min = vexi.math.min; + var vport, varea; + //////// // sync functions /** sync viewport with thumb position */ var syncViewport = function() { - if (viewport and viewport[0]) - viewport[0][pos] = percent * (viewport[dim] - viewport[0][dim]); + if (vport and varea) + varea[pos] = percent * (vport[dim] - varea[dim]); } /** sync specific listener with viewport position */ @@ -64,7 +69,7 @@ // don't do much if we're hidden if (hide) display = false; // conditions where thumb placement is not [yet] desirable - else if (!surface || viewport == null || viewport[0] == null || viewport[dim] >= viewport[0][dim]) { + else if (!surface || vport == null || varea == null || vport[dim] >= varea[dim]) { if (enabled) enabled = false; if (autohide) display = false; else { @@ -76,10 +81,10 @@ if (!enabled) enabled = true; if (!display) display = true; th_thumb[dim] = - vexi.math.max(minthumbsize, - vexi.math.min(th_track[dim], - (viewport[dim] / viewport[0][dim]) * th_track[dim])); - th_thumb[pos] = vexi.math.max(0, (th_track[dim] - th_thumb[dim]) * percent); + max(minthumbsize, + min(th_track[dim], + (vport[dim] / varea[dim]) * th_track[dim])); + th_thumb[pos] = max(0, (th_track[dim] - th_thumb[dim]) * percent); } } @@ -104,25 +109,25 @@ var syncThumbTrap = function(v) { cascade = v; syncThumb(); } var viewportMove = function(v) { - cascade = vexi.math.min(0, vexi.math.max(v, viewport[dim] - viewport[0][dim])); + cascade = min(0, max(v, vport[dim] - varea[dim])); if (percentset) return; percentset = true; - percent = viewport[0][pos] / (viewport[dim] - viewport[0][dim]); + percent = varea[pos] / (vport[dim] - varea[dim]); syncThumb(); syncAllListeners(); percentset = false; } - /** viewport or viewport[0] resized */ + /** viewport or varea resized */ var viewportResize = function(v) { cascade = v; if (percentset) return; // avoid resetting percent percentset = true; // viewport bigger than view subject - if (viewport[dim] >= viewport[0][dim]) viewport[0][pos] = 0; + if (vport[dim] >= varea[dim]) varea[pos] = 0; // constrain viewport position - else viewport[0][pos] = -percent * (viewport[0][dim] - viewport[dim]); + else varea[pos] = -percent * (varea[dim] - vport[dim]); // sync thumbsize to viewport syncThumb(); percentset = false; @@ -171,13 +176,13 @@ } // reassign viewport traps if (viewport) { - if (!viewport[0]) throw "viewport must have a child"; + if (!varea) throw "viewport must have a child"; viewport[flip(dim)] --= viewportResize; viewport[dim] ++= viewportResize; - viewport[0][flip(dim)] --= viewportResize; - viewport[0][flip(pos)] --= viewportMove; - viewport[0][dim] ++= viewportResize; - viewport[0][pos] ++= viewportMove; + varea[flip(dim)] --= viewportResize; + varea[flip(pos)] --= viewportMove; + varea[dim] ++= viewportResize; + varea[pos] ++= viewportMove; } // reassign listener traps var olddim = flip(dim); @@ -196,10 +201,10 @@ /** attempt to shift viewport by given amount */ shift ++= function(v) { - viewport[0][pos] = - vexi.math.min(0, - vexi.math.max(viewport[dim] - viewport[0][dim], - viewport[0][pos] - v)); + varea[pos] = + min(0, + max(viewport[dim] - varea[dim], + varea[pos] - v)); return;; } @@ -207,10 +212,10 @@ viewport ++= function(v) { // clean up old viewport if (viewport) { - if (!viewport[0]) throw "viewport must have a child"; + if (!varea) throw "viewport must have a child"; viewport[dim] --= viewportResize; - viewport[0][dim] --= viewportResize; - viewport[0][pos] --= viewportMove; + varea[dim] --= viewportResize; + varea[pos] --= viewportMove; } // set up new viewprot if (v) { @@ -220,7 +225,8 @@ v[0][pos] ++= viewportMove; } cascade = v; - enabled = v!=null; + vport = v; + varea = v[0]; syncThumb(); } @@ -263,14 +269,23 @@ } /** thumb is moved by user */ - var thumbpos; - var thumbStart = function(v) { motion = true; thumbpos = th_thumb[pos]; return; } + var startpos; + var limitpos; + var thumbStart = function(v) { + motion = true; + startpos = v==1 ? th_thumb[pos] : varea[pos]; + limitpos = v==1 ? th_track[dim] - th_thumb[dim] : viewport[dim] - varea[dim]; + return; + } var thumbStop = function(v) { motion = false; return; } var thumbMove = function(d) { - th_thumb[pos] = - vexi.math.max(0, - vexi.math.min(th_track[dim] - th_thumb[dim], - thumbpos + d[pos])); + // RMB drags relative to the content + if (d.button == 2) { + varea[pos] = min(0, max(limitpos, startpos - d[pos])); + return; + } + // LMB drags relative to the scrollbar + th_thumb[pos] = max(0, min(limitpos, startpos + d[pos])); if (percentset) return; // set percent according to thumb percentset = true; @@ -286,6 +301,7 @@ v.dragUpdate ++= thumbMove; v.dragStart ++= thumbStart; v.dragStop ++= thumbStop; + v.dragButton = 2; cascade = v; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada. The future of the web can't happen without you. Join us at MIX09 to help pave the way to the Next Web now. Learn more and register at http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/ _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn