Mercurial > projects > doodle
view doodle/dia/grid_layer.d @ 89:467febed7367
* Ignore excre
* Some tentative work in grid_layer.d
* Give the ScreenModel to all the layers. This needs refinement.
* A stroke wouldn't hurt occasionally in cairo_renderer.d
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Thu, 19 Aug 2010 00:19:42 +0930 |
parents | cdd4fc728d94 |
children | 885914257e0e |
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; // Is _zoom like screenModel.zoom ? modelRenderer.pushState; { modelRenderer.setColor(Color(0.0, 0.0, 0.0, 0.3)); auto x = start(modelDamage.corner0.x, _spacing); for (;;) { writefln("Doing something %s", x); modelRenderer.drawVLine(x, modelDamage.corner0.y, modelDamage.corner1.y); x += _spacing; if (x > modelDamage.corner1.x) break; } } modelRenderer.popState; /+ modelCr.save(); { modelCr.setSourceRgba(0.0, 0.0, 0.0, 0.3); modelCr.setLineWidth(0.5); { // vertical grid lines double x = start(modelDamage.corner0.x, _spacing); for (;;) { vline(modelCr, x, modelDamage.corner0.y, modelDamage.corner1.y); // Ensure 1 pixel wide FIXME is this naughty? We are sneaking // through cairo to mix model and pixel coordinates... modelCr.save(); { modelCr.scale(1.0 / z, 1.0 / z); modelCr.stroke(); } modelCr.restore(); if (x > modelDamage.corner1.x) { break; } x += _spacing; } } { // horizontal grid lines double y = start(modelDamage.corner0.y, _spacing); for (;;) { hline(modelCr, y, modelDamage.corner0.x, modelDamage.corner1.x); // FIXME? modelCr.save(); { modelCr.scale(1.0 / xx, 1.0 / yy); modelCr.stroke(); } modelCr.restore(); if (y > modelDamage.corner1.y) { break; } y += _spacing; } } } modelCr.restore(); +/ } // 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 } }