diff --git a/src/private/multisplitter/Item.cpp b/src/private/multisplitter/Item.cpp index 24f1783f..574d0803 100644 --- a/src/private/multisplitter/Item.cpp +++ b/src/private/multisplitter/Item.cpp @@ -1161,8 +1161,10 @@ void ItemContainer::onChildVisibleChanged(Item */*child*/, bool visible) } } -QRect ItemContainer::suggestedDropRect(QSize minSize, const Item *relativeTo, Location loc) const +QRect ItemContainer::suggestedDropRect(Item *item, const Item *relativeTo, Location loc) const { + const QSize minSize = item->minSize(); + if (relativeTo && !relativeTo->parentContainer()) { qWarning() << Q_FUNC_INFO << "No parent container"; return {}; @@ -1197,7 +1199,7 @@ QRect ItemContainer::suggestedDropRect(QSize minSize, const Item *relativeTo, Lo relativeTo = nullptr; } else { // Do it relative to this container instead - return parentContainer()->suggestedDropRect(minSize, this, loc); + return parentContainer()->suggestedDropRect(item, this, loc); } } diff --git a/src/private/multisplitter/Item_p.h b/src/private/multisplitter/Item_p.h index 25a98d43..d19bc61b 100644 --- a/src/private/multisplitter/Item_p.h +++ b/src/private/multisplitter/Item_p.h @@ -510,7 +510,7 @@ public: QVector calculateSqueezes(SizingInfo::List::ConstIterator begin, SizingInfo::List::ConstIterator end, int needed, NeighbourSqueezeStrategy, bool reversed = false) const; - QRect suggestedDropRect(QSize minSize, const Item *relativeTo, Location) const; + QRect suggestedDropRect(Item *item, const Item *relativeTo, Location) const; void positionItems(); void positionItems(SizingInfo::List &sizes); void clear(); diff --git a/src/private/multisplitter/MultiSplitterLayout.cpp b/src/private/multisplitter/MultiSplitterLayout.cpp index 731ae978..a9be7b62 100644 --- a/src/private/multisplitter/MultiSplitterLayout.cpp +++ b/src/private/multisplitter/MultiSplitterLayout.cpp @@ -367,14 +367,17 @@ ItemContainer *MultiSplitterLayout::rootItem() const QRect MultiSplitterLayout::rectForDrop(const QWidgetOrQuick *widget, Location location, const Item *relativeTo) const { - const QSize min = Layouting::widgetMinSize(widget); + Item item(nullptr); + item.setSize(widget->size()); + item.setMinSize(Layouting::widgetMinSize(widget)); + item.setMaxSize(widget->maximumSize()); if (relativeTo) { ItemContainer *container = relativeTo->parentContainer(); - QRect rect = container->suggestedDropRect(min, relativeTo, Layouting::Location(location)); + QRect rect = container->suggestedDropRect(&item, relativeTo, Layouting::Location(location)); return container->mapToRoot(rect); } else { - return m_rootItem->suggestedDropRect(min, nullptr, Layouting::Location(location)); + return m_rootItem->suggestedDropRect(&item, nullptr, Layouting::Location(location)); } } diff --git a/src/private/multisplitter/tests/tst_multisplitter.cpp b/src/private/multisplitter/tests/tst_multisplitter.cpp index 6aad0155..a74dee20 100644 --- a/src/private/multisplitter/tests/tst_multisplitter.cpp +++ b/src/private/multisplitter/tests/tst_multisplitter.cpp @@ -769,10 +769,13 @@ void TestMultiSplitter::tst_suggestedRect() auto root = createRoot(); root->setSize(QSize(2000, 1000)); const QSize minSize(100, 100); - QRect leftRect = root->suggestedDropRect(minSize, nullptr, Location_OnLeft); - QRect topRect = root->suggestedDropRect(minSize, nullptr, Location_OnTop); - QRect bottomRect = root->suggestedDropRect(minSize, nullptr, Location_OnBottom); - QRect rightRect = root->suggestedDropRect(minSize, nullptr, Location_OnRight); + Item itemBeingDropped(nullptr); + itemBeingDropped.setMinSize(minSize); + + QRect leftRect = root->suggestedDropRect(&itemBeingDropped, nullptr, Location_OnLeft); + QRect topRect = root->suggestedDropRect(&itemBeingDropped, nullptr, Location_OnTop); + QRect bottomRect = root->suggestedDropRect(&itemBeingDropped, nullptr, Location_OnBottom); + QRect rightRect = root->suggestedDropRect(&itemBeingDropped, nullptr, Location_OnRight); // Test relative to root: QVERIFY(leftRect.width() >= minSize.width()); @@ -792,10 +795,10 @@ void TestMultiSplitter::tst_suggestedRect() Item *item1 = createItem(); item1->setMinSize(QSize(100, 100)); root->insertItem(item1, Location_OnLeft); - leftRect = root->suggestedDropRect(minSize, item1, Location_OnLeft); - topRect = root->suggestedDropRect(minSize, item1, Location_OnTop); - bottomRect = root->suggestedDropRect(minSize, item1, Location_OnBottom); - rightRect = root->suggestedDropRect(minSize, item1, Location_OnRight); + leftRect = root->suggestedDropRect(&itemBeingDropped, item1, Location_OnLeft); + topRect = root->suggestedDropRect(&itemBeingDropped, item1, Location_OnTop); + bottomRect = root->suggestedDropRect(&itemBeingDropped, item1, Location_OnBottom); + rightRect = root->suggestedDropRect(&itemBeingDropped, item1, Location_OnRight); QVERIFY(leftRect.width() >= minSize.width()); QVERIFY(topRect.height() >= minSize.height()); QVERIFY(bottomRect.height() >= minSize.height()); @@ -814,10 +817,10 @@ void TestMultiSplitter::tst_suggestedRect() Item *item2 = createItem(); item1->setMinSize(QSize(100, 100)); root->insertItem(item2, Location_OnRight); - leftRect = root->suggestedDropRect(minSize, item2, Location_OnLeft); - topRect = root->suggestedDropRect(minSize, item2, Location_OnTop); - bottomRect = root->suggestedDropRect(minSize, item2, Location_OnBottom); - rightRect = root->suggestedDropRect(minSize, item2, Location_OnRight); + leftRect = root->suggestedDropRect(&itemBeingDropped, item2, Location_OnLeft); + topRect = root->suggestedDropRect(&itemBeingDropped, item2, Location_OnTop); + bottomRect = root->suggestedDropRect(&itemBeingDropped, item2, Location_OnBottom); + rightRect = root->suggestedDropRect(&itemBeingDropped, item2, Location_OnRight); QCOMPARE(leftRect.y(), item2->geometry().y()); QVERIFY(leftRect.x() < item2->geometry().x()); QVERIFY(leftRect.x() > item1->geometry().x()); @@ -838,13 +841,15 @@ void TestMultiSplitter::tst_suggestedRect2() auto root1 = createRoot(); auto root2 = createRoot(); - const QSize minSize(100, 100); + Item itemBeingDropped(nullptr); + itemBeingDropped.setMinSize(QSize(100, 100)); + Item *item = createItem(); root2->insertItem(item, Location_OnRight); root1->insertItem(root2.get(), Location_OnRight); - QVERIFY(item->parentContainer()->suggestedDropRect(minSize, item, Location_OnRight).isValid()); + QVERIFY(item->parentContainer()->suggestedDropRect(&itemBeingDropped, item, Location_OnRight).isValid()); } void TestMultiSplitter::tst_insertAnotherRoot()