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