Mercurial > projects > doodle
diff doodle/fig/select_tool.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 | |
children | 43cc2135ced0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/fig/select_tool.d Thu Aug 12 16:35:24 2010 +0930 @@ -0,0 +1,78 @@ +module doodle.fig.select_tool; + +public { + import doodle.dia.tool; +} + +private { + import doodle.cairo.routines; +} + +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; + } +}