view dia/icanvas.d @ 27:f3d91579bb28

Checkpoint
author David Bryant <daveb@acres.com.au>
date Wed, 29 Jul 2009 14:11:35 +0930
parents 06c30d250c0a
children
line wrap: on
line source

module dia.icanvas;

public {
    import tk.geometry;
    import 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);
    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;
    }
}