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