diff canvas.d @ 12:a093c4fbdd43

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 12 Jul 2009 00:39:35 +0930
parents fb571a3b1f0d
children f0ade1b49fe7
line wrap: on
line diff
--- a/canvas.d	Sat Jul 11 23:32:22 2009 +0930
+++ b/canvas.d	Sun Jul 12 00:39:35 2009 +0930
@@ -86,7 +86,7 @@
 
         // value, lower, upper, step-inc, page-inc, page-size
         // Give the adjustments dummy values until we receive a configure
-        mHAdjustment = new Adjustment(0.25, 0.0, 1.0, 0.2, 0.5, 0.5);
+        mHAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
         mHAdjustment.addOnValueChanged(&onValueChanged);
         mHScrollbar = new HScrollbar(mHAdjustment);
         attach(mHScrollbar,
@@ -116,7 +116,7 @@
         mZoom = clamp_zoom(factor * mZoom);
         mViewCentre = old_model_datum - screen_to_model(pixel_distance);
 
-        Point new_model_datum = screen_to_model(screen_datum);
+        //Point new_model_datum = screen_to_model(screen_datum);
 
         update_adjustments();
         //update_rulers(new_model_datum);
@@ -169,28 +169,50 @@
             dr.getSize(width, height);
             //writefln("Got expose %dx%d\n", width, height);
 
-            scope cr = new Context(dr);
+            scope model_cr = new Context(dr);
+            scope screen_cr = new Context(dr);
+
             Rectangle damage =
                 event is null ?
                 Rectangle(Point(0.0, 0.0), Vector(cast(double)width, cast(double)height)) :
                 Rectangle(Point(cast(double)event.area.x, cast(double)event.area.y),
                           Vector(cast(double)event.area.width, cast(double)event.area.height));
 
-            cr.save(); {
-                rectangle(cr, damage);
-                cr.clip();
+            model_cr.save(); screen_cr.save(); {
+                // Setup model context
+
+                rectangle(model_cr, damage);
+                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);
 
-                cr.save(); {
+                // Setup screen context
+
+                rectangle(screen_cr, damage);
+                screen_cr.clip();
+
+                // Fill the background
+
+                screen_cr.save(); {
                     // Make the window light grey
-                    cr.setSourceRgba(1.0, 1.0, 1.0, 0.7);
-                    rectangle(cr, damage);
-                    cr.fill();
-                } cr.restore();
+                    screen_cr.setSourceRgba(1.0, 1.0, 1.0, 0.7);
+                    rectangle(screen_cr, damage);
+                    screen_cr.fill();
+                } screen_cr.restore();
+
+                // Draw each layer
 
                 foreach(ref layer; mLayers) {
-                    layer.draw(this, damage, cr);
+                    model_cr.save(); screen_cr.save(); {
+                        layer.draw(this, damage, model_cr, screen_cr);
+                    } screen_cr.restore(); model_cr.restore();
                 }
-            } cr.restore();
+            } screen_cr.restore(); model_cr.restore();
 
             return true;
         }
@@ -297,10 +319,15 @@
             Point view_left_bottom = mViewCentre - model_size / 2.0;
             Point view_right_top = mViewCentre + model_size / 2.0;
 
+            double lower, upper, position, max_size;
+
+            mHRuler.getRange(lower, upper, position, max_size);
             mHRuler.setRange(view_left_bottom.x,
                              view_right_top.x,
-                             0.0,       // TODO preserve the value
+                             position,
                              mZoom * 2000.0);
+
+            mVRuler.getRange(lower, upper, position, max_size);
             mVRuler.setRange(view_right_top.y,
                              view_left_bottom.y,
                              0.0,
@@ -318,7 +345,6 @@
             mCanvasRightTop = max_extents(mCanvasRightTop, view_right_top);
 
             Vector canvas_size = mCanvasRightTop - mCanvasLeftBottom;
-            Vector page_size = mPageRightTop - mPageLeftBottom;
 
             // Update the adjustments
 
@@ -357,8 +383,6 @@
 
         Point mCanvasLeftBottom;    // model: bottom left corner of canvas
         Point mCanvasRightTop;      // model: top right corner of canvas
-        Point mPageLeftBottom;      // model: bottom left corner of page
-        Point mPageRightTop;        // model: top right corner of page
 
         Vector mViewSize;           // screen: size of view window in pixels