view doodle/dia/icanvas.d @ 91:42766e14534e

Update screenViewBounds when the window is resized
author daveb
date Thu, 19 Aug 2010 18:28:18 +0930
parents 467febed7367
children a98116479793
line wrap: on
line source

module doodle.dia.icanvas;

public {
    import doodle.tk.geometry;
    import doodle.tk.events;
    import doodle.tk.renderer;
    import doodle.tk.screen_model;
}

private {
    import std.typecons;
}

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

interface IViewport2 {
    void damageModel(in Rectangle area);
    void damageScreen(in Rectangle area);
}

interface IViewport : IViewport2 {
    void zoomRelative(in Point screenDatum, in double factor);      // FIXME reorder arguments
    void panRelative(in Vector screenDisplacement);
    void setCursor(in Cursor cursor);
}

/*
final class Damage {
    void increase(in Rectangle additional) { _rectangle = _rectangle | additional; }
    Rectangle rectangle() const { return _rectangle; }
    private Rectangle _rectangle;
}
*/

interface IEventHandler {
    bool handleButtonPress(scope IViewport viewport, in ButtonEvent event);
    bool handleButtonRelease(scope IViewport viewport, in ButtonEvent event);
    bool handleMotion(scope IViewport viewport, in MotionEvent event);
    bool handleScroll(scope IViewport viewport, in ScrollEvent event);
    bool handleEnter(scope IViewport viewport, CrossingEvent event);
    bool handleLeave(scope IViewport viewport, CrossingEvent event);
    bool handleKeyPress(scope IViewport viewport, in KeyEvent event);
    bool handleKeyRelease(scope IViewport viewport, in KeyEvent event);

    // XXX Still not sure about these:
    //bool handleFocusIn(scope IViewport viewport, FocusEvent event);
    //bool handleFocusOut(scope IViewport viewport, FocusEvent event);
}

interface IGrid {
    void zoomChanged(double zoom);

    // TODO  inout?
    bool snap(in Point a, out Point b) const;               // XXX remove this and add it to Layer
}

interface IPage {
    // TODO
}

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

    string name() const { return _name; }

    Rectangle bounds() const;

    void draw(in Rectangle screenDamage, scope Renderer screenRenderer,
              in Rectangle modelDamage, scope Renderer modelRenderer,
              in ScreenModel screenModel) const;

    private {
        immutable string _name;
    }
}