source: synfigstudio/trunk/fuentes/src/synfigapp/actions/valuenodedynamiclistloop.cpp @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 5.6 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file valuenodedynamiclistloop.cpp
3**      \brief Template File
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) 2012 Carlos López
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/* === H E A D E R S ======================================================= */
26
27#ifdef USING_PCH
28#       include "pch.h"
29#else
30#ifdef HAVE_CONFIG_H
31#       include <config.h>
32#endif
33
34#include "valuenodedynamiclistloop.h"
35#include <synfigapp/canvasinterface.h>
36
37#include <synfigapp/general.h>
38#include <synfig/valuenodes/valuenode_composite.h>
39
40#endif
41
42using namespace std;
43using namespace etl;
44using namespace synfig;
45using namespace synfigapp;
46using namespace Action;
47
48/* === M A C R O S ========================================================= */
49
50ACTION_INIT(Action::ValueNodeDynamicListLoop);
51ACTION_SET_NAME(Action::ValueNodeDynamicListLoop,"ValueNodeDynamicListLoop");
52ACTION_SET_LOCAL_NAME(Action::ValueNodeDynamicListLoop,N_("Loop"));
53ACTION_SET_TASK(Action::ValueNodeDynamicListLoop,"loop");
54ACTION_SET_CATEGORY(Action::ValueNodeDynamicListLoop,Action::CATEGORY_VALUEDESC|Action::CATEGORY_VALUENODE);
55ACTION_SET_PRIORITY(Action::ValueNodeDynamicListLoop,0);
56ACTION_SET_VERSION(Action::ValueNodeDynamicListLoop,"0.0");
57ACTION_SET_CVS_ID(Action::ValueNodeDynamicListLoop,"$Id$");
58
59/* === G L O B A L S ======================================================= */
60
61/* === P R O C E D U R E S ================================================= */
62
63/* === M E T H O D S ======================================================= */
64
65Action::ValueNodeDynamicListLoop::ValueNodeDynamicListLoop():
66        old_loop_value()
67{ }
68
69Action::ParamVocab
70Action::ValueNodeDynamicListLoop::get_param_vocab()
71{
72        ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
73        ret.push_back(ParamDesc("value_node",Param::TYPE_VALUENODE)
74                .set_local_name(_("ValueNode"))
75        );
76        return ret;
77}
78
79bool
80Action::ValueNodeDynamicListLoop::is_candidate(const ParamList &x)
81{
82        if (!candidate_check(get_param_vocab(),x))
83                return false;
84        ValueNode::Handle value_node;
85        ValueDesc value_desc(x.find("value_desc")->second.get_value_desc());
86        if(value_desc.parent_is_value_node())
87        {
88                value_node = value_desc.get_parent_value_node();
89                // let's check if the parent is a composite (if user clicked on tangent duck)
90                if(ValueNode_Composite::Handle::cast_dynamic(value_node))
91                {
92                        ValueNode_Composite::Handle compo(ValueNode_Composite::Handle::cast_dynamic(value_node));
93                        ValueNode_BLine::Handle bline=NULL;
94                        std::set<Node*>::iterator iter;
95                        // now check if the grand parent is a dynamic list 'bline' type
96                        for(iter=compo->parent_set.begin();iter!=compo->parent_set.end();++iter)
97                                {
98                                        bline=ValueNode_BLine::Handle::cast_dynamic(*iter);
99                                        if(bline)
100                                                break;
101                                }
102                        if(bline)
103                                value_node=bline;
104                }
105        }
106        else
107                value_node = x.find("value_node")->second.get_value_node();
108        // We need a dynamic list.
109        return (ValueNode_DynamicList::Handle::cast_dynamic(value_node) &&
110                        // We need the list not to be looped.
111                        !ValueNode_DynamicList::Handle::cast_dynamic(value_node)->get_loop());
112}
113
114bool
115Action::ValueNodeDynamicListLoop::set_param(const synfig::String& name, const Action::Param &param)
116{
117        if(!value_node && name=="value_desc" && param.get_type()==Param::TYPE_VALUEDESC)
118        {
119                ValueDesc value_desc(param.get_value_desc());
120                if(!value_desc.parent_is_value_node())
121                        return false;
122                // Let's check if it is a dynamic list
123                value_node=ValueNode_DynamicList::Handle::cast_dynamic(value_desc.get_parent_value_node());
124                if (!value_node)
125                {
126                        // we didn't found a dynamic list, let's check wheter the parent is a composite
127                        if(ValueNode_Composite::Handle::cast_dynamic(value_desc.get_parent_value_node()))
128                        {
129                                ValueNode_Composite::Handle compo(ValueNode_Composite::Handle::cast_dynamic(value_desc.get_parent_value_node()));
130                                ValueNode_BLine::Handle bline=NULL;
131                                std::set<Node*>::iterator iter;
132                                // now check if the grand parent is a 'bline' type
133                                for(iter=compo->parent_set.begin();iter!=compo->parent_set.end();++iter)
134                                        {
135                                                bline=ValueNode_BLine::Handle::cast_dynamic(*iter);
136                                                if(bline)
137                                                        break;
138                                        }
139                                if(bline)
140                                        value_node=bline;
141                        }
142                }
143                if(!value_node)
144                        return false;
145                return true;
146        }
147        if(!value_node && name=="value_node" && param.get_type()==Param::TYPE_VALUENODE)
148        {
149                value_node=ValueNode_DynamicList::Handle::cast_dynamic(param.get_value_node());
150                if(!value_node)
151                        return false;
152                return true;
153        }
154        return Action::CanvasSpecific::set_param(name,param);
155}
156
157bool
158Action::ValueNodeDynamicListLoop::is_ready()const
159{
160        if(!value_node)
161                return false;
162        return Action::CanvasSpecific::is_ready();
163}
164
165void
166Action::ValueNodeDynamicListLoop::perform()
167{
168        old_loop_value=value_node->get_loop();
169        if(old_loop_value==true)
170        {
171                set_dirty(false);
172                return;
173        }
174        set_dirty(true);
175        value_node->set_loop(true);
176        value_node->changed();
177}
178
179void
180Action::ValueNodeDynamicListLoop::undo()
181{
182        if(old_loop_value==value_node->get_loop())
183        {
184                set_dirty(false);
185                return;
186        }
187        set_dirty(true);
188        value_node->set_loop(old_loop_value);
189        value_node->changed();
190}
Note: See TracBrowser for help on using the repository browser.