Suit a better value for the default scale for Link value nodes.
[synfig.git] / synfig-studio / src / synfigapp / value_desc.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file value_desc.h
3 **      \brief Template Header
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **      Copyright (c) 2008 Chris Moore
10 **      Copyright (c) 2009 Nikita Kitaev
11 **
12 **      This package is free software; you can redistribute it and/or
13 **      modify it under the terms of the GNU General Public License as
14 **      published by the Free Software Foundation; either version 2 of
15 **      the License, or (at your option) any later version.
16 **
17 **      This package is distributed in the hope that it will be useful,
18 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
19 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 **      General Public License for more details.
21 **      \endlegal
22 */
23 /* ========================================================================= */
24
25 /* === S T A R T =========================================================== */
26
27 #ifndef __SYNFIG_APP_VALUE_DESC_H
28 #define __SYNFIG_APP_VALUE_DESC_H
29
30 /* === H E A D E R S ======================================================= */
31
32 #include <synfig/valuenode.h>
33 #include <synfig/string.h>
34 #include <synfig/layer.h>
35 #include <synfig/value.h>
36 #include <synfig/valuenode_animated.h>
37 #include <synfig/valuenode_const.h>
38 #include <synfig/canvas.h>
39
40 /* === M A C R O S ========================================================= */
41
42 /* === T Y P E D E F S ===================================================== */
43
44 /* === C L A S S E S & S T R U C T S ======================================= */
45
46 namespace synfigapp {
47
48 class ValueDesc
49 {
50         // Info for Layer parent
51         synfig::Layer::Handle layer;
52         synfig::String name;
53
54         // Info for ValueNode parent
55         synfig::ValueNode::Handle parent_value_node;
56         int index;                                      // -2 if it's a waypoint, -1 if it's const, >=0 if it's LinkableValueNode
57         synfig::Time waypoint_time;
58
59         // Info for exported ValueNode
60         synfig::Canvas::Handle canvas;
61
62         // Info for visual editon
63         synfig::Real scalar;
64
65 public:
66         bool operator==(const ValueDesc &rhs)const
67         {
68                 if((layer||rhs.layer) && layer!=rhs.layer)
69                         return false;
70                 if((!name.empty()||!rhs.name.empty()) && name!=rhs.name)
71                         return false;
72                 if(layer)
73                         return true;
74                 if((canvas||rhs.canvas) && canvas!=rhs.canvas)
75                         return false;
76                 if((parent_value_node||rhs.parent_value_node) && (parent_value_node!=rhs.parent_value_node))
77                         return false;
78                 if(scalar!=rhs.scalar)
79                         return false;
80                 if(index!=rhs.index)
81                         return false;
82                 return true;
83         }
84         bool operator!=(const ValueDesc &rhs)const
85         {
86                 return !operator==(rhs);
87         }
88
89
90         ValueDesc(synfig::Layer::Handle layer,const synfig::String& param_name):
91                 layer(layer),
92                 name(param_name) { }
93
94         ValueDesc(synfig::Layer::LooseHandle layer,const synfig::String& param_name):
95                 layer(layer),
96                 name(param_name) { }
97
98         ValueDesc(synfig::LinkableValueNode::Handle parent_value_node,int index, synfig::Real s=1.0):
99                 parent_value_node(parent_value_node),
100                 index(index),
101                 scalar(s) { }
102
103 //      ValueDesc(synfig::LinkableValueNode::Handle parent_value_node,const synfig::String& param_name):
104 //              parent_value_node(parent_value_node),
105 //              index(parent_value_node->get_link_index_from_name(param_name)) { }
106
107         ValueDesc(synfig::ValueNode_Animated::Handle parent_value_node,synfig::Time waypoint_time):
108                 parent_value_node(parent_value_node),
109                 index(-2),
110                 waypoint_time(waypoint_time) { }
111
112         ValueDesc(synfig::Canvas::Handle canvas,const synfig::String& name):
113                 name(name),
114                 canvas(canvas) { }
115
116         ValueDesc(synfig::ValueNode_Const::Handle parent_value_node):
117                 parent_value_node(parent_value_node),
118                 index(-1) { }
119
120         ValueDesc() { }
121
122         bool is_valid()const { return layer || parent_value_node || canvas; }
123         operator bool()const { return is_valid(); }
124
125         bool parent_is_layer_param()const { return (bool)layer; }
126         bool parent_is_value_node()const { return (bool)parent_value_node; }
127         bool parent_is_linkable_value_node()const { return parent_is_value_node() && index>=0; }
128         bool parent_is_value_node_const()const { return parent_is_value_node() && index==-1; }
129         bool parent_is_waypoint()const { return parent_is_value_node() && index==-2; }
130         bool parent_is_canvas()const { return (bool)canvas; }
131
132         bool is_value_node()const { return parent_is_value_node() || parent_is_canvas() || (parent_is_layer_param() && (bool)layer->dynamic_param_list().count(name)); }
133         bool is_const()const { return (parent_is_layer_param() && !layer->dynamic_param_list().count(name)) || parent_is_value_node_const(); }
134
135         synfig::Layer::Handle get_layer()const { assert(parent_is_layer_param()); return layer; }
136         const synfig::String& get_param_name()const { assert(parent_is_layer_param()); return name; }
137
138         synfig::ValueNode::Handle get_parent_value_node()const { assert(parent_is_value_node()); return parent_value_node; }
139         int get_index()const { assert(parent_is_linkable_value_node()); return index; }
140         synfig::Real get_scalar()const { assert(parent_is_linkable_value_node()); return scalar; }
141         synfig::String get_name()const { assert(parent_is_linkable_value_node()); return (synfig::LinkableValueNode::Handle::cast_reinterpret(parent_value_node))->link_name(index); }
142         synfig::Time get_waypoint_time()const { assert(parent_is_waypoint()); return waypoint_time; }
143
144         const synfig::String& get_value_node_id()const { assert(parent_is_canvas()); return name; }
145
146         synfig::Canvas::Handle get_canvas()const
147         {
148                 if(canvas)
149                         return canvas;
150                 if(layer)
151                         return layer->get_canvas();
152                 if(parent_value_node)
153                         return parent_value_node->get_root_canvas();
154                 return 0;
155         }
156
157         synfig::ValueNode::Handle
158         get_value_node()const
159         {
160                 if(parent_is_canvas())
161                         return canvas->find_value_node(name);
162                 if(parent_is_layer_param() && layer->dynamic_param_list().count(name))
163                         return layer->dynamic_param_list().find(name)->second;
164                 if(parent_is_linkable_value_node())
165                         return (synfig::LinkableValueNode::Handle::cast_reinterpret(parent_value_node))->get_link(index);
166 //                      return reinterpret_cast<synfig::LinkableValueNode*>(parent_value_node.get())->get_link(index);
167                 if(parent_is_value_node_const())
168                         return parent_value_node;
169                 if(parent_is_waypoint())
170                         return (synfig::ValueNode_Animated::Handle::cast_reinterpret(parent_value_node))->find(waypoint_time)->get_value_node();
171                 return 0;
172         }
173
174         synfig::ValueBase
175         get_value(synfig::Time time=0)const
176         {
177                 // if the value is constant, return that constant value (at *any* time, it doesn't matter which)
178                 if(parent_is_value_node_const())
179                         return (*parent_value_node)(0);
180                 if(is_value_node() && get_value_node())
181                         return (*get_value_node())(time);
182                 if(parent_is_layer_param() && layer)
183                         return layer->get_param(name);
184                 return synfig::ValueBase();
185         }
186
187         synfig::ValueBase::Type
188         get_value_type()const
189         {
190                 synfig::ValueNode::Handle value_node=get_value_node();
191                 if(value_node)
192                         return value_node->get_type();
193                 return get_value().get_type();
194         }
195
196         bool
197         is_exported()const
198         {
199                 return is_value_node() && get_value_node()->is_exported();
200         }
201
202         synfig::String
203         get_description(bool show_exported_name = true)const;
204
205 }; // END of class ValueDesc
206
207 }; // END of namespace synfigapp_instance
208
209 /* === E N D =============================================================== */
210
211 #endif