changeset 5:8a39b13cd3e6

Checkpoint
author David Bryant <daveb@acres.com.au>
date Fri, 10 Jul 2009 18:19:16 +0930
parents 58a8ad20b228
children a27d2093991c
files canvas.d icanvas.d tk/events.d tk/types.d tool_stack.d
diffstat 5 files changed, 172 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/canvas.d	Fri Jul 10 15:26:07 2009 +0930
+++ b/canvas.d	Fri Jul 10 18:19:16 2009 +0930
@@ -74,8 +74,8 @@
         mDrawingArea.addOnRealize(&onRealize);
         mDrawingArea.addOnConfigure(&onConfigure);
         mDrawingArea.addOnExpose(&onExpose);
-        mDrawingArea.addOnButtonPress(&onButtonEvent);
-        mDrawingArea.addOnButtonRelease(&onButtonEvent);
+        mDrawingArea.addOnButtonPress(&onButtonPress);
+        mDrawingArea.addOnButtonRelease(&onButtonRelease);
         mDrawingArea.addOnKeyPress(&onKeyEvent);
         mDrawingArea.addOnKeyRelease(&onKeyEvent);
         mDrawingArea.addOnMotionNotify(&onMotionNotify);
@@ -161,7 +161,7 @@
             dr.getSize(width, height);
             //writefln("Got expose %dx%d\n", width, height);
 
-            scope auto cr = new Context(dr);
+            scope cr = new Context(dr);
 
             if (event) {
                 cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height);
@@ -196,7 +196,7 @@
             return true;
         }
 
-        bool onButtonEvent(GdkEventButton * event, Widget widget) {
+        bool onButtonPress(GdkEventButton * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got button event\n");
 
@@ -209,7 +209,25 @@
                                                 model_point,
                                                 gtk2tk_mask(event.state));
 
-            //mEventHandle.handle_button_press
+            mEventHandler.handle_button_press(this, button_event);
+
+            return true;
+        }
+
+        bool onButtonRelease(GdkEventButton * event, Widget widget) {
+            assert(widget is mDrawingArea);
+            //writefln("Got button event\n");
+
+            Point screen_point = Point(event.x + 0.5, event.y + 0.5);
+            Point model_point = screen_to_model(screen_point);
+
+            auto button_event = new ButtonEvent(gtk2tk_click(event.type),
+                                                gtk2tk_button(event.button),
+                                                screen_point,
+                                                model_point,
+                                                gtk2tk_mask(event.state));
+
+            mEventHandler.handle_button_release(this, button_event);
 
             return true;
         }
