diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index c3a1f6e4..8c141fc8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -13,6 +13,8 @@ add_files( component/controller/helper/SnippetMerger.cpp component/controller/helper/SnippetMerger.h + component/controller/ActivationController.cpp + component/controller/ActivationController.h component/controller/BookmarkController.cpp component/controller/BookmarkController.h component/controller/CodeController.cpp @@ -21,8 +23,6 @@ add_files( component/controller/Controller.h component/controller/ErrorController.cpp component/controller/ErrorController.h - component/controller/FeatureController.cpp - component/controller/FeatureController.h component/controller/GraphController.cpp component/controller/GraphController.h component/controller/IDECommunicationController.cpp @@ -104,7 +104,7 @@ add_files( data/bookmark/EdgeBookmark.h data/bookmark/NodeBookmark.cpp data/bookmark/NodeBookmark.h - + data/fulltextsearch/FullTextSearchIndex.cpp data/fulltextsearch/FullTextSearchIndex.h data/fulltextsearch/SuffixArray.cpp @@ -135,7 +135,7 @@ add_files( data/graph/Node.h data/graph/Token.cpp data/graph/Token.h - + data/indexer/Indexer.h data/indexer/IndexerBase.cpp data/indexer/IndexerBase.h @@ -271,7 +271,7 @@ add_files( utility/interprocess/SharedQueue.h utility/interprocess/SharedUUIDManager.cpp utility/interprocess/SharedUUIDManager.h - + utility/logging/ConsoleLogger.cpp utility/logging/ConsoleLogger.h utility/logging/FileLogger.cpp @@ -347,6 +347,7 @@ add_files( utility/messaging/type/MessageRefresh.h utility/messaging/type/MessageResetZoom.h utility/messaging/type/MessageScrollCode.h + utility/messaging/type/MessageScrollGraph.h utility/messaging/type/MessageScrollToLine.h utility/messaging/type/MessageSearch.h utility/messaging/type/MessageSearchAutocomplete.h diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp index 5f24f953..ba20e4c7 100644 --- a/src/lib/component/ComponentFactory.cpp +++ b/src/lib/component/ComponentFactory.cpp @@ -1,10 +1,10 @@ #include "component/ComponentFactory.h" #include "component/Component.h" +#include "component/controller/ActivationController.h" #include "component/controller/BookmarkController.h" #include "component/controller/CodeController.h" #include "component/controller/ErrorController.h" -#include "component/controller/FeatureController.h" #include "component/controller/GraphController.h" #include "component/controller/LogController.h" #include "component/controller/RefreshController.h" @@ -50,6 +50,13 @@ StorageAccess* ComponentFactory::getStorageAccess() const return m_storageAccess; } +std::shared_ptr ComponentFactory::createActivationComponent() +{ + std::shared_ptr controller = std::make_shared(m_storageAccess); + + return std::make_shared(nullptr, controller); +} + std::shared_ptr ComponentFactory::createBookmarkComponent(ViewLayout* viewLayout) { std::shared_ptr view = m_viewFactory->createBookmarkView(viewLayout); @@ -84,13 +91,6 @@ std::shared_ptr ComponentFactory::createLogComponent(ViewLayout* view return std::make_shared(view, controller); } -std::shared_ptr ComponentFactory::createFeatureComponent() -{ - std::shared_ptr controller = std::make_shared(m_storageAccess); - - return std::make_shared(nullptr, controller); -} - std::shared_ptr ComponentFactory::createGraphComponent(ViewLayout* viewLayout) { std::shared_ptr view = m_viewFactory->createGraphView(viewLayout); diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h index 5c3990bd..a0a49060 100644 --- a/src/lib/component/ComponentFactory.h +++ b/src/lib/component/ComponentFactory.h @@ -19,10 +19,10 @@ public: ViewFactory* getViewFactory() const; StorageAccess* getStorageAccess() const; + std::shared_ptr createActivationComponent(); std::shared_ptr createBookmarkComponent(ViewLayout* viewLayout); std::shared_ptr createCodeComponent(ViewLayout* viewLayout); std::shared_ptr createErrorComponent(ViewLayout* viewLayout); - std::shared_ptr createFeatureComponent(); std::shared_ptr createGraphComponent(ViewLayout* viewLayout); std::shared_ptr createLogComponent(ViewLayout* viewLayout); std::shared_ptr createRefreshComponent(ViewLayout* viewLayout); diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index cf193d67..aed46853 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -54,8 +54,8 @@ void ComponentManager::setup(ViewLayout* viewLayout) std::shared_ptr statusBarComponent = m_componentFactory->createStatusBarComponent(viewLayout); m_components.push_back(statusBarComponent); - std::shared_ptr featureComponent = m_componentFactory->createFeatureComponent(); - m_components.push_back(featureComponent); + std::shared_ptr activationComponent = m_componentFactory->createActivationComponent(); + m_components.push_back(activationComponent); m_dialogView = m_componentFactory->getViewFactory()->createDialogView(viewLayout, m_componentFactory->getStorageAccess()); diff --git a/src/lib/component/controller/FeatureController.cpp b/src/lib/component/controller/ActivationController.cpp similarity index 53% rename from src/lib/component/controller/FeatureController.cpp rename to src/lib/component/controller/ActivationController.cpp index af262452..eae27cb6 100644 --- a/src/lib/component/controller/FeatureController.cpp +++ b/src/lib/component/controller/ActivationController.cpp @@ -1,4 +1,4 @@ -#include "component/controller/FeatureController.h" +#include "component/controller/ActivationController.h" #include "data/access/StorageAccess.h" #include "settings/ApplicationSettings.h" @@ -13,58 +13,50 @@ #include "utility/messaging/type/MessageStatus.h" #include "utility/messaging/type/MessageScrollToLine.h" -FeatureController::FeatureController(StorageAccess* storageAccess) +ActivationController::ActivationController(StorageAccess* storageAccess) : m_storageAccess(storageAccess) { } -FeatureController::~FeatureController() +ActivationController::~ActivationController() { } -void FeatureController::clear() +void ActivationController::clear() { } -void FeatureController::handleMessage(MessageActivateEdge* message) +void ActivationController::handleMessage(MessageActivateEdge* message) { if (message->isAggregation()) { - // TODO: validate aggregationIds - MessageActivateTokens m(message, message->aggregationIds); + MessageActivateTokens m(message); + m.tokenIds = message->aggregationIds; m.setKeepContent(false); m.isAggregation = true; + m.tokenNames.push_back(NameHierarchy(message->getFullName())); m.dispatchImmediately(); } else { - Id edgeId = message->tokenId; - - if (message->isReplayed()) - { - edgeId = m_storageAccess->getIdForEdge(message->type, message->fromNameHierarchy, message->toNameHierarchy); - } - - std::vector ids; - if (edgeId) - { - ids.push_back(edgeId); - } - - MessageActivateTokens m(message, ids); + MessageActivateTokens m(message); + m.tokenIds.push_back(message->tokenId); m.isEdge = true; - m.unknownNames = std::vector(1, message->getFullName()); + m.tokenNames.push_back(NameHierarchy(message->getFullName())); m.dispatchImmediately(); } } -void FeatureController::handleMessage(MessageActivateFile* message) +void ActivationController::handleMessage(MessageActivateFile* message) { Id fileId = m_storageAccess->getTokenIdForFileNode(message->filePath); if (fileId) { - MessageActivateTokens(message, std::vector(1, fileId)).dispatchImmediately(); + MessageActivateTokens m(message); + m.tokenIds.push_back(fileId); + m.tokenNames.push_back(message->filePath.str()); + m.dispatchImmediately(); } else { @@ -74,8 +66,6 @@ void FeatureController::handleMessage(MessageActivateFile* message) true, true ); - msg.setIsReplayed(message->isReplayed()); - msg.setKeepContent(message->keepContent()); msg.dispatchImmediately(); } @@ -85,35 +75,22 @@ void FeatureController::handleMessage(MessageActivateFile* message) } } -void FeatureController::handleMessage(MessageActivateNodes* message) +void ActivationController::handleMessage(MessageActivateNodes* message) { - std::vector nodeIds; - + MessageActivateTokens m(message); for (const MessageActivateNodes::ActiveNode& node : message->nodes) { - if (node.nodeId) + Id nodeId = node.nodeId ? node.nodeId : m_storageAccess->getIdForNodeWithNameHierarchy(node.nameHierarchy); + if (nodeId > 0) { - nodeIds.push_back(node.nodeId); + m.tokenIds.push_back(nodeId); } - else - { - Id nodeId = m_storageAccess->getIdForNodeWithNameHierarchy(node.nameHierarchy); - if (nodeId > 0) - { - nodeIds.push_back(nodeId); - } - } - } - - MessageActivateTokens m(message, nodeIds); - for (const MessageActivateNodes::ActiveNode& node : message->nodes) - { - m.unknownNames.push_back(node.nameHierarchy.getQualifiedName()); + m.tokenNames.push_back(node.nameHierarchy); } m.dispatchImmediately(); } -void FeatureController::handleMessage(MessageSearch* message) +void ActivationController::handleMessage(MessageSearch* message) { const std::vector& matches = message->getMatches(); @@ -127,17 +104,13 @@ void FeatureController::handleMessage(MessageSearch* message) { case SearchMatch::COMMAND_ALL: { - MessageActivateAll msg; - msg.setIsReplayed(message->isReplayed()); - msg.dispatchImmediately(); + MessageActivateAll().dispatchImmediately(); return; } case SearchMatch::COMMAND_ERROR: { - MessageShowErrors msg(m_storageAccess->getErrorCount()); - msg.setIsReplayed(true); - msg.dispatch(); + MessageShowErrors(m_storageAccess->getErrorCount()).dispatch(); MessageFlushUpdates().dispatch(); return; } @@ -151,41 +124,34 @@ void FeatureController::handleMessage(MessageSearch* message) } } - std::vector tokenIds = m_storageAccess->getTokenIdsForMatches(matches); - - MessageActivateTokens m(message, tokenIds); - for (const SearchMatch& match : matches) - { - m.unknownNames.push_back(match.name); - } - if (!message->isReplayed()) - { - m.isFromSearch = true; - } + MessageActivateTokens m(message); + m.tokenIds = message->getTokenIdsOfMatches(); + m.searchMatches = matches; + m.tokenNames = m_storageAccess->getNameHierarchiesForNodeIds(m.tokenIds); + m.isFromSearch = true; m.dispatchImmediately(); } -void FeatureController::handleMessage(MessageActivateTokenIds* message) +void ActivationController::handleMessage(MessageActivateTokenIds* message) { - MessageActivateTokens(message, message->tokenIds).dispatchImmediately(); + MessageActivateTokens m(message); + m.tokenIds = message->tokenIds; + m.searchMatches = m_storageAccess->getSearchMatchesForTokenIds(message->tokenIds); + m.tokenNames = m_storageAccess->getNameHierarchiesForNodeIds(m.tokenIds); + m.dispatchImmediately(); } -void FeatureController::handleMessage(MessageActivateTokenLocations* message) +void ActivationController::handleMessage(MessageActivateTokenLocations* message) { - std::vector nodeIds = m_storageAccess->getNodeIdsForLocationIds(message->locationIds); MessageActivateNodes m; - for (Id nodeId : nodeIds) + for (Id nodeId : m_storageAccess->getNodeIdsForLocationIds(message->locationIds)) { - m.addNode( - nodeId, - m_storageAccess->getNodeTypeForNodeWithId(nodeId), - m_storageAccess->getNameHierarchyForNodeWithId(nodeId) - ); + m.addNode(nodeId, m_storageAccess->getNameHierarchyForNodeWithId(nodeId)); } m.dispatchImmediately(); } -void FeatureController::handleMessage(MessageResetZoom* message) +void ActivationController::handleMessage(MessageResetZoom* message) { ApplicationSettings* settings = ApplicationSettings::getInstance().get(); int fontSizeStd = settings->getFontSizeStd(); @@ -201,7 +167,7 @@ void FeatureController::handleMessage(MessageResetZoom* message) MessageStatus("Zoom: 100%").dispatch(); } -void FeatureController::handleMessage(MessageZoom* message) +void ActivationController::handleMessage(MessageZoom* message) { bool zoomIn = message->zoomIn; diff --git a/src/lib/component/controller/FeatureController.h b/src/lib/component/controller/ActivationController.h similarity index 88% rename from src/lib/component/controller/FeatureController.h rename to src/lib/component/controller/ActivationController.h index c4b317fc..75235f2c 100644 --- a/src/lib/component/controller/FeatureController.h +++ b/src/lib/component/controller/ActivationController.h @@ -1,5 +1,5 @@ -#ifndef FEATURE_CONTROLLER_H -#define FEATURE_CONTROLLER_H +#ifndef ACTIVATION_CONTROLLER_H +#define ACTIVATION_CONTROLLER_H #include @@ -17,7 +17,7 @@ class StorageAccess; -class FeatureController +class ActivationController : public Controller , public MessageListener , public MessageListener @@ -29,8 +29,8 @@ class FeatureController , public MessageListener { public: - FeatureController(StorageAccess* storageAccess); - ~FeatureController(); + ActivationController(StorageAccess* storageAccess); + ~ActivationController(); virtual void clear(); @@ -47,4 +47,4 @@ private: StorageAccess* m_storageAccess; }; -#endif // FEATURE_CONTROLLER_H +#endif // ACTIVATION_CONTROLLER_H diff --git a/src/lib/component/controller/BookmarkController.cpp b/src/lib/component/controller/BookmarkController.cpp index bbaa9042..1fe750e2 100644 --- a/src/lib/component/controller/BookmarkController.cpp +++ b/src/lib/component/controller/BookmarkController.cpp @@ -47,7 +47,7 @@ std::vector> BookmarkController::getAllBookmarks() con LOG_INFO_STREAM(<< "Retrieving all bookmarks"); std::vector> bookmarks; - + std::vector nodeBookmarks = m_storageAccess->getAllNodeBookmarks(); for (unsigned int i = 0; i < nodeBookmarks.size(); i++) @@ -91,7 +91,7 @@ std::vector> BookmarkController::getAllBookmarks() con } } - + return bookmarks; } @@ -183,7 +183,7 @@ void BookmarkController::handleMessage(MessageActivateBookmark* message) for (unsigned int i = 0; i < baseBookmark.getTokenNames().size(); i++) { NameHierarchy nh = NameHierarchy::deserialize(baseBookmark.getTokenNames()[i]); - activateNodes.addNode(nh); + activateNodes.addNode(0, nh); } activateNodes.dispatch(); @@ -208,7 +208,7 @@ void BookmarkController::handleMessage(MessageActivateBookmark* message) for (unsigned int i = 0; i < bookmark->getTokenNames().size(); i++) { NameHierarchy nh = NameHierarchy::deserialize(bookmark->getTokenNames()[i]); - activateNodes.addNode(nh); + activateNodes.addNode(0, nh); } activateNodes.dispatch(); @@ -234,7 +234,7 @@ void BookmarkController::handleMessage(MessageActivateTokens* message) int typeId = edge.type; tokenTypes.push_back(typeId); - + NameHierarchy sourceHierarchy = m_storageAccess->getNameHierarchyForNodeWithId(edge.sourceNodeId); NameHierarchy targetHierarchy = m_storageAccess->getNameHierarchyForNodeWithId(edge.targetNodeId); @@ -527,7 +527,7 @@ std::vector BookmarkController::getTokenTypes(const std::vector& ids) c int type = m_storageAccess->getNodeTypeForNodeWithId(ids[i]); types.push_back(type); } - + return types; } diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index c43c808c..abc2f83e 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -105,17 +105,18 @@ void CodeController::handleMessage(MessageActivateTokens* message) CodeView* view = getView(); - if (!message->keepContent()) - { - view->clearCodeSnippets(); - } - std::vector activeTokenIds = message->tokenIds; if (!activeTokenIds.size()) { + view->clear(); return; } + if (!message->keepContent()) + { + view->clearCodeSnippets(); + } + Id declarationId = 0; // 0 means that no token is found. if (!message->isAggregation) { @@ -139,17 +140,21 @@ void CodeController::handleMessage(MessageActivateTokens* message) else { m_collection = m_storageAccess->getTokenLocationsForTokenIds(activeTokenIds); - view->showCodeSnippets(getSnippetsForActiveTokenLocations(m_collection.get(), declarationId), activeTokenIds, true); - m_scrollToDefinition = !message->isReplayed() || message->isLast(); + view->showCodeSnippets( + getSnippetsForActiveTokenLocations(m_collection.get(), declarationId), + activeTokenIds, + !message->isReplayed() || message->isReplayCleared() + ); + m_scrollToDefinition = !message->isReplayed() || message->isReplayCleared(); size_t fileCount = m_collection->getTokenLocationFileCount(); size_t referenceCount = m_collection->getTokenLocationCount(); std::stringstream ss; - if (message->unknownNames.size()) + if (message->tokenNames.size()) { - ss << "Activate \"" << message->unknownNames[0] << "\": "; + ss << "Activate \"" << message->tokenNames[0].getQualifiedName() << "\": "; } ss << message->tokenIds.size() << ' '; @@ -179,15 +184,22 @@ void CodeController::handleMessage(MessageChangeFileView* message) } CodeView* view = getView(); + bool inListMode = view->isInListMode(); - switch (message->state) + MessageChangeFileView::FileState state = message->state; + if (state == MessageChangeFileView::FILE_DEFAULT_FOR_MODE) + { + state = inListMode ? MessageChangeFileView::FILE_SNIPPETS : MessageChangeFileView::FILE_MAXIMIZED; + } + + switch (state) { case MessageChangeFileView::FILE_MINIMIZED: view->setFileState(message->filePath, CodeView::FILE_MINIMIZED); break; case MessageChangeFileView::FILE_SNIPPETS: - if (message->needsData) + if (message->needsData && inListMode) { std::shared_ptr file = m_collection->getTokenLocationFileByPath(message->filePath); if (!file) @@ -250,6 +262,8 @@ void CodeController::handleMessage(MessageChangeFileView* message) view->setFileState(message->filePath, CodeView::FILE_MAXIMIZED); break; + default: + break; } showContents(message); diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 7dd82dd4..9eb166e2 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -32,6 +32,8 @@ void GraphController::handleMessage(MessageActivateAll* message) m_activeNodeIds.clear(); m_activeEdgeIds.clear(); + m_dummyGraphNodes.clear(); + createDummyGraphForTokenIdsAndSetActiveAndVisibility(std::vector(), m_storageAccess->getGraphForAll()); bundleNodesByType(); @@ -104,6 +106,14 @@ void GraphController::handleMessage(MessageFlushUpdates* message) buildGraph(message, true, !message->keepContent()); } +void GraphController::handleMessage(MessageScrollGraph* message) +{ + if (message->isReplayed()) + { + getView()->scrollToValues(message->xValue, message->yValue); + } +} + void GraphController::handleMessage(MessageSearchFullText* message) { clear(); @@ -247,7 +257,7 @@ void GraphController::handleMessage(MessageShowErrors* message) void GraphController::handleMessage(MessageShowReference* message) { - if (!message->tokenId) + if (!message->tokenId || !message->animated) { return; } diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index 1e54c18b..7384dc87 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -14,6 +14,7 @@ #include "utility/messaging/type/MessageGraphNodeBundleSplit.h" #include "utility/messaging/type/MessageGraphNodeExpand.h" #include "utility/messaging/type/MessageGraphNodeMove.h" +#include "utility/messaging/type/MessageScrollGraph.h" #include "utility/messaging/type/MessageSearchFullText.h" #include "utility/messaging/type/MessageShowErrors.h" #include "utility/messaging/type/MessageShowReference.h" @@ -40,6 +41,7 @@ class GraphController , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -57,6 +59,7 @@ private: virtual void handleMessage(MessageGraphNodeBundleSplit* message); virtual void handleMessage(MessageGraphNodeExpand* message); virtual void handleMessage(MessageGraphNodeMove* message); + virtual void handleMessage(MessageScrollGraph* message); virtual void handleMessage(MessageSearchFullText* message); virtual void handleMessage(MessageShowErrors* message); virtual void handleMessage(MessageShowReference* message); diff --git a/src/lib/component/controller/SearchController.cpp b/src/lib/component/controller/SearchController.cpp index 6ae4973f..3a78b45f 100644 --- a/src/lib/component/controller/SearchController.cpp +++ b/src/lib/component/controller/SearchController.cpp @@ -13,30 +13,42 @@ SearchController::~SearchController() { } +void SearchController::handleMessage(MessageActivateAll* message) +{ + getView()->setMatches(std::vector(1, SearchMatch::createCommand(SearchMatch::COMMAND_ALL))); +} + void SearchController::handleMessage(MessageActivateTokens* message) { - if (!message->isFromSearch) + if ((message->isFromSearch && !message->isReplayed()) || message->keepContent()) { - if (!message->keepContent() && message->tokenIds.size()) + return; + } + + if (message->searchMatches.size()) + { + getView()->setMatches(message->searchMatches); + } + else if (message->tokenIds.size()) + { + getView()->setMatches(m_storageAccess->getSearchMatchesForTokenIds(message->tokenIds)); + } + else if (message->tokenNames.size()) + { + std::vector matches; + getView()->setMatches(matches); + + for (const NameHierarchy& name : message->tokenNames) { - getView()->setMatches(m_storageAccess->getSearchMatchesForTokenIds(message->tokenIds)); + matches.push_back(SearchMatch(name.getQualifiedName())); } - else if ((message->isReplayed() || message->unknownNames.size()) && !message->tokenIds.size()) + + if (!matches.size()) { - std::vector matches; - - for (const std::string& name : message->unknownNames) - { - matches.push_back(SearchMatch(name)); - } - - if (!matches.size()) - { - matches.push_back(SearchMatch("")); - } - - getView()->setMatches(matches); + matches.push_back(SearchMatch("")); } + + getView()->setMatches(matches); } } @@ -52,21 +64,6 @@ void SearchController::handleMessage(MessageFind* message) } } -void SearchController::handleMessage(MessageSearch* message) -{ - const std::vector& matches = message->getMatches(); - - for (const SearchMatch& match : matches) - { - if (match.searchType == SearchMatch::SEARCH_COMMAND) - { - SearchMatch m = SearchMatch::createCommand(SearchMatch::getCommandType(match.getFullName())); - getView()->setMatches(std::vector(1, m)); - return; - } - } -} - void SearchController::handleMessage(MessageSearchAutocomplete* message) { TRACE("search autocomplete"); diff --git a/src/lib/component/controller/SearchController.h b/src/lib/component/controller/SearchController.h index c33bbaa4..3644166b 100644 --- a/src/lib/component/controller/SearchController.h +++ b/src/lib/component/controller/SearchController.h @@ -3,9 +3,9 @@ #include "component/controller/Controller.h" #include "utility/messaging/MessageListener.h" +#include "utility/messaging/type/MessageActivateAll.h" #include "utility/messaging/type/MessageActivateTokens.h" #include "utility/messaging/type/MessageFind.h" -#include "utility/messaging/type/MessageSearch.h" #include "utility/messaging/type/MessageSearchAutocomplete.h" #include "utility/messaging/type/MessageSearchFullText.h" #include "utility/messaging/type/MessageShowErrors.h" @@ -15,9 +15,9 @@ class SearchView; class SearchController : public Controller + , public MessageListener , public MessageListener , public MessageListener - , public MessageListener , public MessageListener , public MessageListener , public MessageListener @@ -27,9 +27,9 @@ public: ~SearchController(); private: + virtual void handleMessage(MessageActivateAll* message); virtual void handleMessage(MessageActivateTokens* message); virtual void handleMessage(MessageFind* message); - virtual void handleMessage(MessageSearch* message); virtual void handleMessage(MessageSearchAutocomplete* message); virtual void handleMessage(MessageSearchFullText* message); virtual void handleMessage(MessageShowErrors* message); diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index 7efae33d..abba420a 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -1,14 +1,15 @@ #include "component/controller/UndoRedoController.h" #include "utility/logging/logging.h" -#include "utility/messaging/type/MessageActivateTokens.h" #include "utility/messaging/type/MessageFlushUpdates.h" +#include "utility/messaging/type/MessageSearch.h" #include "utility/utility.h" #include "component/view/UndoRedoView.h" #include "data/access/StorageAccess.h" UndoRedoController::UndoRedoController(StorageAccess* storageAccess) + : m_storageAccess(storageAccess) { m_iterator = m_list.end(); } @@ -38,30 +39,14 @@ UndoRedoController::Command::Command(std::shared_ptr message, Order { } -void UndoRedoController::handleMessage(MessageActivateEdge* message) +void UndoRedoController::handleMessage(MessageActivateAll* message) { - if (sameMessageTypeAsLast(message) && - static_cast(lastMessage())->getFullName() == message->getFullName()) + if (sameMessageTypeAsLast(message)) { return; } - Command command( - std::make_shared(*message), - (message->isAggregation() ? Command::ORDER_ACTIVATE : Command::ORDER_ADAPT) - ); - processCommand(command); -} - -void UndoRedoController::handleMessage(MessageActivateFile* message) -{ - if (sameMessageTypeAsLast(message) && - static_cast(lastMessage())->filePath == message->filePath) - { - return; - } - - Command command(std::make_shared(*message), Command::ORDER_ACTIVATE); + Command command(std::make_shared(*message), Command::ORDER_ACTIVATE); processCommand(command); } @@ -77,30 +62,18 @@ void UndoRedoController::handleMessage(MessageActivateLocalSymbols* message) processCommand(command); } -void UndoRedoController::handleMessage(MessageActivateNodes* message) +void UndoRedoController::handleMessage(MessageActivateTokens* message) { if (sameMessageTypeAsLast(message) && - message->nodes.size() && - static_cast(lastMessage())->nodes.size() == message->nodes.size() && - static_cast(lastMessage())->nodes[0].nameHierarchy.getQualifiedNameWithSignature() == - message->nodes[0].nameHierarchy.getQualifiedNameWithSignature()) + static_cast(lastMessage())->tokenIds == message->tokenIds) { return; } - Command command(std::make_shared(*message), Command::ORDER_ACTIVATE); - processCommand(command); -} - -void UndoRedoController::handleMessage(MessageActivateTokenIds* message) -{ - if (sameMessageTypeAsLast(message) && message->tokenIds.size() && - static_cast(lastMessage())->tokenIds == message->tokenIds) - { - return; - } - - Command command(std::make_shared(*message), Command::ORDER_ACTIVATE); + Command command( + std::make_shared(*message), + message->isEdge ? Command::ORDER_ADAPT : Command::ORDER_ACTIVATE + ); processCommand(command); } @@ -134,6 +107,33 @@ void UndoRedoController::handleMessage(MessageDeactivateEdge* message) m->setKeepContent(keepContent); } +void UndoRedoController::handleMessage(MessageFinishedParsing* message) +{ + std::list newList; + + for (const Command& command : m_list) + { + if (command.order == Command::ORDER_ACTIVATE) + { + MessageActivateTokens* msg = dynamic_cast(command.message.get()); + if (msg) + { + if (msg->isAggregation) + { + continue; + } + msg->isFromSearch = false; + } + + command.message->setIsReplayCleared(true); + newList.insert(newList.end(), command); + } + } + + m_list = newList; + m_iterator = m_list.end(); +} + void UndoRedoController::handleMessage(MessageGraphNodeBundleSplit* message) { Command command(std::make_shared(*message), Command::ORDER_ADAPT); @@ -173,9 +173,7 @@ void UndoRedoController::handleMessage(MessageRedo* message) getView()->setRedoButtonEnabled(false); } - bool keepsContent = replayCommands(oldIterator); - - MessageFlushUpdates(keepsContent).dispatch(); + replayCommands(oldIterator); } void UndoRedoController::handleMessage(MessageRefresh* message) @@ -193,9 +191,7 @@ void UndoRedoController::handleMessage(MessageRefresh* message) } else { - bool keepsContent = replayCommands(); - - MessageFlushUpdates(keepsContent).dispatch(); + replayCommands(); } } @@ -211,15 +207,16 @@ void UndoRedoController::handleMessage(MessageScrollCode* message) processCommand(command); } -void UndoRedoController::handleMessage(MessageSearch* message) +void UndoRedoController::handleMessage(MessageScrollGraph* message) { - if (sameMessageTypeAsLast(message) && - static_cast(lastMessage())->getMatchesAsString() == message->getMatchesAsString()) + if (sameMessageTypeAsLast(message)) { + static_cast(lastMessage())->xValue = message->xValue; + static_cast(lastMessage())->yValue = message->yValue; return; } - Command command(std::make_shared(*message), Command::ORDER_ACTIVATE); + Command command(std::make_shared(*message), Command::ORDER_VIEW, true); processCommand(command); } @@ -248,6 +245,18 @@ void UndoRedoController::handleMessage(MessageShowErrors* message) processCommand(command); } +void UndoRedoController::handleMessage(MessageShowReference* message) +{ + if (sameMessageTypeAsLast(message) && + static_cast(lastMessage())->refIndex == message->refIndex) + { + return; + } + + Command command(std::make_shared(*message), Command::ORDER_VIEW); + processCommand(command); +} + void UndoRedoController::handleMessage(MessageShowScope* message) { Command command(std::make_shared(*message), Command::ORDER_VIEW); @@ -290,12 +299,10 @@ void UndoRedoController::handleMessage(MessageUndo* message) m_iterator = it; - bool keepsContent = replayCommands(); - - MessageFlushUpdates(keepsContent).dispatch(); + replayCommands(); } -bool UndoRedoController::replayCommands() +void UndoRedoController::replayCommands() { std::list::iterator startIterator = m_iterator; @@ -305,25 +312,21 @@ bool UndoRedoController::replayCommands() } while (startIterator != m_list.begin() && startIterator->order != Command::ORDER_ACTIVATE); - return replayCommands(startIterator); + replayCommands(startIterator); } -bool UndoRedoController::replayCommands(std::list::iterator it) +void UndoRedoController::replayCommands(std::list::iterator it) { std::vector::iterator> viewCommands; bool keepsContent = true; - std::shared_ptr m; while (it != m_iterator) { - m = it->message; if (it->order != Command::ORDER_VIEW || it->replayLastOnly == false) { - m->setIsReplayed(true); - m->setIsLast(it == std::prev(m_iterator)); - m->dispatch(); + replayCommand(it); - if (!m->keepContent()) + if (!it->message->keepContent()) { keepsContent = false; } @@ -356,14 +359,31 @@ bool UndoRedoController::replayCommands(std::list::iterator it) for (size_t i = lastViewCommands.size(); i > 0; i--) { - it = lastViewCommands[i - 1]; - m = it->message; - m->setIsReplayed(true); - m->setIsLast(it == std::prev(m_iterator)); - m->dispatch(); + replayCommand(lastViewCommands[i - 1]); } - return keepsContent; + MessageFlushUpdates(keepsContent).dispatch(); +} + +void UndoRedoController::replayCommand(std::list::iterator it) +{ + std::shared_ptr m = it->message; + m->setIsReplayed(true); + m->setIsLast(it == std::prev(m_iterator)); + + if (m->getType() == MessageActivateTokens::getStaticType()) + { + MessageActivateTokens* msg = dynamic_cast(m.get()); + + if (!msg->isEdge && !msg->isAggregation) + { + msg->tokenIds = m_storageAccess->getNodeIdsForNameHierarchies(msg->tokenNames); + msg->searchMatches.clear(); + } + } + + m->dispatch(); + m->setIsReplayCleared(false); } void UndoRedoController::processCommand(Command command) @@ -425,7 +445,7 @@ bool UndoRedoController::sameMessageTypeAsLast(MessageBase* message) const return false; } - return std::prev(m_iterator)->message->getType() == message->getType(); + return lastMessage()->getType() == message->getType(); } MessageBase* UndoRedoController::lastMessage() const @@ -435,7 +455,7 @@ MessageBase* UndoRedoController::lastMessage() const void UndoRedoController::dump() const { - std::cout << "Undo Redo Stack:\n\n"; + std::cout << "\nUndo Redo Stack:\n----------\n"; std::list::const_iterator it = m_list.begin(); while (it != m_list.end()) @@ -450,7 +470,7 @@ void UndoRedoController::dump() const break; } - std::cout << it->message->getType() << " " << it->replayLastOnly; + std::cout << it->message->getType(); if (it == m_iterator) { @@ -463,8 +483,7 @@ void UndoRedoController::dump() const if (m_list.end() == m_iterator) { - std::cout << " <-"; + std::cout << "<-" << std::endl; } - - std::cout << std::endl; + std::cout << "----------" << std::endl; } diff --git a/src/lib/component/controller/UndoRedoController.h b/src/lib/component/controller/UndoRedoController.h index db8d49cc..815e466d 100644 --- a/src/lib/component/controller/UndoRedoController.h +++ b/src/lib/component/controller/UndoRedoController.h @@ -5,22 +5,22 @@ #include "utility/messaging/MessageBase.h" #include "utility/messaging/MessageListener.h" -#include "utility/messaging/type/MessageActivateEdge.h" -#include "utility/messaging/type/MessageActivateFile.h" +#include "utility/messaging/type/MessageActivateAll.h" #include "utility/messaging/type/MessageActivateLocalSymbols.h" -#include "utility/messaging/type/MessageActivateNodes.h" -#include "utility/messaging/type/MessageActivateTokenIds.h" +#include "utility/messaging/type/MessageActivateTokens.h" #include "utility/messaging/type/MessageChangeFileView.h" #include "utility/messaging/type/MessageDeactivateEdge.h" +#include "utility/messaging/type/MessageFinishedParsing.h" #include "utility/messaging/type/MessageGraphNodeBundleSplit.h" #include "utility/messaging/type/MessageGraphNodeExpand.h" #include "utility/messaging/type/MessageGraphNodeMove.h" #include "utility/messaging/type/MessageRedo.h" #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageScrollCode.h" -#include "utility/messaging/type/MessageSearch.h" +#include "utility/messaging/type/MessageScrollGraph.h" #include "utility/messaging/type/MessageSearchFullText.h" #include "utility/messaging/type/MessageShowErrors.h" +#include "utility/messaging/type/MessageShowReference.h" #include "utility/messaging/type/MessageShowScope.h" #include "utility/messaging/type/MessageUndo.h" @@ -31,22 +31,22 @@ class UndoRedoView; class UndoRedoController : public Controller - , public MessageListener - , public MessageListener + , public MessageListener , public MessageListener - , public MessageListener - , public MessageListener + , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener - , public MessageListener + , public MessageListener , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener { @@ -75,27 +75,28 @@ private: bool replayLastOnly; }; - virtual void handleMessage(MessageActivateEdge* message); - virtual void handleMessage(MessageActivateFile* message); + virtual void handleMessage(MessageActivateAll* message); virtual void handleMessage(MessageActivateLocalSymbols* message); - virtual void handleMessage(MessageActivateNodes* message); - virtual void handleMessage(MessageActivateTokenIds* message); + virtual void handleMessage(MessageActivateTokens* message); virtual void handleMessage(MessageChangeFileView* message); virtual void handleMessage(MessageDeactivateEdge* message); + virtual void handleMessage(MessageFinishedParsing* message); virtual void handleMessage(MessageGraphNodeBundleSplit* message); virtual void handleMessage(MessageGraphNodeExpand* message); virtual void handleMessage(MessageGraphNodeMove* message); virtual void handleMessage(MessageRedo* message); virtual void handleMessage(MessageRefresh* message); virtual void handleMessage(MessageScrollCode* message); - virtual void handleMessage(MessageSearch* message); + virtual void handleMessage(MessageScrollGraph* message); virtual void handleMessage(MessageSearchFullText* message); virtual void handleMessage(MessageShowErrors* message); + virtual void handleMessage(MessageShowReference* message); virtual void handleMessage(MessageShowScope* message); virtual void handleMessage(MessageUndo* message); - bool replayCommands(); - bool replayCommands(std::list::iterator iterator); + void replayCommands(); + void replayCommands(std::list::iterator it); + void replayCommand(std::list::iterator it); void processCommand(Command command); @@ -104,6 +105,8 @@ private: void dump() const; + StorageAccess* m_storageAccess; + std::list m_list; std::list::iterator m_iterator; }; diff --git a/src/lib/component/view/CodeView.h b/src/lib/component/view/CodeView.h index 6ad6e0cc..f884ee2a 100644 --- a/src/lib/component/view/CodeView.h +++ b/src/lib/component/view/CodeView.h @@ -54,6 +54,8 @@ public: virtual void scrollToLine(const FilePath filePath, unsigned int line) = 0; virtual void scrollToDefinition(bool ignoreActiveReference) = 0; + virtual bool isInListMode() const = 0; + private: CodeController* getController(); }; diff --git a/src/lib/component/view/GraphView.h b/src/lib/component/view/GraphView.h index 69c8cb7f..2f630800 100644 --- a/src/lib/component/view/GraphView.h +++ b/src/lib/component/view/GraphView.h @@ -42,6 +42,8 @@ public: virtual void resizeView() = 0; virtual Vec2i getViewSize() const = 0; + + virtual void scrollToValues(int xValue, int yValue) = 0; }; #endif // GRAPH_VIEW_H diff --git a/src/lib/data/PersistentStorage.cpp b/src/lib/data/PersistentStorage.cpp index 9d18483e..43dcf955 100644 --- a/src/lib/data/PersistentStorage.cpp +++ b/src/lib/data/PersistentStorage.cpp @@ -491,6 +491,30 @@ Node::NodeType PersistentStorage::getNodeTypeForNodeWithId(Id nodeId) const return Node::intToType(m_sqliteStorage.getFirstById(nodeId).type); } +std::vector PersistentStorage::getNameHierarchiesForNodeIds(const std::vector nodeIds) const +{ + std::vector nameHierarchies; + for (const StorageNode& storageNode : m_sqliteStorage.getAllByIds(nodeIds)) + { + nameHierarchies.push_back(NameHierarchy::deserialize(storageNode.serializedName)); + } + return nameHierarchies; +} + +std::vector PersistentStorage::getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const +{ + std::vector nodeIds; + for (const NameHierarchy& name : nameHierarchies) + { + Id nodeId = getIdForNodeWithNameHierarchy(name); + if (nodeId) + { + nodeIds.push_back(nodeId); + } + } + return nodeIds; +} + std::shared_ptr PersistentStorage::getFullTextSearchLocations( const std::string& searchTerm, bool caseSensitive ) const @@ -660,32 +684,31 @@ std::vector PersistentStorage::getAutocompletionSymbolMatches(const for (const SearchResult& result : results) { SearchMatch match; - const StorageNode* firstNode = nullptr; + for (const Id& elementId : result.elementIds) { if (elementId != 0) { - const StorageNode& node = storageNodeMap[elementId]; - match.nameHierarchies.push_back(NameHierarchy::deserialize(node.serializedName)); + match.tokenIds.push_back(elementId); if (!match.hasChildren) { - match.hasChildren = m_hierarchyCache.nodeHasChildren(node.id); + match.hasChildren = m_hierarchyCache.nodeHasChildren(elementId); } if (!firstNode) { - firstNode = &node; + firstNode = &storageNodeMap[elementId]; } } } match.name = result.text; - match.text = result.text; + const size_t idx = m_hierarchyCache.getIndexOfLastVisibleParentNode(firstNode->id); - const NameHierarchy& name = match.nameHierarchies[0]; + const NameHierarchy& name = NameHierarchy::deserialize(firstNode->serializedName); match.text = name.getRange(idx, name.size()).getQualifiedName(); match.subtext = name.getRange(0, idx).getQualifiedName(); @@ -717,9 +740,8 @@ std::vector PersistentStorage::getAutocompletionFileMatches(const s { SearchMatch match; - match.nameHierarchies.push_back(NameHierarchy(result.text)); - match.name = result.text; + match.tokenIds = utility::toVector(result.elementIds); FilePath path(match.name); match.text = path.fileName(); @@ -770,31 +792,36 @@ std::vector PersistentStorage::getSearchMatchesForTokenIds(const st // In that case there should be only one search match. std::vector matches; + // fetch StorageNodes for node ids + std::map storageNodeMap; + for (StorageNode& node : m_sqliteStorage.getAllByIds(elementIds)) + { + storageNodeMap.emplace(node.id, node); + } + for (Id elementId : elementIds) { - SearchMatch match; - - NameHierarchy nameHierarchy = NameHierarchy::deserialize(m_sqliteStorage.getFirstById(elementId).serializedName); - match.name = nameHierarchy.getQualifiedName(); - match.text = nameHierarchy.getRawName(); - match.nameHierarchies.push_back(nameHierarchy.getQualifiedName()); - match.searchType = SearchMatch::SEARCH_TOKEN; - - if (m_sqliteStorage.isFile(elementId)) - { - match.text = FilePath(match.text).fileName(); - match.nodeType = Node::NODE_FILE; - } - else if (m_sqliteStorage.isNode(elementId)) - { - StorageNode node = m_sqliteStorage.getFirstById(elementId); - match.nodeType = Node::intToType(node.type); - } - else + if (storageNodeMap.find(elementId) == storageNodeMap.end()) { continue; } + StorageNode node = storageNodeMap[elementId]; + + SearchMatch match; + NameHierarchy nameHierarchy = NameHierarchy::deserialize(node.serializedName); + match.name = nameHierarchy.getQualifiedName(); + match.text = nameHierarchy.getRawName(); + + match.tokenIds.push_back(elementId); + match.nodeType = Node::intToType(node.type); + match.searchType = SearchMatch::SEARCH_TOKEN; + + if (match.nodeType == Node::NODE_FILE) + { + match.text = FilePath(match.text).fileName(); + } + matches.push_back(match); } @@ -1070,45 +1097,6 @@ bool PersistentStorage::checkNodeExistsByName(const std::string& serializedName) return m_sqliteStorage.checkNodeExistsByName(serializedName); } -std::vector PersistentStorage::getTokenIdsForMatches(const std::vector& matches) const -{ - FilePath rootPath = getDbFilePath().parentDirectory(); - std::set idSet; - for (const SearchMatch& match : matches) - { - if (match.nodeType == Node::NODE_FILE) - { - FilePath path(match.subtext); - if (!path.isAbsolute()) - { - path = rootPath.concat(path).canonical(); - } - - idSet.insert(m_sqliteStorage.getFileByPath(path.str()).id); - } - else - { - for (size_t i = 0; i < match.nameHierarchies.size(); i++) - { - idSet.insert( - m_sqliteStorage.getNodeBySerializedName(NameHierarchy::serialize(match.nameHierarchies[i])).id - ); - } - } - } - - std::vector ids; - for (std::set::const_iterator it = idSet.begin(); it != idSet.end(); it++) - { - if (*it != 0) - { - ids.push_back(*it); - } - } - - return ids; -} - Id PersistentStorage::getTokenIdForFileNode(const FilePath& filePath) const { return m_sqliteStorage.getFileByPath(filePath.str()).id; diff --git a/src/lib/data/PersistentStorage.h b/src/lib/data/PersistentStorage.h index 6200183a..6572d651 100644 --- a/src/lib/data/PersistentStorage.h +++ b/src/lib/data/PersistentStorage.h @@ -104,6 +104,9 @@ public: virtual NameHierarchy getNameHierarchyForNodeWithId(Id nodeId) const; virtual Node::NodeType getNodeTypeForNodeWithId(Id nodeId) const; + virtual std::vector getNameHierarchiesForNodeIds(const std::vector nodeIds) const; + virtual std::vector getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const; + virtual std::shared_ptr getFullTextSearchLocations( const std::string& searchTerm, bool caseSensitive) const; virtual std::vector getAutocompletionMatches(const std::string& query) const; @@ -123,7 +126,6 @@ public: virtual std::vector getLocalSymbolIdsForLocationIds(const std::vector& locationIds) const; virtual bool checkNodeExistsByName(const std::string& serializedName) const; - virtual std::vector getTokenIdsForMatches(const std::vector& matches) const; virtual Id getTokenIdForFileNode(const FilePath& filePath) const; virtual std::shared_ptr getTokenLocationsForTokenIds( diff --git a/src/lib/data/access/StorageAccess.h b/src/lib/data/access/StorageAccess.h index a792f124..f47bf5ab 100644 --- a/src/lib/data/access/StorageAccess.h +++ b/src/lib/data/access/StorageAccess.h @@ -44,6 +44,9 @@ public: virtual Node::NodeType getNodeTypeForNodeWithId(Id id) const = 0; virtual bool checkNodeExistsByName(const std::string& serializedName) const = 0; + virtual std::vector getNameHierarchiesForNodeIds(const std::vector nodeIds) const = 0; + virtual std::vector getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const = 0; + virtual std::shared_ptr getFullTextSearchLocations( const std::string& searchTerm, bool caseSensitive) const = 0; virtual std::vector getAutocompletionMatches(const std::string& query) const = 0; @@ -57,7 +60,6 @@ public: virtual std::vector getNodeIdsForLocationIds(const std::vector& locationIds) const = 0; virtual std::vector getLocalSymbolIdsForLocationIds(const std::vector& locationIds) const = 0; - virtual std::vector getTokenIdsForMatches(const std::vector& matches) const = 0; virtual Id getTokenIdForFileNode(const FilePath& filePath) const = 0; virtual std::shared_ptr getTokenLocationsForTokenIds( diff --git a/src/lib/data/access/StorageAccessProxy.cpp b/src/lib/data/access/StorageAccessProxy.cpp index aa0894fa..11fb54af 100644 --- a/src/lib/data/access/StorageAccessProxy.cpp +++ b/src/lib/data/access/StorageAccessProxy.cpp @@ -77,6 +77,16 @@ bool StorageAccessProxy::checkEdgeExists(Id edgeId) const return false; } +NameHierarchy StorageAccessProxy::getNameHierarchyForNodeWithId(Id id) const +{ + if (hasSubject()) + { + return m_subject->getNameHierarchyForNodeWithId(id); + } + + return NameHierarchy(); +} + Node::NodeType StorageAccessProxy::getNodeTypeForNodeWithId(Id id) const { if (hasSubject()) @@ -95,24 +105,22 @@ bool StorageAccessProxy::checkNodeExistsByName(const std::string& serializedName return false; } -NameHierarchy StorageAccessProxy::getNameHierarchyForNodeWithId(Id id) const +std::vector StorageAccessProxy::getNameHierarchiesForNodeIds(const std::vector nodeIds) const { if (hasSubject()) { - return m_subject->getNameHierarchyForNodeWithId(id); + return m_subject->getNameHierarchiesForNodeIds(nodeIds); } - - return NameHierarchy(); + return std::vector(); } -std::vector StorageAccessProxy::getAutocompletionMatches(const std::string& query) const +std::vector StorageAccessProxy::getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const { if (hasSubject()) { - return m_subject->getAutocompletionMatches(query); + return m_subject->getNodeIdsForNameHierarchies(nameHierarchies); } - - return std::vector(); + return std::vector(); } std::shared_ptr StorageAccessProxy::getFullTextSearchLocations( @@ -126,6 +134,16 @@ std::shared_ptr StorageAccessProxy::getFullTextSearchLo return std::make_shared(); } +std::vector StorageAccessProxy::getAutocompletionMatches(const std::string& query) const +{ + if (hasSubject()) + { + return m_subject->getAutocompletionMatches(query); + } + + return std::vector(); +} + std::vector StorageAccessProxy::getSearchMatchesForTokenIds(const std::vector& tokenIds) const { if (hasSubject()) @@ -186,16 +204,6 @@ std::vector StorageAccessProxy::getLocalSymbolIdsForLocationIds(const std::v return std::vector(); } -std::vector StorageAccessProxy::getTokenIdsForMatches(const std::vector& matches) const -{ - if (hasSubject()) - { - return m_subject->getTokenIdsForMatches(matches); - } - - return std::vector(); -} - Id StorageAccessProxy::getTokenIdForFileNode(const FilePath& filePath) const { if (hasSubject()) diff --git a/src/lib/data/access/StorageAccessProxy.h b/src/lib/data/access/StorageAccessProxy.h index 3d9738bc..30fa38ce 100644 --- a/src/lib/data/access/StorageAccessProxy.h +++ b/src/lib/data/access/StorageAccessProxy.h @@ -29,6 +29,9 @@ public: virtual Node::NodeType getNodeTypeForNodeWithId(Id id) const; virtual bool checkNodeExistsByName(const std::string& serializedName) const; + virtual std::vector getNameHierarchiesForNodeIds(const std::vector nodeIds) const; + virtual std::vector getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const; + virtual std::shared_ptr getFullTextSearchLocations( const std::string& searchTerm, bool caseSensitive) const; virtual std::vector getAutocompletionMatches(const std::string& query) const; @@ -42,7 +45,6 @@ public: virtual std::vector getNodeIdsForLocationIds(const std::vector& locationIds) const; virtual std::vector getLocalSymbolIdsForLocationIds(const std::vector& locationIds) const; - virtual std::vector getTokenIdsForMatches(const std::vector& matches) const; virtual Id getTokenIdForFileNode(const FilePath& filePath) const; virtual std::shared_ptr getTokenLocationsForTokenIds( diff --git a/src/lib/data/search/SearchMatch.h b/src/lib/data/search/SearchMatch.h index 587d1672..bc7169e6 100644 --- a/src/lib/data/search/SearchMatch.h +++ b/src/lib/data/search/SearchMatch.h @@ -54,6 +54,7 @@ struct SearchMatch std::string getSearchTypeName() const; std::string name; + std::vector tokenIds; std::string text; std::string subtext; @@ -66,8 +67,6 @@ struct SearchMatch int score; - std::vector nameHierarchies; - bool hasChildren; }; diff --git a/src/lib/utility/messaging/MessageBase.h b/src/lib/utility/messaging/MessageBase.h index 3f61559b..4b631a41 100644 --- a/src/lib/utility/messaging/MessageBase.h +++ b/src/lib/utility/messaging/MessageBase.h @@ -9,6 +9,7 @@ class MessageBase public: MessageBase() : m_isReplayed(false) + , m_isReplayCleared(false) , m_sendAsTask(true) , m_keepContent(false) , m_isLast(true) @@ -43,6 +44,16 @@ public: m_isReplayed = isReplayed; } + bool isReplayCleared() const + { + return m_isReplayCleared; + } + + void setIsReplayCleared(bool isReplayCleared) + { + m_isReplayCleared = isReplayCleared; + } + bool isLast() const { return m_isLast; @@ -85,8 +96,11 @@ public: private: bool m_isReplayed; + bool m_isReplayCleared; + bool m_sendAsTask; bool m_keepContent; + bool m_isLast; bool m_isLogged; }; diff --git a/src/lib/utility/messaging/type/MessageActivateNodes.h b/src/lib/utility/messaging/type/MessageActivateNodes.h index 5abc6f47..42b86a5a 100644 --- a/src/lib/utility/messaging/type/MessageActivateNodes.h +++ b/src/lib/utility/messaging/type/MessageActivateNodes.h @@ -4,8 +4,6 @@ #include "utility/messaging/Message.h" #include "utility/types.h" -#include "data/graph/Node.h" - class MessageActivateNodes : public Message { @@ -13,7 +11,6 @@ public: struct ActiveNode { Id nodeId; - Node::NodeType type; NameHierarchy nameHierarchy; }; @@ -21,21 +18,10 @@ public: { } - void addNode(Id tokenId, Node::NodeType type, const NameHierarchy& nameHierarchy) + void addNode(Id tokenId, const NameHierarchy& nameHierarchy) { ActiveNode node; node.nodeId = tokenId; - node.type = type; - node.nameHierarchy = nameHierarchy; - - nodes.push_back(node); - } - - void addNode(const NameHierarchy& nameHierarchy) - { - ActiveNode node; - node.nodeId = 0; - node.type = Node::NODE_NON_INDEXED; node.nameHierarchy = nameHierarchy; nodes.push_back(node); diff --git a/src/lib/utility/messaging/type/MessageActivateTokens.h b/src/lib/utility/messaging/type/MessageActivateTokens.h index 8412f7c7..d902831d 100644 --- a/src/lib/utility/messaging/type/MessageActivateTokens.h +++ b/src/lib/utility/messaging/type/MessageActivateTokens.h @@ -4,19 +4,18 @@ #include "utility/messaging/Message.h" #include "utility/types.h" +#include "data/search/SearchMatch.h" + class MessageActivateTokens : public Message { public: - MessageActivateTokens(const MessageBase* other, const std::vector& tokenIds) - : tokenIds(tokenIds) - , isEdge(false) + MessageActivateTokens(const MessageBase* other) + : isEdge(false) , isAggregation(false) , isFromSearch(false) { - setIsReplayed(other->isReplayed()); setKeepContent(other->keepContent()); - setIsLast(other->isLast()); } static const std::string getStaticType() @@ -32,13 +31,13 @@ public: } } - const std::vector tokenIds; + std::vector tokenIds; + std::vector tokenNames; + std::vector searchMatches; bool isEdge; bool isAggregation; bool isFromSearch; - - std::vector unknownNames; }; #endif // MESSAGE_ACTIVATE_TOKENS_H diff --git a/src/lib/utility/messaging/type/MessageChangeFileView.h b/src/lib/utility/messaging/type/MessageChangeFileView.h index 47139286..e14a5882 100644 --- a/src/lib/utility/messaging/type/MessageChangeFileView.h +++ b/src/lib/utility/messaging/type/MessageChangeFileView.h @@ -13,11 +13,12 @@ public: { FILE_MINIMIZED, FILE_SNIPPETS, - FILE_MAXIMIZED + FILE_MAXIMIZED, + FILE_DEFAULT_FOR_MODE }; MessageChangeFileView( - const FilePath filePath, + const FilePath& filePath, FileState state, bool needsData, bool showErrors @@ -41,6 +42,7 @@ public: case FILE_MINIMIZED: os << "minimize"; break; case FILE_SNIPPETS: os << "snippets"; break; case FILE_MAXIMIZED: os << "maximize"; break; + case FILE_DEFAULT_FOR_MODE: os << "default"; break; } if (needsData) diff --git a/src/lib/utility/messaging/type/MessageScrollGraph.h b/src/lib/utility/messaging/type/MessageScrollGraph.h new file mode 100644 index 00000000..3f3e065a --- /dev/null +++ b/src/lib/utility/messaging/type/MessageScrollGraph.h @@ -0,0 +1,26 @@ +#ifndef MESSAGE_SCROLL_GRAPH_H +#define MESSAGE_SCROLL_GRAPH_H + +#include "utility/messaging/Message.h" + +class MessageScrollGraph + : public Message +{ +public: + MessageScrollGraph(int xValue, int yValue) + : xValue(xValue) + , yValue(yValue) + { + setIsLogged(false); + } + + static const std::string getStaticType() + { + return "MessageScrollGraph"; + } + + int xValue; + int yValue; +}; + +#endif // MESSAGE_SCROLL_GRAPH_H diff --git a/src/lib/utility/messaging/type/MessageSearch.h b/src/lib/utility/messaging/type/MessageSearch.h index 1b56138d..5f679c6b 100644 --- a/src/lib/utility/messaging/type/MessageSearch.h +++ b/src/lib/utility/messaging/type/MessageSearch.h @@ -49,6 +49,22 @@ public: return m_matches; } + std::vector getTokenIdsOfMatches() const + { + std::vector tokenIds; + for (const SearchMatch& match : m_matches) + { + for (const Id tokenId : match.tokenIds) + { + if (tokenId) + { + tokenIds.push_back(tokenId); + } + } + } + return tokenIds; + } + virtual void print(std::ostream& os) const { os << getMatchesAsString(); diff --git a/src/lib/utility/messaging/type/MessageShowReference.h b/src/lib/utility/messaging/type/MessageShowReference.h index 5af069f9..1430d8c9 100644 --- a/src/lib/utility/messaging/type/MessageShowReference.h +++ b/src/lib/utility/messaging/type/MessageShowReference.h @@ -8,10 +8,11 @@ class MessageShowReference : public Message { public: - MessageShowReference(size_t refIndex, Id tokenId, Id locationId) + MessageShowReference(size_t refIndex, Id tokenId, Id locationId, bool animated) : refIndex(refIndex) , tokenId(tokenId) , locationId(locationId) + , animated(animated) { } @@ -28,6 +29,7 @@ public: const size_t refIndex; const Id tokenId; const Id locationId; + const bool animated; }; #endif // MESSAGE_SHOW_REFERENCE_H diff --git a/src/lib_gui/qt/element/QtCodeFile.cpp b/src/lib_gui/qt/element/QtCodeFile.cpp index 558b42c4..d9ae677e 100644 --- a/src/lib_gui/qt/element/QtCodeFile.cpp +++ b/src/lib_gui/qt/element/QtCodeFile.cpp @@ -250,7 +250,7 @@ bool QtCodeFile::isCollapsed() const return m_isCollapsed; } -void QtCodeFile::requestContent() +void QtCodeFile::requestContent(bool isFirstInList) { if (!isCollapsed() || m_contentRequested) { @@ -260,15 +260,15 @@ void QtCodeFile::requestContent() m_contentRequested = true; - MessageChangeFileView msg( - m_filePath, - m_isWholeFile ? MessageChangeFileView::FILE_MAXIMIZED : MessageChangeFileView::FILE_SNIPPETS, - isCollapsed(), - m_navigator->hasErrors() - ); + MessageChangeFileView::FileState state = + isFirstInList ? MessageChangeFileView::FILE_DEFAULT_FOR_MODE : MessageChangeFileView::FILE_SNIPPETS; - msg.setIsReplayed(true); - msg.dispatch(); + if (m_isWholeFile) + { + state = MessageChangeFileView::FILE_MAXIMIZED; + } + + MessageChangeFileView(m_filePath, state, isCollapsed(), m_navigator->hasErrors()).dispatch(); } void QtCodeFile::updateContent() diff --git a/src/lib_gui/qt/element/QtCodeFile.h b/src/lib_gui/qt/element/QtCodeFile.h index 4f3a9c17..5af56b5b 100644 --- a/src/lib_gui/qt/element/QtCodeFile.h +++ b/src/lib_gui/qt/element/QtCodeFile.h @@ -43,7 +43,7 @@ public: bool isCollapsed() const; - void requestContent(); + void requestContent(bool isFirstInList = false); void updateContent(); void setWholeFile(bool isWholeFile, int refCount); diff --git a/src/lib_gui/qt/element/QtCodeFileList.cpp b/src/lib_gui/qt/element/QtCodeFileList.cpp index 91ff03ed..4d6e6dd3 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.cpp +++ b/src/lib_gui/qt/element/QtCodeFileList.cpp @@ -101,9 +101,9 @@ void QtCodeFileList::addCodeSnippet( file->setModificationTime(params.modificationTime); } -void QtCodeFileList::requestFileContent(const FilePath& filePath) +void QtCodeFileList::requestFileContent(const FilePath& filePath, bool isFirstInList) { - getFile(filePath)->requestContent(); + getFile(filePath)->requestContent(isFirstInList); } bool QtCodeFileList::requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop) diff --git a/src/lib_gui/qt/element/QtCodeFileList.h b/src/lib_gui/qt/element/QtCodeFileList.h index 8dc2ad86..a4368644 100644 --- a/src/lib_gui/qt/element/QtCodeFileList.h +++ b/src/lib_gui/qt/element/QtCodeFileList.h @@ -35,7 +35,7 @@ public: virtual void addCodeSnippet(const CodeSnippetParams& params, bool insert = false); - virtual void requestFileContent(const FilePath& filePath); + void requestFileContent(const FilePath& filePath, bool isFirstInList = false); virtual bool requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop); virtual void updateFiles(); diff --git a/src/lib_gui/qt/element/QtCodeFileSingle.cpp b/src/lib_gui/qt/element/QtCodeFileSingle.cpp index 09176ed3..424f8612 100644 --- a/src/lib_gui/qt/element/QtCodeFileSingle.cpp +++ b/src/lib_gui/qt/element/QtCodeFileSingle.cpp @@ -142,15 +142,12 @@ void QtCodeFileSingle::requestFileContent(const FilePath& filePath) m_contentRequested = true; - MessageChangeFileView msg( + MessageChangeFileView( filePath, - MessageChangeFileView::FILE_MAXIMIZED, + MessageChangeFileView::FILE_DEFAULT_FOR_MODE, true, m_navigator->hasErrors() - ); - - msg.setIsReplayed(true); - msg.dispatch(); + ).dispatch(); } bool QtCodeFileSingle::requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop) diff --git a/src/lib_gui/qt/element/QtCodeFileSingle.h b/src/lib_gui/qt/element/QtCodeFileSingle.h index fda3d7a7..18b3ffce 100644 --- a/src/lib_gui/qt/element/QtCodeFileSingle.h +++ b/src/lib_gui/qt/element/QtCodeFileSingle.h @@ -33,7 +33,7 @@ public: virtual void addCodeSnippet(const CodeSnippetParams& params, bool insert = false) override; - virtual void requestFileContent(const FilePath& filePath) override; + void requestFileContent(const FilePath& filePath); virtual bool requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop) override; virtual void updateFiles() override; diff --git a/src/lib_gui/qt/element/QtCodeNavigateable.h b/src/lib_gui/qt/element/QtCodeNavigateable.h index 4a60bcf0..03496071 100644 --- a/src/lib_gui/qt/element/QtCodeNavigateable.h +++ b/src/lib_gui/qt/element/QtCodeNavigateable.h @@ -22,7 +22,6 @@ public: virtual void addCodeSnippet(const CodeSnippetParams& params, bool insert = false) = 0; - virtual void requestFileContent(const FilePath& filePath) = 0; virtual bool requestScroll(const FilePath& filePath, uint lineNumber, Id locationId, bool animated, bool onTop) = 0; virtual void updateFiles() = 0; diff --git a/src/lib_gui/qt/element/QtCodeNavigator.cpp b/src/lib_gui/qt/element/QtCodeNavigator.cpp index 9f6454fe..872d6761 100644 --- a/src/lib_gui/qt/element/QtCodeNavigator.cpp +++ b/src/lib_gui/qt/element/QtCodeNavigator.cpp @@ -10,7 +10,6 @@ #include "utility/logging/logging.h" #include "utility/messaging/type/MessageCodeViewExpandedInitialFiles.h" #include "utility/messaging/type/MessageScrollCode.h" -#include "utility/messaging/type/MessageShowReference.h" #include "utility/ResourcePaths.h" #include "data/location/TokenLocation.h" @@ -321,6 +320,11 @@ size_t QtCodeNavigator::getFatalErrorCountForFile(const FilePath& filePath) cons return fatalErrorCount; } +bool QtCodeNavigator::isInListMode() const +{ + return m_mode == MODE_LIST; +} + void QtCodeNavigator::showActiveSnippet( const std::vector& activeTokenIds, std::shared_ptr collection, bool scrollTo) { @@ -442,7 +446,7 @@ void QtCodeNavigator::setupFiles() { if (filePathsToExpand.find(ref.filePath) == filePathsToExpand.end()) { - m_list->requestFileContent(ref.filePath); + m_list->requestFileContent(ref.filePath, filePathsToExpand.size() == 0); filePathsToExpand.insert(ref.filePath); if (filePathsToExpand.size() >= 3) @@ -626,10 +630,7 @@ void QtCodeNavigator::requestScroll(const FilePath& filePath, uint lineNumber, I } } - if (m_scrollRequest.filePath.empty()) - { - m_scrollRequest = req; - } + m_scrollRequest = req; m_singleHasNewFile = false; } @@ -755,19 +756,7 @@ void QtCodeNavigator::setMode(Mode mode) void QtCodeNavigator::showCurrentReference(bool fromUI) { const Reference& ref = m_references[m_refIndex - 1]; - - setCurrentActiveLocationIds(std::vector(1, ref.locationId)); - updateFiles(); - - requestScroll(ref.filePath, 0, ref.locationId, fromUI, false); - emit scrollRequest(); - - updateRefLabel(); - - if (fromUI) - { - MessageShowReference(m_refIndex - 1, ref.tokenId, ref.locationId).dispatch(); - } + MessageShowReference(m_refIndex, ref.tokenId, ref.locationId, fromUI).dispatch(); } void QtCodeNavigator::updateRefLabel() @@ -817,6 +806,28 @@ void QtCodeNavigator::handleMessage(MessageFinishedParsing* message) ); } +void QtCodeNavigator::handleMessage(MessageShowReference* message) +{ + m_refIndex = message->refIndex; + + m_onQtThread( + [=]() + { + if (m_refIndex > 0) + { + const Reference& ref = m_references[m_refIndex - 1]; + setCurrentActiveLocationIds(std::vector(1, ref.locationId)); + updateFiles(); + + requestScroll(ref.filePath, 0, ref.locationId, message->animated, false); + emit scrollRequest(); + } + + updateRefLabel(); + } + ); +} + void QtCodeNavigator::handleMessage(MessageSwitchColorScheme* message) { m_onQtThread( diff --git a/src/lib_gui/qt/element/QtCodeNavigator.h b/src/lib_gui/qt/element/QtCodeNavigator.h index 98f1f7d2..1c966207 100644 --- a/src/lib_gui/qt/element/QtCodeNavigator.h +++ b/src/lib_gui/qt/element/QtCodeNavigator.h @@ -11,6 +11,7 @@ #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/MessageCodeReference.h" #include "utility/messaging/type/MessageFinishedParsing.h" +#include "utility/messaging/type/MessageShowReference.h" #include "utility/messaging/type/MessageSwitchColorScheme.h" #include "utility/messaging/type/MessageWindowFocus.h" @@ -23,6 +24,7 @@ class QtCodeNavigator : public QWidget , public MessageListener , public MessageListener + , public MessageListener , public MessageListener , public MessageListener { @@ -62,6 +64,8 @@ public: bool hasErrors() const; size_t getFatalErrorCountForFile(const FilePath& filePath) const; + bool isInListMode() const; + void showActiveSnippet( const std::vector& activeTokenIds, std::shared_ptr collection, bool scrollTo); @@ -147,6 +151,7 @@ private: void handleMessage(MessageCodeReference* message); void handleMessage(MessageFinishedParsing* message); + void handleMessage(MessageShowReference* message); void handleMessage(MessageSwitchColorScheme* message); void handleMessage(MessageWindowFocus* message); diff --git a/src/lib_gui/qt/view/QtCodeView.cpp b/src/lib_gui/qt/view/QtCodeView.cpp index 86d51a90..7bd796df 100644 --- a/src/lib_gui/qt/view/QtCodeView.cpp +++ b/src/lib_gui/qt/view/QtCodeView.cpp @@ -175,6 +175,11 @@ void QtCodeView::scrollToDefinition(bool ignoreActiveReference) ); } +bool QtCodeView::isInListMode() const +{ + return m_widget->isInListMode(); +} + void QtCodeView::doShowCodeSnippets( const std::vector& snippets, const std::vector& activeTokenIds, bool setupFiles) { diff --git a/src/lib_gui/qt/view/QtCodeView.h b/src/lib_gui/qt/view/QtCodeView.h index 53181597..7449d88a 100644 --- a/src/lib_gui/qt/view/QtCodeView.h +++ b/src/lib_gui/qt/view/QtCodeView.h @@ -52,6 +52,8 @@ public: virtual void scrollToLine(const FilePath filePath, unsigned int line); virtual void scrollToDefinition(bool ignoreActiveReference); + virtual bool isInListMode() const; + private: void doShowCodeSnippets( const std::vector& snippets, const std::vector& activeTokenIds, bool setupFiles); diff --git a/src/lib_gui/qt/view/QtGraphView.cpp b/src/lib_gui/qt/view/QtGraphView.cpp index c151cf02..6185a7a4 100644 --- a/src/lib_gui/qt/view/QtGraphView.cpp +++ b/src/lib_gui/qt/view/QtGraphView.cpp @@ -14,6 +14,7 @@ #include "component/view/GraphViewStyle.h" #include "settings/ApplicationSettings.h" #include "utility/messaging/type/MessageDeactivateEdge.h" +#include "utility/messaging/type/MessageScrollGraph.h" #include "utility/ResourcePaths.h" #include "qt/graphics/QtGraphicsView.h" @@ -40,6 +41,7 @@ QtGraphView::QtGraphView(ViewLayout* viewLayout) , m_focusInFunctor(std::bind(&QtGraphView::doFocusIn, this, std::placeholders::_1)) , m_focusOutFunctor(std::bind(&QtGraphView::doFocusOut, this, std::placeholders::_1)) , m_scrollToTop(false) + , m_restoreScroll(false) , m_isIndexedList(false) { } @@ -77,6 +79,9 @@ void QtGraphView::initView() m_scrollSpeedChangeListenerHorizontal.setScrollBar(view->horizontalScrollBar()); m_scrollSpeedChangeListenerVertical.setScrollBar(view->verticalScrollBar()); + connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrolled(int))); + connect(view->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(scrolled(int))); + doRefreshView(); } @@ -114,6 +119,12 @@ Vec2i QtGraphView::getViewSize() const return Vec2i(view->width() / zoomFactor - 60, view->height() / zoomFactor - 60); } +void QtGraphView::scrollToValues(int xValue, int yValue) +{ + m_restoreScroll = true; + m_scrollValues = Vec2i(xValue, yValue); +} + void QtGraphView::updateScrollBars() { QGraphicsView* view = getView(); @@ -121,7 +132,12 @@ void QtGraphView::updateScrollBars() QScrollBar* hb = view->horizontalScrollBar(); QScrollBar* vb = view->verticalScrollBar(); - if (m_scrollToTop) + if (m_restoreScroll) + { + hb->setValue(m_scrollValues.x()); + vb->setValue(m_scrollValues.y()); + } + else if (m_scrollToTop) { vb->setValue(vb->minimum()); } @@ -201,6 +217,13 @@ void QtGraphView::pressedCharacterKey(QChar c) } } +void QtGraphView::scrolled(int) +{ + QGraphicsView* view = getView(); + + MessageScrollGraph(view->horizontalScrollBar()->value(), view->verticalScrollBar()->value()).dispatch(); +} + void QtGraphView::switchToNewGraphData() { m_oldGraph = m_graph; @@ -223,9 +246,12 @@ void QtGraphView::switchToNewGraphData() doResize(); - if (m_scrollToTop) + if (m_scrollToTop || m_restoreScroll) { updateScrollBars(); + + m_scrollToTop = false; + m_restoreScroll = false; } // Manually hover the item below the mouse cursor. @@ -568,7 +594,8 @@ void QtGraphView::compareNodesRecursive( dynamic_cast((*it).get())->getAccessKind() == dynamic_cast((*it2).get())->getAccessKind()) || ((*it)->isExpandToggleNode() && (*it2)->isExpandToggleNode()) || - ((*it)->isBundleNode() && (*it2)->isBundleNode() && (*it)->getTokenId() == (*it2)->getTokenId())) + ((*it)->isBundleNode() && (*it2)->isBundleNode() && (*it)->getTokenId() == (*it2)->getTokenId()) || + ((*it)->isQualifierNode() && (*it2)->isQualifierNode() && (*it)->getTokenId() == (*it2)->getTokenId())) { remainingNodes->push_back(std::pair((*it).get(), (*it2).get())); compareNodesRecursive( diff --git a/src/lib_gui/qt/view/QtGraphView.h b/src/lib_gui/qt/view/QtGraphView.h index 1f48acff..d2dfe606 100644 --- a/src/lib_gui/qt/view/QtGraphView.h +++ b/src/lib_gui/qt/view/QtGraphView.h @@ -48,11 +48,14 @@ public: virtual Vec2i getViewSize() const; + virtual void scrollToValues(int xValue, int yValue); + private slots: void updateScrollBars(); void finishedTransition(); void clickedInEmptySpace(); void pressedCharacterKey(QChar c); + void scrolled(int); private: void switchToNewGraphData(); @@ -114,6 +117,8 @@ private: std::shared_ptr m_activeNode; bool m_scrollToTop; + bool m_restoreScroll; + Vec2i m_scrollValues; bool m_isIndexedList; std::shared_ptr m_transition; diff --git a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp index 0cd2cf71..3bd1adbd 100644 --- a/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp +++ b/src/lib_gui/qt/view/graphElements/QtGraphNodeData.cpp @@ -85,8 +85,10 @@ void QtGraphNodeData::onClick() return; } + FilePath path = getFilePath(); + MessageActivateNodes message; - message.addNode(m_data->getId(), m_data->getType(), m_data->getNameHierarchy()); + message.addNode(m_data->getId(), path.empty() ? m_data->getNameHierarchy() : path.str()); message.dispatch(); } diff --git a/src/lib_gui/qt/view/graphElements/QtGraphNodeQualifier.cpp b/src/lib_gui/qt/view/graphElements/QtGraphNodeQualifier.cpp index 443c3ec2..0dfddbe5 100644 --- a/src/lib_gui/qt/view/graphElements/QtGraphNodeQualifier.cpp +++ b/src/lib_gui/qt/view/graphElements/QtGraphNodeQualifier.cpp @@ -75,7 +75,7 @@ bool QtGraphNodeQualifier::setPosition(const Vec2i& pos) void QtGraphNodeQualifier::onClick() { MessageActivateNodes msg; - msg.addNode(m_qualifierName); + msg.addNode(0, m_qualifierName); msg.dispatch(); }