Blame synfig-studio/src/gui/states/state_rotate.cpp

Carlos Lopez 147815
/* === S Y N F I G ========================================================= */
Carlos Lopez 147815
/*!	\file state_rotate.cpp
Carlos Lopez 147815
**	\brief Template File
Carlos Lopez 147815
**
Carlos Lopez 147815
**	$Id$
Carlos Lopez 147815
**
Carlos Lopez 147815
**	\legal
Carlos Lopez 147815
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Carlos Lopez 147815
**  Copyright (c) 2008 Chris Moore
Carlos Lopez 42fd7a
**  Copyright (c) 2010 Carlos Lรณpez
Carlos Lopez 147815
**
Carlos Lopez 147815
**	This package is free software; you can redistribute it and/or
Carlos Lopez 147815
**	modify it under the terms of the GNU General Public License as
Carlos Lopez 147815
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez 147815
**	the License, or (at your option) any later version.
Carlos Lopez 147815
**
Carlos Lopez 147815
**	This package is distributed in the hope that it will be useful,
Carlos Lopez 147815
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez 147815
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez 147815
**	General Public License for more details.
Carlos Lopez 147815
**	\endlegal
Carlos Lopez 147815
*/
Carlos Lopez 147815
/* ========================================================================= */
Carlos Lopez 147815
Carlos Lopez 147815
/* === H E A D E R S ======================================================= */
Carlos Lopez 147815
Carlos Lopez 147815
#ifdef USING_PCH
Carlos Lopez 147815
#	include "pch.h"
Carlos Lopez 147815
#else
Carlos Lopez 147815
#ifdef HAVE_CONFIG_H
Carlos Lopez 147815
#	include <config.h></config.h>
Carlos Lopez 147815
#endif
Carlos Lopez 147815
Carlos Lopez 147815
#include <gtkmm dialog.h=""></gtkmm>
Carlos Lopez 147815
#include <gtkmm entry.h=""></gtkmm>
Carlos Lopez 147815
Carlos Lopez 147815
#include <synfig valuenode_dynamiclist.h=""></synfig>
Carlos Lopez 147815
#include <synfigapp action_system.h=""></synfigapp>
Carlos Lopez 147815
Carlos Lopez 147815
#include "state_rotate.h"
Carlos Lopez fb4c7c
#include "state_normal.h"
Carlos Lopez 147815
#include "canvasview.h"
Carlos Lopez 147815
#include "workarea.h"
Carlos Lopez 147815
#include "app.h"
Carlos Lopez 147815
Carlos Lopez 147815
#include <synfigapp action.h=""></synfigapp>
Carlos Lopez 147815
#include "event_mouse.h"
Carlos Lopez 147815
#include "event_layerclick.h"
839371
#include "docks/dock_toolbox.h"
Nikita Kitaev 5fe12e
#include "docks/dialog_tooloptions.h"
Carlos Lopez 147815
#include <gtkmm optionmenu.h=""></gtkmm>
Carlos Lopez 147815
#include "duck.h"
Carlos Lopez 147815
#include <synfig angle.h=""></synfig>
Carlos Lopez 147815
#include <synfigapp main.h=""></synfigapp>
Carlos Lopez 147815
Carlos Lopez 147815
#include "general.h"
Carlos Lopez 147815
Carlos Lopez 147815
#endif
Carlos Lopez 147815
Carlos Lopez 147815
/* === U S I N G =========================================================== */
Carlos Lopez 147815
Carlos Lopez 147815
using namespace std;
Carlos Lopez 147815
using namespace etl;
Carlos Lopez 147815
using namespace synfig;
Carlos Lopez 147815
using namespace studio;
Carlos Lopez 147815
Carlos Lopez 147815
/* === M A C R O S ========================================================= */
Carlos Lopez 147815
Carlos Lopez 147815
#ifndef EPSILON
Carlos Lopez 147815
#define EPSILON	0.0000001
Carlos Lopez 147815
#endif
Carlos Lopez 147815
Carlos Lopez 147815
/* === G L O B A L S ======================================================= */
Carlos Lopez 147815
Carlos Lopez 147815
StateRotate studio::state_rotate;
Carlos Lopez 147815
Carlos Lopez 147815
/* === C L A S S E S & S T R U C T S ======================================= */
Carlos Lopez 147815
Carlos Lopez 147815
class DuckDrag_Rotate : public DuckDrag_Base
Carlos Lopez 147815
{
Carlos Lopez 147815
Carlos Lopez 147815
	synfig::Vector last_rotate;
Carlos Lopez 147815
	synfig::Vector drag_offset;
Carlos Lopez 147815
	synfig::Vector center;
Carlos Lopez 147815
	synfig::Vector snap;
Carlos Lopez 147815
Carlos Lopez 147815
	Angle original_angle;
Carlos Lopez 147815
	Real original_mag;
Carlos Lopez 147815
Carlos Lopez 147815
	std::vector<synfig::vector> positions;</synfig::vector>
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
	bool bad_drag;
Carlos Lopez 147815
	bool move_only;
Carlos Lopez 147815
Carlos Lopez 147815
public:
Carlos Lopez 147815
	etl::handle<canvasview> canvas_view_;</canvasview>
Carlos Lopez 147815
	bool use_magnitude;
Carlos Lopez 147815
	DuckDrag_Rotate();
Carlos Lopez 147815
	void begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& begin);
