changeset 60:e64baac3efb2

Attempt at a templatised palette
author David Bryant <bagnose@gmail.com>
date Tue, 10 Aug 2010 22:55:54 +0930
parents 860e18c87255
children 08ffc44fc21a
files doodle/dia/tool_layer.d doodle/gtk/palette2.d doodle/main/prog/doodler.d
diffstat 3 files changed, 113 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/doodle/dia/tool_layer.d	Mon Aug 09 21:50:16 2010 +0930
+++ b/doodle/dia/tool_layer.d	Tue Aug 10 22:55:54 2010 +0930
@@ -15,7 +15,7 @@
 }
 
 interface IToolStackObserver {
-    void toolChanged(int index);
+    void toolChanged(Tool tool);
 }
 
 final class ToolLayer : Layer, IEventHandler, IToolStack {
@@ -31,7 +31,7 @@
         assert(_grabbedTool is null);
         message("using new tool: %s", tool.name);
         _tools ~= tool;
-        //_observer.toolChanged(_tools.length - 1);
+        _observer.toolChanged(tool);
     }
 
     // Layer overrides:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doodle/gtk/palette2.d	Tue Aug 10 22:55:54 2010 +0930
@@ -0,0 +1,91 @@
+module doodle.gtk.palette2;
+
+public {
+    import gtk.Toolbar;
+}
+
+private {
+    import doodle.core.logging;
+    import gtk.ToolButton;
+    import gtk.RadioToolButton;
+    import gtk.Image;
+    import gtk.Label;
+    import glib.ListSG;
+    import std.stdio;
+}
+
+class Palette2(T) : Toolbar {
+    struct Item {
+        string iconPath;
+        string labelText;
+        string tooltipText;
+        T t;
+    };
+
+    alias void delegate(T) Callback;
+
+    this() {
+        // INVALID, MENU, SMALL_TOOLBAR, LARGE_TOOLBAR,
+        // BUTTON, DND, DIALOG
+        setIconSize(GtkIconSize.LARGE_TOOLBAR);
+	// ICONS, TEXT, BOTH, BOTH_HORIZ
+        setStyle(GtkToolbarStyle.ICONS);
+	// HORIZONTAL, VERTICAL
+        setOrientation(GtkOrientation.HORIZONTAL);
+        setTooltips(true);
+    }
+
+    void configure(Item[] items, Callback callback) {
+        _callback = callback;
+
+        RadioToolButton group;
+
+        foreach(index, item; items) {
+            RadioToolButton button;
+
+            if (index == 0) {
+                ListSG list;
+                button = new RadioToolButton(list);
+                group = button;
+            }
+            else {
+                button = new RadioToolButton(group);
+            }
+
+            auto image = new Image(_iconBase ~ "/" ~ item.iconPath);
+            auto label = new Label(item.tooltipText);
+            button.setIconWidget(image);
+            button.setLabelWidget(label);
+            button.setTooltipText(item.tooltipText);
+
+            _buttons[item.t] = button;
+            button.objectGSetDataFull(_indexStr, cast(gpointer)item.t);
+            button.addOnClicked(&onClicked);
+
+            insert(button);
+        }
+    }
+
+    void activate(T t) {
+        RadioToolButton button = _buttons[t];
+        if (!button.getActive) {
+            button.setActive(true);
+        }
+    }
+
+    private {
+        immutable _iconBase = "/home/daveb/source/d/doodle/doodle/gtk/data";
+        immutable _indexStr = "index";
+
+        Callback _callback;
+        RadioToolButton[T] _buttons;
+
+        void onClicked(ToolButton toolButton) {
+            RadioToolButton button = cast(RadioToolButton)toolButton;
+            if (button.getActive) {
+                T t = cast(T)button.getData(_indexStr);
+                _callback(t);
+            }
+        }
+    }
+}
--- a/doodle/main/prog/doodler.d	Mon Aug 09 21:50:16 2010 +0930
+++ b/doodle/main/prog/doodler.d	Tue Aug 10 22:55:54 2010 +0930
@@ -12,7 +12,7 @@
     import doodle.fig.tools;
 
     import doodle.gtk.canvas;
-    import doodle.gtk.palette;
+    import doodle.gtk.palette2;
 
     import gtk.Main;
     import gtk.MainWindow;
@@ -27,15 +27,9 @@
         auto window = new MainWindow("Doodle");
         auto vbox = new VBox(false, 0);
 
-        auto palette = new Palette;
+        auto palette = new Palette2!Tool;
         _palette = palette;
-        IPalette.Item[] items = [
-        { "select.svg",    "Select",    "Select and modify elements", &paletteCallback },
-        { "rectangle.svg", "Rectangle", "Create rectangle",           &paletteCallback },
-        { "ellipse.svg",   "Ellipse",   "Create ellipse",             &paletteCallback },
-        { "polyline.svg",  "Polyline",  "Create polyline",            &paletteCallback }
-        ];
-        _palette.configure(items);
+
         vbox.packStart(palette, false, false, 0);
 
         Tool[] tools;
@@ -45,11 +39,11 @@
         auto toolLayer = new ToolLayer(tools, this);
         _toolStack = toolLayer;
 
+        auto gridLayer = new GridLayer;
+
         auto diagramLayer = new DiagramLayer;
         _diagram = diagramLayer;
 
-        auto gridLayer = new GridLayer;
-
         Layer[] layers;
         layers ~= new PageLayer;
         layers ~= gridLayer;
@@ -57,40 +51,33 @@
         auto canvas = new Canvas(layers, toolLayer, gridLayer, 120.0);
 
         vbox.packStart(canvas, true, true, 0);
+
+        Palette2!Tool.Item[] items = [
+        { "select.svg",    "Select",    "Select and modify elements", new SelectTool },
+        { "rectangle.svg", "Rectangle", "Create rectangle", new CreateRectangleTool(_diagram) },
+        { "ellipse.svg",   "Ellipse",   "Create ellipse", new CreateRectangleTool(_diagram) },
+        { "polyline.svg",  "Polyline",  "Create polyline", new CreateRectangleTool(_diagram) }
+        ];
+
+        palette.configure(items, &paletteCallback);
         window.add(vbox);
         window.setDefaultSize(640, 580);
         window.showAll();
         Main.run();
     }
 
-    void toolChanged(int index) {      // FIXME dmd bug? have to make this public
-        message("Tool changed %s", index);
-        _palette.activate(index);
+    void toolChanged(Tool tool) {
+        message("Tool changed %s", tool.name);
+        _palette.activate(tool);
     }
 
     private {
         IToolStack _toolStack;
-        IPalette _palette;
+        Palette2!Tool _palette;     // FIXME refer to the interface?
         IDiagram _diagram;
 
-        void paletteCallback(int index) {
-            switch (index) {
-            case 0:
-                // Select
-                break;
-            case 1:
-                // Rectangle
-                _toolStack.use(new CreateRectangleTool(_diagram));
-                break;
-            case 2:
-                // Ellipse
-                break;
-            case 3:
-                // Polyline
-                break;
-            default:
-                assert(0);
-            }
+        void paletteCallback(Tool tool) {
+            _toolStack.use(tool);
         }
 
     }