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