Mercurial > projects > doodle
comparison doodle/gtk/cairo_canvas.d @ 132:bc5baa585b32
Updated to dmd 2.060
author | David Bryant <bagnose@gmail.com> |
---|---|
date | Thu, 02 Aug 2012 15:32:43 +0930 |
parents | 10ad5417bf07 |
children | 752676232e4b |
comparison
equal
deleted
inserted
replaced
130:1bc3475624d3 | 132:bc5baa585b32 |
---|---|
33 | 33 |
34 import std.math; | 34 import std.math; |
35 import std.stdio; | 35 import std.stdio; |
36 } | 36 } |
37 | 37 |
38 final class CairoCanvas : Table, private IViewport { | 38 final class CairoCanvas : Table, IViewport { |
39 static this() { | 39 static this() { |
40 _cursors = [ | 40 _cursors = [ |
41 Cursor.DEFAULT : CursorType.ARROW, | 41 Cursor.DEFAULT : CursorType.ARROW, |
42 Cursor.HAND : CursorType.HAND1, | 42 Cursor.HAND : CursorType.HAND1, |
43 Cursor.CROSSHAIR : CursorType.CROSSHAIR, | 43 Cursor.CROSSHAIR : CursorType.CROSSHAIR, |
144 | 144 |
145 // IViewport overrides: | 145 // IViewport overrides: |
146 | 146 |
147 void zoomRelative(in double factor, in Point screenDatum) { | 147 void zoomRelative(in double factor, in Point screenDatum) { |
148 _screenModel.zoomRelative(factor, screenDatum); | 148 _screenModel.zoomRelative(factor, screenDatum); |
149 consolidateBounds; | 149 consolidateBounds(); |
150 updateAdjustments; | 150 updateAdjustments(); |
151 updateRulers; | 151 updateRulers(); |
152 _grid.zoomChanged(_screenModel.zoom); | 152 _grid.zoomChanged(_screenModel.zoom); |
153 queueDraw; | 153 queueDraw(); |
154 } | 154 } |
155 | 155 |
156 void panRelative(in Vector screenDisplacement) { | 156 void panRelative(in Vector screenDisplacement) { |
157 _screenModel.panRelativeScreen(screenDisplacement); | 157 _screenModel.panRelativeScreen(screenDisplacement); |
158 consolidateBounds; | 158 consolidateBounds(); |
159 updateAdjustments; | 159 updateAdjustments(); |
160 updateRulers; | 160 updateRulers(); |
161 queueDraw; | 161 queueDraw(); |
162 } | 162 } |
163 | 163 |
164 void setCursor(in Cursor cursor) { | 164 void setCursor(in Cursor cursor) { |
165 _drawingArea.setCursor(new gdk.Cursor.Cursor(_cursors[cursor])); | 165 _drawingArea.setCursor(new gdk.Cursor.Cursor(_cursors[cursor])); |
166 } | 166 } |
179 void consolidateBounds() { | 179 void consolidateBounds() { |
180 Rectangle layerBounds = _layerStack.bounds; | 180 Rectangle layerBounds = _layerStack.bounds; |
181 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); | 181 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); |
182 _screenModel.consolidateCanvasBounds(paddedLayerBounds); | 182 _screenModel.consolidateCanvasBounds(paddedLayerBounds); |
183 | 183 |
184 updateAdjustments; | 184 updateAdjustments(); |
185 updateRulers; | 185 updateRulers(); |
186 } | 186 } |
187 | 187 |
188 bool onConfigure(GdkEventConfigure * event, Widget widget) { | 188 bool onConfigure(GdkEventConfigure * event, Widget widget) { |
189 assert(widget is _drawingArea); | 189 assert(widget is _drawingArea); |
190 | 190 |
194 Rectangle layerBounds = _layerStack.bounds; | 194 Rectangle layerBounds = _layerStack.bounds; |
195 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); | 195 Rectangle paddedLayerBounds = growCentre(layerBounds, 2 * layerBounds.size); |
196 _screenModel = new ScreenModel(0.25 * _pixelsPerMillimetre, paddedLayerBounds, viewBoundsScreen); | 196 _screenModel = new ScreenModel(0.25 * _pixelsPerMillimetre, paddedLayerBounds, viewBoundsScreen); |
197 _grid.zoomChanged(_screenModel.zoom); | 197 _grid.zoomChanged(_screenModel.zoom); |
198 | 198 |
199 updateAdjustments; | 199 updateAdjustments(); |
200 updateRulers; | 200 updateRulers(); |
201 } | 201 } |
202 else { | 202 else { |
203 _screenModel.setViewBoundsScreen(viewBoundsScreen); | 203 _screenModel.setViewBoundsScreen(viewBoundsScreen); |
204 consolidateBounds; | 204 consolidateBounds(); |
205 } | 205 } |
206 | 206 |
207 return true; | 207 return true; |
208 } | 208 } |
209 | 209 |
210 bool onExpose(GdkEventExpose * event, Widget widget) { | 210 bool onExpose(GdkEventExpose * event, Widget widget) { |
211 assert(widget is _drawingArea); | 211 assert(widget is _drawingArea); |
212 | 212 |
213 auto dr = _drawingArea.getWindow; | 213 auto dr = _drawingArea.getWindow(); |
214 scope modelCr = new Context(dr); // Causing a memory leak! | 214 scope modelCr = new Context(dr); // Causing a memory leak! |
215 scope screenCr = new Context(dr); // Causing a memory leak! | 215 scope screenCr = new Context(dr); // Causing a memory leak! |
216 | 216 |
217 Rectangle screenDamage = | 217 Rectangle screenDamage = |
218 event is null ? _screenModel.viewBoundsScreen : | 218 event is null ? _screenModel.viewBoundsScreen : |
219 Rectangle(_screenModel.viewBoundsScreen.position + Vector(cast(double)event.area.x, _screenModel.viewBoundsScreen.h - cast(double)(event.area.y + event.area.height)), | 219 Rectangle(_screenModel.viewBoundsScreen.position + Vector(cast(double)event.area.x, _screenModel.viewBoundsScreen.h - cast(double)(event.area.y + event.area.height)), |
220 Vector(cast(double)event.area.width, cast(double)event.area.height)); | 220 Vector(cast(double)event.area.width, cast(double)event.area.height)); |
221 | 221 |
222 Rectangle modelDamage = _screenModel.screenToModel(screenDamage); | 222 Rectangle modelDamage = _screenModel.screenToModel(screenDamage); |
223 | 223 |
224 modelCr.save; screenCr.save; { | 224 modelCr.save(); screenCr.save(); { |
225 { | 225 { |
226 // Setup model context and clip | 226 // Setup model context and clip |
227 modelCr.translate(0.0, _screenModel.viewBoundsScreen.h); | 227 modelCr.translate(0.0, _screenModel.viewBoundsScreen.h); |
228 modelCr.scale(_screenModel.zoom, -_screenModel.zoom); | 228 modelCr.scale(_screenModel.zoom, -_screenModel.zoom); |
229 | 229 |
230 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); | 230 immutable Point viewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); |
231 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y); | 231 modelCr.translate(-viewLeftBottom.x, -viewLeftBottom.y); |
232 | 232 |
233 modelCr.rectangle(modelDamage.x0, modelDamage.y0, modelDamage.w, modelDamage.h); | 233 modelCr.rectangle(modelDamage.x0, modelDamage.y0, modelDamage.w, modelDamage.h); |
234 modelCr.clip; | 234 modelCr.clip(); |
235 } | 235 } |
236 | 236 |
237 { | 237 { |
238 // Setup screen context and clip | 238 // Setup screen context and clip |
239 screenCr.translate(0.0, _screenModel.viewBoundsScreen.h); | 239 screenCr.translate(0.0, _screenModel.viewBoundsScreen.h); |
240 screenCr.scale(1.0, -1.0); | 240 screenCr.scale(1.0, -1.0); |
241 | 241 |
242 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); | 242 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); |
243 screenCr.clip; | 243 screenCr.clip(); |
244 } | 244 } |
245 | 245 |
246 screenCr.save; { | 246 screenCr.save(); { |
247 // Fill the background with light grey | 247 // Fill the background with light grey |
248 screenCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); | 248 screenCr.setSourceRgba(0.9, 0.9, 0.9, 1.0); |
249 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); | 249 screenCr.rectangle(screenDamage.x0, screenDamage.y0, screenDamage.w, screenDamage.h); |
250 screenCr.fill; | 250 screenCr.fill(); |
251 } screenCr.restore; | 251 } screenCr.restore(); |
252 | 252 |
253 _layerStack.draw(screenDamage, new CairoRenderer(screenCr), | 253 _layerStack.draw(screenDamage, new CairoRenderer(screenCr), |
254 modelDamage, new CairoRenderer(modelCr), | 254 modelDamage, new CairoRenderer(modelCr), |
255 _screenModel); | 255 _screenModel); |
256 } screenCr.restore; modelCr.restore; | 256 } screenCr.restore(); modelCr.restore(); |
257 | 257 |
258 return true; | 258 return true; |
259 } | 259 } |
260 | 260 |
261 bool onButtonPress(GdkEventButton * event, Widget widget) { | 261 bool onButtonPress(GdkEventButton * event, Widget widget) { |
262 assert(widget is _drawingArea); | 262 assert(widget is _drawingArea); |
263 _eventHandler.handleButtonPress(this, makeButtonEvent(event, _screenModel)); | 263 _eventHandler.handleButtonPress(this, makeButtonEvent(event, _screenModel)); |
264 fixDamage; | 264 fixDamage(); |
265 return true; | 265 return true; |
266 } | 266 } |
267 | 267 |
268 bool onButtonRelease(GdkEventButton * event, Widget widget) { | 268 bool onButtonRelease(GdkEventButton * event, Widget widget) { |
269 assert(widget is _drawingArea); | 269 assert(widget is _drawingArea); |
270 _eventHandler.handleButtonRelease(this, makeButtonEvent(event, _screenModel)); | 270 _eventHandler.handleButtonRelease(this, makeButtonEvent(event, _screenModel)); |
271 fixDamage; | 271 fixDamage(); |
272 return true; | 272 return true; |
273 } | 273 } |
274 | 274 |
275 bool onKeyPressEvent(GdkEventKey * event, Widget widget) { | 275 bool onKeyPressEvent(GdkEventKey * event, Widget widget) { |
276 assert(widget is _drawingArea); | 276 assert(widget is _drawingArea); |
277 _eventHandler.handleKeyPress(this, makeKeyEvent(event, _screenModel)); | 277 _eventHandler.handleKeyPress(this, makeKeyEvent(event, _screenModel)); |
278 fixDamage; | 278 fixDamage(); |
279 return true; | 279 return true; |
280 } | 280 } |
281 | 281 |
282 bool onKeyReleaseEvent(GdkEventKey * event, Widget widget) { | 282 bool onKeyReleaseEvent(GdkEventKey * event, Widget widget) { |
283 assert(widget is _drawingArea); | 283 assert(widget is _drawingArea); |
284 _eventHandler.handleKeyRelease(this, makeKeyEvent(event, _screenModel)); | 284 _eventHandler.handleKeyRelease(this, makeKeyEvent(event, _screenModel)); |
285 fixDamage; | 285 fixDamage(); |
286 return true; | 286 return true; |
287 } | 287 } |
288 | 288 |
289 bool onMotionNotify(GdkEventMotion * event, Widget widget) { | 289 bool onMotionNotify(GdkEventMotion * event, Widget widget) { |
290 assert(widget is _drawingArea); | 290 assert(widget is _drawingArea); |
292 // Pass the events on to the rulers so that they update | 292 // Pass the events on to the rulers so that they update |
293 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event); | 293 gtk_widget_event(_hRuler.getWidgetStruct(), cast(GdkEvent *)event); |
294 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event); | 294 gtk_widget_event(_vRuler.getWidgetStruct(), cast(GdkEvent *)event); |
295 | 295 |
296 _eventHandler.handleMotion(this, makeMotionEvent(event, _screenModel)); | 296 _eventHandler.handleMotion(this, makeMotionEvent(event, _screenModel)); |
297 fixDamage; | 297 fixDamage(); |
298 return true; | 298 return true; |
299 } | 299 } |
300 | 300 |
301 bool onScroll(GdkEventScroll * event, Widget widget) { | 301 bool onScroll(GdkEventScroll * event, Widget widget) { |
302 assert(widget is _drawingArea); | 302 assert(widget is _drawingArea); |
303 _eventHandler.handleScroll(this, makeScrollEvent(event, _screenModel)); | 303 _eventHandler.handleScroll(this, makeScrollEvent(event, _screenModel)); |
304 fixDamage; | 304 fixDamage(); |
305 return true; | 305 return true; |
306 } | 306 } |
307 | 307 |
308 bool onEnterNotify(GdkEventCrossing * event, Widget widget) { | 308 bool onEnterNotify(GdkEventCrossing * event, Widget widget) { |
309 assert(widget is _drawingArea); | 309 assert(widget is _drawingArea); |
310 _eventHandler.handleEnter(this, makeCrossingEvent(event, _screenModel)); | 310 _eventHandler.handleEnter(this, makeCrossingEvent(event, _screenModel)); |
311 fixDamage; | 311 fixDamage(); |
312 return true; | 312 return true; |
313 } | 313 } |
314 | 314 |
315 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { | 315 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { |
316 assert(widget is _drawingArea); | 316 assert(widget is _drawingArea); |
317 _eventHandler.handleLeave(this, makeCrossingEvent(event, _screenModel)); | 317 _eventHandler.handleLeave(this, makeCrossingEvent(event, _screenModel)); |
318 fixDamage; | 318 fixDamage(); |
319 return true; | 319 return true; |
320 } | 320 } |
321 | 321 |
322 bool onFocusIn(GdkEventFocus * event, Widget widget) { | 322 bool onFocusIn(GdkEventFocus * event, Widget widget) { |
323 trace("onFocusIn"); | 323 trace("onFocusIn"); |
345 void onGrabNotify(gboolean what, Widget widget) { | 345 void onGrabNotify(gboolean what, Widget widget) { |
346 trace("onGrabNotify: %s", what); | 346 trace("onGrabNotify: %s", what); |
347 } | 347 } |
348 | 348 |
349 void onAdjustmentValueChanged(Adjustment adjustment) { | 349 void onAdjustmentValueChanged(Adjustment adjustment) { |
350 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct; | 350 GtkAdjustment * hGtkAdjustment = _hAdjustment.getAdjustmentStruct(); |
351 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct; | 351 GtkAdjustment * vGtkAdjustment = _vAdjustment.getAdjustmentStruct(); |
352 | 352 |
353 Point oldViewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); | 353 Point oldViewLeftBottom = _screenModel.screenToModel(Point(0.0, 0.0)); |
354 Point newViewLeftBottom = Point(gtk_adjustment_get_value(hGtkAdjustment), | 354 Point newViewLeftBottom = Point(gtk_adjustment_get_value(hGtkAdjustment), |
355 gtk_adjustment_get_value(vGtkAdjustment)); | 355 gtk_adjustment_get_value(vGtkAdjustment)); |
356 | 356 |
357 _screenModel.panRelativeModel(newViewLeftBottom - oldViewLeftBottom); | 357 _screenModel.panRelativeModel(newViewLeftBottom - oldViewLeftBottom); |
358 | 358 |
359 updateRulers; | 359 updateRulers(); |
360 queueDraw; | 360 queueDraw(); |
361 } | 361 } |
362 | 362 |
363 void updateRulers() { | 363 void updateRulers() { |
364 immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner0); | 364 immutable Point viewLeftBottom = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner0); |
365 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); | 365 immutable Point viewRightTop = _screenModel.screenToModel(_screenModel.viewBoundsScreen.corner1); |