Mercurial > projects > doodle
view standard_tools.d @ 18:df8d81d9f499
Lasso fiddling
author | David Bryant <daveb@acres.com.au> |
---|---|
date | Mon, 13 Jul 2009 17:08:32 +0930 |
parents | c643c04e3f5e |
children | 22abbf4cde96 |
line wrap: on
line source
module standard_tools; public { import tool; } private { import cairo_support; import std.math; import std.stdio; } final class PanTool : Tool { override bool handle_button_press(Viewport viewport, in ButtonEvent event) { if (event.button_name == ButtonName.MIDDLE) { mLastPosition = event.pixel_point; return true; } else { return false; } } override bool handle_motion(Viewport viewport, in MotionEvent event) { if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) { viewport.rel_pan(mLastPosition - event.pixel_point); mLastPosition = event.pixel_point; return true; } else { return false; } } override bool handle_scroll(Viewport viewport, in ScrollEvent event) { if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) { Vector delta; switch (event.scroll_direction) { case ScrollDirection.UP: delta = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT); break; case ScrollDirection.DOWN: delta = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT); break; case ScrollDirection.LEFT: delta = Vector(-AMOUNT, 0.0); break; case ScrollDirection.RIGHT: delta = Vector(AMOUNT, 0.0); break; } viewport.rel_pan(delta); } return true; } private { Point mLastPosition; static invariant double AMOUNT = 60.0; } } final class ZoomTool : Tool { 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.pixel_point, 1.0 / ZOOM); return true; } else if (event.scroll_direction == ScrollDirection.UP) { viewport.rel_zoom(event.pixel_point, ZOOM); return true; } else { return false; } } else { return false; } } private { 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 = mCurrentPoint = 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; viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint)); return true; } else { return false; } } // FIXME account for the line width... override bool handle_motion(Viewport viewport, in MotionEvent event) { if (mActive) { viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint)); mCurrentPoint = event.pixel_point; viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint)); } return false; } override void draw(const Viewport viewport, in Rectangle damage, Context model_cr, Context pixel_cr) const { if (mActive) { pixel_cr.save; { pixel_cr.setSourceRgba(1.0, 0.0, 0.0, 1.0); //writefln("Drawing rectangle: %s", Rectangle(mCurrentPoint, mAnchorPoint)); rectangle(pixel_cr, Rectangle(mCurrentPoint, mAnchorPoint)); pixel_cr.stroke; } pixel_cr.restore; } } private { bool mActive; Point mCurrentPoint; Point mAnchorPoint; // Pixel } }