Merge branch 'nikitakit_master'
[synfig.git] / synfig-studio / src / gui / duckmatic.cpp
index fe2d6a3..adf95f6 100644 (file)
@@ -475,17 +475,16 @@ Duckmatic::update_ducks()
                                        if ( (*iter)->get_origin_duck()==duck  /*&& !duck_is_selected(*iter)*/ )
                                        {
                                                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"))));
+                                               ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link("bline")));
                                                Real amount = synfig::find_closest_point((*bline)(time), duck->get_point(), radius, bline->get_loop());
 
-                                               int vertex_amount_index(bline_vertex->get_link_index_from_name("amount"));
-                                               ValueNode::Handle vertex_amount_value_node(bline_vertex->get_link(vertex_amount_index));
+                                               ValueNode::Handle vertex_amount_value_node(bline_vertex->get_link("amount"));
 
 
                                                ValueNode::Handle duck_value_node((*iter)->get_value_desc().get_value_node());
                                                if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(duck_value_node))
                                                {
-                                                       if (bline_tangent->get_link(bline_tangent->get_link_index_from_name("amount")) == vertex_amount_value_node)
+                                                       if (bline_tangent->get_link("amount") == vertex_amount_value_node)
                                                        {
                                                                switch (bline_tangent->get_type())
                                                                {
@@ -509,7 +508,7 @@ Duckmatic::update_ducks()
                                                }
                                                else if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::Handle::cast_dynamic(duck_value_node))
                                                {
-                                                       if (bline_width->get_link(bline_width->get_link_index_from_name("amount")) == vertex_amount_value_node)
+                                                       if (bline_width->get_link("amount") == vertex_amount_value_node)
                                                                (*iter)->set_point(Point((*bline_width)(time, amount).get(Real()), 0));
                                                }
                                        }
@@ -716,104 +715,6 @@ Duckmatic::signal_edited_selected_ducks()
 bool
 Duckmatic::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc)
 {
-       if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               Real old_width((*bline_width)(get_time()).get(Real()));
-               Real new_width(value.mag());
-               int scale_index(bline_width->get_link_index_from_name("scale"));
-               Real scale((*(bline_width->get_link(scale_index)))(get_time()).get(Real()));
-               return canvas_interface->change_value(synfigapp::ValueDesc(bline_width,scale_index), new_width * scale / old_width);
-       }
-
-       if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link("bline"));
-               Real radius = 0.0;
-               if (((*(bline_vertex->get_link("loop")))(get_time()).get(bool()))){
-                       Real amount_old((*(bline_vertex->get_link("amount")))(get_time()).get(Real()));
-                       Real amount_new = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop());
-                       Real difference = fmod( fmod(amount_new - amount_old, 1.0) + 1.0 , 1.0);
-                                                       //fmod is called twice to avoid negative values
-                       if (difference > 0.5) difference=difference-1.0;
-                       return canvas_interface->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount_old+difference);
-
-               } else {
-                       Real amount = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop());
-                       return canvas_interface->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount);
-               }
-       }
-
-       if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               switch(value_desc.get_value_type())
-               {
-               case ValueBase::TYPE_REAL:
-               {
-                       Real old_length = (*bline_tangent)(get_time()).get(Real());
-                       Real new_length = value.mag();
-                       int scale_index(bline_tangent->get_link_index_from_name("scale"));
-                       int fixed_length_index(bline_tangent->get_link_index_from_name("fixed_length"));
-                       Real scale((*(bline_tangent->get_link(scale_index)))(get_time()).get(Real()));
-                       bool fixed_length((*(bline_tangent->get_link(fixed_length_index)))(get_time()).get(bool()));
-                       if (fixed_length)
-                               return canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length);
-                       if (old_length == 0)
-                               return true;
-                       return canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length * scale / old_length);
-               }
-
-               case ValueBase::TYPE_ANGLE:
-                       assert(0);                      // doesn't happen?
-                       break;
-
-               case ValueBase::TYPE_VECTOR:
-               {
-                       Vector old_tangent = (*bline_tangent)(get_time()).get(Vector());
-                       Angle old_angle = old_tangent.angle();
-                       Real old_length = old_tangent.mag();
-                       Angle new_angle = value.angle();
-                       Real new_length = value.mag();
-                       int offset_index(bline_tangent->get_link_index_from_name("offset"));
-                       int scale_index(bline_tangent->get_link_index_from_name("scale"));
-                       int fixed_length_index(bline_tangent->get_link_index_from_name("fixed_length"));
-                       Angle old_offset((*(bline_tangent->get_link(offset_index)))(get_time()).get(Angle()));
-                       Real scale((*(bline_tangent->get_link(scale_index)))(get_time()).get(Real()));
-                       bool fixed_length((*(bline_tangent->get_link(fixed_length_index)))(get_time()).get(bool()));
-                       if (fixed_length)
-                       {
-                               if (!(canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length)))
-                                       return false;
-                       }
-                       else if (old_length != 0 && !(canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,scale_index), new_length * scale / old_length)))
-                               return false;
-                       return canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + new_angle - old_angle);
-               }
-               default:
-                       break;
-               }
-       }
-
-       if (ValueNode_Scale::Handle scale_value_node = ValueNode_Scale::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               int link_index(scale_value_node->get_link_index_from_name("link"));
-               if(scale_value_node->is_invertible(get_time()))
-                       return canvas_interface->change_value(
-                               synfigapp::ValueDesc(scale_value_node,link_index),
-                                       scale_value_node->get_inverse(get_time(), value)
-                                       );
-               else
-                       return false;
-       }
-
-       if (ValueNode_Range::Handle range_value_node = ValueNode_Range::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               int link_index(range_value_node->get_link_index_from_name("link"));
-               return canvas_interface->change_value(
-                       synfigapp::ValueDesc(range_value_node,link_index),
-                               range_value_node->get_inverse(get_time(), value)
-                               );
-       }
-
        switch(value_desc.get_value_type())
        {
        case ValueBase::TYPE_REAL:
@@ -828,33 +729,6 @@ Duckmatic::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc
 bool
 Duckmatic::on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc)
 {
-       if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               int offset_index(bline_tangent->get_link_index_from_name("offset"));
-               Angle old_offset((*(bline_tangent->get_link(offset_index)))(get_time()).get(Angle()));
-               return canvas_interface->change_value(synfigapp::ValueDesc(bline_tangent,offset_index), old_offset + rotation);
-       }
-
-       if (ValueNode_Scale::Handle scale_value_node = ValueNode_Scale::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               int link_index(scale_value_node->get_link_index_from_name("link"));
-               if(scale_value_node->is_invertible(get_time()))
-                       return canvas_interface->change_value(
-                               synfigapp::ValueDesc(scale_value_node,link_index),
-                                       scale_value_node->get_inverse(get_time(), rotation)
-                                       );
-               else
-                       return false;
-
-       }
-       if (ValueNode_Range::Handle range_value_node = ValueNode_Range::Handle::cast_dynamic(value_desc.get_value_node()))
-       {
-               int link_index(range_value_node->get_link_index_from_name("link"));
-               return canvas_interface->change_value(
-                       synfigapp::ValueDesc(range_value_node,link_index),
-                               range_value_node->get_inverse(get_time(), rotation)
-                               );
-       }
        // \todo will this really always be the case?
        assert(value_desc.get_value_type() == ValueBase::TYPE_ANGLE);
        return canvas_interface->change_value(value_desc, value_desc.get_value(get_time()).get(Angle()) + rotation);
