ui: don't hide implicit children of implicit nodes

This commit is contained in:
Eberhard Graether
2017-09-14 03:38:32 +02:00
parent 84305c155c
commit 8f4e521f0b
4 changed files with 49 additions and 16 deletions
@@ -1473,7 +1473,7 @@ void GraphController::addExpandToggleNode(DummyNode* node) const
for (const std::shared_ptr<DummyNode>& subSubNode : subNode->subNodes)
{
if (subSubNode->visible && (!subSubNode->isGraphNode() || !subSubNode->data->isImplicit()))
if (subSubNode->visible && (!subSubNode->isGraphNode() || !subSubNode->data->isImplicit() || node->data->isImplicit()))
{
visibleSubNodeCount++;
}
+30 -5
View File
@@ -63,6 +63,15 @@ size_t HierarchyCache::HierarchyNode::getNonImplicitChildrenCount() const
return count;
}
void HierarchyCache::HierarchyNode::addChildIds(std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const
{
for (const HierarchyNode* child : m_children)
{
nodeIds->push_back(child->getNodeId());
edgeIds->push_back(child->getEdgeId());
}
}
void HierarchyCache::HierarchyNode::addNonImplicitChildIds(std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const
{
for (const HierarchyNode* child : m_children)
@@ -136,7 +145,8 @@ void HierarchyCache::clear()
m_nodes.clear();
}
void HierarchyCache::createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool targetImplicit)
void HierarchyCache::createConnection(
Id edgeId, Id fromId, Id toId, bool sourceVisible, bool sourceImplicit, bool targetImplicit)
{
HierarchyNode* from = createNode(fromId);
HierarchyNode* to = createNode(toId);
@@ -145,6 +155,7 @@ void HierarchyCache::createConnection(Id edgeId, Id fromId, Id toId, bool source
to->setParent(from);
from->setIsVisible(sourceVisible);
from->setIsImplicit(sourceImplicit);
to->setEdgeId(edgeId);
to->setIsImplicit(targetImplicit);
@@ -227,21 +238,35 @@ void HierarchyCache::addAllChildIdsForNodeId(Id nodeId, std::set<Id>* nodeIds, s
}
}
void HierarchyCache::addFirstNonImplicitChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const
void HierarchyCache::addFirstChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const
{
HierarchyNode* node = getNode(nodeId);
if (node)
{
node->addNonImplicitChildIds(nodeIds, edgeIds);
if (node->isImplicit())
{
node->addChildIds(nodeIds, edgeIds);
}
else
{
node->addNonImplicitChildIds(nodeIds, edgeIds);
}
}
}
size_t HierarchyCache::getFirstNonImplicitChildIdsCountForNodeId(Id nodeId) const
size_t HierarchyCache::getFirstChildIdsCountForNodeId(Id nodeId) const
{
HierarchyNode* node = getNode(nodeId);
if (node)
{
return node->getNonImplicitChildrenCount();
if (node->isImplicit())
{
return node->getChildrenCount();
}
else
{
return node->getNonImplicitChildrenCount();
}
}
return 0;
}
+4 -3
View File
@@ -13,7 +13,7 @@ class HierarchyCache
public:
void clear();
void createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool targetImplicit);
void createConnection(Id edgeId, Id fromId, Id toId, bool sourceVisible, bool sourceImplicit, bool targetImplicit);
void createInheritance(Id edgeId, Id fromId, Id toId);
Id getLastVisibleParentNodeId(Id nodeId) const;
@@ -22,9 +22,9 @@ public:
void addAllVisibleParentIdsForNodeId(Id nodeId, std::set<Id>* nodeIds, std::set<Id>* edgeIds) const;
void addAllChildIdsForNodeId(Id nodeId, std::set<Id>* nodeIds, std::set<Id>* edgeIds) const;
void addFirstNonImplicitChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const;
void addFirstChildIdsForNodeId(Id nodeId, std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const;
size_t getFirstNonImplicitChildIdsCountForNodeId(Id nodeId) const;
size_t getFirstChildIdsCountForNodeId(Id nodeId) const;
bool isChildOfVisibleNodeOrInvisible(Id nodeId) const;
@@ -55,6 +55,7 @@ private:
size_t getChildrenCount() const;
size_t getNonImplicitChildrenCount() const;
void addChildIds(std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const;
void addNonImplicitChildIds(std::vector<Id>* nodeIds, std::vector<Id>* edgeIds) const;
void addChildIdsRecursive(std::set<Id>* nodeIds, std::set<Id>* edgeIds) const;
+14 -7
View File
@@ -918,7 +918,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForActiveTokenIds(
if (nodeType & (Node::NODE_NAMESPACE | Node::NODE_PACKAGE))
{
ids.clear();
m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(elementId, &ids, &edgeIds);
m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &ids, &edgeIds);
edgeIds.clear();
isNamespace = true;
@@ -926,7 +926,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForActiveTokenIds(
else
{
nodeIds.push_back(elementId);
m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(elementId, &nodeIds, &edgeIds);
m_hierarchyCache.addFirstChildIdsForNodeId(elementId, &nodeIds, &edgeIds);
edgeIds.clear();
std::vector<StorageEdge> edges = m_sqliteIndexStorage.getEdgesBySourceOrTargetId(elementId);
@@ -1019,7 +1019,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForActiveTokenIds(
{
if (graph->getNodeById(nodeId))
{
m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(nodeId, &expandedChildIds, &expandedChildEdgeIds);
m_hierarchyCache.addFirstChildIdsForNodeId(nodeId, &expandedChildIds, &expandedChildEdgeIds);
}
}
@@ -1050,7 +1050,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForChildrenOfNodeId(Id nodeId)
std::vector<Id> edgeIds;
nodeIds.push_back(nodeId);
m_hierarchyCache.addFirstNonImplicitChildIdsForNodeId(nodeId, &nodeIds, &edgeIds);
m_hierarchyCache.addFirstChildIdsForNodeId(nodeId, &nodeIds, &edgeIds);
std::shared_ptr<Graph> graph = std::make_shared<Graph>();
addNodesToGraph(nodeIds, graph.get(), true);
@@ -2171,7 +2171,7 @@ void PersistentStorage::addNodesToGraph(const std::vector<Id>& newNodeIds, Graph
if (addChildCount)
{
node->setChildCount(m_hierarchyCache.getFirstNonImplicitChildIdsCountForNodeId(storageNode.id));
node->setChildCount(m_hierarchyCache.getFirstChildIdsCountForNodeId(storageNode.id));
}
}
}
@@ -2637,15 +2637,22 @@ void PersistentStorage::buildHierarchyCache()
{
bool sourceIsVisible = !(sourceNodeTypeMap[edge.sourceNodeId] & Node::NODE_NOT_VISIBLE);
bool sourceIsImplicit = false;
auto it = m_symbolDefinitionKinds.find(edge.sourceNodeId);
if (it != m_symbolDefinitionKinds.end())
{
sourceIsImplicit = (it->second == DEFINITION_IMPLICIT);
}
bool targetIsImplicit = false;
auto it = m_symbolDefinitionKinds.find(edge.targetNodeId);
it = m_symbolDefinitionKinds.find(edge.targetNodeId);
if (it != m_symbolDefinitionKinds.end())
{
targetIsImplicit = (it->second == DEFINITION_IMPLICIT);
}
m_hierarchyCache.createConnection(
edge.id, edge.sourceNodeId, edge.targetNodeId, sourceIsVisible, targetIsImplicit);
edge.id, edge.sourceNodeId, edge.targetNodeId, sourceIsVisible, sourceIsImplicit, targetIsImplicit);
}
std::vector<StorageEdge> inheritanceEdges = m_sqliteIndexStorage.getEdgesByType(Edge::typeToInt(Edge::EDGE_INHERITANCE));