Carlos Lopez 147815
	bool end_duck_drag(Duckmatic* duckmatic);
Carlos Lopez 147815
	void duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector);
Carlos Lopez 147815
Carlos Lopez 147815
	etl::handle<synfigapp::canvasinterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}</synfigapp::canvasinterface>
Carlos Lopez 147815
};
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
class studio::StateRotate_Context : public sigc::trackable
Carlos Lopez 147815
{
Carlos Lopez 147815
	etl::handle<canvasview> canvas_view_;</canvasview>
Carlos Lopez fb4c7c
	CanvasView::IsWorking is_working;
Carlos Lopez 147815
Carlos Lopez 147815
	synfigapp::Settings& settings;
Carlos Lopez 147815
Carlos Lopez 147815
	etl::handle<duckdrag_rotate> duck_dragger_;</duckdrag_rotate>
Carlos Lopez 147815
Carlos Lopez 147815
	Gtk::Table options_table;
Carlos Lopez 147815
Carlos Lopez 147815
	Gtk::CheckButton checkbutton_scale;
Carlos Lopez 147815
Carlos Lopez 147815
public:
Carlos Lopez 147815
Carlos Lopez 147815
	bool get_scale_flag()const { return checkbutton_scale.get_active(); }
Carlos Lopez 147815
	void set_scale_flag(bool x) { return checkbutton_scale.set_active(x); refresh_scale_flag(); }
Carlos Lopez 147815
Carlos Lopez fb4c7c
	Smach::event_result event_stop_handler(const Smach::event& x);
Carlos Lopez 147815
	Smach::event_result event_refresh_tool_options(const Smach::event& x);
Carlos Lopez 147815
Carlos Lopez 147815
	void refresh_tool_options();
Carlos Lopez 147815
Carlos Lopez 147815
	void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->use_magnitude=get_scale_flag(); }
Carlos Lopez 147815
Carlos Lopez 147815
	StateRotate_Context(CanvasView* canvas_view);
Carlos Lopez 147815
Carlos Lopez 147815
	~StateRotate_Context();
Carlos Lopez 147815
Carlos Lopez 147815
	const etl::handle<canvasview>& get_canvas_view()const{return canvas_view_;}</canvasview>
Carlos Lopez 147815
	etl::handle<synfigapp::canvasinterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}</synfigapp::canvasinterface>
Carlos Lopez 147815
	synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
Carlos Lopez 147815
	WorkArea * get_work_area()const{return canvas_view_->get_work_area();}
Carlos Lopez 147815
Carlos Lopez 147815
	void load_settings();
Carlos Lopez 147815
	void save_settings();
Carlos Lopez 147815
};	// END of class StateRotate_Context
Carlos Lopez 147815
Carlos Lopez 147815
/* === M E T H O D S ======================================================= */
Carlos Lopez 147815
Carlos Lopez 147815
StateRotate::StateRotate():
Carlos Lopez 147815
	Smach::state<staterotate_context>("rotate")</staterotate_context>
Carlos Lopez 147815
{
Carlos Lopez 147815
	insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateRotate_Context::event_refresh_tool_options));
