diff --git a/src/app/qt/view/QtGraphView.cpp b/src/app/qt/view/QtGraphView.cpp index a2db41ba..93f79153 100644 --- a/src/app/qt/view/QtGraphView.cpp +++ b/src/app/qt/view/QtGraphView.cpp @@ -420,8 +420,20 @@ void QtGraphView::createTransition() if (!vanishingNodes.size() && !appearingNodes.size()) { - switchToNewGraphData(); - return; + bool nodesMoved = false; + for (const std::pair& p : remainingNodes) + { + if (p.first->getPosition() != p.second->getPosition() && p.first->getSize() != p.second->getSize()) + { + nodesMoved = true; + } + } + + if (!nodesMoved) + { + switchToNewGraphData(); + return; + } } for (const std::shared_ptr& node : m_nodes) diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 55d2c3e0..420a2062 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -259,6 +259,7 @@ add_files( utility/messaging/type/MessageAutoRefreshChanged.h utility/messaging/type/MessageFind.h utility/messaging/type/MessageFinishedParsing.h + utility/messaging/type/MessageFlushUpdates.h utility/messaging/type/MessageFocusIn.h utility/messaging/type/MessageFocusOut.h utility/messaging/type/MessageGraphNodeBundleSplit.h diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 844b805f..dc043bc7 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -15,8 +15,6 @@ GraphController::GraphController(StorageAccess* storageAccess) : m_storageAccess(storageAccess) - , m_rebuild(true) - , m_restore(false) { } @@ -26,18 +24,18 @@ GraphController::~GraphController() void GraphController::handleMessage(MessageActivateTokens* message) { - setRebuildState(message); - m_activeTokenIds = message->tokenIds; if (message->isEdge && message->tokenIds.size() == 1) { setActiveAndVisibility(message->tokenIds); - rebuildGraph(); + buildGraph(message); return; } createDummyGraphForTokenIds(message->tokenIds); + + buildGraph(message); } void GraphController::handleMessage(MessageFinishedParsing* message) @@ -45,6 +43,11 @@ void GraphController::handleMessage(MessageFinishedParsing* message) getView()->clear(); } +void GraphController::handleMessage(MessageFlushUpdates* message) +{ + buildGraph(message); +} + void GraphController::handleMessage(MessageFocusIn* message) { getView()->focusToken(message->tokenId); @@ -57,8 +60,6 @@ void GraphController::handleMessage(MessageFocusOut *message) void GraphController::handleMessage(MessageGraphNodeBundleSplit* message) { - setRebuildState(message); - for (size_t i = 0; i < m_dummyNodes.size(); i++) { DummyNode& node = m_dummyNodes[i]; @@ -86,13 +87,11 @@ void GraphController::handleMessage(MessageGraphNodeBundleSplit* message) GraphLayouter::layoutSpectralPrototype(m_dummyNodes, m_dummyEdges); GraphPostprocessor::doPostprocessing(m_dummyNodes); - rebuildGraph(); + buildGraph(message); } void GraphController::handleMessage(MessageGraphNodeExpand* message) { - setRebuildState(message); - DummyNode* node = findDummyNodeRecursive(m_dummyNodes, message->tokenId); if (node) { @@ -103,14 +102,12 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message) GraphPostprocessor::doPostprocessing(m_dummyNodes); - rebuildGraph(); + buildGraph(message); } } void GraphController::handleMessage(MessageGraphNodeMove* message) { - setRebuildState(message); - DummyNode* node = findDummyNodeRecursive(m_dummyNodes, message->tokenId); if (node) { @@ -122,7 +119,7 @@ void GraphController::handleMessage(MessageGraphNodeMove* message) } else { - rebuildGraph(); + buildGraph(message); } } } @@ -177,7 +174,6 @@ void GraphController::createDummyGraphForTokenIds(const std::vector& tokenId GraphPostprocessor::doPostprocessing(m_dummyNodes); m_graph = graph; - rebuildGraph(); } DummyNode GraphController::createDummyNodeTopDown(Node* node) @@ -199,7 +195,7 @@ DummyNode GraphController::createDummyNodeTopDown(Node* node) } DummyNode* oldNode = findDummyNodeRecursive(m_dummyNodes, node->getId()); - if (oldNode && !m_restore) + if (oldNode) { result.expanded = oldNode->isExpanded(); } @@ -930,28 +926,9 @@ DummyNode* GraphController::findDummyNodeAccessRecursive( return nullptr; } -void GraphController::setRebuildState(MessageBase* message) +void GraphController::buildGraph(MessageBase* message) { - m_restore = false; - - switch (message->undoRedoType) - { - case MessageBase::UNDOTYPE_UNDO: - m_restore = true; - case MessageBase::UNDOTYPE_NORMAL: - case MessageBase::UNDOTYPE_REDO: - m_rebuild = true; - break; - case MessageBase::UNDOTYPE_IGNORE: - m_restore = true; - m_rebuild = false; - break; - } -} - -void GraphController::rebuildGraph() -{ - if (m_rebuild) + if (message->undoRedoType == MessageBase::UNDOTYPE_NORMAL) { getView()->rebuildGraph(m_graph, m_dummyNodes, m_dummyEdges); m_graph.reset(); diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index d6757ae7..d68e3bd6 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -6,6 +6,7 @@ #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageActivateTokens.h" #include "utility/messaging/type/MessageFinishedParsing.h" +#include "utility/messaging/type/MessageFlushUpdates.h" #include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageGraphNodeBundleSplit.h" @@ -28,6 +29,7 @@ class GraphController : public Controller , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -41,6 +43,7 @@ public: private: virtual void handleMessage(MessageActivateTokens* message); virtual void handleMessage(MessageFinishedParsing* message); + virtual void handleMessage(MessageFlushUpdates* message); virtual void handleMessage(MessageFocusIn* message); virtual void handleMessage(MessageFocusOut* message); virtual void handleMessage(MessageGraphNodeBundleSplit* message); @@ -75,8 +78,7 @@ private: DummyNode* findDummyNodeRecursive(std::vector& nodes, Id tokenId) const; DummyNode* findDummyNodeAccessRecursive(std::vector& nodes, Id parentId, TokenComponentAccess::AccessType type) const; - void setRebuildState(MessageBase* message); - void rebuildGraph(); + void buildGraph(MessageBase* message); StorageAccess* m_storageAccess; @@ -86,8 +88,6 @@ private: std::vector m_activeTokenIds; std::shared_ptr m_graph; - bool m_rebuild; - bool m_restore; }; #endif // GRAPH_CONTROLLER_H diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index 3e053e0f..e0981e5e 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -1,6 +1,7 @@ #include "component/controller/UndoRedoController.h" #include "utility/logging/logging.h" +#include "utility/messaging/type/MessageFlushUpdates.h" #include "component/view/UndoRedoView.h" @@ -96,6 +97,8 @@ void UndoRedoController::handleMessage(MessageRedo* message) m_redo.pop_back(); m->undoRedoType = MessageBase::UNDOTYPE_REDO; m->dispatch(); + + MessageFlushUpdates().dispatch(); } } @@ -125,6 +128,8 @@ void UndoRedoController::handleMessage(MessageRefresh* message) msg->undoRedoType = MessageBase::UNDOTYPE_REDO; msg->dispatch(); + + MessageFlushUpdates().dispatch(); } void UndoRedoController::handleMessage(MessageSearch* message) @@ -139,9 +144,29 @@ void UndoRedoController::handleMessage(MessageSearch* message) processCommand(command); } +void UndoRedoController::handleMessage(MessageShowFile* message) +{ + if (m_lastCommand.message && m_lastCommand.message->getType() == message->getType() && + static_cast(m_lastCommand.message.get())->filePath == message->filePath) + { + return; + } + + Command command(std::make_shared(*message), 1); + processCommand(command); +} + +void UndoRedoController::handleMessage(MessageShowScope* message) +{ + Command command(std::make_shared(*message), 1); + processCommand(command); +} + void UndoRedoController::handleMessage(MessageUndo* message) { replayCommands(true); + + MessageFlushUpdates().dispatch(); } void UndoRedoController::replayCommands(bool removeLast) diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index 5f90b17d..c5226fba 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -16,6 +16,8 @@ #include "utility/messaging/type/MessageRedo.h" #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageSearch.h" +#include "utility/messaging/type/MessageShowFile.h" +#include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageUndo.h" #include "component/controller/Controller.h" @@ -35,6 +37,8 @@ class UndoRedoController , public MessageListener , public MessageListener , public MessageListener + , public MessageListener + , public MessageListener , public MessageListener { public: @@ -63,6 +67,8 @@ private: virtual void handleMessage(MessageRedo* message); virtual void handleMessage(MessageRefresh* message); virtual void handleMessage(MessageSearch* message); + virtual void handleMessage(MessageShowFile* message); + virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageUndo* message); void replayCommands(bool removeLast); diff --git a/src/lib/utility/messaging/type/MessageFlushUpdates.h b/src/lib/utility/messaging/type/MessageFlushUpdates.h new file mode 100644 index 00000000..0d7dbf60 --- /dev/null +++ b/src/lib/utility/messaging/type/MessageFlushUpdates.h @@ -0,0 +1,20 @@ +#ifndef MESSAGE_FLUSH_UPDATES_H +#define MESSAGE_FLUSH_UPDATES_H + +#include "utility/messaging/Message.h" + +class MessageFlushUpdates: + public Message +{ +public: + MessageFlushUpdates() + { + } + + static const std::string getStaticType() + { + return "MessageFlushUpdates"; + } +}; + +#endif // MESSAGE_FLUSH_UPDATES_H