Blame synfig-studio/src/synfigapp/action_system.h

Carlos Lopez a09598
/* === S Y N F I G ========================================================= */
Carlos Lopez a09598
/*!	\file action_system.h
Carlos Lopez a09598
**	\brief Template Header
Carlos Lopez a09598
**
Carlos Lopez a09598
**	$Id$
Carlos Lopez a09598
**
Carlos Lopez a09598
**	\legal
Carlos Lopez a09598
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., 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
/* === S T A R T =========================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
#ifndef __SYNFIGAPP_ACTIONSYSTEM_H
Carlos Lopez a09598
#define __SYNFIGAPP_ACTIONSYSTEM_H
Carlos Lopez a09598
Carlos Lopez a09598
/* === H E A D E R S ======================================================= */
Carlos Lopez a09598
65f7fd
#include <set></set>
65f7fd
[d.j.a.y] Jerome Blanchi f8d04e
#include <sigc++ sigc++.h=""></sigc++>
65f7fd
Carlos Lopez a09598
#include <etl handle=""></etl>
65f7fd
Carlos Lopez a09598
#include <synfig canvas.h=""></synfig>
65f7fd
65f7fd
#include "action.h"
Carlos Lopez a09598
#include "uimanager.h"
Carlos Lopez a09598
Carlos Lopez a09598
/* === M A C R O S ========================================================= */
Carlos Lopez a09598
Carlos Lopez a09598
/* === T Y P E D E F S ===================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
/* === C L A S S E S & S T R U C T S ======================================= */
Carlos Lopez a09598
Carlos Lopez a09598
namespace synfigapp {
Carlos Lopez a09598
Carlos Lopez a09598
class CanvasInterface;
Carlos Lopez a09598
Carlos Lopez a09598
namespace Action {
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
class System;
Carlos Lopez a09598
Carlos Lopez a09598
//! Passive action grouping class
Carlos Lopez a09598
class PassiveGrouper
Carlos Lopez a09598
{
65f7fd
	typedef std::set< etl::handle<canvasinterface> > RedrawSet;</canvasinterface>
65f7fd
Carlos Lopez a09598
	etl::loose_handle<system> instance_;</system>
Carlos Lopez a09598
	synfig::String name_;
Carlos Lopez a09598
	int depth_;
65f7fd
	RedrawSet redraw_set_;
0bd937
	bool finished_;
Carlos Lopez a09598
65f7fd
public:
Carlos Lopez a09598
	PassiveGrouper(etl::loose_handle<system> instance_,synfig::String name_);</system>
Carlos Lopez a09598
Carlos Lopez a09598
	~PassiveGrouper();
Carlos Lopez a09598
Carlos Lopez a09598
	const synfig::String &get_name()const { return name_; }
Carlos Lopez a09598
Carlos Lopez a09598
	void set_name(const synfig::String &x) { name_=x; }
Carlos Lopez a09598
Carlos Lopez a09598
	etl::loose_handle<system> get_instance() { return instance_; }</system>
Carlos Lopez a09598
Carlos Lopez a09598
	void request_redraw(etl::handle<canvasinterface>);</canvasinterface>
Carlos Lopez a09598
0bd937
	etl::handle<action::group> finish();</action::group>
0bd937
Carlos Lopez a09598
	void cancel();
Carlos Lopez a09598
Carlos Lopez a09598
	void inc_depth() { depth_++; }
Carlos Lopez a09598
Carlos Lopez a09598
	void dec_depth() { depth_--; }
Carlos Lopez a09598
Carlos Lopez a09598
	const int &get_depth()const { return depth_; }
Carlos Lopez a09598
}; // END of class Action::PassiveGrouper
Carlos Lopez a09598
Carlos Lopez a09598
typedef std::list< etl::handle<action::undoable> > Stack;</action::undoable>
Carlos Lopez a09598
Carlos Lopez a09598
class System : public etl::shared_object, public sigc::trackable
Carlos Lopez a09598
{
Carlos Lopez a09598
	friend class PassiveGrouper;
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- P U B L I C   T Y P E S ---------------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
public:
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- P U B L I C  D A T A ------------------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
public:
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- P R I V A T E   D A T A ---------------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
private:
Carlos Lopez a09598
Carlos Lopez a09598
	Stack undo_action_stack_;
Carlos Lopez a09598
	Stack redo_action_stack_;
Carlos Lopez a09598
Nikita Kitaev dc5e35
	synfig::String most_recent_action_name_;
Carlos Lopez a09598
Carlos Lopez a09598
	std::list<passivegrouper*> group_stack_;</passivegrouper*>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void,bool> signal_undo_status_;</void,bool>
Carlos Lopez a09598
	sigc::signal<void,bool> signal_redo_status_;</void,bool>
Carlos Lopez a09598
	sigc::signal<void,etl::handle<action::undoable> > signal_new_action_;</void,etl::handle<action::undoable>
Carlos Lopez a09598
	sigc::signal<void> signal_undo_stack_cleared_;</void>
Carlos Lopez a09598
	sigc::signal<void> signal_redo_stack_cleared_;</void>
Carlos Lopez a09598
	sigc::signal<void> signal_undo_;</void>
Carlos Lopez a09598
	sigc::signal<void> signal_redo_;</void>
Carlos Lopez a09598
	sigc::signal<void,etl::handle<action::undoable> > signal_action_status_changed_;</void,etl::handle<action::undoable>
Carlos Lopez a09598
Carlos Lopez a09598
	mutable sigc::signal<void,bool> signal_unsaved_status_changed_;</void,bool>
Carlos Lopez a09598
Carlos Lopez a09598
	//! If this is non-zero, then the changes have not yet been saved.
Carlos Lopez a09598
	mutable int action_count_;
Carlos Lopez a09598
Carlos Lopez a09598
	etl::handle<uiinterface> ui_interface_;</uiinterface>
Carlos Lopez a09598
Carlos Lopez a09598
	bool clear_redo_stack_on_new_action_;
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- P R I V A T E   M E T H O D S ---------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
private:
Carlos Lopez a09598
Carlos Lopez a09598
	bool undo_(etl::handle<uiinterface> uim);</uiinterface>
Carlos Lopez a09598
	bool redo_(etl::handle<uiinterface> uim);</uiinterface>
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- S I G N A L   T E R M I N A L S -------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
private:
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- P U B L I C   M E T H O D S -----------------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
public:
Carlos Lopez a09598
Carlos Lopez a09598
	System();
Carlos Lopez a09598
	~System();
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
	template <typename t=""> bool</typename>
Carlos Lopez a09598
	perform_action(T x)
Carlos Lopez a09598
	{
Carlos Lopez a09598
		etl::handle<action::base> action((Action::Base*)new T(x));</action::base>
Carlos Lopez a09598
		return perform_action(action);
Carlos Lopez a09598
	}
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Nikita Kitaev dc5e35
	synfig::String get_most_recent_action_name() { return most_recent_action_name_; }
Carlos Lopez a09598
Carlos Lopez a09598
	bool get_clear_redo_stack_on_new_action()const { return clear_redo_stack_on_new_action_; }
Carlos Lopez a09598
Carlos Lopez a09598
	void set_clear_redo_stack_on_new_action(bool x) { clear_redo_stack_on_new_action_=x; }
Carlos Lopez a09598
65f7fd
	void request_redraw(etl::handle<canvasinterface>);</canvasinterface>
65f7fd
Carlos Lopez a09598
	bool perform_action(etl::handle<action::base> action);</action::base>
Carlos Lopez a09598
Carlos Lopez a09598
	bool set_action_status(etl::handle<action::undoable> action, bool x);</action::undoable>
Carlos Lopez a09598
Carlos Lopez a09598
	const Stack &undo_action_stack()const { return undo_action_stack_; }
Carlos Lopez a09598
Carlos Lopez a09598
	const Stack &redo_action_stack()const { return redo_action_stack_; }
Carlos Lopez a09598
Carlos Lopez a09598
	//! Undoes the last action
Carlos Lopez a09598
	bool undo();
Carlos Lopez a09598
Carlos Lopez a09598
	//! Redoes the last undone action
Carlos Lopez a09598
	bool redo();
Carlos Lopez a09598
Carlos Lopez a09598
	//! Clears the undo stack.
Carlos Lopez a09598
	void clear_undo_stack();
Carlos Lopez a09598
Carlos Lopez a09598
	//! Clears the redo stack.
Carlos Lopez a09598
	void clear_redo_stack();
Carlos Lopez a09598
Carlos Lopez a09598
	//! Increments the action counter
Carlos Lopez a09598
	/*! \note You should not have to call this under normal circumstances.
Carlos Lopez a09598
	**	\see dec_action_count(), reset_action_count(), get_action_count() */
Carlos Lopez a09598
	void inc_action_count()const;
Carlos Lopez a09598
Carlos Lopez a09598
	//! Decrements the action counter
Carlos Lopez a09598
	/*! \note You should not have to call this under normal circumstances.
Carlos Lopez a09598
	**	\see inc_action_count(), reset_action_count(), get_action_count() */
Carlos Lopez a09598
	void dec_action_count()const;
Carlos Lopez a09598
Carlos Lopez a09598
	//! Resets the action counter
Carlos Lopez a09598
	/*! \note You should not have to call this under normal circumstances.
Carlos Lopez a09598
	**	\see inc_action_count(), dec_action_count(), get_action_count() */
Carlos Lopez a09598
	void reset_action_count()const;
Carlos Lopez a09598
Carlos Lopez a09598
	//! Returns the number of actions performed since last save.
Carlos Lopez a09598
	/*!	\see inc_action_count(), dec_action_count(), reset_action_count() */
Carlos Lopez a09598
	int get_action_count()const { return action_count_; }
Carlos Lopez a09598
Carlos Lopez a09598
	void set_ui_interface(const etl::handle<uiinterface> &uim) { assert(uim); ui_interface_=uim; }</uiinterface>
Carlos Lopez a09598
	void unset_ui_interface() { ui_interface_=new DefaultUIInterface(); }
Carlos Lopez a09598
	const etl::handle<uiinterface> &get_ui_interface() { return ui_interface_; }</uiinterface>
Carlos Lopez a09598
Carlos Lopez a09598
	/*
Carlos Lopez a09598
 -- ** -- S I G N A L   I N T E R F A C E S -----------------------------------
Carlos Lopez a09598
	*/
Carlos Lopez a09598
Carlos Lopez a09598
public:
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void,bool>& signal_unsaved_status_changed() { return signal_unsaved_status_changed_; }</void,bool>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void,bool>& signal_undo_status() { return signal_undo_status_; }</void,bool>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void,bool>& signal_redo_status() { return signal_redo_status_; }</void,bool>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void>& signal_undo_stack_cleared() { return signal_undo_stack_cleared_; }</void>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void>& signal_redo_stack_cleared() { return signal_redo_stack_cleared_; }</void>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void>& signal_undo() { return signal_undo_; }</void>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void>& signal_redo() { return signal_redo_; }</void>
Carlos Lopez a09598
Carlos Lopez a09598
	//!	Called whenever an undoable action is processed and added to the stack.
Carlos Lopez a09598
	sigc::signal<void,etl::handle<action::undoable> >& signal_new_action() { return signal_new_action_; }</void,etl::handle<action::undoable>
Carlos Lopez a09598
Carlos Lopez a09598
	sigc::signal<void,etl::handle<action::undoable> >& signal_action_status_changed() { return signal_action_status_changed_; }</void,etl::handle<action::undoable>
Carlos Lopez a09598
Carlos Lopez a09598
}; // END of class Action::System
Carlos Lopez a09598
Carlos Lopez a09598
Carlos Lopez a09598
}; // END of namespace synfigapp::Action
Carlos Lopez a09598
}; // END of namespace synfigapp
Carlos Lopez a09598
Carlos Lopez a09598
/* === E N D =============================================================== */
Carlos Lopez a09598
Carlos Lopez a09598
#endif