Use ETL directory separator instead of forward slashes.
[synfig.git] / synfig-studio / trunk / src / gtkmm / canvasview.cpp
index 8c0f3b7..9357698 100644 (file)
@@ -53,7 +53,9 @@
 #include <synfig/valuenode_dynamiclist.h>
 #include <synfig/valuenode_twotone.h>
 #include <synfig/valuenode_stripes.h>
+#include <synfig/valuenode_blinecalctangent.h>
 #include <synfig/valuenode_blinecalcvertex.h>
+#include <synfig/valuenode_blinecalcwidth.h>
 #include <synfig/valuenode_bline.h>
 #include <synfig/layer.h>
 
@@ -2585,29 +2587,60 @@ CanvasView::duck_change_param(const synfig::Point &value,synfig::Layer::Handle l
 bool
 CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc)
 {
-       if( ValueNode_BLineCalcVertex::Handle bline_vertex =
-               ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node())
-       )
-       {
-               Real radius = 0.0;
-               Real amount = synfig::find_closest_point( 
-                       ( *bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline")) )( get_time() ),
-                       value,
-                       radius,
-                       ( *bline_vertex->get_link(bline_vertex->get_link_index_from_name("loop")) )( get_time() ).get(bool())
-               );
-               return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount);
-       }
-
        switch(value_desc.get_value_type())
        {
        case ValueBase::TYPE_REAL:
+               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()));
+                       if (!(canvas_interface()->change_value(synfigapp::ValueDesc(bline_width,scale_index),
+                                                                                                  new_width * scale / old_width)))
+                               return false;
+               }
                return canvas_interface()->change_value(value_desc,value.mag());
                break;
        case ValueBase::TYPE_ANGLE:
                return canvas_interface()->change_value(value_desc,Angle::tan(value[1],value[0]));
                break;
-       default:
+       case ValueBase::TYPE_VECTOR:
+               if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node()))
+               {
+                       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);
+               }
+
+               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_vertex->get_link_index_from_name("bline")));
+                       Real radius = 0.0;
+                       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);
+               }
+       default:                                        // fall through
+
                return canvas_interface()->change_value(value_desc,value);
                break;
        }