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

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

module doodle.dia.grid_layer;

public {
    import doodle.dia.icanvas;
}

private {
    import std.math;
    import std.stdio;
}

private {
    double start(in double value, in double spacing) {
        real r = floor(value / spacing);
        return r * spacing;
    }
}

class GridLayer : Layer, IGrid {
    immutable double MIN_SPACING = 5.0;      // pixels

    this(in string name = "Grid") {
        super(name);
        _zoomValid = false;
    }

    // Layer overrides:

    override Rectangle bounds() const {
        // We don't require any geometry
        return Rectangle();
    }

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

        auto z = screenModel.zoom;

        modelRenderer.pushState; {
            modelRenderer.setColor(Color(0.0, 0.0, 0.0, 0.3));
            modelRenderer.setLineWidth(1 / z);

            auto x = start(modelDamage.corner0.x, _spacing);

            for (;;) {
                modelRenderer.drawVLine(x, modelDamage.corner0.y, modelDamage.corner1.y);
                x += _spacing;
                if (x > modelDamage.corner1.x) break;
            }

            auto y = start(modelDamage.corner0.y, _spacing);

            for (;;) {
                modelRenderer.drawHLine(y, modelDamage.corner0.x, modelDamage.corner1.x);
                y += _spacing;
                if (y > modelDamage.corner1.y) break;
            }
        } modelRenderer.popState;
    }

    // IGrid overrides:

    override void zoomChanged(double zoom) {
        _zoom = zoom;
        _zoomValid = true;

        // FIXME compute spacing properly
        _spacing = 20.0 / _zoom;        // mm
    }

    // FIXME use inout parameter?
    override bool snap(in Point a, out Point b) const {
        b = a;
        return false;
    }

    private {
        bool _zoomValid;
        double _zoom;           // pixels per millimetre

        double _spacing;        // model spacing
    }
}