|
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 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
#include <set></set>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
|
|
[d.j.a.y] Jerome Blanchi |
f8d04e |
#include <sigc++ sigc++.h=""></sigc++>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
|
|
Carlos Lopez |
a09598 |
#include <etl handle=""></etl>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
|
|
Carlos Lopez |
a09598 |
#include <synfig canvas.h=""></synfig>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
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 |
{
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
typedef std::set< etl::handle<canvasinterface> > RedrawSet;</canvasinterface>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
|
|
Carlos Lopez |
a09598 |
etl::loose_handle<system> instance_;</system>
|
|
Carlos Lopez |
a09598 |
synfig::String name_;
|
|
Carlos Lopez |
a09598 |
int depth_;
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
RedrawSet redraw_set_;
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
0bd937 |
bool finished_;
|
|
Carlos Lopez |
a09598 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
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 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
0bd937 |
etl::handle<action::group> finish();</action::group>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
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 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
65f7fd |
void request_redraw(etl::handle<canvasinterface>);</canvasinterface>
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?d=retro&s=16) |
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
|