Mercurial > projects > doodle
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