# HG changeset patch # User "David Bryant " # Date 1281882867 -34200 # Node ID d92b9f04b1e8e3fe7ebb001697a8254865b4b5d5 # Parent b759414d2b722f983cae5ed31a64691301cbccc4 Bed time diff -r b759414d2b72 -r d92b9f04b1e8 doodle/dia/grid_layer.d --- a/doodle/dia/grid_layer.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/dia/grid_layer.d Mon Aug 16 00:04:27 2010 +0930 @@ -5,9 +5,7 @@ } private { - import doodle.tk.cairo; import std.math; - import std.stdio; } private { diff -r b759414d2b72 -r d92b9f04b1e8 doodle/dia/page_layer.d --- a/doodle/dia/page_layer.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/dia/page_layer.d Mon Aug 16 00:04:27 2010 +0930 @@ -5,7 +5,6 @@ } private { - import doodle.tk.cairo; } class PageLayer : Layer, IPage { diff -r b759414d2b72 -r d92b9f04b1e8 doodle/dia/tool_layer.d --- a/doodle/dia/tool_layer.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/dia/tool_layer.d Mon Aug 16 00:04:27 2010 +0930 @@ -5,7 +5,6 @@ } private { - import doodle.tk.cairo; import doodle.core.logging; } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/fig/select_tool.d --- a/doodle/fig/select_tool.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/fig/select_tool.d Mon Aug 16 00:04:27 2010 +0930 @@ -4,10 +4,6 @@ import doodle.dia.tool; } -private { - import doodle.tk.cairo; -} - final class SelectTool : Tool { this() { super("Select"); @@ -49,37 +45,19 @@ override void draw(in Rectangle screenDamage, scope Drawable screenDrawable) const { if (_active) { - /* - screenCr.save; { - screenCr.setSourceRgba(0.0, 0.0, 0.8, 0.3); - rectangle(screenCr, Rectangle(_currentPoint, _anchorPoint)); - screenCr.fill(); - } screenCr.restore(); - */ - screenDrawable.pushState; { + screenDrawable.setLineStyle(Drawable.LineStyle.DASHED); screenDrawable.setLineWidth(LINE_WIDTH); screenDrawable.setColor(Color(0.0, 0.0, 0.5, 1.0)); screenDrawable.drawRectangle(Rectangle(_currentPoint, _anchorPoint), false); } screenDrawable.popState; - - /* - screenCr.save(); { - double[] dashes = [ 4.0, 4.0 ]; - screenCr.setDash(dashes, 0.0); - screenCr.setSourceRgba(0.0, 0.0, 0.5, 1.0); - screenCr.setLineWidth(LINE_WIDTH); - rectangle(screenCr, Rectangle(_currentPoint, _anchorPoint)); - screenCr.stroke; - } screenCr.restore; - */ } } private { bool _active; Point _currentPoint; - Point _anchorPoint; // Pixel + Point _anchorPoint; static immutable double LINE_WIDTH = 1.0; } } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/gtk/cairo.d --- a/doodle/gtk/cairo.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/gtk/cairo.d Mon Aug 16 00:04:27 2010 +0930 @@ -16,13 +16,13 @@ void setLineStyle(LineStyle style) { switch (style) { case LineStyle.SOLID: - _cr.setDash([ 4.0, 4.0 ], 0.0); + _cr.setDash([ ], 0.0); break; case LineStyle.DASHED: _cr.setDash([ 4.0, 4.0 ], 0.0); break; case LineStyle.DOTTED: - _cr.setDash([ 4.0, 4.0 ], 0.0); + _cr.setDash([ 1.0, 4.0 ], 0.0); break; default: assert(0); @@ -39,13 +39,13 @@ void pushState() { _cr.save; } void popState() { _cr.restore; } - void drawRectangle(in Rectangle rectangle, bool fill) { + void drawRectangle(in Rectangle rectangle, bool fill = false) { _cr.rectangle(rectangle.position.x, rectangle.position.y, rectangle.size.x, rectangle.size.y); if (fill) { _cr.fill; } else { _cr.stroke; } } - void drawEllipse(in Rectangle rectangle, bool fill) { + void drawEllipse(in Rectangle rectangle, bool fill = false) { // NYI } @@ -66,7 +66,7 @@ _cr.lineTo(x, y1); } - void drawPoly(in Point[] points, bool fill) { + void drawPoly(in Point[] points, bool fill = false) { assert(points.length >= 2); foreach(i, p; points) { if (i == 0) { _cr.moveTo(p.x, p.y); } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/gtk/canvas.d --- a/doodle/gtk/canvas.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/gtk/canvas.d Mon Aug 16 00:04:27 2010 +0930 @@ -3,17 +3,17 @@ public { import doodle.dia.icanvas; import doodle.gtk.events; - import doodle.gtk.cairo; } private { import doodle.core.logging; - import doodle.tk.pixel_model; - import doodle.tk.cairo; + import doodle.tk.screen_model; import doodle.dia.layer_stack; import doodle.gtk.conversions; + import doodle.gtk.cairo; import cairo.Surface; + import cairo.Context; import gtk.Widget; import gtk.Toolbar; @@ -70,13 +70,13 @@ _drawingArea.addOnRealize(&onRealize); _drawingArea.addOnConfigure(&onConfigure); _drawingArea.addOnExpose(&onExpose); - _drawingArea.addOnButtonPress(&onButtonPress); // FIXME merge delegate with next + _drawingArea.addOnButtonPress(&onButtonPress); _drawingArea.addOnButtonRelease(&onButtonRelease); - _drawingArea.addOnKeyPress(&onKeyPressEvent); // FIXME merge delegate with next + _drawingArea.addOnKeyPress(&onKeyPressEvent); _drawingArea.addOnKeyRelease(&onKeyReleaseEvent); _drawingArea.addOnMotionNotify(&onMotionNotify); _drawingArea.addOnScroll(&onScroll); - _drawingArea.addOnEnterNotify(&onEnterNotify); // FIXME merge delegate with next + _drawingArea.addOnEnterNotify(&onEnterNotify); _drawingArea.addOnLeaveNotify(&onLeaveNotify); _drawingArea.addOnFocusIn(&onFocusIn); @@ -234,7 +234,7 @@ immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y); - rectangle(modelCr, modelDamage); + modelCr.rectangle(modelDamage.x0, modelDamage.y0, modelDamage.w, modelDamage.h); modelCr.clip; } @@ -243,14 +243,14 @@ screenCr.translate(0.0, _screenModel.viewBoundsScreen.h); screenCr.scale(1.0, -1.0); - rectangle(screenCr, screenDamage); + screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); screenCr.clip; } screenCr.save; { // Fill the background with light grey screenCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); - rectangle(screenCr, screenDamage); + screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); screenCr.fill; } screenCr.restore; @@ -368,7 +368,7 @@ immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); // Define these just to obtain the position - // below and we can preserve it + // below so we can preserve it double lower, upper, position, maxSize; _hRuler.getRange(lower, upper, position, maxSize); @@ -437,8 +437,6 @@ double _pixelsPerMillimetre; LayerStack _layerStack; - immutable CursorType[Cursor] _cursors; - // Child widgets: HRuler _hRuler; VRuler _vRuler; @@ -450,5 +448,7 @@ Rectangle _damageScreen; ScreenModel _screenModel; + + immutable CursorType[Cursor] _cursors; } } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/gtk/events.d --- a/doodle/gtk/events.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/gtk/events.d Mon Aug 16 00:04:27 2010 +0930 @@ -6,7 +6,6 @@ private { import doodle.gtk.conversions; - import core.stdc.string : strlen; } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/tk/cairo.d --- a/doodle/tk/cairo.d Sun Aug 15 23:43:04 2010 +0930 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -module doodle.tk.cairo; - -// THIS module is deprecated - -public { - import doodle.tk.geometry; - import cairo.Context; -} - -void rectangle(scope Context cr, in Rectangle rectangle) { - cr.rectangle(rectangle.position.x, rectangle.position.y, - rectangle.size.x, rectangle.size.y); -} - -void line(scope Context cr, in double x0, in double y0, in double x1, in double y1) { - cr.moveTo(x0, y0); - cr.lineTo(x1, y1); -} - -// Horizontal line -void hline(scope Context cr, in double y, double x0, double x1) { - cr.moveTo(x0, y); - cr.lineTo(x1, y); -} - -// Vertical line -void vline(scope Context cr, in double x, double y0, double y1) { - cr.moveTo(x, y0); - cr.lineTo(x, y1); -} diff -r b759414d2b72 -r d92b9f04b1e8 doodle/tk/events.d --- a/doodle/tk/events.d Sun Aug 15 23:43:04 2010 +0930 +++ b/doodle/tk/events.d Mon Aug 16 00:04:27 2010 +0930 @@ -2,7 +2,7 @@ public { import doodle.tk.geometry; - import doodle.tk.pixel_model; + import doodle.tk.screen_model; import gtkc.gdktypes; } diff -r b759414d2b72 -r d92b9f04b1e8 doodle/tk/pixel_model.d --- a/doodle/tk/pixel_model.d Sun Aug 15 23:43:04 2010 +0930 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -module doodle.tk.screen_model; - -public { - import doodle.tk.geometry; -} - -private { - import doodle.core.misc; -} - -// This class manages the relationship between screen space and model space. -// Screen is defined as the current window/viewport into the model -// It provides convenient high-level operations. -// -// x and y run right and up respectively for screen and model space - -class ScreenModel { - this(in double zoom, in Rectangle canvasBoundsModel, in Rectangle viewBoundsScreen) { - _zoom = zoom; - _viewBoundsScreen = viewBoundsScreen; - _canvasBoundsModel = canvasBoundsModel; - - // Choose the centre of the canvas as the centre of the view - _viewCentreModel = _canvasBoundsModel.centre; - } - - void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; } - void canvasAccommodate(in Rectangle bounds) { _canvasBoundsModel = _canvasBoundsModel | bounds; } - - void zoomRelative(in double factor, in Point screenDatum) { - // Work out screen distance from current centre to datum, - // Do the zoom, then work out the new centre that keeps the - // screen distance the same - - Point oldModelDatum = screenToModel(screenDatum); - Vector screenDistance = modelToScreen(oldModelDatum - _viewCentreModel); - _zoom = clampZoom(zoom * factor); - _viewCentreModel = oldModelDatum - screenToModel(screenDistance); - } - - void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); } - void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } - - // For userZoom 1.0 -> 100% means the presentation on the screen is one-to-one with real-life - double userZoom(in double pixelsPerMillimetre) const { return _zoom / pixelsPerMillimetre; } - double zoom() const { return _zoom; } - Rectangle viewBoundsScreen() const { return _viewBoundsScreen; } - Rectangle viewBoundsModel() const { return screenToModel(_viewBoundsScreen); } - Rectangle canvasBoundsModel() const { return _canvasBoundsModel; } - Rectangle canvasBoundsScreen() const { return modelToScreen(_canvasBoundsModel); } - - Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } - Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; } - Vector modelToScreen(in Vector model) const { return _zoom * model; } - Vector screenToModel(in Vector screen) const { return screen / _zoom; } - Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); } - Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); } - - private { - static double clampZoom(in double zoom) { return clamp(zoom, 1e-1, 1e2); } - - // Screen units are pixels - // Model units are millimetres - double _zoom; // pixels-per-millimetre - Rectangle _viewBoundsScreen; // bounds of the viewport in screen space - Point _viewCentreModel; // where in the model is the centre of our screen - Rectangle _canvasBoundsModel; // the bounds of the canvas in model space - } -} diff -r b759414d2b72 -r d92b9f04b1e8 doodle/tk/screen_model.d --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doodle/tk/screen_model.d Mon Aug 16 00:04:27 2010 +0930 @@ -0,0 +1,69 @@ +module doodle.tk.screen_model; + +public { + import doodle.tk.geometry; +} + +private { + import doodle.core.misc; +} + +// This class manages the relationship between screen space and model space. +// Screen is defined as the current window/viewport into the model +// It provides convenient high-level operations. +// +// x and y run right and up respectively for screen and model space + +class ScreenModel { + this(in double zoom, in Rectangle canvasBoundsModel, in Rectangle viewBoundsScreen) { + _zoom = zoom; + _viewBoundsScreen = viewBoundsScreen; + _canvasBoundsModel = canvasBoundsModel; + + // Choose the centre of the canvas as the centre of the view + _viewCentreModel = _canvasBoundsModel.centre; + } + + void consolidateCanvasBounds(in Rectangle requiredCanvasBounds) { _canvasBoundsModel = screenToModel(_viewBoundsScreen) | requiredCanvasBounds; } + void canvasAccommodate(in Rectangle bounds) { _canvasBoundsModel = _canvasBoundsModel | bounds; } + + void zoomRelative(in double factor, in Point screenDatum) { + // Work out screen distance from current centre to datum, + // Do the zoom, then work out the new centre that keeps the + // screen distance the same + + Point oldModelDatum = screenToModel(screenDatum); + Vector screenDistance = modelToScreen(oldModelDatum - _viewCentreModel); + _zoom = clampZoom(zoom * factor); + _viewCentreModel = oldModelDatum - screenToModel(screenDistance); + } + + void panRelativeScreen(in Vector screenDisplacement) { _viewCentreModel = _viewCentreModel + screenToModel(screenDisplacement); } + void panRelativeModel(in Vector modelDisplacement) { _viewCentreModel = _viewCentreModel + modelDisplacement; } + + // For userZoom 1.0 -> 100% means the presentation on the screen is one-to-one with real-life + double userZoom(in double pixelsPerMillimetre) const { return _zoom / pixelsPerMillimetre; } + double zoom() const { return _zoom; } + Rectangle viewBoundsScreen() const { return _viewBoundsScreen; } + Rectangle viewBoundsModel() const { return screenToModel(_viewBoundsScreen); } + Rectangle canvasBoundsModel() const { return _canvasBoundsModel; } + Rectangle canvasBoundsScreen() const { return modelToScreen(_canvasBoundsModel); } + + Point modelToScreen(in Point model) const { return _viewBoundsScreen.centre + _zoom * (model - _viewCentreModel); } + Point screenToModel(in Point screen) const { return _viewCentreModel + (screen - _viewBoundsScreen.centre) / _zoom; } + Vector modelToScreen(in Vector model) const { return _zoom * model; } + Vector screenToModel(in Vector screen) const { return screen / _zoom; } + Rectangle modelToScreen(in Rectangle model) const { return Rectangle(modelToScreen(model.position), modelToScreen(model.size)); } + Rectangle screenToModel(in Rectangle model) const { return Rectangle(screenToModel(model.position), screenToModel(model.size)); } + + private { + static double clampZoom(in double zoom) { return clamp(zoom, 1e-1, 1e2); } + + // Screen units are pixels + // Model units are millimetres + double _zoom; // pixels-per-millimetre + Rectangle _viewBoundsScreen; // bounds of the viewport in screen space + Point _viewCentreModel; // where in the model is the centre of our screen + Rectangle _canvasBoundsModel; // the bounds of the canvas in model space + } +}