diff doodle/fig/select_tool.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
children 43cc2135ced0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doodle/fig/select_tool.d	Thu Aug 12 16:35:24 2010 +0930
@@ -0,0 +1,78 @@
+module doodle.fig.select_tool;
+
+public {
+    import doodle.dia.tool;
+}
+
+private {
+    import doodle.cairo.routines;
+}
+
+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;
+    }
+}