@@ -1614,7 +1488,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                return false;
                        etl::handle<Duck> vertex_duck(last_duck());
                        vertex_duck->set_type(Duck::TYPE_VERTEX);
-                       if(!add_to_ducks(synfigapp::ValueDesc(value_node,4),canvas_view,transform_stack))
+                       if(!add_to_ducks(synfigapp::ValueDesc(value_node,4,-TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
                                return false;
                        etl::handle<Duck> t1_duck(last_duck());
 
@@ -1627,7 +1501,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                        // If the tangents are split
                        if((*value_node->get_link("split"))(get_time()).get(bool()))
                        {
-                               if(!add_to_ducks(synfigapp::ValueDesc(value_node,5),canvas_view,transform_stack))
+                               if(!add_to_ducks(synfigapp::ValueDesc(value_node,5,TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
                                        return false;
                                t2_duck=last_duck();
                                t2_duck->set_origin(vertex_duck);
@@ -1636,7 +1510,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                        }
                        else
                        {
-                               if(!add_to_ducks(synfigapp::ValueDesc(value_node,4),canvas_view,transform_stack))
+                               if(!add_to_ducks(synfigapp::ValueDesc(value_node,4,TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
                                        return false;
                                t2_duck=last_duck();
                                t2_duck->set_origin(vertex_duck);
@@ -1791,7 +1665,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                        // Add the tangent1 duck
                                        if(composite_vertex_value_node)
                                        {
-                                               if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,4),canvas_view,transform_stack))
+                                               if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,4,-TANGENT_BEZIER_SCALE),canvas_view,transform_stack))
                                                        return false;
                                                tduck=last_duck();
                                        }
@@ -1848,7 +1722,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                                if(composite_vertex_value_node)
                                {
                                        int i=bline_point.get_split_tangent_flag()?5:4;
-                                       if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,i),canvas_view,transform_stack,0,2))
+                                       if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,i,TANGENT_BEZIER_SCALE),canvas_view,transform_stack,0,2))
                                                return false;
                                        tduck=last_duck();
                                }