view doodle/dia/standard_tools.d @ 92:a98116479793

Removed GL support. Improved grid.
author daveb
date Fri, 20 Aug 2010 18:34:32 +0930
parents b759414d2b72
children
line wrap: on
line source

module doodle.dia.standard_tools;

public {
    import doodle.dia.tool;
}

private {
    import gdk.Keysyms;
}

final class PanTool : Tool {
    this() {
        super("Pan");
    }

    override bool handleButtonPress(scope IViewport viewport, in ButtonEvent event) {
        if (event.buttonName == ButtonName.MIDDLE) {
            mLastPosition = event.screenPoint;
            return true;
        }
        else {
            return false;
        }
    }

    override bool handleMotion(scope IViewport viewport, in MotionEvent event) {
        if (event.mask.isSet(Modifier.MIDDLE_BUTTON)) {
            viewport.panRelative(mLastPosition - event.screenPoint);
            mLastPosition = event.screenPoint;

            return true;
        }
        else {
            return false;
        }
    }

    override bool handleScroll(scope IViewport viewport, in ScrollEvent event) {
        if (event.mask.isUnset(Modifier.MIDDLE_BUTTON)) {
            Vector delta;

            switch (event.scrollDirection) {
            case ScrollDirection.UP:
                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(-SCROLL_AMOUNT, 0.0) : Vector(0.0, SCROLL_AMOUNT);
                break;
            case ScrollDirection.DOWN:
                delta = event.mask.isSet(Modifier.SHIFT) ? Vector(SCROLL_AMOUNT, 0.0) : Vector(0.0, -SCROLL_AMOUNT);
                break;
            case ScrollDirection.LEFT:
                delta = Vector(-SCROLL_AMOUNT, 0.0);
                break;
            case ScrollDirection.RIGHT:
                delta = Vector(SCROLL_AMOUNT, 0.0);
                break;
            default:
                assert(0);
            }

            viewport.panRelative(delta);
        }

        return true;
    }

    override bool handleKeyPress(scope IViewport viewport, in KeyEvent event) {
        // Respond to arrow keys and pg-up/pg-down

        switch (event.value) {
        case GdkKeysyms.GDK_Up:
            viewport.panRelative(Vector(0.0, ARROW_AMOUNT));
            return true;
        case GdkKeysyms.GDK_Right:
            viewport.panRelative(Vector(ARROW_AMOUNT, 0.0));
            return true;
        case GdkKeysyms.GDK_Left:
            viewport.panRelative(Vector(-ARROW_AMOUNT, 0.0));
            return true;
        case GdkKeysyms.GDK_Down:
            viewport.panRelative(Vector(0.0, -ARROW_AMOUNT));
            return true;
        case GdkKeysyms.GDK_Page_Up:
            viewport.panRelative(Vector(0.0, PAGE_AMOUNT));
            return true;
        case GdkKeysyms.GDK_Page_Down:
            viewport.panRelative(Vector(0.0, -PAGE_AMOUNT));
            return true;
        default:
            // Just a key we don't handle
            return false;
        }
    }

    private {
        Point mLastPosition;
        static immutable SCROLL_AMOUNT = 60.0;
        static immutable ARROW_AMOUNT = 30.0;
        static immutable PAGE_AMOUNT = 240.0;
    }
}

final class ZoomTool : Tool {
    this() {
        super("Zoom");
    }

    override bool handleScroll(scope IViewport viewport, in ScrollEvent event) {
        if (event.mask.isSet(Modifier.CONTROL)) {
            if (event.scrollDirection == ScrollDirection.DOWN) {
                viewport.zoomRelative(1.0 / ZOOM_FACTOR, event.screenPoint);
                return true;
            }
            else if (event.scrollDirection == ScrollDirection.UP) {
                viewport.zoomRelative(ZOOM_FACTOR, event.screenPoint);
                return true;
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }

    private {
        static immutable ZOOM_FACTOR = 2^^0.5;
    }
}