synfig-core  1.0.3
valuenode.h
Go to the documentation of this file.
1 /* === S Y N F I G ========================================================= */
23 /* ========================================================================= */
24 
25 /* === S T A R T =========================================================== */
26 
27 #ifndef __SYNFIG_VALUENODE_H
28 #define __SYNFIG_VALUENODE_H
29 
30 /* === H E A D E R S ======================================================= */
31 
32 #include "vector.h"
33 #include "value.h"
34 #include "string.h"
35 #include "releases.h"
36 #include <ETL/handle>
37 #include <ETL/stringf>
38 #include "exception.h"
39 #include <map>
40 #include <sigc++/signal.h>
41 #include "guid.h"
42 #include <ETL/angle>
43 #include "paramdesc.h"
44 #include "interpolation.h"
45 
46 #include "node.h"
47 
48 #include <set>
49 
50 /* === M A C R O S ========================================================= */
51 
52 #define VALUENODE_CHECK_TYPE(type) \
53  /* I don't think this ever happens - maybe remove this code? */ \
54  if (get_type() == type_nil) { \
55  warning("%s:%d get_type() IS nil sometimes!", \
56  __FILE__, __LINE__); \
57  return false; \
58  } \
59  if (get_type() != type_nil && \
60  !(ValueBase::can_copy(value->get_type(), type)) && \
61  !PlaceholderValueNode::Handle::cast_dynamic(value)) { \
62  error(_("%s:%d wrong type for %s: need %s but got %s"), \
63  __FILE__, __LINE__, \
64  link_local_name(i).c_str(), \
65  type.description.local_name.c_str(), \
66  value->get_type().description.local_name.c_str() ); \
67  return false; \
68  }
69 
70 #define VALUENODE_SET_VALUE(variable) \
71  variable = value; \
72  signal_child_changed()(i); \
73  signal_value_changed()(); \
74  return true
75 
76 #define CHECK_TYPE_AND_SET_VALUE(variable, type) \
77  VALUENODE_CHECK_TYPE(type) \
78  VALUENODE_SET_VALUE(variable)
79 
80 /* === T Y P E D E F S ===================================================== */
81 
82 /* === C L A S S E S & S T R U C T S ======================================= */
83 
84 namespace synfig {
85 
86 class Canvas;
87 class LinkableValueNode;
88 class Layer;
89 class ParamVocab;
90 
94 class ValueNode : public synfig::Node
95 {
96  friend class Layer;
97  friend class LinkableValueNode;
98 
99  /*
100  -- ** -- T Y P E S -----------------------------------------------------------
101  */
102 
103 public:
104 
105  typedef etl::handle<ValueNode> Handle;
106 
107  typedef etl::loose_handle<ValueNode> LooseHandle;
108 
109  typedef etl::handle<const ValueNode> ConstHandle;
110 
111  typedef etl::rhandle<ValueNode> RHandle;
112 
114  static bool subsys_init();
116  static bool subsys_stop();
117 
118  static void breakpoint();
119 
120  /*
121  -- ** -- D A T A -------------------------------------------------------------
122  */
123 
124 private:
127  Type *type;
130  String name;
132  etl::loose_handle<Canvas> canvas_;
134  etl::loose_handle<Canvas> root_canvas_;
135 
136  /*
137  -- ** -- S I G N A L S -------------------------------------------------------
138  */
139 
140 private:
141 
143  sigc::signal<void> signal_value_changed_;
144 
146  sigc::signal<void,int*> signal_children_reordered_;
147 
149  sigc::signal<void,int> signal_child_changed_;
150 
152  sigc::signal<void,int> signal_child_removed_;
153 
155  sigc::signal<void,int> signal_child_inserted_;
156 
158  sigc::signal<void> signal_id_changed_;
159 
160  /*
161  -- ** -- S I G N A L I N T E R F A C E -------------------------------------
162  */
163 
164 public:
165 
167  sigc::signal<void>& signal_value_changed() { return signal_value_changed_; }
168 
170  sigc::signal<void,int*>& signal_children_reordered() { return signal_children_reordered_; }
171 
173  sigc::signal<void,int>& signal_child_changed() { return signal_child_changed_; }
174 
176  sigc::signal<void,int>& signal_child_removed() { return signal_child_removed_; }
177 
179  sigc::signal<void,int>& signal_child_inserted() { return signal_child_inserted_; }
180 
182  sigc::signal<void>& signal_id_changed() { return signal_id_changed_; }
183 
184  /*
185  -- ** -- C O N S T R U C T O R S ---------------------------------------------
186  */
187 
188 protected:
189 
190  ValueNode(Type &type=type_nil);
191 
192 public:
193 
194  virtual ~ValueNode();
195 
196  /*
197  -- ** -- M E M B E R F U N C T I O N S -------------------------------------
198  */
199 
200 public:
201 
203  virtual ValueBase operator()(Time /*t*/)const
204  { return ValueBase(); }
205 
207  void set_id(const String &x);
208 
210 
212  const String &get_id()const { return name; }
213 
215  virtual String get_name()const=0;
216 
218  virtual String get_local_name()const=0;
219 
221  virtual String get_description(bool show_exported_name = true)const;
222 
223  String get_string()const;
224 
226  virtual ValueNode::Handle clone(etl::loose_handle<Canvas> canvas, const GUID& deriv_guid=GUID())const=0;
227 
229  bool is_exported()const { return !get_id().empty(); }
230 
232  bool is_descendant(ValueNode::Handle value_node_dest);
233 
235  Type& get_type()const { return *type; }
236 
238  etl::loose_handle<Canvas> get_parent_canvas()const;
239 
241  etl::loose_handle<Canvas> get_root_canvas()const;
242 
244  etl::loose_handle<Canvas> get_non_inline_ancestor_canvas()const;
245 
247  void set_parent_canvas(etl::loose_handle<Canvas> x);
248 
250  virtual void set_root_canvas(etl::loose_handle<Canvas> x);
251 
253  String get_relative_id(etl::loose_handle<const Canvas> x)const;
254 
260  int replace(etl::handle<ValueNode> x);
261 
265  virtual void set_interpolation(Interpolation /* i*/) { }
266 
267 protected:
269  void set_type(Type &t) { type=&t; }
270 
271  virtual void on_changed();
272 }; // END of class ValueNode
273 
283 {
284 public:
285  typedef etl::handle<PlaceholderValueNode> Handle;
286  typedef etl::loose_handle<PlaceholderValueNode> LooseHandle;
287  typedef etl::handle<const PlaceholderValueNode> ConstHandle;
288  typedef etl::rhandle<PlaceholderValueNode> RHandle;
289 
290 private:
291 
293 
294 public:
295 
296  virtual ValueBase operator()(Time t)const;
297 
298  virtual String get_name()const;
299 
300  virtual String get_local_name()const;
301 
302  String get_string()const;
303 
304  virtual ValueNode::Handle clone(etl::loose_handle<Canvas> canvas, const GUID& deriv_guid=GUID())const;
305 
306  static Handle create(Type &type=type_nil);
307 
308 protected:
309  virtual void get_times_vfunc(Node::time_set &/*set*/) const {}
310 }; // END of class PlaceholderValueNode
311 
312 
322 {
323  friend class ValueNode;
324 public:
325 
326  typedef etl::handle<LinkableValueNode> Handle;
327 
328  typedef etl::loose_handle<LinkableValueNode> LooseHandle;
329 
330  typedef etl::handle<const LinkableValueNode> ConstHandle;
331 
332  typedef etl::rhandle<LinkableValueNode> RHandle;
333 
334 
336 
339  typedef LinkableValueNode* (*Factory)(const ValueBase&, etl::loose_handle<Canvas> canvas);
340 
342 
345  typedef bool (*CheckType)(Type &type);
346 
347  struct BookEntry
348  {
352  ReleaseVersion release_version; // which version of synfig introduced this valuenode type
353  };
354 
356 
362  typedef std::map<String,BookEntry> Book;
363 
365 
367  typedef ParamVocab Vocab;
368 
369  static Book& book();
370 
373  static Handle create(const String &name, const ValueBase& x, etl::loose_handle<Canvas> canvas /* = 0 */);
374 
378  static bool check_type(const String &name, Type &x);
379 
380 public:
382  ValueNode(type) { }
383 
384 protected:
388  virtual bool set_link_vfunc(int i,ValueNode::Handle x)=0;
389 
392  void unlink_all();
393 
394 public:
395 
397  virtual int link_count()const;
398 
400  virtual String link_local_name(int i)const;
401 
403  virtual String link_name(int i)const;
404 
406  virtual int get_link_index_from_name(const String &name)const;
407 
409  virtual ValueNode::Handle clone(etl::loose_handle<Canvas> canvas, const GUID& deriv_guid=GUID())const;
410 
412  bool set_link(int i,ValueNode::Handle x);
414  bool set_link(const String &name,ValueNode::Handle x) { return set_link(get_link_index_from_name(name),x); }
415 
417  ValueNode::LooseHandle get_link(int i)const;
421  String get_description(int index = -1, bool show_exported_name = true)const;
424  String get_description(bool show_exported_name = true)const;
425 
427  virtual Vocab get_children_vocab()const;
428 
429  virtual void set_root_canvas(etl::loose_handle<Canvas> x);
430 
431 protected:
436 
438  virtual ValueNode::LooseHandle get_link_vfunc(int i)const=0;
439 
441  virtual LinkableValueNode* create_new()const=0;
442 
444  virtual void get_times_vfunc(Node::time_set &set) const;
445 
447  virtual Vocab get_children_vocab_vfunc()const=0;
448 
450  virtual void set_children_vocab(const Vocab& rvocab);
451 }; // END of class LinkableValueNode
452 
459 class ValueNodeList : public std::list<ValueNode::RHandle>
460 {
461  int placeholder_count_;
462 public:
463  ValueNodeList();
464 
466 
469  ValueNode::Handle find(const String &name, bool might_fail);
470 
472 
475  ValueNode::ConstHandle find(const String &name, bool might_fail)const;
476 
478  bool erase(ValueNode::Handle value_node);
479 
481  bool add(ValueNode::Handle value_node);
482 
484  bool count(const String &id)const;
485 
487  ValueNode::Handle surefind(const String &name);
488 
490  void audit();
491 
493  int placeholder_count()const { return placeholder_count_; }
494 };
495 
496 ValueNode::LooseHandle find_value_node(const GUID& guid);
497 
498 }; // END of namespace synfig
499 
500 /* === E N D =============================================================== */
501 
502 #endif