diff doodle/dia/standard_tools.d @ 63:20d6327c4a75

Event progress. Got key press/release working and panning via keyboard.
author daveb
date Thu, 12 Aug 2010 16:35:24 +0930
parents c63719604adb
children eb5436b47d13
line wrap: on
line diff
--- a/doodle/dia/standard_tools.d	Thu Aug 12 11:48:55 2010 +0930
+++ b/doodle/dia/standard_tools.d	Thu Aug 12 16:35:24 2010 +0930
@@ -5,9 +5,7 @@
 }
 
 private {
-    import doodle.cairo.routines;
-    import std.math;
-    import std.stdio;
+    import gdk.Keysyms;
 }
 
 final class PanTool : Tool {
@@ -43,16 +41,16 @@
 
             switch (event.scrollDirection) {
             case ScrollDirection.UP:
-                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, AMOUNT);
+                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-SCROLL_AMOUNT, 0.0) : Vector(0.0, SCROLL_AMOUNT);
                 break;
             case ScrollDirection.DOWN:
-                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, -AMOUNT);
+                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(SCROLL_AMOUNT, 0.0) : Vector(0.0, -SCROLL_AMOUNT);
                 break;
             case ScrollDirection.LEFT:
-                delta = Vector(-AMOUNT, 0.0);
+                delta = Vector(-SCROLL_AMOUNT, 0.0);
                 break;
             case ScrollDirection.RIGHT:
-                delta = Vector(AMOUNT, 0.0);
+                delta = Vector(SCROLL_AMOUNT, 0.0);
                 break;
             default:
                 assert(0);
@@ -64,9 +62,39 @@
         return true;
     }
 
+    override bool handleKeyPress(scope IViewport viewport, in KeyEvent event) {
+        // Respond to arrow keys and pg-up/pg-down
+
+        switch (event.value) {
+        case GdkKeysyms.GDK_Up:
+            viewport.panRelative(Vector(0.0, ARROW_AMOUNT));
+            return true;
+        case GdkKeysyms.GDK_Right:
+            viewport.panRelative(Vector(ARROW_AMOUNT, 0.0));
+            return true;
+        case GdkKeysyms.GDK_Left:
+            viewport.panRelative(Vector(-ARROW_AMOUNT, 0.0));
+            return true;
+        case GdkKeysyms.GDK_Down:
+            viewport.panRelative(Vector(0.0, -ARROW_AMOUNT));
+            return true;
+        case GdkKeysyms.GDK_Page_Up:
+            viewport.panRelative(Vector(0.0, PAGE_AMOUNT));
+            return true;
+        case GdkKeysyms.GDK_Page_Down:
+            viewport.panRelative(Vector(0.0, -PAGE_AMOUNT));
+            return true;
+        default:
+            // Just a key we don't handle
+            return false;
+        }
+    }
+
     private {
         Point mLastPosition;
-        static immutable double AMOUNT = 60.0;
+        static immutable SCROLL_AMOUNT = 60.0;
+        static immutable ARROW_AMOUNT = 30.0;
+        static immutable PAGE_AMOUNT = 240.0;
     }
 }
 
@@ -95,75 +123,6 @@
     }
 
     private {
-        static immutable double ZOOM = sqrt(2.0);
+        static immutable double ZOOM = 2^^0.5;
     }
 }
-
-final class SelectTool : Tool {
-    this() {
-        super("Select");
-    }
-
-    override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) {
-        if (event.buttonName == ButtonName.LEFT) {
-            _active = true;
-            _anchorPoint = _currentPoint = event.pixelPoint;
-            viewport.setCursor(Cursor.HAND);
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) {
-        if (event.buttonName == ButtonName.LEFT && _active) {
-            _active = false;
-            viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
-            viewport.setCursor(Cursor.DEFAULT);
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    override bool handleMotion(scope IViewport viewport, in MotionEvent event) {
-        if (_active) {
-            viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
-            _currentPoint = event.pixelPoint;
-            viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0));
-        }
-
-        return false;
-    }
-
-    override void draw(in IViewport viewport,
-                       in Rectangle pixelDamage, scope Context pixelCr) const {
-        if (_active) {
-            /*
-            pixelCr.save; {
-                pixelCr.setSourceRgba(0.0, 0.0, 0.8, 0.3);
-                rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
-                pixelCr.fill();
-            } pixelCr.restore();
-            */
-
-            pixelCr.save(); {
-                double[] dashes = [ 4.0, 4.0 ];
-                pixelCr.setDash(dashes, 0.0);
-                pixelCr.setSourceRgba(0.0, 0.0, 0.5, 1.0);
-                pixelCr.setLineWidth(LINE_WIDTH);
-                rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint));
-                pixelCr.stroke;
-            } pixelCr.restore;
-        }
-    }
-
-    private {
-        bool _active;
-        Point _currentPoint;
-        Point _anchorPoint;      // Pixel
-        static immutable double LINE_WIDTH = 1.0;
-    }
-}