view standard_tools.d @ 8:bf7903435f58

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sat, 11 Jul 2009 21:49:04 +0930
parents 936feb16eed4
children 66b47e122b31
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(ICanvas canvas, in ButtonEvent event) {
        if (event.button_name == ButtonName.MIDDLE) {
            mLastPosition = event.screen_point;
            return true;
        }
        else {
            return false;
        }
    }

    bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
        return true;
    }

    bool handle_motion(ICanvas canvas, in MotionEvent event) {
        if (event.mask.is_set(Modifier.BUTTON_MIDDLE)) {
            canvas.rel_pan(mLastPosition - event.screen_point);
            mLastPosition = event.screen_point;

            return true;
        }
        else {
            return false;
        }
    }

    bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
        if (event.mask.is_unset(Modifier.BUTTON_MIDDLE)) {
            const double AMOUNT = 60.0;
            Vector v;

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

            canvas.rel_pan(v);
        }

        return true;
    }

    bool handle_key_press(ICanvas canvas, in KeyEvent event) {
        return false;
    }

    bool handle_key_release(ICanvas canvas, in KeyEvent event) {
        return false;
    }

    private {
        Point mLastPosition;
    }
}

final class ZoomTool : Tool {
    static invariant double ZOOM = sqrt(2.0);

    bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
        return false;
    }

    bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
        return false;
    }

    bool handle_motion(ICanvas canvas, in MotionEvent event) {
        return false;
    }

    bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
        if (event.mask.is_set(Modifier.CONTROL)) {
            // Zoom about the pointer
            double zoom = 1.44;

            if (event.scroll_direction == ScrollDirection.DOWN) {
                zoom = 1.0 / zoom;
            }

            canvas.rel_zoom(event.screen_point(), zoom);

            return true;
        }
        else {
            return false;
        }
    }

    bool handle_key_press(ICanvas canvas, in KeyEvent event) {
        return false;
    }

    bool handle_key_release(ICanvas canvas, in KeyEvent event) {
        return false;
    }
}