changeset 17:c643c04e3f5e

Checkpoint
author David Bryant <daveb@acres.com.au>
date Mon, 13 Jul 2009 16:46:21 +0930
parents 9e63308b749c
children df8d81d9f499
files canvas.d grid_layer.d gui.d icanvas.d page_layer.d standard_tools.d tk/events.d tk/geometry.d tool.d tool_layer.d
diffstat 10 files changed, 144 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/canvas.d	Mon Jul 13 16:46:21 2009 +0930
@@ -38,6 +38,8 @@
     this(in Layer[] layers, EventHandler event_handler, in double ppi) {
         super(3, 3, 0);
 
+        mDamage = Rectangle.DEFAULT;
+
         mLayers = layers.dup;
         mEventHandler = event_handler;
         mPPI = ppi;
@@ -129,6 +131,10 @@
         queueDraw;
     }
 
+    override void damage_model(Rectangle area) {
+        mDamage = mDamage | model_to_pixel(area);
+    }
+
     override double zoom() const {
         return mZoom;
     }
@@ -280,6 +286,8 @@
 
             mEventHandler.handle_button_press(this, button_event);
 
+            process_damage;
+
             return true;
         }
 
@@ -298,6 +306,8 @@
 
             mEventHandler.handle_button_release(this, button_event);
 
+            process_damage;
+
             return true;
         }
 
@@ -308,6 +318,8 @@
             //auto key_event = new KeyEvent("",
             // mEventHandle.handle_key(key_event);
 
+            process_damage;
+
             return true;
         }
 
@@ -326,6 +338,8 @@
 
             mEventHandler.handle_motion(this, motion_event);
 
+            process_damage;
+
             return true;
         }
 
@@ -343,6 +357,8 @@
 
             mEventHandler.handle_scroll(this, scroll_event);
 
+            process_damage;
+
             return true;
         }
 
@@ -424,9 +440,23 @@
             mVAdjustment.valueChanged;
         }
 
+        void process_damage() {
+            if (mDamage.valid) {
+                writefln("Damage: %s", mDamage);
+                int x, y, w, h;
+                mDamage.get_quantised(x, y, w, h);
+                mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - y, w, h);
+                mDamage = Rectangle.DEFAULT;
+            }
+            else {
+                writefln("No damage");
+            }
+        }
+
         double clamp_zoom(double zoom) { return clamp(zoom, 0.2, 10.0); }
 
         bool mHadConfigure;
+        Rectangle mDamage;          // pixels
 
         // Model units are in millimetres
         // Screen units are in pixels
--- a/grid_layer.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/grid_layer.d	Mon Jul 13 16:46:21 2009 +0930
@@ -1,5 +1,6 @@
 module grid_layer;
 
+// TODO fix imports
 import icanvas;
 import tk.geometry;
 import cairo.Context;
--- a/gui.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/gui.d	Mon Jul 13 16:46:21 2009 +0930
@@ -18,6 +18,7 @@
     Tool[] tools;
     tools ~= new PanTool;
     tools ~= new ZoomTool;
+    tools ~= new LassoTool;
     auto tool_layer = new ToolLayer(tools, "Tools");
     Layer[] layers;
     layers ~= new PageLayer("Page");
