changeset 20:d6e7a5a6f008

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Wed, 15 Jul 2009 23:23:02 +0930
parents 22abbf4cde96
children 993ac3a183c8
files .hgignore build.sh canvas.d doodle.d gui.d icanvas.d standard_tools.d
diffstat 7 files changed, 113 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Mon Jul 13 22:08:18 2009 +0930
+++ b/.hgignore	Wed Jul 15 23:23:02 2009 +0930
@@ -1,2 +1,2 @@
-gui
+doodle
 .obj
--- a/build.sh	Mon Jul 13 22:08:18 2009 +0930
+++ b/build.sh	Wed Jul 15 23:23:02 2009 +0930
@@ -1,8 +1,8 @@
 #!/bin/sh
 
 dmd \
-        -ofgui \
-        gui.d tool_layer.d tool.d icanvas.d canvas.d \
+        -ofdoodle \
+        doodle.d tool_layer.d tool.d icanvas.d canvas.d \
         tk/geometry.d tk/gtk_support.d tk/misc.d tk/types.d tk/events.d \
         cairo_support.d standard_tools.d \
         page_layer.d \
--- a/canvas.d	Mon Jul 13 22:08:18 2009 +0930
+++ b/canvas.d	Wed Jul 15 23:23:02 2009 +0930
@@ -58,7 +58,7 @@
                0, 1,
                AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
                0, 0);
-        mHRuler.setMetric(GtkMetricType.PIXELS);
+        mHRuler.setMetric(MetricType.PIXELS);
 
         mVRuler = new VRuler;
         attach(mVRuler,
@@ -66,7 +66,7 @@
                1, 2,
                AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
                0, 0);
-        mVRuler.setMetric(GtkMetricType.PIXELS);
+        mVRuler.setMetric(MetricType.PIXELS);
 
         mDrawingArea = new DrawingArea;
         mDrawingArea.addOnRealize(&onRealize);
@@ -78,6 +78,21 @@
         mDrawingArea.addOnKeyRelease(&onKeyEvent);
         mDrawingArea.addOnMotionNotify(&onMotionNotify);
         mDrawingArea.addOnScroll(&onScroll);
+        mDrawingArea.addOnEnterNotify(&onEnterNotify);
+        mDrawingArea.addOnLeaveNotify(&onLeaveNotify);
+        mDrawingArea.setEvents(EventMask.EXPOSURE_MASK |
+                               EventMask.POINTER_MOTION_MASK |
+                               EventMask.POINTER_MOTION_HINT_MASK |
+                               EventMask.BUTTON_MOTION_MASK |
+                               EventMask.BUTTON_PRESS_MASK |
+                               EventMask.BUTTON_RELEASE_MASK |
+                               EventMask.KEY_PRESS_MASK |
+                               EventMask.KEY_RELEASE_MASK |
+                               EventMask.ENTER_NOTIFY_MASK |
+                               EventMask.LEAVE_NOTIFY_MASK |
+                               EventMask.FOCUS_CHANGE_MASK |
+                               EventMask.SCROLL_MASK);
+
         attach(mDrawingArea,
                1, 2,
                1, 2, 
@@ -108,7 +123,7 @@
                0, 0);
     }
 
