logic: Show inheritance edges between parents of active symbol and other visible symbols (issue #167)

* add inheritance edges between parents of active symbol and other visible symbols
* add dashed inheritance edges when symbols are no direct decendants
* inheritance edges are also respected in layouting, putting base/derived classes in the correct top/bottom spot now

bug id = 167
This commit is contained in:
Eberhard Graether
2017-07-16 18:40:59 +02:00
parent 9a36d48d1e
commit 9d0b86ad98
19 changed files with 261 additions and 17 deletions
+53
View File
@@ -34,6 +34,12 @@ void HierarchyCache::HierarchyNode::setParent(HierarchyNode* parent)
m_parent = parent;
}
void HierarchyCache::HierarchyNode::addBase(HierarchyNode* base, Id edgeId)
{
m_bases.push_back(base);
m_baseEdgeIds.push_back(edgeId);
}
void HierarchyCache::HierarchyNode::addChild(HierarchyNode* child)
{
m_children.push_back(child);
@@ -100,6 +106,30 @@ void HierarchyCache::HierarchyNode::setIsImplicit(bool isImplicit)
m_isImplicit = isImplicit;
}
void HierarchyCache::HierarchyNode::addInheritanceEdgesRecursive(
Id startId, std::vector<Id> inheritanceEdgeIds,
const std::set<Id>& nodeIds, std::vector<std::tuple<Id, Id, std::vector<Id>>>* inheritanceEdges)
{
for (size_t i = 0; i < m_bases.size(); i++)
{
HierarchyNode* base = m_bases[i];
Id baseId = base->getNodeId();
std::vector<Id> inheritanceEdgeIds2 = inheritanceEdgeIds;
inheritanceEdgeIds2.push_back(m_baseEdgeIds[i]);
if (nodeIds.find(baseId) != nodeIds.end())
{
std::vector<Id> inheritanceEdgeIds3 = inheritanceEdgeIds2;
inheritanceEdges->push_back(std::make_tuple<Id, Id, std::vector<Id>>(
std::forward<Id>(startId), std::forward<Id>(baseId), std::forward<std::vector<Id>>(inheritanceEdgeIds3)));
}
base->addInheritanceEdgesRecursive(startId, inheritanceEdgeIds2, nodeIds, inheritanceEdges);
}
}
void HierarchyCache::clear()
{
@@ -120,6 +150,14 @@ void HierarchyCache::createConnection(Id edgeId, Id fromId, Id toId, bool source
to->setIsImplicit(targetImplicit);
}
void HierarchyCache::createInheritance(Id edgeId, Id fromId, Id toId)
{
HierarchyNode* from = createNode(fromId);
HierarchyNode* to = createNode(toId);
from->addBase(to, edgeId);
}
Id HierarchyCache::getLastVisibleParentNodeId(Id nodeId) const
{
HierarchyNode* node = nullptr;
@@ -240,6 +278,21 @@ bool HierarchyCache::nodeHasChildren(Id nodeId) const
return false;
}
std::vector<std::tuple<Id, Id, std::vector<Id>>> HierarchyCache::getInheritanceEdgesForNodeId(
Id nodeId, const std::set<Id>& nodeIds) const
{
std::vector<std::tuple<Id, Id, std::vector<Id>>> inheritanceEdges;
HierarchyNode* node = getNode(nodeId);
if (node)
{
std::vector<Id> inheritanceEdgeIds;
node->addInheritanceEdgesRecursive(node->getNodeId(), inheritanceEdgeIds, nodeIds, & inheritanceEdges);
}
return inheritanceEdges;
}
HierarchyCache::HierarchyNode* HierarchyCache::getNode(Id nodeId) const
{
std::map<Id, std::shared_ptr<HierarchyNode>>::const_iterator it = m_nodes.find(nodeId);