diff dia/standard_tools.d @ 22:17c2df87b459

Package refactoring.
author "David Bryant <bagnose@gmail.com>"
date Wed, 15 Jul 2009 23:31:29 +0930
parents standard_tools.d@d6e7a5a6f008
children a24c13bb9c98
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dia/standard_tools.d	Wed Jul 15 23:31:29 2009 +0930
@@ -0,0 +1,147 @@
+module dia.standard_tools;
+
+public {
+    import tool;
+}
+
+private {
+    import cairo_support;
+    import std.math;
+    import std.stdio;
+}
+
+final class PanTool : Tool {
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
+        if (event.button_name == ButtonName.MIDDLE) {
+            mLastPosition = event.pixel_point;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
+        if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
+            viewport.pan_relative(mLastPosition - event.pixel_point);
+            mLastPosition = event.pixel_point;
+
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+        if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) {
+            Vector delta;
+
+            switch (event.scroll_direction) {
+            case ScrollDirection.UP:
+                delta = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT);
+                break;
+            case ScrollDirection.DOWN:
+                delta = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT);
+                break;
+            case ScrollDirection.LEFT:
+                delta = Vector(-AMOUNT, 0.0);
+                break;
+            case ScrollDirection.RIGHT:
+                delta = Vector(AMOUNT, 0.0);
+                break;
+            }
+
+            viewport.pan_relative(delta);
+        }
+
+        return true;
+    }
+
+    private {
+        Point mLastPosition;
+        static invariant double AMOUNT = 60.0;
+    }
+}
+
+final class ZoomTool : Tool {
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+        if (event.mask.is_set(Modifier.CONTROL)) {
+            if (event.scroll_direction == ScrollDirection.DOWN) {
+                viewport.zoom_relative(event.pixel_point, 1.0 / ZOOM);
+                return true;
+            }
+            else if (event.scroll_direction == ScrollDirection.UP) {
+                viewport.zoom_relative(event.pixel_point, ZOOM);
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+        else {
+            return false;
+        }
+    }
+
+    private {
+        static invariant double ZOOM = sqrt(2.0);
+    }
+}
+
+final class LassoTool : Tool {
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
+        if (event.button_name == ButtonName.LEFT) {
+            mActive = true;
+            mAnchorPoint = mCurrentPoint = event.pixel_point;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
+        if (event.button_name == ButtonName.LEFT && mActive) {
+            mActive = false;
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
+        if (mActive) {
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
+            mCurrentPoint = event.pixel_point;
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));
+        }
+
+        return false;
+    }
+
+    override void draw(const Viewport viewport,
+                       in Rectangle pixel_damage, scope Context pixel_cr,
+                       in Rectangle model_damage, scope Context model_cr) const {
+        if (mActive) {
+            pixel_cr.save; {
+                double[] dashes = [ 4.0, 4.0 ];
+                pixel_cr.setDash(dashes, 0.0);
+                pixel_cr.setSourceRgba(0.0, 0.0, 0.5, 1.0);
+                pixel_cr.setLineWidth(LINE_WIDTH);
+                //writefln("Drawing rectangle: %s", Rectangle(mCurrentPoint, mAnchorPoint));
+                rectangle(pixel_cr, Rectangle(mCurrentPoint, mAnchorPoint));
+                pixel_cr.stroke;
+            } pixel_cr.restore;
+        }
+    }
+
+    private {
+        bool mActive;
+        Point mCurrentPoint;
+        Point mAnchorPoint;      // Pixel
+        static invariant double LINE_WIDTH = 1.0;
+    }
+}