changeset 13:f0ade1b49fe7

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 12 Jul 2009 01:04:35 +0930
parents a093c4fbdd43
children 0b7e7d43a79d
files canvas.d standard_tools.d tk/events.d tk/geometry.d tk/gtk_support.d tk/tool.d tk/types.d
diffstat 7 files changed, 92 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/canvas.d	Sun Jul 12 01:04:35 2009 +0930
@@ -38,9 +38,13 @@
 
         mLayers = layers.dup;
         mEventHandler = event_handler;
+        mPPI = ppi;
 
         const double MM_PER_INCH = 25.4;
-        mZoom = 0.25 * ppi / MM_PER_INCH;
+        mZoom = 0.25 * mPPI / MM_PER_INCH;
+
+        // Take the union of the bounds of each layer to
+        // determine the canvas size
 
         Rectangle total_layer_bounds;
 
@@ -48,11 +52,15 @@
             total_layer_bounds = total_layer_bounds | layer.bounds;
         }
 
+        assert(total_layer_bounds.valid);
+
         mCanvasLeftBottom = total_layer_bounds.min_corner - total_layer_bounds.size;
         mCanvasRightTop = total_layer_bounds.max_corner + total_layer_bounds.size;
         mViewCentre = mCanvasLeftBottom + (mCanvasRightTop - mCanvasLeftBottom) / 2.0;
 
-        mHRuler = new HRuler();
+        // Create our child widgets and register callbacks
+
+        mHRuler = new HRuler;
         attach(mHRuler,
                1, 2,
                0, 1,
@@ -60,7 +68,7 @@
                0, 0);
         mHRuler.setMetric(GtkMetricType.CENTIMETERS);
 
-        mVRuler = new VRuler();
+        mVRuler = new VRuler;
         attach(mVRuler,
                0, 1,
                1, 2,
@@ -68,7 +76,7 @@
                0, 0);
         mVRuler.setMetric(GtkMetricType.CENTIMETERS);
 
-        mDrawingArea = new DrawingArea();
+        mDrawingArea = new DrawingArea;
         mDrawingArea.addOnRealize(&onRealize);
         mDrawingArea.addOnConfigure(&onConfigure);
         mDrawingArea.addOnExpose(&onExpose);
@@ -118,29 +126,55 @@
 
         //Point new_model_datum = screen_to_model(screen_datum);
 
-        update_adjustments();
+        update_adjustments;
         //update_rulers(new_model_datum);
-        update_rulers();
-        queueDraw();
+        update_rulers;
+        queueDraw;
     }
 
     override void rel_pan(Vector screen_displacement) {
         mViewCentre = mViewCentre + screen_to_model(screen_displacement);
 
-        update_adjustments();
-        update_rulers();
-        queueDraw();
+        update_adjustments;
+        update_rulers;
+        queueDraw;
+    }
+
+    override double zoom() const {
+        return mZoom;
+    }
+
+    override Point model_to_screen(Point model) const {
+        return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre);
+    }
+
+    override Point screen_to_model(Point screen) const {
+        return mViewCentre + (screen - mViewSize / 2.0 - Point.DEFAULT) / mZoom;
     }
 
