X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fduckmatic.cpp;h=15ee0c9b5b529de791be039bfd2e2bf4341bead8;hb=6c80475b389b1c07c148566cd015f9efc3a6adaa;hp=8475e06c19cf760c31acb1d7b0a14a88124120e4;hpb=a8d52ac684f03ffc36c93b7171c0995ce1b82037;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/duckmatic.cpp b/synfig-studio/trunk/src/gtkmm/duckmatic.cpp index 8475e06..15ee0c9 100644 --- a/synfig-studio/trunk/src/gtkmm/duckmatic.cpp +++ b/synfig-studio/trunk/src/gtkmm/duckmatic.cpp @@ -108,18 +108,6 @@ Duckmatic::~Duckmatic() } void -Duckmatic::set_flip_x(bool flip_x) -{ - flip_x_ = flip_x; -} - -void -Duckmatic::set_flip_y(bool flip_y) -{ - flip_y_ = flip_y; -} - -void Duckmatic::clear_ducks() { duck_data_share_map.clear(); @@ -259,7 +247,8 @@ Duckmatic::is_duck_group_selectable(const etl::handle& x)const { const Type type(get_type_mask()); - if(( x->get_type() && (!(type & x->get_type())) || !x->get_editable() ) ) + if (((x->get_type() && (!(type & x->get_type()))) || + !x->get_editable())) return false; if(x->get_value_desc().parent_is_layer_param() && type & Duck::TYPE_POSITION) @@ -285,6 +274,8 @@ Duckmatic::select_all_ducks() for(iter=duck_map.begin();iter!=duck_map.end();++iter) if(is_duck_group_selectable(iter->second)) select_duck(iter->second); + else + unselect_duck(iter->second); } void @@ -441,8 +432,7 @@ Duckmatic::snap_point_to_grid(const synfig::Point& x, float radius)const { Point snap( floor(ret[0]/get_grid_size()[0]+0.5)*get_grid_size()[0], - floor(ret[1]/get_grid_size()[1]+0.5)*get_grid_size()[1] - ); + floor(ret[1]/get_grid_size()[1]+0.5)*get_grid_size()[1]); if(abs(snap[0]-ret[0])<=radius && (!has_guide_x || abs(snap[0]-ret[0])<=abs(*guide_x-ret[0]))) ret[0]=snap[0],has_guide_x=false; @@ -562,12 +552,12 @@ Duckmatic::signal_edited_selected_ducks() Point point((*iter)->get_point()); bool changed = false; - if (point[0] * (flip_x_ ? -1 : 1) < 0) + if (point[0] < 0) { point[0] = 0; changed = true; } - if (point[1] * (flip_y_ ? -1 : 1) < 0) + if (point[1] < 0) { point[1] = 0; changed = true; @@ -1034,8 +1024,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_radius(true); duck->set_type(Duck::TYPE_RADIUS); - // put the duck on the right hand side of the center, whether the display is flipped or not - duck->set_point(Point(value_desc.get_value(get_time()).get(Real()) * (flip_x_ ? -1 : 1), 0)); + // put the duck on the right hand side of the center + duck->set_point(Point(value_desc.get_value(get_time()).get(Real()), 0)); duck->set_name(guid_string(value_desc)); if(value_desc.is_value_node()) { @@ -1067,11 +1057,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(value_desc); duck->signal_user_click(2).connect( @@ -1079,13 +1066,9 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_guid(calc_duck_guid(value_desc,transform_stack)^GUID::hasher(multiple)); @@ -1144,11 +1127,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(value_desc); duck->signal_user_click(2).connect( @@ -1156,13 +1136,9 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_guid(calc_duck_guid(value_desc,transform_stack)^GUID::hasher(multiple)); add_duck(duck); @@ -1242,11 +1218,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(value_desc); duck->signal_user_click(2).connect( @@ -1254,13 +1227,9 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_guid(calc_duck_guid(value_desc,transform_stack)^GUID::hasher(multiple)); add_duck(duck); @@ -1273,8 +1242,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle first_duck; etl::handle duck, tduck; - for(i=0;ilink_count();i++) + for (i = 0; i < value_node->link_count(); i++) { float amount(value_node->list[i].amount_at_time(get_time())); - if(amount<0.9999f) + + // skip vertices that aren't fully on + if (amount < 0.9999f) continue; - if(first==-1)first=i; + + // remember the index of the first vertex we didn't skip + if (first == -1) + first = i; BLinePoint bline_point((*value_node->get_link(i))(get_time())); - ValueNode_Composite::Handle vertex_value_node( - ValueNode_Composite::Handle::cast_dynamic( - value_node->get_link(i) - ) - ); + // try casting the vertex to Composite - this tells us whether it is composite or not + ValueNode_Composite::Handle composite_vertex_value_node( + ValueNode_Composite::Handle::cast_dynamic(value_node->get_link(i))); - // Add the vertex duck - if(vertex_value_node) + // add the vertex duck - it's a composite + if(composite_vertex_value_node) { - if(add_to_ducks(synfigapp::ValueDesc(vertex_value_node,0),canvas_view,transform_stack)) + if (add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,0),canvas_view,transform_stack)) { duck=last_duck(); if(i==first) @@ -1459,13 +1425,9 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(synfigapp::ValueDesc(value_node,i)); if(param_desc) @@ -1486,6 +1448,7 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle width; - if(add_to_ducks(synfigapp::ValueDesc(vertex_value_node,1),canvas_view,transform_stack,REAL_COOKIE)) + if (add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,1),canvas_view,transform_stack,REAL_COOKIE)) { width=last_duck(); width->set_origin(duck); @@ -1546,12 +1509,15 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handlesignal_user_click(2).clear(); duck->signal_user_click(2).connect( @@ -1590,50 +1553,39 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(synfigapp::ValueDesc(value_node,i)); add_bezier(bezier); bezier=0; } + // don't start a new bezier for the last point in the line if we're not looped if(i+1>=value_node->link_count() && !value_node->get_loop()) continue; bezier=new Bezier(); // Add the tangent2 duck - if(vertex_value_node) + if(composite_vertex_value_node) { int i=bline_point.get_split_tangent_flag()?5:4; - if(!add_to_ducks(synfigapp::ValueDesc(vertex_value_node,i),canvas_view,transform_stack,0,2)) + if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,i),canvas_view,transform_stack,0,2)) return false; tduck=last_duck(); } else { if(bline_point.get_split_tangent_flag()) - { tduck=new Duck(bline_point.get_tangent2()); - tduck->set_transform_stack(transform_stack); - //tduck->set_name(strprintf("%x-tangent2",value_node->get_link(i).get())); - tduck->set_name(guid_string(synfigapp::ValueDesc(value_node,i))+".t2"); - tduck->set_guid(calc_duck_guid(synfigapp::ValueDesc(value_node,i),transform_stack)^GUID::hasher(".t2")); - } else - { tduck=new Duck(bline_point.get_tangent1()); - tduck->set_transform_stack(transform_stack); - //tduck->set_name(strprintf("%x-tangent1",value_node->get_link(i).get())); - tduck->set_name(guid_string(synfigapp::ValueDesc(value_node,i))+".t1"); - tduck->set_guid(calc_duck_guid(synfigapp::ValueDesc(value_node,i),transform_stack)^GUID::hasher(".t1")); - } + + tduck->set_transform_stack(transform_stack); + tduck->set_name(guid_string(synfigapp::ValueDesc(value_node,i))+".t2"); + tduck->set_guid(calc_duck_guid(synfigapp::ValueDesc(value_node,i),transform_stack)^GUID::hasher(".t2")); tduck->set_editable(false); tduck=add_similar_duck(tduck); // add_duck(duck); @@ -1656,14 +1608,10 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handleset_value_desc(synfigapp::ValueDesc(value_node,0)); + &studio::CanvasView::popup_param_menu), + 1.0f), + synfigapp::ValueDesc(value_node,i))); + duck->set_value_desc(synfigapp::ValueDesc(value_node,i)); } @@ -1673,109 +1621,72 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handlep1=duck; bezier->c1=tduck; - } + // Loop if necessary if(bezier && value_node->get_loop()) { BLinePoint bline_point((*value_node->get_link(first))(get_time())); - ValueNode_Composite::Handle vertex_value_node( + ValueNode_Composite::Handle composite_vertex_value_node( ValueNode_Composite::Handle::cast_dynamic( - value_node->get_link(first) - ) - ); + value_node->get_link(first))); // Add the vertex duck duck=first_duck; - /* - if(vertex_value_node) + + // Add the tangent1 duck + if(composite_vertex_value_node) { - if(!add_to_ducks(synfigapp::ValueDesc(vertex_value_node,0),canvas_view,transform_stack)) + if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,4),canvas_view,transform_stack)) return false; - duck=last_duck(); - if(param_desc) - { - if(!param_desc->get_origin().empty()) - duck->set_origin(value_desc.get_layer()->get_param(param_desc->get_origin()).get(synfig::Point())); - } - duck->set_type(Duck::TYPE_VERTEX); + tduck=last_duck(); } else { - duck=new Duck(bline_point.get_vertex()); - duck->set_transform_stack(transform_stack); - if(param_desc) - { - if(!param_desc->get_origin().empty()) - duck->set_origin(value_desc.get_layer()->get_param(param_desc->get_origin()).get(synfig::Point())); - } - duck->set_editable(false); - duck->set_name(strprintf("%x-vertex",value_node->get_link(first).get())); - duck->set_type(Duck::TYPE_VERTEX); - duck=add_similar_duck(duck); + tduck=new Duck(bline_point.get_tangent1()); + tduck->set_transform_stack(transform_stack); + tduck->set_editable(false); + tduck->set_name(guid_string(synfigapp::ValueDesc(value_node,first))+".t1"); + //tduck->set_name(strprintf("%x-tangent1",value_node->get_link(first).get())); + tduck=add_similar_duck(tduck); + tduck->set_guid(calc_duck_guid(synfigapp::ValueDesc(value_node,first),transform_stack)^GUID::hasher(".t1")); + //add_duck(duck); } - */ - // Add the tangent1 duck - if(vertex_value_node) - { - if(!add_to_ducks(synfigapp::ValueDesc(vertex_value_node,4),canvas_view,transform_stack)) - return false; - tduck=last_duck(); - } - else - { - tduck=new Duck(bline_point.get_tangent1()); - tduck->set_transform_stack(transform_stack); - tduck->set_editable(false); - tduck->set_name(guid_string(synfigapp::ValueDesc(value_node,first))+".t1"); - //tduck->set_name(strprintf("%x-tangent1",value_node->get_link(first).get())); - tduck=add_similar_duck(tduck); - tduck->set_guid(calc_duck_guid(synfigapp::ValueDesc(value_node,i),transform_stack)^GUID::hasher(".t1")); - //add_duck(duck); - } + tduck->set_origin(duck); + tduck->set_scalar(-TANGENT_BEZIER_SCALE); + tduck->set_tangent(true); - tduck->set_origin(duck); - tduck->set_scalar(-TANGENT_BEZIER_SCALE); - tduck->set_tangent(true); + bezier->p2=duck; + bezier->c2=tduck; - bezier->p2=duck; - bezier->c2=tduck; - bezier->signal_user_click(2).connect( + bezier->signal_user_click(2).connect( + sigc::bind( + sigc::mem_fun( + *canvas_view, + &studio::CanvasView::popup_param_menu_bezier), + synfigapp::ValueDesc(value_node,first))); + + duck->signal_user_click(2).clear(); + duck->signal_user_click(2).connect( + sigc::bind( sigc::bind( sigc::mem_fun( *canvas_view, - &studio::CanvasView::popup_param_menu_bezier - ), - synfigapp::ValueDesc(value_node,first) - ) - ); - duck->signal_user_click(2).clear(); - duck->signal_user_click(2).connect( - sigc::bind( - sigc::bind( - sigc::mem_fun( - *canvas_view, - &studio::CanvasView::popup_param_menu - ), - 1.0f - ), - synfigapp::ValueDesc(value_node,first) - ) - ); - duck->set_value_desc(synfigapp::ValueDesc(value_node,first)); - - add_bezier(bezier); - bezier=0; + &studio::CanvasView::popup_param_menu), + 1.0f), + synfigapp::ValueDesc(value_node,first))); + duck->set_value_desc(synfigapp::ValueDesc(value_node,first)); + add_bezier(bezier); + bezier=0; } return true; } else // Check for DynamicList if(value_desc.is_value_node() && - ValueNode_DynamicList::Handle::cast_dynamic(value_desc.get_value_node()) - ) + ValueNode_DynamicList::Handle::cast_dynamic(value_desc.get_value_node())) { ValueNode_DynamicList::Handle value_node; value_node=ValueNode_DynamicList::Handle::cast_dynamic(value_desc.get_value_node()); @@ -1821,11 +1732,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handle