changeset 10:71ca82e0eb76

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sat, 11 Jul 2009 22:49:41 +0930
parents 66b47e122b31
children fb571a3b1f0d
files build.sh cairo_support.d canvas.d icanvas.d page_layer.d standard_tools.d tk/geometry.d tool.d tool_stack.d
diffstat 9 files changed, 108 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/build.sh	Sat Jul 11 22:06:09 2009 +0930
+++ b/build.sh	Sat Jul 11 22:49:41 2009 +0930
@@ -5,6 +5,7 @@
         gui.d tool_stack.d tool.d icanvas.d canvas.d \
         tk/geometry.d tk/gtk_support.d tk/misc.d tk/types.d tk/events.d \
         cairo_support.d standard_tools.d \
+        page_layer.d \
         -od.obj \
         -I"${DMD_BASE}/include/d" \
         -L-lgtkd -L-ldl
--- a/cairo_support.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/cairo_support.d	Sat Jul 11 22:49:41 2009 +0930
@@ -4,17 +4,7 @@
 
 import cairo.Context;
 
-void rectangle(Context cr, Point corner1, Point corner2) {
-    double x = corner1.x;
-    double y = corner1.y;
-    double w = corner2.x - corner1.x;
-    double h = corner2.y - corner1.y;
-
-    if (w < 0.0) { x += w; w = -w; }
-    if (h < 0.0) { y += h; h = -h; }
-
-    //writefln("Rect: %f %f %f %f\n", x, y, w, h);
-
-    cr.rectangle(x, y, w, h);
+void draw_rectangle(Context cr, Rectangle rectangle) {
+    cr.rectangle(rectangle.position.x, rectangle.position.y,
+                 rectangle.size.x, rectangle.size.y);
 }
-
--- a/canvas.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/canvas.d	Sat Jul 11 22:49:41 2009 +0930
@@ -32,13 +32,13 @@
 
 // x and y run right and up respectively
 
-class Canvas : Table, ICanvas {
+class Canvas : Table, Viewport {
     static this() {
         ORIGIN = Point(0.0, 0.0);
         INITIAL_PAGE_SIZE = Vector(210.0, 297.0);       // A4
     }
 
-    this(ICanvasEventHandler event_handler) {
+    this(EventHandler event_handler) {
         super(3, 3, 0);
 
         mEventHandler = event_handler;
@@ -134,6 +134,13 @@
         queueDraw();
     }
 
+    override Point model_to_screen(Point model) const { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
+    override Point screen_to_model(Point screen) const { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; }
+    override Vector model_to_screen(Vector model) const { return mZoom * model; }
+    override Vector screen_to_model(Vector screen) const { return screen / mZoom; }
+    override double model_to_screen(double model) const { return mZoom * model; }
+    override double screen_to_model(double screen) const { return screen / mZoom; }
+
     private {
 
         void onRealize(Widget widget) {
@@ -185,11 +192,11 @@
                 Point screen_page_right_top = model_to_screen(mPageRightTop);
 
                 cr.setSourceRgba(1.0, 1.0, 1.0, 1.0);
-                rectangle(cr, screen_page_left_bottom, screen_page_right_top);
+                draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top));
                 cr.fill();
 
                 cr.setSourceRgba(0.0, 0.0, 0.0, 1.0);
-                rectangle(cr, screen_page_left_bottom, screen_page_right_top);
+                draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top));
                 cr.stroke();
             }
 
@@ -346,24 +353,17 @@
             mVAdjustment.valueChanged();
         }
 
-        Point model_to_screen(Point model) { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
-        Point screen_to_model(Point screen) { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; }
-        Vector model_to_screen(Vector model) { return mZoom * model; }
-        Vector screen_to_model(Vector screen) { return screen / mZoom; }
-        double model_to_screen(double model) { return mZoom * model; }
-        double screen_to_model(double screen) { return screen / mZoom; }
-
         double clamp_zoom(double zoom) { return clamp(zoom, 0.02, 50.0); }
 
         static const Point ORIGIN;
         static const Vector INITIAL_PAGE_SIZE;
 
-        ICanvasEventHandler mEventHandler;
+        EventHandler mEventHandler;
 
         // Model units are in millimetres
         // Screen units are in pixels
 
-        double mZoom;                // pixels-per-mm
+        double mZoom;               // pixels-per-mm
         Point mViewCentre;          // model: where in the model is the centre of our view
 
         Point mCanvasLeftBottom;    // model: bottom left corner of canvas
@@ -373,6 +373,7 @@
 
         Vector mViewSize;           // screen: size of view window in pixels
 
+        // Child widgets:
         HRuler mHRuler;
         VRuler mVRuler;
         DrawingArea mDrawingArea;
--- a/icanvas.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/icanvas.d	Sat Jul 11 22:49:41 2009 +0930
@@ -2,22 +2,35 @@
 
 import tk.geometry;
 import tk.events;
+import cairo.Context;
 
-interface ICanvas {
+interface Viewport {
     void rel_zoom(Point screen_datum, double factor);
     void rel_pan(Vector screen_displacement);
+    //void damage(Rectangle area);
+
+    Point model_to_screen(Point model) const;
+    Point screen_to_model(Point screen) const;
+    Vector model_to_screen(Vector model) const;
+    Vector screen_to_model(Vector screen) const;
+    double model_to_screen(double model) const;
+    double screen_to_model(double screen) const;
 }
 
-interface ICanvasEventHandler {
-    bool handle_button_press(ICanvas canvas, in ButtonEvent event);
-    bool handle_button_release(ICanvas canvas, in ButtonEvent event);
-    bool handle_motion(ICanvas canvas, in MotionEvent event);
-    bool handle_scroll(ICanvas canvas, in ScrollEvent event);
-    //bool handle_expose(ICanvas canvas, ExposeEvent event);
-    //bool handle_enter(ICanvas, CrossingEvent event);
-    //bool handle_leave(ICanvas, CrossingEvent event);
-    //bool handle_focus_in(ICanvas, FocusEvent event);
-    //bool handle_focus_out(ICanvas, FocusEvent event);
-    bool handle_key_press(ICanvas canvas, in KeyEvent event);
-    bool handle_key_release(ICanvas canvas, in KeyEvent event);
+interface EventHandler {
+    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);
 }
+
+abstract class Layer {
+    void draw(const Viewport viewport, in Rectangle damage, Context cr) const;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/page_layer.d	Sat Jul 11 22:49:41 2009 +0930
@@ -0,0 +1,29 @@
+import icanvas;
+import tk.geometry;
+import cairo.Context;
+import cairo_support;
+
+interface Page {
+}
+
+class PageLayer : Layer, Page {
+    void draw(const Viewport viewport, in Rectangle damage, Context cr) const {
+        // Make the paper white, with a border
+
+        Point screen_page_left_bottom = viewport.model_to_screen(mPageLeftBottom);
+        Point screen_page_right_top = viewport.model_to_screen(mPageRightTop);
+
+        cr.setSourceRgba(1.0, 1.0, 1.0, 1.0);
+        draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top));
+        cr.fill();
+
+        cr.setSourceRgba(0.0, 0.0, 0.0, 1.0);
+        draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top));
+        cr.stroke();
+    }
+
+    private {
+        Point mPageLeftBottom;      // model: bottom left corner of page
+        Point mPageRightTop;        // model: top right corner of page
+    }
+}
--- a/standard_tools.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/standard_tools.d	Sat Jul 11 22:49:41 2009 +0930
@@ -8,7 +8,7 @@
 import std.math;
 
 final class PanTool : Tool {
-    bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
+    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         if (event.button_name == ButtonName.MIDDLE) {
             mLastPosition = event.screen_point;
             return true;
@@ -18,13 +18,13 @@
         }
     }
 
