forked from mia/Aegisub
Guess!
Originally committed to SVN as r2462.
This commit is contained in:
parent
1f1261c997
commit
fbf55bacaa
4 changed files with 24 additions and 10 deletions
|
@ -363,11 +363,19 @@ namespace Athenasub {
|
||||||
|
|
||||||
// Action list
|
// Action list
|
||||||
class IActionList {
|
class IActionList {
|
||||||
|
friend class CModel;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual std::list<Action> GetActions() = 0;
|
||||||
|
virtual void AddActionStart(Action action) = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~IActionList() {}
|
virtual ~IActionList() {}
|
||||||
|
|
||||||
virtual String GetName() const = 0;
|
virtual String GetName() const = 0;
|
||||||
virtual String GetOwner() const = 0;
|
virtual String GetOwner() const = 0;
|
||||||
|
virtual Model GetModel() const = 0;
|
||||||
|
virtual bool CanUndo() const = 0;
|
||||||
|
|
||||||
virtual void AddAction(Action action) = 0;
|
virtual void AddAction(Action action) = 0;
|
||||||
virtual void Finish() = 0;
|
virtual void Finish() = 0;
|
||||||
|
|
|
@ -57,7 +57,7 @@ CActionList::~CActionList()
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
// Add an action to the queue
|
// Add an action to the queue
|
||||||
void CActionList::AddAction(const Action action)
|
void CActionList::AddAction(Action action)
|
||||||
{
|
{
|
||||||
if (!valid) THROW_ATHENA_EXCEPTION(Exception::Invalid_ActionList);
|
if (!valid) THROW_ATHENA_EXCEPTION(Exception::Invalid_ActionList);
|
||||||
actions.push_back(action);
|
actions.push_back(action);
|
||||||
|
|
|
@ -50,8 +50,8 @@ namespace Athenasub {
|
||||||
|
|
||||||
// ActionList class
|
// ActionList class
|
||||||
class CActionList : public IActionList {
|
class CActionList : public IActionList {
|
||||||
friend class CModel;
|
|
||||||
friend class CController;
|
friend class CController;
|
||||||
|
friend class CModel;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String actionName;
|
String actionName;
|
||||||
|
@ -63,13 +63,17 @@ namespace Athenasub {
|
||||||
|
|
||||||
CActionList(weak_ptr<IModel>,const String actionName,const String owner,bool undoAble);
|
CActionList(weak_ptr<IModel>,const String actionName,const String owner,bool undoAble);
|
||||||
void Start(const String actionName);
|
void Start(const String actionName);
|
||||||
void AddActionStart(const Action action);
|
|
||||||
|
virtual void AddActionStart(Action action);
|
||||||
|
virtual std::list<Action> GetActions() { return actions; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~CActionList();
|
virtual ~CActionList();
|
||||||
|
|
||||||
virtual String GetName() const { return actionName; }
|
virtual String GetName() const { return actionName; }
|
||||||
virtual String GetOwner() const { return owner; }
|
virtual String GetOwner() const { return owner; }
|
||||||
|
virtual Model GetModel() const { return Model(model); }
|
||||||
|
virtual bool CanUndo() const { return undoAble; }
|
||||||
|
|
||||||
virtual void AddAction(Action action);
|
virtual void AddAction(Action action);
|
||||||
virtual void Finish();
|
virtual void Finish();
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
// Contact: mailto:amz@aegisub.net
|
// Contact: mailto:amz@aegisub.net
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "Athenasub.h"
|
#include "athenasub.h"
|
||||||
#include "model.h"
|
#include "model.h"
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
using namespace Athenasub;
|
using namespace Athenasub;
|
||||||
|
@ -74,27 +74,29 @@ void CModel::DispatchNotifications(Notification notification) const
|
||||||
void CModel::ProcessActionList(CActionList &_actionList,int type)
|
void CModel::ProcessActionList(CActionList &_actionList,int type)
|
||||||
{
|
{
|
||||||
// Copy the list
|
// Copy the list
|
||||||
//shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(*static_pointer_cast<CActionList>(_actionList)));
|
//shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(_actionList));
|
||||||
shared_ptr<CActionList> actions = shared_ptr<CActionList>(new CActionList(_actionList));
|
ActionList actions = ActionList(new CActionList(_actionList));
|
||||||
|
bool canUndo = actions->CanUndo();
|
||||||
|
|
||||||
// Setup undo
|
// Setup undo
|
||||||
shared_ptr<CActionList> undo = shared_ptr<CActionList>(new CActionList(Model(actions->model),actions->actionName,actions->owner,actions->undoAble));
|
ActionList undo = ActionList(new CActionList(actions->GetModel(),actions->GetName(),actions->GetOwner(),canUndo));
|
||||||
ActionStack *stack;
|
ActionStack *stack;
|
||||||
if (type == 1) stack = &redoStack;
|
if (type == 1) stack = &redoStack;
|
||||||
else stack = &undoStack;
|
else stack = &undoStack;
|
||||||
|
|
||||||
// Execute actions
|
// Execute actions
|
||||||
std::list<Action>::const_iterator cur;
|
std::list<Action>::const_iterator cur;
|
||||||
for (cur=actions->actions.begin();cur!=actions->actions.end();cur++) {
|
std::list<Action> acts = actions->GetActions();
|
||||||
|
for (cur=acts.begin();cur!=acts.end();cur++) {
|
||||||
// Inserts the opposite into the undo action first
|
// Inserts the opposite into the undo action first
|
||||||
if (actions->undoAble) undo->AddActionStart((*cur)->GetAntiAction());
|
if (canUndo) undo->AddActionStart((*cur)->GetAntiAction());
|
||||||
|
|
||||||
// Execute the action itself
|
// Execute the action itself
|
||||||
(*cur)->Execute();
|
(*cur)->Execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert into undo stack
|
// Insert into undo stack
|
||||||
if (actions->undoAble) {
|
if (canUndo) {
|
||||||
stack->push_back(undo);
|
stack->push_back(undo);
|
||||||
if (stack->size() > undoLimit) stack->pop_front();
|
if (stack->size() > undoLimit) stack->pop_front();
|
||||||
if (type == 0) redoStack.clear();
|
if (type == 0) redoStack.clear();
|
||||||
|
|
Loading…
Reference in a new issue