view doodle/gtk/palette.d @ 55:4922e746dd76

Checkpoint
author "David Bryant <bagnose@gmail.com>"
date Sun, 08 Aug 2010 21:37:38 +0930
parents 30ecedfe2ce2
children
line wrap: on
line source

module doodle.gtk.palette;

public {
    import doodle.tk.palette;
    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 Palette : Toolbar, IPalette {
    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);
    }

    override void configure(in Item[] items) {
        _items = items.dup;

        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);

            int * i = new int;
            *i = index;
            button.objectGSetDataFull(_indexStr, cast(gpointer)i);
            button.addOnClicked(&onClicked);

            insert(button);
        }
    }

    override void activate(in int index) {
        warning("Not yet implemented");
    }

    private {
        immutable _iconBase = "/home/daveb/source/d/doodle/doodle/gtk/data";
        immutable _indexStr = "index";
        Item[] _items;

        void onClicked(ToolButton toolButton) {
            RadioToolButton button = cast(RadioToolButton)toolButton;
            if (button.getActive) {
                int * i = cast(int *)button.getData(_indexStr);
                _items[*i].callback(*i);
            }
        }
    }
}