Mercurial > projects > doodle
changeset 12:a093c4fbdd43
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 12 Jul 2009 00:39:35 +0930 |
parents | fb571a3b1f0d |
children | f0ade1b49fe7 |
files | build.sh canvas.d grid_layer.d gui.d icanvas.d page_layer.d tool_layer.d tool_stack.d |
diffstat | 8 files changed, 202 insertions(+), 141 deletions(-) [+] |
line wrap: on
line diff
--- a/build.sh Sat Jul 11 23:32:22 2009 +0930 +++ b/build.sh Sun Jul 12 00:39:35 2009 +0930 @@ -2,7 +2,7 @@ dmd \ -ofgui \ - gui.d tool_stack.d tool.d icanvas.d canvas.d \ + gui.d tool_layer.d tool.d icanvas.d canvas.d \ tk/geometry.d tk/gtk_support.d tk/misc.d tk/types.d tk/events.d \ cairo_support.d standard_tools.d \ page_layer.d \
--- 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
--- a/grid_layer.d Sat Jul 11 23:32:22 2009 +0930 +++ b/grid_layer.d Sun Jul 12 00:39:35 2009 +0930 @@ -13,7 +13,8 @@ return Rectangle(); } - override void draw(const Viewport viewport, in Rectangle damage, Context cr) const { + override void draw(const Viewport viewport, in Rectangle damage, + Context model_cr, Context screen_cr) const { double zoom = viewport.zoom; double start_x = modf(damage.min_corner.x, zoom);
--- a/gui.d Sat Jul 11 23:32:22 2009 +0930 +++ b/gui.d Sun Jul 12 00:39:35 2009 +0930 @@ -2,7 +2,7 @@ import icanvas; import canvas; -import tool_stack; +import tool_layer; import tool; import standard_tools; import page_layer; @@ -23,10 +23,11 @@ Tool[] tools; tools ~= new PanTool; tools ~= new ZoomTool; - auto event_handler = new ToolStack(tools); + auto tool_layer = new ToolLayer(tools, "Tools"); Layer[] layers; - layers ~= new PageLayer; - auto canvas = new Canvas(layers, event_handler, 120.0); + layers ~= new PageLayer("Page"); + layers ~= tool_layer; + auto canvas = new Canvas(layers, tool_layer, 120.0); window.add(canvas); window.setDefaultSize(420, 340); window.showAll();
--- a/icanvas.d Sat Jul 11 23:32:22 2009 +0930 +++ b/icanvas.d Sun Jul 12 00:39:35 2009 +0930 @@ -35,7 +35,17 @@ } abstract class Layer { + this(in string name) { + mName = name; + } + + string name() const { return mName; } + Rectangle bounds() const; //void zoom_changed - void draw(const Viewport viewport, in Rectangle damage, Context cr) const; + void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context screen_cr) const; + + private { + invariant string mName; + } }
--- a/page_layer.d Sat Jul 11 23:32:22 2009 +0930 +++ b/page_layer.d Sun Jul 12 00:39:35 2009 +0930 @@ -7,7 +7,8 @@ } class PageLayer : Layer, Page { - this() { + this(in string name) { + super(name); mPageGeometry = Rectangle(Point.DEFAULT, Vector(210.0, 297.0)); } @@ -16,16 +17,29 @@ return mPageGeometry; } - override void draw(const Viewport viewport, in Rectangle damage, Context cr) const { + override void draw(const Viewport viewport, in Rectangle damage, + Context model_cr, Context screen_cr) const { // Make the paper white, with a border - cr.setSourceRgba(1.0, 1.0, 1.0, 1.0); - rectangle(cr, viewport.model_to_screen(mPageGeometry)); - cr.fill(); + /* + model_cr.setSourceRgba(1.0, 1.0, 1.0, 1.0); + rectangle(model_cr, mPageGeometry); + model_cr.fill(); - cr.setSourceRgba(0.0, 0.0, 0.0, 1.0); - rectangle(cr, viewport.model_to_screen(mPageGeometry)); - cr.stroke(); + model_cr.setSourceRgba(0.0, 0.0, 0.0, 1.0); + rectangle(model_cr, mPageGeometry); + rectangle(model_cr, Rectangle(mPageGeometry.position, mPageGeometry.size / 2.0)); + model_cr.stroke(); + */ + + screen_cr.setSourceRgba(1.0, 1.0, 1.0, 1.0); + rectangle(screen_cr, viewport.model_to_screen(mPageGeometry)); + screen_cr.fill(); + + screen_cr.setSourceRgba(0.0, 0.0, 0.0, 1.0); + rectangle(screen_cr, viewport.model_to_screen(mPageGeometry)); + rectangle(screen_cr, viewport.model_to_screen(Rectangle(mPageGeometry.position, mPageGeometry.size / 2.0))); + screen_cr.stroke(); } private {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tool_layer.d Sun Jul 12 00:39:35 2009 +0930 @@ -0,0 +1,120 @@ +module tool_layer; + +import std.stdio; + +import cairo.Context; +import cairo_support; +import tool; +private import icanvas; +private import tk.types; +private import tk.geometry; +private import tk.events; + +class ToolLayer : Layer, EventHandler { + this(in Tool[] tools, in string name) { + super(name); + mTools = tools.dup; + } + + override bool handle_button_press(Viewport viewport, in ButtonEvent event) { + writefln("%s", event); + + if (mGrabbedTool is null) { + foreach_reverse(ref tool; mTools) { + if (tool.handle_button_press(viewport, event)) { + mGrabbedTool = &tool; + mGrabbedButton = event.button_name; + break; + } + } + } + else { + mGrabbedTool.handle_button_press(viewport, event); + } + + return true; + } + + override bool handle_button_release(Viewport viewport, in ButtonEvent event) { + writefln("%s", event); + + if (mGrabbedTool !is null) { + mGrabbedTool.handle_button_release(viewport, event); + + if (mGrabbedButton == event.button_name) { + mGrabbedTool = null; + } + } + + return true; + } + + override bool handle_key_press(Viewport viewport, in KeyEvent event) { + writefln("%s", event); + return true; + } + + override bool handle_key_release(Viewport viewport, in KeyEvent event) { + writefln("%s", event); + return true; + } + + override bool handle_motion(Viewport viewport, in MotionEvent event) { + writefln("%s", event); + + if (mGrabbedTool is null) { + foreach_reverse(ref tool; mTools) { + if (tool.handle_motion(viewport, event)) { + break; + } + } + } + else { + mGrabbedTool.handle_motion(viewport, event); + } + + return true; + } + + override bool handle_scroll(Viewport viewport, in ScrollEvent event) { + writefln("%s", event); + + if (mGrabbedTool is null) { + foreach_reverse(ref tool; mTools) { + if (tool.handle_scroll(viewport, event)) { + break; + } + } + } + else { + mGrabbedTool.handle_scroll(viewport, event); + } + + return true; + } + + override Rectangle bounds() const { + return Rectangle(); + } + + override void draw(const Viewport viewport, in Rectangle damage, + Context model_cr, Context screen_cr) const { + } + + /* + override void push(Tool tool) { + } + + override void pop() { + } + + override void replace(Tool tool) { + } + */ + + private { + Tool[] mTools; + Tool * mGrabbedTool; + ButtonName mGrabbedButton; + } +}
--- a/tool_stack.d Sat Jul 11 23:32:22 2009 +0930 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -module tool_stack; - -import std.stdio; - -import tool; -private import icanvas; -private import tk.types; -private import tk.geometry; -private import tk.events; - -class ToolStack : EventHandler { - this(in Tool[] tools) { - mTools = tools.dup; - } - - override bool handle_button_press(Viewport viewport, in ButtonEvent event) { - writefln("%s", event); - - if (mGrabbedTool is null) { - foreach_reverse(ref tool; mTools) { - if (tool.handle_button_press(viewport, event)) { - mGrabbedTool = &tool; - mGrabbedButton = event.button_name; - break; - } - } - } - else { - mGrabbedTool.handle_button_press(viewport, event); - } - - return true; - } - - override bool handle_button_release(Viewport viewport, in ButtonEvent event) { - writefln("%s", event); - - if (mGrabbedTool !is null) { - mGrabbedTool.handle_button_release(viewport, event); - - if (mGrabbedButton == event.button_name) { - mGrabbedTool = null; - } - } - - return true; - } - - override bool handle_key_press(Viewport viewport, in KeyEvent event) { - writefln("%s", event); - return true; - } - - override bool handle_key_release(Viewport viewport, in KeyEvent event) { - writefln("%s", event); - return true; - } - - override bool handle_motion(Viewport viewport, in MotionEvent event) { - writefln("%s", event); - - if (mGrabbedTool is null) { - foreach_reverse(ref tool; mTools) { - if (tool.handle_motion(viewport, event)) { - break; - } - } - } - else { - mGrabbedTool.handle_motion(viewport, event); - } - - return true; - } - - override bool handle_scroll(Viewport viewport, in ScrollEvent event) { - writefln("%s", event); - - if (mGrabbedTool is null) { - foreach_reverse(ref tool; mTools) { - if (tool.handle_scroll(viewport, event)) { - break; - } - } - } - else { - mGrabbedTool.handle_scroll(viewport, event); - } - - return true; - } - - /* - override void push(Tool tool) { - } - - override void pop() { - } - - override void replace(Tool tool) { - } - */ - - private { - Tool[] mTools; - Tool * mGrabbedTool; - ButtonName mGrabbedButton; - } -}