Code

fix for bug #184671 (Filter effects properties not updating correctly)
[inkscape.git] / src / ui / widget / attr-widget.h
1 /**
2  * \brief Very basic interface for classes that control attributes
3  *
4  * Authors:
5  *   Nicholas Bishop <nicholasbishop@gmail.com>
6  *   Rodrigo Kumpera <kumpera@gmail.com>
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_ATTR_WIDGET_H
14 #define INKSCAPE_UI_WIDGET_ATTR_WIDGET_H
16 #include "attributes.h"
17 #include "sp-object.h"
18 #include "xml/node.h"
20 namespace Inkscape {
21 namespace UI {
22 namespace Widget {
24 enum DefaultValueType
25 {
26     T_NONE,
27     T_DOUBLE,
28     T_VECT_DOUBLE,
29     T_BOOL
30 };
32 class DefaultValueHolder
33 {
34     DefaultValueType type;
35     union {
36         double d_val;
37         std::vector<double>* vt_val;
38         bool b_val;
39     } value;
41     //FIXME remove copy ctor and assignment operator as private to avoid double free of the vector
42 public:
43     DefaultValueHolder () {
44         type = T_NONE;
45     }
47     DefaultValueHolder (double d) {
48         type = T_DOUBLE;
49         value.d_val = d;
50     }
52     DefaultValueHolder (std::vector<double>* d) {
53         type = T_VECT_DOUBLE;
54         value.vt_val = d;
55     }
57     DefaultValueHolder (bool d) {
58         type = T_BOOL;
59         value.b_val = d;
60     }
62     ~DefaultValueHolder() {
63         if (type == T_VECT_DOUBLE)
64             delete value.vt_val;
65     }
67     bool as_bool() {
68         g_assert (type == T_BOOL);
69         return value.b_val;
70     }
72     double as_double() {
73         g_assert (type == T_DOUBLE);
74         return value.d_val;
75     }
77     std::vector<double>* as_vector() {
78         g_assert (type == T_VECT_DOUBLE);
79         return value.vt_val;
80     }
81 };
83 class AttrWidget
84 {
85 public:
86     AttrWidget(const SPAttributeEnum a, double value)
87         : _attr(a),
88           _default(value)
89     {}
91     AttrWidget(const SPAttributeEnum a, bool value)
92         : _attr(a),
93           _default(value)
94     {}
96     AttrWidget(const SPAttributeEnum a)
97         : _attr(a),
98           _default()
99     {}
101     virtual ~AttrWidget()
102     {}
104     virtual Glib::ustring get_as_attribute() const = 0;
105     virtual void set_from_attribute(SPObject*) = 0;
107     SPAttributeEnum get_attribute() const
108     {
109         return _attr;
110     }
112     sigc::signal<void>& signal_attr_changed()
113     {
114         return _signal;
115     }
116 protected:
117     DefaultValueHolder* get_default() { return &_default; }
118     const gchar* attribute_value(SPObject* o) const
119     {
120         const gchar* name = (const gchar*)sp_attribute_name(_attr);
121         if(name && o) {
122             const gchar* val = SP_OBJECT_REPR(o)->attribute(name);
123             return val;
124         }
125         return 0;
126     }
128 private:
129     const SPAttributeEnum _attr;
130     DefaultValueHolder _default;
131     sigc::signal<void> _signal;
132 };
138 #endif
140 /*
141   Local Variables:
142   mode:c++
143   c-file-style:"stroustrup"
144   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
145   indent-tabs-mode:nil
146   fill-column:99
147   End:
148 */
149 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :