diff --git a/src/private/multisplitter/Item.cpp b/src/private/multisplitter/Item.cpp index a1f083fa..0ca6a299 100644 --- a/src/private/multisplitter/Item.cpp +++ b/src/private/multisplitter/Item.cpp @@ -979,6 +979,32 @@ ItemBoxContainer::~ItemBoxContainer() delete d; } +int ItemBoxContainer::numSideBySide_recursive(Qt::Orientation o) const +{ + int num = 0; + if (d->m_orientation == o) { + // Example: Container is horizontal and we want to know how many layouted horizontally + for (Item *child : m_children) { + if (ItemBoxContainer *container = child->asBoxContainer()) { + num += container->numSideBySide_recursive(o); + } else { + num++; + } + } + } else { + // Example: Container is vertical and we want to know how many layouted horizontally + for (Item *child : m_children) { + if (ItemBoxContainer *container = child->asBoxContainer()) { + num = qMax(num, container->numSideBySide_recursive(o)); + } else { + num = qMax(num, 1); + } + } + } + + return num; +} + bool ItemBoxContainer::checkSanity() { d->m_checkSanityScheduled = false; diff --git a/src/private/multisplitter/Item_p.h b/src/private/multisplitter/Item_p.h index 2bbc4fbe..7acf96b5 100644 --- a/src/private/multisplitter/Item_p.h +++ b/src/private/multisplitter/Item_p.h @@ -475,6 +475,10 @@ public: bool isHorizontal() const; int length() const; + /// @brief Returns the number of items layed out horizontally or vertically + /// But honours nesting + int numSideBySide_recursive(Qt::Orientation) const; + private: bool hasOrientation() const; int indexOfVisibleChild(const Item *) const; diff --git a/tests/tst_multisplitter.cpp b/tests/tst_multisplitter.cpp index d73c0d2b..f7b4998b 100644 --- a/tests/tst_multisplitter.cpp +++ b/tests/tst_multisplitter.cpp @@ -195,6 +195,7 @@ private Q_SLOTS: void tst_maxSizeHonouredWhenAnotherRemoved(); void tst_simplify(); void tst_adjacentLayoutBorders(); + void tst_numSideBySide_recursive(); }; class MyHostWidget : public QWidget @@ -1887,6 +1888,40 @@ void TestMultiSplitter::tst_adjacentLayoutBorders() QCOMPARE(borders4, LayoutBorderLocation_South); } +void TestMultiSplitter::tst_numSideBySide_recursive() +{ + auto root = createRoot(); + QVERIFY(root->isVertical()); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 0); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 0); + + auto item1 = createItem(); + root->insertItem(item1, Location_OnRight); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 1); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 1); + + + auto item2 = createItem(); + root->insertItem(item2, Location_OnTop); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 2); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 1); + + auto item3 = createItem(); + root->insertItem(item3, Location_OnTop); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 3); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 1); + + auto item1Child = createItem(); + ItemBoxContainer::insertItemRelativeTo(item1Child, item1, Location_OnLeft); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 3); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 2); + + auto item1Child1Child = createItem(); + ItemBoxContainer::insertItemRelativeTo(item1Child1Child, item1Child, Location_OnBottom); + QCOMPARE(root->numSideBySide_recursive(Qt::Vertical), 4); + QCOMPARE(root->numSideBySide_recursive(Qt::Horizontal), 2); +} + int main(int argc, char *argv[]) { bool qpaPassed = false;