my log
[synfig.git] / synfig-studio / trunk / src / synfigapp / actions / valuedescconnect.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file valuedescconnect.cpp
3 **      \brief Template File
4 **
5 **      $Id: valuedescconnect.cpp,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 /* === H E A D E R S ======================================================= */
23
24 #ifdef USING_PCH
25 #       include "pch.h"
26 #else
27 #ifdef HAVE_CONFIG_H
28 #       include <config.h>
29 #endif
30
31 #include "layerparamconnect.h"
32 #include "valuenodelinkconnect.h"
33 #include "valuenodereplace.h"
34
35 #include "valuedescconnect.h"
36 #include <synfigapp/canvasinterface.h>
37
38 #endif
39
40 using namespace std;
41 using namespace etl;
42 using namespace synfig;
43 using namespace synfigapp;
44 using namespace Action;
45
46 /* === M A C R O S ========================================================= */
47
48 ACTION_INIT(Action::ValueDescConnect);
49 ACTION_SET_NAME(Action::ValueDescConnect,"value_desc_connect");
50 ACTION_SET_LOCAL_NAME(Action::ValueDescConnect,"Connect");
51 ACTION_SET_TASK(Action::ValueDescConnect,"connect");
52 ACTION_SET_CATEGORY(Action::ValueDescConnect,Action::CATEGORY_VALUEDESC|Action::CATEGORY_VALUENODE);
53 ACTION_SET_PRIORITY(Action::ValueDescConnect,0);
54 ACTION_SET_VERSION(Action::ValueDescConnect,"0.0");
55 ACTION_SET_CVS_ID(Action::ValueDescConnect,"$Id: valuedescconnect.cpp,v 1.1.1.1 2005/01/07 03:34:37 darco Exp $");
56
57 /* === G L O B A L S ======================================================= */
58
59 /* === P R O C E D U R E S ================================================= */
60
61 /* === M E T H O D S ======================================================= */
62
63 Action::ValueDescConnect::ValueDescConnect()
64 {
65 }
66
67 Action::ParamVocab
68 Action::ValueDescConnect::get_param_vocab()
69 {
70         ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
71         
72         ret.push_back(ParamDesc("dest",Param::TYPE_VALUEDESC)
73                 .set_local_name(_("Destination ValueDesc"))
74         );
75
76         ret.push_back(ParamDesc("src",Param::TYPE_VALUENODE)
77                 .set_local_name(_("Source ValueNode"))
78                 .set_mutual_exclusion("src_name")
79         );
80
81         ret.push_back(ParamDesc("src_name",Param::TYPE_STRING)
82                 .set_local_name(_("Source ValueNode Name"))
83                 .set_mutual_exclusion("src")
84                 .set_user_supplied()
85         );
86         
87         return ret;
88 }
89
90 bool
91 Action::ValueDescConnect::is_canidate(const ParamList &x)
92 {
93         if(canidate_check(get_param_vocab(),x))
94         {
95                 if(x.count("src"))
96                 {
97                         ValueDesc value_desc=x.find("dest")->second.get_value_desc();
98                         ValueNode::Handle value_node=x.find("src")->second.get_value_node();
99                         if(value_desc.get_value_type()==value_node->get_type()) 
100                                 return true;
101                 }
102                 return true;
103         }
104         return false;
105 }
106
107 bool
108 Action::ValueDescConnect::set_param(const synfig::String& name, const Action::Param &param)
109 {
110         if(name=="dest" && param.get_type()==Param::TYPE_VALUEDESC)
111         {
112                 value_desc=param.get_value_desc();
113                 
114                 return true;
115         }
116
117         if(name=="src" && param.get_type()==Param::TYPE_VALUENODE)
118         {
119                 value_node=param.get_value_node();
120                 
121                 return true;
122         }
123
124         if(!value_node_name.empty() && !value_node && name=="canvas" && param.get_type()==Param::TYPE_CANVAS)
125         {
126                 value_node=param.get_canvas()->find_value_node(value_node_name);
127         }
128         
129         if(name=="src_name" && param.get_type()==Param::TYPE_STRING)
130         {
131                 value_node_name=param.get_string();
132                 
133                 if(get_canvas())
134                 {
135                         value_node=get_canvas()->find_value_node(value_node_name);
136                         if(!value_node)
137                                 return false;
138                 }
139                 
140                 return true;
141         }
142         
143         return Action::CanvasSpecific::set_param(name,param);
144 }
145
146 bool
147 Action::ValueDescConnect::is_ready()const
148 {
149         if(!value_desc || !value_node)
150                 return false;
151         return Action::CanvasSpecific::is_ready();
152 }
153
154 void
155 Action::ValueDescConnect::prepare()
156 {
157         clear();
158
159         if(value_desc.parent_is_canvas())
160         {                               
161                 ValueNode::Handle dest_value_node;
162                 dest_value_node=value_desc.get_value_node();
163
164                 Action::Handle action(ValueNodeReplace::create());
165                 
166                 action->set_param("canvas",get_canvas());
167                 action->set_param("canvas_interface",get_canvas_interface());
168                 action->set_param("src",value_node);
169                 action->set_param("dest",value_desc.get_value_node());
170         
171                 assert(action->is_ready());
172                 if(!action->is_ready())
173                         throw Error(Error::TYPE_NOTREADY);
174         
175                 add_action_front(action);
176                 return;         
177         }
178         else
179         if(value_desc.parent_is_linkable_value_node())
180         {
181                 Action::Handle action(ValueNodeLinkConnect::create());
182                 
183                 action->set_param("canvas",get_canvas());
184                 action->set_param("canvas_interface",get_canvas_interface());
185                 action->set_param("parent_value_node",value_desc.get_parent_value_node());
186                 action->set_param("value_node", value_node);
187                 action->set_param("index",value_desc.get_index());
188         
189                 assert(action->is_ready());
190                 if(!action->is_ready())
191                         throw Error(Error::TYPE_NOTREADY);
192         
193                 add_action_front(action);
194                 return;         
195         }
196         else
197         if(value_desc.parent_is_layer_param())
198         {
199                 Action::Handle action(LayerParamConnect::create());
200                 
201                 action->set_param("canvas",get_canvas());
202                 action->set_param("canvas_interface",get_canvas_interface());
203                 action->set_param("layer",value_desc.get_layer());
204                 action->set_param("param",value_desc.get_param_name());
205                 action->set_param("value_node",value_node);
206         
207                 assert(action->is_ready());             
208                 if(!action->is_ready())
209                         throw Error(Error::TYPE_NOTREADY);
210         
211                 add_action_front(action);
212                 return;         
213         }
214         
215         throw Error(_("ValueDesc is not recognised or supported."));    
216 }