logic: correctly undoing graph interactions by replaying actions since last active token change
This change introdoces a classification of commands by order in the undo stack. Undoing the last action will resend the message of the last active token change and all messages changing the ui after that.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "utility/messaging/type/MessageActivateEdge.h"
|
||||
#include "utility/messaging/type/MessageActivateFile.h"
|
||||
#include "utility/messaging/type/MessageActivateNode.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeBundleSplit.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeExpand.h"
|
||||
#include "utility/messaging/type/MessageGraphNodeMove.h"
|
||||
#include "utility/messaging/type/MessageLoadProject.h"
|
||||
@@ -25,6 +26,7 @@ class UndoRedoController
|
||||
, public MessageListener<MessageActivateEdge>
|
||||
, public MessageListener<MessageActivateFile>
|
||||
, public MessageListener<MessageActivateNode>
|
||||
, public MessageListener<MessageGraphNodeBundleSplit>
|
||||
, public MessageListener<MessageGraphNodeExpand>
|
||||
, public MessageListener<MessageGraphNodeMove>
|
||||
, public MessageListener<MessageLoadProject>
|
||||
@@ -40,9 +42,18 @@ public:
|
||||
UndoRedoView* getView();
|
||||
|
||||
private:
|
||||
struct Command
|
||||
{
|
||||
Command(std::shared_ptr<MessageBase> message, size_t order);
|
||||
|
||||
std::shared_ptr<MessageBase> message;
|
||||
size_t order;
|
||||
};
|
||||
|
||||
virtual void handleMessage(MessageActivateEdge* message);
|
||||
virtual void handleMessage(MessageActivateFile* message);
|
||||
virtual void handleMessage(MessageActivateNode* message);
|
||||
virtual void handleMessage(MessageGraphNodeBundleSplit* message);
|
||||
virtual void handleMessage(MessageGraphNodeExpand* message);
|
||||
virtual void handleMessage(MessageGraphNodeMove* message);
|
||||
virtual void handleMessage(MessageLoadProject* message);
|
||||
@@ -51,17 +62,17 @@ private:
|
||||
virtual void handleMessage(MessageSearch* message);
|
||||
virtual void handleMessage(MessageUndo* 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);
|
||||
void processCommand(const Command& command);
|
||||
void processNormalCommand(const Command& command);
|
||||
void processRedoCommand(const Command& command);
|
||||
void processUndoCommand(const Command& command);
|
||||
|
||||
void clear();
|
||||
|
||||
std::shared_ptr<MessageBase> m_lastCommand;
|
||||
Command m_lastCommand;
|
||||
|
||||
std::deque<std::shared_ptr<MessageBase>> m_undo;
|
||||
std::deque<std::shared_ptr<MessageBase>> m_redo;
|
||||
std::deque<Command> m_undo;
|
||||
std::deque<Command> m_redo;
|
||||
};
|
||||
|
||||
#endif // UNDO_REDO_CONTROLLER_H
|
||||
|
||||
Reference in New Issue
Block a user