view doodle/gtk/palette.d @ 54:30ecedfe2ce2

Partial palette support
author "David Bryant <bagnose@gmail.com>"
date Sun, 08 Aug 2010 21:07:47 +0930
parents 4dadc3c03b7e
children 4922e746dd76
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 glib.ListSG;
    import std.stdio;
}

class Palette : Toolbar, IPalette {
    this() {
        setIconSize(GtkIconSize.LARGE_TOOLBAR);
        setStyle(GtkToolbarStyle.ICONS);
        setOrientation(GtkOrientation.HORIZONTAL);
        setTooltips(true);
    }

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

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

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