Mercurial > projects > doodle
annotate doodle/gtk/canvas.d @ 67:31d10176415d
Checkpoint
author | daveb |
---|---|
date | Fri, 13 Aug 2010 15:28:04 +0930 |
parents | eb5436b47d13 |
children | 64bd864db30d |
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 | 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 | 7 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
8 private { |
67 | 9 import doodle.core.misc; |
40 | 10 import doodle.core.logging; |
67 | 11 import doodle.cairo.routines; |
28
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.gtk.conversions; |
0 | 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 gtk.Widget; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
17 import gtk.Toolbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
18 import gtk.Table; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
19 import gtk.HRuler; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
20 import gtk.VRuler; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
21 import gtk.Range; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
22 import gtk.HScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
23 import gtk.VScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
24 import gtk.DrawingArea; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
25 import gtk.Adjustment; |
0 | 26 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
27 import gdk.Drawable; |
0 | 28 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
29 import gtkc.gtk; |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
30 import gtkc.gtktypes; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
31 //import gtkc.gdktypes; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
32 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
33 import std.math; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
34 import std.stdio; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
35 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
36 import core.stdc.string : strlen; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
37 } |
0 | 38 |
39 // x and y run right and up respectively | |
41 | 40 // |
41 // Model units are millimetres. | |
42 // | |
48 | 43 // _zoom -> pixels-per-model-unit |
44 // _viewSize -> size of view window in pixels | |
45 // _viewCentre -> location in model corresponding to centre of view | |
46 // _canvasBounds -> size of the virtual canvas in model coordinates | |
41 | 47 // |
48 // User operations: | |
49 // pan (middle click and drag) | |
50 // zoom about a point (hold control and move scroll wheel) | |
51 // resize the widget | |
0 | 52 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
53 final class Canvas : Table, IViewport { |
57 | 54 this(in Layer[] layers, IEventHandler eventHandler, IGrid grid, in double ppi) { |
0 | 55 super(3, 3, 0); |
56 | |
48 | 57 _damage = Rectangle.DEFAULT; |
17 | 58 |
48 | 59 _layers = layers.dup; |
60 _eventHandler = eventHandler; | |
61 _grid = grid; | |
62 _ppi = ppi; | |
0 | 63 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
64 /* |
62 | 65 trace("Layer bounds: %s", layerBounds); |
66 trace("Canvas bounds: %s", _canvasBounds); | |
67 trace("View centre: %s", _viewCentre); | |
48 | 68 */ |
0 | 69 |
13 | 70 // Create our child widgets and register callbacks |
71 | |
48 | 72 _hRuler = new HRuler; |
73 attach(_hRuler, | |
0 | 74 1, 2, |
75 0, 1, | |
76 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | |
77 0, 0); | |
48 | 78 _hRuler.setMetric(MetricType.PIXELS); |
0 | 79 |
48 | 80 _vRuler = new VRuler; |
81 attach(_vRuler, | |
0 | 82 0, 1, |
83 1, 2, | |
84 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, | |
85 0, 0); | |
48 | 86 _vRuler.setMetric(MetricType.PIXELS); |
0 | 87 |
48 | 88 _drawingArea = new DrawingArea; |
89 _drawingArea.addOnRealize(&onRealize); | |
90 _drawingArea.addOnConfigure(&onConfigure); | |
91 _drawingArea.addOnExpose(&onExpose); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
92 _drawingArea.addOnButtonPress(&onButtonPress); // FIXME merge delegate with next |
48 | 93 _drawingArea.addOnButtonRelease(&onButtonRelease); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
94 _drawingArea.addOnKeyPress(&onKeyPressEvent); // FIXME merge delegate with next |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
95 _drawingArea.addOnKeyRelease(&onKeyReleaseEvent); |
48 | 96 _drawingArea.addOnMotionNotify(&onMotionNotify); |
97 _drawingArea.addOnScroll(&onScroll); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
98 _drawingArea.addOnEnterNotify(&onEnterNotify); // FIXME merge delegate with next |
48 | 99 _drawingArea.addOnLeaveNotify(&onLeaveNotify); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
100 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
101 _drawingArea.addOnFocusIn(&onFocusIn); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
102 _drawingArea.addOnFocusOut(&onFocusOut); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
103 _drawingArea.addOnMoveFocus(&onMoveFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
104 _drawingArea.addOnGrabBroken(&onGrabBroken); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
105 _drawingArea.addOnGrabFocus(&onGrabFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
106 _drawingArea.addOnGrabNotify(&onGrabNotify); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
107 // addOnPopupMenu |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
108 // addOnQueryTooltip |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
109 // addOnSelection* |
48 | 110 _drawingArea.setEvents(EventMask.EXPOSURE_MASK | |
20 | 111 EventMask.POINTER_MOTION_MASK | |
112 EventMask.POINTER_MOTION_HINT_MASK | | |
113 EventMask.BUTTON_MOTION_MASK | | |
114 EventMask.BUTTON_PRESS_MASK | | |
115 EventMask.BUTTON_RELEASE_MASK | | |
116 EventMask.KEY_PRESS_MASK | | |
117 EventMask.KEY_RELEASE_MASK | | |
118 EventMask.ENTER_NOTIFY_MASK | | |
119 EventMask.LEAVE_NOTIFY_MASK | | |
120 EventMask.FOCUS_CHANGE_MASK | | |
121 EventMask.SCROLL_MASK); | |
122 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
123 _drawingArea.setCanFocus(true); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
124 |
48 | 125 attach(_drawingArea, |
0 | 126 1, 2, |
127 1, 2, | |
128 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, | |
129 0, 0); | |
130 | |
131 // value, lower, upper, step-inc, page-inc, page-size | |
132 // Give the adjustments dummy values until we receive a configure | |
48 | 133 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
67 | 134 _hAdjustment.addOnValueChanged(&onAdjustmentValueChanged); |
48 | 135 _hScrollbar = new HScrollbar(_hAdjustment); |
136 _hScrollbar.setInverted(false); | |
137 attach(_hScrollbar, | |
0 | 138 1, 2, |
139 2, 3, | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
140 AttachOptions.FILL | AttachOptions.EXPAND, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
141 AttachOptions.SHRINK, |
0 | 142 0, 0); |
143 | |
48 | 144 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
67 | 145 _vAdjustment.addOnValueChanged(&onAdjustmentValueChanged); |
48 | 146 _vScrollbar = new VScrollbar(_vAdjustment); |
147 _vScrollbar.setInverted(true); | |
148 attach(_vScrollbar, | |
0 | 149 2, 3, |
150 1, 2, | |
151 AttachOptions.SHRINK, | |
152 AttachOptions.FILL | AttachOptions.EXPAND, | |
153 0, 0); | |
154 } | |
155 | |
62 | 156 // IViewport overrides: |
157 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
158 void zoomRelative(in Point pixelDatum, in double factor) { |
0 | 159 // Work out pixel distance from current centre to datum, |
160 // Do the zoom, then work out the new centre that keeps the | |
161 // pixel distance the same | |
162 | |
48 | 163 Point oldModelDatum = pixelToModel(pixelDatum); |
164 Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre); | |
165 _zoom = clampZoom(factor * _zoom); | |
166 _viewCentre = oldModelDatum - pixelToModel(pixelDistance); | |
0 | 167 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
168 consolidateBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
169 |
48 | 170 updateAdjustments; |
171 updateRulers; | |
172 _grid.zoomChanged(_zoom); | |
13 | 173 queueDraw; |
0 | 174 } |
175 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
176 void panRelative(in Vector pixelDisplacement) { |
48 | 177 _viewCentre = _viewCentre + pixelToModel(pixelDisplacement); |
0 | 178 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
179 consolidateBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
180 |
48 | 181 updateAdjustments; |
182 updateRulers; | |
13 | 183 queueDraw; |
184 } | |
185 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
186 void setCursor(in Cursor cursor) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
187 CursorType cursorType; |
27 | 188 |
189 switch (cursor) { | |
190 case Cursor.DEFAULT: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
191 cursorType = CursorType.ARROW; |
27 | 192 break; |
193 case Cursor.HAND: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
194 cursorType = CursorType.HAND1; |
27 | 195 break; |
196 case Cursor.CROSSHAIR: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
197 cursorType = CursorType.CROSSHAIR; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
198 break; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
199 case Cursor.PENCIL: |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
200 cursorType = CursorType.PENCIL; |
27 | 201 break; |
40 | 202 default: |
203 assert(0); | |
27 | 204 } |
205 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
206 _drawingArea.setCursor(new gdk.Cursor.Cursor(cursorType)); |
27 | 207 } |
208 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
209 void damageModel(in Rectangle area) { |
48 | 210 _damage = _damage | modelToPixel(area); |
17 | 211 } |
212 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
213 void damagePixel(in Rectangle area) { |
48 | 214 _damage = _damage | area; |
18 | 215 } |
216 | |
0 | 217 private { |
218 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
219 void initialiseBounds() { |
48 | 220 Rectangle layerBounds = Rectangle.DEFAULT; |
41 | 221 |
67 | 222 foreach (layer; _layers) { |
48 | 223 layerBounds = layerBounds | layer.bounds; |
41 | 224 } |
225 | |
48 | 226 assert(layerBounds.valid); |
41 | 227 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
228 // FIXME use a function that grows a rectangle about its centre |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
229 // and change 2.0 to a class-level constant |
48 | 230 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size); |
41 | 231 |
62 | 232 // |
233 | |
234 _zoom = 0.25 * _ppi / MM_PER_INCH; | |
235 | |
236 _canvasBounds = paddedLayerBounds; | |
237 _viewCentre = _canvasBounds.centre; | |
238 | |
239 _grid.zoomChanged(_zoom); | |
240 | |
241 updateAdjustments; | |
242 updateRulers; | |
243 } | |
244 | |
245 void consolidateBounds() { | |
246 Rectangle layerBounds = Rectangle.DEFAULT; | |
247 | |
67 | 248 foreach (layer; _layers) { |
62 | 249 layerBounds = layerBounds | layer.bounds; |
250 } | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
251 |
62 | 252 assert(layerBounds.valid); |
253 | |
254 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size); | |
255 | |
256 Vector z = _viewSize / _zoom; | |
257 Rectangle r = Rectangle(_viewCentre - z / 2.0, z); | |
258 _canvasBounds = r | paddedLayerBounds; | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
259 |
62 | 260 updateAdjustments; |
261 updateRulers; | |
262 } | |
35 | 263 |
62 | 264 bool onConfigure(GdkEventConfigure * event, Widget widget) { |
265 assert(widget is _drawingArea); | |
266 | |
267 _viewSize = Vector(cast(double)event.width, cast(double)event.height); | |
268 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
269 if (!_boundsValid) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
270 initialiseBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
271 _boundsValid = true; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
272 } |
41 | 273 else { |
62 | 274 consolidateBounds; |
41 | 275 } |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
276 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
277 return true; |
0 | 278 } |
279 | |
48 | 280 bool onExpose(GdkEventExpose * event, Widget widget) { |
281 assert(widget is _drawingArea); | |
0 | 282 |
48 | 283 Drawable dr = _drawingArea.getWindow; |
0 | 284 |
285 int width, height; | |
286 dr.getSize(width, height); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
287 //trace("Got expose %dx%d\n", width, height); |
0 | 288 |
48 | 289 scope modelCr = new Context(dr); |
290 scope pixelCr = new Context(dr); | |
12 | 291 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
292 Rectangle pixelDamage = |
11 | 293 event is null ? |
48 | 294 Rectangle(Point(0.0, 0.0), _viewSize) : |
295 Rectangle(Point(cast(double)event.area.x, _viewSize.y - cast(double)(event.area.y + event.area.height)), | |
11 | 296 Vector(cast(double)event.area.width, cast(double)event.area.height)); |
0 | 297 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
298 Rectangle modelDamage = pixelToModel(pixelDamage); |
19 | 299 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
300 //trace("Pixel damage: %s, model damage: %s", pixelDamage, modelDamage); |
19 | 301 |
48 | 302 modelCr.save; pixelCr.save; { |
67 | 303 { |
304 // Setup model context and clip | |
305 modelCr.translate(0.0, _viewSize.y); | |
306 modelCr.scale(_zoom, -_zoom); | |
12 | 307 |
67 | 308 immutable Vector modelSize = pixelToModel(_viewSize); |
309 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; | |
310 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y); | |
0 | 311 |
67 | 312 rectangle(modelCr, modelDamage); |
313 modelCr.clip; | |
314 } | |
12 | 315 |
67 | 316 { |
317 // Setup pixel context and clip | |
318 pixelCr.translate(0.0, _viewSize.y); | |
319 pixelCr.scale(1.0, -1.0); | |
19 | 320 |
67 | 321 rectangle(pixelCr, pixelDamage); |
322 pixelCr.clip; | |
323 } | |
12 | 324 |
48 | 325 pixelCr.save; { |
67 | 326 // Fill the background with light grey |
48 | 327 pixelCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
328 rectangle(pixelCr, pixelDamage); |
48 | 329 pixelCr.fill; |
330 } pixelCr.restore; | |
12 | 331 |
332 // Draw each layer | |
67 | 333 foreach(layer; _layers) { |
334 layer.draw(this, pixelDamage, pixelCr, modelDamage, modelCr); | |
11 | 335 } |
48 | 336 } pixelCr.restore; modelCr.restore; |
0 | 337 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
338 return true; |
0 | 339 } |
340 | |
48 | 341 bool onButtonPress(GdkEventButton * event, Widget widget) { |
342 assert(widget is _drawingArea); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
343 //trace("Got button event\n"); |
0 | 344 |
48 | 345 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
346 Point modelPoint = pixelToModel(pixelPoint); | |
0 | 347 |
48 | 348 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), |
349 gtk2tkButtonName(event.button), | |
350 pixelPoint, | |
351 modelPoint, | |
352 gtk2tkMask(event.state)); | |
0 | 353 |
48 | 354 _eventHandler.handleButtonPress(this, buttonEvent); |
5 | 355 |
48 | 356 fixDamage; |
17 | 357 |
5 | 358 return true; |
359 } | |
360 | |
48 | 361 bool onButtonRelease(GdkEventButton * event, Widget widget) { |
362 assert(widget is _drawingArea); | |
5 | 363 |
48 | 364 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
365 Point modelPoint = pixelToModel(pixelPoint); | |
5 | 366 |
48 | 367 auto buttonEvent = new ButtonEvent(gtk2tkButtonAction(event.type), |
368 gtk2tkButtonName(event.button), | |
369 pixelPoint, | |
370 modelPoint, | |
371 gtk2tkMask(event.state)); | |
5 | 372 |
48 | 373 _eventHandler.handleButtonRelease(this, buttonEvent); |
0 | 374 |
48 | 375 fixDamage; |
17 | 376 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
377 return true; |
0 | 378 } |
379 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
380 /* |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
381 public struct GdkEventKey { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
382 GdkEventType type; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
383 GdkWindow *window; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
384 byte sendEvent; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
385 uint time; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
386 uint state; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
387 uint keyval; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
388 int length; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
389 char *string; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
390 ushort hardwareKeycode; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
391 ubyte group; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
392 uint bitfield0; |
67 | 393 uint isModifier : 1; |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
394 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
395 */ |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
396 bool onKeyPressEvent(GdkEventKey * event, Widget widget) { |
48 | 397 assert(widget is _drawingArea); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
398 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
399 auto keyEvent = new KeyEvent(event.string[0..strlen(event.string)].idup, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
400 event.keyval, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
401 gtk2tkMask(event.state)); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
402 message("Got key press %s", keyEvent); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
403 _eventHandler.handleKeyPress(this, keyEvent); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
404 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
405 fixDamage; |
0 | 406 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
407 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
408 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
409 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
410 bool onKeyReleaseEvent(GdkEventKey * event, Widget widget) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
411 assert(widget is _drawingArea); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
412 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
413 auto keyEvent = new KeyEvent(event.string[0..strlen(event.string)].idup, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
414 event.keyval, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
415 gtk2tkMask(event.state)); |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
416 //message("Got key release %s", keyEvent); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
417 _eventHandler.handleKeyRelease(this, keyEvent); |
0 | 418 |
48 | 419 fixDamage; |
17 | 420 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
421 return true; |
0 | 422 } |
423 | |
48 | 424 bool onMotionNotify(GdkEventMotion * event, Widget widget) { |
425 assert(widget is _drawingArea); | |
0 | 426 //writefln("Got motion notify\n"); |
48 | 427 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event); |
428 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event); | |
0 | 429 |
48 | 430 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
431 Point modelPoint = pixelToModel(pixelPoint); | |
0 | 432 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
433 auto motionEvent = new MotionEvent(pixelPoint, |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
434 modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
435 gtk2tkMask(event.state)); |
0 | 436 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
437 _eventHandler.handleMotion(this, motionEvent); |
0 | 438 |
48 | 439 fixDamage; |
17 | 440 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
441 return true; |
0 | 442 } |
443 | |
48 | 444 bool onScroll(GdkEventScroll * event, Widget widget) { |
445 assert(widget is _drawingArea); | |
0 | 446 //writefln("Got scroll\n"); |
447 | |
48 | 448 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
449 Point modelPoint = pixelToModel(pixelPoint); | |
0 | 450 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
451 auto scrollEvent = new ScrollEvent(gtk2tkDirection(event.direction), |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
452 pixelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
453 modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
454 gtk2tkMask(event.state)); |
0 | 455 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
456 _eventHandler.handleScroll(this, scrollEvent); |
0 | 457 |
48 | 458 fixDamage; |
17 | 459 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
460 return true; |
0 | 461 } |
462 | |
20 | 463 /* |
48 | 464 public enum GdkCrossingMode { |
465 NORMAL, | |
466 GRAB, | |
467 UNGRAB, | |
468 GTK_GRAB, | |
469 GTK_UNGRAB, | |
470 STATE_CHANGED | |
471 } | |
20 | 472 |
48 | 473 public struct GdkEventCrossing { |
474 GdkEventType type; | |
475 GdkWindow *window; | |
476 byte sendEvent; | |
477 GdkWindow *subwindow; | |
478 uint time; | |
479 double x; | |
480 double y; | |
481 double xRoot; | |
482 double yRoot; | |
483 GdkCrossingMode mode; | |
484 GdkNotifyType detail; | |
485 int focus; | |
486 uint state; | |
487 } | |
488 */ | |
20 | 489 |
48 | 490 bool onEnterNotify(GdkEventCrossing * event, Widget widget) { |
491 assert(widget is _drawingArea); | |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
492 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
493 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
494 Point modelPoint = pixelToModel(pixelPoint); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
495 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
496 auto crossingEvent = new CrossingEvent(gtk2tkCrossingMode(event.mode), |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
497 pixelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
498 modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
499 gtk2tkMask(event.state)); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
500 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
501 _eventHandler.handleEnter(this, crossingEvent); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
502 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
503 fixDamage; |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
504 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
505 //message("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
506 |
20 | 507 return true; |
508 } | |
509 | |
48 | 510 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { |
511 assert(widget is _drawingArea); | |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
512 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
513 Point pixelPoint = Point(event.x + 0.5, _viewSize.y - (event.y + 0.5)); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
514 Point modelPoint = pixelToModel(pixelPoint); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
515 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
516 auto crossingEvent = new CrossingEvent(gtk2tkCrossingMode(event.mode), |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
517 pixelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
518 modelPoint, |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
519 gtk2tkMask(event.state)); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
520 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
521 _eventHandler.handleLeave(this, crossingEvent); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
522 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
523 fixDamage; |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
524 |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
525 //message("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); |
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
526 |
20 | 527 return true; |
528 } | |
529 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
530 /* |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
531 public struct GdkEventFocus { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
532 GdkEventType type; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
533 GdkWindow *window; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
534 byte sendEvent; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
535 short inn; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
536 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
537 */ |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
538 bool onFocusIn(GdkEventFocus * event, Widget widget) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
539 trace("onFocusIn"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
540 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
541 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
542 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
543 bool onFocusOut(GdkEventFocus * event, Widget widget) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
544 trace("onFocusOut"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
545 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
546 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
547 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
548 void onMoveFocus(GtkDirectionType direction, Widget widget) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
549 trace("onMoveFocus"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
550 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
551 |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
552 bool onGrabBroken(gdk.Event.Event event, Widget widget) { |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
553 trace("onGrabBroken"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
554 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
555 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
556 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
557 void onGrabFocus(Widget widget) { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
558 //trace("onGrabFocus"); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
559 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
560 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
561 void onGrabNotify(gboolean what, Widget widget){ |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
562 trace("onGrabNotify"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
563 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
564 |
67 | 565 void onAdjustmentValueChanged(Adjustment adjustment) { |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
566 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
567 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct; |
0 | 568 |
67 | 569 Point viewLeftBottom = Point(gtk_adjustment_get_value(hGtkAdjustment), |
570 gtk_adjustment_get_value(vGtkAdjustment)); | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
571 |
48 | 572 Vector modelSize = pixelToModel(_viewSize); |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
573 |
67 | 574 _viewCentre = viewLeftBottom + modelSize / 2.0; |
0 | 575 |
48 | 576 updateRulers; |
13 | 577 queueDraw; |
0 | 578 } |
579 | |
48 | 580 void updateRulers() { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
581 immutable Vector modelSize = pixelToModel(_viewSize); |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
582 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
583 immutable Point viewRightTop = _viewCentre + modelSize / 2.0; |
0 | 584 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
585 // Define these just to obtain the position |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
586 // below and we can preserve it |
48 | 587 double lower, upper, position, maxSize; |
12 | 588 |
48 | 589 _hRuler.getRange(lower, upper, position, maxSize); |
590 _hRuler.setRange(viewLeftBottom.x, | |
591 viewRightTop.x, | |
12 | 592 position, |
48 | 593 _zoom * 50.0); |
12 | 594 |
48 | 595 _vRuler.getRange(lower, upper, position, maxSize); |
596 _vRuler.setRange(viewRightTop.y, | |
597 viewLeftBottom.y, | |
14 | 598 position, |
48 | 599 _zoom * 50.0); |
0 | 600 } |
601 | |
48 | 602 void updateAdjustments() { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
603 immutable Vector modelSize = pixelToModel(_viewSize); |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
604 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
605 immutable Point viewRightTop = _viewCentre + modelSize / 2.0; |
0 | 606 |
607 // Adjust the canvas size if necessary | |
48 | 608 _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom), |
609 maxExtents(_canvasBounds.maxCorner, viewRightTop)); | |
0 | 610 |
611 // Update the adjustments | |
612 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
613 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
614 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct; |
0 | 615 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
616 gtk_adjustment_set_lower(hGtkAdjustment, _canvasBounds.minCorner.x); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
617 gtk_adjustment_set_upper(hGtkAdjustment, _canvasBounds.maxCorner.x); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
618 gtk_adjustment_set_value(hGtkAdjustment, viewLeftBottom.x); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
619 gtk_adjustment_set_step_increment(hGtkAdjustment, _canvasBounds.size.x / 16.0); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
620 gtk_adjustment_set_page_increment(hGtkAdjustment, _canvasBounds.size.x / 4.0); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
621 gtk_adjustment_set_page_size(hGtkAdjustment, modelSize.x); |
0 | 622 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
623 gtk_adjustment_set_lower(vGtkAdjustment, _canvasBounds.minCorner.y); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
624 gtk_adjustment_set_upper(vGtkAdjustment, _canvasBounds.maxCorner.y); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
625 gtk_adjustment_set_value(vGtkAdjustment, viewLeftBottom.y); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
626 gtk_adjustment_set_step_increment(vGtkAdjustment, _canvasBounds.size.y / 16.0); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
627 gtk_adjustment_set_page_increment(vGtkAdjustment, _canvasBounds.size.y / 4.0); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
628 gtk_adjustment_set_page_size(vGtkAdjustment, modelSize.y); |
0 | 629 |
48 | 630 _hAdjustment.changed; |
631 _hAdjustment.valueChanged; | |
632 _vAdjustment.changed; | |
633 _vAdjustment.valueChanged; | |
0 | 634 } |
635 | |
48 | 636 void fixDamage() { |
637 if (_damage.valid) { | |
17 | 638 int x, y, w, h; |
48 | 639 _damage.getQuantised(x, y, w, h); |
640 _drawingArea.queueDrawArea(x, cast(int)_viewSize.y - (y + h), w, h); | |
641 _damage = Rectangle.DEFAULT; | |
17 | 642 } |
643 } | |
644 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
645 static 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
|
646 |
48 | 647 Point modelToPixel(in Point model) const { |
648 return Point.DEFAULT + _viewSize / 2.0 + _zoom * (model - _viewCentre); | |
27 | 649 } |
650 | |
48 | 651 Point pixelToModel(in Point pixel) const { |
652 return _viewCentre + (pixel - _viewSize / 2.0 - Point.DEFAULT) / _zoom; | |
27 | 653 } |
654 | |
48 | 655 Vector modelToPixel(in Vector model) const { |
656 return _zoom * model; | |
27 | 657 } |
658 | |
48 | 659 Vector pixelToModel(in Vector pixel) const { |
660 return pixel / _zoom; | |
27 | 661 } |
662 | |
48 | 663 Rectangle modelToPixel(in Rectangle model) const { |
664 return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); | |
27 | 665 } |
666 | |
48 | 667 Rectangle pixelToModel(in Rectangle model) const { |
668 return Rectangle(pixelToModel(model.position), pixelToModel(model.size)); | |
27 | 669 } |
670 | |
48 | 671 void onRealize(Widget widget) { |
672 assert(widget is _drawingArea); | |
27 | 673 //writefln("Got realize\n"); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
674 _drawingArea.grabFocus(); |
27 | 675 } |
676 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
677 bool _boundsValid; |
48 | 678 Rectangle _damage; // pixels |
0 | 679 |
67 | 680 // Model units are millimetres |
681 // Screen units are pixels | |
48 | 682 double _zoom; // pixels-per-model-unit |
683 Vector _viewSize; // pixel: size of view window in pixels | |
684 Point _viewCentre; // model: where in the model is the centre of our view | |
685 Rectangle _canvasBounds; // model: | |
0 | 686 |
10 | 687 // Child widgets: |
48 | 688 HRuler _hRuler; |
689 VRuler _vRuler; | |
690 DrawingArea _drawingArea; | |
691 Adjustment _hAdjustment; | |
692 HScrollbar _hScrollbar; | |
693 Adjustment _vAdjustment; | |
694 VScrollbar _vScrollbar; | |
11 | 695 |
48 | 696 Layer[] _layers; |
57 | 697 IEventHandler _eventHandler; |
698 IGrid _grid; | |
48 | 699 double _ppi; |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
700 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
701 static immutable MM_PER_INCH = 25.4; |
0 | 702 } |
703 } |