view standard_tools.d @ 14:0b7e7d43a79d

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 12 Jul 2009 01:23:32 +0930
parents f0ade1b49fe7
children 9e63308b749c
line wrap: on
line source

module standard_tools;

import tool;
import icanvas;
import tk.types;
import tk.events;
import tk.geometry;
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);
    }
}