2
* \brief Simplified management of enumerations in the UI as combobox.
5
* Nicholas Bishop <nicholasbishop@gmail.com>
6
* Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
8
* Copyright (C) 2007 Authors
10
* Released under GNU GPL. Read the file 'COPYING' for more information.
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"
20
#include "ui/widget/labelled.h"
26
template<typename E> class ComboBoxEnum : public Gtk::ComboBox, public AttrWidget
29
ComboBoxEnum(E default_value, const Util::EnumDataConverter<E>& c, const SPAttributeEnum a = SP_ATTR_INVALID)
30
: AttrWidget(a, (unsigned int)default_value), setProgrammatically(false), _converter(c)
32
signal_changed().connect(signal_attr_changed().make_slot());
34
_model = Gtk::ListStore::create(_columns);
37
pack_start(_columns.label);
40
for(int i = 0; i < _converter.end; ++i) {
41
Gtk::TreeModel::Row row = *_model->append();
42
const Util::EnumData<E>* data = &_converter.data(i);
43
row[_columns.data] = data;
44
row[_columns.label] = _( _converter.get_label(data->id).c_str() );
46
set_active_by_id(default_value);
49
ComboBoxEnum(const Util::EnumDataConverter<E>& c, const SPAttributeEnum a = SP_ATTR_INVALID)
50
: AttrWidget(a, (unsigned int) 0), setProgrammatically(false), _converter(c)
52
signal_changed().connect(signal_attr_changed().make_slot());
54
_model = Gtk::ListStore::create(_columns);
57
pack_start(_columns.label);
60
for(int i = 0; i < _converter.end; ++i) {
61
Gtk::TreeModel::Row row = *_model->append();
62
const Util::EnumData<E>* data = &_converter.data(i);
63
row[_columns.data] = data;
64
row[_columns.label] = _( _converter.get_label(data->id).c_str() );
69
virtual Glib::ustring get_as_attribute() const
71
return get_active_data()->key;
74
virtual void set_from_attribute(SPObject* o)
76
setProgrammatically = true;
77
const gchar* val = attribute_value(o);
79
set_active(_converter.get_id_from_key(val));
81
set_active(get_default()->as_uint());
84
const Util::EnumData<E>* get_active_data() const
86
Gtk::TreeModel::iterator i = this->get_active();
88
return (*i)[_columns.data];
92
void add_row(const Glib::ustring& s)
94
Gtk::TreeModel::Row row = *_model->append();
95
row[_columns.data] = 0;
96
row[_columns.label] = s;
99
void remove_row(E id) {
100
Gtk::TreeModel::iterator i;
102
for(i = _model->children().begin(); i != _model->children().end(); ++i) {
103
const Util::EnumData<E>* data = (*i)[_columns.data];
109
if(i != _model->children().end())
113
void set_active_by_id(E id) {
114
setProgrammatically = true;
115
for(Gtk::TreeModel::iterator i = _model->children().begin();
116
i != _model->children().end(); ++i)
118
const Util::EnumData<E>* data = (*i)[_columns.data];
126
void set_active_by_key(const Glib::ustring& key) {
127
setProgrammatically = true;
128
set_active_by_id( _converter.get_id_from_key(key) );
131
bool setProgrammatically;
134
class Columns : public Gtk::TreeModel::ColumnRecord
143
Gtk::TreeModelColumn<const Util::EnumData<E>*> data;
144
Gtk::TreeModelColumn<Glib::ustring> label;
148
Glib::RefPtr<Gtk::ListStore> _model;
149
const Util::EnumDataConverter<E>& _converter;
153
template<typename E> class LabelledComboBoxEnum : public Labelled
156
LabelledComboBoxEnum( Glib::ustring const &label,
157
Glib::ustring const &tooltip,
158
const Util::EnumDataConverter<E>& c,
159
Glib::ustring const &suffix = "",
160
Glib::ustring const &icon = "",
161
bool mnemonic = true)
162
: Labelled(label, tooltip, new ComboBoxEnum<E>(c), suffix, icon, mnemonic)
165
ComboBoxEnum<E>* getCombobox() {
166
return static_cast< ComboBoxEnum<E>* > (_widget);
179
c-file-style:"stroustrup"
180
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
185
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :