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