diff standard_tools.d @ 8:bf7903435f58

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sat, 11 Jul 2009 21:49:04 +0930
parents 936feb16eed4
children 66b47e122b31
line wrap: on
line diff
--- a/standard_tools.d	Sat Jul 11 21:29:03 2009 +0930
+++ b/standard_tools.d	Sat Jul 11 21:49:04 2009 +0930
@@ -5,10 +5,12 @@
 import tk.types;
 import tk.events;
 import tk.geometry;
+import std.math;
 
 final class PanTool : Tool {
     bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
         if (event.button_name == ButtonName.MIDDLE) {
+            mLastPosition = event.screen_point;
             return true;
         }
         else {
@@ -17,31 +19,43 @@
     }
 
     bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
-        return false;
+        return true;
     }
 
     bool handle_motion(ICanvas canvas, in MotionEvent event) {
-        return false;
+        if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) {
+            canvas.rel_pan(mLastPosition - event.screen_point);
+            mLastPosition = event.screen_point;
+
+            return true;
+        }
+        else {
+            return false;
+        }
     }
 
     bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
-        const double AMOUNT = 30.0;
-        Vector v;
+        if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) {
+            const double AMOUNT = 60.0;
+            Vector v;
 
-        if (event.mask.is_set(Modifier.SHIFT)) {
-            // left to right
-            v = Vector(AMOUNT, 0.0);
+            switch (event.scroll_direction) {
+            case ScrollDirection.UP:
+                v = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT);
+                break;
+            case ScrollDirection.DOWN:
+                v = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT);
+                break;
+            case ScrollDirection.LEFT:
+                v = Vector(-AMOUNT, 0.0);
+                break;
+            case ScrollDirection.RIGHT:
+                v = Vector(AMOUNT, 0.0);
+                break;
+            }
+
+            canvas.rel_pan(v);
         }
-        else {
-            // down to up
-            v = Vector(0.0, AMOUNT);
-        }
-
-        if (event.scroll_direction == ScrollDirection.UP) {
-            v = -v;
-        }
-
-        canvas.rel_pan(v);
 
         return true;
     }
@@ -53,10 +67,14 @@
     bool handle_key_release(ICanvas canvas, in KeyEvent event) {
         return false;
     }
+
+    private {
+        Point mLastPosition;
+    }
 }
 
 final class ZoomTool : Tool {
-    static invariant double ZOOM = 1.44;
+    static invariant double ZOOM = sqrt(2.0);
 
     bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
         return false;