Move reverse manipulation code into ValueDescSet action
[synfig.git] / synfig-studio / src / gui / duckmatic.cpp
index 51ed17f..7fe1f19 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),
@@ -635,6 +638,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 +712,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 +1198,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 +1270,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 +1363,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);