changeset 54:30ecedfe2ce2

Partial palette support
author "David Bryant <bagnose@gmail.com>"
date Sun, 08 Aug 2010 21:07:47 +0930
parents fbabd1957c89
children 4922e746dd76
files doodle/fig/diagram_elements.d doodle/fig/diagram_layer.d doodle/fig/fig.d doodle/fig/fig_layer.d doodle/gtk/canvas.d doodle/gtk/palette.d doodle/main/prog/doodler.d doodle/tk/palette.d
diffstat 8 files changed, 150 insertions(+), 105 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doodle/fig/diagram_elements.d	Sun Aug 08 21:07:47 2010 +0930
@@ -0,0 +1,60 @@
+module doodle.fig.diagram_elements;
+
+private {
+    import doodle.tk.geometry;
+    import doodle.cairo.routines;
+}
+
+abstract class DiagramElement {
+    Rectangle bounds() const;
+
+    void draw(in Rectangle damage, scope Context cr) const;
+
+    private {
+        GraphElement _container;
+    }
+}
+
+abstract class SemanticModelBridge {
+};
+
+abstract class GraphElement : DiagramElement {
+    // Link to model via bridge goes here
+    private {
+        SemanticModelBridge _modelBridge;
+        GraphConnector[] _anchorages;
+    }
+}
+
+final class GraphConnector {
+}
+
+final class GraphNode : GraphElement {
+}
+
+final class GraphEdge : GraphElement {
+    private {
+        GraphConnector[2] _anchors;
+    }
+}
+
+abstract class LeafElement : DiagramElement {
+}
+
+final class TextElement : LeafElement {
+}
+
+abstract class GraphicPrimitive : LeafElement {
+}
+
+final class PolylinePrimitive : GraphicPrimitive {
+    private {
+        Point[] _waypoints;
+    }
+}
+
+final class RectanglePrimitive : GraphicPrimitive {
+    override void draw(in Rectangle damage, scope Context cr) const {
+        rectangle(cr, bounds);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doodle/fig/diagram_layer.d	Sun Aug 08 21:07:47 2010 +0930
@@ -0,0 +1,39 @@
+module doodle.fig.diagram_layer;
+
+public {
+    import doodle.dia.icanvas;
+    import doodle.fig.diagram_elements;
+    import std.array;
+}
+
+class DiagramLayer : Layer {
+    this(in string name) {
+        super(name);
+    }
+
+    void add(DiagramElement element) {
+        _elements ~= element;
+    }
+
+    // Layer overrides:
+
+    override Rectangle bounds() const {
+        return Rectangle.DEFAULT;
+    }
+
+    override void draw(in Viewport viewport,
+                       in Rectangle pixelDamage, scope Context pixelCr,
+                       in Rectangle modelDamage, scope Context modelCr) const {
+        foreach (e; _elements) {
+            if ((e.bounds & modelDamage).valid) {
+                e.draw(modelDamage, modelCr);
+            }
+        }
+    }
+
+    private {
+        // Root elements in z-buffer order, ie we draw in forward
+        // order thru the array
+        DiagramElement[] _elements;
+    }
+}
--- a/doodle/fig/fig.d	Fri Aug 06 09:38:36 2010 +0930
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-module doodle.fig.fig;
-
-private {
-    import doodle.tk.geometry;
-    import cairo.Context;
-}
-
-interface FigParent {
-}
-
-abstract class Fig {
-    Rectangle bounds() const;
-
-    void draw(in Rectangle damage, scope Context cr) const;
-
-    private {
-        FigParent mParent;
-    }
-}
-
-abstract class FigElement : Fig {
-    // Link to model via bridge goes here
-}
-
-class Connection {
-}
-
-class FigNode : FigElement {
-}
-
-class FigEdge : FigElement {
-    private {
-        Connection[] _connections;
-    }
-}
-
-abstract class FigLeaf : Fig {
-}
--- a/doodle/fig/fig_layer.d	Fri Aug 06 09:38:36 2010 +0930
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-module doodle.fig.fig_layer;
-
-public {
-    import doodle.dia.icanvas;
-    import doodle.fig.fig;
-}
-
-class FigLayer : Layer {
-    this(in string name) {
-        super(name);
-    }
-
-    // Layer overrides:
-
-    override Rectangle bounds() const {
-        return Rectangle.DEFAULT;
-    }
-
-    override void draw(in Viewport viewport,
-                       in Rectangle pixelDamage, scope Context pixelCr,
-                       in Rectangle modelDamage, scope Context modelCr) const {
-    }
-
-    private {
-        Fig[] _figs;
-    }
-}
--- a/doodle/gtk/canvas.d	Fri Aug 06 09:38:36 2010 +0930
+++ b/doodle/gtk/canvas.d	Sun Aug 08 21:07:47 2010 +0930
@@ -65,7 +65,6 @@
 
         // Create our child widgets and register callbacks
 
-        info("B1");
         _hRuler = new HRuler;
         attach(_hRuler,
                1, 2,
@@ -74,16 +73,13 @@
                0, 0);
         _hRuler.setMetric(MetricType.PIXELS);
 
-        info("B2");
         _vRuler = new VRuler;
         attach(_vRuler,
                0, 1,
                1, 2,
                AttachOptions.SHRINK, AttachOptions.FILL | AttachOptions.EXPAND,
                0, 0);
-        info("B3");
         _vRuler.setMetric(MetricType.PIXELS);
-        info("J");
 
         _drawingArea = new DrawingArea;
         _drawingArea.addOnRealize(&onRealize);
@@ -109,7 +105,6 @@
                                EventMask.LEAVE_NOTIFY_MASK |
                                EventMask.FOCUS_CHANGE_MASK |
                                EventMask.SCROLL_MASK);
-        info("M");
 
         attach(_drawingArea,
                1, 2,
@@ -128,7 +123,6 @@
                2, 3,
                AttachOptions.FILL | AttachOptions.EXPAND, AttachOptions.SHRINK,
                0, 0);
-        info("Q");
 
         _vAdjustment = new Adjustment(0.0, 0.0, 1.0, 0.2, 0.5, 0.5);
         _vAdjustment.addOnValueChanged(&onValueChanged);
@@ -216,7 +210,6 @@
             Rectangle paddedLayerBounds = expand(move(layerBounds, - layerBounds.size), 2.0 * layerBounds.size);
 
             if (!_hadConfigure) {
-                info("1");
                 const double MM_PER_INCH = 25.4;
                 _zoom = 0.25 * _ppi / MM_PER_INCH;
 
--- a/doodle/gtk/palette.d	Fri Aug 06 09:38:36 2010 +0930
+++ b/doodle/gtk/palette.d	Sun Aug 08 21:07:47 2010 +0930
@@ -6,11 +6,12 @@
 }
 
 private {
+    import doodle.core.logging;
     import gtk.ToolButton;
+    import gtk.RadioToolButton;
+    import gtk.Image;
     import glib.ListSG;
     import std.stdio;
-    import gtk.RadioToolButton;
-    import gtk.Image;
 }
 
 class Palette : Toolbar, IPalette {
@@ -21,41 +22,41 @@
         setTooltips(true);
     }
 
-    //void set(
+    override void configure(in Item[] items) {
+        _items = items.dup;
+        ListSG group;
 
-    int add(in string iconPath, in string tooltipText, void delegate(int) dg) {
-        auto button = new RadioToolButton(_group);
-        auto image = new Image(iconBase ~ "/" ~ iconPath);
-        button.setLabelWidget(image);
-        int * i = new int;
-        *i = _delegates.length;
-        _delegates[*i] = dg;
-        button.objectGSetDataFull(indexStr, cast(gpointer)i);
-        button.addOnClicked(&onClicked);
-        insert(button);
-        return *i;
+        foreach(index, item; _items) {
+            auto button = new RadioToolButton(group);
+            if (index == 0) group = button.getGroup;
+            auto image = new Image(_iconBase ~ "/" ~ item.iconPath);
+            button.setLabelWidget(image);
+            button.setTooltipText(item.tooltipText);
+
+            int * i = new int;
+            *i = index;
+            button.objectGSetDataFull(_indexStr, cast(gpointer)i);
+            button.addOnClicked(&onClicked);
+
+            insert(button);
+        }
     }
 
-    void remove(in int id) {
-    }
-
-    void activate(in int id) {
+    override void activate(in int index) {
+        warning("Not yet implemented");
     }
 
     private {
-        immutable iconBase = "/home/daveb/source/d/doodle/source/doodle/gtk/data";
-        immutable indexStr = "index";
-        ListSG _group;
-        void delegate(int) _delegates[int];
+        immutable _iconBase = "/home/daveb/source/d/doodle/doodle/gtk/data";
+        immutable _indexStr = "index";
+        Item[] _items;
 
-        void onClicked(ToolButton tool_button) {
-            int * i = cast(int *)tool_button.getData(indexStr);
-            _delegates[*i](*i);
+        void onClicked(ToolButton toolButton) {
+            RadioToolButton button = cast(RadioToolButton)toolButton;
+            if (button.getActive) {
+                int * i = cast(int *)button.getData(_indexStr);
+                _items[*i].callback(*i);
+            }
         }
-
-        /*
-        ToolButton find(int index) {
-        }
-        */
     }
 }
--- a/doodle/main/prog/doodler.d	Fri Aug 06 09:38:36 2010 +0930
+++ b/doodle/main/prog/doodler.d	Sun Aug 08 21:07:47 2010 +0930
@@ -20,6 +20,10 @@
 }
 
 void main(string[] args) {
+    void paletteCallback(int index) {
+        writefln("Callback %s", index);
+    }
+
     Main.init(args);
     auto window = new MainWindow("Doodle");
     auto vbox = new VBox(false, 0);
@@ -29,11 +33,19 @@
     +/
 
     auto palette = new Palette;
+    IPalette.Item[] items =
+        [
+        { "select.svg", "Select", &paletteCallback },
+        { "select.svg", "Select", &paletteCallback }
+        ];
+        palette.configure(items);
+    /*
     palette.add("select.svg", "tooltip-text", (int i){ writefln("Wow %s", i); });
     palette.add("select.svg", "tooltip-text", (int i){ writefln("Wow %s", i); });
     palette.add("select.svg", "tooltip-text", (int i){ writefln("Wow %s", i); });
     palette.add("select.svg", "tooltip-text", (int i){ writefln("Wow %s", i); });
     palette.add("select.svg", "tooltip-text", (int i){ writefln("Wow %s", i); });
+    */
     vbox.packStart(palette, false, false, 0);
 
     Tool[] tools;
--- a/doodle/tk/palette.d	Fri Aug 06 09:38:36 2010 +0930
+++ b/doodle/tk/palette.d	Sun Aug 08 21:07:47 2010 +0930
@@ -1,7 +1,12 @@
 module doodle.tk.palette;
 
 interface IPalette {
-    int add(in string iconPath, in string tooltipText, void delegate(int) dg);
-    void remove(in int id);
-    void activate(in int id);
+    struct Item {
+        string iconPath;
+        string tooltipText;
+        void delegate(int) callback;
+    }
+
+    void configure(in Item[] items);
+    void activate(in int index);
 }