#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>
/* === 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),
stroke_list_=persistent_stroke_list_;
}
-//! Returns \a true if the given duck is currently selected
+
bool
Duckmatic::duck_is_selected(const etl::handle<Duck> &duck)const
{
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())
{
}
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));
}
}
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()
{
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)
{
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);
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);
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);
return false;
etl::handle<Duck> vertex_duck(last_duck());
vertex_duck->set_type(Duck::TYPE_VERTEX);
- if(!add_to_ducks(synfigapp::ValueDesc(value_node,4),canvas_view,transform_stack))
+ if(!add_to_ducks(synfigapp::ValueDesc(value_node,4,-TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
return false;
etl::handle<Duck> t1_duck(last_duck());
// If the tangents are split
if((*value_node->get_link("split"))(get_time()).get(bool()))
{
- if(!add_to_ducks(synfigapp::ValueDesc(value_node,5),canvas_view,transform_stack))
+ if(!add_to_ducks(synfigapp::ValueDesc(value_node,5,TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
return false;
t2_duck=last_duck();
t2_duck->set_origin(vertex_duck);
}
else
{
- if(!add_to_ducks(synfigapp::ValueDesc(value_node,4),canvas_view,transform_stack))
+ if(!add_to_ducks(synfigapp::ValueDesc(value_node,4,TANGENT_HANDLE_SCALE),canvas_view,transform_stack))
return false;
t2_duck=last_duck();
t2_duck->set_origin(vertex_duck);
// Add the tangent1 duck
if(composite_vertex_value_node)
{
- if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,4),canvas_view,transform_stack))
+ if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,4,-TANGENT_BEZIER_SCALE),canvas_view,transform_stack))
return false;
tduck=last_duck();
}
if(composite_vertex_value_node)
{
int i=bline_point.get_split_tangent_flag()?5:4;
- if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,i),canvas_view,transform_stack,0,2))
+ if(!add_to_ducks(synfigapp::ValueDesc(composite_vertex_value_node,i,TANGENT_BEZIER_SCALE),canvas_view,transform_stack,0,2))
return false;
tduck=last_duck();
}