diff canvas.d @ 2:d6f44347373d

* Switched over to geometry done with structs instead of classes. * Removed direct access to gtk structs * Refactoring
author David Bryant <daveb@acres.com.au>
date Fri, 10 Jul 2009 15:15:27 +0930
parents e907d2c54ec3
children 7d57cae10805
line wrap: on
line diff
--- a/canvas.d	Wed May 13 17:50:25 2009 +0930
+++ b/canvas.d	Fri Jul 10 15:15:27 2009 +0930
@@ -20,7 +20,7 @@
 import gtk.Adjustment;
 
 import tk.misc;
-import tk.geometry;
+import tk.geometry2;
 import tk.types;
 import tk.events;
 import tk.gtk_support;
@@ -28,27 +28,14 @@
 private import gtkc.gtk;
 
 import icanvas;
+import cairo_support;
 
 // x and y run right and up respectively
 
-void rectangle(Context cr, Point corner1, Point corner2) {
-    double x = corner1.x;
-    double y = corner1.y;
-    double w = corner2.x - corner1.x;
-    double h = corner2.y - corner1.y;
-
-    if (w < 0.0) { x += w; w = -w; }
-    if (h < 0.0) { y += h; h = -h; }
-
-    //writefln("Rect: %f %f %f %f\n", x, y, w, h);
-
-    cr.rectangle(x, y, w, h);
-}
-
 class Canvas : Table, ICanvas {
     static this() {
-        ORIGIN = new Point(0.0, 0.0);
-        INITIAL_PAGE_SIZE = new Vector(210.0, 297.0);       // A4
+        ORIGIN = Point2(0.0, 0.0);
+        INITIAL_PAGE_SIZE = Vector2(210.0, 297.0);       // A4
     }
 
     this(ICanvasEventHandler event_handler) {
@@ -60,7 +47,7 @@
         const double MM_PER_INCH = 25.4;
         mZoom = 0.25 * PPI / MM_PER_INCH;
 
-        mPageLeftBottom = ORIGIN.clone();
+        mPageLeftBottom = ORIGIN;
         mPageRightTop = ORIGIN + INITIAL_PAGE_SIZE;
         mViewCentre = ORIGIN + INITIAL_PAGE_SIZE / 2.0;
 
@@ -101,7 +88,7 @@
 
         // value, lower, upper, step-inc, page-inc, page-size
         // Give the adjustments dummy values until we receive a configure
-        mHAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 1.0);
+        mHAdjustment = new Adjustment(0.25, 0.0, 1.0, 0.2, 0.5, 0.5);
         mHAdjustment.addOnValueChanged(&onValueChanged);
         mHScrollbar = new HScrollbar(mHAdjustment);
         attach(mHScrollbar,
@@ -110,7 +97,7 @@
                AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
                0, 0);
 
-        mVAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.4);
+        mVAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
         mVAdjustment.addOnValueChanged(&onValueChanged);
         mVScrollbar = new VScrollbar(mVAdjustment);
         attach(mVScrollbar,
@@ -121,17 +108,17 @@
                0, 0);
     }
 
