Mercurial > projects > doodle
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 } }