annotate doodle/gtk/canvas.d @ 48:1b4c9ba58673

Stylistic overhaul.
author daveb
date Tue, 03 Aug 2010 17:37:21 +0930
parents f2e4e1d29b98
children 30ecedfe2ce2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
1 module doodle.gtk.canvas;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
2
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
3 public {
28
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
4 import doodle.dia.icanvas;
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
5 import doodle.tk.events;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
6 }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
7
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
8 private {
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
9 import doodle.core.logging;
28
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
10 import doodle.gtk.conversions;
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
11 import doodle.tk.misc;
1754cb773d41 Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents: 27
diff changeset
12 import doodle.cairo.routines;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
13
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
14 import cairo.Surface;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
15
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
16 import std.math;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
17 import std.stdio;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
18
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
19 import gtk.Widget;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
20 import gtk.Toolbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
21 import gtk.Table;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
22 import gtk.HRuler;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
23 import gtk.VRuler;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
24 import gtk.Range;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
25 import gtk.HScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
26 import gtk.VScrollbar;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
27 import gtk.DrawingArea;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
28 import gtk.Adjustment;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
29
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
30 import gdk.Drawable;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
31
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
32 import gtkc.gtk;
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
33 }
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
34
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
35 // x and y run right and up respectively
41
daveb
parents: 40
diff changeset
36 //
daveb
parents: 40
diff changeset
37 // Model units are millimetres.
daveb
parents: 40
diff changeset
38 //
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
39 // _zoom -> pixels-per-model-unit
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
40 // _viewSize -> size of view window in pixels
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
41 // _viewCentre -> location in model corresponding to centre of view
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
42 // _canvasBounds -> size of the virtual canvas in model coordinates
41
daveb
parents: 40
diff changeset
43 //
daveb
parents: 40
diff changeset
44 // User operations:
daveb
parents: 40
diff changeset
45 // pan (middle click and drag)
daveb
parents: 40
diff changeset
46 // zoom about a point (hold control and move scroll wheel)
daveb
parents: 40
diff changeset
47 // resize the widget
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
48
10
71ca82e0eb76 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 9
diff changeset
49 class Canvas : Table, Viewport {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
50 this(in Layer[] layers, EventHandler eventHandler, Grid grid, in double ppi) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
51 super(3, 3, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
52
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
53 _damage = Rectangle.DEFAULT;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
54
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
55 _layers = layers.dup;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
56 _eventHandler = eventHandler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
57 _grid = grid;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
58 _ppi = ppi;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
59
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
60 /*
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
61 writefln("Layer bounds: %s", layerBounds);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
62 writefln("Canvas bounds: %s", _canvasBounds);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
63 writefln("View centre: %s", _viewCentre);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
64 */
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
65
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
66 // Create our child widgets and register callbacks
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
67
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
68 info("B1");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
69 _hRuler = new HRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
70 attach(_hRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
71 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
72 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
73 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
74 0, 0);
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
75 _hRuler.setMetric(MetricType.PIXELS);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
76
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
77 info("B2");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
78 _vRuler = new VRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
79 attach(_vRuler,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
80 0, 1,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
81 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
82 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
83 0, 0);
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
84 info("B3");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
85 _vRuler.setMetric(MetricType.PIXELS);
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
86 info("J");
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
87
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
88 _drawingArea = new DrawingArea;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
89 _drawingArea.addOnRealize(&onRealize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
90 _drawingArea.addOnConfigure(&onConfigure);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
91 _drawingArea.addOnExpose(&onExpose);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
92 _drawingArea.addOnButtonPress(&onButtonPress);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
93 _drawingArea.addOnButtonRelease(&onButtonRelease);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
94 _drawingArea.addOnKeyPress(&onKeyEvent);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
95 _drawingArea.addOnKeyRelease(&onKeyEvent);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
96 _drawingArea.addOnMotionNotify(&onMotionNotify);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
97 _drawingArea.addOnScroll(&onScroll);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
98 _drawingArea.addOnEnterNotify(&onEnterNotify);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
99 _drawingArea.addOnLeaveNotify(&onLeaveNotify);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
100 _drawingArea.setEvents(EventMask.EXPOSURE_MASK |
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
101 EventMask.POINTER_MOTION_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
102 EventMask.POINTER_MOTION_HINT_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
103 EventMask.BUTTON_MOTION_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
104 EventMask.BUTTON_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
105 EventMask.BUTTON_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
106 EventMask.KEY_PRESS_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
107 EventMask.KEY_RELEASE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
108 EventMask.ENTER_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
109 EventMask.LEAVE_NOTIFY_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
110 EventMask.FOCUS_CHANGE_MASK |
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
111 EventMask.SCROLL_MASK);
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
112 info("M");
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
113
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
114 attach(_drawingArea,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
115 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
116 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
117 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
118 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
119
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
120 // value, lower, upper, step-inc, page-inc, page-size
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
121 // Give the adjustments dummy values until we receive a configure
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
122 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
123 _hAdjustment.addOnValueChanged(&onValueChanged);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
124 _hScrollbar = new HScrollbar(_hAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
125 _hScrollbar.setInverted(false);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
126 attach(_hScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
127 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
128 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
129 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
130 0, 0);
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
131 info("Q");
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
132
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
133 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
134 _vAdjustment.addOnValueChanged(&onValueChanged);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
135 _vScrollbar = new VScrollbar(_vAdjustment);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
136 _vScrollbar.setInverted(true);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
137 attach(_vScrollbar,
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
138 2, 3,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
139 1, 2,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
140 AttachOptions.SHRINK,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
141 AttachOptions.FILL | AttachOptions.EXPAND,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
142 0, 0);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
143 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
144
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
145 override void zoomRelative(in Point pixelDatum, in double factor) {
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
146 // Work out pixel distance from current centre to datum,
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
147 // Do the zoom, then work out the new centre that keeps the
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
148 // pixel distance the same
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
149
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
150 Point oldModelDatum = pixelToModel(pixelDatum);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
151 Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
152 _zoom = clampZoom(factor * _zoom);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
153 _viewCentre = oldModelDatum - pixelToModel(pixelDistance);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
154
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
155 updateAdjustments;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
156 updateRulers;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
157 _grid.zoomChanged(_zoom);
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
158 queueDraw;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
159 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
160
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
161 override void panRelative(in Vector pixelDisplacement) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
162 _viewCentre = _viewCentre + pixelToModel(pixelDisplacement);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
163
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
164 updateAdjustments;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
165 updateRulers;
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
166 queueDraw;
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
167 }
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
168
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
169 override void setCursor(in Cursor cursor) {
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
170 CursorType cursor_type;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
171
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
172 switch (cursor) {
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
173 case Cursor.DEFAULT:
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
174 cursor_type = CursorType.ARROW;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
175 break;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
176 case Cursor.HAND:
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
177 cursor_type = CursorType.HAND1;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
178 break;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
179 case Cursor.CROSSHAIR:
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
180 cursor_type = CursorType.CROSSHAIR;
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
181 break;
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
182 default:
1f97022e5c6d Checkpoint. Development continues...
daveb
parents: 35
diff changeset
183 assert(0);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
184 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
185
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
186 _drawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type));
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
187 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
188
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
189 override void damageModel(in Rectangle area) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
190 _damage = _damage | modelToPixel(area);
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
191 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
192
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
193 override void damagePixel(in Rectangle area) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
194 _damage = _damage | area;
18
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
195 }
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
196
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
197 private {
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
198
41
daveb
parents: 40
diff changeset
199 void update_bounds() {
daveb
parents: 40
diff changeset
200 }
daveb
parents: 40
diff changeset
201
daveb
parents: 40
diff changeset
202
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
203 bool onConfigure(GdkEventConfigure * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
204 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
205
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
206 _viewSize = Vector(cast(double)event.width, cast(double)event.height);
41
daveb
parents: 40
diff changeset
207
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
208 Rectangle layerBounds = Rectangle.DEFAULT;
41
daveb
parents: 40
diff changeset
209
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
210 foreach (ref layer; _layers) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
211 layerBounds = layerBounds | layer.bounds;
41
daveb
parents: 40
diff changeset
212 }
daveb
parents: 40
diff changeset
213
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
214 assert(layerBounds.valid);
41
daveb
parents: 40
diff changeset
215
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
216 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size);
41
daveb
parents: 40
diff changeset
217
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
218 if (!_hadConfigure) {
41
daveb
parents: 40
diff changeset
219 info("1");
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
220 const double MM_PER_INCH = 25.4;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
221 _zoom = 0.25 * _ppi / MM_PER_INCH;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
222
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
223 _canvasBounds = paddedLayerBounds;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
224 _viewCentre = _canvasBounds.centre;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
225
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
226 _grid.zoomChanged(_zoom);
35
3f6bb0bb22dc Beginnings of grid
David Bryant <bagnose@gmail.com>
parents: 34
diff changeset
227
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
228 _hadConfigure = true;
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
229 }
41
daveb
parents: 40
diff changeset
230 else {
daveb
parents: 40
diff changeset
231 // Use configure events as an opportunity
daveb
parents: 40
diff changeset
232 // to consolidate the canvas-bounds
daveb
parents: 40
diff changeset
233 // XXX nasty code.
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
234 Vector z = _viewSize / _zoom;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
235 Rectangle r = Rectangle(_viewCentre - z / 2.0, z);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
236 _canvasBounds = r | paddedLayerBounds;
41
daveb
parents: 40
diff changeset
237 }
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
238
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
239 updateAdjustments;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
240 updateRulers;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
241
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
242 //writefln("Canvas bounds: %s", _canvasBounds);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
243 //writefln("View centre: %s", _viewCentre);
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
244
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
245 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
246 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
247
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
248 bool onExpose(GdkEventExpose * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
249 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
250
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
251 Drawable dr = _drawingArea.getWindow;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
252
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
253 int width, height;
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
254 dr.getSize(width, height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
255 //writefln("Got expose %dx%d\n", width, height);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
256
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
257 scope modelCr = new Context(dr);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
258 scope pixelCr = new Context(dr);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
259
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
260 Rectangle pixel_damage =
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
261 event is null ?
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
262 Rectangle(Point(0.0, 0.0), _viewSize) :
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
263 Rectangle(Point(cast(double)event.area.x, _viewSize.y - cast(double)(event.area.y + event.area.height)),
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
264 Vector(cast(double)event.area.width, cast(double)event.area.height));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
265
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
266 Rectangle model_damage = pixelToModel(pixel_damage);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
267
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
268 //writefln("Pixel damage: %s, model damage: %s", pixel_damage, model_damage);
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
269
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
270 modelCr.save; pixelCr.save; {
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
271 // Setup model context and clip
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
272
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
273 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
274 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
275
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
276 modelCr.scale(_zoom, -_zoom);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
277 modelCr.translate(-gtk_adjustment_get_value(h_gtkAdjustment),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
278 -gtk_adjustment_get_value(v_gtkAdjustment) - gtk_adjustment_get_page_size(v_gtkAdjustment));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
279
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
280 rectangle(modelCr, model_damage);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
281 modelCr.clip;
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
282
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
283 // Setup pixel context and clip
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
284
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
285 pixelCr.translate(0.0, _viewSize.y);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
286 pixelCr.scale(1.0, -1.0);
19
22abbf4cde96 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 18
diff changeset
287
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
288 rectangle(pixelCr, pixel_damage);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
289 pixelCr.clip;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
290
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
291 // Fill the background
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
292
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
293 pixelCr.save; {
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
294 // Make the window light grey
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
295 pixelCr.setSourceRgba(0.9, 0.9, 0.9, 1.0);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
296 rectangle(pixelCr, pixel_damage);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
297 pixelCr.fill;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
298 } pixelCr.restore;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
299
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
300 // Draw each layer
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
301
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
302 foreach(ref layer; _layers) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
303 modelCr.save; pixelCr.save; {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
304 layer.draw(this, pixel_damage, pixelCr, model_damage, modelCr);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
305 } pixelCr.restore; modelCr.restore;
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
306 }
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
307 } pixelCr.restore; modelCr.restore;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
308
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
309 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
310 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
311
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
312 bool onButtonPress(GdkEventButton * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
313 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
314 //writefln("Got button event\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
315
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
316 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
317 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
318
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
319 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
320 gtk2tkButtonName(event.button),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
321 pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
322 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
323 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
324
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
325 _eventHandler.handleButtonPress(this, buttonEvent);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
326
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
327 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
328
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
329 return true;
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
330 }
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
331
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
332 bool onButtonRelease(GdkEventButton * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
333 assert(widget is _drawingArea);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
334 //writefln("Got button event\n");
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
335
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
336 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
337 Point modelPoint = pixelToModel(pixelPoint);
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
338
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
339 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
340 gtk2tkButtonName(event.button),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
341 pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
342 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
343 gtk2tkMask(event.state));
5
8a39b13cd3e6 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 3
diff changeset
344
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
345 _eventHandler.handleButtonRelease(this, buttonEvent);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
346
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
347 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
348
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
349 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
350 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
351
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
352 bool onKeyEvent(GdkEventKey * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
353 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
354 //writefln("Got key event\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
355
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
356 //auto key_event = new KeyEvent("",
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
357 // mEventHandle.handle_key(key_event);
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
358
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
359 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
360
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
361 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
362 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
363
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
364 bool onMotionNotify(GdkEventMotion * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
365 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
366 //writefln("Got motion notify\n");
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
367 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
368 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
369
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
370 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
371 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
372
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
373 auto motion_event = new MotionEvent(pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
374 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
375 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
376
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
377 _eventHandler.handleMotion(this, motion_event);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
378
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
379 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
380
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
381 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
382 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
383
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
384 bool onScroll(GdkEventScroll * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
385 assert(widget is _drawingArea);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
386 //writefln("Got scroll\n");
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
387
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
388 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5));
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
389 Point modelPoint = pixelToModel(pixelPoint);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
390
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
391 auto scroll_event = new ScrollEvent(gtk2tkDirection(event.direction),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
392 pixelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
393 modelPoint,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
394 gtk2tkMask(event.state));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
395
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
396 _eventHandler.handleScroll(this, scroll_event);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
397
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
398 fixDamage;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
399
2
d6f44347373d * Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents: 0
diff changeset
400 return true;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
401 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
402
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
403 /*
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
404 public enum GdkCrossingMode {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
405 NORMAL,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
406 GRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
407 UNGRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
408 GTK_GRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
409 GTK_UNGRAB,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
410 STATE_CHANGED
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
411 }
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
412
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
413 public struct GdkEventCrossing {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
414 GdkEventType type;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
415 GdkWindow *window;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
416 byte sendEvent;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
417 GdkWindow *subwindow;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
418 uint time;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
419 double x;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
420 double y;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
421 double xRoot;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
422 double yRoot;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
423 GdkCrossingMode mode;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
424 GdkNotifyType detail;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
425 int focus;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
426 uint state;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
427 }
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
428 */
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
429
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
430 bool onEnterNotify(GdkEventCrossing * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
431 assert(widget is _drawingArea);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
432 //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
433 // TODO
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
434 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
435 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
436
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
437 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
438 assert(widget is _drawingArea);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
439 //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
440 // TODO
20
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
441 return true;
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
442 }
d6e7a5a6f008 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 19
diff changeset
443
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
444 void onValueChanged(Adjustment adjustment) {
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
445 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
446 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
447
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
448 Point viewLeftTop = Point(gtk_adjustment_get_value(h_gtkAdjustment),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
449 gtk_adjustment_get_value(v_gtkAdjustment));
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
450
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
451 Vector modelSize = pixelToModel(_viewSize);
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
452
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
453 //writefln("%s", viewLeftBottom);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
454 _viewCentre = viewLeftTop + modelSize / 2.0;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
455 //writefln("onValueChanged _viewCentre: %s", _viewCentre);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
456
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
457 updateRulers;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
458
13
f0ade1b49fe7 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 12
diff changeset
459 queueDraw;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
460 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
461
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
462 void updateRulers() {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
463 invariant Vector modelSize = pixelToModel(_viewSize);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
464
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
465 invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
466 invariant Point viewRightTop = _viewCentre + modelSize / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
467
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
468 // Define these just to obtain the position
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
469 // below and we can preserve it
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
470 double lower, upper, position, maxSize;
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
471
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
472 _hRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
473 _hRuler.setRange(viewLeftBottom.x,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
474 viewRightTop.x,
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
475 position,
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
476 _zoom * 50.0);
12
a093c4fbdd43 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 11
diff changeset
477
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
478 _vRuler.getRange(lower, upper, position, maxSize);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
479 _vRuler.setRange(viewRightTop.y,
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
480 viewLeftBottom.y,
14
0b7e7d43a79d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 13
diff changeset
481 position,
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
482 _zoom * 50.0);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
483 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
484
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
485 void updateAdjustments() {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
486 invariant Vector modelSize = pixelToModel(_viewSize);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
487
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
488 invariant Point viewLeftBottom = _viewCentre - modelSize / 2.0;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
489 invariant Point viewRightTop = _viewCentre + modelSize / 2.0;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
490
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
491 // Adjust the canvas size if necessary
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
492 _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom),
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
493 maxExtents(_canvasBounds.maxCorner, viewRightTop));
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
494
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
495 // Update the adjustments
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
496
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
497 GtkAdjustment * h_gtkAdjustment = _hAdjustment.getAdjustmentStruct;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
498 GtkAdjustment * v_gtkAdjustment = _vAdjustment.getAdjustmentStruct;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
499
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
500 gtk_adjustment_set_lower(h_gtkAdjustment, _canvasBounds.minCorner.x);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
501 gtk_adjustment_set_upper(h_gtkAdjustment, _canvasBounds.maxCorner.x);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
502 gtk_adjustment_set_value(h_gtkAdjustment, viewLeftBottom.x);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
503 gtk_adjustment_set_step_increment(h_gtkAdjustment, _canvasBounds.size.x / 16.0);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
504 gtk_adjustment_set_page_increment(h_gtkAdjustment, _canvasBounds.size.x / 4.0);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
505 gtk_adjustment_set_page_size(h_gtkAdjustment, modelSize.x);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
506
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
507 gtk_adjustment_set_lower(v_gtkAdjustment, _canvasBounds.minCorner.y);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
508 gtk_adjustment_set_upper(v_gtkAdjustment, _canvasBounds.maxCorner.y);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
509 gtk_adjustment_set_value(v_gtkAdjustment, viewLeftBottom.y);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
510 gtk_adjustment_set_step_increment(v_gtkAdjustment, _canvasBounds.size.y / 16.0);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
511 gtk_adjustment_set_page_increment(v_gtkAdjustment, _canvasBounds.size.y / 4.0);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
512 gtk_adjustment_set_page_size(v_gtkAdjustment, modelSize.y);
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
513
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
514 _hAdjustment.changed;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
515 _hAdjustment.valueChanged;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
516 _vAdjustment.changed;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
517 _vAdjustment.valueChanged;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
518 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
519
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
520 void fixDamage() {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
521 if (_damage.valid) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
522 //writefln("Damage: %s", _damage);
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
523 int x, y, w, h;
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
524 _damage.getQuantised(x, y, w, h);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
525 _drawingArea.queueDrawArea(x, cast(int)_viewSize.y - (y + h), w, h);
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
526 _damage = Rectangle.DEFAULT;
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
527 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
528 else {
18
df8d81d9f499 Lasso fiddling
David Bryant <daveb@acres.com.au>
parents: 17
diff changeset
529 //writefln("No damage");
17
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
530 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
531 }
c643c04e3f5e Checkpoint
David Bryant <daveb@acres.com.au>
parents: 16
diff changeset
532
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
533 double clampZoom(in double zoom) { return clamp(zoom, 0.2, 10.0); }
16
9e63308b749c * Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents: 15
diff changeset
534
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
535 Point modelToPixel(in Point model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
536 return Point.DEFAULT + _viewSize / 2.0 + _zoom * (model - _viewCentre);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
537 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
538
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
539 Point pixelToModel(in Point pixel) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
540 return _viewCentre + (pixel - _viewSize / 2.0 - Point.DEFAULT) / _zoom;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
541 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
542
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
543 Vector modelToPixel(in Vector model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
544 return _zoom * model;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
545 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
546
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
547 Vector pixelToModel(in Vector pixel) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
548 return pixel / _zoom;
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
549 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
550
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
551 Rectangle modelToPixel(in Rectangle model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
552 return Rectangle(modelToPixel(model.position), modelToPixel(model.size));
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
553 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
554
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
555 Rectangle pixelToModel(in Rectangle model) const {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
556 return Rectangle(pixelToModel(model.position), pixelToModel(model.size));
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
557 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
558
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
559 void onRealize(Widget widget) {
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
560 assert(widget is _drawingArea);
27
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
561 //writefln("Got realize\n");
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
562 }
f3d91579bb28 Checkpoint
David Bryant <daveb@acres.com.au>
parents: 26
diff changeset
563
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
564 bool _hadConfigure;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
565 Rectangle _damage; // pixels
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
566
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
567 // Model units are in millimetres
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
568 // Screen units are in pixels
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
569 double _zoom; // pixels-per-model-unit
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
570 Vector _viewSize; // pixel: size of view window in pixels
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
571 Point _viewCentre; // model: where in the model is the centre of our view
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
572 Rectangle _canvasBounds; // model:
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
573
10
71ca82e0eb76 Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 9
diff changeset
574 // Child widgets:
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
575 HRuler _hRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
576 VRuler _vRuler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
577 DrawingArea _drawingArea;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
578 Adjustment _hAdjustment;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
579 HScrollbar _hScrollbar;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
580 Adjustment _vAdjustment;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
581 VScrollbar _vScrollbar;
11
fb571a3b1f0d Checkpoint
"David Bryant <bagnose@gmail.com>"
parents: 10
diff changeset
582
48
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
583 Layer[] _layers;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
584 EventHandler _eventHandler;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
585 Grid _grid;
1b4c9ba58673 Stylistic overhaul.
daveb
parents: 41
diff changeset
586 double _ppi;
0
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
587 }
e907d2c54ec3 Initial import
David Bryant <daveb@acres.com.au>
parents:
diff changeset
588 }