view 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 source

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