-    override void rel_zoom(Point pixel_datum, double factor) {
+    override void zoom_relative(Point pixel_datum, double factor) {
         // Work out pixel distance from current centre to datum,
         // Do the zoom, then work out the new centre that keeps the
         // pixel distance the same
@@ -123,7 +138,7 @@
         queueDraw;
     }
 
-    override void rel_pan(Vector pixel_displacement) {
+    override void pan_relative(Vector pixel_displacement) {
         mViewCentre = mViewCentre + pixel_to_model(pixel_displacement);
 
         update_adjustments;
@@ -371,6 +386,45 @@
             return true;
         }
 
+        /*
+        public enum GdkCrossingMode {       
+            NORMAL,
+            GRAB,
+            UNGRAB,
+            GTK_GRAB,
+            GTK_UNGRAB,
+            STATE_CHANGED
+        }
+
+        public struct GdkEventCrossing {
+            GdkEventType type;
+            GdkWindow *window;
+            byte sendEvent;
+            GdkWindow *subwindow;
+            uint time;
+            double x;
+            double y;
+            double xRoot;
+            double yRoot;
+            GdkCrossingMode mode;
+            GdkNotifyType detail;
+            int focus;
+            uint state;
+        }
+        */
+
+        bool onEnterNotify(GdkEventCrossing * event, Widget widget) {
+            assert(widget is mDrawingArea);
+            writefln("Enter %d %d %d", cast(int)event.mode, event.focus, event.state);
+            return true;
+        }
+
+        bool onLeaveNotify(GdkEventCrossing * event, Widget widget) {
+            assert(widget is mDrawingArea);
+            writefln("Leave %d %d %d", cast(int)event.mode, event.focus, event.state);
+            return true;
+        }
+
         void onValueChanged(Adjustment adjustment) {
             GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct;
             GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doodle.d	Wed Jul 15 23:23:02 2009 +0930
@@ -0,0 +1,46 @@
+module doodle;
+
+private {
+    import canvas;
+    import tool_layer;
+    import standard_tools;
+    import page_layer;
+
+    import gtk.Main;
+    import gtk.MainWindow;
+
+    import std.stdio;
+}
+
+void main(string[] args) {
+    Main.init(args);
+    auto window = new MainWindow("Doodle");
+    Tool[] tools;
+    tools ~= new PanTool;
+    tools ~= new ZoomTool;
+    tools ~= new LassoTool;
+    auto tool_layer = new ToolLayer(tools, "Tools");
+    Layer[] layers;
+    layers ~= new PageLayer("Page");
+    layers ~= tool_layer;
+    auto canvas = new Canvas(layers, tool_layer, 120.0);
+    window.add(canvas);
+    window.setDefaultSize(380, 380);
+    window.showAll();
+    Main.run();
+
+    /*
+    Point p3 = Point.DEFAULT;
+
+    Point p1 = Point(3.0, 5.0);
+    writefln("%s", p1);
+
+    Point p2 = Point(1.0, 2.0);
+    writefln("%s", p2);
+
+    writefln("%s", p1 - p2);
+
+    Rectangle r = Rectangle(p1, p2);
+    writefln("%s", r);
+    */
+}
--- a/gui.d	Mon Jul 13 22:08:18 2009 +0930
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-module gui;
-
-private {
-    import canvas;
-    import tool_layer;
-    import standard_tools;
-    import page_layer;
-
-    import gtk.Main;
-    import gtk.MainWindow;
-
-    import std.stdio;
-}
-
-void main(string[] args) {
-    Main.init(args);
-    auto window = new MainWindow("Doodle");
-    Tool[] tools;
-    tools ~= new PanTool;
-    tools ~= new ZoomTool;
-    tools ~= new LassoTool;
-    auto tool_layer = new ToolLayer(tools, "Tools");
-    Layer[] layers;
-    layers ~= new PageLayer("Page");
-    layers ~= tool_layer;
-    auto canvas = new Canvas(layers, tool_layer, 120.0);
-    window.add(canvas);
-    window.setDefaultSize(380, 380);
-    window.showAll();
-    Main.run();
-
-    /*
-    Point p3 = Point.DEFAULT;
-
-    Point p1 = Point(3.0, 5.0);
-    writefln("%s", p1);
-
-    Point p2 = Point(1.0, 2.0);
-    writefln("%s", p2);
-
-    writefln("%s", p1 - p2);
-
-    Rectangle r = Rectangle(p1, p2);
-    writefln("%s", r);
-    */
-}
--- a/icanvas.d	Mon Jul 13 22:08:18 2009 +0930
+++ b/icanvas.d	Wed Jul 15 23:23:02 2009 +0930
@@ -5,8 +5,8 @@
 import cairo.Context;
 
 interface Viewport {
-    void rel_zoom(Point pixel_datum, double factor);
-    void rel_pan(Vector pixel_displacement);
+    void zoom_relative(Point pixel_datum, double factor);
+    void pan_relative(Vector pixel_displacement);
     void damage_model(Rectangle area);      // FIXME could be an inout parameter of the event handling, or a special scope Damage object that supports growth only
     void damage_pixel(Rectangle area);      // FIXME as above
 
--- a/standard_tools.d	Mon Jul 13 22:08:18 2009 +0930
+++ b/standard_tools.d	Wed Jul 15 23:23:02 2009 +0930
@@ -23,7 +23,7 @@
 
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (event.mask.is_set(Modifier.MIDDLE_BUTTON)) {
-            viewport.rel_pan(mLastPosition - event.pixel_point);
+            viewport.pan_relative(mLastPosition - event.pixel_point);
             mLastPosition = event.pixel_point;
 
             return true;
@@ -52,7 +52,7 @@
                 break;
             }
 
-            viewport.rel_pan(delta);
+            viewport.pan_relative(delta);
         }
 
         return true;
@@ -68,11 +68,11 @@
     override bool handle_scroll(Viewport viewport, in ScrollEvent event) {
         if (event.mask.is_set(Modifier.CONTROL)) {
             if (event.scroll_direction == ScrollDirection.DOWN) {
-                viewport.rel_zoom(event.pixel_point, 1.0 / ZOOM);
+                viewport.zoom_relative(event.pixel_point, 1.0 / ZOOM);
                 return true;
             }
             else if (event.scroll_direction == ScrollDirection.UP) {
-                viewport.rel_zoom(event.pixel_point, ZOOM);
+                viewport.zoom_relative(event.pixel_point, ZOOM);
                 return true;
             }
             else {
@@ -112,8 +112,6 @@
         }
     }
 
-    // FIXME account for the line width...
-
     override bool handle_motion(Viewport viewport, in MotionEvent event) {
         if (mActive) {
             viewport.damage_pixel(Rectangle(mAnchorPoint, mCurrentPoint).feathered(LINE_WIDTH / 2.0));