Mercurial > projects > doodle
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 |