Author: Nikita Kitaev <nikita...@gmail.com>
Date:   Fri Feb 18 16:25:17 2011 -0800

Make bezier drags work independently of duck selection

---

 synfig-studio/src/gui/duckmatic.cpp |  107 +++++++++++++++++------------------
 synfig-studio/src/gui/duckmatic.h   |    4 +
 2 files changed, 57 insertions(+), 54 deletions(-)

diff --git a/synfig-studio/src/gui/duckmatic.cpp 
b/synfig-studio/src/gui/duckmatic.cpp
index 240cf99..c8a4f31 100644
--- a/synfig-studio/src/gui/duckmatic.cpp
+++ b/synfig-studio/src/gui/duckmatic.cpp
@@ -669,12 +669,6 @@ BezierDrag_Default::begin_bezier_drag(Duckmatic* 
duckmatic, const synfig::Vector
        etl::handle<Duck> c1(duckmatic->get_selected_bezier()->c1);
        etl::handle<Duck> c2(duckmatic->get_selected_bezier()->c2);
 
-       // temporarily select the tangent ducks
-       c1_selected = duckmatic->duck_is_selected(c1);
-       c2_selected = duckmatic->duck_is_selected(c2);
-       duckmatic->select_duck(c1);
-       duckmatic->select_duck(c2);
-
        c1_initial = c1->get_trans_point();
        c2_initial = c2->get_trans_point();
        last_translate_ = synfig::Vector(0,0);
@@ -729,19 +723,16 @@ BezierDrag_Default::end_bezier_drag(Duckmatic* duckmatic)
 {
        if(last_translate_.mag()>0.0001)
        {
-               duckmatic->signal_edited_selected_ducks();
-       
-               // restore duck selection
-               if (!c1_selected) 
duckmatic->unselect_duck(duckmatic->get_selected_bezier()->c1);
-               if (!c2_selected) 
duckmatic->unselect_duck(duckmatic->get_selected_bezier()->c2);
+               etl::handle<Duck> c1(duckmatic->get_selected_bezier()->c1);
+               etl::handle<Duck> c2(duckmatic->get_selected_bezier()->c2);
+
+               duckmatic->signal_edited_duck(c1);
+               duckmatic->signal_edited_duck(c2);
 
                return true;
        }
        else
        {
-               // restore duck selection
-               if (!c1_selected) 
duckmatic->unselect_duck(duckmatic->get_selected_bezier()->c1);
-               if (!c2_selected) 
duckmatic->unselect_duck(duckmatic->get_selected_bezier()->c2);
                return false;
        }
 }
@@ -759,6 +750,49 @@ Duckmatic::signal_user_click_selected_ducks(int button)
        }
 }
 
+void
+Duckmatic::signal_edited_duck(const etl::handle<Duck> &duck)
+{
+       if (duck->get_type() == Duck::TYPE_ANGLE)
+       {
+               if(!duck->signal_edited_angle()(duck->get_rotations()))
+               {
+                       throw String("Bad edit");
+               }
+       }
+       else if (App::restrict_radius_ducks &&
+                        duck->is_radius())
+       {
+               Point point(duck->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) duck->set_point(point);
+
+               if(!duck->signal_edited()(point))
+               {
+                       throw String("Bad edit");
+               }
+       }
+       else
+       {
+               if(!duck->signal_edited()(duck->get_point()))
+               {
+                       throw String("Bad edit");
+               }
+       }
+}
+
 
 void
 Duckmatic::signal_edited_selected_ducks()
@@ -771,56 +805,21 @@ Duckmatic::signal_edited_selected_ducks()
        // If we have more than 20 things to move, then display
        // something to explain that it may take a moment
        smart_ptr<OneMoment> wait; if(ducks.size()>20)wait.spawn();
-
-       // Go ahead and call everyone's signals
        for(iter=ducks.begin();iter!=ducks.end();++iter)
        {
-               if ((*iter)->get_type() == Duck::TYPE_ANGLE)
+               try
                {
-                       
if(!(*iter)->signal_edited_angle()((*iter)->get_rotations()))
-                       {
-                               selected_ducks=old_set;
-                               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))
-                       {
-                               selected_ducks=old_set;
-                               throw String("Bad edit");
-                       }
+                       signal_edited_duck(*iter);
                }
-               else
+               catch (String)
                {
-                       if(!(*iter)->signal_edited()((*iter)->get_point()))
-                       {
-                               selected_ducks=old_set;
-                               throw String("Bad edit");
-                       }
+                       selected_ducks=old_set;
+                       throw;
                }
        }
        selected_ducks=old_set;
 }
 
-
 bool
 Duckmatic::on_duck_changed(const synfig::Point &value,const 
synfigapp::ValueDesc& value_desc)
 {
diff --git a/synfig-studio/src/gui/duckmatic.h 
b/synfig-studio/src/gui/duckmatic.h
index 2dd026c..7f08f1e 100644
--- a/synfig-studio/src/gui/duckmatic.h
+++ b/synfig-studio/src/gui/duckmatic.h
@@ -381,6 +381,10 @@ public:
        //! Signals to each selected duck that it has been clicked
        void signal_user_click_selected_ducks(int button);
 
+       //! Calls a single duck's edited signal
+       /*! Updates the corresponding valuenodes after a drag */
+       void signal_edited_duck(const etl::handle<Duck> &duck);
+
        //! Calls all of the ducks' edited signals
        /*! Updates corresponding valuenodes after a drag */
        void signal_edited_selected_ducks();


------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in 
Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business 
insights. http://p.sf.net/sfu/splunk-dev2dev 
_______________________________________________
Synfig-devl mailing list
Synfig-devl@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to