ui: Fixed inheritance chains not correctly layouted

This commit is contained in:
Eberhard Graether
2019-02-03 17:48:09 +01:00
parent f7eb1fc160
commit 01ac38dd8a
2 changed files with 54 additions and 48 deletions
@@ -269,7 +269,8 @@ void BucketLayouter::createBuckets(
{ {
if (node->hasActiveSubNode() || !edges.size()) if (node->hasActiveSubNode() || !edges.size())
{ {
addNode(node); getBucket(0, 0)->addNode(node);
node->bundleInfo.layoutVertical = false; node->bundleInfo.layoutVertical = false;
activeNodeAdded = true; activeNodeAdded = true;
m_activeParentNode = node.get(); m_activeParentNode = node.get();
@@ -283,11 +284,23 @@ void BucketLayouter::createBuckets(
if (!activeNodeAdded) if (!activeNodeAdded)
{ {
addNode(nodes[0]); getBucket(0, 0)->addNode(nodes[0]);
} }
for (std::shared_ptr<DummyEdge> edge : edges) std::deque<std::shared_ptr<DummyEdge>> remainingEdges(edges.begin(), edges.end());
size_t skipCount = 0;
bool force = false;
while (remainingEdges.size())
{ {
if (skipCount == remainingEdges.size())
{
force = true;
}
std::shared_ptr<DummyEdge> edge = remainingEdges.front();
remainingEdges.pop_front();
std::shared_ptr<DummyNode> owner = findTopMostDummyNodeRecursive(nodes, edge->ownerId, nullptr); std::shared_ptr<DummyNode> owner = findTopMostDummyNodeRecursive(nodes, edge->ownerId, nullptr);
std::shared_ptr<DummyNode> target = findTopMostDummyNodeRecursive(nodes, edge->targetId, nullptr); std::shared_ptr<DummyNode> target = findTopMostDummyNodeRecursive(nodes, edge->targetId, nullptr);
@@ -313,7 +326,44 @@ void BucketLayouter::createBuckets(
std::swap(owner, target); std::swap(owner, target);
} }
horizontal = addNode(owner, target, horizontal); Bucket* ownerBucket = getBucket(owner);
Bucket* targetBucket = getBucket(target);
if (!ownerBucket && !targetBucket)
{
if (force)
{
ownerBucket = getBucket(0, 0);
ownerBucket->addNode(owner);
}
else
{
remainingEdges.push_back(edge);
skipCount++;
continue;
}
}
if (ownerBucket && targetBucket)
{
horizontal = (ownerBucket->j == targetBucket->j);
}
else if (ownerBucket)
{
int i = horizontal ? ownerBucket->i + 1 : ownerBucket->i;
int j = horizontal ? ownerBucket->j : ownerBucket->j - 1;
getBucket(i, j)->addNode(target);
}
else
{
int i = horizontal ? targetBucket->i - 1 : targetBucket->i;
int j = horizontal ? targetBucket->j : targetBucket->j + 1;
getBucket(i, j)->addNode(owner);
}
skipCount = 0;
} }
edge->layoutHorizontal = horizontal; edge->layoutHorizontal = horizontal;
@@ -476,47 +526,6 @@ std::shared_ptr<DummyNode> BucketLayouter::findTopMostDummyNodeRecursive(
return nullptr; return nullptr;
} }
void BucketLayouter::addNode(std::shared_ptr<DummyNode> node)
{
Bucket* bucket = getBucket(0, 0);
bucket->addNode(node);
}
bool BucketLayouter::addNode(std::shared_ptr<DummyNode> owner, std::shared_ptr<DummyNode> target, bool horizontal)
{
Bucket* ownerBucket = getBucket(owner);
Bucket* targetBucket = getBucket(target);
if (!ownerBucket && !targetBucket)
{
ownerBucket = getBucket(0, 0);
ownerBucket->addNode(owner);
}
else if (ownerBucket && targetBucket)
{
return ownerBucket->j == targetBucket->j;
}
if (ownerBucket)
{
int i = horizontal ? ownerBucket->i + 1 : ownerBucket->i;
int j = horizontal ? ownerBucket->j : ownerBucket->j - 1;
Bucket* bucket = getBucket(i, j);
bucket->addNode(target);
}
else
{
int i = horizontal ? targetBucket->i - 1 : targetBucket->i;
int j = horizontal ? targetBucket->j : targetBucket->j + 1;
Bucket* bucket = getBucket(i, j);
bucket->addNode(owner);
}
return horizontal;
}
Bucket* BucketLayouter::getBucket(int i, int j) Bucket* BucketLayouter::getBucket(int i, int j)
{ {
bool newColumn = false; bool newColumn = false;
@@ -57,9 +57,6 @@ private:
std::shared_ptr<DummyNode> findTopMostDummyNodeRecursive( std::shared_ptr<DummyNode> findTopMostDummyNodeRecursive(
std::vector<std::shared_ptr<DummyNode>>& nodes, Id tokenId, std::shared_ptr<DummyNode> top); std::vector<std::shared_ptr<DummyNode>>& nodes, Id tokenId, std::shared_ptr<DummyNode> top);
void addNode(std::shared_ptr<DummyNode> node);
bool addNode(std::shared_ptr<DummyNode> owner, std::shared_ptr<DummyNode> target, bool horizontal);
Bucket* getBucket(int i, int j); Bucket* getBucket(int i, int j);
Bucket* getBucket(std::shared_ptr<DummyNode> node); Bucket* getBucket(std::shared_ptr<DummyNode> node);