changeset 15:2f79aab4d385

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 12 Jul 2009 13:23:06 +0930
parents 0b7e7d43a79d
children 9e63308b749c
files canvas.d tk/geometry.d
diffstat 2 files changed, 40 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Sun Jul 12 01:23:32 2009 +0930
+++ b/canvas.d	Sun Jul 12 13:23:06 2009 +0930
@@ -46,17 +46,16 @@
         // Take the union of the bounds of each layer to
         // determine the canvas size
 
-        Rectangle total_layer_bounds;
+        Rectangle layer_bounds = Rectangle.DEFAULT;
 
         foreach (ref layer; mLayers) {
-            total_layer_bounds = total_layer_bounds | layer.bounds;
+            layer_bounds = layer_bounds | layer.bounds;
         }
 
-        assert(total_layer_bounds.valid);
+        assert(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;
+        mCanvasBounds = layer_bounds.moved(-layer_bounds.size).expanded(2.0 * layer_bounds.size);
+        mViewCentre = mCanvasBounds.centre;
 
         // Create our child widgets and register callbacks
 
@@ -220,8 +219,8 @@
                 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.translate(mCanvasBounds.min_corner.x - gtk_adjustment_get_value(h_gtkAdjustment),
+                                   mCanvasBounds.min_corner.y - gtk_adjustment_get_value(v_gtkAdjustment));
                 model_cr.scale(mZoom, -mZoom);
 
                 // Setup screen context
@@ -376,28 +375,26 @@
             Point view_right_top = mViewCentre + model_size / 2.0;
 
             // Adjust the canvas size if necessary
-            mCanvasLeftBottom = min_extents(mCanvasLeftBottom, view_left_bottom);
-            mCanvasRightTop = max_extents(mCanvasRightTop, view_right_top);
-
-            Vector canvas_size = mCanvasRightTop - mCanvasLeftBottom;
+            mCanvasBounds = Rectangle(min_extents(mCanvasBounds.min_corner, view_left_bottom),
+                                      max_extents(mCanvasBounds.max_corner, view_right_top));
 
             // Update the adjustments
 
             GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
             GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
 
-            gtk_adjustment_set_lower(h_gtkAdjustment, mCanvasLeftBottom.x);
-            gtk_adjustment_set_upper(h_gtkAdjustment, mCanvasRightTop.x);
+            gtk_adjustment_set_lower(h_gtkAdjustment, mCanvasBounds.min_corner.x);
+            gtk_adjustment_set_upper(h_gtkAdjustment, mCanvasBounds.max_corner.y);
             gtk_adjustment_set_value(h_gtkAdjustment, view_left_bottom.x);
-            gtk_adjustment_set_step_increment(h_gtkAdjustment, canvas_size.x / 16.0);
-            gtk_adjustment_set_page_increment(h_gtkAdjustment, canvas_size.x / 4.0);
+            gtk_adjustment_set_step_increment(h_gtkAdjustment, mCanvasBounds.size.x / 16.0);
+            gtk_adjustment_set_page_increment(h_gtkAdjustment, mCanvasBounds.size.x / 4.0);
             gtk_adjustment_set_page_size(h_gtkAdjustment, model_size.x);
 
-            gtk_adjustment_set_lower(v_gtkAdjustment, mCanvasLeftBottom.y);
-            gtk_adjustment_set_upper(v_gtkAdjustment, mCanvasRightTop.y);
+            gtk_adjustment_set_lower(v_gtkAdjustment, mCanvasBounds.min_corner.y);
+            gtk_adjustment_set_upper(v_gtkAdjustment, mCanvasBounds.max_corner.y);
             gtk_adjustment_set_value(v_gtkAdjustment, view_left_bottom.y);
-            gtk_adjustment_set_step_increment(v_gtkAdjustment, canvas_size.y / 16.0);
-            gtk_adjustment_set_page_increment(v_gtkAdjustment, canvas_size.y / 4.0);
+            gtk_adjustment_set_step_increment(v_gtkAdjustment, mCanvasBounds.size.y / 16.0);
+            gtk_adjustment_set_page_increment(v_gtkAdjustment, mCanvasBounds.size.y / 4.0);
             gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y);
 
             mHAdjustment.changed;
@@ -413,10 +410,7 @@
 
         double mZoom;               // pixels-per-model-unit (mm)
         Point mViewCentre;          // model: where in the model is the centre of our view
-
-        Point mCanvasLeftBottom;    // model: bottom left corner of canvas
-        Point mCanvasRightTop;      // model: top right corner of canvas
-
+        Rectangle mCanvasBounds;    // model:
         Vector mViewSize;           // screen: size of view window in pixels
 
         // Child widgets:
--- a/tk/geometry.d	Sun Jul 12 01:23:32 2009 +0930
+++ b/tk/geometry.d	Sun Jul 12 13:23:06 2009 +0930
@@ -174,15 +174,31 @@
         }
     }
 
-    /*
-    Rectangle moved(in Vector displacement) {
-        return Rectangle(
+    // TODO make these free functions
+
+    Rectangle moved(in Vector displacement) const {
+        return Rectangle(_position + displacement, _size);
+    }
+
+    Rectangle expanded(in Vector expand_amount) const {
+        return Rectangle(_position, _size + expand_amount);
+    }
+
+    Rectangle shrunk(in Vector shrink_amount) const {
+        return Rectangle(_position, _size - shrink_amount);
     }
-    Rectangle resized(in Vector new_size) {
+
+    Rectangle resized(in Vector new_size) const {
+        return Rectangle(_position, new_size);
     }
-    Rectangle repositioned(in Point new_position) {
+
+    Rectangle repositioned(in Point new_position) const {
+        return Rectangle(new_position, _size);
     }
-    */
+
+    Point centre() const {
+        return _position + _size / 2.0;
+    }
 
     string toString() const {
         return std.string.format("{%s, %s}", _position, _size);