Mercurial > projects > doodle
annotate doodle/gtk/cairo_canvas.d @ 136:752676232e4b
Port to GtkD-2.0 (gtk+3)
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Wed, 26 Sep 2012 17:36:31 +0930 |
parents | bc5baa585b32 |
children |
rev | line source |
---|---|
83
06b4504cbcb0
Checkpoint of trying to get a different renderer going (OpenGL)
daveb
parents:
82
diff
changeset
|
1 module doodle.gtk.cairo_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; |
72
5cc2de64f6d0
Cautious Saturday night commits
"David Bryant <bagnose@gmail.com>"
parents:
71
diff
changeset
|
5 import doodle.gtk.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; |
81 | 10 import doodle.tk.screen_model; |
75
3cac0ee8ca35
Ok, things are seem on-track again
"David Bryant <bagnose@gmail.com>"
parents:
74
diff
changeset
|
11 import doodle.dia.layer_stack; |
84 | 12 import doodle.gtk.cairo_renderer; |
0 | 13 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
14 import cairo.Surface; |
81 | 15 import cairo.Context; |
16
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; |
136 | 20 import gtk.Label; |
21 alias gtk.Label.Label HRuler; | |
22 alias gtk.Label.Label VRuler; | |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
23 import gtk.Range; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
24 import gtk.HScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
25 import gtk.VScrollbar; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
26 import gtk.DrawingArea; |
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
27 import gtk.Adjustment; |
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; |
136 | 35 import core.thread; |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
36 } |
0 | 37 |
136 | 38 // Bring doodle.tk.geometry.Rectangle into local namespace so we |
39 // get it instead of gdk.Rectangle.Rectangle | |
40 alias doodle.tk.geometry.Rectangle Rectangle; | |
41 | |
132 | 42 final class CairoCanvas : Table, IViewport { |
103 | 43 static this() { |
44 _cursors = [ | |
45 Cursor.DEFAULT : CursorType.ARROW, | |
46 Cursor.HAND : CursorType.HAND1, | |
47 Cursor.CROSSHAIR : CursorType.CROSSHAIR, | |
48 Cursor.PENCIL : CursorType.PENCIL | |
49 ]; | |
50 } | |
51 | |
129 | 52 this(Layer[] layers, IEventHandler eventHandler, IGrid grid, in double pixelsPerMillimetre) { |
0 | 53 super(3, 3, 0); |
54 | |
48 | 55 _eventHandler = eventHandler; |
56 _grid = grid; | |
69 | 57 _pixelsPerMillimetre = pixelsPerMillimetre; |
0 | 58 |
79 | 59 _layerStack = new LayerStack(layers); |
60 | |
13 | 61 // Create our child widgets and register callbacks |
62 | |
136 | 63 _hRuler = new HRuler("horizontal"); |
48 | 64 attach(_hRuler, |
0 | 65 1, 2, |
66 0, 1, | |
67 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK, | |
68 0, 0); | |
136 | 69 //_hRuler.setMetric(MetricType.PIXELS); |
0 | 70 |
136 | 71 _vRuler = new VRuler("vertical"); |
48 | 72 attach(_vRuler, |
0 | 73 0, 1, |
74 1, 2, | |
75 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, | |
76 0, 0); | |
136 | 77 //_vRuler.setMetric(MetricType.PIXELS); |
0 | 78 |
48 | 79 _drawingArea = new DrawingArea; |
80 _drawingArea.addOnRealize(&onRealize); | |
81 _drawingArea.addOnConfigure(&onConfigure); | |
136 | 82 _drawingArea.addOnDraw(&onDraw); |
81 | 83 _drawingArea.addOnButtonPress(&onButtonPress); |
48 | 84 _drawingArea.addOnButtonRelease(&onButtonRelease); |
81 | 85 _drawingArea.addOnKeyPress(&onKeyPressEvent); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
86 _drawingArea.addOnKeyRelease(&onKeyReleaseEvent); |
48 | 87 _drawingArea.addOnMotionNotify(&onMotionNotify); |
88 _drawingArea.addOnScroll(&onScroll); | |
81 | 89 _drawingArea.addOnEnterNotify(&onEnterNotify); |
48 | 90 _drawingArea.addOnLeaveNotify(&onLeaveNotify); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
91 |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
92 _drawingArea.addOnFocusIn(&onFocusIn); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
93 _drawingArea.addOnFocusOut(&onFocusOut); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
94 _drawingArea.addOnMoveFocus(&onMoveFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
95 _drawingArea.addOnGrabBroken(&onGrabBroken); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
96 _drawingArea.addOnGrabFocus(&onGrabFocus); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
97 _drawingArea.addOnGrabNotify(&onGrabNotify); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
98 // addOnPopupMenu |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
99 // addOnQueryTooltip |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
100 // addOnSelection* |
136 | 101 _drawingArea.setEvents(EventMask.POINTER_MOTION_MASK | |
20 | 102 EventMask.POINTER_MOTION_HINT_MASK | |
103 EventMask.BUTTON_MOTION_MASK | | |
104 EventMask.BUTTON_PRESS_MASK | | |
105 EventMask.BUTTON_RELEASE_MASK | | |
106 EventMask.KEY_PRESS_MASK | | |
107 EventMask.KEY_RELEASE_MASK | | |
108 EventMask.ENTER_NOTIFY_MASK | | |
109 EventMask.LEAVE_NOTIFY_MASK | | |
110 EventMask.FOCUS_CHANGE_MASK | | |
111 EventMask.SCROLL_MASK); | |
112 | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
113 _drawingArea.setCanFocus(true); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
114 |
48 | 115 attach(_drawingArea, |
0 | 116 1, 2, |
117 1, 2, | |
118 AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.FILL | AttachOptions.EXPAND, | |
119 0, 0); | |
120 | |
121 // value, lower, upper, step-inc, page-inc, page-size | |
122 // Give the adjustments dummy values until we receive a configure | |
48 | 123 _hAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
67 | 124 _hAdjustment.addOnValueChanged(&onAdjustmentValueChanged); |
48 | 125 _hScrollbar = new HScrollbar(_hAdjustment); |
126 _hScrollbar.setInverted(false); | |
127 attach(_hScrollbar, | |
0 | 128 1, 2, |
129 2, 3, | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
130 AttachOptions.FILL | AttachOptions.EXPAND, |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
131 AttachOptions.SHRINK, |
0 | 132 0, 0); |
133 | |
48 | 134 _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5); |
67 | 135 _vAdjustment.addOnValueChanged(&onAdjustmentValueChanged); |
48 | 136 _vScrollbar = new VScrollbar(_vAdjustment); |
137 _vScrollbar.setInverted(true); | |
138 attach(_vScrollbar, | |
0 | 139 2, 3, |
140 1, 2, | |
141 AttachOptions.SHRINK, | |
142 AttachOptions.FILL | AttachOptions.EXPAND, | |
143 0, 0); | |
144 } | |
145 | |
68 | 146 protected { // XXX the compiler complains about unimplemented methods if this is private |
62 | 147 |
68 | 148 // IViewport overrides: |
0 | 149 |
92 | 150 void zoomRelative(in double factor, in Point screenDatum) { |
77 | 151 _screenModel.zoomRelative(factor, screenDatum); |
132 | 152 consolidateBounds(); |
153 updateAdjustments(); | |
154 updateRulers(); | |
77 | 155 _grid.zoomChanged(_screenModel.zoom); |
132 | 156 queueDraw(); |
27 | 157 } |
158 | |
72
5cc2de64f6d0
Cautious Saturday night commits
"David Bryant <bagnose@gmail.com>"
parents:
71
diff
changeset
|
159 void panRelative(in Vector screenDisplacement) { |
77 | 160 _screenModel.panRelativeScreen(screenDisplacement); |
132 | 161 consolidateBounds(); |
162 updateAdjustments(); | |
163 updateRulers(); | |
164 queueDraw(); | |
68 | 165 } |
166 | |
167 void setCursor(in Cursor cursor) { | |
79 | 168 _drawingArea.setCursor(new gdk.Cursor.Cursor(_cursors[cursor])); |
68 | 169 } |
170 | |
171 void damageModel(in Rectangle area) { | |
136 | 172 _tmpDamageScreen = _tmpDamageScreen | _screenModel.modelToScreen(area); |
68 | 173 } |
174 | |
77 | 175 void damageScreen(in Rectangle area) { |
136 | 176 _tmpDamageScreen = _tmpDamageScreen | area; |
68 | 177 } |
18 | 178 } |
179 | |
0 | 180 private { |
181 | |
62 | 182 void consolidateBounds() { |
79 | 183 Rectangle layerBounds = _layerStack.bounds; |
184 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); | |
77 | 185 _screenModel.consolidateCanvasBounds(paddedLayerBounds); |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
186 |
132 | 187 updateAdjustments(); |
188 updateRulers(); | |
62 | 189 } |
35 | 190 |
136 | 191 bool onConfigure(gdk.Event.Event event, Widget widget) { |
62 | 192 assert(widget is _drawingArea); |
193 | |
136 | 194 //_surface = ImageSurface.create(CairoFormat.ARGB32, event.configure().width, event.configure().height); |
195 | |
196 auto viewBoundsScreen = Rectangle(Point(0.0, 0.0), Vector(cast(double)event.configure().width, cast(double)event.configure().height)); | |
91 | 197 |
198 if (_screenModel is null) { | |
199 Rectangle layerBounds = _layerStack.bounds; | |
200 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); | |
201 _screenModel = new ScreenModel(0.25 * _pixelsPerMillimetre, paddedLayerBounds, viewBoundsScreen); | |
202 _grid.zoomChanged(_screenModel.zoom); | |
203 | |
132 | 204 updateAdjustments(); |
205 updateRulers(); | |
91 | 206 } |
207 else { | |
208 _screenModel.setViewBoundsScreen(viewBoundsScreen); | |
132 | 209 consolidateBounds(); |
91 | 210 } |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
211 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
212 return true; |
0 | 213 } |
214 | |
136 | 215 bool onDraw(Context context, Widget widget) { |
48 | 216 assert(widget is _drawingArea); |
0 | 217 |
136 | 218 double x0, y0, x1, y1; |
219 context.clipExtents(x0, y0, x1, y1); | |
220 Rectangle screenDamage = | |
221 Rectangle(_screenModel.viewBoundsScreen.position + | |
222 Vector(x0, _screenModel.viewBoundsScreen.h - y1), | |
223 Vector(x1 - x0, y1 - y0)); | |
224 assert(screenDamage.valid); | |
12 | 225 |
136 | 226 writefln("External screen damage: %s", screenDamage); |
227 writefln("Internal screen damage: %s", _internalDamageScreen); | |
228 assert(screenDamage.contains(_internalDamageScreen)); | |
0 | 229 |
77 | 230 Rectangle modelDamage = _screenModel.screenToModel(screenDamage); |
19 | 231 |
136 | 232 scope Context modelCr = Context.create(context.getTarget()); |
233 scope Context screenCr = Context.create(context.getTarget()); | |
234 | |
132 | 235 modelCr.save(); screenCr.save(); { |
67 | 236 { |
237 // Setup model context and clip | |
77 | 238 modelCr.translate(0.0, _screenModel.viewBoundsScreen.h); |
239 modelCr.scale(_screenModel.zoom, -_screenModel.zoom); | |
12 | 240 |
77 | 241 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); |
67 | 242 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y); |
0 | 243 |
81 | 244 modelCr.rectangle(modelDamage.x0, modelDamage.y0, modelDamage.w, modelDamage.h); |
132 | 245 modelCr.clip(); |
67 | 246 } |
12 | 247 |
67 | 248 { |
77 | 249 // Setup screen context and clip |
250 screenCr.translate(0.0, _screenModel.viewBoundsScreen.h); | |
251 screenCr.scale(1.0, -1.0); | |
19 | 252 |
81 | 253 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); |
132 | 254 screenCr.clip(); |
67 | 255 } |
12 | 256 |
132 | 257 screenCr.save(); { |
67 | 258 // Fill the background with light grey |
77 | 259 screenCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); |
81 | 260 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); |
132 | 261 screenCr.fill(); |
262 } screenCr.restore(); | |
12 | 263 |
84 | 264 _layerStack.draw(screenDamage, new CairoRenderer(screenCr), |
136 | 265 modelDamage, new CairoRenderer(modelCr), |
89 | 266 _screenModel); |
136 | 267 } screenCr.restore(); screenCr.restore(); |
268 | |
269 _internalDamageScreen = Rectangle(); | |
0 | 270 |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
271 return true; |
0 | 272 } |
273 | |
136 | 274 bool onButtonPress(gdk.Event.Event event, Widget widget) { |
48 | 275 assert(widget is _drawingArea); |
136 | 276 _eventHandler.handleButtonPress(this, makeButtonEvent(event.button(), _screenModel)); |
277 reportDamage(); | |
5 | 278 return true; |
279 } | |
280 | |
136 | 281 bool onButtonRelease(gdk.Event.Event event, Widget widget) { |
48 | 282 assert(widget is _drawingArea); |
136 | 283 _eventHandler.handleButtonRelease(this, makeButtonEvent(event.button(), _screenModel)); |
284 reportDamage(); | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
285 return true; |
0 | 286 } |
287 | |
136 | 288 bool onKeyPressEvent(gdk.Event.Event event, Widget widget) { |
48 | 289 assert(widget is _drawingArea); |
136 | 290 _eventHandler.handleKeyPress(this, makeKeyEvent(event.key(), _screenModel)); |
291 reportDamage(); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
292 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
293 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
294 |
136 | 295 bool onKeyReleaseEvent(gdk.Event.Event event, Widget widget) { |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
296 assert(widget is _drawingArea); |
136 | 297 _eventHandler.handleKeyRelease(this, makeKeyEvent(event.key(), _screenModel)); |
298 reportDamage(); | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
299 return true; |
0 | 300 } |
301 | |
136 | 302 bool onMotionNotify(gdk.Event.Event event, Widget widget) { |
48 | 303 assert(widget is _drawingArea); |
73 | 304 |
136 | 305 if (event.motion().isHint) { |
306 int x, y; | |
307 GdkModifierType mask; | |
308 _drawingArea.getWindow().getPointer(x, y, mask); | |
309 _eventHandler.handleMotion(this, makeMotionEventHint(x, y, mask, _screenModel)); | |
310 } | |
311 else { | |
312 _eventHandler.handleMotion(this, makeMotionEvent(event.motion(), _screenModel)); | |
313 } | |
314 | |
315 reportDamage(); | |
316 | |
77 | 317 // Pass the events on to the rulers so that they update |
136 | 318 _hRuler.event(event); |
319 _vRuler.event(event); | |
0 | 320 |
136 | 321 // Simulate delay in case we were slow to handle the event. |
322 // This is really only relevant if we were to do the drawing from inside | |
323 // the handler. ??? | |
324 Thread.sleep(dur!("msecs")(50)); | |
325 | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
326 return true; |
0 | 327 } |
328 | |
136 | 329 bool onScroll(gdk.Event.Event event, Widget widget) { |
48 | 330 assert(widget is _drawingArea); |
136 | 331 _eventHandler.handleScroll(this, makeScrollEvent(event.scroll(), _screenModel)); |
332 reportDamage(); | |
2
d6f44347373d
* Switched over to geometry done with structs instead of classes.
David Bryant <daveb@acres.com.au>
parents:
0
diff
changeset
|
333 return true; |
0 | 334 } |
335 | |
136 | 336 bool onEnterNotify(gdk.Event.Event event, Widget widget) { |
48 | 337 assert(widget is _drawingArea); |
136 | 338 _eventHandler.handleEnter(this, makeCrossingEvent(event.crossing(), _screenModel)); |
339 reportDamage(); | |
20 | 340 return true; |
341 } | |
342 | |
136 | 343 bool onLeaveNotify(gdk.Event.Event event, Widget widget) { |
48 | 344 assert(widget is _drawingArea); |
136 | 345 _eventHandler.handleLeave(this, makeCrossingEvent(event.crossing(), _screenModel)); |
346 reportDamage(); | |
20 | 347 return true; |
348 } | |
349 | |
136 | 350 bool onFocusIn(gdk.Event.Event event, Widget widget) { |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
351 trace("onFocusIn"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
352 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
353 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
354 |
136 | 355 bool onFocusOut(gdk.Event.Event event, Widget widget) { |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
356 trace("onFocusOut"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
357 return true; |
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 void onMoveFocus(GtkDirectionType direction, Widget widget) { |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
361 trace("onMoveFocus"); |
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 |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
364 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
|
365 trace("onGrabBroken"); |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
366 return true; |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
367 } |
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 void onGrabFocus(Widget widget) { |
64
eb5436b47d13
Implemented crossing events
"David Bryant <bagnose@gmail.com>"
parents:
63
diff
changeset
|
370 //trace("onGrabFocus"); |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
371 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
372 |
88 | 373 void onGrabNotify(gboolean what, Widget widget) { |
374 trace("onGrabNotify: %s", what); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
375 } |
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
376 |
67 | 377 void onAdjustmentValueChanged(Adjustment adjustment) { |
132 | 378 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct(); |
379 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct(); | |
0 | 380 |
77 | 381 Point oldViewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); |
71
0f7cf6c6f206
Reimplemented gtk.canvas in terms of tk.pixel_model but
"David Bryant <bagnose@gmail.com>"
parents:
70
diff
changeset
|
382 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
|
383 gtk_adjustment_get_value(vGtkAdjustment)); |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
384 |
77 | 385 _screenModel.panRelativeModel(newViewLeftBottom - oldViewLeftBottom); |
0 | 386 |
132 | 387 updateRulers(); |
388 queueDraw(); | |
0 | 389 } |
390 | |
48 | 391 void updateRulers() { |
79 | 392 immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner0); |
77 | 393 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); |
0 | 394 |
16
9e63308b749c
* Fix up public/private includes
David Bryant <daveb@acres.com.au>
parents:
15
diff
changeset
|
395 // Define these just to obtain the position |
81 | 396 // below so we can preserve it |
48 | 397 double lower, upper, position, maxSize; |
12 | 398 |
136 | 399 /+ |
48 | 400 _hRuler.getRange(lower, upper, position, maxSize); |
401 _hRuler.setRange(viewLeftBottom.x, | |
402 viewRightTop.x, | |
12 | 403 position, |
77 | 404 _screenModel.zoom * 50.0); |
12 | 405 |
48 | 406 _vRuler.getRange(lower, upper, position, maxSize); |
407 _vRuler.setRange(viewRightTop.y, | |
408 viewLeftBottom.y, | |
14 | 409 position, |
77 | 410 _screenModel.zoom * 50.0); |
136 | 411 +/ |
0 | 412 } |
413 | |
48 | 414 void updateAdjustments() { |
77 | 415 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); |
416 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); | |
0 | 417 |
79 | 418 // Adjust the canvas size if necessary |
77 | 419 _screenModel.canvasAccommodate(Rectangle(viewLeftBottom, viewRightTop)); |
71
0f7cf6c6f206
Reimplemented gtk.canvas in terms of tk.pixel_model but
"David Bryant <bagnose@gmail.com>"
parents:
70
diff
changeset
|
420 |
79 | 421 Rectangle viewBoundsModel = _screenModel.viewBoundsModel; |
0 | 422 |
423 // Update the adjustments | |
88 | 424 _hAdjustment.configure(viewLeftBottom.x, |
425 _screenModel.canvasBoundsModel.x0, | |
426 _screenModel.canvasBoundsModel.x1, | |
427 _screenModel.canvasBoundsModel.w / 16.0, | |
428 _screenModel.canvasBoundsModel.w / 4.0, | |
429 _screenModel.viewBoundsModel.w); | |
430 _vAdjustment.configure(viewLeftBottom.y, | |
431 _screenModel.canvasBoundsModel.y0, | |
432 _screenModel.canvasBoundsModel.y1, | |
433 _screenModel.canvasBoundsModel.h / 16.0, | |
434 _screenModel.canvasBoundsModel.h / 4.0, | |
435 _screenModel.viewBoundsModel.h); | |
0 | 436 } |
437 | |
136 | 438 void reportDamage() { |
439 if (_tmpDamageScreen.valid) { | |
17 | 440 int x, y, w, h; |
136 | 441 _tmpDamageScreen.getQuantised(x, y, w, h); |
77 | 442 _drawingArea.queueDrawArea(x, cast(int)_screenModel.viewBoundsScreen.h - (y + h), w, h); |
136 | 443 _internalDamageScreen = _internalDamageScreen | _tmpDamageScreen; |
444 _tmpDamageScreen = Rectangle(); | |
17 | 445 } |
136 | 446 assert(!_tmpDamageScreen.valid); |
17 | 447 } |
448 | |
48 | 449 void onRealize(Widget widget) { |
450 assert(widget is _drawingArea); | |
63
20d6327c4a75
Event progress. Got key press/release working and panning via keyboard.
daveb
parents:
62
diff
changeset
|
451 _drawingArea.grabFocus(); |
27 | 452 } |
453 | |
73 | 454 IEventHandler _eventHandler; |
455 IGrid _grid; | |
456 double _pixelsPerMillimetre; | |
79 | 457 LayerStack _layerStack; |
458 | |
10 | 459 // Child widgets: |
73 | 460 HRuler _hRuler; |
461 VRuler _vRuler; | |
462 DrawingArea _drawingArea; | |
463 Adjustment _hAdjustment; | |
464 HScrollbar _hScrollbar; | |
465 Adjustment _vAdjustment; | |
466 VScrollbar _vScrollbar; | |
11 | 467 |
136 | 468 Rectangle _tmpDamageScreen; // accumulated from damageModel and damageScreen calls |
469 Rectangle _internalDamageScreen; // aggregated from _tmpDamageScreen in reportDamage calls | |
77 | 470 ScreenModel _screenModel; |
81 | 471 |
103 | 472 static immutable CursorType[Cursor] _cursors; |
0 | 473 } |
474 } |