Code

LPE: fix undo bug for applying/removing effect
[inkscape.git] / src / live_effects / lpeobject.cpp
1 #define INKSCAPE_LIVEPATHEFFECT_OBJECT_CPP\r
2 \r
3 /*\r
4  * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>\r
5  *\r
6  * Released under GNU GPL, read the file 'COPYING' for more information\r
7  */\r
8 \r
9 #include "xml/repr.h"\r
10 #include "xml/node-event-vector.h"\r
11 #include "sp-object.h"\r
12 #include "attributes.h"\r
13 \r
14 #include "document.h"\r
15 #include <glibmm/i18n.h>\r
16 \r
17 #include "live_effects/lpeobject.h"\r
18 #include "live_effects/effect.h"\r
19 \r
20 //#define LIVEPATHEFFECT_VERBOSE\r
21 \r
22 static void livepatheffect_class_init(LivePathEffectObjectClass *klass);\r
23 static void livepatheffect_init(LivePathEffectObject *stop);\r
24 \r
25 static void livepatheffect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);\r
26 static void livepatheffect_release(SPObject *object);\r
27 \r
28 static void livepatheffect_set(SPObject *object, unsigned key, gchar const *value);\r
29 static Inkscape::XML::Node *livepatheffect_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);\r
30 \r
31 static void livepatheffect_on_repr_attr_changed (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive, void * data);\r
32 \r
33 static SPObjectClass *livepatheffect_parent_class;\r
34 /**\r
35  * Registers the LivePathEffect class with Gdk and returns its type number.\r
36  */\r
37 GType\r
38 livepatheffect_get_type ()\r
39 {\r
40     static GType livepatheffect_type = 0;\r
41 \r
42     if (!livepatheffect_type) {\r
43         GTypeInfo livepatheffect_info = {\r
44             sizeof (LivePathEffectObjectClass),\r
45             NULL, NULL,\r
46             (GClassInitFunc) livepatheffect_class_init,\r
47             NULL, NULL,\r
48             sizeof (LivePathEffectObject),\r
49             16,\r
50             (GInstanceInitFunc) livepatheffect_init,\r
51             NULL,\r
52         };\r
53         livepatheffect_type = g_type_register_static (SP_TYPE_OBJECT, "LivePathEffectObject", &livepatheffect_info, (GTypeFlags)0);\r
54     }\r
55     return livepatheffect_type;\r
56 }\r
57 \r
58 static Inkscape::XML::NodeEventVector const livepatheffect_repr_events = {\r
59     NULL, /* child_added */\r
60     NULL, /* child_removed */\r
61     livepatheffect_on_repr_attr_changed,\r
62     NULL, /* content_changed */\r
63     NULL  /* order_changed */\r
64 };\r
65 \r
66 \r
67 /**\r
68  * Callback to initialize livepatheffect vtable.\r
69  */\r
70 static void \r
71 livepatheffect_class_init(LivePathEffectObjectClass *klass)\r
72 {\r
73     SPObjectClass *sp_object_class = (SPObjectClass *) klass;\r
74 \r
75     livepatheffect_parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);\r
76 \r
77     sp_object_class->build = livepatheffect_build;\r
78     sp_object_class->release = livepatheffect_release;\r
79 \r
80     sp_object_class->set = livepatheffect_set;\r
81     sp_object_class->write = livepatheffect_write;\r
82 }\r
83 \r
84 /**\r
85  * Callback to initialize livepatheffect object.\r
86  */\r
87 static void\r
88 livepatheffect_init(LivePathEffectObject *lpeobj)\r
89 {\r
90 #ifdef LIVEPATHEFFECT_VERBOSE\r
91     g_message("Init livepatheffectobject");\r
92 #endif\r
93     lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
94     lpeobj->lpe = NULL;\r
95 \r
96     lpeobj->effecttype_set = false;\r
97 }\r
98 \r
99 /**\r
100  * Virtual build: set livepatheffect attributes from its associated XML node.\r
101  */\r
102 static void \r
103 livepatheffect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)\r
104 {\r
105 #ifdef LIVEPATHEFFECT_VERBOSE\r
106     g_message("Build livepatheffect");\r
107 #endif\r
108     g_assert(object != NULL);\r
109     g_assert(SP_IS_OBJECT(object));\r
110 \r
111     if (((SPObjectClass *) livepatheffect_parent_class)->build)\r
112         (* ((SPObjectClass *) livepatheffect_parent_class)->build)(object, document, repr);\r
113 \r
114     sp_object_read_attr(object, "effect");\r
115 \r
116     if (repr) {\r
117         repr->addListener (&livepatheffect_repr_events, object);\r
118     }\r
119 \r
120     /* Register ourselves, is this necessary? */\r
121 //    sp_document_add_resource(document, "path-effect", object);\r
122 }\r
123 \r
124 /**\r
125  * Virtual release of livepatheffect members before destruction.\r
126  */\r
127 static void\r
128 livepatheffect_release(SPObject *object)\r
129 {\r
130 #ifdef LIVEPATHEFFECT_VERBOSE\r
131     g_print("Releasing livepatheffect");\r
132 #endif\r
133 \r
134     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
135 \r
136     SP_OBJECT_REPR(object)->removeListenerByData(object);\r
137 \r
138 \r
139 /*\r
140     if (SP_OBJECT_DOCUMENT(object)) {\r
141         // Unregister ourselves\r
142         sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "livepatheffect", SP_OBJECT(object));\r
143     }\r
144 \r
145     if (gradient->ref) {\r
146         gradient->modified_connection.disconnect();\r
147         gradient->ref->detach();\r
148         delete gradient->ref;\r
149         gradient->ref = NULL;\r
150     }\r
151 \r
152     gradient->modified_connection.~connection();\r
153 \r
154 */\r
155 \r
156     if (lpeobj->lpe) {\r
157         delete lpeobj->lpe;\r
158         lpeobj->lpe = NULL;\r
159     }\r
160     lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
161 \r
162     if (((SPObjectClass *) livepatheffect_parent_class)->release)\r
163         ((SPObjectClass *) livepatheffect_parent_class)->release(object);\r
164 }\r
165 \r
166 /**\r
167  * Virtual set: set attribute to value.\r
168  */\r
169 static void\r
170 livepatheffect_set(SPObject *object, unsigned key, gchar const *value)\r
171 {\r
172     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
173 #ifdef LIVEPATHEFFECT_VERBOSE\r
174     g_print("Set livepatheffect");\r
175 #endif\r
176     switch (key) {\r
177         case SP_PROP_PATH_EFFECT:\r
178             if (lpeobj->lpe) {\r
179                 delete lpeobj->lpe;\r
180                 lpeobj->lpe = NULL;\r
181             }\r
182 \r
183             if (value) {\r
184                 lpeobj->effecttype = Inkscape::LivePathEffect::LPETypeConverter.get_id_from_key(value);\r
185                 if (lpeobj->effecttype != Inkscape::LivePathEffect::INVALID_LPE) {\r
186                     lpeobj->lpe = Inkscape::LivePathEffect::Effect::New(lpeobj->effecttype, lpeobj);\r
187                 }\r
188                 lpeobj->effecttype_set = true;\r
189             } else {\r
190                 lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
191                 lpeobj->effecttype_set = false;\r
192             }\r
193             object->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
194             break;\r
195     }\r
196 \r
197     if (((SPObjectClass *) livepatheffect_parent_class)->set) {\r
198         ((SPObjectClass *) livepatheffect_parent_class)->set(object, key, value);\r
199     }\r
200 }\r
201 \r
202 /**\r
203  * Virtual write: write object attributes to repr.\r
204  */\r
205 static Inkscape::XML::Node *\r
206 livepatheffect_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)\r
207 {\r
208 #ifdef LIVEPATHEFFECT_VERBOSE\r
209     g_print("Write livepatheffect");\r
210 #endif\r
211 \r
212     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
213 \r
214     if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {\r
215         Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));\r
216         repr = xml_doc->createElement("inkscape:path-effect");\r
217     }\r
218 \r
219     if ((flags & SP_OBJECT_WRITE_ALL) || lpeobj->effecttype_set)\r
220         repr->setAttribute("effect", Inkscape::LivePathEffect::LPETypeConverter.get_key(lpeobj->effecttype).c_str());\r
221 \r
222 //    lpeobj->lpe->write(repr); something like this.\r
223 \r
224     if (((SPObjectClass *) livepatheffect_parent_class)->write)\r
225         (* ((SPObjectClass *) livepatheffect_parent_class)->write)(object, repr, flags);\r
226 \r
227     return repr;\r
228 }\r
229 \r
230 static void \r
231 livepatheffect_on_repr_attr_changed ( Inkscape::XML::Node * repr, \r
232                                       const gchar *key, \r
233                                       const gchar *oldval, \r
234                                       const gchar *newval, \r
235                                       bool is_interactive, \r
236                                       void * data )\r
237 {\r
238 #ifdef LIVEPATHEFFECT_VERBOSE\r
239     g_print("livepatheffect_on_repr_attr_changed");\r
240 #endif\r
241 \r
242     if (!data)\r
243         return;\r
244 \r
245     LivePathEffectObject *lpeobj = (LivePathEffectObject*) data;\r
246     if (!lpeobj->lpe) \r
247         return;\r
248 \r
249     lpeobj->lpe->setParameter(repr, key, oldval, newval);\r
250 \r
251     lpeobj->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
252 }\r
253 \r
254 \r
255 /*\r
256   Local Variables:\r
257   mode:c++\r
258   c-file-style:"stroustrup"\r
259   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
260   indent-tabs-mode:nil\r
261   fill-column:99\r
262   End:\r
263 */\r
264 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r