Mercurial > projects > doodle
diff canvas.d @ 17:c643c04e3f5e
Checkpoint
author | David Bryant <daveb@acres.com.au> |
---|---|
date | Mon, 13 Jul 2009 16:46:21 +0930 |
parents | 9e63308b749c |
children | df8d81d9f499 |
line wrap: on
line diff
--- a/canvas.d Mon Jul 13 16:16:17 2009 +0930 +++ b/canvas.d Mon Jul 13 16:46:21 2009 +0930 @@ -38,6 +38,8 @@ this(in Layer[] layers, EventHandler event_handler, in double ppi) { super(3, 3, 0); + mDamage = Rectangle.DEFAULT; + mLayers = layers.dup; mEventHandler = event_handler; mPPI = ppi; @@ -129,6 +131,10 @@ queueDraw; } + override void damage_model(Rectangle area) { + mDamage = mDamage | model_to_pixel(area); + } + override double zoom() const { return mZoom; } @@ -280,6 +286,8 @@ mEventHandler.handle_button_press(this, button_event); + process_damage; + return true; } @@ -298,6 +306,8 @@ mEventHandler.handle_button_release(this, button_event); + process_damage; + return true; } @@ -308,6 +318,8 @@ //auto key_event = new KeyEvent("", // mEventHandle.handle_key(key_event); + process_damage; + return true; } @@ -326,6 +338,8 @@ mEventHandler.handle_motion(this, motion_event); + process_damage; + return true; } @@ -343,6 +357,8 @@ mEventHandler.handle_scroll(this, scroll_event); + process_damage; + return true; } @@ -424,9 +440,23 @@ mVAdjustment.valueChanged; } + void process_damage() { + if (mDamage.valid) { + writefln("Damage: %s", mDamage); + int x, y, w, h; + mDamage.get_quantised(x, y, w, h); + mDrawingArea.queueDrawArea(x, cast(int)mViewSize.y - y, w, h); + mDamage = Rectangle.DEFAULT; + } + else { + writefln("No damage"); + } + } + double clamp_zoom(double zoom) { return clamp(zoom, 0.2, 10.0); } bool mHadConfigure; + Rectangle mDamage; // pixels // Model units are in millimetres // Screen units are in pixels