Mercurial > projects > doodle
diff doodle/dia/standard_tools.d @ 63:20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
author | daveb |
---|---|
date | Thu, 12 Aug 2010 16:35:24 +0930 |
parents | c63719604adb |
children | eb5436b47d13 |
line wrap: on
line diff
--- a/doodle/dia/standard_tools.d Thu Aug 12 11:48:55 2010 +0930 +++ b/doodle/dia/standard_tools.d Thu Aug 12 16:35:24 2010 +0930 @@ -5,9 +5,7 @@ } private { - import doodle.cairo.routines; - import std.math; - import std.stdio; + import gdk.Keysyms; } final class PanTool : Tool { @@ -43,16 +41,16 @@ switch (event.scrollDirection) { case ScrollDirection.UP: - delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, AMOUNT); + delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-SCROLL_AMOUNT, 0.0) : Vector(0.0, SCROLL_AMOUNT); break; case ScrollDirection.DOWN: - delta = event.mask.isSet(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, -AMOUNT); + delta = event.mask.isSet(Modifier.SHIFT) ? Vector(SCROLL_AMOUNT, 0.0) : Vector(0.0, -SCROLL_AMOUNT); break; case ScrollDirection.LEFT: - delta = Vector(-AMOUNT, 0.0); + delta = Vector(-SCROLL_AMOUNT, 0.0); break; case ScrollDirection.RIGHT: - delta = Vector(AMOUNT, 0.0); + delta = Vector(SCROLL_AMOUNT, 0.0); break; default: assert(0); @@ -64,9 +62,39 @@ return true; } + override bool handleKeyPress(scope IViewport viewport, in KeyEvent event) { + // Respond to arrow keys and pg-up/pg-down + + switch (event.value) { + case GdkKeysyms.GDK_Up: + viewport.panRelative(Vector(0.0, ARROW_AMOUNT)); + return true; + case GdkKeysyms.GDK_Right: + viewport.panRelative(Vector(ARROW_AMOUNT, 0.0)); + return true; + case GdkKeysyms.GDK_Left: + viewport.panRelative(Vector(-ARROW_AMOUNT, 0.0)); + return true; + case GdkKeysyms.GDK_Down: + viewport.panRelative(Vector(0.0, -ARROW_AMOUNT)); + return true; + case GdkKeysyms.GDK_Page_Up: + viewport.panRelative(Vector(0.0, PAGE_AMOUNT)); + return true; + case GdkKeysyms.GDK_Page_Down: + viewport.panRelative(Vector(0.0, -PAGE_AMOUNT)); + return true; + default: + // Just a key we don't handle + return false; + } + } + private { Point mLastPosition; - static immutable double AMOUNT = 60.0; + static immutable SCROLL_AMOUNT = 60.0; + static immutable ARROW_AMOUNT = 30.0; + static immutable PAGE_AMOUNT = 240.0; } } @@ -95,75 +123,6 @@ } private { - static immutable double ZOOM = sqrt(2.0); + static immutable double ZOOM = 2^^0.5; } } - -final class SelectTool : Tool { - this() { - super("Select"); - } - - override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) { - if (event.buttonName == ButtonName.LEFT) { - _active = true; - _anchorPoint = _currentPoint = event.pixelPoint; - viewport.setCursor(Cursor.HAND); - return true; - } - else { - return false; - } - } - - override bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event) { - if (event.buttonName == ButtonName.LEFT && _active) { - _active = false; - viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0)); - viewport.setCursor(Cursor.DEFAULT); - return true; - } - else { - return false; - } - } - - override bool handleMotion(scope IViewport viewport, in MotionEvent event) { - if (_active) { - viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0)); - _currentPoint = event.pixelPoint; - viewport.damagePixel(feather(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH / 2.0)); - } - - return false; - } - - override void draw(in IViewport viewport, - in Rectangle pixelDamage, scope Context pixelCr) const { - if (_active) { - /* - pixelCr.save; { - pixelCr.setSourceRgba(0.0, 0.0, 0.8, 0.3); - rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint)); - pixelCr.fill(); - } pixelCr.restore(); - */ - - pixelCr.save(); { - double[] dashes = [ 4.0, 4.0 ]; - pixelCr.setDash(dashes, 0.0); - pixelCr.setSourceRgba(0.0, 0.0, 0.5, 1.0); - pixelCr.setLineWidth(LINE_WIDTH); - rectangle(pixelCr, Rectangle(_currentPoint, _anchorPoint)); - pixelCr.stroke; - } pixelCr.restore; - } - } - - private { - bool _active; - Point _currentPoint; - Point _anchorPoint; // Pixel - static immutable double LINE_WIDTH = 1.0; - } -}