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