diff --git a/src/controllers/DropArea.cpp b/src/controllers/DropArea.cpp index 41d1cd44..92d3f8cc 100644 --- a/src/controllers/DropArea.cpp +++ b/src/controllers/DropArea.cpp @@ -652,3 +652,8 @@ bool DropArea::deserialize(const LayoutSaver::MultiSplitter &l) setRootItem(new Layouting::ItemBoxContainer(view())); return Layout::deserialize(l); } + +int DropArea::numSideBySide_recursive(Qt::Orientation o) const +{ + return m_rootItem->numSideBySide_recursive(o); +} diff --git a/src/controllers/DropArea.h b/src/controllers/DropArea.h index 606d377e..16f6446f 100644 --- a/src/controllers/DropArea.h +++ b/src/controllers/DropArea.h @@ -131,6 +131,10 @@ public: /// @brief overload that just resizes widgets within a sub-tree void layoutEqually(Layouting::ItemBoxContainer *); + /// @brief Returns the number of items layed out horizontally or vertically + /// But honours nesting + int numSideBySide_recursive(Qt::Orientation) const; + Layouting::ItemBoxContainer *rootItem() const; private: diff --git a/src/private/multisplitter/Item.cpp b/src/private/multisplitter/Item.cpp index 1d78fb18..2e38e003 100644 --- a/src/private/multisplitter/Item.cpp +++ b/src/private/multisplitter/Item.cpp @@ -992,6 +992,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 0d010f20..d146a3fa 100644 --- a/src/private/multisplitter/Item_p.h +++ b/src/private/multisplitter/Item_p.h @@ -481,6 +481,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 5cdf8a1d..a864d1a5 100644 --- a/tests/tst_multisplitter.cpp +++ b/tests/tst_multisplitter.cpp @@ -97,6 +97,7 @@ private Q_SLOTS: void tst_maxSizeHonouredWhenAnotherRemoved(); void tst_simplify(); void tst_adjacentLayoutBorders(); + void tst_numSideBySide_recursive(); }; static bool serializeDeserializeTest(const std::unique_ptr &root) @@ -1769,6 +1770,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) { for (FrontendType type : Platform::frontendTypes()) {