Mercurial > projects > doodle
diff canvas.d @ 13:f0ade1b49fe7
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 12 Jul 2009 01:04:35 +0930 |
parents | a093c4fbdd43 |
children | 0b7e7d43a79d |
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; } }