logic: undo
undo with shared_ptr
This commit is contained in:
@@ -15,14 +15,6 @@ UndoRedoController::UndoRedoController()
|
||||
|
||||
UndoRedoController::~UndoRedoController()
|
||||
{
|
||||
for(MessageBase* m : m_redo)
|
||||
{
|
||||
delete m;
|
||||
}
|
||||
for(MessageBase* m : m_undo)
|
||||
{
|
||||
delete m;
|
||||
}
|
||||
}
|
||||
|
||||
UndoRedoView* UndoRedoController::getView()
|
||||
@@ -32,12 +24,9 @@ UndoRedoView* UndoRedoController::getView()
|
||||
|
||||
void UndoRedoController::handleMessage(MessageActivateTokens* message)
|
||||
{
|
||||
MessageActivateTokens* m = new MessageActivateTokens(message->tokenIds);
|
||||
m->isAggregation = message->isAggregation;
|
||||
m->isEdge = message->isEdge;
|
||||
m->UndoRedoType = message->UndoRedoType;
|
||||
|
||||
processMessage(m);
|
||||
std::shared_ptr<MessageActivateTokens> m = std::shared_ptr<MessageActivateTokens>(new MessageActivateTokens(*message));
|
||||
std::shared_ptr<MessageBase> msg = m;
|
||||
processMessage(msg);
|
||||
}
|
||||
|
||||
void UndoRedoController::handleMessage(MessageGraphNodeExpand* message)
|
||||
@@ -58,11 +47,10 @@ void UndoRedoController::handleMessage(MessageRedo* message)
|
||||
{
|
||||
if(!m_redo.empty())
|
||||
{
|
||||
MessageBase* m = m_redo.back();
|
||||
std::shared_ptr<MessageBase> m = m_redo.back();
|
||||
m_redo.pop_back();
|
||||
m->UndoRedoType = MessageBase::UndoType_Redo;
|
||||
m->dispatch();
|
||||
delete m;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,15 +58,14 @@ void UndoRedoController::handleMessage(MessageUndo* message)
|
||||
{
|
||||
if(!m_undo.empty())
|
||||
{
|
||||
MessageBase* m = m_undo.back();
|
||||
std::shared_ptr<MessageBase> m = m_undo.back();
|
||||
m_undo.pop_back();
|
||||
m->UndoRedoType = MessageBase::UndoType_Undo;
|
||||
m->dispatch();
|
||||
delete m;
|
||||
}
|
||||
}
|
||||
|
||||
void UndoRedoController::processMessage(MessageBase* message)
|
||||
void UndoRedoController::processMessage(std::shared_ptr<MessageBase> message)
|
||||
{
|
||||
switch(message->UndoRedoType)
|
||||
{
|
||||
@@ -95,7 +82,7 @@ void UndoRedoController::processMessage(MessageBase* message)
|
||||
}
|
||||
|
||||
|
||||
void UndoRedoController::processNormalMessage(MessageBase* message)
|
||||
void UndoRedoController::processNormalMessage(std::shared_ptr<MessageBase> message)
|
||||
{
|
||||
if(m_lastCommand != nullptr)
|
||||
{
|
||||
@@ -105,14 +92,13 @@ void UndoRedoController::processNormalMessage(MessageBase* message)
|
||||
m_lastCommand = message;
|
||||
while(!m_redo.empty())
|
||||
{
|
||||
MessageBase* m = m_redo.back();
|
||||
std::shared_ptr<MessageBase> m = m_redo.back();
|
||||
m_redo.pop_back();
|
||||
delete m;
|
||||
}
|
||||
getView()->setRedoButtonEnabled(false);
|
||||
}
|
||||
|
||||
void UndoRedoController::processRedoMessage(MessageBase* message)
|
||||
void UndoRedoController::processRedoMessage(std::shared_ptr<MessageBase> message)
|
||||
{
|
||||
m_undo.push_back(m_lastCommand);
|
||||
getView()->setUndoButtonEnabled(true);
|
||||
@@ -123,7 +109,7 @@ void UndoRedoController::processRedoMessage(MessageBase* message)
|
||||
}
|
||||
}
|
||||
|
||||
void UndoRedoController::processUndoMessage(MessageBase* message)
|
||||
void UndoRedoController::processUndoMessage(std::shared_ptr<MessageBase> message)
|
||||
{
|
||||
m_redo.push_back(m_lastCommand);
|
||||
getView()->setRedoButtonEnabled(true);
|
||||
|
||||
@@ -18,12 +18,6 @@
|
||||
|
||||
class UndoRedoView;
|
||||
|
||||
struct UndoContainer
|
||||
{
|
||||
MessageBase* message;
|
||||
std::vector<MessageBase*> subMessages;
|
||||
};
|
||||
|
||||
class UndoRedoController
|
||||
: public Controller
|
||||
, public MessageListener<MessageActivateTokens>
|
||||
@@ -50,15 +44,15 @@ private:
|
||||
virtual void handleMessage(MessageRedo* message);
|
||||
virtual void handleMessage(MessageUndo* message);
|
||||
|
||||
void processMessage(MessageBase* message);
|
||||
void processNormalMessage(MessageBase* message);
|
||||
void processRedoMessage(MessageBase* message);
|
||||
void processUndoMessage(MessageBase* message);
|
||||
void processMessage(std::shared_ptr<MessageBase> message);
|
||||
void processNormalMessage(std::shared_ptr<MessageBase> message);
|
||||
void processRedoMessage(std::shared_ptr<MessageBase> message);
|
||||
void processUndoMessage(std::shared_ptr<MessageBase> message);
|
||||
|
||||
MessageBase* m_lastCommand;
|
||||
std::shared_ptr<MessageBase> m_lastCommand;
|
||||
|
||||
std::deque<MessageBase*> m_undo;
|
||||
std::deque<MessageBase*> m_redo;
|
||||
std::deque<std::shared_ptr<MessageBase>> m_undo;
|
||||
std::deque<std::shared_ptr<MessageBase>> m_redo;
|
||||
};
|
||||
|
||||
#endif // UNDO_REDO_CONTROLLER_H
|
||||
|
||||
Reference in New Issue
Block a user