logic: don't show implicit or undefined child nodes in graph unless connected
* visit implicit declarations in ASTVisitor * show implicit and undefined child nodes only when connected * fixed some bundle edges couldn't be split * add "implicit" to tooltip * show undefiend and implicit nodes hatched
This commit is contained in:
@@ -376,6 +376,8 @@ void GraphController::setActiveAndVisibility(const std::vector<Id>& activeTokenI
|
||||
|
||||
for (DummyNode& node : m_dummyNodes)
|
||||
{
|
||||
removeImplicitAndUndefinedChildrenRecursive(node);
|
||||
|
||||
setNodeVisibilityRecursiveBottomUp(node, noActive);
|
||||
}
|
||||
}
|
||||
@@ -395,6 +397,35 @@ void GraphController::setNodeActiveRecursive(DummyNode& node, const std::vector<
|
||||
}
|
||||
}
|
||||
|
||||
void GraphController::removeImplicitAndUndefinedChildrenRecursive(DummyNode& node)
|
||||
{
|
||||
for (size_t i = 0; i < node.subNodes.size(); i++)
|
||||
{
|
||||
bool removeNode = false;
|
||||
|
||||
DummyNode& subNode = node.subNodes[i];
|
||||
if (subNode.isGraphNode() && !subNode.data->isExplicit() && !subNode.connected && !subNode.active && !subNode.subNodes.size())
|
||||
{
|
||||
removeNode = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
removeImplicitAndUndefinedChildrenRecursive(subNode);
|
||||
|
||||
if (subNode.isAccessNode() && subNode.subNodes.size() == 0)
|
||||
{
|
||||
removeNode = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (removeNode)
|
||||
{
|
||||
node.subNodes.erase(node.subNodes.begin() + i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool GraphController::setNodeVisibilityRecursiveBottomUp(DummyNode& node, bool noActive) const
|
||||
{
|
||||
node.visible = false;
|
||||
|
||||
@@ -63,6 +63,7 @@ private:
|
||||
|
||||
void setActiveAndVisibility(const std::vector<Id>& activeTokenIds);
|
||||
void setNodeActiveRecursive(DummyNode& node, const std::vector<Id>& activeTokenIds) const;
|
||||
void removeImplicitAndUndefinedChildrenRecursive(DummyNode& node);
|
||||
bool setNodeVisibilityRecursiveBottomUp(DummyNode& node, bool noActive) const;
|
||||
void setNodeVisibilityRecursiveTopDown(DummyNode& node, bool parentExpanded) const;
|
||||
void deactivateNodesRecursive(std::vector<DummyNode>* nodes) const;
|
||||
|
||||
@@ -261,7 +261,7 @@ GraphViewStyle::NodeMargins GraphViewStyle::getMarginsOfAccessNode(TokenComponen
|
||||
margins.minWidth = 58;
|
||||
break;
|
||||
case TokenComponentAccess::ACCESS_TEMPLATE:
|
||||
margins.minWidth = 103;
|
||||
margins.minWidth = 133;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -458,7 +458,11 @@ std::vector<Id> Storage::getNodeIdsForLocationIds(const std::vector<Id>& locatio
|
||||
}
|
||||
else
|
||||
{
|
||||
nodeIds.insert(elementId);
|
||||
StorageNode node = m_sqliteStorage.getNodeById(elementId);
|
||||
if (node.id != 0 && intToDefinitionType(node.definitionType) == DEFINITION_EXPLICIT)
|
||||
{
|
||||
nodeIds.insert(elementId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -757,13 +761,23 @@ void Storage::addNodesToGraph(const std::vector<Id>& nodeIds, Graph* graph) cons
|
||||
NameHierarchy nameHierarchy = NameHierarchy::deserialize(storageNode.serializedName);
|
||||
|
||||
Node::NodeType type = Node::intToType(storageNode.type);
|
||||
DefinitionType defType = intToDefinitionType(storageNode.definitionType);
|
||||
Node* node = graph->createNode(
|
||||
storageNode.id,
|
||||
type,
|
||||
nameHierarchy,
|
||||
intToDefinitionType(storageNode.definitionType) != DEFINITION_NONE
|
||||
defType != DEFINITION_NONE
|
||||
);
|
||||
|
||||
if (defType == DEFINITION_IMPLICIT)
|
||||
{
|
||||
node->setImplicit(true);
|
||||
}
|
||||
else if (defType == DEFINITION_EXPLICIT)
|
||||
{
|
||||
node->setExplicit(true);
|
||||
}
|
||||
|
||||
if (type == Node::NODE_FUNCTION || type == Node::NODE_METHOD)
|
||||
{
|
||||
std::string signatureString = nameHierarchy.getRawNameWithSignature();
|
||||
|
||||
@@ -98,6 +98,8 @@ Node::Node(Id id, NodeType type, NameHierarchy nameHierarchy, bool defined)
|
||||
, m_type(type)
|
||||
, m_nameHierarchy(nameHierarchy)
|
||||
, m_defined(defined)
|
||||
, m_implicit(false)
|
||||
, m_explicit(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -152,6 +154,26 @@ void Node::setDefined(bool defined)
|
||||
m_defined = defined;
|
||||
}
|
||||
|
||||
bool Node::isImplicit() const
|
||||
{
|
||||
return m_implicit;
|
||||
}
|
||||
|
||||
void Node::setImplicit(bool implicit)
|
||||
{
|
||||
m_implicit = implicit;
|
||||
}
|
||||
|
||||
bool Node::isExplicit() const
|
||||
{
|
||||
return m_explicit;
|
||||
}
|
||||
|
||||
void Node::setExplicit(bool bExplicit)
|
||||
{
|
||||
m_explicit = bExplicit;
|
||||
}
|
||||
|
||||
const std::vector<Edge*>& Node::getEdges() const
|
||||
{
|
||||
return m_edges;
|
||||
|
||||
@@ -63,6 +63,12 @@ public:
|
||||
bool isDefined() const;
|
||||
void setDefined(bool defined);
|
||||
|
||||
bool isImplicit() const;
|
||||
void setImplicit(bool implicit);
|
||||
|
||||
bool isExplicit() const;
|
||||
void setExplicit(bool bExplicit);
|
||||
|
||||
const std::vector<Edge*>& getEdges() const;
|
||||
|
||||
void addEdge(Edge* edge);
|
||||
@@ -107,6 +113,8 @@ private:
|
||||
NodeType m_type;
|
||||
NameHierarchy m_nameHierarchy;
|
||||
bool m_defined;
|
||||
bool m_implicit;
|
||||
bool m_explicit;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& ostream, const Node& node);
|
||||
|
||||
Reference in New Issue
Block a user