Mercurial > projects > doodle
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); } }