ui: Fixed inheritance chains not correctly layouted
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user