Carlos Lopez fb4c7c
	insert(event_def(EVENT_STOP,&StateRotate_Context::event_stop_handler));
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
StateRotate::~StateRotate()
Carlos Lopez 147815
{
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
void
Carlos Lopez 147815
StateRotate_Context::load_settings()
Carlos Lopez 147815
{
Carlos Lopez 87cee9
	try
Carlos Lopez 87cee9
	{
Carlos Lopez 477fd4
		synfig::ChangeLocale change_locale(LC_NUMERIC, "C");
Carlos Lopez 87cee9
		String value;
Carlos Lopez 87cee9
Carlos Lopez 87cee9
		if(settings.get_value("rotate.scale",value) && value=="0")
Carlos Lopez 87cee9
			set_scale_flag(false);
Carlos Lopez 87cee9
		else
Carlos Lopez 87cee9
			set_scale_flag(true);
Carlos Lopez 87cee9
	}
Carlos Lopez 87cee9
	catch(...)
Carlos Lopez 87cee9
	{
Carlos Lopez 87cee9
		synfig::warning("State Rotate: Caught exception when attempting to load settings.");
Carlos Lopez 87cee9
	}
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
void
Carlos Lopez 147815
StateRotate_Context::save_settings()
Carlos Lopez 147815
{
Carlos Lopez 87cee9
	try
Carlos Lopez 87cee9
	{
Carlos Lopez 477fd4
		synfig::ChangeLocale change_locale(LC_NUMERIC, "C");
Carlos Lopez 87cee9
		settings.set_value("rotate.scale",get_scale_flag()?"1":"0");
Carlos Lopez 87cee9
	}
Carlos Lopez 87cee9
	catch(...)
Carlos Lopez 87cee9
	{
Carlos Lopez 87cee9
		synfig::warning("State Rotate: Caught exception when attempting to save settings.");
Carlos Lopez 87cee9
	}
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
StateRotate_Context::StateRotate_Context(CanvasView* canvas_view):
Carlos Lopez 147815
	canvas_view_(canvas_view),
Carlos Lopez fb4c7c
	is_working(*canvas_view),
Carlos Lopez 147815
	settings(synfigapp::Main::get_selected_input_device()->settings()),
Carlos Lopez 147815
	duck_dragger_(new DuckDrag_Rotate()),
Carlos Lopez 147815
	checkbutton_scale(_("Allow Scale"))
Carlos Lopez 147815
{
Carlos Lopez 147815
	duck_dragger_->canvas_view_=get_canvas_view();
Carlos Lopez 147815
Carlos Lopez 147815
	// Set up the tool options dialog
Carlos Lopez 147815
	options_table.attach(*manage(new Gtk::Label(_("Rotate Tool"))),	0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
Carlos Lopez 147815
	options_table.attach(checkbutton_scale,							0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
Carlos Lopez 147815
Carlos Lopez 147815
	checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateRotate_Context::refresh_scale_flag));
Carlos Lopez 147815
Carlos Lopez 147815
	options_table.show_all();
Carlos Lopez 147815
	refresh_tool_options();
Carlos Lopez 147815
	//App::dialog_tool_options->set_widget(options_table);
Carlos Lopez 147815
	App::dialog_tool_options->present();
Carlos Lopez 147815
Carlos Lopez 147815
	get_work_area()->set_allow_layer_clicks(true);
Carlos Lopez 147815
	get_work_area()->set_duck_dragger(duck_dragger_);
Carlos Lopez 147815
Nikita Kitaev aa9ae3
	get_work_area()->set_cursor(Gdk::EXCHANGE);
Nikita Kitaev aa9ae3
//	get_work_area()->reset_cursor();
Carlos Lopez 147815
839371
	App::dock_toolbox->refresh();
Carlos Lopez 147815
Carlos Lopez 147815
	load_settings();
Carlos Lopez 147815
	refresh_scale_flag();
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
void
Carlos Lopez 147815
StateRotate_Context::refresh_tool_options()
Carlos Lopez 147815
{
Carlos Lopez 147815
	App::dialog_tool_options->clear();
Carlos Lopez 147815
	App::dialog_tool_options->set_widget(options_table);
Carlos Lopez 147815
	App::dialog_tool_options->set_local_name(_("Rotate Tool"));
Carlos Lopez 147815
	App::dialog_tool_options->set_name("rotate");
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
Smach::event_result
Carlos Lopez 147815
StateRotate_Context::event_refresh_tool_options(const Smach::event& /*x*/)
Carlos Lopez 147815
{
Carlos Lopez 147815
	refresh_tool_options();
Carlos Lopez 147815
	return Smach::RESULT_ACCEPT;
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez fb4c7c
Smach::event_result
Carlos Lopez fb4c7c
StateRotate_Context::event_stop_handler(const Smach::event& /*x*/)
Carlos Lopez fb4c7c
{
Carlos Lopez fb4c7c
	throw &state_normal;
Carlos Lopez fb4c7c
	return Smach::RESULT_OK;
Carlos Lopez fb4c7c
}
Carlos Lopez fb4c7c
Carlos Lopez 147815
StateRotate_Context::~StateRotate_Context()
Carlos Lopez 147815
{
Carlos Lopez 147815
	save_settings();
Carlos Lopez 147815
Carlos Lopez 147815
	get_work_area()->clear_duck_dragger();
Nikita Kitaev aa9ae3
	get_work_area()->reset_cursor();
Carlos Lopez 147815
Carlos Lopez 147815
	App::dialog_tool_options->clear();
Carlos Lopez 147815
839371
	App::dock_toolbox->refresh();
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
DuckDrag_Rotate::DuckDrag_Rotate()
Carlos Lopez 147815
{
Carlos Lopez 147815
	use_magnitude=true;
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
void
Carlos Lopez 147815
DuckDrag_Rotate::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset)
Carlos Lopez 147815
{
Carlos Lopez 147815
	last_rotate=Vector(1,1);
Carlos Lopez 147815
Carlos Lopez 147815
	const DuckList selected_ducks(duckmatic->get_selected_ducks());
Carlos Lopez 147815
	DuckList::const_iterator iter;
Carlos Lopez 147815
Carlos Lopez 147815
/*
Carlos Lopez 147815
	if(duckmatic->get_selected_ducks().size()<2)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		bad_drag=true;
Carlos Lopez 147815
		return;
Carlos Lopez 147815
	}
Carlos Lopez 147815
*/
Carlos Lopez 147815
	bad_drag=false;
Carlos Lopez 147815
Carlos Lopez 147815
		drag_offset=duckmatic->find_duck(offset)->get_trans_point();
Carlos Lopez 147815
Carlos Lopez 147815
		//snap=drag_offset-duckmatic->snap_point_to_grid(drag_offset);
Carlos Lopez 147815
		//snap=offset-drag_offset;
Carlos Lopez 147815
		snap=Vector(0,0);
Carlos Lopez 147815
Carlos Lopez 147815
	// Calculate center
Carlos Lopez 147815
	Point vmin(100000000,100000000);
Carlos Lopez 147815
	Point vmax(-100000000,-100000000);
Carlos Lopez 147815
	//std::set<etl::handle<duck> >::iterator iter;</etl::handle<duck>
Carlos Lopez 147815
	positions.clear();
Carlos Lopez 147815
	int i;
Carlos Lopez 147815
	for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		Point p((*iter)->get_trans_point());
Carlos Lopez 147815
		vmin[0]=min(vmin[0],p[0]);
Carlos Lopez 147815
		vmin[1]=min(vmin[1],p[1]);
Carlos Lopez 147815
		vmax[0]=max(vmax[0],p[0]);
Carlos Lopez 147815
		vmax[1]=max(vmax[1],p[1]);
Carlos Lopez 147815
		positions.push_back(p);
Carlos Lopez 147815
	}
Carlos Lopez 147815
	center=(vmin+vmax)*0.5;
Carlos Lopez 147815
	if((vmin-vmax).mag()<=EPSILON)
Carlos Lopez 147815
		move_only=true;
Carlos Lopez 147815
	else
Carlos Lopez 147815
		move_only=false;
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
	synfig::Vector vect(offset-center);
Carlos Lopez 147815
	original_angle=Angle::tan(vect[1],vect[0]);
Carlos Lopez 147815
	original_mag=vect.mag();
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
Carlos Lopez 147815
void
Carlos Lopez 147815
DuckDrag_Rotate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
Carlos Lopez 147815
{
Carlos Lopez 147815
	if(bad_drag)
Carlos Lopez 147815
		return;
Carlos Lopez 147815
Carlos Lopez 147815
	//std::set<etl::handle<duck> >::iterator iter;</etl::handle<duck>
Carlos Lopez 147815
	synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center+snap);
Carlos Lopez 147815
Carlos Lopez 147815
	const DuckList selected_ducks(duckmatic->get_selected_ducks());
Carlos Lopez 147815
	DuckList::const_iterator iter;
Carlos Lopez 147815
Carlos Lopez 147815
	if(move_only)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		int i;
Carlos Lopez 147815
		for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
Carlos Lopez 147815
		{
Carlos Lopez 147815
			if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue;
Carlos Lopez 147815
Carlos Lopez 147815
			Vector p(positions[i]);
Carlos Lopez 147815
Carlos Lopez 147815
			p[0]+=vect[0];
Carlos Lopez 147815
			p[1]+=vect[1];
Carlos Lopez 147815
			(*iter)->set_trans_point(p);
Carlos Lopez 147815
		}
Carlos Lopez 147815
		for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
Carlos Lopez 147815
		{
Carlos Lopez 147815
			if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
Carlos Lopez 147815
Carlos Lopez 147815
			Vector p(positions[i]);
Carlos Lopez 147815
Carlos Lopez 147815
			p[0]+=vect[0];
Carlos Lopez 147815
			p[1]+=vect[1];
Carlos Lopez 147815
			(*iter)->set_trans_point(p);
Carlos Lopez 147815
		}
Carlos Lopez 147815
		return;
Carlos Lopez 147815
	}
Carlos Lopez 147815
Carlos Lopez 147815
	Angle::tan angle(vect[1],vect[0]);
Carlos Lopez 147815
	angle=original_angle-angle;
Carlos Lopez 147815
	Real mag(vect.mag()/original_mag);
Carlos Lopez 147815
	Real sine(Angle::sin(angle).get());
Carlos Lopez 147815
	Real cosine(Angle::cos(angle).get());
Carlos Lopez 147815
Carlos Lopez 147815
	int i;
Carlos Lopez 147815
	for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue;
Carlos Lopez 147815
Carlos Lopez 147815
		Vector x(positions[i]-center),p;
Carlos Lopez 147815
Carlos Lopez 147815
		p[0]=cosine*x[0]+sine*x[1];
Carlos Lopez 147815
		p[1]=-sine*x[0]+cosine*x[1];
Carlos Lopez 147815
		if(use_magnitude)p*=mag;
Carlos Lopez 147815
		p+=center;
Carlos Lopez 147815
		(*iter)->set_trans_point(p);
Carlos Lopez 147815
	}
Carlos Lopez 147815
	for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
Carlos Lopez 147815
Carlos Lopez 147815
		Vector x(positions[i]-center),p;
Carlos Lopez 147815
Carlos Lopez 147815
		p[0]=cosine*x[0]+sine*x[1];
Carlos Lopez 147815
		p[1]=-sine*x[0]+cosine*x[1];
Carlos Lopez 147815
		if(use_magnitude)p*=mag;
Carlos Lopez 147815
		p+=center;
Carlos Lopez 147815
		(*iter)->set_trans_point(p);
Carlos Lopez 147815
	}
Carlos Lopez 147815
Carlos Lopez 147815
	last_rotate=vect;
Carlos Lopez 147815
	//snap=Vector(0,0);
Carlos Lopez 147815
}
Carlos Lopez 147815
Carlos Lopez 147815
bool
Carlos Lopez 147815
DuckDrag_Rotate::end_duck_drag(Duckmatic* duckmatic)
Carlos Lopez 147815
{
Carlos Lopez 147815
	if(bad_drag)return false;
Carlos Lopez 147815
	if(move_only)
Carlos Lopez 147815
	{
Carlos Lopez 0a0189
		synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Move Handle"));
Carlos Lopez 147815
		duckmatic->signal_edited_selected_ducks();
Carlos Lopez 147815
		return true;
Carlos Lopez 147815
	}
Carlos Lopez 147815
Carlos Lopez 0a0189
	synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Rotate Handle"));
Carlos Lopez 147815
Carlos Lopez 147815
	if((last_rotate-Vector(1,1)).mag()>0.0001)
Carlos Lopez 147815
	{
Carlos Lopez 147815
		duckmatic->signal_edited_selected_ducks();
Carlos Lopez 147815
		return true;
Carlos Lopez 147815
	}
Carlos Lopez 147815
	else
Carlos Lopez 147815
	{
Carlos Lopez 147815
		duckmatic->signal_user_click_selected_ducks(0);
Carlos Lopez 147815
		return false;
Carlos Lopez 147815
	}
Carlos Lopez 147815
}