diff --git a/src/lib/component/controller/helper/BucketLayouter.cpp b/src/lib/component/controller/helper/BucketLayouter.cpp index c0c8cbe2..e4f06e50 100644 --- a/src/lib/component/controller/helper/BucketLayouter.cpp +++ b/src/lib/component/controller/helper/BucketLayouter.cpp @@ -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 edge : edges) + std::deque> remainingEdges(edges.begin(), edges.end()); + size_t skipCount = 0; + bool force = false; + + while (remainingEdges.size()) { + if (skipCount == remainingEdges.size()) + { + force = true; + } + + std::shared_ptr edge = remainingEdges.front(); + remainingEdges.pop_front(); + std::shared_ptr owner = findTopMostDummyNodeRecursive(nodes, edge->ownerId, nullptr); std::shared_ptr 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 BucketLayouter::findTopMostDummyNodeRecursive( return nullptr; } -void BucketLayouter::addNode(std::shared_ptr node) -{ - Bucket* bucket = getBucket(0, 0); - bucket->addNode(node); -} - -bool BucketLayouter::addNode(std::shared_ptr owner, std::shared_ptr 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; diff --git a/src/lib/component/controller/helper/BucketLayouter.h b/src/lib/component/controller/helper/BucketLayouter.h index 1274cf90..07c1de13 100644 --- a/src/lib/component/controller/helper/BucketLayouter.h +++ b/src/lib/component/controller/helper/BucketLayouter.h @@ -57,9 +57,6 @@ private: std::shared_ptr findTopMostDummyNodeRecursive( std::vector>& nodes, Id tokenId, std::shared_ptr top); - void addNode(std::shared_ptr node); - bool addNode(std::shared_ptr owner, std::shared_ptr target, bool horizontal); - Bucket* getBucket(int i, int j); Bucket* getBucket(std::shared_ptr node);