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:
Eberhard Graether
2015-06-24 01:15:31 +02:00
parent 3587b487dd
commit 7275082284
20 changed files with 262 additions and 95 deletions
+6
View File
@@ -26,6 +26,12 @@ public:
std::shared_ptr<MessageBase> message = std::make_shared<MessageType>(*dynamic_cast<MessageType*>(this));
MessageQueue::getInstance()->pushMessage(message);
}
virtual void dispatchImmediately()
{
std::shared_ptr<MessageBase> message = std::make_shared<MessageType>(*dynamic_cast<MessageType*>(this));
MessageQueue::getInstance()->processMessage(message, true);
}
};
#endif // MESSAGE_H
+11 -5
View File
@@ -8,13 +8,14 @@ class MessageBase
public:
enum UndoType
{
UndoType_Normal,
UndoType_Redo,
UndoType_Undo
UNDOTYPE_NORMAL,
UNDOTYPE_REDO,
UNDOTYPE_UNDO,
UNDOTYPE_IGNORE
};
MessageBase()
: undoRedoType(UndoType_Normal)
: undoRedoType(UNDOTYPE_NORMAL)
, m_sendAsTask(true)
{
}
@@ -38,7 +39,12 @@ public:
bool isFresh() const
{
return (undoRedoType == UndoType_Normal);
return (undoRedoType == UNDOTYPE_NORMAL);
}
bool isIgnorable() const
{
return (undoRedoType == UNDOTYPE_IGNORE);
}
UndoType undoRedoType;
+22 -10
View File
@@ -59,6 +59,18 @@ void MessageQueue::pushMessage(std::shared_ptr<MessageBase> message)
m_backMessageBuffer->push(message);
}
void MessageQueue::processMessage(std::shared_ptr<MessageBase> message, bool asNextTask)
{
if (m_sendMessagesAsTasks && message->sendAsTask())
{
sendMessageAsTask(message, asNextTask);
}
else
{
sendMessage(message);
}
}
void MessageQueue::startMessageLoopThreaded()
{
std::thread(&MessageQueue::startMessageLoop, this).detach();
@@ -189,14 +201,7 @@ void MessageQueue::processMessages()
m_frontMessageBuffer->pop();
}
if (m_sendMessagesAsTasks && message->sendAsTask())
{
sendMessageAsTask(message);
}
else
{
sendMessage(message);
}
processMessage(message, false);
}
}
@@ -224,7 +229,7 @@ void MessageQueue::sendMessage(std::shared_ptr<MessageBase> message)
}
}
void MessageQueue::sendMessageAsTask(std::shared_ptr<MessageBase> message) const
void MessageQueue::sendMessageAsTask(std::shared_ptr<MessageBase> message, bool asNextTask) const
{
std::shared_ptr<TaskGroupSequential> taskGroup = std::make_shared<TaskGroupSequential>();
@@ -244,5 +249,12 @@ void MessageQueue::sendMessageAsTask(std::shared_ptr<MessageBase> message) const
}
}
Task::dispatch(taskGroup);
if (asNextTask)
{
Task::dispatchNext(taskGroup);
}
else
{
Task::dispatch(taskGroup);
}
}
+2 -1
View File
@@ -17,6 +17,7 @@ public:
void unregisterListener(MessageListenerBase* listener);
void pushMessage(std::shared_ptr<MessageBase> message);
void processMessage(std::shared_ptr<MessageBase> message, bool asNextTask);
void startMessageLoopThreaded();
void startMessageLoop();
@@ -38,7 +39,7 @@ private:
void processMessages();
void sendMessage(std::shared_ptr<MessageBase> message);
void sendMessageAsTask(std::shared_ptr<MessageBase> message) const;
void sendMessageAsTask(std::shared_ptr<MessageBase> message, bool asNextTask) const;
std::shared_ptr<MessageBufferType> m_frontMessageBuffer;
std::shared_ptr<MessageBufferType> m_backMessageBuffer;
@@ -8,8 +8,9 @@ class MessageGraphNodeExpand
: public Message<MessageGraphNodeExpand>
{
public:
MessageGraphNodeExpand(Id tokenId)
MessageGraphNodeExpand(Id tokenId, bool expand)
: tokenId(tokenId)
, expand(expand)
{
}
@@ -19,6 +20,7 @@ public:
}
const Id tokenId;
const bool expand;
};
#endif // MESSAGE_GRAPH_NODE_EXPAND_H