my log
[synfig.git] / synfig-studio / trunk / src / synfigapp / value_desc.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file value_desc.h
3 **      \brief Template Header
4 **
5 **      $Id: value_desc.h,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $
6 **
7 **      \legal
8 **      Copyright (c) 2002 Robert B. Quattlebaum Jr.
9 **
10 **      This software and associated documentation
11 **      are CONFIDENTIAL and PROPRIETARY property of
12 **      the above-mentioned copyright holder.
13 **
14 **      You may not copy, print, publish, or in any
15 **      other way distribute this software without
16 **      a prior written agreement with
17 **      the copyright holder.
18 **      \endlegal
19 */
20 /* ========================================================================= */
21
22 /* === S T A R T =========================================================== */
23
24 #ifndef __SYNFIG_APP_VALUE_DESC_H
25 #define __SYNFIG_APP_VALUE_DESC_H
26
27 /* === H E A D E R S ======================================================= */
28
29 #include <synfig/valuenode.h>
30 #include <synfig/string.h>
31 #include <synfig/layer.h>
32 #include <synfig/value.h>
33 #include <synfig/valuenode_const.h>
34 #include <synfig/canvas.h>
35
36 /* === M A C R O S ========================================================= */
37
38 /* === T Y P E D E F S ===================================================== */
39
40 /* === C L A S S E S & S T R U C T S ======================================= */
41
42 namespace synfigapp {
43
44 class ValueDesc
45 {
46         // Info for Layer parent
47         synfig::Layer::Handle layer;
48         synfig::String name;
49         
50         // Info for ValueNode parent
51         synfig::ValueNode::Handle parent_value_node;
52         int index;
53
54         // Info for exported ValueNode
55         synfig::Canvas::Handle canvas;
56         
57 public:
58         bool operator==(const ValueDesc &rhs)const
59         {
60                 if((layer||rhs.layer) && layer!=rhs.layer)
61                         return false;
62                 if((!name.empty()||!rhs.name.empty()) && name!=rhs.name)
63                         return false;
64                 if(layer)
65                         return true;
66                 if((canvas||rhs.canvas) && canvas!=rhs.canvas)
67                         return false;
68                 if((parent_value_node||rhs.parent_value_node) && parent_value_node!=rhs.parent_value_node)
69                         return false;
70                 if((index>-1||rhs.index>-1) && index!=rhs.index)
71                         return false;
72                 return true;
73         }
74         bool operator!=(const ValueDesc &rhs)const
75         {
76                 return !operator==(rhs);
77         }
78
79         
80         ValueDesc(synfig::Layer::Handle layer,const synfig::String& param_name):
81                 layer(layer),
82                 name(param_name) { }
83
84         ValueDesc(synfig::Layer::LooseHandle layer,const synfig::String& param_name):
85                 layer(layer),
86                 name(param_name) { }
87
88         ValueDesc(synfig::LinkableValueNode::Handle parent_value_node,int index):
89                 parent_value_node(parent_value_node),
90                 index(index) { }
91
92 //      ValueDesc(synfig::LinkableValueNode::Handle parent_value_node,const synfig::String& param_name):
93 //              parent_value_node(parent_value_node),
94 //              index(parent_value_node->get_link_index_from_name(param_name)) { }
95
96         ValueDesc(synfig::Canvas::Handle canvas,const synfig::String& name):
97                 name(name),
98                 canvas(canvas) { }
99
100         ValueDesc(synfig::ValueNode_Const::Handle parent_value_node):
101                 parent_value_node(parent_value_node),
102                 index(-1) { }
103
104         ValueDesc() { }
105
106         bool is_valid()const { return layer || parent_value_node || canvas; }
107         operator bool()const { return is_valid(); }
108
109         bool parent_is_layer_param()const { return (bool)layer; }
110         bool parent_is_value_node()const { return (bool)parent_value_node; }
111         bool parent_is_linkable_value_node()const { return parent_is_value_node() && index>=0; }
112         bool parent_is_value_node_const()const { return parent_is_value_node() && index==-1; }
113         bool parent_is_canvas()const { return (bool)canvas; }
114         
115         bool is_value_node()const { return parent_is_value_node() || parent_is_canvas() || (parent_is_layer_param() && (bool)layer->dynamic_param_list().count(name)); }
116         bool is_const()const { return (parent_is_layer_param() && !layer->dynamic_param_list().count(name)) || parent_is_value_node_const(); }
117         
118         synfig::Layer::Handle get_layer()const { assert(parent_is_layer_param()); return layer; }
119         const synfig::String& get_param_name()const { assert(parent_is_layer_param()); return name; }
120         
121         synfig::ValueNode::Handle get_parent_value_node()const { assert(parent_is_value_node()); return parent_value_node; }
122         int get_index()const { assert(parent_is_linkable_value_node()); return index; }
123         
124         const synfig::String& get_value_node_id()const { assert(parent_is_canvas()); return name; }
125
126         synfig::Canvas::Handle get_canvas()const
127         {
128                 if(canvas)
129                         return canvas;
130                 if(layer)
131                         return layer->get_canvas();
132                 if(parent_value_node)
133                         return parent_value_node->get_root_canvas();
134                 return 0;
135         }
136         
137         synfig::ValueNode::Handle
138         get_value_node()const
139         {
140                 if(parent_is_canvas())
141                         return canvas->find_value_node(name);
142                 if(parent_is_layer_param() && layer->dynamic_param_list().count(name))
143                         return layer->dynamic_param_list().find(name)->second;
144                 if(parent_is_linkable_value_node())
145                         return synfig::LinkableValueNode::Handle::cast_reinterpret(parent_value_node)->get_link(index);
146 //                      return reinterpret_cast<synfig::LinkableValueNode*>(parent_value_node.get())->get_link(index);
147                 return 0;
148         }
149
150         synfig::ValueBase
151         get_value(synfig::Time time=0)const
152         {
153                 if(parent_is_value_node_const() && parent_value_node)
154                         return (*parent_value_node)(0);
155                 if(is_value_node() && get_value_node())
156                         return (*get_value_node())(time);
157                 if(parent_is_layer_param() && layer)
158                         return layer->get_param(name);
159                 return synfig::ValueBase();
160         }       
161
162         synfig::ValueBase::Type
163         get_value_type()const
164         {
165                 synfig::ValueNode::Handle value_node=get_value_node();
166                 if(value_node)
167                         return value_node->get_type();
168                 return get_value().get_type();
169         }
170         
171         bool
172         is_exported()const
173         {
174                 return is_value_node() && get_value_node()->is_exported();
175         }
176 }; // END of class ValueDesc
177
178 }; // END of namespace synfigapp_instance
179
180 /* === E N D =============================================================== */
181
182 #endif