Mercurial > projects > doodle
view doodle/fig/select_tool.d @ 80:b759414d2b72
Switched from cairo to Drawable abstraction
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 15 Aug 2010 23:43:04 +0930 |
parents | 535bae7a7305 |
children | d92b9f04b1e8 |
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.screenPoint; 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.damageScreen(growCentre(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH)); viewport.setCursor(Cursor.DEFAULT); return true; } else { return false; } } override bool handleMotion(scope IViewport viewport, in MotionEvent event) { if (_active) { viewport.damageScreen(growCentre(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH)); _currentPoint = event.screenPoint; viewport.damageScreen(growCentre(Rectangle(_anchorPoint, _currentPoint), LINE_WIDTH)); } return false; } override void draw(in Rectangle screenDamage, scope Drawable screenDrawable) const { if (_active) { /* screenCr.save; { screenCr.setSourceRgba(0.0, 0.0, 0.8, 0.3); rectangle(screenCr, Rectangle(_currentPoint, _anchorPoint)); screenCr.fill(); } screenCr.restore(); */ screenDrawable.pushState; { screenDrawable.setLineWidth(LINE_WIDTH); screenDrawable.setColor(Color(0.0, 0.0, 0.5, 1.0)); screenDrawable.drawRectangle(Rectangle(_currentPoint, _anchorPoint), false); } screenDrawable.popState; /* screenCr.save(); { double[] dashes = [ 4.0, 4.0 ]; screenCr.setDash(dashes, 0.0); screenCr.setSourceRgba(0.0, 0.0, 0.5, 1.0); screenCr.setLineWidth(LINE_WIDTH); rectangle(screenCr, Rectangle(_currentPoint, _anchorPoint)); screenCr.stroke; } screenCr.restore; */ } } private { bool _active; Point _currentPoint; Point _anchorPoint; // Pixel static immutable double LINE_WIDTH = 1.0; } }