--- a/icanvas.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/icanvas.d	Mon Jul 13 16:46:21 2009 +0930
@@ -7,8 +7,9 @@
 interface Viewport {
     void rel_zoom(Point pixel_datum, double factor);
     void rel_pan(Vector pixel_displacement);
-    //void damage(Rectangle area);
+    void damage_model(Rectangle area);      // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only
 
+    // FIXME not sure about these:
     double zoom() const;
     Point model_to_pixel(Point model) const;
     Point pixel_to_model(Point pixel) const;
--- a/page_layer.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/page_layer.d	Mon Jul 13 16:46:21 2009 +0930
@@ -1,5 +1,12 @@
-import icanvas;
-import cairo_support;
+module page_layer;
+
+private {
+    import cairo_support;
+}
+
+public {
+    import icanvas;
+}
 
 interface Page {
 }
--- a/standard_tools.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/standard_tools.d	Mon Jul 13 16:46:21 2009 +0930
@@ -6,12 +6,13 @@
 
 private {
     import std.math;
+    import std.stdio;
 }
 
 final class PanTool : Tool {
-    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         if (event.button_name == ButtonName.MIDDLE) {
-            mLastPosition = event.screen_point;
+            mLastPosition = event.pixel_point;
             return true;
         }
         else {
@@ -19,14 +20,14 @@
         }
     }
 
-    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
+    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         return true;
     }
 
-    bool handle_motion(Viewport viewport, in MotionEvent event) {
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
-            viewport.rel_pan(mLastPosition - event.screen_point);
-            mLastPosition = event.screen_point;
+            viewport.rel_pan(mLastPosition - event.pixel_point);
+            mLastPosition = event.pixel_point;
 
             return true;
         }
@@ -35,7 +36,7 @@
         }
     }
 
-    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) {
             Vector delta;
 
@@ -60,11 +61,11 @@
         return true;
     }
 
-    bool handle_key_press(Viewport viewport, in KeyEvent event) {
+    override bool handle_key_press(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
-    bool handle_key_release(Viewport viewport, in KeyEvent event) {
+    override bool handle_key_release(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
@@ -75,26 +76,26 @@
 }
 
 final class ZoomTool : Tool {
-    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         return false;
     }
 
-    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
+    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         return false;
     }
 
-    bool handle_motion(Viewport viewport, in MotionEvent event) {
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
         return false;
     }
 
-    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_set(Modifier.CONTROL)) {
             if (event.scroll_direction == ScrollDirection.DOWN) {
-                viewport.rel_zoom(event.screen_point(), 1.0 / ZOOM);
+                viewport.rel_zoom(event.pixel_point, 1.0 / ZOOM);
                 return true;
             }
             else if (event.scroll_direction == ScrollDirection.UP) {
-                viewport.rel_zoom(event.screen_point(), ZOOM);
+                viewport.rel_zoom(event.pixel_point, ZOOM);
                 return true;
             }
             else {
@@ -106,11 +107,11 @@
         }
     }
 
-    bool handle_key_press(Viewport viewport, in KeyEvent event) {
+    override bool handle_key_press(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
-    bool handle_key_release(Viewport viewport, in KeyEvent event) {
+    override bool handle_key_release(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
@@ -118,3 +119,53 @@
         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) {
+            writefln("Start lasso");
+            mActive = true;
+            mAnchorPoint = 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) {
+            writefln("End lasso");
+            mActive = false;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
+        if (mActive) {
+            writefln("lassooing");
+        }
+
+        return false;
+    }
+
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+        return false;
+    }
+
+    override bool handle_key_press(Viewport viewport, in KeyEvent event) {
+        return false;
+    }
+
+    override bool handle_key_release(Viewport viewport, in KeyEvent event) {
+        return false;
+    }
+
+    private {
+        bool mActive;
+        Point mAnchorPoint;      // Pixel
+    }
+}
--- a/tk/events.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/tk/events.d	Mon Jul 13 16:46:21 2009 +0930
@@ -46,17 +46,17 @@
 }
 
 abstract class PointerEvent : Event {
-    this(in Point screen_point, in Point model_point, in Mask mask) {
+    this(in Point pixel_point, in Point model_point, in Mask mask) {
         super(mask);
-        mScreenPoint = screen_point;
+        mPixelPoint = pixel_point;
         mModelPoint = model_point;
     }
 
-    Point screen_point() const { return mScreenPoint; }
+    Point pixel_point() const { return mPixelPoint; }
     Point model_point() const { return mModelPoint; }
 
     private {
-        Point mScreenPoint;
+        Point mPixelPoint;
         Point mModelPoint;
     }
 }
@@ -64,10 +64,10 @@
 final class ButtonEvent : PointerEvent {
     this(in ButtonAction button_action,
          in ButtonName button_name,
-         in Point screen_point,
+         in Point pixel_point,
          in Point model_point,
          in Mask mask) {   
-        super(screen_point, model_point, mask);
+        super(pixel_point, model_point, mask);
         mButtonAction = button_action;
         mButtonName = button_name;
     }
@@ -75,7 +75,7 @@
     override string toString() const {
         return std.string.format("Button event: %s, %s, %s, %s, %s",
                                  enumToString(mButtonAction), enumToString(mButtonName),
-                                 mScreenPoint, mModelPoint, mMask);
+                                 mPixelPoint, mModelPoint, mMask);
     }
 
     ButtonAction button_action() const { return mButtonAction; }
@@ -88,30 +88,30 @@
 }
 
 final class MotionEvent : PointerEvent {
-    this(in Point screen_point,
+    this(in Point pixel_point,
          in Point model_point,
          in Mask mask) {
-        super(screen_point, model_point, mask);
+        super(pixel_point, model_point, mask);
     }
 
     override string toString() const {
         return std.string.format("Motion event: %s, %s, %s",
-                                 mScreenPoint, mModelPoint, mMask);
+                                 mPixelPoint, mModelPoint, mMask);
     }
 }
 
 final class ScrollEvent : PointerEvent {
     this(in ScrollDirection scroll_direction,
-         in Point screen_point,
+         in Point pixel_point,
          in Point model_point,
          in Mask mask) {
-        super(screen_point, model_point, mask);
+        super(pixel_point, model_point, mask);
         mScrollDirection = scroll_direction;
     }
 
     override string toString() const {
         return std.string.format("Scroll event: %s, %s, %s, %s",
-                                 enumToString(mScrollDirection), mScreenPoint, mModelPoint, mMask);
+                                 enumToString(mScrollDirection), mPixelPoint, mModelPoint, mMask);
     }
 
     ScrollDirection scroll_direction() const { return mScrollDirection; }
--- a/tk/geometry.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/tk/geometry.d	Mon Jul 13 16:46:21 2009 +0930
@@ -198,6 +198,15 @@
         return Rectangle(new_position, _size);
     }
 
