Mercurial > projects > doodle
view doodle/fig/select_tool.d @ 74:c03ed75c0f8e
Icky
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 15 Aug 2010 01:11:58 +0930 |
parents | 6f2525e170f2 |
children | 15ca7d5cd1ed |
line wrap: on
line source
module doodle.fig.select_tool; public { import doodle.dia.tool; } private { import doodle.tk.cairo; } 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 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; } }