forked from eden-emu/eden
		
	
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "commands.h"
 | |
| 
 | |
| CharCommand::CharCommand(XByteArray * xData, Cmd cmd, int charPos, char newChar, QUndoCommand *parent)
 | |
|     : QUndoCommand(parent)
 | |
| {
 | |
|     _xData = xData;
 | |
|     _charPos = charPos;
 | |
|     _newChar = newChar;
 | |
|     _cmd = cmd;
 | |
| }
 | |
| 
 | |
| bool CharCommand::mergeWith(const QUndoCommand *command)
 | |
| {
 | |
|     const CharCommand *nextCommand = static_cast<const CharCommand *>(command);
 | |
|     bool result = false;
 | |
| 
 | |
|     if (_cmd != remove)
 | |
|     {
 | |
|         if (nextCommand->_cmd == replace)
 | |
|             if (nextCommand->_charPos == _charPos)
 | |
|             {
 | |
|                 _newChar = nextCommand->_newChar;
 | |
|                 result = true;
 | |
|             }
 | |
|     }
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| void CharCommand::undo()
 | |
| {
 | |
|     switch (_cmd)
 | |
|     {
 | |
|         case insert:
 | |
|             _xData->remove(_charPos, 1);
 | |
|             break;
 | |
|         case replace:
 | |
|             _xData->replace(_charPos, _oldChar);
 | |
|             _xData->setDataChanged(_charPos, _wasChanged);
 | |
|             break;
 | |
|         case remove:
 | |
|             _xData->insert(_charPos, _oldChar);
 | |
|             _xData->setDataChanged(_charPos, _wasChanged);
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void CharCommand::redo()
 | |
| {
 | |
|     switch (_cmd)
 | |
|     {
 | |
|         case insert:
 | |
|             _xData->insert(_charPos, _newChar);
 | |
|             break;
 | |
|         case replace:
 | |
|             _oldChar = _xData->data()[_charPos];
 | |
|             _wasChanged = _xData->dataChanged(_charPos);
 | |
|             _xData->replace(_charPos, _newChar);
 | |
|             break;
 | |
|         case remove:
 | |
|             _oldChar = _xData->data()[_charPos];
 | |
|             _wasChanged = _xData->dataChanged(_charPos);
 | |
|             _xData->remove(_charPos, 1);
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| ArrayCommand::ArrayCommand(XByteArray * xData, Cmd cmd, int baPos, QByteArray newBa, int len, QUndoCommand *parent)
 | |
|     : QUndoCommand(parent)
 | |
| {
 | |
|     _cmd = cmd;
 | |
|     _xData = xData;
 | |
|     _baPos = baPos;
 | |
|     _newBa = newBa;
 | |
|     _len = len;
 | |
| }
 | |
| 
 | |
| void ArrayCommand::undo()
 | |
| {
 | |
|     switch (_cmd)
 | |
|     {
 | |
|         case insert:
 | |
|             _xData->remove(_baPos, _newBa.length());
 | |
|             break;
 | |
|         case replace:
 | |
|             _xData->replace(_baPos, _oldBa);
 | |
|             _xData->setDataChanged(_baPos, _wasChanged);
 | |
|             break;
 | |
|         case remove:
 | |
|             _xData->insert(_baPos, _oldBa);
 | |
|             _xData->setDataChanged(_baPos, _wasChanged);
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void ArrayCommand::redo()
 | |
| {
 | |
|     switch (_cmd)
 | |
|     {
 | |
|         case insert:
 | |
|             _xData->insert(_baPos, _newBa);
 | |
|             break;
 | |
|         case replace:
 | |
|             _oldBa = _xData->data().mid(_baPos, _len);
 | |
|             _wasChanged = _xData->dataChanged(_baPos, _len);
 | |
|             _xData->replace(_baPos, _newBa);
 | |
|             break;
 | |
|         case remove:
 | |
|             _oldBa = _xData->data().mid(_baPos, _len);
 | |
|             _wasChanged = _xData->dataChanged(_baPos, _len);
 | |
|             _xData->remove(_baPos, _len);
 | |
|             break;
 | |
|     }
 | |
| }
 | 