-    override double zoom() const { return mZoom; }
-    override Point model_to_screen(Point model) const { return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
-    override Point screen_to_model(Point screen) const { return mViewCentre + (screen - mViewSize / 2.0 - Point.DEFAULT) / 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; }
-    override Rectangle model_to_screen(Rectangle model) const { return Rectangle(model_to_screen(model.position), model_to_screen(model.size)); }
-    override Rectangle screen_to_model(Rectangle model) const { return Rectangle(screen_to_model(model.position), screen_to_model(model.size)); }
+    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;
+    }
+
+    override Rectangle model_to_screen(Rectangle model) const {
+        return Rectangle(model_to_screen(model.position), model_to_screen(model.size));
+    }
+
+    override Rectangle screen_to_model(Rectangle model) const {
+        return Rectangle(screen_to_model(model.position), screen_to_model(model.size));
+    }
 
     private {
 
@@ -153,8 +187,8 @@
             assert(widget is mDrawingArea);
 
             mViewSize = Vector(cast(double)event.width, cast(double)event.height);
-            update_adjustments();
-            update_rulers();
+            update_adjustments;
+            update_rulers;
 
 
             return true;
@@ -163,7 +197,7 @@
         bool onExpose(GdkEventExpose * event, Widget widget) {
             assert(widget is mDrawingArea);
 
-            Drawable dr = mDrawingArea.getWindow();
+            Drawable dr = mDrawingArea.getWindow;
 
             int width, height;
             dr.getSize(width, height);
@@ -178,41 +212,43 @@
                 Rectangle(Point(cast(double)event.area.x, cast(double)event.area.y),
                           Vector(cast(double)event.area.width, cast(double)event.area.height));
 
-            model_cr.save(); screen_cr.save(); {
+            model_cr.save; screen_cr.save; {
                 // Setup model context
 
                 rectangle(model_cr, damage);
-                model_cr.clip();
+                model_cr.clip;
 
                 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
                 GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
 
                 model_cr.translate(mCanvasLeftBottom.x - gtk_adjustment_get_value(h_gtkAdjustment),
                                    mCanvasLeftBottom.y - gtk_adjustment_get_value(v_gtkAdjustment));
-                model_cr.scale(mZoom, mZoom);
+                model_cr.scale(mZoom, -mZoom);
 
                 // Setup screen context
 
+                screen_cr.translate(0.0, mViewSize.y);
+                screen_cr.scale(1.0, -1.0);
                 rectangle(screen_cr, damage);
-                screen_cr.clip();
+                screen_cr.clip;
 
                 // Fill the background
 
-                screen_cr.save(); {
+                screen_cr.save; {
                     // Make the window light grey
                     screen_cr.setSourceRgba(1.0, 1.0, 1.0, 0.7);
                     rectangle(screen_cr, damage);
-                    screen_cr.fill();
-                } screen_cr.restore();
+                    screen_cr.fill;
+                } screen_cr.restore;
 
                 // Draw each layer
 
                 foreach(ref layer; mLayers) {
-                    model_cr.save(); screen_cr.save(); {
+                    model_cr.save; screen_cr.save; {
                         layer.draw(this, damage, model_cr, screen_cr);
-                    } screen_cr.restore(); model_cr.restore();
+                    } screen_cr.restore; model_cr.restore;
                 }
-            } screen_cr.restore(); model_cr.restore();
+            } screen_cr.restore; model_cr.restore;
 
             return true;
         }
@@ -299,8 +335,8 @@
         }
 
         void onValueChanged(Adjustment adjustment) {
-            GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
-            GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
+            GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct;
+            GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct;
 
             Point view_left_bottom = Point(gtk_adjustment_get_value(h_gtkAdjustment),
                                              gtk_adjustment_get_value(v_gtkAdjustment));
@@ -308,9 +344,9 @@
             Vector model_size = screen_to_model(mViewSize);
             mViewCentre = view_left_bottom + model_size / 2.0;
 
-            update_rulers();
+            update_rulers;
 
-            queueDraw();
+            queueDraw;
         }
 
         void update_rulers() {
@@ -365,16 +401,14 @@
             gtk_adjustment_set_page_increment(v_gtkAdjustment, canvas_size.y / 5.0);
             gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y);
 
-            mHAdjustment.changed();
-            mHAdjustment.valueChanged();
-            mVAdjustment.changed();
-            mVAdjustment.valueChanged();
+            mHAdjustment.changed;
+            mHAdjustment.valueChanged;
+            mVAdjustment.changed;
+            mVAdjustment.valueChanged;
         }
 
         double clamp_zoom(double zoom) { return clamp(zoom, 0.02, 50.0); }
 
-        EventHandler mEventHandler;
-
         // Model units are in millimetres
         // Screen units are in pixels
 
@@ -397,5 +431,7 @@
 
         // Layers:
         Layer[] mLayers;
+        EventHandler mEventHandler;
+        double mPPI;
     }
 }
