diff tool_layer.d @ 12:a093c4fbdd43

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 12 Jul 2009 00:39:35 +0930
parents tool_stack.d@71ca82e0eb76
children 0b7e7d43a79d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_layer.d	Sun Jul 12 00:39:35 2009 +0930
@@ -0,0 +1,120 @@
+module tool_layer;
+
+import std.stdio;
+
+import cairo.Context;
+import cairo_support;
+import tool;
+private import icanvas;
+private import tk.types;
+private import tk.geometry;
+private import tk.events;
+
+class ToolLayer : Layer, EventHandler {
+    this(in Tool[] tools, in string name) {
+        super(name);
+        mTools = tools.dup;
+    }
+
+    override bool handle_button_press(Viewport viewport, in ButtonEvent event) {
+        writefln("%s", event);
+
+        if (mGrabbedTool is null) {
+            foreach_reverse(ref tool; mTools) {
+                if (tool.handle_button_press(viewport, event)) {
+                    mGrabbedTool = &tool;
+                    mGrabbedButton = event.button_name;
+                    break;
+                }
+            }
+        }
+        else {
+            mGrabbedTool.handle_button_press(viewport, event);
+        }
+
+        return true;
+    }
+
+    override bool handle_button_release(Viewport viewport, in ButtonEvent event) {
+        writefln("%s", event);
+
+        if (mGrabbedTool !is null) {
+            mGrabbedTool.handle_button_release(viewport, event);
+
+            if (mGrabbedButton == event.button_name) {
+                mGrabbedTool = null;
+            }
+        }
+
+        return true;
+    }
+
+    override bool handle_key_press(Viewport viewport, in KeyEvent event) {
+        writefln("%s", event);
+        return true;
+    }
+
+    override bool handle_key_release(Viewport viewport, in KeyEvent event) {
+        writefln("%s", event);
+        return true;
+    }
+
+    override bool handle_motion(Viewport viewport, in MotionEvent event) {
+        writefln("%s", event);
+
+        if (mGrabbedTool is null) {
+            foreach_reverse(ref tool; mTools) {
+                if (tool.handle_motion(viewport, event)) {
+                    break;
+                }
+            }
+        }
+        else {
+            mGrabbedTool.handle_motion(viewport, event);
+        }
+
+        return true;
+    }
+
+    override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
+        writefln("%s", event);
+
+        if (mGrabbedTool is null) {
+            foreach_reverse(ref tool; mTools) {
+                if (tool.handle_scroll(viewport, event)) {
+                    break;
+                }
+            }
+        }
+        else {
+            mGrabbedTool.handle_scroll(viewport, event);
+        }
+
+        return true;
+    }
+
+    override Rectangle bounds() const {
+        return Rectangle();
+    }
+
+    override void draw(const Viewport viewport, in Rectangle damage,
+                       Context model_cr, Context screen_cr) const {
+    }
+
+    /*
+    override void push(Tool tool) {
+    }
+
+    override void pop() {
+    }
+
+    override void replace(Tool tool) {
+    }
+    */
+
+    private {
+        Tool[] mTools;
+        Tool * mGrabbedTool;
+        ButtonName mGrabbedButton;
+    }
+}