changeset 18:df8d81d9f499

Lasso fiddling
author David Bryant <daveb@acres.com.au>
date Mon, 13 Jul 2009 17:08:32 +0930
parents c643c04e3f5e
children 22abbf4cde96
files canvas.d icanvas.d page_layer.d standard_tools.d tool.d tool_layer.d
diffstat 6 files changed, 63 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/canvas.d	Mon Jul 13 17:08:32 2009 +0930
@@ -135,6 +135,10 @@
         mDamage = mDamage | model_to_pixel(area);
     }
 
+    override void damage_pixel(Rectangle area) {
+        mDamage = mDamage | area;
+    }
+
     override double zoom() const {
         return mZoom;
     }
@@ -231,10 +235,12 @@
                           Vector(cast(double)event.area.width, cast(double)event.area.height));
 
             model_cr.save; pixel_cr.save; {
+                // FIXME restore clipping
+
                 // Setup model context
 
-                rectangle(model_cr, damage);
-                model_cr.clip;
+                //rectangle(model_cr, damage);
+                //model_cr.clip;
 
                 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct;
                 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct;
@@ -247,14 +253,14 @@
 
                 pixel_cr.translate(0.0, mViewSize.y);
                 pixel_cr.scale(1.0, -1.0);
-                rectangle(pixel_cr, damage);
-                pixel_cr.clip;
+                //rectangle(pixel_cr, damage);
+                //pixel_cr.clip;
 
                 // Fill the background
 
                 pixel_cr.save; {
                     // Make the window light grey
-                    pixel_cr.setSourceRgba(1.0, 1.0, 1.0, 0.7);
+                    pixel_cr.setSourceRgba(0.6, 0.6, 0.6, 1.0);
                     rectangle(pixel_cr, damage);
                     pixel_cr.fill;
                 } pixel_cr.restore;
@@ -442,14 +448,19 @@
 
         void process_damage() {
             if (mDamage.valid) {
-                writefln("Damage: %s", mDamage);
+                //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);
+                //writefln("Quantised damage: %d %d %d %d", x, y, w, h);
+                y = cast(int)mViewSize.y - (y + h);
+                //writefln("Flipped Quantised damage: %d %d %d %d", x, y, w, h);
+                // FIXME only redraw the damaged area
+                //mDrawingArea.queueDrawArea(x, y, w, h);
+                mDrawingArea.queueDraw();
                 mDamage = Rectangle.DEFAULT;
             }
             else {
-                writefln("No damage");
+                //writefln("No damage");
             }
         }
 
--- a/icanvas.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/icanvas.d	Mon Jul 13 17:08:32 2009 +0930
@@ -8,6 +8,7 @@
     void rel_zoom(Point pixel_datum, double factor);
     void rel_pan(Vector pixel_displacement);
     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
+    void damage_pixel(Rectangle area);      // FIXME as above
 
     // FIXME not sure about these:
     double zoom() const;
@@ -26,7 +27,6 @@
     bool handle_button_release(Viewport viewport, in ButtonEvent event);
     bool handle_motion(Viewport viewport, in MotionEvent event);
     bool handle_scroll(Viewport viewport, in ScrollEvent event);
-    //bool handle_expose(Viewport viewport, ExposeEvent event);
     //bool handle_enter(Viewport viewport, CrossingEvent event);
     //bool handle_leave(Viewport viewport, CrossingEvent event);
     //bool handle_focus_in(Viewport viewport, FocusEvent event);
--- a/page_layer.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/page_layer.d	Mon Jul 13 17:08:32 2009 +0930
@@ -26,24 +26,17 @@
                        Context model_cr, Context pixel_cr) const {
         // Make the paper white, with a border
 
-        model_cr.setSourceRgba(1.0, 0.5, 1.0, 0.5);
-        rectangle(model_cr, mPageGeometry);
-        model_cr.fill();
-
-        model_cr.setSourceRgba(0.3, 0.0, 0.0, 0.5);
-        rectangle(model_cr, mPageGeometry);
-        model_cr.stroke();
+        model_cr.save; {
+            model_cr.setSourceRgba(1.0, 1.0, 1.0, 1.0);
+            rectangle(model_cr, mPageGeometry);
+            model_cr.fill;
+        } model_cr.restore;
 
-        /*
-        pixel_cr.setSourceRgba(1.0, 1.0, 0.5, 0.4);
-        rectangle(pixel_cr, viewport.model_to_pixel(mPageGeometry));
-        pixel_cr.fill();
-
-        pixel_cr.setSourceRgba(0.0, 0.3, 0.0, 0.4);
-        rectangle(pixel_cr, viewport.model_to_pixel(mPageGeometry));
-        //rectangle(pixel_cr, viewport.model_to_pixel(Rectangle(mPageGeometry.position, mPageGeometry.size / 2.0)));
-        pixel_cr.stroke();
-        */
+        model_cr.save; {
+            model_cr.setSourceRgba(0.0, 0.0, 0.0, 1.0);
+            rectangle(model_cr, mPageGeometry);
+            model_cr.stroke;
+        } model_cr.restore;
     }
 
     private {
--- a/standard_tools.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/standard_tools.d	Mon Jul 13 17:08:32 2009 +0930
@@ -5,6 +5,7 @@
 }
 
 private {
+    import cairo_support;
     import std.math;
     import std.stdio;
 }
