Code

Filter effects dialog:
[inkscape.git] / src / ui / widget / combo-enums.h
1 /**
2  * \brief Simplified management of enumerations in the UI as combobox.
3  *
4  * Authors:
5  *   Nicholas Bishop <nicholasbishop@gmail.com>
6  *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
7  *
8  * Copyright (C) 2007 Authors
9  *
10  * Released under GNU GPL.  Read the file 'COPYING' for more information.
11  */
13 #ifndef INKSCAPE_UI_WIDGET_COMBO_ENUMS_H
14 #define INKSCAPE_UI_WIDGET_COMBO_ENUMS_H
16 #include <gtkmm/combobox.h>
17 #include <gtkmm/liststore.h>
18 #include "attr-widget.h"
19 #include "util/enums.h"
21 namespace Inkscape {
22 namespace UI {
23 namespace Widget {
25 template<typename E> class ComboBoxEnum : public Gtk::ComboBox, public AttrWidget
26 {
27 public:
28     ComboBoxEnum(const Util::EnumDataConverter<E>& c, const SPAttributeEnum a = SP_ATTR_INVALID)
29         : AttrWidget(a), _converter(c)
30     {
31         signal_changed().connect(signal_attr_changed().make_slot());
33         _model = Gtk::ListStore::create(_columns);
34         set_model(_model);
36         pack_start(_columns.label);
38         // Initialize list
39         for(int i = 0; i < _converter.end; ++i) {
40             Gtk::TreeModel::Row row = *_model->append();
41             const Util::EnumData<E>* data = &_converter.data(i);
42             row[_columns.data] = data;
43             row[_columns.label] = _converter.get_label(data->id);
44         }
46         set_active(0);
47     }
49     virtual Glib::ustring get_as_attribute() const
50     {
51         return get_active_data()->key;
52     }
54     virtual void set_from_attribute(SPObject* o)
55     {
56         const gchar* val = attribute_value(o);
57         if(val)
58             set_active(_converter.get_id_from_key(val));
59         else
60             set_active(0);
61     }
62     
63     const Util::EnumData<E>* get_active_data() const
64     {
65         Gtk::TreeModel::iterator i = this->get_active();
66         if(i)
67             return (*i)[_columns.data];
68         return 0;
69     }
71     void add_row(const Glib::ustring& s)
72     {
73         Gtk::TreeModel::Row row = *_model->append();
74         row[_columns.data] = 0;
75         row[_columns.label] = s;
76     }
77 private:
78     class Columns : public Gtk::TreeModel::ColumnRecord
79     {
80     public:
81         Columns()
82         {
83             add(data);
84             add(label);
85         }
87         Gtk::TreeModelColumn<const Util::EnumData<E>*> data;
88         Gtk::TreeModelColumn<Glib::ustring> label;
89     };
91     Columns _columns;
92     Glib::RefPtr<Gtk::ListStore> _model;
93     const Util::EnumDataConverter<E>& _converter;
94 };
96 }
97 }
98 }
100 #endif
102 /*
103   Local Variables:
104   mode:c++
105   c-file-style:"stroustrup"
106   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
107   indent-tabs-mode:nil
108   fill-column:99
109   End:
110 */
111 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :