When making ducks for elements of a list of vectors, don't set origins for the ducks...
[synfig.git] / synfig-studio / trunk / src / gtkmm / duckmatic.cpp
index 92675c8..5c7fe27 100644 (file)
@@ -254,9 +254,10 @@ Duckmatic::is_duck_group_selectable(const etl::handle<Duck>& x)const
                 !x->get_editable()))
                return false;
 
-       if(x->get_value_desc().parent_is_layer_param() && type & Duck::TYPE_POSITION)
+       synfigapp::ValueDesc value_desc(x->get_value_desc());
+       if(value_desc.parent_is_layer_param() && type & Duck::TYPE_POSITION)
        {
-               Layer::Handle layer(x->get_value_desc().get_layer());
+               Layer::Handle layer(value_desc.get_layer());
                String layer_name(layer->get_name());
 
                if (layer_name == "outline" || layer_name == "region" || layer_name == "plant" ||
@@ -267,6 +268,30 @@ Duckmatic::is_duck_group_selectable(const etl::handle<Duck>& x)const
                   !layer->get_param("children_lock").get(bool()))
                        return false;
        }
+       else if (value_desc.parent_is_value_node())
+       {
+               if (ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node()))
+                       return false;
+               if (value_desc.parent_is_linkable_value_node())
+               {
+                       LinkableValueNode::Handle parent_value_node(value_desc.get_parent_value_node());
+                       if (ValueNode_Composite::Handle::cast_dynamic(parent_value_node))
+                       {
+                               if (parent_value_node->get_type() == ValueBase::TYPE_BLINEPOINT &&
+                                       ValueNode_BLineCalcVertex::Handle::cast_dynamic(
+                                               parent_value_node->get_link("point")))
+                                       return false;
+                       }
+                       else if (ValueNode_BLine::Handle::cast_dynamic(parent_value_node))
+                       {
+                               ValueNode_Composite::Handle composite(ValueNode_Composite::Handle::cast_dynamic(
+                                                                                                                 value_desc.get_value_node()));
+                               if (composite &&
+                                       ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))
+                                       return false;
+                       }
+               }
+       }
        return true;
 }
 
@@ -526,7 +551,13 @@ DuckDrag_Translate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector
                {
                        duck->set_trans_point(positions[i]+vect);
 
-                       if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node()))
+                       ValueNode_BLineCalcVertex::Handle bline_vertex;
+                       ValueNode_Composite::Handle composite;
+
+                       if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) ||
+                               ((composite = ValueNode_Composite::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) &&
+                                composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
+                                (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
                        {
                                synfig::Point closest_point = duck->get_point();
                                synfig::Real radius = 0.0;
@@ -554,8 +585,13 @@ DuckDrag_Translate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector
                etl::handle<Duck> duck(*iter);
                if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
                {
-                       ValueNode_BLineCalcVertex::Handle bline_vertex(ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node()));
-                       if (bline_vertex)
+                       ValueNode_BLineCalcVertex::Handle bline_vertex;
+                       ValueNode_Composite::Handle composite;
+
+                       if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) ||
+                               ((composite = ValueNode_Composite::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) &&
+                                composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
+                                (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
                        {
                                synfig::Real radius = 0.0;
                                ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))));
@@ -1516,6 +1552,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                                                                false),
                                                                        1.0f),
                                                                synfigapp::ValueDesc(value_node,i)));
+                                               duck->set_value_desc(synfigapp::ValueDesc(value_node,i));
 
                                                if(param_desc)
                                                {
@@ -1645,6 +1682,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                                                        false),
                                                                1.0f),
                                                        synfigapp::ValueDesc(value_node,i)));
+                                       duck->set_value_desc(synfigapp::ValueDesc(value_node,i));
 
                                        add_bezier(bezier);
                                        bezier=0;
@@ -1701,6 +1739,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                                                        false),
                                                                1.0f),
                                                        synfigapp::ValueDesc(value_node,i)));
+                                       duck->set_value_desc(synfigapp::ValueDesc(value_node,i));
 
                                }
 
@@ -1768,6 +1807,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                                                false),
                                                        1.0f),
                                                synfigapp::ValueDesc(value_node,first)));
+                               duck->set_value_desc(synfigapp::ValueDesc(value_node,first));
 
                                add_bezier(bezier);
                                bezier=0;
@@ -1802,7 +1842,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                                first_duck = duck;
                                        }
 
-                                       if(param_desc)
+                                       if(param_desc && !param_desc->get_origin().empty())
                                        {
                                                                synfigapp::ValueDesc value_desc_origin(value_desc.get_layer(),param_desc->get_origin());
                                                                add_to_ducks(value_desc_origin,canvas_view, transform_stack);