@@ -20,10 +21,6 @@
         }
     }
 
-    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
-        return true;
-    }
-
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
             viewport.rel_pan(mLastPosition - event.pixel_point);
@@ -61,14 +58,6 @@
         return true;
     }
 
-    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 {
         Point mLastPosition;
         static invariant double AMOUNT = 60.0;
@@ -76,18 +65,6 @@
 }
 
 final class ZoomTool : Tool {
-    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
-        return false;
-    }
-
-    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
-        return false;
-    }
-
-    override bool handle_motion(Viewport viewport, in MotionEvent event) {
-        return false;
-    }
-
     override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_set(Modifier.CONTROL)) {
             if (event.scroll_direction == ScrollDirection.DOWN) {
@@ -107,14 +84,6 @@
         }
     }
 
-    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 {
         static invariant double ZOOM = sqrt(2.0);
     }
@@ -125,7 +94,7 @@
         if (event.button_name == ButtonName.LEFT) {
             writefln("Start lasso");
             mActive = true;
-            mAnchorPoint = event.pixel_point;
+            mAnchorPoint = mCurrentPoint = event.pixel_point;
             return true;
         }
         else {
@@ -137,6 +106,7 @@
         if (event.button_name == ButtonName.LEFT && mActive) {
             writefln("End lasso");
             mActive = false;
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
             return true;
         }
         else {
@@ -144,28 +114,32 @@
         }
     }
 
+    // FIXME account for the line width...
+
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (mActive) {
-            writefln("lassooing");
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
+            mCurrentPoint = event.pixel_point;
+            viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint));
         }
 
         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;
+    override void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const {
+        if (mActive) {
+            pixel_cr.save; {
+                pixel_cr.setSourceRgba(1.0, 0.0, 0.0, 1.0);
+                //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
     }
 }
--- a/tool.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/tool.d	Mon Jul 13 17:08:32 2009 +0930
@@ -32,19 +32,16 @@
     abstract void stop(IToolStack tool_stack);
     */
 
-    void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const {
-    }
+    bool handle_button_press(Viewport viewport, in ButtonEvent event) { return false; }
+    bool handle_button_release(Viewport viewport, in ButtonEvent event) { return false; }
+    bool handle_motion(Viewport viewport, in MotionEvent event) { return false; }
+    bool handle_scroll(Viewport viewport, in ScrollEvent event) { return false; }
+    //bool handle_enter(Viewport viewport, CrossingEvent event) { return false; }
+    //bool handle_leave(Viewport viewport, CrossingEvent event) { return false; }
+    //bool handle_focus_in(Viewport viewport, FocusEvent event) { return false; }
+    //bool handle_focus_out(Viewport viewport, FocusEvent event) { return false; }
+    bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; }
+    bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; }
 
-    bool handle_button_press(Viewport viewport, in ButtonEvent event);
-    bool handle_button_release(Viewport viewport, in ButtonEvent event);
-    bool handle_motion(Viewport viewport, in MotionEvent event);
-    bool handle_scroll(Viewport viewport, in ScrollEvent event);
-    //bool handle_expose(Viewport viewport, ExposeEvent event);
-    //bool handle_enter(Viewport viewport, CrossingEvent event);
-    //bool handle_leave(Viewport viewport, CrossingEvent event);
-    //bool handle_focus_in(Viewport viewport, FocusEvent event);
-    //bool handle_focus_out(Viewport viewport, FocusEvent event);
-    bool handle_key_press(Viewport viewport, in KeyEvent event);
-    bool handle_key_release(Viewport viewport, in KeyEvent event);
+    void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const { }
 }
-
--- a/tool_layer.d	Mon Jul 13 16:46:21 2009 +0930
+++ b/tool_layer.d	Mon Jul 13 17:08:32 2009 +0930
@@ -100,6 +100,10 @@
 
     override void draw(const Viewport viewport, in Rectangle damage,
                        Context model_cr, Context screen_cr) const {
+        // FIXME this isn't how we will really draw the tools...
+        foreach (const Tool tool; mTools) {
+            tool.draw(viewport, damage, model_cr, screen_cr);
+        }
     }
 
     /*