Code

de2baa4708063977224bcfdbb2c194bef86a9c60
[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 \r
109     if (((SPObjectClass *) livepatheffect_parent_class)->build)\r
110         (* ((SPObjectClass *) livepatheffect_parent_class)->build)(object, document, repr);\r
111 \r
112     sp_object_read_attr(object, "effect");\r
113 \r
114     if (repr) {\r
115         repr->addListener (&livepatheffect_repr_events, object);\r
116     }\r
117 \r
118     /* Register ourselves */\r
119 //    sp_document_add_resource(document, "path-effect", object);\r
120 }\r
121 \r
122 /**\r
123  * Virtual release of livepatheffect members before destruction.\r
124  */\r
125 static void\r
126 livepatheffect_release(SPObject *object)\r
127 {\r
128     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
129 \r
130 #ifdef LIVEPATHEFFECT_VERBOSE\r
131     g_print("Releasing livepatheffect");\r
132 #endif\r
133 \r
134 /*\r
135     if (SP_OBJECT_DOCUMENT(object)) {\r
136         // Unregister ourselves\r
137         sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "livepatheffect", SP_OBJECT(object));\r
138     }\r
139 \r
140     if (gradient->ref) {\r
141         gradient->modified_connection.disconnect();\r
142         gradient->ref->detach();\r
143         delete gradient->ref;\r
144         gradient->ref = NULL;\r
145     }\r
146 \r
147     gradient->modified_connection.~connection();\r
148 \r
149 */\r
150 \r
151     if (lpeobj->lpe) {\r
152         delete lpeobj->lpe;\r
153         lpeobj->lpe = NULL;\r
154     }\r
155     lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
156 \r
157     if (((SPObjectClass *) livepatheffect_parent_class)->release)\r
158         ((SPObjectClass *) livepatheffect_parent_class)->release(object);\r
159 }\r
160 \r
161 /**\r
162  * Virtual set: set attribute to value.\r
163  */\r
164 static void\r
165 livepatheffect_set(SPObject *object, unsigned key, gchar const *value)\r
166 {\r
167     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
168 #ifdef LIVEPATHEFFECT_VERBOSE\r
169     g_print("Set livepatheffect");\r
170 #endif\r
171     switch (key) {\r
172         case SP_PROP_PATH_EFFECT:\r
173             if (lpeobj->lpe) {\r
174                 delete lpeobj->lpe;\r
175                 lpeobj->lpe = NULL;\r
176             }\r
177 \r
178             if (value) {\r
179                 lpeobj->effecttype = Inkscape::LivePathEffect::LPETypeConverter.get_id_from_key(value);\r
180                 if (lpeobj->effecttype != Inkscape::LivePathEffect::INVALID_LPE) {\r
181                     lpeobj->lpe = Inkscape::LivePathEffect::Effect::New(lpeobj->effecttype, lpeobj);\r
182                 }\r
183                 lpeobj->effecttype_set = true;\r
184             } else {\r
185                 lpeobj->effecttype = Inkscape::LivePathEffect::INVALID_LPE;\r
186                 lpeobj->effecttype_set = false;\r
187             }\r
188             object->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
189             break;\r
190     }\r
191 \r
192     if (((SPObjectClass *) livepatheffect_parent_class)->set) {\r
193         ((SPObjectClass *) livepatheffect_parent_class)->set(object, key, value);\r
194     }\r
195 }\r
196 \r
197 /**\r
198  * Virtual write: write object attributes to repr.\r
199  */\r
200 static Inkscape::XML::Node *\r
201 livepatheffect_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)\r
202 {\r
203 #ifdef LIVEPATHEFFECT_VERBOSE\r
204     g_print("Write livepatheffect");\r
205 #endif\r
206 \r
207     LivePathEffectObject *lpeobj = LIVEPATHEFFECT(object);\r
208 \r
209     if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {\r
210         Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));\r
211         repr = xml_doc->createElement("inkscape:path-effect");\r
212     }\r
213 \r
214     if ((flags & SP_OBJECT_WRITE_ALL) || lpeobj->effecttype_set)\r
215         repr->setAttribute("effect", Inkscape::LivePathEffect::LPETypeConverter.get_key(lpeobj->effecttype).c_str());\r
216 \r
217 //    lpeobj->lpe->write(repr); something like this.\r
218 \r
219     if (((SPObjectClass *) livepatheffect_parent_class)->write)\r
220         (* ((SPObjectClass *) livepatheffect_parent_class)->write)(object, repr, flags);\r
221 \r
222     return repr;\r
223 }\r
224 \r
225 static void \r
226 livepatheffect_on_repr_attr_changed ( Inkscape::XML::Node * repr, \r
227                                       const gchar *key, \r
228                                       const gchar *oldval, \r
229                                       const gchar *newval, \r
230                                       bool is_interactive, \r
231                                       void * data )\r
232 {\r
233 #ifdef LIVEPATHEFFECT_VERBOSE\r
234     g_print("livepatheffect_on_repr_attr_changed");\r
235 #endif\r
236 \r
237     if (!data)\r
238         return;\r
239 \r
240     LivePathEffectObject *lpeobj = (LivePathEffectObject*) data;\r
241     if (!lpeobj->lpe) \r
242         return;\r
243 \r
244     lpeobj->lpe->setParameter(repr, key, oldval, newval);\r
245 \r
246     lpeobj->requestModified(SP_OBJECT_MODIFIED_FLAG);\r
247 }\r
248 \r
249 \r
250 /*\r
251   Local Variables:\r
252   mode:c++\r
253   c-file-style:"stroustrup"\r
254   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
255   indent-tabs-mode:nil\r
256   fill-column:99\r
257   End:\r
258 */\r
259 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r