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

Reply via email to