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;
     }
 }