Mercurial > projects > doodle
view standard_tools.d @ 8:bf7903435f58
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sat, 11 Jul 2009 21:49:04 +0930 |
parents | 936feb16eed4 |
children | 66b47e122b31 |
line wrap: on
line source
module standard_tools; import tool; import icanvas; import tk.types; import tk.events; import tk.geometry; import std.math; final class PanTool : Tool { bool handle_button_press(ICanvas canvas, in ButtonEvent event) { if (event.button_name == ButtonName.MIDDLE) { mLastPosition = event.screen_point; return true; } else { return false; } } bool handle_button_release(ICanvas canvas, in ButtonEvent event) { return true; } bool handle_motion(ICanvas canvas, in MotionEvent event) { if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) { canvas.rel_pan(mLastPosition - event.screen_point); mLastPosition = event.screen_point; return true; } else { return false; } } bool handle_scroll(ICanvas canvas, in ScrollEvent event) { if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) { const double AMOUNT = 60.0; Vector v; switch (event.scroll_direction) { case ScrollDirection.UP: v = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT); break; case ScrollDirection.DOWN: v = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT); break; case ScrollDirection.LEFT: v = Vector(-AMOUNT, 0.0); break; case ScrollDirection.RIGHT: v = Vector(AMOUNT, 0.0); break; } canvas.rel_pan(v); } return true; } bool handle_key_press(ICanvas canvas, in KeyEvent event) { return false; } bool handle_key_release(ICanvas canvas, in KeyEvent event) { return false; } private { Point mLastPosition; } } final class ZoomTool : Tool { static invariant double ZOOM = sqrt(2.0); bool handle_button_press(ICanvas canvas, in ButtonEvent event) { return false; } bool handle_button_release(ICanvas canvas, in ButtonEvent event) { return false; } bool handle_motion(ICanvas canvas, in MotionEvent event) { return false; } bool handle_scroll(ICanvas canvas, in ScrollEvent event) { if (event.mask.is_set(Modifier.CONTROL)) { // Zoom about the pointer double zoom = 1.44; if (event.scroll_direction == ScrollDirection.DOWN) { zoom = 1.0 / zoom; } canvas.rel_zoom(event.screen_point(), zoom); return true; } else { return false; } } bool handle_key_press(ICanvas canvas, in KeyEvent event) { return false; } bool handle_key_release(ICanvas canvas, in KeyEvent event) { return false; } }