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);