comparison gtk/canvas.d @ 27:f3d91579bb28

Checkpoint
author David Bryant <daveb@acres.com.au>
date Wed, 29 Jul 2009 14:11:35 +0930
parents 06c30d250c0a
children
comparison
equal deleted inserted replaced
26:06c30d250c0a 27:f3d91579bb28
66 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND, 66 AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
67 0, 0); 67 0, 0);
68 mVRuler.setMetric(MetricType.PIXELS); 68 mVRuler.setMetric(MetricType.PIXELS);
69 69
70 mDrawingArea = new DrawingArea; 70 mDrawingArea = new DrawingArea;
71 mDrawingArea.addOnRealize(&onRealize); 71 mDrawingArea.addOnRealize(&on_realize);
72 mDrawingArea.addOnConfigure(&onConfigure); 72 mDrawingArea.addOnConfigure(&on_configure);
73 mDrawingArea.addOnExpose(&onExpose); 73 mDrawingArea.addOnExpose(&on_expose);
74 mDrawingArea.addOnButtonPress(&onButtonPress); 74 mDrawingArea.addOnButtonPress(&on_button_press);
75 mDrawingArea.addOnButtonRelease(&onButtonRelease); 75 mDrawingArea.addOnButtonRelease(&on_button_release);
76 mDrawingArea.addOnKeyPress(&onKeyEvent); 76 mDrawingArea.addOnKeyPress(&on_key_event);
77 mDrawingArea.addOnKeyRelease(&onKeyEvent); 77 mDrawingArea.addOnKeyRelease(&on_key_event);
78 mDrawingArea.addOnMotionNotify(&onMotionNotify); 78 mDrawingArea.addOnMotionNotify(&on_motion_notify);
79 mDrawingArea.addOnScroll(&onScroll); 79 mDrawingArea.addOnScroll(&on_scroll);
80 mDrawingArea.addOnEnterNotify(&onEnterNotify); 80 mDrawingArea.addOnEnterNotify(&on_enter_notify);
81 mDrawingArea.addOnLeaveNotify(&onLeaveNotify); 81 mDrawingArea.addOnLeaveNotify(&on_leave_notify);
82 mDrawingArea.setEvents(EventMask.EXPOSURE_MASK | 82 mDrawingArea.setEvents(EventMask.EXPOSURE_MASK |
83 EventMask.POINTER_MOTION_MASK | 83 EventMask.POINTER_MOTION_MASK |
84 EventMask.POINTER_MOTION_HINT_MASK | 84 EventMask.POINTER_MOTION_HINT_MASK |
85 EventMask.BUTTON_MOTION_MASK | 85 EventMask.BUTTON_MOTION_MASK |
86 EventMask.BUTTON_PRESS_MASK | 86 EventMask.BUTTON_PRESS_MASK |
143 update_adjustments; 143 update_adjustments;
144 update_rulers; 144 update_rulers;
145 queueDraw; 145 queueDraw;
146 } 146 }
147 147
148 override void set_cursor(in Cursor cursor) {
149 CursorType cursor_type;
150
151 switch (cursor) {
152 case Cursor.DEFAULT:
153 cursor_type = CursorType.ARROW;
154 break;
155 case Cursor.HAND:
156 cursor_type = CursorType.HAND1;
157 break;
158 case Cursor.CROSSHAIR:
159 cursor_type = CursorType.CROSSHAIR;
160 break;
161 }
162
163 mDrawingArea.setCursor(new gdk.Cursor.Cursor(cursor_type));
164 }
165
148 override void damage_model(in Rectangle area) { 166 override void damage_model(in Rectangle area) {
149 mDamage = mDamage | model_to_pixel(area); 167 mDamage = mDamage | model_to_pixel(area);
150 } 168 }
151 169
152 override void damage_pixel(in Rectangle area) { 170 override void damage_pixel(in Rectangle area) {
153 mDamage = mDamage | area; 171 mDamage = mDamage | area;
154 } 172 }
155 173
156 override double zoom() const {
157 return mZoom;
158 }
159
160 override Point model_to_pixel(in Point model) const {
161 return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre);
162 }
163
164 override Point pixel_to_model(in Point pixel) const {
165 return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom;
166 }
167
168 override Vector model_to_pixel(in Vector model) const {
169 return mZoom * model;
170 }
171
172 override Vector pixel_to_model(in Vector pixel) const {
173 return pixel / mZoom;
174 }
175
176 override double model_to_pixel(in double model) const {
177 return mZoom * model;
178 }
179
180 override double pixel_to_model(in double pixel) const {
181 return pixel / mZoom;
182 }
183
184 override Rectangle model_to_pixel(in Rectangle model) const {
185 return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size));
186 }
187
188 override Rectangle pixel_to_model(in Rectangle model) const {
189 return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size));
190 }
191
192 private { 174 private {
193 175
194 void onRealize(Widget widget) { 176 bool on_configure(GdkEventConfigure * event, Widget widget) {
195 assert(widget is mDrawingArea);
196 //writefln("Got realize\n");
197 }
198
199 bool onConfigure(GdkEventConfigure * event, Widget widget) {
200 assert(widget is mDrawingArea); 177 assert(widget is mDrawingArea);
201 178
202 if (!mHadConfigure) { 179 if (!mHadConfigure) {
203 const double MM_PER_INCH = 25.4; 180 const double MM_PER_INCH = 25.4;
204 mZoom = 0.25 * mPPI / MM_PER_INCH; 181 mZoom = 0.25 * mPPI / MM_PER_INCH;
228 //writefln("View centre: %s", mViewCentre); 205 //writefln("View centre: %s", mViewCentre);
229 206
230 return true; 207 return true;
231 } 208 }
232 209
233 bool onExpose(GdkEventExpose * event, Widget widget) { 210 bool on_expose(GdkEventExpose * event, Widget widget) {
234 assert(widget is mDrawingArea); 211 assert(widget is mDrawingArea);
235 212
236 Drawable dr = mDrawingArea.getWindow; 213 Drawable dr = mDrawingArea.getWindow;
237 214
238 int width, height; 215 int width, height;
292 } pixel_cr.restore; model_cr.restore; 269 } pixel_cr.restore; model_cr.restore;
293 270
294 return true; 271 return true;
295 } 272 }
296 273
297 bool onButtonPress(GdkEventButton * event, Widget widget) { 274 bool on_button_press(GdkEventButton * event, Widget widget) {
298 assert(widget is mDrawingArea); 275 assert(widget is mDrawingArea);
299 //writefln("Got button event\n"); 276 //writefln("Got button event\n");
300 277
301 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); 278 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5));
302 Point model_point = pixel_to_model(pixel_point); 279 Point model_point = pixel_to_model(pixel_point);
312 process_damage; 289 process_damage;
313 290
314 return true; 291 return true;
315 } 292 }
316 293
317 bool onButtonRelease(GdkEventButton * event, Widget widget) { 294 bool on_button_release(GdkEventButton * event, Widget widget) {
318 assert(widget is mDrawingArea); 295 assert(widget is mDrawingArea);
319 //writefln("Got button event\n"); 296 //writefln("Got button event\n");
320 297
321 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); 298 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5));
322 Point model_point = pixel_to_model(pixel_point); 299 Point model_point = pixel_to_model(pixel_point);
332 process_damage; 309 process_damage;
333 310
334 return true; 311 return true;
335 } 312 }
336 313
337 bool onKeyEvent(GdkEventKey * event, Widget widget) { 314 bool on_key_event(GdkEventKey * event, Widget widget) {
338 assert(widget is mDrawingArea); 315 assert(widget is mDrawingArea);
339 //writefln("Got key event\n"); 316 //writefln("Got key event\n");
340 317
341 //auto key_event = new KeyEvent("", 318 //auto key_event = new KeyEvent("",
342 // mEventHandle.handle_key(key_event); 319 // mEventHandle.handle_key(key_event);
344 process_damage; 321 process_damage;
345 322
346 return true; 323 return true;
347 } 324 }
348 325
349 bool onMotionNotify(GdkEventMotion * event, Widget widget) { 326 bool on_motion_notify(GdkEventMotion * event, Widget widget) {
350 assert(widget is mDrawingArea); 327 assert(widget is mDrawingArea);
351 //writefln("Got motion notify\n"); 328 //writefln("Got motion notify\n");
352 gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event); 329 gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event);
353 gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event); 330 gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event);
354 331
364 process_damage; 341 process_damage;
365 342
366 return true; 343 return true;
367 } 344 }
368 345
369 bool onScroll(GdkEventScroll * event, Widget widget) { 346 bool on_scroll(GdkEventScroll * event, Widget widget) {
370 assert(widget is mDrawingArea); 347 assert(widget is mDrawingArea);
371 //writefln("Got scroll\n"); 348 //writefln("Got scroll\n");
372 349
373 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5)); 350 Point pixel_point = Point(event.x + 0.5, mViewSize.y - (event.y + 0.5));
374 Point model_point = pixel_to_model(pixel_point); 351 Point model_point = pixel_to_model(pixel_point);
410 int focus; 387 int focus;
411 uint state; 388 uint state;
412 } 389 }
413 */ 390 */
414 391
415 bool onEnterNotify(GdkEventCrossing * event, Widget widget) { 392 bool on_enter_notify(GdkEventCrossing * event, Widget widget) {
416 assert(widget is mDrawingArea); 393 assert(widget is mDrawingArea);
417 writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state); 394 //writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
418 return true; 395 // TODO
419 } 396 return true;
420 397 }
421 bool onLeaveNotify(GdkEventCrossing * event, Widget widget) { 398
422 assert(widget is mDrawingArea); 399 bool on_leave_notify(GdkEventCrossing * event, Widget widget) {
423 writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state); 400 assert(widget is mDrawingArea);
401 //writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
402 // TODO
424 return true; 403 return true;
425 } 404 }
426 405
427 void onValueChanged(Adjustment adjustment) { 406 void onValueChanged(Adjustment adjustment) {
428 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct; 407 GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct;
503 void process_damage() { 482 void process_damage() {
504 if (mDamage.valid) { 483 if (mDamage.valid) {
505 //writefln("Damage: %s", mDamage); 484 //writefln("Damage: %s", mDamage);
506 int x, y, w, h; 485 int x, y, w, h;
507 mDamage.get_quantised(x, y, w, h); 486 mDamage.get_quantised(x, y, w, h);
508 //writefln("Quantised damage: %d %d %d %d", x, y, w, h); 487 mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - (y + h), w, h);
509 y = cast(int)mViewSize.y - (y + h); // Flip vertical axis
510 //writefln("Flipped Quantised damage: %d %d %d %d", x, y, w, h);
511 mDrawingArea.queueDrawArea(x, y, w, h);
512 //mDrawingArea.queueDraw();
513 mDamage = Rectangle.DEFAULT; 488 mDamage = Rectangle.DEFAULT;
514 } 489 }
515 else { 490 else {
516 //writefln("No damage"); 491 //writefln("No damage");
517 } 492 }
518 } 493 }
519 494
520 double clamp_zoom(in double zoom) { return clamp(zoom, 0.2, 10.0); } 495 double clamp_zoom(in double zoom) { return clamp(zoom, 0.2, 10.0); }
496
497 Point model_to_pixel(in Point model) const {
498 return Point.DEFAULT + mViewSize / 2.0 + mZoom * (model - mViewCentre);
499 }
500
501 Point pixel_to_model(in Point pixel) const {
502 return mViewCentre + (pixel - mViewSize / 2.0 - Point.DEFAULT) / mZoom;
503 }
504
505 Vector model_to_pixel(in Vector model) const {
506 return mZoom * model;
507 }
508
509 Vector pixel_to_model(in Vector pixel) const {
510 return pixel / mZoom;
511 }
512
513 Rectangle model_to_pixel(in Rectangle model) const {
514 return Rectangle(model_to_pixel(model.position), model_to_pixel(model.size));
515 }
516
517 Rectangle pixel_to_model(in Rectangle model) const {
518 return Rectangle(pixel_to_model(model.position), pixel_to_model(model.size));
519 }
520
521 void on_realize(Widget widget) {
522 assert(widget is mDrawingArea);
523 //writefln("Got realize\n");
524 }
521 525
522 bool mHadConfigure; 526 bool mHadConfigure;
523 Rectangle mDamage; // pixels 527 Rectangle mDamage; // pixels
524 528
525 // Model units are in millimetres 529 // Model units are in millimetres