view doodle/dia/icanvas.d @ 34:c2f11e1d7470

Geometry cleanup and checkpoint.
author David Bryant <bagnose@gmail.com>
date Sun, 30 Aug 2009 15:32:12 +0930
parents 1754cb773d41
children 3f6bb0bb22dc
line wrap: on
line source

module doodle.dia.icanvas;

public {
    import doodle.tk.geometry;
    import doodle.tk.events;
    import cairo.Context;
}

private {
    import std.typecons;
}

mixin(defineEnum!("Cursor",
                  "DEFAULT", "HAND", "CROSSHAIR"));

interface Viewport {
    void zoom_relative(in Point pixel_datum, in double factor);
    void pan_relative(in Vector pixel_displacement);
    void set_cursor(in Cursor cursor);

    // FIXME get rid of these and accumulate damage during event handling
    void damage_model(in Rectangle area);      // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only
    void damage_pixel(in Rectangle area);      // FIXME as above

    /*
    // FIXME not sure about these:
    double zoom() const;
    Point model_to_pixel(in Point model) const;
    Point pixel_to_model(in Point pixel) const;
    Vector model_to_pixel(in Vector model) const;
    Vector pixel_to_model(in Vector pixel) const;
    Rectangle model_to_pixel(in Rectangle model) const;
    Rectangle pixel_to_model(in Rectangle model) const;
    double model_to_pixel(in double model) const;
    double pixel_to_model(in double pixel) const;
    */
}

interface EventHandler {
    bool handle_button_press(scope Viewport viewport, in ButtonEvent event);
    bool handle_button_release(scope Viewport viewport, in ButtonEvent event);
    bool handle_motion(scope Viewport viewport, in MotionEvent event);
    bool handle_scroll(scope Viewport viewport, in ScrollEvent event);
    //bool handle_enter(scope Viewport viewport, CrossingEvent event);
    //bool handle_leave(scope Viewport viewport, CrossingEvent event);
    //bool handle_focus_in(scope Viewport viewport, FocusEvent event);
    //bool handle_focus_out(scope Viewport viewport, FocusEvent event);
    bool handle_key_press(scope Viewport viewport, in KeyEvent event);
    bool handle_key_release(scope Viewport viewport, in KeyEvent event);
}

abstract class Layer {
    this(in string name) {
        mName = name;
    }

    string name() const { return mName; }

    Rectangle bounds() const;
    //void zoom_changed
    void draw(in Viewport viewport,
              in Rectangle pixel_damage, scope Context pixel_cr,
              in Rectangle model_damage, scope Context model_cr) const;

    private {
        invariant string mName;
    }
}