+    void get_quantised(out int x, out int y, out int w, out int h) const {
+        x = cast(int)floor(_position.x);
+        y = cast(int)floor(_position.y);
+        w = cast(int)ceil(_position.x + _size.x) - x;
+        h = cast(int)ceil(_position.y + _size.y) - y;
+    }
+
+    //
+
     Point centre() const {
         return _position + _size / 2.0;
     }
--- a/tool.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/tool.d	Mon Jul 13 16:46:21 2009 +0930
@@ -1,6 +1,7 @@
 module tool;
 
 public {
+    import cairo_support;
     import icanvas;
     import tk.events;
 }
@@ -15,6 +16,13 @@
 
 abstract class Tool {
     /*
+    enum Response {
+    START, CONTINUE, FINISH
+
+    }
+    */
+
+    /*
     abstract bool is_sticky();
     abstract bool is_replaceable();
     */
@@ -24,7 +32,8 @@
     abstract void stop(IToolStack tool_stack);
     */
 
-    //void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const;
+    void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const {
+    }
 
     bool handle_button_press(Viewport viewport, in ButtonEvent event);
     bool handle_button_release(Viewport viewport, in ButtonEvent event);
--- a/tool_layer.d	Mon Jul 13 16:16:17 2009 +0930
+++ b/tool_layer.d	Mon Jul 13 16:46:21 2009 +0930
@@ -61,7 +61,7 @@
     }
 
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
-        writefln("%s", event);
+        //writefln("%s", event);
 
         if (mGrabbedTool is null) {
             foreach_reverse(ref tool; mTools) {