-    override void rel_zoom(Point screen_datum, double factor) {
+    override void rel_zoom(Point2 screen_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
 
-        Point old_model_datum = screen_to_model(screen_datum);
-        Vector pixel_distance = model_to_screen(old_model_datum - mViewCentre);
+        Point2 old_model_datum = screen_to_model(screen_datum);
+        Vector2 pixel_distance = model_to_screen(old_model_datum - mViewCentre);
         mZoom = clamp_zoom(factor * mZoom);
         mViewCentre = old_model_datum - screen_to_model(pixel_distance);
 
-        Point new_model_datum = screen_to_model(screen_datum);
+        Point2 new_model_datum = screen_to_model(screen_datum);
 
         update_adjustments();
         //update_rulers(new_model_datum);
@@ -139,7 +126,7 @@
         queueDraw();
     }
 
-    override void rel_pan(Vector screen_displacement) {
+    override void rel_pan(Vector2 screen_displacement) {
         mViewCentre = mViewCentre + screen_to_model(screen_displacement);
 
         update_adjustments();
@@ -157,12 +144,12 @@
         bool onConfigure(GdkEventConfigure * event, Widget widget) {
             assert(widget is mDrawingArea);
 
-            mViewSize = new Vector(cast(double)event.width, cast(double)event.height);
+            mViewSize = Vector2(cast(double)event.width, cast(double)event.height);
             update_adjustments();
             update_rulers();
 
 
-            return 1;
+            return true;
         }
 
         bool onExpose(GdkEventExpose * event, Widget widget) {
@@ -194,8 +181,8 @@
             {
                 // Make the paper white, with a border
 
-                Point screen_page_left_bottom = model_to_screen(mPageLeftBottom);
-                Point screen_page_right_top = model_to_screen(mPageRightTop);
+                Point2 screen_page_left_bottom = model_to_screen(mPageLeftBottom);
+                Point2 screen_page_right_top = model_to_screen(mPageRightTop);
 
                 cr.setSourceRgba(1.0, 1.0, 1.0, 1.0);
                 rectangle(cr, screen_page_left_bottom, screen_page_right_top);
@@ -206,15 +193,15 @@
                 cr.stroke();
             }
 
-            return 1;
+            return true;
         }
 
         bool onButtonEvent(GdkEventButton * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got button event\n");
 
-            Point screen_point = new Point(event.x + 0.5, event.y + 0.5);
-            Point model_point = screen_to_model(screen_point);
+            Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
+            Point2 model_point = screen_to_model(screen_point);
 
             auto button_event = new ButtonEvent(gtk2tk_click(event.type),
                                                 gtk2tk_button(event.button),
@@ -224,7 +211,7 @@
 
             //mEventHandle.handle_button_press
 
-            return 1;
+            return true;
         }
 
         bool onKeyEvent(GdkEventKey * event, Widget widget) {
@@ -234,7 +221,7 @@
             //auto key_event = new KeyEvent("",
             // mEventHandle.handle_key(key_event);
 
-            return 1;
+            return true;
         }
 
         bool onMotionNotify(GdkEventMotion * event, Widget widget) {
@@ -243,8 +230,8 @@
             gtk_widget_event(mHRuler.getWidgetStruct(), cast(GdkEvent *)event);
             gtk_widget_event(mVRuler.getWidgetStruct(), cast(GdkEvent *)event);
 
-            Point screen_point = new Point(event.x + 0.5, event.y + 0.5);
-            Point model_point = screen_to_model(screen_point);
+            Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
+            Point2 model_point = screen_to_model(screen_point);
 
             auto motion_event = new MotionEvent(screen_point,
                                                 model_point,
@@ -252,15 +239,15 @@
 
             mEventHandler.handle_motion(this, motion_event);
 
-            return 1;
+            return true;
         }
 
         bool onScroll(GdkEventScroll * event, Widget widget) {
             assert(widget is mDrawingArea);
             //writefln("Got scroll\n");
 
-            Point screen_point = new Point(event.x + 0.5, event.y + 0.5);
-            Point model_point = screen_to_model(screen_point);
+            Point2 screen_point = Point2(event.x + 0.5, event.y + 0.5);
+            Point2 model_point = screen_to_model(screen_point);
 
             auto scroll_event = new ScrollEvent(gtk2tk_direction(event.direction),
                                                 screen_point,
@@ -269,16 +256,17 @@
 
             mEventHandler.handle_scroll(this, scroll_event);
 
-            return 1;
+            return true;
         }
 
         void onValueChanged(Adjustment adjustment) {
             GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
             GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
 
-            Point view_left_bottom = new Point(h_gtkAdjustment.value, v_gtkAdjustment.value);
+            Point2 view_left_bottom = Point2(gtk_adjustment_get_value(h_gtkAdjustment),
+                                             gtk_adjustment_get_value(v_gtkAdjustment));
             writefln("%s", view_left_bottom);
-            Vector model_size = screen_to_model(mViewSize);
+            Vector2 model_size = screen_to_model(mViewSize);
             mViewCentre = view_left_bottom + model_size / 2.0;
 
             update_rulers();
@@ -287,10 +275,10 @@
         }
 
         void update_rulers() {
-            Vector model_size = screen_to_model(mViewSize);
+            Vector2 model_size = screen_to_model(mViewSize);
 
-            Point view_left_bottom = mViewCentre - model_size / 2.0;
-            Point view_right_top = mViewCentre + model_size / 2.0;
+            Point2 view_left_bottom = mViewCentre - model_size / 2.0;
+            Point2 view_right_top = mViewCentre + model_size / 2.0;
 
             mHRuler.setRange(view_left_bottom.x,
                              view_right_top.x,
@@ -303,36 +291,36 @@
         }
 
         void update_adjustments() {
-            Vector model_size = screen_to_model(mViewSize);
+            Vector2 model_size = screen_to_model(mViewSize);
 
-            Point view_left_bottom = mViewCentre - model_size / 2.0;
-            Point view_right_top = mViewCentre + model_size / 2.0;
+            Point2 view_left_bottom = mViewCentre - model_size / 2.0;
+            Point2 view_right_top = mViewCentre + model_size / 2.0;
 
             // Adjust the canvas size if necessary
             mCanvasLeftBottom = min_extents(mCanvasLeftBottom, view_left_bottom);
             mCanvasRightTop = max_extents(mCanvasRightTop, view_right_top);
 
-            Vector canvas_size = mCanvasRightTop - mCanvasLeftBottom;
-            Vector page_size = mPageRightTop - mPageLeftBottom;
+            Vector2 canvas_size = mCanvasRightTop - mCanvasLeftBottom;
+            Vector2 page_size = mPageRightTop - mPageLeftBottom;
 
             // Update the adjustments
 
             GtkAdjustment * h_gtkAdjustment = mHAdjustment.getAdjustmentStruct();
             GtkAdjustment * v_gtkAdjustment = mVAdjustment.getAdjustmentStruct();
 
-            h_gtkAdjustment.lower = mCanvasLeftBottom.x;
-            h_gtkAdjustment.upper = mCanvasRightTop.x;
-            h_gtkAdjustment.value = view_left_bottom.x;
-            h_gtkAdjustment.step_increment = canvas_size.x / 10.0;
-            h_gtkAdjustment.page_increment = canvas_size.x / 5.0;
-            h_gtkAdjustment.page_size = model_size.x;
+            gtk_adjustment_set_lower(h_gtkAdjustment, mCanvasLeftBottom.x);
+            gtk_adjustment_set_upper(h_gtkAdjustment, mCanvasRightTop.x);
+            gtk_adjustment_set_value(h_gtkAdjustment, view_left_bottom.x);
+            gtk_adjustment_set_step_increment(h_gtkAdjustment, canvas_size.x / 10.0);
+            gtk_adjustment_set_page_increment(h_gtkAdjustment, canvas_size.x / 5.0);
+            gtk_adjustment_set_page_size(h_gtkAdjustment, model_size.x);
 
-            v_gtkAdjustment.lower = mCanvasLeftBottom.y;
-            v_gtkAdjustment.upper = mCanvasRightTop.y;
-            v_gtkAdjustment.value = view_left_bottom.y;
-            v_gtkAdjustment.step_increment = canvas_size.y / 10.0;
-            v_gtkAdjustment.page_increment = canvas_size.y / 5.0;
-            v_gtkAdjustment.page_size = model_size.y;
+            gtk_adjustment_set_lower(v_gtkAdjustment, mCanvasLeftBottom.y);
+            gtk_adjustment_set_upper(v_gtkAdjustment, mCanvasRightTop.y);
+            gtk_adjustment_set_value(v_gtkAdjustment, view_left_bottom.y);
+            gtk_adjustment_set_step_increment(v_gtkAdjustment, canvas_size.y / 10.0);
+            gtk_adjustment_set_page_increment(v_gtkAdjustment, canvas_size.y / 5.0);
+            gtk_adjustment_set_page_size(v_gtkAdjustment, model_size.y);
 
             mHAdjustment.changed();
             mHAdjustment.valueChanged();
@@ -340,32 +328,32 @@
             mVAdjustment.valueChanged();
         }
 
-        Point model_to_screen(Point model) { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
-        Point screen_to_model(Point screen) { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; }
-        Vector model_to_screen(Vector model) { return mZoom * model; }
-        Vector screen_to_model(Vector screen) { return screen / mZoom; }
+        Point2 model_to_screen(Point2 model) { return ORIGIN + mViewSize / 2.0 + mZoom * (model - mViewCentre); }
+        Point2 screen_to_model(Point2 screen) { return mViewCentre + (screen - mViewSize / 2.0 - ORIGIN) / mZoom; }
+        Vector2 model_to_screen(Vector2 model) { return mZoom * model; }
+        Vector2 screen_to_model(Vector2 screen) { return screen / mZoom; }
         double model_to_screen(double model) { return mZoom * model; }
         double screen_to_model(double screen) { return screen / mZoom; }
 
         double clamp_zoom(double zoom) { return clamp(zoom, 0.1, 10.0); }
 
-        static const Point ORIGIN;
-        static const Vector INITIAL_PAGE_SIZE;
+        static const Point2 ORIGIN;
+        static const Vector2 INITIAL_PAGE_SIZE;
 
         ICanvasEventHandler mEventHandler;
 
         // Model units are in millimetres
         // Screen units are in pixels
 
-        double mZoom;               // pixels-per-mm
-        Point mViewCentre;          // model: where in the model is the centre of our view
+        double mZoom;                // pixels-per-mm
+        Point2 mViewCentre;          // model: where in the model is the centre of our view
 
-        Point mCanvasLeftBottom;    // model: bottom left corner of canvas
-        Point mCanvasRightTop;      // model: top right corner of canvas
-        Point mPageLeftBottom;      // model: bottom left corner of page
-        Point mPageRightTop;        // model: top right corner of page
+        Point2 mCanvasLeftBottom;    // model: bottom left corner of canvas
+        Point2 mCanvasRightTop;      // model: top right corner of canvas
+        Point2 mPageLeftBottom;      // model: bottom left corner of page
+        Point2 mPageRightTop;        // model: top right corner of page
 
-        Vector mViewSize;           // screen: size of view window in pixels
+        Vector2 mViewSize;           // screen: size of view window in pixels
 
         HRuler mHRuler;
         VRuler mVRuler;