diff --git a/bin/app/data/src/test2/main.cpp b/bin/app/data/src/test2/main.cpp index cc49a049..b819ac7e 100644 --- a/bin/app/data/src/test2/main.cpp +++ b/bin/app/data/src/test2/main.cpp @@ -1,16 +1,7 @@ #include "header.h" -#include - int main() { - std::vector> yay; - - for (Fooo a: yay) - { - a; - } - Foo ft; ft.bar(); return 0; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 255d7cf8..779a7967 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -35,6 +35,8 @@ add_files( add_files( LIB_FILES + component/controller/helper/ActivationTranslator.cpp + component/controller/helper/ActivationTranslator.h component/controller/helper/BucketGrid.cpp component/controller/helper/BucketGrid.h component/controller/helper/DummyEdge.h diff --git a/src/lib/component/controller/FeatureController.cpp b/src/lib/component/controller/FeatureController.cpp index a3dd9157..9454d9fe 100644 --- a/src/lib/component/controller/FeatureController.cpp +++ b/src/lib/component/controller/FeatureController.cpp @@ -8,6 +8,7 @@ FeatureController::FeatureController(StorageAccess* storageAccess) : m_storageAccess(storageAccess) + , m_activationTranslator(storageAccess) { } @@ -17,73 +18,38 @@ FeatureController::~FeatureController() void FeatureController::handleMessage(MessageActivateEdge* message) { - if (message->type == Edge::EDGE_AGGREGATION) + std::shared_ptr m = m_activationTranslator.translateMessage(message); + if (m) { - const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy); - const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy); - - MessageActivateTokens m(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId)); - m.isAggregation = true; - m.undoRedoType = message->undoRedoType; - m.dispatchImmediately(); - } - else - { - Id edgeId = message->tokenId; - - if (!message->isFresh()) - { - edgeId = m_storageAccess->getIdForEdge(message->type, message->fromNameHierarchy, message->toNameHierarchy); - } - - if (!edgeId) - { - return; - } - - MessageActivateTokens m(std::vector(1, edgeId)); - m.isEdge = true; - m.undoRedoType = message->undoRedoType; - m.setKeepContent(message->keepContent()); - m.dispatchImmediately(); + m->dispatchImmediately(); } } void FeatureController::handleMessage(MessageActivateFile* message) { - MessageActivateTokens m(std::vector(1, m_storageAccess->getTokenIdForFileNode(message->filePath))); - m.undoRedoType = message->undoRedoType; - m.setKeepContent(message->keepContent()); - m.dispatchImmediately(); + std::shared_ptr m = m_activationTranslator.translateMessage(message); + if (m) + { + m->dispatchImmediately(); + } } void FeatureController::handleMessage(MessageActivateNodes* message) { - std::vector nodeIds; - if (message->isFresh()) + std::shared_ptr m = m_activationTranslator.translateMessage(message); + if (m) { - for (const MessageActivateNodes::ActiveNode& node : message->nodes) - { - nodeIds.push_back(node.nodeId); - } - } - else - { - for (const MessageActivateNodes::ActiveNode& node : message->nodes) - { - Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(node.nameHierarchy); - if (nodeId > 0) - { - nodeIds.push_back(nodeId); - } - } + m->dispatchImmediately(); } +} - MessageActivateTokens m(nodeIds); - m.isFromSystem = message->isFromSystem; - m.undoRedoType = message->undoRedoType; - m.setKeepContent(message->keepContent()); - m.dispatchImmediately(); +void FeatureController::handleMessage(MessageSearch* message) +{ + std::shared_ptr m = m_activationTranslator.translateMessage(message); + if (m) + { + m->dispatchImmediately(); + } } void FeatureController::handleMessage(MessageActivateTokenLocations* message) @@ -98,22 +64,11 @@ void FeatureController::handleMessage(MessageActivateTokenLocations* message) nodeId, m_storageAccess->getNodeTypeForNodeWithId(nodeId), m_storageAccess->getNameHierarchyForNodeWithId(nodeId) - ); + ); } m.dispatchImmediately(); } -void FeatureController::handleMessage(MessageSearch* message) -{ - std::vector tokenIds = m_storageAccess->getTokenIdsForMatches(message->getMatches()); - tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds); - - MessageActivateTokens m(tokenIds); - m.undoRedoType = message->undoRedoType; - m.setKeepContent(message->keepContent()); - m.dispatchImmediately(); -} - void FeatureController::handleMessage(MessageSwitchColorScheme* message) { ApplicationSettings* settings = ApplicationSettings::getInstance().get(); @@ -131,3 +86,4 @@ void FeatureController::handleMessage(MessageZoom* message) MessageRefresh().refreshUiOnly().dispatch(); } + diff --git a/src/lib/component/controller/FeatureController.h b/src/lib/component/controller/FeatureController.h index c6de160d..30ca8d27 100644 --- a/src/lib/component/controller/FeatureController.h +++ b/src/lib/component/controller/FeatureController.h @@ -1,6 +1,8 @@ #ifndef FEATURE_CONTROLLER_H #define FEATURE_CONTROLLER_H +#include + #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageActivateEdge.h" #include "utility/messaging/type/MessageActivateFile.h" @@ -11,6 +13,7 @@ #include "utility/messaging/type/MessageZoom.h" #include "component/controller/Controller.h" +#include "component/controller/helper/ActivationTranslator.h" class StorageAccess; @@ -32,12 +35,13 @@ private: virtual void handleMessage(MessageActivateEdge* message); virtual void handleMessage(MessageActivateFile* message); virtual void handleMessage(MessageActivateNodes* message); - virtual void handleMessage(MessageActivateTokenLocations* message); virtual void handleMessage(MessageSearch* message); + virtual void handleMessage(MessageActivateTokenLocations* message); virtual void handleMessage(MessageSwitchColorScheme* message); virtual void handleMessage(MessageZoom* message); StorageAccess* m_storageAccess; + ActivationTranslator m_activationTranslator; }; #endif // FEATURE_CONTROLLER_H diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index 3ebc682a..1b09a61c 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/MessageActivateTokens.h" #include "utility/messaging/type/MessageFlushUpdates.h" #include "component/view/UndoRedoView.h" @@ -8,6 +9,7 @@ UndoRedoController::UndoRedoController(StorageAccess* storageAccess) : m_storageAccess(storageAccess) + , m_activationTranslator(storageAccess) , m_lastCommand(nullptr, 0) { } @@ -136,7 +138,7 @@ void UndoRedoController::handleMessage(MessageRefresh* message) return; } - if (!m_lastCommand.message) + if (requiresActivateFallbackToken()) { Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(NameHierarchy("main")); if (!nodeId) @@ -151,35 +153,35 @@ void UndoRedoController::handleMessage(MessageRefresh* message) nodeId, m_storageAccess->getNodeTypeForNodeWithId(nodeId), m_storageAccess->getNameHierarchyForNodeWithId(nodeId) - ); + ); m.isFromSystem = true; m.dispatch(); } - - return; - } - - if (m_lastCommand.order > 0) - { - replayCommands(false); - } - - std::shared_ptr msg = m_lastCommand.message; - - if (m_undo.size()) - { - m_lastCommand = m_undo.back(); - m_undo.pop_back(); } else { - m_lastCommand.message.reset(); + if (m_lastCommand.order > 0) + { + replayCommands(false); + } + + std::shared_ptr msg = m_lastCommand.message; + + if (m_undo.size() > 0) + { + m_lastCommand = m_undo.back(); + m_undo.pop_back(); + } + else + { + m_lastCommand.message.reset(); + } + + msg->undoRedoType = MessageBase::UNDOTYPE_REDO; + msg->dispatch(); + + MessageFlushUpdates().dispatch(); } - - msg->undoRedoType = MessageBase::UNDOTYPE_REDO; - msg->dispatch(); - - MessageFlushUpdates().dispatch(); } void UndoRedoController::handleMessage(MessageSearch* message) @@ -328,3 +330,57 @@ void UndoRedoController::clear() getView()->setUndoButtonEnabled(false); getView()->setRedoButtonEnabled(false); } + +bool UndoRedoController::requiresActivateFallbackToken() const +{ + bool activateFallbackToken = true; + if (m_lastCommand.message) + { + if (m_lastCommand.order == 0) + { + activateFallbackToken = !checkCommandCausesTokenActivation(m_lastCommand); + } + else + { + for (int i = m_undo.size() - 1; i >= 0; i--) + { + if (m_undo[i].order == 0) + { + activateFallbackToken = !checkCommandCausesTokenActivation(m_undo[i]); + break; + } + } + } + } + return activateFallbackToken; +} + +bool UndoRedoController::checkCommandCausesTokenActivation(const Command& command) const +{ + MessageBase* commandMessage = command.message.get(); + if (commandMessage) + { + std::shared_ptr m; + std::string commandMessageTypeString = commandMessage->getType(); + if (commandMessageTypeString == MessageActivateEdge::getStaticType()) + { + m = m_activationTranslator.translateMessage(dynamic_cast(commandMessage)); + } + else if (commandMessageTypeString == MessageActivateFile::getStaticType()) + { + m = m_activationTranslator.translateMessage(dynamic_cast(commandMessage)); + } + else if (commandMessageTypeString == MessageActivateNodes::getStaticType()) + { + MessageActivateNodes inputMessage(*dynamic_cast(commandMessage)); + inputMessage.undoRedoType = MessageBase::UNDOTYPE_REDO; + m = m_activationTranslator.translateMessage(&inputMessage); + } + else if (commandMessageTypeString == MessageSearch::getStaticType()) + { + m = m_activationTranslator.translateMessage(dynamic_cast(commandMessage)); + } + return (m && m->tokenIds.size() > 0); + } + return false; +} diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index 924bc29e..2de8af22 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -20,6 +20,7 @@ #include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageUndo.h" +#include "component/controller/helper/ActivationTranslator.h" #include "component/controller/Controller.h" class StorageAccess; @@ -81,6 +82,10 @@ private: void clear(); + bool requiresActivateFallbackToken() const; + bool checkCommandCausesTokenActivation(const Command& command) const; + + ActivationTranslator m_activationTranslator; StorageAccess* m_storageAccess; Command m_lastCommand; diff --git a/src/lib/component/controller/helper/ActivationTranslator.cpp b/src/lib/component/controller/helper/ActivationTranslator.cpp new file mode 100644 index 00000000..c2215d56 --- /dev/null +++ b/src/lib/component/controller/helper/ActivationTranslator.cpp @@ -0,0 +1,100 @@ +#include "component/controller/helper/ActivationTranslator.h" + +#include "data/access/StorageAccess.h" +#include "utility/messaging/type/MessageActivateEdge.h" +#include "utility/messaging/type/MessageActivateFile.h" +#include "utility/messaging/type/MessageActivateNodes.h" +#include "utility/messaging/type/MessageActivateTokens.h" +#include "utility/messaging/type/MessageSearch.h" + +ActivationTranslator::ActivationTranslator(StorageAccess* storageAccess) + : m_storageAccess(storageAccess) +{ +} + +ActivationTranslator::~ActivationTranslator() +{ +} + +std::shared_ptr ActivationTranslator::translateMessage(const MessageActivateEdge* message) const +{ + std::shared_ptr m; + if (message->type == Edge::EDGE_AGGREGATION) + { + const Id sourceId = m_storageAccess->getIdForNodeWithNameHierarchy(message->fromNameHierarchy); + const Id targetId = m_storageAccess->getIdForNodeWithNameHierarchy(message->toNameHierarchy); + + m = std::make_shared(m_storageAccess->getTokenIdsForAggregationEdge(sourceId, targetId)); + m->isAggregation = true; + m->undoRedoType = message->undoRedoType; + } + else + { + Id edgeId = message->tokenId; + + if (!message->isFresh()) + { + edgeId = m_storageAccess->getIdForEdge(message->type, message->fromNameHierarchy, message->toNameHierarchy); + } + + if (edgeId) + { + m = std::make_shared(std::vector(1, edgeId)); + m->isEdge = true; + m->undoRedoType = message->undoRedoType; + m->setKeepContent(message->keepContent()); + } + } + return m; +} + +std::shared_ptr ActivationTranslator::translateMessage(const MessageActivateFile* message) const +{ + std::shared_ptr m; + m = std::make_shared(std::vector(1, m_storageAccess->getTokenIdForFileNode(message->filePath))); + m->undoRedoType = message->undoRedoType; + m->setKeepContent(message->keepContent()); + return m; +} + +std::shared_ptr ActivationTranslator::translateMessage(const MessageActivateNodes* message) const +{ + std::vector nodeIds; + if (message->isFresh()) + { + for (const MessageActivateNodes::ActiveNode& node : message->nodes) + { + nodeIds.push_back(node.nodeId); + } + } + else + { + for (const MessageActivateNodes::ActiveNode& node : message->nodes) + { + Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(node.nameHierarchy); + if (nodeId > 0) + { + nodeIds.push_back(nodeId); + } + } + } + + std::shared_ptr m; + m = std::make_shared(nodeIds); + m->isFromSystem = message->isFromSystem; + m->undoRedoType = message->undoRedoType; + m->setKeepContent(message->keepContent()); + return m; +} + +std::shared_ptr ActivationTranslator::translateMessage(const MessageSearch* message) const +{ + std::vector tokenIds = m_storageAccess->getTokenIdsForMatches(message->getMatches()); + tokenIds = m_storageAccess->getActiveTokenIdsForTokenIds(tokenIds); + + std::shared_ptr m; + m = std::make_shared(tokenIds); + m->undoRedoType = message->undoRedoType; + m->setKeepContent(message->keepContent()); + return m; +} diff --git a/src/lib/component/controller/helper/ActivationTranslator.h b/src/lib/component/controller/helper/ActivationTranslator.h new file mode 100644 index 00000000..33d13cc8 --- /dev/null +++ b/src/lib/component/controller/helper/ActivationTranslator.h @@ -0,0 +1,28 @@ +#ifndef ACTIVATION_TRANSLATOR_H +#define ACTIVATION_TRANSLATOR_H + +#include + +class MessageActivateEdge; +class MessageActivateFile; +class MessageActivateNodes; +class MessageActivateTokens; +class MessageSearch; +class StorageAccess; + +class ActivationTranslator +{ +public: + ActivationTranslator(StorageAccess* storageAccess); + ~ActivationTranslator(); + + std::shared_ptr translateMessage(const MessageActivateEdge* message) const; + std::shared_ptr translateMessage(const MessageActivateFile* message) const; + std::shared_ptr translateMessage(const MessageActivateNodes* message) const; + std::shared_ptr translateMessage(const MessageSearch* message) const; + +private: + StorageAccess* m_storageAccess; +}; + +#endif // ACTIVATION_TRANSLATOR_H diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index 5a40da72..201bb64a 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -970,7 +970,10 @@ std::vector Storage::getTokenIdsForMatches(const std::vector& m for (const SearchMatch& match : matches) { SearchNode* searchNode = m_tokenIndex.getNode(match.nameHierarchy); - utility::append(idSet, searchNode->getTokenIds()); + if (searchNode) + { + utility::append(idSet, searchNode->getTokenIds()); + } } std::vector ids;