# HG changeset patch # User David Bryant # Date 1247469381 -34200 # Node ID c643c04e3f5eb1f7766791f3f225591534ae9a17 # Parent 9e63308b749cd5151e9a0bd6ff60cb9edcdb1678 Checkpoint diff -r 9e63308b749c -r c643c04e3f5e canvas.d --- a/canvas.d Mon Jul 13 16:16:17 2009 +0930 +++ b/canvas.d Mon Jul 13 16:46:21 2009 +0930 @@ -38,6 +38,8 @@ this(in Layer[] layers, EventHandler event_handler, in double ppi) { super(3, 3, 0); + mDamage = Rectangle.DEFAULT; + mLayers = layers.dup; mEventHandler = event_handler; mPPI = ppi; @@ -129,6 +131,10 @@ queueDraw; } + override void damage_model(Rectangle area) { + mDamage = mDamage | model_to_pixel(area); + } + override double zoom() const { return mZoom; } @@ -280,6 +286,8 @@ mEventHandler.handle_button_press(this, button_event); + process_damage; + return true; } @@ -298,6 +306,8 @@ mEventHandler.handle_button_release(this, button_event); + process_damage; + return true; } @@ -308,6 +318,8 @@ //auto key_event = new KeyEvent("", // mEventHandle.handle_key(key_event); + process_damage; + return true; } @@ -326,6 +338,8 @@ mEventHandler.handle_motion(this, motion_event); + process_damage; + return true; } @@ -343,6 +357,8 @@ mEventHandler.handle_scroll(this, scroll_event); + process_damage; + return true; } @@ -424,9 +440,23 @@ mVAdjustment.valueChanged; } + void process_damage() { + if (mDamage.valid) { + writefln("Damage: %s", mDamage); + int x, y, w, h; + mDamage.get_quantised(x, y, w, h); + mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - y, w, h); + mDamage = Rectangle.DEFAULT; + } + else { + writefln("No damage"); + } + } + double clamp_zoom(double zoom) { return clamp(zoom, 0.2, 10.0); } bool mHadConfigure; + Rectangle mDamage; // pixels // Model units are in millimetres // Screen units are in pixels diff -r 9e63308b749c -r c643c04e3f5e grid_layer.d --- a/grid_layer.d Mon Jul 13 16:16:17 2009 +0930 +++ b/grid_layer.d Mon Jul 13 16:46:21 2009 +0930 @@ -1,5 +1,6 @@ module grid_layer; +// TODO fix imports import icanvas; import tk.geometry; import cairo.Context; diff -r 9e63308b749c -r c643c04e3f5e gui.d --- a/gui.d Mon Jul 13 16:16:17 2009 +0930 +++ b/gui.d Mon Jul 13 16:46:21 2009 +0930 @@ -18,6 +18,7 @@ Tool[] tools; tools ~= new PanTool; tools ~= new ZoomTool; + tools ~= new LassoTool; auto tool_layer = new ToolLayer(tools, "Tools"); Layer[] layers; layers ~= new PageLayer("Page"); diff -r 9e63308b749c -r c643c04e3f5e icanvas.d --- a/icanvas.d Mon Jul 13 16:16:17 2009 +0930 +++ b/icanvas.d Mon Jul 13 16:46:21 2009 +0930 @@ -7,8 +7,9 @@ interface Viewport { void rel_zoom(Point pixel_datum, double factor); void rel_pan(Vector pixel_displacement); - //void damage(Rectangle area); + void damage_model(Rectangle area); // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only + // FIXME not sure about these: double zoom() const; Point model_to_pixel(Point model) const; Point pixel_to_model(Point pixel) const; diff -r 9e63308b749c -r c643c04e3f5e page_layer.d --- a/page_layer.d Mon Jul 13 16:16:17 2009 +0930 +++ b/page_layer.d Mon Jul 13 16:46:21 2009 +0930 @@ -1,5 +1,12 @@ -import icanvas; -import cairo_support; +module page_layer; + +private { + import cairo_support; +} + +public { + import icanvas; +} interface Page { } diff -r 9e63308b749c -r c643c04e3f5e standard_tools.d --- a/standard_tools.d Mon Jul 13 16:16:17 2009 +0930 +++ b/standard_tools.d Mon Jul 13 16:46:21 2009 +0930 @@ -6,12 +6,13 @@ private { import std.math; + import std.stdio; } final class PanTool : Tool { - bool handle_button_press(Viewport viewport, in ButtonEvent event) { + override bool handle_button_press(Viewport viewport, in ButtonEvent event) { if (event.button_name == ButtonName.MIDDLE) { - mLastPosition = event.screen_point; + mLastPosition = event.pixel_point; return true; } else { @@ -19,14 +20,14 @@ } } - bool handle_button_release(Viewport viewport, in ButtonEvent event) { + override bool handle_button_release(Viewport viewport, in ButtonEvent event) { return true; } - bool handle_motion(Viewport viewport, in MotionEvent event) { + override bool handle_motion(Viewport viewport, in MotionEvent event) { if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) { - viewport.rel_pan(mLastPosition - event.screen_point); - mLastPosition = event.screen_point; + viewport.rel_pan(mLastPosition - event.pixel_point); + mLastPosition = event.pixel_point; return true; } @@ -35,7 +36,7 @@ } } - bool handle_scroll(Viewport viewport, in ScrollEvent event) { + override bool handle_scroll(Viewport viewport, in ScrollEvent event) { if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) { Vector delta; @@ -60,11 +61,11 @@ return true; } - bool handle_key_press(Viewport viewport, in KeyEvent event) { + override bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; } - bool handle_key_release(Viewport viewport, in KeyEvent event) { + override bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; } @@ -75,26 +76,26 @@ } final class ZoomTool : Tool { - bool handle_button_press(Viewport viewport, in ButtonEvent event) { + override bool handle_button_press(Viewport viewport, in ButtonEvent event) { return false; } - bool handle_button_release(Viewport viewport, in ButtonEvent event) { + override bool handle_button_release(Viewport viewport, in ButtonEvent event) { return false; } - bool handle_motion(Viewport viewport, in MotionEvent event) { + override bool handle_motion(Viewport viewport, in MotionEvent event) { return false; } - bool handle_scroll(Viewport viewport, in ScrollEvent event) { + override bool handle_scroll(Viewport viewport, in ScrollEvent event) { if (event.mask.is_set(Modifier.CONTROL)) { if (event.scroll_direction == ScrollDirection.DOWN) { - viewport.rel_zoom(event.screen_point(), 1.0 / ZOOM); + viewport.rel_zoom(event.pixel_point, 1.0 / ZOOM); return true; } else if (event.scroll_direction == ScrollDirection.UP) { - viewport.rel_zoom(event.screen_point(), ZOOM); + viewport.rel_zoom(event.pixel_point, ZOOM); return true; } else { @@ -106,11 +107,11 @@ } } - bool handle_key_press(Viewport viewport, in KeyEvent event) { + override bool handle_key_press(Viewport viewport, in KeyEvent event) { return false; } - bool handle_key_release(Viewport viewport, in KeyEvent event) { + override bool handle_key_release(Viewport viewport, in KeyEvent event) { return false; } @@ -118,3 +119,53 @@ static invariant double ZOOM = sqrt(2.0); } } + +final class LassoTool : Tool { + override bool handle_button_press(Viewport viewport, in ButtonEvent event) { + if (event.button_name == ButtonName.LEFT) { + writefln("Start lasso"); + mActive = true; + mAnchorPoint = event.pixel_point; + return true; + } + else { + return false; + } + } + + override bool handle_button_release(Viewport viewport, in ButtonEvent event) { + if (event.button_name == ButtonName.LEFT && mActive) { + writefln("End lasso"); + mActive = false; + return true; + } + else { + return false; + } + } + + override bool handle_motion(Viewport viewport, in MotionEvent event) { + if (mActive) { + writefln("lassooing"); + } + + return false; + } + + override bool handle_scroll(Viewport viewport, in ScrollEvent event) { + return false; + } + + override bool handle_key_press(Viewport viewport, in KeyEvent event) { + return false; + } + + override bool handle_key_release(Viewport viewport, in KeyEvent event) { + return false; + } + + private { + bool mActive; + Point mAnchorPoint; // Pixel + } +} diff -r 9e63308b749c -r c643c04e3f5e tk/events.d --- a/tk/events.d Mon Jul 13 16:16:17 2009 +0930 +++ b/tk/events.d Mon Jul 13 16:46:21 2009 +0930 @@ -46,17 +46,17 @@ } abstract class PointerEvent : Event { - this(in Point screen_point, in Point model_point, in Mask mask) { + this(in Point pixel_point, in Point model_point, in Mask mask) { super(mask); - mScreenPoint = screen_point; + mPixelPoint = pixel_point; mModelPoint = model_point; } - Point screen_point() const { return mScreenPoint; } + Point pixel_point() const { return mPixelPoint; } Point model_point() const { return mModelPoint; } private { - Point mScreenPoint; + Point mPixelPoint; Point mModelPoint; } } @@ -64,10 +64,10 @@ final class ButtonEvent : PointerEvent { this(in ButtonAction button_action, in ButtonName button_name, - in Point screen_point, + in Point pixel_point, in Point model_point, in Mask mask) { - super(screen_point, model_point, mask); + super(pixel_point, model_point, mask); mButtonAction = button_action; mButtonName = button_name; } @@ -75,7 +75,7 @@ override string toString() const { return std.string.format("Button event: %s, %s, %s, %s, %s", enumToString(mButtonAction), enumToString(mButtonName), - mScreenPoint, mModelPoint, mMask); + mPixelPoint, mModelPoint, mMask); } ButtonAction button_action() const { return mButtonAction; } @@ -88,30 +88,30 @@ } final class MotionEvent : PointerEvent { - this(in Point screen_point, + this(in Point pixel_point, in Point model_point, in Mask mask) { - super(screen_point, model_point, mask); + super(pixel_point, model_point, mask); } override string toString() const { return std.string.format("Motion event: %s, %s, %s", - mScreenPoint, mModelPoint, mMask); + mPixelPoint, mModelPoint, mMask); } } final class ScrollEvent : PointerEvent { this(in ScrollDirection scroll_direction, - in Point screen_point, + in Point pixel_point, in Point model_point, in Mask mask) { - super(screen_point, model_point, mask); + super(pixel_point, model_point, mask); mScrollDirection = scroll_direction; } override string toString() const { return std.string.format("Scroll event: %s, %s, %s, %s", - enumToString(mScrollDirection), mScreenPoint, mModelPoint, mMask); + enumToString(mScrollDirection), mPixelPoint, mModelPoint, mMask); } ScrollDirection scroll_direction() const { return mScrollDirection; } diff -r 9e63308b749c -r c643c04e3f5e tk/geometry.d --- a/tk/geometry.d Mon Jul 13 16:16:17 2009 +0930 +++ b/tk/geometry.d Mon Jul 13 16:46:21 2009 +0930 @@ -198,6 +198,15 @@ return Rectangle(new_position, _size); } + void get_quantised(out int x, out int y, out int w, out int h) const { + x = cast(int)floor(_position.x); + y = cast(int)floor(_position.y); + w = cast(int)ceil(_position.x + _size.x) - x; + h = cast(int)ceil(_position.y + _size.y) - y; + } + + // + Point centre() const { return _position + _size / 2.0; } diff -r 9e63308b749c -r c643c04e3f5e tool.d --- a/tool.d Mon Jul 13 16:16:17 2009 +0930 +++ b/tool.d Mon Jul 13 16:46:21 2009 +0930 @@ -1,6 +1,7 @@ module tool; public { + import cairo_support; import icanvas; import tk.events; } @@ -15,6 +16,13 @@ abstract class Tool { /* + enum Response { + START, CONTINUE, FINISH + + } + */ + + /* abstract bool is_sticky(); abstract bool is_replaceable(); */ @@ -24,7 +32,8 @@ abstract void stop(IToolStack tool_stack); */ - //void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const; + void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const { + } bool handle_button_press(Viewport viewport, in ButtonEvent event); bool handle_button_release(Viewport viewport, in ButtonEvent event); diff -r 9e63308b749c -r c643c04e3f5e tool_layer.d --- a/tool_layer.d Mon Jul 13 16:16:17 2009 +0930 +++ b/tool_layer.d Mon Jul 13 16:46:21 2009 +0930 @@ -61,7 +61,7 @@ } override bool handle_motion(Viewport viewport, in MotionEvent event) { - writefln("%s", event); + //writefln("%s", event); if (mGrabbedTool is null) { foreach_reverse(ref tool; mTools) {