view standard_tools.d @ 16:9e63308b749c

* Fix up public/private includes * Make Mask a struct
author David Bryant <daveb@acres.com.au>
date Mon, 13 Jul 2009 16:16:17 +0930
parents 0b7e7d43a79d
children c643c04e3f5e
line wrap: on
line source

module standard_tools;

public {
    import tool;
}

private {
    import std.math;
}

final class PanTool : Tool {
    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
        if (event.button_name == ButtonName.MIDDLE) {
            mLastPosition = event.screen_point;
            return true;
        }
        else {
            return false;
        }
    }

    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
        return true;
    }

    bool handle_motion(Viewport viewport, in MotionEvent event) {
        if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
            viewport.rel_pan(mLastPosition - event.screen_point);
            mLastPosition = event.screen_point;

            return true;
        }
        else {
            return false;
        }
    }

    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
        if (event.mask.is_unset(Modifier.MIDDLE_BUTTON)) {
            Vector delta;

            switch (event.scroll_direction) {
            case ScrollDirection.UP:
                delta = event.mask.is_set(Modifier.SHIFT) ? Vector(AMOUNT, 0.0) : Vector(0.0, AMOUNT);
                break;
            case ScrollDirection.DOWN:
                delta = event.mask.is_set(Modifier.SHIFT) ? Vector(-AMOUNT, 0.0) : Vector(0.0, -AMOUNT);
                break;
            case ScrollDirection.LEFT:
                delta = Vector(-AMOUNT, 0.0);
                break;
            case ScrollDirection.RIGHT:
                delta = Vector(AMOUNT, 0.0);
                break;
            }

            viewport.rel_pan(delta);
        }

        return true;
    }

    bool handle_key_press(Viewport viewport, in KeyEvent event) {
        return false;
    }

    bool handle_key_release(Viewport viewport, in KeyEvent event) {
        return false;
    }

    private {
        Point mLastPosition;
        static invariant double AMOUNT = 60.0;
    }
}

final class ZoomTool : Tool {
    bool handle_button_press(Viewport viewport, in ButtonEvent event) {
        return false;
    }

    bool handle_button_release(Viewport viewport, in ButtonEvent event) {
        return false;
    }

    bool handle_motion(Viewport viewport, in MotionEvent event) {
        return false;
    }

    bool handle_scroll(Viewport viewport, in ScrollEvent event) {
        if (event.mask.is_set(Modifier.CONTROL)) {
            if (event.scroll_direction == ScrollDirection.DOWN) {
                viewport.rel_zoom(event.screen_point(), 1.0 / ZOOM);
                return true;
            }
            else if (event.scroll_direction == ScrollDirection.UP) {
                viewport.rel_zoom(event.screen_point(), ZOOM);
                return true;
            }
            else {
                return false;
            }
        }
        else {
            return false;
        }
    }

    bool handle_key_press(Viewport viewport, in KeyEvent event) {
        return false;
    }

    bool handle_key_release(Viewport viewport, in KeyEvent event) {
        return false;
    }

    private {
        static invariant double ZOOM = sqrt(2.0);
    }
}