-    bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
+    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         return true;
     }
 
-    bool handle_motion(ICanvas canvas, in MotionEvent event) {
+    bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) {
-            canvas.rel_pan(mLastPosition - event.screen_point);
+            viewport.rel_pan(mLastPosition - event.screen_point);
             mLastPosition = event.screen_point;
 
             return true;
@@ -34,7 +34,7 @@
         }
     }
 
-    bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
+    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) {
             Vector delta;
 
@@ -53,17 +53,17 @@
                 break;
             }
 
-            canvas.rel_pan(delta);
+            viewport.rel_pan(delta);
         }
 
         return true;
     }
 
-    bool handle_key_press(ICanvas canvas, in KeyEvent event) {
+    bool handle_key_press(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
-    bool handle_key_release(ICanvas canvas, in KeyEvent event) {
+    bool handle_key_release(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
@@ -74,26 +74,26 @@
 }
 
 final class ZoomTool : Tool {
-    bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
+    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         return false;
     }
 
-    bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
+    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         return false;
     }
 
-    bool handle_motion(ICanvas canvas, in MotionEvent event) {
+    bool handle_motion(Viewport viewport, in MotionEvent event) {
         return false;
     }
 
-    bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
+    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_set(Modifier.CONTROL)) {
             if (event.scroll_direction == ScrollDirection.DOWN) {
-                canvas.rel_zoom(event.screen_point(), 1.0 / ZOOM);
+                viewport.rel_zoom(event.screen_point(), 1.0 / ZOOM);
                 return true;
             }
             else if (event.scroll_direction == ScrollDirection.UP) {
-                canvas.rel_zoom(event.screen_point(), ZOOM);
+                viewport.rel_zoom(event.screen_point(), ZOOM);
                 return true;
             }
             else {
@@ -105,11 +105,11 @@
         }
     }
 
-    bool handle_key_press(ICanvas canvas, in KeyEvent event) {
+    bool handle_key_press(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
-    bool handle_key_release(ICanvas canvas, in KeyEvent event) {
+    bool handle_key_release(Viewport viewport, in KeyEvent event) {
         return false;
     }
 
--- a/tk/geometry.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/tk/geometry.d	Sat Jul 11 22:49:41 2009 +0930
@@ -120,6 +120,10 @@
         return _position;
     }
 
+    Vector size() const {
+        return _size;
+    }
+
     alias position min_corner;
 
     Point max_corner() const {
--- a/tool.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/tool.d	Sat Jul 11 22:49:41 2009 +0930
@@ -10,7 +10,7 @@
 }
 */
 
-abstract class Tool : ICanvasEventHandler {
+abstract class Tool : EventHandler {
     /*
     abstract bool is_sticky();
     abstract bool is_replaceable();
--- a/tool_stack.d	Sat Jul 11 22:06:09 2009 +0930
+++ b/tool_stack.d	Sat Jul 11 22:49:41 2009 +0930
@@ -8,17 +8,17 @@
 private import tk.geometry;
 private import tk.events;
 
-class ToolStack : ICanvasEventHandler {
+class ToolStack : EventHandler {
     this(in Tool[] tools) {
         mTools = tools.dup;
     }
 
-    override bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
         writefln("%s", event);
 
         if (mGrabbedTool is null) {
             foreach_reverse(ref tool; mTools) {
-                if (tool.handle_button_press(canvas, event)) {
+                if (tool.handle_button_press(viewport, event)) {
                     mGrabbedTool = &tool;
                     mGrabbedButton = event.button_name;
                     break;
@@ -26,17 +26,17 @@
             }
         }
         else {
-            mGrabbedTool.handle_button_press(canvas, event);
+            mGrabbedTool.handle_button_press(viewport, event);
         }
 
         return true;
     }
 
-    override bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
+    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
         writefln("%s", event);
 
         if (mGrabbedTool !is null) {
-            mGrabbedTool.handle_button_release(canvas, event);
+            mGrabbedTool.handle_button_release(viewport, event);
 
             if (mGrabbedButton == event.button_name) {
                 mGrabbedTool = null;
@@ -46,45 +46,45 @@
         return true;
     }
 
-    override bool handle_key_press(ICanvas canvas, in KeyEvent event) {
+    override bool handle_key_press(Viewport viewport, in KeyEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_key_release(ICanvas canvas, in KeyEvent event) {
+    override bool handle_key_release(Viewport viewport, in KeyEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_motion(ICanvas canvas, in MotionEvent event) {
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
         writefln("%s", event);
 
         if (mGrabbedTool is null) {
             foreach_reverse(ref tool; mTools) {
-                if (tool.handle_motion(canvas, event)) {
+                if (tool.handle_motion(viewport, event)) {
                     break;
                 }
             }
         }
         else {
-            mGrabbedTool.handle_motion(canvas, event);
+            mGrabbedTool.handle_motion(viewport, event);
         }
 
         return true;
     }
 
-    override bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         writefln("%s", event);
 
         if (mGrabbedTool is null) {
             foreach_reverse(ref tool; mTools) {
-                if (tool.handle_scroll(canvas, event)) {
+                if (tool.handle_scroll(viewport, event)) {
                     break;
                 }
             }
         }
         else {
-            mGrabbedTool.handle_scroll(canvas, event);
+            mGrabbedTool.handle_scroll(viewport, event);
         }
 
         return true;