Better functionality for ducks linked to BLine
authorNikita Kitaev <nikitakit@gmail.com>
Thu, 10 Dec 2009 05:30:42 +0000 (21:30 -0800)
committerNikita Kitaev <nikitakit@gmail.com>
Thu, 10 Dec 2009 05:32:54 +0000 (21:32 -0800)
Still not ideal, but should be as good as it was originally.

synfig-studio/src/gtkmm/duck.cpp
synfig-studio/src/gtkmm/duckmatic.cpp
synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp
synfig-studio/src/gtkmm/state_normal.cpp
synfig-studio/src/gtkmm/state_smoothmove.cpp

index 362ac0a..da32897 100644 (file)
@@ -255,7 +255,7 @@ Duck::set_sub_trans_point(const synfig::Point &x, const synfig::Time &time)
 void
 Duck::update(const synfig::Time &time)
 {
-       if((get_type() == Duck::TYPE_TANGENT || get_type() == Duck::TYPE_WIDTH) && origin_duck)
+       if((get_type() == Duck::TYPE_TANGENT || get_type() == Duck::TYPE_WIDTH || get_type() == Duck::TYPE_ANGLE) && origin_duck)
        {
                ValueNode_BLineCalcVertex::Handle bline_vertex;
                ValueNode_Composite::Handle composite;
@@ -280,6 +280,7 @@ Duck::update(const synfig::Time &time)
                                {
                                        Angle angle((*bline_tangent)(time, amount).get(Angle()));
                                        set_point(Point(Angle::cos(angle).get(), Angle::sin(angle).get()));
+                                       rotations=synfig::Angle::deg(0); //hack: rotations are a relative value
                                        break;
                                }
                                case ValueBase::TYPE_REAL:
index 6c5510e..c1813e7 100644 (file)
@@ -562,11 +562,26 @@ DuckDrag_Translate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector
 
        // then patch up the tangents for the vertices we've moved
        DuckList duck_list(duckmatic->get_duck_list());
-       for (iter=duck_list.begin(); iter!=duck_list.end(); ++iter)
+       for (iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter)
        {
-               if ((*iter)->get_type() == Duck::TYPE_TANGENT || (*iter)->get_type() == Duck::TYPE_WIDTH)
+               etl::handle<Duck> duck(*iter);
+               if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
                {
-                       (*iter)->update(time);
+                       ValueNode_Composite::Handle composite;
+
+                       if ((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 &&
+                                (ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
+                       {
+                               //! \todo update() will call dynamic cast again, see if we can avoid that
+                               DuckList::iterator iter;
+                               for (iter=duck_list.begin(); iter!=duck_list.end(); iter++)
+                                       if ((*iter)->get_origin_duck()==duck 
+                                               && std::find(selected_ducks.begin(), 
+                                                                        selected_ducks.end(), *iter) == selected_ducks.end() )
+                                               (*iter)->update(time);
+                       }
                }
        }
 
index 35cac16..5843a6a 100644 (file)
@@ -292,7 +292,7 @@ DuckDrag_Mirror::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
                        if              (axis==AXIS_X) p[0] = -(p[0]-center[0]) + center[0];
                        else if (axis==AXIS_Y) p[1] = -(p[1]-center[1]) + center[1];
 
-                       (*iter)->set_trans_point(p, time);
+                       (*iter)->set_trans_point(p);
                }
 
        // then do the other ducks
@@ -309,7 +309,7 @@ DuckDrag_Mirror::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
                        if              (axis==AXIS_X) p[0] = -(p[0]-center[0]) + center[0];
                        else if (axis==AXIS_Y) p[1] = -(p[1]-center[1]) + center[1];
 
-                       (*iter)->set_trans_point(p, time);
+                       (*iter)->set_trans_point(p);
                }
 }
 
index 68f1750..6cca469 100644 (file)
@@ -35,6 +35,7 @@
 #include <gtkmm/entry.h>
 
 #include <synfig/valuenode_animated.h>
+#include <synfig/valuenode_blinecalcvertex.h>
 #include <synfig/valuenode_composite.h>
 #include <synfig/valuenode_const.h>
 #include <synfig/valuenode_dynamiclist.h>
@@ -411,15 +412,6 @@ DuckDrag_Combo::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
                        if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)
                                (*iter)->set_trans_point(positions[i]+vect, time);
                }
