X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fgui%2Fduckmatic.cpp;h=cece9fb6892929876d942f405fc26bd620b9a439;hb=6f2a0d4211feb1e075688ccd754bf35078c8cc3d;hp=786aa11373832672f4b872441d5f8d5572ca3bc7;hpb=db91521de71f46f2debb4b3ef1edfe351aea3b2d;p=synfig.git diff --git a/synfig-studio/src/gui/duckmatic.cpp b/synfig-studio/src/gui/duckmatic.cpp index 786aa11..cece9fb 100644 --- a/synfig-studio/src/gui/duckmatic.cpp +++ b/synfig-studio/src/gui/duckmatic.cpp @@ -38,11 +38,13 @@ #include "duckmatic.h" #include +#include #include #include #include #include #include +#include #include #include #include @@ -88,7 +90,8 @@ using namespace studio; /* === E N T R Y P O I N T ================================================= */ -Duckmatic::Duckmatic(): +Duckmatic::Duckmatic(etl::loose_handle 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)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) { @@ -1170,8 +1197,8 @@ Duckmatic::add_to_ducks(const synfigapp::ValueDesc& value_desc,etl::handlesignal_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::handlesignal_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::handlesignal_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);