--- a/icanvas.d	Fri Jul 10 15:26:07 2009 +0930
+++ b/icanvas.d	Fri Jul 10 18:19:16 2009 +0930
@@ -11,12 +11,12 @@
 import tk.events;
 
 interface ICanvasEventHandler {
-    bool handle_button_press(ICanvas canvas, ButtonEvent event);
-    bool handle_button_release(ICanvas canvas, ButtonEvent event);
-    bool handle_key_press(ICanvas canvas, KeyEvent event);
-    bool handle_key_release(ICanvas canvas, KeyEvent event);
-    bool handle_motion(ICanvas canvas, MotionEvent event);
-    bool handle_scroll(ICanvas canvas, ScrollEvent event);
+    bool handle_button_press(ICanvas canvas, in ButtonEvent event);
+    bool handle_button_release(ICanvas canvas, in ButtonEvent event);
+    bool handle_key_press(ICanvas canvas, in KeyEvent event);
+    bool handle_key_release(ICanvas canvas, in KeyEvent event);
+    bool handle_motion(ICanvas canvas, in MotionEvent event);
+    bool handle_scroll(ICanvas canvas, in ScrollEvent event);
     //bool handle_expose(ICanvas canvas, ExposeEvent event);
     //bool handle_enter(ICanvas, CrossingEvent event);
     //bool handle_leave(ICanvas, CrossingEvent event);
--- a/tk/events.d	Fri Jul 10 15:26:07 2009 +0930
+++ b/tk/events.d	Fri Jul 10 18:19:16 2009 +0930
@@ -26,11 +26,11 @@
 }
 
 abstract class InputEvent : Event {
-    this(Mask mask) {
-        mMask = mask;
+    this(in Mask mask) {
+        mMask = new Mask(mask);
     }
 
-    Mask mask() { return mMask; }
+    const(Mask) mask() const { return mMask; }
 
     private {
         Mask mMask;
@@ -53,9 +53,9 @@
         mValue = value;
     }
 
-    string str() { return mStr; }
+    string str() const { return mStr; }
 
-    override string toString() {
+    override string toString() const {
         return std.string.format("Key event: %s, %d", mStr, mValue);
     }
 
@@ -66,14 +66,14 @@
 }
 
 abstract class PointerEvent : InputEvent {
-    this(Point screen_point, Point model_point, Mask mask) {
+    this(in Point screen_point, in Point model_point, in Mask mask) {
         super(mask);
         mScreenPoint = screen_point;
         mModelPoint = model_point;
     }
 
-    Point screen_point() { return mScreenPoint; }
-    Point model_point() { return mModelPoint; }
+    Point screen_point() const { return mScreenPoint; }
+    Point model_point() const { return mModelPoint; }
 
     private {
         Point mScreenPoint;
@@ -92,12 +92,12 @@
         mButtonNumber = button_number;
     }
 
-    override string toString() {
+    override string toString() const {
         return std.string.format("Button event: %s, %s, %s, %s, %s", mButtonPress, mButtonNumber, mScreenPoint, mModelPoint, mMask);
     }
 
-    ButtonPress button_press() { return mButtonPress; }
-    ButtonNumber button_number() { return mButtonNumber; }
+    ButtonPress button_press() const { return mButtonPress; }
+    ButtonNumber button_number() const { return mButtonNumber; }
 
     private {
         ButtonPress mButtonPress;
@@ -106,31 +106,31 @@
 }
 
 final class MotionEvent : PointerEvent {
-    this(Point screen_point,
-         Point model_point,
-         Mask mask) {
+    this(in Point screen_point,
+         in Point model_point,
+         in Mask mask) {
         super(screen_point, model_point, mask);
     }
 
-    override string toString() {
+    override string toString() const {
         return std.string.format("Motion event: %s, %s, %s", mScreenPoint, mModelPoint, mMask);
     }
 }
 
 final class ScrollEvent : PointerEvent {
-    this(ScrollDirection scroll_direction,
-         Point screen_point,
-         Point model_point,
-         Mask mask) {
+    this(in ScrollDirection scroll_direction,
+         in Point screen_point,
+         in Point model_point,
+         in Mask mask) {
         super(screen_point, model_point, mask);
         mScrollDirection = scroll_direction;
     }
 
-    override string toString() {
+    override string toString() const {
         return std.string.format("Scroll event: %s, %s, %s, %s", mScrollDirection, mScreenPoint, mModelPoint, mMask);
     }
 
-    ScrollDirection scroll_direction() { return mScrollDirection; }
+    ScrollDirection scroll_direction() const { return mScrollDirection; }
 
     private {
         ScrollDirection mScrollDirection;
--- a/tk/types.d	Fri Jul 10 15:26:07 2009 +0930
+++ b/tk/types.d	Fri Jul 10 18:19:16 2009 +0930
@@ -1,7 +1,10 @@
 module tk.types;
 
 private import std.string;
+private import std.typecons;
+private import std.algorithm;
 
+      /*
 enum ButtonPress {
     SINGLE,
     DOUBLE,
@@ -9,6 +12,16 @@
     RELEASE
 }
 
+string toString(in ButtonPress bp) {
+    switch (bp) {
+    case ButtonPress.SINGLE:  return "SINGLE";
+    case ButtonPress.DOUBLE:  return "DOUBLE";
+    case ButtonPress.TRIPLE:  return "TRIPLE";
+    case ButtonPress.RELEASE: return "RELEASE";
+    default:                  return std.string.format("<UNKNOWN ButtonPress: %s>", bp);
+    }
+}
+
 enum ButtonNumber {
     BUTTON_1,
     BUTTON_2,
@@ -17,6 +30,17 @@
     BUTTON_5,
 }
 
+string toString(in ButtonNumber bn) {
+    switch (bn) {
+    case ButtonNumber.BUTTON_1: return "BUTTON_1";
+    case ButtonNumber.BUTTON_2: return "BUTTON_2";
+    case ButtonNumber.BUTTON_3: return "BUTTON_3";
+    case ButtonNumber.BUTTON_4: return "BUTTON_4";
+    case ButtonNumber.BUTTON_5: return "BUTTON_5";
+    default:                    return std.string.format("<UNKNOWN ButtonNumber: %s>", bn);
+    }
+}
+
 enum ScrollDirection {
     UP,
     DOWN,
@@ -24,6 +48,16 @@
     RIGHT
 }
 
+string toString(in ScrollDirection sd) {
+    switch (sd) {
+    case ScrollDirection.UP:    return "UP";
+    case ScrollDirection.DOWN:  return "DOWN";
+    case ScrollDirection.LEFT:  return "LEFT";
+    case ScrollDirection.RIGHT: return "RIGHT";
+    default:                    return std.string.format("<UNKNOWN ScrollDirection: %s>", sd);
+    }
+}
+
 enum Modifier {
     SHIFT,
     CAPS_LOCK,
@@ -39,18 +73,92 @@
     BUTTON_5
 }
 
-class Mask {
-    void add(Modifier modifier) { mBits |= bit(modifier); }
-    void remove(Modifier modifier) { mBits &= ~bit(modifier); }
-    bool query(Modifier modifier) { return cast(bool)(mBits & bit(modifier)); }
+string toString(in Modifier m) {
+    switch (m) {
+    case Modifier.SHIFT:       return "SHIFT";
+    case Modifier.CAPS_LOCK:   return "CAPS_LOCK";
+    case Modifier.CONTROL:     return "CONTROL";
+    case Modifier.ALT:         return "ALT";
+    case Modifier.NUM_LOCK:    return "NUM_LOCK";
+    case Modifier.META:        return "META";
+    case Modifier.SCROLL_LOCK: return "SCROLL_LOCK";
+    case Modifier.BUTTON_1:    return "BUTTON_1";
+    case Modifier.BUTTON_2:    return "BUTTON_2";
+    case Modifier.BUTTON_3:    return "BUTTON_3";
+    case Modifier.BUTTON_4:    return "BUTTON_4";
+    case Modifier.BUTTON_5:    return "BUTTON_5";
+    default:                   return std.string.format("<UNKNOWN Modifier: %s>", m);
+    }
+}
+*/
 
-    override string toString() {
-        return format("%d", mBits);
+mixin(defineEnum!("ButtonPress",
+                  "SINGLE", "DOUBLE", "TRIPLE", "RELEASE"));
+mixin(defineEnum!("ButtonNumber",
+                  "BUTTON_1", "BUTTON_2", "BUTTON_3", "BUTTON_4", "BUTTON_5"));
+mixin(defineEnum!("ScrollDirection",
+                  "UP", "DOWN", "LEFT", "RIGHT"));
+mixin(defineEnum!("Modifier",
+                  "SHIFT", "CAPS_LOCK", "CONTROL", "ALT", "NUM_LOCK", "META",
+                  "SCROLL_LOCK", "BUTTON_1", "BUTTON_2", "BUTTON_3", "BUTTON_4", "BUTTON_5"));
+
+struct Mask2 {
+    this(in Modifier[] modifiers) {
+        _modifiers = modifiers.dup;
+    }
+
+    string toString() const {
+        string s;
+
+        foreach (Modifier m; _modifiers) {
+            s ~= enumToString(m);
+        }
+
+        return s;
+    }
+
+    bool is_set(Modifier m) const {
+        foreach (Modifier m2; _modifiers) {
+            if (m == m2) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    bool is_unset(Modifier m) const {
+        return !is_set(m);
     }
 
     private {
-        static int bit(Modifier modifier) { return 1 << cast(int)modifier; }
+        Modifier[] _modifiers;
+    }
+}
+
+class Mask {
+    this() {
+    }
+
+    this(in Mask other) {
+        mBits = other.mBits;
+    }
+
+    void add(Modifier modifier) { mBits |= to_bit(modifier); }
+    void remove(Modifier modifier) { mBits &= ~to_bit(modifier); }
+    bool query(Modifier modifier) const { return cast(bool)(mBits & to_bit(modifier)); }
+
+    override string toString() const {
+        Modifier m = Modifier.SHIFT;
+        return enumToString(m);
+        /*
+        return format("Mask: %s", m);
+        */
+        //return format("%d", mBits);
+    }
+
+    private {
+        static int to_bit(Modifier modifier) { return 1 << cast(int)modifier; }
         int mBits;
     }
 }
-
--- a/tool_stack.d	Fri Jul 10 15:26:07 2009 +0930
+++ b/tool_stack.d	Fri Jul 10 18:19:16 2009 +0930
@@ -11,32 +11,32 @@
 //IToolStack
 
 class ToolStack : ICanvasEventHandler {
-    override bool handle_button_press(ICanvas canvas, ButtonEvent event) {
+    override bool handle_button_press(ICanvas canvas, in ButtonEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_button_release(ICanvas canvas, ButtonEvent event) {
+    override bool handle_button_release(ICanvas canvas, in ButtonEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_key_press(ICanvas canvas, KeyEvent event) {
+    override bool handle_key_press(ICanvas canvas, in KeyEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_key_release(ICanvas canvas, KeyEvent event) {
+    override bool handle_key_release(ICanvas canvas, in KeyEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_motion(ICanvas canvas, MotionEvent event) {
+    override bool handle_motion(ICanvas canvas, in MotionEvent event) {
         writefln("%s", event);
         return true;
     }
 
-    override bool handle_scroll(ICanvas canvas, ScrollEvent event) {
+    override bool handle_scroll(ICanvas canvas, in ScrollEvent event) {
         writefln("%s", event);
 
         if (event.mask.query(Modifier.CONTROL)) {