Blame synfig-studio/src/synfigapp/actions/timepointsmove.cpp

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file timepointsmove.cpp
Carlos Lopez a09598
**	\brief Move the Time Points File
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2004 Adrian Bentley
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is free software; you can redistribute it and/or
Carlos Lopez a09598
**	modify it under the terms of the GNU General Public License as
Carlos Lopez a09598
**	published by the Free Software Foundation; either version 2 of
Carlos Lopez a09598
**	the License, or (at your option) any later version.
Carlos Lopez a09598
**
Carlos Lopez a09598
**	This package is distributed in the hope that it will be useful,
Carlos Lopez a09598
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Carlos Lopez a09598
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Carlos Lopez a09598
**	General Public License for more details.
Carlos Lopez a09598
**	\endlegal
Carlos Lopez a09598
*/
Carlos Lopez a09598
/* ========================================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
#ifdef USING_PCH
Carlos Lopez a09598
#	include "pch.h"
Carlos Lopez a09598
#else
Carlos Lopez a09598
#ifdef HAVE_CONFIG_H
Carlos Lopez a09598
#	include <config.h></config.h>
Carlos Lopez a09598
#endif
Carlos Lopez a09598
bw 94d8a6
#include <synfig general.h=""></synfig>
bw 94d8a6
Carlos Lopez a09598
#include "timepointsmove.h"
Diego Barrios Romero dcc14d
#include <synfig layer_pastecanvas.h="" layers=""></synfig>
Carlos Lopez a09598
#include <synfigapp canvasinterface.h=""></synfigapp>
Diego Barrios Romero 07d34c
#include <synfig valuenode_dynamiclist.h="" valuenodes=""></synfig>
Diego Barrios Romero 07d34c
#include <synfig valuenode_animated.h="" valuenodes=""></synfig>
Carlos Lopez a09598
Carlos Lopez a09598
#include "activepointset.h"
Carlos Lopez a09598
#include "waypointset.h"
Carlos Lopez a09598
#include <synfigapp timegather.h=""></synfigapp>
Carlos Lopez a09598
Carlos Lopez a09598
#include <typeinfo></typeinfo>
Carlos Lopez a09598
abdbf2
#include <synfigapp localization.h=""></synfigapp>
Carlos Lopez a09598
Carlos Lopez a09598
#endif
Carlos Lopez a09598
Carlos Lopez a09598
using namespace std;
Carlos Lopez a09598
using namespace etl;
Carlos Lopez a09598
using namespace synfig;
Carlos Lopez a09598
using namespace synfigapp;
Carlos Lopez a09598
using namespace Action;
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
ACTION_INIT(Action::TimepointsMove);
Carlos Lopez a09598
ACTION_SET_NAME(Action::TimepointsMove,"TimepointsMove");
Carlos Lopez a09598
ACTION_SET_LOCAL_NAME(Action::TimepointsMove,N_("Move Time Points"));
Carlos Lopez a09598
ACTION_SET_TASK(Action::TimepointsMove,"move");
Carlos Lopez a09598
ACTION_SET_CATEGORY(Action::TimepointsMove,Action::CATEGORY_WAYPOINT|Action::CATEGORY_ACTIVEPOINT);
Carlos Lopez a09598
ACTION_SET_PRIORITY(Action::TimepointsMove,0);
Carlos Lopez a09598
ACTION_SET_VERSION(Action::TimepointsMove,"0.0");
Carlos Lopez a09598
ACTION_SET_CVS_ID(Action::TimepointsMove,"$Id$");
Carlos Lopez a09598
Carlos Lopez a09598
/* === G L O B A L S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === P R O C E D U R E S ================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === M E T H O D S ======================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
Action::TimepointsMove::TimepointsMove()
Carlos Lopez a09598
{
Carlos Lopez a09598
	timemove = 0;
Carlos Lopez a09598
	set_dirty(false);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
Action::ParamVocab
Carlos Lopez a09598
Action::TimepointsMove::get_param_vocab()
Carlos Lopez a09598
{
Carlos Lopez a09598
	ParamVocab ret(Action::CanvasSpecific::get_param_vocab());
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("addlayer",Param::TYPE_VALUE)
Carlos Lopez a09598
		.set_local_name(_("New Selected Layer"))
Carlos Lopez a09598
		.set_desc(_("A layer to add to our selected list"))
Carlos Lopez a09598
		.set_supports_multiple()
Carlos Lopez a09598
		.set_optional()
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("addcanvas",Param::TYPE_CANVAS)
Carlos Lopez a09598
		.set_local_name(_("New Selected Canvas"))
Carlos Lopez a09598
		.set_desc(_("A canvas to add to our selected list"))
Carlos Lopez a09598
		.set_supports_multiple()
Carlos Lopez a09598
		.set_optional()
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("addvaluedesc",Param::TYPE_VALUEDESC)
Carlos Lopez a09598
		.set_local_name(_("New Selected ValueBase"))
Carlos Lopez a09598
		.set_desc(_("A valuenode's description to add to our selected list"))
Carlos Lopez a09598
		.set_supports_multiple()
Carlos Lopez a09598
		.set_optional()
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("addtime",Param::TYPE_TIME)
Carlos Lopez a09598
		.set_local_name(_("New Selected Time Point"))
Carlos Lopez a09598
		.set_desc(_("A time point to add to our selected list"))
Carlos Lopez a09598
		.set_supports_multiple()
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	ret.push_back(ParamDesc("deltatime",Param::TYPE_TIME)
Carlos Lopez a09598
		.set_local_name(_("Time adjustment"))
Carlos Lopez a09598
		.set_desc(_("The amount of time to adjust all the selected points"))
Carlos Lopez a09598
	);
Carlos Lopez a09598
Carlos Lopez a09598
	return ret;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
Action::TimepointsMove::is_candidate(const ParamList &x)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(!candidate_check(get_param_vocab(),x))
Carlos Lopez a09598
		return false;
Carlos Lopez a09598
Carlos Lopez a09598
	if(	x.find("addlayer") == x.end() &&
Carlos Lopez a09598
		x.find("addcanvas") == x.end() &&
Carlos Lopez a09598
		x.find("addvaluedesc") == x.end())
Carlos Lopez a09598
		return false;
Carlos Lopez a09598
	return true;
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
Action::TimepointsMove::set_param(const synfig::String& name, const Action::Param ¶m)
Carlos Lopez a09598
{
Carlos Lopez a09598
	if(name=="addlayer" && param.get_type()==Param::TYPE_LAYER)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//add a layer to the list
Carlos Lopez a09598
		sel_layers.push_back(param.get_layer());
Carlos Lopez a09598
		//synfig::info("action got layer");
Carlos Lopez a09598
Carlos Lopez a09598
		return true;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	if(name=="addcanvas" && param.get_type()==Param::TYPE_CANVAS)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//add a layer to the list
Carlos Lopez a09598
		sel_canvases.push_back(param.get_canvas());
Carlos Lopez a09598
		//synfig::info("action got canvas");
Carlos Lopez a09598
Carlos Lopez a09598
		return true;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	if(name=="addvaluedesc" && param.get_type()==Param::TYPE_VALUEDESC)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//add a layer to the list
Carlos Lopez a09598
		sel_values.push_back(param.get_value_desc());
Carlos Lopez a09598
		//synfig::info("action got valuedesc");
Carlos Lopez a09598
Carlos Lopez a09598
		return true;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	if(name=="addtime" && param.get_type()==Param::TYPE_TIME)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//add a layer to the list
Carlos Lopez a09598
		sel_times.insert(param.get_time());
Carlos Lopez a09598
		//synfig::info("action got time");
Carlos Lopez a09598
Carlos Lopez a09598
		return true;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	if(name=="deltatime" && param.get_type()==Param::TYPE_TIME)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		timemove = param.get_time();
Carlos Lopez a09598
		//synfig::info("action got time to move");
Carlos Lopez a09598
Carlos Lopez a09598
		return true;
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	return Action::CanvasSpecific::set_param(name,param);
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
bool
Carlos Lopez a09598
Action::TimepointsMove::is_ready()const
Carlos Lopez a09598
{
Carlos Lopez a09598
	if((sel_layers.empty() && sel_canvases.empty() && sel_values.empty()) || sel_times.empty())
Carlos Lopez a09598
		return false;
Carlos Lopez a09598
	return Action::CanvasSpecific::is_ready();
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Action::TimepointsMove::prepare()
Carlos Lopez a09598
{
Carlos Lopez a09598
	clear();
Carlos Lopez a09598
Carlos Lopez a09598
	//synfig::info("Preparing TimepointsMove by %f secs",(float)timemove);
Carlos Lopez a09598
Carlos Lopez a09598
	if(sel_times.empty()) return;
Carlos Lopez a09598
Carlos Lopez a09598
	//all our lists should be set correctly...
Carlos Lopez a09598
Carlos Lopez a09598
	/*{
Carlos Lopez a09598
		std::set<synfig::time>::iterator i = sel_times.begin(), end = sel_times.end();</synfig::time>
Carlos Lopez a09598
Carlos Lopez a09598
		for(; i != end; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			synfig::info("Time %f", (float)*i);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}*/
