DragonNest/Client/EtCutSceneTool/CmdProcessor.cpp

277 lines
5.1 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "stdafx.h"
#include <wx/wx.h>
#include "CmdProcessor.h"
#include "CommandSet.h"
const int CMD_HISTORY_CAPACITY = 50;
CCmdProcessor::CCmdProcessor(void) : m_pNowCommand( NULL ),
m_pLastDidCommand( NULL ),
m_iCmdHistoryCapacity( CMD_HISTORY_CAPACITY ),
m_iCmdIndex( -1 ),
m_bCmdUpdated( false ),
m_iLastCommandID( -1 )
//m_pLogReceiver( NULL )
{
}
CCmdProcessor::~CCmdProcessor(void)
{
// <20><><EFBFBD><EFBFBD> ť<><C5A5> <20>׿<EFBFBD><D7BF>ִ°<D6B4> <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
for_each( m_dqCmdList.begin(), m_dqCmdList.end(), DeleteData<ICommand*>() );
}
void CCmdProcessor::SetCommand( ICommand* pCommand )
{
assert( NULL == m_pNowCommand && "Ŀ<EFBFBD>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20>ٽ<EFBFBD> Ŀ<>ǵ带 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ˴ϴ<CBB4>." );
m_pNowCommand = pCommand;
}
void CCmdProcessor::DoCommand( void )
{
if( m_pNowCommand->Recordable() )
{
// <20>ϴ<EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>(Ŀ<>ǵ<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD>󼭴<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// <20>ؼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ带 <20><><EFBFBD><EFBFBD>
m_pNowCommand = m_pNowCommand->CreateSame();
++m_iCmdIndex;
// Ŀ<>ǵ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
while( m_iCmdIndex <= (int)m_dqCmdList.size()-1 )
{
delete m_dqCmdList.back();
m_dqCmdList.pop_back();
}
m_dqCmdList.push_back( m_pNowCommand );
m_bCmdUpdated = true;
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20>ʵ<EFBFBD><CAB5><EFBFBD>.
if( (int)m_dqCmdList.size() > m_iCmdHistoryCapacity )
{
delete m_dqCmdList.front();
m_dqCmdList.pop_front();
m_iCmdIndex = (int)m_dqCmdList.size() - 1;
}
}
m_iLastCommandID = m_pNowCommand->GetTypeID();
m_pNowCommand->Excute();
m_pLastDidCommand = m_pNowCommand;
const wxChar* pDesc = m_pNowCommand->GetDesc();
if( pDesc )
{
m_strLastCmdMsg.assign( pDesc );
//if( m_pLogReceiver )
// m_pLogReceiver->DataChanged();
}
m_pNowCommand = NULL;
//m_bCmdUpdated = false;
}
bool CCmdProcessor::CanUndo( void )
{
return -1 != m_iCmdIndex;
}
void CCmdProcessor::UndoCommand( void )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD>. ļļļ.
if( CanUndo() )
{
// Undo <20><> ȣ<><C8A3> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>
// <20><EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD> Undo <20><> ȣ<><C8A3><EFBFBD>DZ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
ICommand* pCommand = m_dqCmdList.at( m_iCmdIndex );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>̴<EFBFBD>.
--m_iCmdIndex;
m_bCmdUpdated = true;
m_iLastCommandID = pCommand->GetTypeID();
pCommand->Undo();
m_pLastDidCommand = pCommand;
m_strLastCmdMsg.assign( wxT("*Undo : ") );
const wxChar* pDesc = pCommand->GetDesc();
if( pDesc )
{
m_strLastCmdMsg.append( pDesc );
//if( m_pLogReceiver )
// m_pLogReceiver->DataChanged();
}
//m_bCmdUpdated = false;
}
else
{
m_bErrorOccured = true;
m_strLastError.assign( wxT("[Command Invoker] UndoCommand() <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n") );
}
}
bool CCmdProcessor::CanRedo( void )
{
return m_iCmdIndex < ((int)m_dqCmdList.size()-1);
}
void CCmdProcessor::RedoCommand( void )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>. -_-;
if( CanRedo() )
{
// Redo <20><> Undo <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
++m_iCmdIndex;
ICommand* pCommand = m_dqCmdList.at( m_iCmdIndex );
m_bCmdUpdated = true;
m_iLastCommandID = pCommand->GetTypeID();
pCommand->Excute();
m_pLastDidCommand = pCommand;
m_strLastCmdMsg.assign( wxT("*Redo : ") );
const wxChar* pDesc = pCommand->GetDesc();
if( pDesc )
{
m_strLastCmdMsg.append( pDesc );
//if( m_pLogReceiver )
// m_pLogReceiver->DataChanged();
}
//m_bCmdUpdated = false;
}
else
{
m_bErrorOccured = true;
m_strLastError.assign( wxT("[Command Invoker] RedoCommand() <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.\n") );
}
}
void CCmdProcessor::OnUpdatedAllListeners( void )
{
m_bCmdUpdated = false;
m_iLastCommandID = CMD_NULL;
}
int CCmdProcessor::GetNumCmdHistory( void )
{
return (int)m_dqCmdList.size();
}
ICommand* CCmdProcessor::GetCmdHistory( int iIndex )
{
return m_dqCmdList.at( iIndex );
}
void CCmdProcessor::UpdateToThisHistory( int iCmdIndex )
{
assert( iCmdIndex != -1 );
if( iCmdIndex != -1 )
{
// Ŀ<>ǵ尡 <20><><EFBFBD><EFBFBD> Ŀ<>ǵ庸<C7B5><E5BAB8> <20>ֱ<EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> redo
if( m_iCmdIndex < iCmdIndex )
{
while( m_iCmdIndex < iCmdIndex )
{
RedoCommand();
}
}
else
if( m_iCmdIndex > iCmdIndex )
{
// Ŀ<>ǵ尡 <20><><EFBFBD><EFBFBD> Ŀ<>ǵ庸<C7B5><E5BAB8> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> undo
while( m_iCmdIndex > iCmdIndex )
{
UndoCommand();
}
}
}
}
const wxChar* CCmdProcessor::GetCommandMsg( void )
{
//if( m_bCmdUpdated )
//{
return m_strLastCmdMsg.c_str();
//}
//else
// return NULL;
}
const wxChar* CCmdProcessor::GetLastError( void )
{
m_bErrorOccured = false;
return m_strLastError.c_str();
}
void CCmdProcessor::Clear( void )
{
m_pNowCommand = NULL;
m_iCmdIndex = -1;
m_bCmdUpdated = true; // <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
m_iLastCommandID = CMD_NULL;
// <20><><EFBFBD><EFBFBD> ť<><C5A5> <20>׿<EFBFBD><D7BF>ִ°<D6B4> <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
for_each( m_dqCmdList.begin(), m_dqCmdList.end(), DeleteData<ICommand*>() );
m_dqCmdList.clear();
}
//
//void CCmdProcessor::RemoveCommand( int iCmdType )
//{
// deque<ICommand*>::iterator iter = m_dqCmdList.begin();
// for( iter; iter != m_dqCmdList.end(); ++iter )
// {
// if( iCmdType == (*iter)->GetTypeID() )
// {
// iter = m_dqCmdList.erase( iter );
//
// if( m_dqCmdList.empty())
// break;
// }
// }
//}