Mercurial > projects > doodle
diff doodle/gtk/canvas.d @ 79:535bae7a7305
Checkpoint
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Sun, 15 Aug 2010 23:18:05 +0930 |
parents | 024a5608087f |
children | b759414d2b72 |
line wrap: on
line diff
--- a/doodle/gtk/canvas.d Sun Aug 15 15:19:14 2010 +0930 +++ b/doodle/gtk/canvas.d Sun Aug 15 23:18:05 2010 +0930 @@ -35,23 +35,18 @@ import std.stdio; } -// -// TODO -// Pass out a scope Drawing reference to the layers for drawing on instead of cairo context. -// Create a class called LayerStack so we don't have to provide that non-gtk behaviour here. -// - final class Canvas : Table, private IViewport { this(in Layer[] layers, IEventHandler eventHandler, IGrid grid, in double pixelsPerMillimetre) { super(3, 3, 0); _damageScreen = Rectangle.DEFAULT; - _layerStack = new LayerStack(layers); _eventHandler = eventHandler; _grid = grid; _pixelsPerMillimetre = pixelsPerMillimetre; + _layerStack = new LayerStack(layers); + // Create our child widgets and register callbacks _hRuler = new HRuler; @@ -136,6 +131,13 @@ AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, 0, 0); + + _cursors = [ + Cursor.DEFAULT : CursorType.ARROW, + Cursor.HAND : CursorType.HAND1, + Cursor.CROSSHAIR : CursorType.CROSSHAIR, + Cursor.PENCIL : CursorType.PENCIL + ]; } protected { // XXX the compiler complains about unimplemented methods if this is private @@ -144,9 +146,7 @@ void zoomRelative(in Point screenDatum, in double factor) { _screenModel.zoomRelative(factor, screenDatum); - consolidateBounds; - updateAdjustments; updateRulers; _grid.zoomChanged(_screenModel.zoom); @@ -155,36 +155,14 @@ void panRelative(in Vector screenDisplacement) { _screenModel.panRelativeScreen(screenDisplacement); - consolidateBounds; - updateAdjustments; updateRulers; queueDraw; } void setCursor(in Cursor cursor) { - // FIXME how about an associative array instead of a switch statement? - CursorType cursorType; - - switch (cursor) { - case Cursor.DEFAULT: - cursorType = CursorType.ARROW; - break; - case Cursor.HAND: - cursorType = CursorType.HAND1; - break; - case Cursor.CROSSHAIR: - cursorType = CursorType.CROSSHAIR; - break; - case Cursor.PENCIL: - cursorType = CursorType.PENCIL; - break; - default: - assert(0); - } - - _drawingArea.setCursor(new gdk.Cursor.Cursor(cursorType)); + _drawingArea.setCursor(new gdk.Cursor.Cursor(_cursors[cursor])); } void damageModel(in Rectangle area) { @@ -199,14 +177,9 @@ private { void initialiseBounds(in Rectangle viewBoundsScreen) { - Rectangle lb = _layerStack.bounds; - - // FIXME use a function that grows a rectangle about its centre - // and change 2.0 to a class-level constant - Rectangle paddedLayerBounds = expand(move(lb, - lb.size), 2.0 * lb.size); - + Rectangle layerBounds = _layerStack.bounds; + Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); _screenModel = new ScreenModel(0.25 * _pixelsPerMillimetre, paddedLayerBounds, viewBoundsScreen); - _grid.zoomChanged(_screenModel.zoom); updateAdjustments; @@ -214,11 +187,8 @@ } void consolidateBounds() { - Rectangle lb = _layerStack.bounds; - - // FIXME likewise as above - Rectangle paddedLayerBounds = expand(move(lb, - lb.size), 2.0 * lb.size); - + Rectangle layerBounds = _layerStack.bounds; + Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); _screenModel.consolidateCanvasBounds(paddedLayerBounds); updateAdjustments; @@ -229,13 +199,8 @@ assert(widget is _drawingArea); Rectangle viewBoundsScreen = Rectangle(Point(0.0, 0.0), Vector(cast(double)event.width, cast(double)event.height)); - - if (_screenModel is null) { - initialiseBounds(viewBoundsScreen); - } - else { - consolidateBounds; - } + if (_screenModel is null) { initialiseBounds(viewBoundsScreen); } + else { consolidateBounds; } return true; } @@ -254,14 +219,11 @@ Rectangle screenDamage = event is null ? _screenModel.viewBoundsScreen : - // FIXME next line sucks Rectangle(_screenModel.viewBoundsScreen.position + Vector(cast(double)event.area.x, _screenModel.viewBoundsScreen.h - cast(double)(event.area.y + event.area.height)), Vector(cast(double)event.area.width, cast(double)event.area.height)); Rectangle modelDamage = _screenModel.screenToModel(screenDamage); - //trace("Screen damage: %s, model damage: %s", screenDamage, modelDamage); - modelCr.save; screenCr.save; { { // Setup model context and clip @@ -400,7 +362,7 @@ } void updateRulers() { - immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); + immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner0); immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); // Define these just to obtain the position @@ -424,11 +386,10 @@ immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); - // Adjust the canvas size if necessary FIXME is this required?? + // Adjust the canvas size if necessary _screenModel.canvasAccommodate(Rectangle(viewLeftBottom, viewRightTop)); - // FIXME - Rectangle modelSize = _screenModel.screenToModel(_screenModel.viewBoundsScreen); + Rectangle viewBoundsModel = _screenModel.viewBoundsModel; // Update the adjustments @@ -440,14 +401,14 @@ gtk_adjustment_set_value(hGtkAdjustment, viewLeftBottom.x); gtk_adjustment_set_step_increment(hGtkAdjustment, _screenModel.canvasBoundsModel.w / 16.0); gtk_adjustment_set_page_increment(hGtkAdjustment, _screenModel.canvasBoundsModel.w / 4.0); - gtk_adjustment_set_page_size(hGtkAdjustment, modelSize.w); + gtk_adjustment_set_page_size(hGtkAdjustment, viewBoundsModel.w); gtk_adjustment_set_lower(vGtkAdjustment, _screenModel.canvasBoundsModel.y0); gtk_adjustment_set_upper(vGtkAdjustment, _screenModel.canvasBoundsModel.y1); gtk_adjustment_set_value(vGtkAdjustment, viewLeftBottom.y); gtk_adjustment_set_step_increment(vGtkAdjustment, _screenModel.canvasBoundsModel.h / 16.0); gtk_adjustment_set_page_increment(vGtkAdjustment, _screenModel.canvasBoundsModel.h / 4.0); - gtk_adjustment_set_page_size(vGtkAdjustment, modelSize.h); + gtk_adjustment_set_page_size(vGtkAdjustment, viewBoundsModel.h); _hAdjustment.changed; _hAdjustment.valueChanged; @@ -466,14 +427,15 @@ void onRealize(Widget widget) { assert(widget is _drawingArea); - //writefln("Got realize\n"); _drawingArea.grabFocus(); } - LayerStack _layerStack; IEventHandler _eventHandler; IGrid _grid; double _pixelsPerMillimetre; + LayerStack _layerStack; + + immutable CursorType[Cursor] _cursors; // Child widgets: HRuler _hRuler; @@ -484,7 +446,7 @@ Adjustment _vAdjustment; VScrollbar _vScrollbar; - Rectangle _damageScreen; // in screens + Rectangle _damageScreen; ScreenModel _screenModel; } }