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())
{
addNode(node);
getBucket(0, 0)->addNode(node);
node->bundleInfo.layoutVertical = false;
activeNodeAdded = true;
m_activeParentNode = node.get();
@@ -283,11 +284,23 @@ void BucketLayouter::createBuckets(
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> target = findTopMostDummyNodeRecursive(nodes, edge->targetId, nullptr);
@@ -313,7 +326,44 @@ void BucketLayouter::createBuckets(
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;
@@ -476,47 +526,6 @@ std::shared_ptr<DummyNode> BucketLayouter::findTopMostDummyNodeRecursive(
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)
{
bool newColumn = false;
@@ -57,9 +57,6 @@ private:
std::shared_ptr<DummyNode> findTopMostDummyNodeRecursive(
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(std::shared_ptr<DummyNode> node);