--- a/standard_tools.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/standard_tools.d	Sun Jul 12 01:04:35 2009 +0930
@@ -23,7 +23,7 @@
     }
 
     bool handle_motion(Viewport viewport, in MotionEvent event) {
-        if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) {
+        if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
             viewport.rel_pan(mLastPosition - event.screen_point);
             mLastPosition = event.screen_point;
 
@@ -35,7 +35,7 @@
     }
 
     bool handle_scroll(Viewport viewport, in ScrollEvent event) {
-        if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) {
+        if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) {
             Vector delta;
 
             switch (event.scroll_direction) {
--- a/tk/events.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/tk/events.d	Sun Jul 12 01:04:35 2009 +0930
@@ -3,29 +3,7 @@
 import tk.types;
 import tk.geometry;
 
-//
-// Should we pass the screen and model points into
-// the events or pass a transform in separately to the handler
-//
-
 abstract class Event {
-    this() {
-    }
-
-    private {
-    }
-}
-
-final class ExposeEvent : Event {
-    this() {
-        super();
-    }
-
-    private {
-    }
-}
-
-abstract class InputEvent : Event {
     this(Mask mask) {
         mMask = mask;
     }
@@ -37,7 +15,7 @@
     }
 }
 
-final class CrossingEvent : InputEvent {
+final class CrossingEvent : Event {
     this(Mask mask) {
         super(mask);
     }
@@ -46,7 +24,7 @@
     }
 }
 
-final class KeyEvent : InputEvent {
+final class KeyEvent : Event {
     this(string str, uint value, Mask mask) {
         super(mask);
         mStr = str;
@@ -65,7 +43,7 @@
     }
 }
 
-abstract class PointerEvent : InputEvent {
+abstract class PointerEvent : Event {
     this(in Point screen_point, in Point model_point, Mask mask) {
         super(mask);
         mScreenPoint = screen_point;
--- a/tk/geometry.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/tk/geometry.d	Sun Jul 12 01:04:35 2009 +0930
@@ -28,7 +28,7 @@
         return Vector(_x - p._x, _y - p._y);
     }
 
-    string toString() /* const */ {
+    string toString() const {
         return std.string.format("(%f, %f)", _x, _y);
     }
 
@@ -84,7 +84,7 @@
         return sqrt(_x * _x + _y * _y);
     }
 
-    string toString() /* const */ {
+    string toString() const {
         return std.string.format("[%f, %f]", _x, _y);
     }
 
@@ -184,7 +184,7 @@
     }
     */
 
-    string toString() /* const */ {
+    string toString() const {
         return std.string.format("{%s, %s}", _position, _size);
     }
 
--- a/tk/gtk_support.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/tk/gtk_support.d	Sun Jul 12 01:04:35 2009 +0930
@@ -43,11 +43,11 @@
     if (state & gdk.Event.GdkModifierType.CONTROL_MASK) modifiers ~= Modifier.CONTROL;
     if (state & gdk.Event.GdkModifierType.MOD1_MASK)    modifiers ~= Modifier.ALT;
     if (state & gdk.Event.GdkModifierType.MOD2_MASK)    modifiers ~= Modifier.META;
-    if (state & gdk.Event.GdkModifierType.BUTTON1_MASK) modifiers ~= Modifier.BUTTON_LEFT;
-    if (state & gdk.Event.GdkModifierType.BUTTON2_MASK) modifiers ~= Modifier.BUTTON_MIDDLE;
-    if (state & gdk.Event.GdkModifierType.BUTTON3_MASK) modifiers ~= Modifier.BUTTON_RIGHT;
-    if (state & gdk.Event.GdkModifierType.BUTTON4_MASK) modifiers ~= Modifier.BUTTON_FOUR;
-    if (state & gdk.Event.GdkModifierType.BUTTON5_MASK) modifiers ~= Modifier.BUTTON_FIVE;
+    if (state & gdk.Event.GdkModifierType.BUTTON1_MASK) modifiers ~= Modifier.LEFT_BUTTON;
+    if (state & gdk.Event.GdkModifierType.BUTTON2_MASK) modifiers ~= Modifier.MIDDLE_BUTTON;
+    if (state & gdk.Event.GdkModifierType.BUTTON3_MASK) modifiers ~= Modifier.RIGHT_BUTTON;
+    if (state & gdk.Event.GdkModifierType.BUTTON4_MASK) modifiers ~= Modifier.UNUSED_BUTTON_1;
+    if (state & gdk.Event.GdkModifierType.BUTTON5_MASK) modifiers ~= Modifier.UNUSED_BUTTON_2;
 
     return new Mask(modifiers);
 }
--- a/tk/tool.d	Sun Jul 12 00:39:35 2009 +0930
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-module tk.tools;
-
-/*
-class Window {
-    void screen_to_model();
-    void model_to_screen();
-};
-*/
-
-abstract class Tool {
-    void handle_button_press(Window window,
-                             ButtonEvent event,
-};
--- a/tk/types.d	Sun Jul 12 00:39:35 2009 +0930
+++ b/tk/types.d	Sun Jul 12 01:04:35 2009 +0930
@@ -12,7 +12,7 @@
                   "UP", "DOWN", "LEFT", "RIGHT"));
 mixin(defineEnum!("Modifier",
                   "SHIFT", "CAPS_LOCK", "CONTROL", "ALT", "NUM_LOCK", "META",
-                  "SCROLL_LOCK", "BUTTON_LEFT", "BUTTON_MIDDLE", "BUTTON_RIGHT", "BUTTON_FOUR", "BUTTON_FIVE"));
+                  "SCROLL_LOCK", "LEFT_BUTTON", "MIDDLE_BUTTON", "RIGHT_BUTTON", "UNUSED_BUTTON_1", "UNUSED_BUTTON_2"));
 
 class Mask {
     this(in Modifier[] modifiers) {