-               DuckList duck_list(duckmatic->get_duck_list());
-               for (iter=duck_list.begin(); iter!=duck_list.end(); ++iter)
-               {
-                       if ((*iter)->get_type() == Duck::TYPE_TANGENT || (*iter)->get_type() == Duck::TYPE_WIDTH)
-                       {
-                               (*iter)->update(time);
-                       }
-               }
-               return;
        }
 
        if (rotate)
@@ -507,6 +499,32 @@ DuckDrag_Combo::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
                        (*iter)->set_trans_point(p, time);
                }
        }
+
+       // then patch up the tangents for the vertices we've moved
+       DuckList duck_list(duckmatic->get_duck_list());
+       for (iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter)
+       {
+               etl::handle<Duck> duck(*iter);
+               if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
+               {
+                       ValueNode_Composite::Handle composite;
+
+                       if ((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 &&
+                                (ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
+                       {
+                               //! \todo update() will call dynamic cast again, see if we can avoid that
+                               DuckList::iterator iter;
+                               for (iter=duck_list.begin(); iter!=duck_list.end(); iter++)
+                                       if ((*iter)->get_origin_duck()==duck 
+                                               && std::find(selected_ducks.begin(), 
+                                                                        selected_ducks.end(), *iter) == selected_ducks.end())
+                                               (*iter)->update(time);
+                       }
+               }
+       }
+
        last_move=vect;
 }
 
index 78f617b..6f96f57 100644 (file)
@@ -34,6 +34,8 @@
 #include <gtkmm/dialog.h>
 #include <gtkmm/entry.h>
 
+#include <synfig/valuenode_blinecalcvertex.h>
+#include <synfig/valuenode_composite.h>
 #include <synfig/valuenode_dynamiclist.h>
 #include <synfigapp/action_system.h>
 
@@ -299,6 +301,31 @@ DuckDrag_SmoothMove::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vecto
                (*iter)->set_trans_point(p+last_[i], time);
        }
 
+       // then patch up the tangents for the vertices we've moved
+       DuckList duck_list(duckmatic->get_duck_list());
+       for (iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter)
+       {
+               etl::handle<Duck> duck(*iter);
+               if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
+               {
+                       ValueNode_Composite::Handle composite;
+
+                       if ((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 &&
+                                (ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
+                       {
+                               //! \todo update() will call dynamic cast again, see if we can avoid that
+                               DuckList::iterator iter;
+                               for (iter=duck_list.begin(); iter!=duck_list.end(); iter++)
+                                       if ((*iter)->get_origin_duck()==duck 
+                                               && std::find(selected_ducks.begin(), 
+                                                                        selected_ducks.end(), *iter) == selected_ducks.end() )
+                                               (*iter)->update(time);
+                       }
+               }
+       }
+
        last_translate_=vect;
        //snap=Vector(0,0);
 }
@@ -319,9 +346,45 @@ DuckDrag_SmoothMove::end_duck_drag(Duckmatic* duckmatic)
                for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
                {
                        if(last_[i].mag()>0.0001)
-                               if(!(*iter)->signal_edited()((*iter)->get_point()))
                                {
-                                       throw String("Bad Move");
+                               if ((*iter)->get_type() == Duck::TYPE_ANGLE)
+                                       {
+                                               if(!(*iter)->signal_edited_angle()((*iter)->get_rotations()))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
+                                       else if (App::restrict_radius_ducks &&
+                                                        (*iter)->is_radius())
+                                       {
+                                               Point point((*iter)->get_point());
+                                               bool changed = false;
+
+                                               if (point[0] < 0)
+                                               {
+                                                       point[0] = 0;
+                                                       changed = true;
+                                               }
+                                               if (point[1] < 0)
+                                               {
+                                                       point[1] = 0;
+                                                       changed = true;
+                                               }
+
+                                               if (changed) (*iter)->set_point(point);
+
+                                               if(!(*iter)->signal_edited()(point))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if(!(*iter)->signal_edited()((*iter)->get_point()))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
                                }
                }
                //duckmatic->get_selected_ducks()=new_set;