From f823d0ddb4114b9b7dfc728ac5dc35e058ea694d Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Mon, 3 Aug 2015 16:33:29 +0200 Subject: [PATCH] ui: fixed some ui related bugs * aggregation edges only connect toplevel nodes * fixed aggregation click for undo and redo * don't show edge name in search field, because they are not searchable * clear search field when clicking aggregation * leave active nodes active when clicking edges --- .../controller/FeatureController.cpp | 5 +- .../component/controller/GraphController.cpp | 49 ++++++++++++++++--- .../component/controller/GraphController.h | 4 +- .../component/controller/SearchController.cpp | 25 +--------- .../controller/UndoRedoController.cpp | 2 +- .../messaging/type/MessageActivateEdge.h | 5 ++ .../messaging/type/MessageActivateTokens.h | 3 ++ src/lib/utility/utility.h | 2 +- 8 files changed, 59 insertions(+), 36 deletions(-) diff --git a/src/lib/component/controller/FeatureController.cpp b/src/lib/component/controller/FeatureController.cpp index 03c40ec8..d422f932 100644 --- a/src/lib/component/controller/FeatureController.cpp +++ b/src/lib/component/controller/FeatureController.cpp @@ -29,11 +29,12 @@ void FeatureController::handleMessage(MessageActivateEdge* message) return; } - if (message->type == Edge::EDGE_AGGREGATION) + if (message->isAggregation()) { MessageActivateTokens m(m_storageAccess->getTokenIdsForAggregationEdge(edgeId)); + m.isAggregation = true; m.undoRedoType = message->undoRedoType; - m.dispatch(); + m.dispatchImmediately(); return; } diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index dc043bc7..2eccd3aa 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -24,16 +24,25 @@ GraphController::~GraphController() void GraphController::handleMessage(MessageActivateTokens* message) { - m_activeTokenIds = message->tokenIds; - if (message->isEdge && message->tokenIds.size() == 1) { - setActiveAndVisibility(message->tokenIds); + m_activeEdgeIds = message->tokenIds; + setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds)); buildGraph(message); return; } + else if (message->isAggregation) + { + m_activeNodeIds.clear(); + m_activeEdgeIds = message->tokenIds; + } + else + { + m_activeNodeIds = message->tokenIds; + m_activeEdgeIds.clear(); + } - createDummyGraphForTokenIds(message->tokenIds); + createDummyGraphForTokenIds(utility::concat(m_activeNodeIds, m_activeEdgeIds)); buildGraph(message); } @@ -81,7 +90,7 @@ void GraphController::handleMessage(MessageGraphNodeBundleSplit* message) } } - setActiveAndVisibility(m_activeTokenIds); + setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds)); layoutNesting(); GraphLayouter::layoutSpectralPrototype(m_dummyNodes, m_dummyEdges); @@ -97,7 +106,7 @@ void GraphController::handleMessage(MessageGraphNodeExpand* message) { node->expanded = message->expand; - setActiveAndVisibility(m_activeTokenIds); + setActiveAndVisibility(utility::concat(m_activeNodeIds, m_activeEdgeIds)); layoutNesting(); GraphPostprocessor::doPostprocessing(m_dummyNodes); @@ -359,8 +368,8 @@ void GraphController::setActiveAndVisibility(const std::vector& activeTokenI continue; } - DummyNode* from = findDummyNodeRecursive(m_dummyNodes, edge.ownerId); - DummyNode* to = findDummyNodeRecursive(m_dummyNodes, edge.targetId); + DummyNode* from = findTopLevelDummyNodeRecursive(m_dummyNodes, edge.ownerId); + DummyNode* to = findTopLevelDummyNodeRecursive(m_dummyNodes, edge.targetId); if (from && to && (from->active || to->active)) { @@ -909,6 +918,30 @@ DummyNode* GraphController::findDummyNodeRecursive(std::vector& nodes return nullptr; } +DummyNode* GraphController::findTopLevelDummyNodeRecursive(std::vector& nodes, Id tokenId) const +{ + for (DummyNode& node : nodes) + { + if (node.isGraphNode()) + { + if (node.data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE)) + { + DummyNode* result = findDummyNodeRecursive(node.subNodes, tokenId); + if (result != nullptr) + { + return result; + } + } + else if (node.data->getId() == tokenId) + { + return &node; + } + } + } + + return nullptr; +} + DummyNode* GraphController::findDummyNodeAccessRecursive( std::vector& nodes, Id parentId, TokenComponentAccess::AccessType type ) const { diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index d68e3bd6..736dae64 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -76,6 +76,7 @@ private: void layoutToGrid(DummyNode& node) const; DummyNode* findDummyNodeRecursive(std::vector& nodes, Id tokenId) const; + DummyNode* findTopLevelDummyNodeRecursive(std::vector& nodes, Id tokenId) const; DummyNode* findDummyNodeAccessRecursive(std::vector& nodes, Id parentId, TokenComponentAccess::AccessType type) const; void buildGraph(MessageBase* message); @@ -85,7 +86,8 @@ private: std::vector m_dummyNodes; std::vector m_dummyEdges; - std::vector m_activeTokenIds; + std::vector m_activeNodeIds; + std::vector m_activeEdgeIds; std::shared_ptr m_graph; }; diff --git a/src/lib/component/controller/SearchController.cpp b/src/lib/component/controller/SearchController.cpp index 6a7fe259..15365eaa 100644 --- a/src/lib/component/controller/SearchController.cpp +++ b/src/lib/component/controller/SearchController.cpp @@ -14,27 +14,16 @@ SearchController::~SearchController() void SearchController::handleMessage(MessageActivateEdge* message) { - if (message->isIgnorable()) + if (!message->isAggregation()) { return; } - SearchMatch match; - match.fullName = message->name; - match.nodeType = Node::NODE_CLASS; - match.tokenIds.insert(message->tokenId); - match.queryNodeType = QueryNode::QUERYNODETYPE_TOKEN; - - getView()->setMatches(std::deque(1, match)); + getView()->setMatches(std::deque()); } void SearchController::handleMessage(MessageActivateFile* message) { - if (message->isIgnorable()) - { - return; - } - SearchMatch match; match.fullName = message->filePath.fileName(); match.nodeType = Node::NODE_FILE; @@ -46,11 +35,6 @@ void SearchController::handleMessage(MessageActivateFile* message) void SearchController::handleMessage(MessageActivateNode* message) { - if (message->isIgnorable()) - { - return; - } - SearchMatch match; match.fullName = message->name; match.nodeType = message->type; @@ -72,11 +56,6 @@ void SearchController::handleMessage(MessageFinishedParsing* message) void SearchController::handleMessage(MessageSearch* message) { - if (message->isIgnorable()) - { - return; - } - getView()->setMatches(message->getMatches()); } diff --git a/src/lib/component/controller/UndoRedoController.cpp b/src/lib/component/controller/UndoRedoController.cpp index e0981e5e..5648abc1 100644 --- a/src/lib/component/controller/UndoRedoController.cpp +++ b/src/lib/component/controller/UndoRedoController.cpp @@ -33,7 +33,7 @@ void UndoRedoController::handleMessage(MessageActivateEdge* message) return; } - Command command(std::make_shared(*message), (message->type == Edge::EDGE_AGGREGATION ? 0 : 1)); + Command command(std::make_shared(*message), (message->isAggregation() ? 0 : 1)); processCommand(command); } diff --git a/src/lib/utility/messaging/type/MessageActivateEdge.h b/src/lib/utility/messaging/type/MessageActivateEdge.h index e293e6ad..3f13b841 100644 --- a/src/lib/utility/messaging/type/MessageActivateEdge.h +++ b/src/lib/utility/messaging/type/MessageActivateEdge.h @@ -22,6 +22,11 @@ public: return "MessageActivateEdge"; } + bool isAggregation() const + { + return type == Edge::EDGE_AGGREGATION; + } + const Id tokenId; const Edge::EdgeType type; const std::string name; diff --git a/src/lib/utility/messaging/type/MessageActivateTokens.h b/src/lib/utility/messaging/type/MessageActivateTokens.h index ad560f6f..923669a0 100644 --- a/src/lib/utility/messaging/type/MessageActivateTokens.h +++ b/src/lib/utility/messaging/type/MessageActivateTokens.h @@ -10,6 +10,7 @@ public: MessageActivateTokens(const std::vector& tokenIds) : tokenIds(tokenIds) , isEdge(false) + , isAggregation(false) , isFromSystem(false) { } @@ -17,6 +18,7 @@ public: MessageActivateTokens(Id tokenId) : tokenIds(1, tokenId) , isEdge(false) + , isAggregation(false) , isFromSystem(false) { } @@ -29,6 +31,7 @@ public: const std::vector tokenIds; bool isEdge; + bool isAggregation; bool isFromSystem; }; diff --git a/src/lib/utility/utility.h b/src/lib/utility/utility.h index 4fc7facf..629cd12c 100644 --- a/src/lib/utility/utility.h +++ b/src/lib/utility/utility.h @@ -31,7 +31,7 @@ namespace utility template std::vector utility::concat(const std::vector& a, const std::vector& b) { - std::vector r(a.size() + b.size()); + std::vector r; append(r, a); append(r, b); return r;