~ubuntu-branches/debian/squeeze/inkscape/squeeze

« back to all changes in this revision

Viewing changes to src/ui/widget/combo-enums.h

  • Committer: Bazaar Package Importer
  • Author(s): Thomas Viehmann
  • Date: 2008-09-09 23:29:02 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20080909232902-c50iujhk1w79u8e7
Tags: 0.46-2.1
* Non-maintainer upload.
* Add upstream patch fixing a crash in the open dialog
  in the zh_CN.utf8 locale. Closes: #487623.
  Thanks to Luca Bruno for the patch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 */
 
12
 
 
13
#ifndef INKSCAPE_UI_WIDGET_COMBO_ENUMS_H
 
14
#define INKSCAPE_UI_WIDGET_COMBO_ENUMS_H
 
15
 
 
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"
 
21
 
 
22
namespace Inkscape {
 
23
namespace UI {
 
24
namespace Widget {
 
25
 
 
26
template<typename E> class ComboBoxEnum : public Gtk::ComboBox, public AttrWidget
 
27
{
 
28
public:
 
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)
 
31
    {
 
32
        signal_changed().connect(signal_attr_changed().make_slot());
 
33
 
 
34
        _model = Gtk::ListStore::create(_columns);
 
35
        set_model(_model);
 
36
 
 
37
        pack_start(_columns.label);
 
38
 
 
39
        // Initialize list
 
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() );
 
45
        }
 
46
        set_active_by_id(default_value);
 
47
    }
 
48
 
 
49
    ComboBoxEnum(const Util::EnumDataConverter<E>& c, const SPAttributeEnum a = SP_ATTR_INVALID)
 
50
        : AttrWidget(a, (unsigned int) 0), setProgrammatically(false), _converter(c)
 
51
    {
 
52
        signal_changed().connect(signal_attr_changed().make_slot());
 
53
 
 
54
        _model = Gtk::ListStore::create(_columns);
 
55
        set_model(_model);
 
56
 
 
57
        pack_start(_columns.label);
 
58
 
 
59
        // Initialize list
 
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() );
 
65
        }
 
66
        set_active(0);
 
67
    }
 
68
 
 
69
    virtual Glib::ustring get_as_attribute() const
 
70
    {
 
71
        return get_active_data()->key;
 
72
    }
 
73
 
 
74
    virtual void set_from_attribute(SPObject* o)
 
75
    {
 
76
        setProgrammatically = true;
 
77
        const gchar* val = attribute_value(o);
 
78
        if(val)
 
79
            set_active(_converter.get_id_from_key(val));
 
80
        else
 
81
            set_active(get_default()->as_uint());
 
82
    }
 
83
    
 
84
    const Util::EnumData<E>* get_active_data() const
 
85
    {
 
86
        Gtk::TreeModel::iterator i = this->get_active();
 
87
        if(i)
 
88
            return (*i)[_columns.data];
 
89
        return 0;
 
90
    }
 
91
 
 
92
    void add_row(const Glib::ustring& s)
 
93
    {
 
94
        Gtk::TreeModel::Row row = *_model->append();
 
95
        row[_columns.data] = 0;
 
96
        row[_columns.label] = s;
 
97
    }
 
98
 
 
99
    void remove_row(E id) {
 
100
        Gtk::TreeModel::iterator i;
 
101
        
 
102
        for(i = _model->children().begin(); i != _model->children().end(); ++i) {
 
103
            const Util::EnumData<E>* data = (*i)[_columns.data];
 
104
 
 
105
            if(data->id == id)
 
106
                break;
 
107
        }
 
108
 
 
109
        if(i != _model->children().end())
 
110
            _model->erase(i);
 
111
    }
 
112
 
 
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) 
 
117
        {
 
118
            const Util::EnumData<E>* data = (*i)[_columns.data];
 
119
            if(data->id == id) {
 
120
                set_active(i);
 
121
                break;
 
122
            }
 
123
        }
 
124
    };
 
125
 
 
126
    void set_active_by_key(const Glib::ustring& key) {
 
127
        setProgrammatically = true;
 
128
        set_active_by_id( _converter.get_id_from_key(key) );
 
129
    };
 
130
 
 
131
    bool setProgrammatically;
 
132
 
 
133
private:
 
134
    class Columns : public Gtk::TreeModel::ColumnRecord
 
135
    {
 
136
    public:
 
137
        Columns()
 
138
        {
 
139
            add(data);
 
140
            add(label);
 
141
        }
 
142
 
 
143
        Gtk::TreeModelColumn<const Util::EnumData<E>*> data;
 
144
        Gtk::TreeModelColumn<Glib::ustring> label;
 
145
    };
 
146
 
 
147
    Columns _columns;
 
148
    Glib::RefPtr<Gtk::ListStore> _model;
 
149
    const Util::EnumDataConverter<E>& _converter;
 
150
};
 
151
 
 
152
 
 
153
template<typename E> class LabelledComboBoxEnum : public Labelled
 
154
{
 
155
public:
 
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)
 
163
    { }
 
164
 
 
165
    ComboBoxEnum<E>* getCombobox() {
 
166
        return static_cast< ComboBoxEnum<E>* > (_widget);
 
167
    }
 
168
};
 
169
 
 
170
}
 
171
}
 
172
}
 
173
 
 
174
#endif
 
175
 
 
176
/*
 
177
  Local Variables:
 
178
  mode:c++
 
179
  c-file-style:"stroustrup"
 
180
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
 
181
  indent-tabs-mode:nil
 
182
  fill-column:99
 
183
  End:
 
184
*/
 
185
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :