Mercurial > projects > doodle
annotate doodle/gtk/canvas.d @ 64:eb5436b47d13
Implemented crossing events
author | "David Bryant <bagnose@gmail.com>" |
---|---|
date | Thu, 12 Aug 2010 22:21:12 +0930 |
parents | 20d6327c4a75 |
children | 31d10176415d |
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 { |
40 | 9 import doodle.core.logging; |
28
1754cb773d41
Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents:
27
diff
changeset
|
10 import doodle.gtk.conversions; |
1754cb773d41
Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents:
27
diff
changeset
|
11 import doodle.tk.misc; |
1754cb773d41
Part-way through getting to compile with configure/builder.
Graham St Jack <graham.stjack@internode.on.net>
parents:
27
diff
changeset
|
12 import doodle.cairo.routines; |
0 | 13 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
14 import cairo.Surface; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
15 |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
16 import gtk.Widget; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
17 import gtk.Toolbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
18 import gtk.Table; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
19 import gtk.HRuler; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
20 import gtk.VRuler; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
21 import gtk.Range; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
22 import gtk.HScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
23 import gtk.VScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
24 import gtk.DrawingArea; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
25 import gtk.Adjustment; |
0 | 26 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
27 import gdk.Drawable; |
0 | 28 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
29 import gtkc.gtk; |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
30 import gtkc.gtktypes; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
31 //import gtkc.gdktypes; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
32 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
33 import std.math; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
34 import std.stdio; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
35 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
36 import core.stdc.string : strlen; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
37 } |
0 | 38 |
39 // x and y run right and up respectively | |
41 | 40 // |
41 // Model units are millimetres. | |
42 // | |
48 | 43 // _zoom -> pixels-per-model-unit |
44 // _viewSize -> size of view window in pixels | |
45 // _viewCentre -> location in model corresponding to centre of view | |
46 // _canvasBounds -> size of the virtual canvas in model coordinates | |
41 | 47 // |
48 // User operations: | |
49 // pan (middle click and drag) | |
50 // zoom about a point (hold control and move scroll wheel) | |
51 // resize the widget | |
0 | 52 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
53 final class Canvas : Table, IViewport { |
57 | 54 this(in Layer[] layers, IEventHandler eventHandler, IGrid grid, in double ppi) { |
0 | 55 super(3, 3, 0); |
56 | |
48 | 57 _damage = Rectangle.DEFAULT; |
17 | 58 |
48 | 59 _layers = layers.dup; |
60 _eventHandler = eventHandler; | |
61 _grid = grid; | |
62 _ppi = ppi; | |
0 | 63 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
64 /* |
62 | 65 trace("Layer bounds: %s", layerBounds); |
66 trace("Canvas bounds: %s", _canvasBounds); | |
67 trace("View centre: %s", _viewCentre); | |
48 | 68 */ |
0 | 69 |
13 | 70 // Create our child widgets and register callbacks |
71 | |
48 | 72 _hRuler = new HRuler; |
73 attach(_hRuler, | |
0 | 74 1, 2, |
75 0, 1, | |
76 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | |
77 0, 0); | |
48 | 78 _hRuler.setMetric(MetricType.PIXELS); |
0 | 79 |
48 | 80 _vRuler = new VRuler; |
81 attach(_vRuler, | |
0 | 82 0, 1, |
83 1, 2, | |
84 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, | |
85 0, 0); | |
48 | 86 _vRuler.setMetric(MetricType.PIXELS); |
0 | 87 |
48 | 88 _drawingArea = new DrawingArea; |
89 _drawingArea.addOnRealize(&onRealize); | |
90 _drawingArea.addOnConfigure(&onConfigure); | |
91 _drawingArea.addOnExpose(&onExpose); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
92 _drawingArea.addOnButtonPress(&onButtonPress); // FIXME merge delegate with next |
48 | 93 _drawingArea.addOnButtonRelease(&onButtonRelease); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
94 _drawingArea.addOnKeyPress(&onKeyPressEvent); // FIXME merge delegate with next |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
95 _drawingArea.addOnKeyRelease(&onKeyReleaseEvent); |
48 | 96 _drawingArea.addOnMotionNotify(&onMotionNotify); |
97 _drawingArea.addOnScroll(&onScroll); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
98 _drawingArea.addOnEnterNotify(&onEnterNotify); // FIXME merge delegate with next |
48 | 99 _drawingArea.addOnLeaveNotify(&onLeaveNotify); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
100 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
101 _drawingArea.addOnFocusIn(&onFocusIn); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
102 _drawingArea.addOnFocusOut(&onFocusOut); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
103 _drawingArea.addOnMoveFocus(&onMoveFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
104 _drawingArea.addOnGrabBroken(&onGrabBroken); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
105 _drawingArea.addOnGrabFocus(&onGrabFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
106 _drawingArea.addOnGrabNotify(&onGrabNotify); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
107 // addOnPopupMenu |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
108 // addOnQueryTooltip |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
109 // addOnSelection* |
48 | 110 _drawingArea.setEvents(EventMask.EXPOSURE_MASK | |
20 | 111 EventMask.POINTER_MOTION_MASK | |
112 EventMask.POINTER_MOTION_HINT_MASK | | |
113 EventMask.BUTTON_MOTION_MASK | | |
114 EventMask.BUTTON_PRESS_MASK | | |
115 EventMask.BUTTON_RELEASE_MASK | | |
116 EventMask.KEY_PRESS_MASK | | |
117 EventMask.KEY_RELEASE_MASK | | |
118 EventMask.ENTER_NOTIFY_MASK | | |
119 EventMask.LEAVE_NOTIFY_MASK | | |
120 EventMask.FOCUS_CHANGE_MASK | | |
121 EventMask.SCROLL_MASK); | |
122 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
123 _drawingArea.setCanFocus(true); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
124 |
48 | 125 attach(_drawingArea, |
0 | 126 1, 2, |
127 1, 2, | |
128 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, | |
129 0, 0); | |
130 | |
131 // value, lower, upper, step-inc, page-inc, page-size | |
132 // Give the adjustments dummy values until we receive a configure | |
48 | 133 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
134 _hAdjustment.addOnValueChanged(&onValueChanged); | |
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); |
145 _vAdjustment.addOnValueChanged(&onValueChanged); | |
146 _vScrollbar = new VScrollbar(_vAdjustment); | |
147 _vScrollbar.setInverted(true); | |
148 attach(_vScrollbar, | |
0 | 149 2, 3, |
150 1, 2, | |
151 AttachOptions.SHRINK, | |
152 AttachOptions.FILL | AttachOptions.EXPAND, | |
153 0, 0); | |
154 } | |
155 | |
62 | 156 // IViewport overrides: |
157 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
158 void zoomRelative(in Point pixelDatum, in double factor) { |
0 | 159 // Work out pixel distance from current centre to datum, |
160 // Do the zoom, then work out the new centre that keeps the | |
161 // pixel distance the same | |
162 | |
48 | 163 Point oldModelDatum = pixelToModel(pixelDatum); |
164 Vector pixelDistance = modelToPixel(oldModelDatum - _viewCentre); | |
165 _zoom = clampZoom(factor * _zoom); | |
166 _viewCentre = oldModelDatum - pixelToModel(pixelDistance); | |
0 | 167 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
168 consolidateBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
169 |
48 | 170 updateAdjustments; |
171 updateRulers; | |
172 _grid.zoomChanged(_zoom); | |
13 | 173 queueDraw; |
0 | 174 } |
175 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
176 void panRelative(in Vector pixelDisplacement) { |
48 | 177 _viewCentre = _viewCentre + pixelToModel(pixelDisplacement); |
0 | 178 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
179 consolidateBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
180 |
48 | 181 updateAdjustments; |
182 updateRulers; | |
13 | 183 queueDraw; |
184 } | |
185 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
186 void setCursor(in Cursor cursor) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
187 CursorType cursorType; |
27 | 188 |
189 switch (cursor) { | |
190 case Cursor.DEFAULT: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
191 cursorType = CursorType.ARROW; |
27 | 192 break; |
193 case Cursor.HAND: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
194 cursorType = CursorType.HAND1; |
27 | 195 break; |
196 case Cursor.CROSSHAIR: | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
197 cursorType = CursorType.CROSSHAIR; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
198 break; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
199 case Cursor.PENCIL: |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
200 cursorType = CursorType.PENCIL; |
27 | 201 break; |
40 | 202 default: |
203 assert(0); | |
27 | 204 } |
205 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
206 _drawingArea.setCursor(new gdk.Cursor.Cursor(cursorType)); |
27 | 207 } |
208 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
209 void damageModel(in Rectangle area) { |
48 | 210 _damage = _damage | modelToPixel(area); |
17 | 211 } |
212 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
213 void damagePixel(in Rectangle area) { |
48 | 214 _damage = _damage | area; |
18 | 215 } |
216 | |
0 | 217 private { |
218 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
219 void initialiseBounds() { |
48 | 220 Rectangle layerBounds = Rectangle.DEFAULT; |
41 | 221 |
48 | 222 foreach (ref layer; _layers) { |
223 layerBounds = layerBounds | layer.bounds; | |
41 | 224 } |
225 | |
48 | 226 assert(layerBounds.valid); |
41 | 227 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
228 // FIXME use a function that grows a rectangle about its centre |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
229 // and change 2.0 to a class-level constant |
48 | 230 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size); |
41 | 231 |
62 | 232 // |
233 | |
234 _zoom = 0.25 * _ppi / MM_PER_INCH; | |
235 | |
236 _canvasBounds = paddedLayerBounds; | |
237 _viewCentre = _canvasBounds.centre; | |
238 | |
239 _grid.zoomChanged(_zoom); | |
240 | |
241 updateAdjustments; | |
242 updateRulers; | |
243 } | |
244 | |
245 void consolidateBounds() { | |
246 Rectangle layerBounds = Rectangle.DEFAULT; | |
247 | |
248 foreach (ref layer; _layers) { | |
249 layerBounds = layerBounds | layer.bounds; | |
250 } | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
251 |
62 | 252 assert(layerBounds.valid); |
253 | |
254 Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size); | |
255 | |
256 Vector z = _viewSize / _zoom; | |
257 Rectangle r = Rectangle(_viewCentre - z / 2.0, z); | |
258 _canvasBounds = r | paddedLayerBounds; | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
259 |
62 | 260 updateAdjustments; |
261 updateRulers; | |
262 } | |
35 | 263 |
62 | 264 bool onConfigure(GdkEventConfigure * event, Widget widget) { |
265 assert(widget is _drawingArea); | |
266 | |
267 _viewSize = Vector(cast(double)event.width, cast(double)event.height); | |
268 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
269 if (!_boundsValid) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
270 initialiseBounds; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
271 _boundsValid = true; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
272 } |
41 | 273 else { |
62 | 274 consolidateBounds; |
41 | 275 } |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
276 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
277 return true; |
0 | 278 } |
279 | |
48 | 280 bool onExpose(GdkEventExpose * event, Widget widget) { |
281 assert(widget is _drawingArea); | |
0 | 282 |
48 | 283 Drawable dr = _drawingArea.getWindow; |
0 | 284 |
285 int width, height; | |
286 dr.getSize(width, height); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
287 //trace("Got expose %dx%d\n", width, height); |
0 | 288 |
48 | 289 scope modelCr = new Context(dr); |
290 scope pixelCr = new Context(dr); | |
12 | 291 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
292 Rectangle pixelDamage = |
11 | 293 event is null ? |
48 | 294 Rectangle(Point(0.0, 0.0), _viewSize) : |
295 Rectangle(Point(cast(double)event.area.x, _viewSize.y - cast(double)(event.area.y + event.area.height)), | |
11 | 296 Vector(cast(double)event.area.width, cast(double)event.area.height)); |
0 | 297 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
298 Rectangle modelDamage = pixelToModel(pixelDamage); |
19 | 299 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
300 //trace("Pixel damage: %s, model damage: %s", pixelDamage, modelDamage); |
19 | 301 |
48 | 302 modelCr.save; pixelCr.save; { |
19 | 303 // Setup model context and clip |
12 | 304 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
305 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
306 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct; |
12 | 307 |
48 | 308 modelCr.scale(_zoom, -_zoom); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
309 modelCr.translate(-gtk_adjustment_get_value(hGtkAdjustment), |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
310 -gtk_adjustment_get_value(vGtkAdjustment) - gtk_adjustment_get_page_size(vGtkAdjustment)); |
0 | 311 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
312 rectangle(modelCr, modelDamage); |
48 | 313 modelCr.clip; |
19 | 314 |
315 // Setup pixel context and clip | |
12 | 316 |
48 | 317 pixelCr.translate(0.0, _viewSize.y); |
318 pixelCr.scale(1.0, -1.0); | |
19 | 319 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
320 rectangle(pixelCr, pixelDamage); |
48 | 321 pixelCr.clip; |
12 | 322 |
323 // Fill the background | |
324 | |
48 | 325 pixelCr.save; { |
11 | 326 // Make the window light grey |
48 | 327 pixelCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
328 rectangle(pixelCr, pixelDamage); |
48 | 329 pixelCr.fill; |
330 } pixelCr.restore; | |
12 | 331 |
332 // Draw each layer | |
0 | 333 |
48 | 334 foreach(ref layer; _layers) { |
335 modelCr.save; pixelCr.save; { | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
336 layer.draw(this, pixelDamage, pixelCr, modelDamage, modelCr); |
48 | 337 } pixelCr.restore; modelCr.restore; |
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; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
396 //uint isModifier : 1; |
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 |
0 | 568 void onValueChanged(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 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
572 Point viewLeftTop = Point(gtk_adjustment_get_value(hGtkAdjustment), |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
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 |
48 | 577 //writefln("%s", viewLeftBottom); |
578 _viewCentre = viewLeftTop + modelSize / 2.0; | |
579 //writefln("onValueChanged _viewCentre: %s", _viewCentre); | |
0 | 580 |
48 | 581 updateRulers; |
0 | 582 |
13 | 583 queueDraw; |
0 | 584 } |
585 | |
48 | 586 void updateRulers() { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
587 immutable Vector modelSize = pixelToModel(_viewSize); |
0 | 588 |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
589 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
590 immutable Point viewRightTop = _viewCentre + modelSize / 2.0; |
0 | 591 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
592 // Define these just to obtain the position |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
593 // below and we can preserve it |
48 | 594 double lower, upper, position, maxSize; |
12 | 595 |
48 | 596 _hRuler.getRange(lower, upper, position, maxSize); |
597 _hRuler.setRange(viewLeftBottom.x, | |
598 viewRightTop.x, | |
12 | 599 position, |
48 | 600 _zoom * 50.0); |
12 | 601 |
48 | 602 _vRuler.getRange(lower, upper, position, maxSize); |
603 _vRuler.setRange(viewRightTop.y, | |
604 viewLeftBottom.y, | |
14 | 605 position, |
48 | 606 _zoom * 50.0); |
0 | 607 } |
608 | |
48 | 609 void updateAdjustments() { |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
610 immutable Vector modelSize = pixelToModel(_viewSize); |
0 | 611 |
58
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
612 immutable Point viewLeftBottom = _viewCentre - modelSize / 2.0; |
c63719604adb
Beginnings of creating a rectangle...
"David Bryant <bagnose@gmail.com>"
parents:
57
diff
changeset
|
613 immutable Point viewRightTop = _viewCentre + modelSize / 2.0; |
0 | 614 |
615 // Adjust the canvas size if necessary | |
48 | 616 _canvasBounds = Rectangle(minExtents(_canvasBounds.minCorner, viewLeftBottom), |
617 maxExtents(_canvasBounds.maxCorner, viewRightTop)); | |
0 | 618 |
619 // Update the adjustments | |
620 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
621 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
622 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct; |
0 | 623 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
624 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
|
625 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
|
626 gtk_adjustment_set_value(hGtkAdjustment, viewLeftBottom.x); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
627 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
|
628 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
|
629 gtk_adjustment_set_page_size(hGtkAdjustment, modelSize.x); |
0 | 630 |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
631 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
|
632 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
|
633 gtk_adjustment_set_value(vGtkAdjustment, viewLeftBottom.y); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
634 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
|
635 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
|
636 gtk_adjustment_set_page_size(vGtkAdjustment, modelSize.y); |
0 | 637 |
48 | 638 _hAdjustment.changed; |
639 _hAdjustment.valueChanged; | |
640 _vAdjustment.changed; | |
641 _vAdjustment.valueChanged; | |
0 | 642 } |
643 | |
48 | 644 void fixDamage() { |
645 if (_damage.valid) { | |
17 | 646 int x, y, w, h; |
48 | 647 _damage.getQuantised(x, y, w, h); |
648 _drawingArea.queueDrawArea(x, cast(int)_viewSize.y - (y + h), w, h); | |
649 _damage = Rectangle.DEFAULT; | |
17 | 650 } |
651 } | |
652 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
653 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
|
654 |
48 | 655 Point modelToPixel(in Point model) const { |
656 return Point.DEFAULT + _viewSize / 2.0 + _zoom * (model - _viewCentre); | |
27 | 657 } |
658 | |
48 | 659 Point pixelToModel(in Point pixel) const { |
660 return _viewCentre + (pixel - _viewSize / 2.0 - Point.DEFAULT) / _zoom; | |
27 | 661 } |
662 | |
48 | 663 Vector modelToPixel(in Vector model) const { |
664 return _zoom * model; | |
27 | 665 } |
666 | |
48 | 667 Vector pixelToModel(in Vector pixel) const { |
668 return pixel / _zoom; | |
27 | 669 } |
670 | |
48 | 671 Rectangle modelToPixel(in Rectangle model) const { |
672 return Rectangle(modelToPixel(model.position), modelToPixel(model.size)); | |
27 | 673 } |
674 | |
48 | 675 Rectangle pixelToModel(in Rectangle model) const { |
676 return Rectangle(pixelToModel(model.position), pixelToModel(model.size)); | |
27 | 677 } |
678 | |
48 | 679 void onRealize(Widget widget) { |
680 assert(widget is _drawingArea); | |
27 | 681 //writefln("Got realize\n"); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
682 _drawingArea.grabFocus(); |
27 | 683 } |
684 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
685 bool _boundsValid; |
48 | 686 Rectangle _damage; // pixels |
0 | 687 |
688 // Model units are in millimetres | |
689 // Screen units are in pixels | |
48 | 690 double _zoom; // pixels-per-model-unit |
691 Vector _viewSize; // pixel: size of view window in pixels | |
692 Point _viewCentre; // model: where in the model is the centre of our view | |
693 Rectangle _canvasBounds; // model: | |
0 | 694 |
10 | 695 // Child widgets: |
48 | 696 HRuler _hRuler; |
697 VRuler _vRuler; | |
698 DrawingArea _drawingArea; | |
699 Adjustment _hAdjustment; | |
700 HScrollbar _hScrollbar; | |
701 Adjustment _vAdjustment; | |
702 VScrollbar _vScrollbar; | |
11 | 703 |
48 | 704 Layer[] _layers; |
57 | 705 IEventHandler _eventHandler; |
706 IGrid _grid; | |
48 | 707 double _ppi; |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
708 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
709 static immutable MM_PER_INCH = 25.4; |
0 | 710 } |
711 } |