diff --git a/src/app/qt/view/QtGraphView.cpp b/src/app/qt/view/QtGraphView.cpp index 56fb6604..8681cd1a 100644 --- a/src/app/qt/view/QtGraphView.cpp +++ b/src/app/qt/view/QtGraphView.cpp @@ -272,7 +272,7 @@ std::shared_ptr QtGraphView::createNodeRecursive( std::shared_ptr newNode; if (node.isGraphNode()) { - newNode = std::make_shared(node.data, node.childVisible); + newNode = std::make_shared(node.data, node.hasNamespace, node.childVisible); } else if (node.isAccessNode()) { diff --git a/src/app/qt/view/graphElements/QtGraphNodeData.cpp b/src/app/qt/view/graphElements/QtGraphNodeData.cpp index c9e9f278..7828be52 100644 --- a/src/app/qt/view/graphElements/QtGraphNodeData.cpp +++ b/src/app/qt/view/graphElements/QtGraphNodeData.cpp @@ -5,13 +5,20 @@ #include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageGraphNodeMove.h" -QtGraphNodeData::QtGraphNodeData(const Node* data, bool childVisible) +QtGraphNodeData::QtGraphNodeData(const Node* data, bool hasNamespace, bool childVisible) : m_data(data) , m_childVisible(childVisible) { this->setAcceptHoverEvents(true); - this->setName(data->getName()); + if (hasNamespace) + { + this->setName(data->getFullName()); + } + else + { + this->setName(data->getName()); + } } QtGraphNodeData::~QtGraphNodeData() @@ -35,10 +42,7 @@ Id QtGraphNodeData::getTokenId() const void QtGraphNodeData::onClick() { - if (!m_data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE)) - { - MessageActivateNode(m_data->getId(), m_data->getType(), m_data->getFullName()).dispatch(); - } + MessageActivateNode(m_data->getId(), m_data->getType(), m_data->getFullName()).dispatch(); } void QtGraphNodeData::moved(const Vec2i& oldPosition) diff --git a/src/app/qt/view/graphElements/QtGraphNodeData.h b/src/app/qt/view/graphElements/QtGraphNodeData.h index a19df239..94abe24a 100644 --- a/src/app/qt/view/graphElements/QtGraphNodeData.h +++ b/src/app/qt/view/graphElements/QtGraphNodeData.h @@ -7,7 +7,7 @@ class QtGraphNodeData : public QtGraphNode { public: - QtGraphNodeData(const Node* data, bool childVisible); + QtGraphNodeData(const Node* data, bool hasNamespace, bool childVisible); virtual ~QtGraphNodeData(); const Node* getData() const; diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index 0103048a..844b805f 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -168,6 +168,8 @@ void GraphController::createDummyGraphForTokenIds(const std::vector& tokenId autoExpandActiveNode(tokenIds); setActiveAndVisibility(tokenIds); + splitNamespaceNodes(); + bundleNodes(); layoutNesting(); @@ -270,6 +272,45 @@ DummyNode GraphController::createDummyNodeTopDown(Node* node) return result; } +void GraphController::splitNamespaceNodes() +{ + std::vector nodes; + + for (const DummyNode& node : m_dummyNodes) + { + std::vector newNodes = splitNamespaceNodesRecursive(node, false, true); + nodes.insert(nodes.end(), newNodes.begin(), newNodes.end()); + } + + m_dummyNodes = nodes; +} + +std::vector GraphController::splitNamespaceNodesRecursive(const DummyNode& node, bool active, bool topLevel) +{ + std::vector nodes; + active |= node.active; + + if (node.isGraphNode() && node.data->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE)) + { + for (const DummyNode& subNode : node.subNodes) + { + std::vector newNodes = splitNamespaceNodesRecursive(subNode, active, false); + for (DummyNode& newNode : newNodes) + { + newNode.hasNamespace = true; + } + + nodes.insert(nodes.end(), newNodes.begin(), newNodes.end()); + } + } + else if (topLevel || active || node.connected) + { + nodes.push_back(node); + } + + return nodes; +} + void GraphController::autoExpandActiveNode(const std::vector& activeTokenIds) { DummyNode* node = nullptr; @@ -409,7 +450,7 @@ void GraphController::setNodeVisibilityRecursiveTopDown(DummyNode& node, bool pa if ((node.isGraphNode() && node.isExpanded()) || (node.isAccessNode() && parentExpanded) || (node.isGraphNode() && node.data->isType(Node::NODE_ENUM)) || - (node.isGraphNode() && node.active && node.data->isType(Node::NODE_NAMESPACE | Node::NODE_UNDEFINED))) + (node.isGraphNode() && node.data->isType(Node::NODE_NAMESPACE | Node::NODE_UNDEFINED))) { for (DummyNode& subNode : node.subNodes) { @@ -492,7 +533,7 @@ void GraphController::bundleNodesMatching(std::function } } - if (matchCount < count) + if (matchCount < count || matchCount == m_dummyNodes.size()) { return; } @@ -674,7 +715,14 @@ void GraphController::layoutNestingRecursive(DummyNode& node) const if (node.isGraphNode()) { - width = margins.charWidth * node.data->getName().size(); + if (node.hasNamespace) + { + width = margins.charWidth * node.data->getFullName().size(); + } + else + { + width = margins.charWidth * node.data->getName().size(); + } if (node.data->isType(Node::NODE_CLASS | Node::NODE_STRUCT) && node.subNodes.size()) { diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index 32572e63..d6757ae7 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -59,6 +59,9 @@ private: bool setNodeVisibilityRecursiveBottomUp(DummyNode& node, bool aggregated) const; void setNodeVisibilityRecursiveTopDown(DummyNode& node, bool parentExpanded) const; + void splitNamespaceNodes(); + std::vector splitNamespaceNodesRecursive(const DummyNode& node, bool active, bool topLevel); + void bundleNodes(); void bundleNodesMatching(std::function matcher, size_t count, const std::string& name); bool isTypeNodeWithSingleAggregation(const DummyNode& node, TokenComponentAggregation::Direction direction) const; diff --git a/src/lib/component/controller/helper/DummyNode.h b/src/lib/component/controller/helper/DummyNode.h index fd64b845..125fe00b 100644 --- a/src/lib/component/controller/helper/DummyNode.h +++ b/src/lib/component/controller/helper/DummyNode.h @@ -22,6 +22,7 @@ public: , connected(false) , aggregated(false) , expanded(false) + , hasNamespace(false) , accessType(TokenComponentAccess::ACCESS_NONE) , invisibleSubNodeCount(0) { @@ -118,6 +119,7 @@ public: bool connected; bool aggregated; bool expanded; + bool hasNamespace; // AccessNode TokenComponentAccess::AccessType accessType;