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