0ad/source/tools/atlas/GameInterface/CommandProc.cpp
Ykkrosh 5d62c3f3f7 Atlas: Simple undo system
This was SVN commit r2627.
2005-08-20 15:44:50 +00:00

74 lines
1.5 KiB
C++

#include "precompiled.h"
#include "CommandProc.h"
//////////////////////////////////////////////////////////////////////////
template<typename T> T next(T x) { T t = x; return ++t; }
template<typename T, typename I> void delete_erase(T list, I first, I last)
{
while (first != last)
{
delete *first;
first = list.erase(first);
}
}
//////////////////////////////////////////////////////////////////////////
using namespace AtlasMessage;
namespace AtlasMessage {
static CommandProc g_CommandProc;
CommandProc& GetCommandProc() { return g_CommandProc; }
cmdHandlers& GetCmdHandlers()
{
static cmdHandlers h;
return h;
}
}
CommandProc::CommandProc()
{
// Start the list with a NULL, so m_CurrentCommand can point at
// something even when the command stack is empty
m_Commands.push_back(NULL);
m_CurrentCommand = m_Commands.begin();
}
CommandProc::~CommandProc()
{
delete_erase(m_Commands, m_Commands.begin(), m_Commands.end());
}
void CommandProc::Submit(Command* cmd)
{
delete_erase(m_Commands, next(m_CurrentCommand), m_Commands.end());
m_CurrentCommand = m_Commands.insert(next(m_CurrentCommand), cmd);
(*m_CurrentCommand)->Do();
}
void CommandProc::Undo()
{
if (m_CurrentCommand != m_Commands.begin())
{
(*m_CurrentCommand)->Undo();
--m_CurrentCommand;
}
}
void CommandProc::Redo()
{
if (next(m_CurrentCommand) != m_Commands.end())
{
++m_CurrentCommand;
(*m_CurrentCommand)->Redo();
}
}