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;
    }
}