Carlos Lopez a09598
Carlos Lopez a09598
	//build our sub-action list
Carlos Lopez a09598
	// 	and yes we do need to store it temporarily so we don't duplicate
Carlos Lopez a09598
	//		an operation on a specific valuenode, etc....
Carlos Lopez a09598
	timepoints_ref	match;
Carlos Lopez a09598
Carlos Lopez a09598
	Time fps = get_canvas()->rend_desc().get_frame_rate();
Carlos Lopez a09598
Carlos Lopez a09598
	//std::vector<synfig::layer::handle></synfig::layer::handle>
Carlos Lopez a09598
	//synfig::info("Layers %d", sel_layers.size());
Carlos Lopez a09598
	{
Carlos Lopez a09598
		std::vector<synfig::layer::handle>::iterator i = sel_layers.begin(),</synfig::layer::handle>
Carlos Lopez a09598
													end = sel_layers.end();
Carlos Lopez a09598
Carlos Lopez a09598
		for(; i != end; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			//synfig::info("Recurse through a layer");
Carlos Lopez a09598
			recurse_layer(*i,sel_times,match);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	//std::vector<synfig::canvas::handle>	sel_canvases;</synfig::canvas::handle>
Carlos Lopez a09598
	//synfig::info("Canvases %d", sel_canvases.size());
Carlos Lopez a09598
	{
Carlos Lopez a09598
		std::vector<synfig::canvas::handle>::iterator 	i = sel_canvases.begin(),</synfig::canvas::handle>
Carlos Lopez a09598
														end = sel_canvases.end();
Carlos Lopez a09598
Carlos Lopez a09598
		for(; i != end; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			//synfig::info("Recurse through a canvas");
Carlos Lopez a09598
			recurse_canvas(*i,sel_times,match);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	//std::vector<synfigapp::valuedesc></synfigapp::valuedesc>
Carlos Lopez a09598
	//synfig::info("ValueBasedescs %d", sel_values.size());
Carlos Lopez a09598
	{
Carlos Lopez a09598
		std::vector<synfigapp::valuedesc>::iterator 	i = sel_values.begin(),</synfigapp::valuedesc>
Carlos Lopez a09598
													end = sel_values.end();
Carlos Lopez a09598
Carlos Lopez a09598
		for(; i != end; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			//synfig::info("Recurse through a valuedesc");
Carlos Lopez a09598
			recurse_valuedesc(*i,sel_times,match);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
Carlos Lopez a09598
	//synfig::info("built list of waypoints/activepoints to modify");
Carlos Lopez a09598
	//synfig::info("\t There are %d waypoint sets and %d activepointsets",
Carlos Lopez a09598
	//				match.waypointbiglist.size(), match.actpointbiglist.size());
Carlos Lopez a09598
	//process them...
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//must build from both lists
Carlos Lopez a09598
		timepoints_ref::waytracker::const_iterator 	i = match.waypointbiglist.begin(),
db9c0e
													iend = match.waypointbiglist.end();
db9c0e
		for(; i != iend; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			Action::Handle action(WaypointSet::create());
Carlos Lopez a09598
Carlos Lopez a09598
			action->set_param("canvas",get_canvas());
Carlos Lopez a09598
			action->set_param("canvas_interface",get_canvas_interface());
Carlos Lopez a09598
			action->set_param("value_node",ValueNode::Handle(i->val));
Carlos Lopez a09598
Max May 98aca7
			synfig::Time dilated_timemove(timemove * i->time_dilation);
Max May 98aca7
Carlos Lopez a09598
			//iterate through each waypoint for this specific valuenode
Carlos Lopez a09598
			std::set<synfig::waypoint>::const_iterator 	j = i->waypoints.begin(),</synfig::waypoint>
db9c0e
														jend = i->waypoints.end();
db9c0e
			for(; j != jend; ++j)
Carlos Lopez a09598
			{
Carlos Lopez a09598
				//synfig::info("add waypoint mod...");
Carlos Lopez a09598
				//NOTE: We may want to store the old time for undoing the action...
Carlos Lopez a09598
				Waypoint w = *j;
Max May 98aca7
				w.set_time((w.get_time() + dilated_timemove).round(fps));
Carlos Lopez a09598
				action->set_param("waypoint",w);
Carlos Lopez a09598
			}
Carlos Lopez a09598
Carlos Lopez a09598
			//run the action now that we've added everything
Carlos Lopez a09598
			assert(action->is_ready());
Carlos Lopez a09598
			if(!action->is_ready())
Carlos Lopez a09598
				throw Error(Error::TYPE_NOTREADY);
Carlos Lopez a09598
Carlos Lopez a09598
			add_action_front(action);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
	{
Carlos Lopez a09598
		//must build from both lists
Carlos Lopez a09598
		timepoints_ref::acttracker::const_iterator 	i = match.actpointbiglist.begin(),
Carlos Lopez a09598
													end = match.actpointbiglist.end();
Carlos Lopez a09598
		for(; i != end; ++i)
Carlos Lopez a09598
		{
Carlos Lopez a09598
			Action::Handle action(ActivepointSet::create());
Carlos Lopez a09598
Carlos Lopez a09598
			action->set_param("canvas",get_canvas());
Carlos Lopez a09598
			action->set_param("canvas_interface",get_canvas_interface());
Carlos Lopez a09598
			action->set_param("value_desc",i->val);
Carlos Lopez a09598
Max May 98aca7
			synfig::Time dilated_timemove(timemove * i->time_dilation);
Max May 98aca7
Carlos Lopez a09598
			//iterate through each activepoint for this specific valuenode
Carlos Lopez a09598
			std::set<synfig::activepoint>::const_iterator 	j = i->activepoints.begin(),</synfig::activepoint>
Carlos Lopez a09598
															jend = i->activepoints.end();
Carlos Lopez a09598
			for(; j != jend; ++j)
Carlos Lopez a09598
			{
Carlos Lopez a09598
				//synfig::info("add activepoint mod...");
Carlos Lopez a09598
Carlos Lopez a09598
				//NOTE: We may want to store the old time for undoing the action...
Carlos Lopez a09598
				Activepoint a = *j;
Max May 98aca7
				a.set_time((a.get_time() + dilated_timemove).round(fps));
Carlos Lopez a09598
				action->set_param("activepoint",a);
Carlos Lopez a09598
			}
Carlos Lopez a09598
Carlos Lopez a09598
			assert(action->is_ready());
Carlos Lopez a09598
			if(!action->is_ready())
Carlos Lopez a09598
			{
Carlos Lopez a09598
				throw Error(Error::TYPE_NOTREADY);
Carlos Lopez a09598
			}
Carlos Lopez a09598
Carlos Lopez a09598
			add_action_front(action);
Carlos Lopez a09598
		}
Carlos Lopez a09598
	}
Carlos Lopez a09598
}
Carlos Lopez a09598
Carlos Lopez a09598
void
Carlos Lopez a09598
Action::TimepointsMove::perform()
Carlos Lopez a09598
{
Carlos Lopez a09598
	Action::Super::perform();
Carlos Lopez a09598
}