#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
{
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);