Remove use of get_link_index_from_name where not needed
[synfig.git] / synfig-studio / src / gui / duckmatic.cpp
index 786aa11..cece9fb 100644 (file)
 
 #include "duckmatic.h"
 #include <synfigapp/value_desc.h>
+#include <synfigapp/canvasinterface.h>
 #include <synfig/general.h>
 #include <synfig/paramdesc.h>
 #include <synfig/valuenode_timedswap.h>
 #include <synfig/valuenode_animated.h>
 #include <synfig/valuenode_composite.h>
+#include <synfig/valuenode_range.h>
 #include <synfig/valuenode_scale.h>
 #include <synfig/valuenode_bline.h>
 #include <synfig/valuenode_blinecalctangent.h>
@@ -88,7 +90,8 @@ using namespace studio;
 
 /* === E N T R Y P O I N T ================================================= */
 
-Duckmatic::Duckmatic():
+Duckmatic::Duckmatic(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface):
+       canvas_interface(canvas_interface),
        type_mask(Duck::TYPE_ALL-Duck::TYPE_WIDTH),
        grid_snap(false),
        guide_snap(false),
@@ -125,7 +128,7 @@ Duckmatic::clear_ducks()
                stroke_list_=persistent_stroke_list_;
 }
 
-//! Returns \a true if the given duck is currently selected
+
 bool
 Duckmatic::duck_is_selected(const etl::handle<Duck> &duck)const
 {
@@ -472,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())
                                                                {
@@ -506,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));
                                                }
                                        }
@@ -635,6 +637,20 @@ DuckDrag_Translate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector
        last_translate_=vect;
 }
 
+
+void
+Duckmatic::signal_user_click_selected_ducks(int button)
+{
+       const DuckList ducks(get_selected_ducks());
+       DuckList::const_iterator iter;
+
+       for(iter=ducks.begin();iter!=ducks.end();++iter)
+       {
+               (*iter)->signal_user_click(button)();
+       }
+}
+
+
 void
 Duckmatic::signal_edited_selected_ducks()
 {
@@ -695,18 +711,29 @@ Duckmatic::signal_edited_selected_ducks()
        selected_ducks=old_set;
 }
 
-void
-Duckmatic::signal_user_click_selected_ducks(int button)
-{
-       const DuckList ducks(get_selected_ducks());
-       DuckList::const_iterator iter;
 
-       for(iter=ducks.begin();iter!=ducks.end();++iter)
+bool
+Duckmatic::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc)
+{
+       switch(value_desc.get_value_type())
        {
-               (*iter)->signal_user_click(button)();
+       case ValueBase::TYPE_REAL:
+               return canvas_interface->change_value(value_desc,value.mag());
+       case ValueBase::TYPE_ANGLE:
+               return canvas_interface->change_value(value_desc,Angle::tan(value[1],value[0]));
+       default:
+               return canvas_interface->change_value(value_desc,value);
        }
 }
 
+bool
+Duckmatic::on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc)
+{
+       // \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);
+}
+
 void
 Duckmatic::add_duck(const etl::handle<Duck> &duck)
 {
@@ -1170,8 +1197,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                        duck->signal_edited().connect(
                                sigc::bind(
                                        sigc::mem_fun(
-                                               *canvas_view,
-                                               &studio::CanvasView::on_duck_changed),
+                                               *this,
+                                               &studio::Duckmatic::on_duck_changed),
                                        value_desc));
                        duck->set_value_desc(value_desc);
 
@@ -1242,8 +1269,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                        duck->signal_edited_angle().connect(
                                sigc::bind(
                                        sigc::mem_fun(
-                                               *canvas_view,
-                                               &studio::CanvasView::on_duck_angle_changed),
+                                               *this,
+                                               &studio::Duckmatic::on_duck_angle_changed),
                                        value_desc));
                        duck->set_value_desc(value_desc);
 
@@ -1335,8 +1362,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle<Canva
                        duck->signal_edited().connect(
                                sigc::bind(
                                        sigc::mem_fun(
-                                               *canvas_view,
-                                               &studio::CanvasView::on_duck_changed),
+                                               *this,
+                                               &studio::Duckmatic::on_duck_changed),
                                        value_desc));
                        duck->set_value_desc(value_desc);