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

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

First release to xenial

File size: 4.6 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file layerresetpose.cpp
3**      \brief Template File
4**
5**      $Id$
6**
7**      \legal
8**      ......... ... 2014 Ivan Mahonin
9**
10**      This package is free software; you can redistribute it and/or
11**      modify it under the terms of the GNU General Public License as
12**      published by the Free Software Foundation; either version 2 of
13**      the License, or (at your option) any later version.
14**
15**      This package is distributed in the hope that it will be useful,
16**      but WITHOUT ANY WARRANTY; without even the implied warranty of
17**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18**      General Public License for more details.
19**      \endlegal
20*/
21/* ========================================================================= */
22
23/* === H E A D E R S ======================================================= */
24
25#ifdef USING_PCH
26#       include "pch.h"
27#else
28#ifdef HAVE_CONFIG_H
29#       include <config.h>
30#endif
31
32#include "layerresetpose.h"
33#include <synfigapp/canvasinterface.h>
34#include <synfigapp/general.h>
35
36#include <synfig/valuenodes/valuenode_bone.h>
37#include <synfig/valuenodes/valuenode_composite.h>
38
39#endif
40
41using namespace std;
42using namespace etl;
43using namespace synfig;
44using namespace synfigapp;
45using namespace Action;
46
47/* === M A C R O S ========================================================= */
48
49ACTION_INIT(Action::LayerResetPose);
50ACTION_SET_NAME(Action::LayerResetPose,"LayerResetPose");
51ACTION_SET_LOCAL_NAME(Action::LayerResetPose,N_("Reset Pose"));
52ACTION_SET_TASK(Action::LayerResetPose,"layer_reset_pose");
53ACTION_SET_CATEGORY(Action::LayerResetPose,Action::CATEGORY_LAYER);
54ACTION_SET_PRIORITY(Action::LayerResetPose,0);
55ACTION_SET_VERSION(Action::LayerResetPose,"0.0");
56ACTION_SET_CVS_ID(Action::LayerResetPose,"$Id$");
57
58/* === G L O B A L S ======================================================= */
59
60/* === P R O C E D U R E S ================================================= */
61
62/* === M E T H O D S ======================================================= */
63
64Action::LayerResetPose::LayerResetPose():
65        time(0)
66{
67}
68
69Action::ParamVocab
70Action::LayerResetPose::get_param_vocab()
71{
72        ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
73
74        ret.push_back(ParamDesc("layer",Param::TYPE_LAYER)
75                .set_local_name(_("Layer"))
76                .set_desc(_("Layer to reset"))
77                .set_supports_multiple()
78        );
79        ret.push_back(ParamDesc("time",Param::TYPE_TIME)
80                .set_local_name(_("Time"))
81                .set_optional()
82        );
83
84        return ret;
85}
86
87bool
88Action::LayerResetPose::is_candidate(const ParamList &x)
89{
90        if(!candidate_check(get_param_vocab(),x))
91                return false;
92
93        for(ParamList::const_iterator i = x.find("layer"); i != x.end() && i->first == "layer"; ++i)
94                if (i->second.get_type()==Param::TYPE_LAYER
95                 && i->second.get_layer()->get_name() == "skeleton_deformation")
96                        return true;
97
98        return false;
99}
100
101bool
102Action::LayerResetPose::set_param(const synfig::String& name, const Action::Param &param)
103{
104        if (name=="layer"
105         && param.get_type()==Param::TYPE_LAYER
106         && param.get_layer()->get_name() == "skeleton_deformation" )
107        {
108                layers.push_back(param.get_layer());
109                return true;
110        }
111
112        if(name=="time" && param.get_type()==Param::TYPE_TIME)
113        {
114                time=param.get_time();
115                return true;
116        }
117
118        return Action::CanvasSpecific::set_param(name,param);
119}
120
121bool
122Action::LayerResetPose::is_ready()const
123{
124        if(layers.empty())
125                return false;
126        return Action::CanvasSpecific::is_ready();
127}
128
129void
130Action::LayerResetPose::prepare()
131{
132        clear();
133
134        for(std::list<synfig::Layer::Handle>::const_iterator i=layers.begin(); i!=layers.end(); ++i)
135        {
136                Layer::Handle layer(*i);
137                Canvas::Handle subcanvas(layer->get_canvas());
138
139                Layer::DynamicParamList::const_iterator j = layer->dynamic_param_list().find("bones");
140                if (j == layer->dynamic_param_list().end()) continue;
141
142                LinkableValueNode::Handle bones_node = LinkableValueNode::Handle::cast_dynamic(j->second);
143                if (!bones_node) continue;
144
145                for(int k = 0; k < bones_node->link_count(); ++k)
146                {
147                        ValueNode_Composite::Handle pair_node =
148                                ValueNode_Composite::Handle::cast_dynamic(
149                                        bones_node->get_link(k) );
150                        if (!pair_node) continue;
151
152                        ValueNode_Bone::Handle bone_node =
153                                ValueNode_Bone::Handle::cast_dynamic(
154                                        pair_node->get_link("first") );
155                        if (!bone_node) continue;
156
157                        Action::Handle action(Action::create("ValueDescResetPose"));
158                        action->set_param("canvas", get_canvas());
159                        action->set_param("canvas_interface", get_canvas_interface());
160                        action->set_param(
161                                "value_desc",
162                                ValueDesc(
163                                        bone_node,
164                                        bone_node->get_link_index_from_name("origin"),
165                                        ValueDesc(pair_node, pair_node->get_link_index_from_name("first")) ));
166                        action->set_param("time", time);
167                        add_action_front(action);
168                }
169        }
170}
Note: See TracBrowser for help on using the repository browser.