# HG changeset patch # User "David Bryant " # Date 1247318381 -34200 # Node ID 71ca82e0eb76987ceae02e08abce6e7b51c64932 # Parent 66b47e122b31567c7f55da2d27df28f5bac2f007 Checkpoint diff -r 66b47e122b31 -r 71ca82e0eb76 build.sh --- a/build.sh Sat Jul 11 22:06:09 2009 +0930 +++ b/build.sh Sat Jul 11 22:49:41 2009 +0930 @@ -5,6 +5,7 @@ gui.d tool_stack.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 \ -od.obj \ -I"${DMD_BASE}/include/d" \ -L-lgtkd -L-ldl diff -r 66b47e122b31 -r 71ca82e0eb76 cairo_support.d --- a/cairo_support.d Sat Jul 11 22:06:09 2009 +0930 +++ b/cairo_support.d Sat Jul 11 22:49:41 2009 +0930 @@ -4,17 +4,7 @@ import cairo.Context; -void rectangle(Context cr, Point corner1, Point corner2) { - double x = corner1.x; - double y = corner1.y; - double w = corner2.x - corner1.x; - double h = corner2.y - corner1.y; - - if (w < 0.0) { x += w; w = -w; } - if (h < 0.0) { y += h; h = -h; } - - //writefln("Rect: %f %f %f %f\n", x, y, w, h); - - cr.rectangle(x, y, w, h); +void draw_rectangle(Context cr, Rectangle rectangle) { + cr.rectangle(rectangle.position.x, rectangle.position.y, + rectangle.size.x, rectangle.size.y); } - diff -r 66b47e122b31 -r 71ca82e0eb76 canvas.d --- a/canvas.d Sat Jul 11 22:06:09 2009 +0930 +++ b/canvas.d Sat Jul 11 22:49:41 2009 +0930 @@ -32,13 +32,13 @@ // x and y run right and up respectively -class Canvas : Table, ICanvas { +class Canvas : Table, Viewport { static this() { ORIGIN = Point(0.0, 0.0); INITIAL_PAGE_SIZE = Vector(210.0, 297.0); // A4 } - this(ICanvasEventHandler event_handler) { + this(EventHandler event_handler) { super(3, 3, 0); mEventHandler = event_handler; @@ -134,6 +134,13 @@ queueDraw(); } + override Point model_to_screen(Point model) const { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); } + override Point screen_to_model(Point screen) const { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / 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; } + private { void onRealize(Widget widget) { @@ -185,11 +192,11 @@ Point screen_page_right_top = model_to_screen(mPageRightTop); cr.setSourceRgba(1.0, 1.0, 1.0, 1.0); - rectangle(cr, screen_page_left_bottom, screen_page_right_top); + draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top)); cr.fill(); cr.setSourceRgba(0.0, 0.0, 0.0, 1.0); - rectangle(cr, screen_page_left_bottom, screen_page_right_top); + draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top)); cr.stroke(); } @@ -346,24 +353,17 @@ mVAdjustment.valueChanged(); } - Point model_to_screen(Point model) { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); } - Point screen_to_model(Point screen) { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; } - Vector model_to_screen(Vector model) { return mZoom * model; } - Vector screen_to_model(Vector screen) { return screen / mZoom; } - double model_to_screen(double model) { return mZoom * model; } - double screen_to_model(double screen) { return screen / mZoom; } - double clamp_zoom(double zoom) { return clamp(zoom, 0.02, 50.0); } static const Point ORIGIN; static const Vector INITIAL_PAGE_SIZE; - ICanvasEventHandler mEventHandler; + EventHandler mEventHandler; // Model units are in millimetres // Screen units are in pixels - double mZoom; // pixels-per-mm + double mZoom; // pixels-per-mm Point mViewCentre; // model: where in the model is the centre of our view Point mCanvasLeftBottom; // model: bottom left corner of canvas @@ -373,6 +373,7 @@ Vector mViewSize; // screen: size of view window in pixels + // Child widgets: HRuler mHRuler; VRuler mVRuler; DrawingArea mDrawingArea; diff -r 66b47e122b31 -r 71ca82e0eb76 icanvas.d --- a/icanvas.d Sat Jul 11 22:06:09 2009 +0930 +++ b/icanvas.d Sat Jul 11 22:49:41 2009 +0930 @@ -2,22 +2,35 @@ import tk.geometry; import tk.events; +import cairo.Context; -interface ICanvas { +interface Viewport { void rel_zoom(Point screen_datum, double factor); void rel_pan(Vector screen_displacement); + //void damage(Rectangle area); + + Point model_to_screen(Point model) const; + Point screen_to_model(Point screen) const; + Vector model_to_screen(Vector model) const; + Vector screen_to_model(Vector screen) const; + double model_to_screen(double model) const; + double screen_to_model(double screen) const; } -interface ICanvasEventHandler { - bool handle_button_press(ICanvas canvas, in ButtonEvent event); - bool handle_button_release(ICanvas canvas, in ButtonEvent event); - bool handle_motion(ICanvas canvas, in MotionEvent event); - bool handle_scroll(ICanvas canvas, in ScrollEvent event); - //bool handle_expose(ICanvas canvas, ExposeEvent event); - //bool handle_enter(ICanvas, CrossingEvent event); - //bool handle_leave(ICanvas, CrossingEvent event); - //bool handle_focus_in(ICanvas, FocusEvent event); - //bool handle_focus_out(ICanvas, FocusEvent event); - bool handle_key_press(ICanvas canvas, in KeyEvent event); - bool handle_key_release(ICanvas canvas, in KeyEvent event); +interface EventHandler { + bool handle_button_press(Viewport viewport, in ButtonEvent event); + bool handle_button_release(Viewport viewport, in ButtonEvent event); + bool handle_motion(Viewport viewport, in MotionEvent event); + bool handle_scroll(Viewport viewport, in ScrollEvent event); + //bool handle_expose(Viewport viewport, ExposeEvent event); + //bool handle_enter(Viewport viewport, CrossingEvent event); + //bool handle_leave(Viewport viewport, CrossingEvent event); + //bool handle_focus_in(Viewport viewport, FocusEvent event); + //bool handle_focus_out(Viewport viewport, FocusEvent event); + bool handle_key_press(Viewport viewport, in KeyEvent event); + bool handle_key_release(Viewport viewport, in KeyEvent event); } + +abstract class Layer { + void draw(const Viewport viewport, in Rectangle damage, Context cr) const; +} diff -r 66b47e122b31 -r 71ca82e0eb76 page_layer.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/page_layer.d Sat Jul 11 22:49:41 2009 +0930 @@ -0,0 +1,29 @@ +import icanvas; +import tk.geometry; +import cairo.Context; +import cairo_support; + +interface Page { +} + +class PageLayer : Layer, Page { + void draw(const Viewport viewport, in Rectangle damage, Context cr) const { + // Make the paper white, with a border + + Point screen_page_left_bottom = viewport.model_to_screen(mPageLeftBottom); + Point screen_page_right_top = viewport.model_to_screen(mPageRightTop); + + cr.setSourceRgba(1.0, 1.0, 1.0, 1.0); + draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top)); + cr.fill(); + + cr.setSourceRgba(0.0, 0.0, 0.0, 1.0); + draw_rectangle(cr, Rectangle(screen_page_left_bottom, screen_page_right_top)); + cr.stroke(); + } + + private { + Point mPageLeftBottom; // model: bottom left corner of page + Point mPageRightTop; // model: top right corner of page + } +} diff -r 66b47e122b31 -r 71ca82e0eb76 standard_tools.d --- a/standard_tools.d Sat Jul 11 22:06:09 2009 +0930 +++ b/standard_tools.d Sat Jul 11 22:49:41 2009 +0930 @@ -8,7 +8,7 @@ import std.math; final class PanTool : Tool { - bool handle_button_press(ICanvas canvas, in ButtonEvent event) { + bool handle_button_press(Viewport viewport, in ButtonEvent event) { if (event.button_name == ButtonName.MIDDLE) { mLastPosition = event.screen_point; return true; @@ -18,13 +18,13 @@ } } - bool handle_button_release(ICanvas canvas, in ButtonEvent event) { + bool handle_button_release(Viewport viewport, in ButtonEvent event) { return true; } - bool handle_motion(ICanvas canvas, in MotionEvent event) { + bool handle_motion(Viewport viewport, in MotionEvent event) { if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) { - canvas.rel_pan(mLastPosition - event.screen_point); + viewport.rel_pan(mLastPosition - event.screen_point); mLastPosition = event.screen_point; return true; @@ -34,7 +34,7 @@ } } - bool handle_scroll(ICanvas canvas, in ScrollEvent event) { + bool handle_scroll(Viewport viewport, in ScrollEvent event) { if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) { Vector delta; @@ -53,17 +53,17 @@ break; } - canvas.rel_pan(delta); + viewport.rel_pan(delta); } return true; } - bool handle_key_press(ICanvas canvas, in KeyEvent event) { + bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; } - bool handle_key_release(ICanvas canvas, in KeyEvent event) { + bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; } @@ -74,26 +74,26 @@ } final class ZoomTool : Tool { - bool handle_button_press(ICanvas canvas, in ButtonEvent event) { + bool handle_button_press(Viewport viewport, in ButtonEvent event) { return false; } - bool handle_button_release(ICanvas canvas, in ButtonEvent event) { + bool handle_button_release(Viewport viewport, in ButtonEvent event) { return false; } - bool handle_motion(ICanvas canvas, in MotionEvent event) { + bool handle_motion(Viewport viewport, in MotionEvent event) { return false; } - bool handle_scroll(ICanvas canvas, in ScrollEvent event) { + bool handle_scroll(Viewport viewport, in ScrollEvent event) { if (event.mask.is_set(Modifier.CONTROL)) { if (event.scroll_direction == ScrollDirection.DOWN) { - canvas.rel_zoom(event.screen_point(), 1.0 / ZOOM); + viewport.rel_zoom(event.screen_point(), 1.0 / ZOOM); return true; } else if (event.scroll_direction == ScrollDirection.UP) { - canvas.rel_zoom(event.screen_point(), ZOOM); + viewport.rel_zoom(event.screen_point(), ZOOM); return true; } else { @@ -105,11 +105,11 @@ } } - bool handle_key_press(ICanvas canvas, in KeyEvent event) { + bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; } - bool handle_key_release(ICanvas canvas, in KeyEvent event) { + bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; } diff -r 66b47e122b31 -r 71ca82e0eb76 tk/geometry.d --- a/tk/geometry.d Sat Jul 11 22:06:09 2009 +0930 +++ b/tk/geometry.d Sat Jul 11 22:49:41 2009 +0930 @@ -120,6 +120,10 @@ return _position; } + Vector size() const { + return _size; + } + alias position min_corner; Point max_corner() const { diff -r 66b47e122b31 -r 71ca82e0eb76 tool.d --- a/tool.d Sat Jul 11 22:06:09 2009 +0930 +++ b/tool.d Sat Jul 11 22:49:41 2009 +0930 @@ -10,7 +10,7 @@ } */ -abstract class Tool : ICanvasEventHandler { +abstract class Tool : EventHandler { /* abstract bool is_sticky(); abstract bool is_replaceable(); diff -r 66b47e122b31 -r 71ca82e0eb76 tool_stack.d --- a/tool_stack.d Sat Jul 11 22:06:09 2009 +0930 +++ b/tool_stack.d Sat Jul 11 22:49:41 2009 +0930 @@ -8,17 +8,17 @@ private import tk.geometry; private import tk.events; -class ToolStack : ICanvasEventHandler { +class ToolStack : EventHandler { this(in Tool[] tools) { mTools = tools.dup; } - override bool handle_button_press(ICanvas canvas, in ButtonEvent event) { + 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(canvas, event)) { + if (tool.handle_button_press(viewport, event)) { mGrabbedTool = &tool; mGrabbedButton = event.button_name; break; @@ -26,17 +26,17 @@ } } else { - mGrabbedTool.handle_button_press(canvas, event); + mGrabbedTool.handle_button_press(viewport, event); } return true; } - override bool handle_button_release(ICanvas canvas, in ButtonEvent event) { + override bool handle_button_release(Viewport viewport, in ButtonEvent event) { writefln("%s", event); if (mGrabbedTool !is null) { - mGrabbedTool.handle_button_release(canvas, event); + mGrabbedTool.handle_button_release(viewport, event); if (mGrabbedButton == event.button_name) { mGrabbedTool = null; @@ -46,45 +46,45 @@ return true; } - override bool handle_key_press(ICanvas canvas, in KeyEvent event) { + override bool handle_key_press(Viewport viewport, in KeyEvent event) { writefln("%s", event); return true; } - override bool handle_key_release(ICanvas canvas, in KeyEvent event) { + override bool handle_key_release(Viewport viewport, in KeyEvent event) { writefln("%s", event); return true; } - override bool handle_motion(ICanvas canvas, in MotionEvent event) { + 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(canvas, event)) { + if (tool.handle_motion(viewport, event)) { break; } } } else { - mGrabbedTool.handle_motion(canvas, event); + mGrabbedTool.handle_motion(viewport, event); } return true; } - override bool handle_scroll(ICanvas canvas, in ScrollEvent event) { + 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(canvas, event)) { + if (tool.handle_scroll(viewport, event)) { break; } } } else { - mGrabbedTool.handle_scroll(canvas, event); + mGrabbedTool.handle_scroll(viewport, event); } return true;