diff --git a/src/private/multisplitter/Item.cpp b/src/private/multisplitter/Item.cpp index b77806db..617f7b05 100644 --- a/src/private/multisplitter/Item.cpp +++ b/src/private/multisplitter/Item.cpp @@ -29,6 +29,7 @@ using namespace Layouting; int Layouting::Item::separatorThickness = 5; +const QSize Layouting::Item::hardcodedMinimumSize = QSize(KDDOCKWIDGETS_MIN_WIDTH, KDDOCKWIDGETS_MIN_HEIGHT); ItemContainer *Item::root() const { @@ -233,11 +234,6 @@ QSize Item::missingSize() const return missing; } -int Item::missingLength(Qt::Orientation o) const -{ - return Layouting::length(missingSize(), o); -} - bool Item::isBeingInserted() const { return m_sizingInfo.isBeingInserted; @@ -388,12 +384,6 @@ void Item::insertItem(Item *item, Location loc, AddingOption option) (void) root()->checkSanity(); } -/** static */ -QSize Item::hardcodedMinimumSize() -{ - return QSize(KDDOCKWIDGETS_MIN_WIDTH, KDDOCKWIDGETS_MIN_HEIGHT); -} - int Item::x() const { return m_sizingInfo.geometry.x(); @@ -1101,8 +1091,6 @@ void ItemContainer::updateSizeConstraints() { const QSize missingSize = this->missingSize(); if (!missingSize.isNull()) { - //QScopedValueRollback resizing(m_isResizing, true); - if (isRoot()) { // Resize the whole layout resize(size() + missingSize); @@ -1481,11 +1469,6 @@ bool ItemContainer::hasOrientationFor(Location loc) const return m_orientation == orientationForLocation(loc); } -Item::List ItemContainer::children() const -{ - return m_children; -} - Item::List ItemContainer::visibleChildren(bool includeBeingInserted) const { Item::List items; @@ -1632,11 +1615,6 @@ void ItemContainer::resize(QSize newSize) // Rename to setSize_recursive setSize(newSize); - if (m_isResizing) { - // We're already under a resize, nothing to do - return; - } - const int totalNewLength = usableLength(); int remaining = totalNewLength; @@ -2046,38 +2024,6 @@ int ItemContainer::neighboursMinLengthFor(const Item *item, Side side, Qt::Orien } } -int ItemContainer::neighboursMinLengthFor_recursive(const Item *item, Side side, Qt::Orientation o) const -{ - return neighboursMinLengthFor(item, side, o) + (isRoot() ? 0 - : parentContainer()->neighboursMinLengthFor(this, side, o)); -} - -int ItemContainer::neighbourSeparatorWaste(const Item *item, Side side, Qt::Orientation o) const -{ - const Item::List children = visibleChildren(); - const int index = children.indexOf(const_cast(item)); - if (index == -1) { - qWarning() << Q_FUNC_INFO << "Couldn't find item" << item; - return 0; - } - - if (o == m_orientation) { - if (side == Side1) { - return index * Item::separatorThickness; - } else { - return (children.size() - 1 - index) * Item::separatorThickness; - } - } else { - return 0; - } -} - -int ItemContainer::neighbourSeparatorWaste_recursive(const Item *item, Side side, Qt::Orientation orientation) const -{ - return neighbourSeparatorWaste(item, side, orientation) + (isRoot() ? 0 - : parentContainer()->neighbourSeparatorWaste(item, side, orientation)); -} - int ItemContainer::availableOnSide(const Item *child, Side side) const { const int length = neighboursLengthFor(child, side, m_orientation); @@ -2103,18 +2049,6 @@ int ItemContainer::availableOnSide_recursive(const Item *child, Side side, Qt::O } } -QSize ItemContainer::missingSizeFor(Item *item, Qt::Orientation o) const -{ - QSize missing = {0, 0}; - const QSize available = availableSize(); - const int separatorWasteW = (o == Qt::Vertical || !hasVisibleChildren()) ? 0 : Item::separatorThickness; - const int separatorWasteH = (o == Qt::Vertical && hasVisibleChildren()) ? Item::separatorThickness : 0; - missing.setWidth(qMax(item->minSize().width() - available.width() + separatorWasteW, 0)); - missing.setHeight(qMax(item->minSize().height() - available.height() + separatorWasteH, 0)); - - return missing; -} - QVariantList ItemContainer::items() const { QVariantList items; @@ -2273,30 +2207,6 @@ void ItemContainer::applyGeometries(const SizingInfo::List &sizes) positionItems(); } -SizingInfo::List ItemContainer::sizingInfosPerNeighbour(Item *item, Side side) const -{ - Item::List children = visibleChildren(); - const int indexOfChild = children.indexOf(item); - int start = 0; - int end = 0; - if (side == Side1) { - start = 0; - end = indexOfChild - 1; - } else { - start = indexOfChild + 1; - end = children.size() - 1; - } - - SizingInfo::List result; - result.reserve(end - start + 1); - for (int i = start; i <= end; ++i) { - Item *neighbour = children.at(i); - result << neighbour->m_sizingInfo; - } - - return result; -} - SizingInfo::List ItemContainer::sizes(bool ignoreBeingInserted) const { const Item::List children = visibleChildren(ignoreBeingInserted); diff --git a/src/private/multisplitter/Item_p.h b/src/private/multisplitter/Item_p.h index be35e036..3a970373 100644 --- a/src/private/multisplitter/Item_p.h +++ b/src/private/multisplitter/Item_p.h @@ -54,42 +54,6 @@ enum AddingOption { AddingOption_StartHidden ///< Don't show the dock widget when adding it }; -///@internal -inline Location oppositeLocation(Location loc) -{ - switch (loc) { - case Location_OnLeft: - return Location_OnRight; - case Location_OnTop: - return Location_OnBottom; - case Location_OnRight: - return Location_OnLeft; - case Location_OnBottom: - return Location_OnTop; - default: - Q_ASSERT(false); - return Location_None; - } -} - -///@internal -inline Location adjacentLocation(Location loc) -{ - switch (loc) { - case Location_OnLeft: - return Location_OnTop; - case Location_OnTop: - return Location_OnRight; - case Location_OnRight: - return Location_OnBottom; - case Location_OnBottom: - return Location_OnLeft; - default: - Q_ASSERT(false); - return Location_None; - } -} - enum Side { Side1, Side2 @@ -127,21 +91,11 @@ inline bool locationIsVertical(Location loc) return loc == Location_OnTop || loc == Location_OnBottom; } -inline bool locationIsHorizontal(Location loc) -{ - return !locationIsVertical(loc); -} - inline bool locationIsSide1(Location loc) { return loc == Location_OnLeft || loc == Location_OnTop; } -inline bool locationIsSide2(Location loc) -{ - return loc == Location_OnRight || loc == Location_OnBottom; -} - inline QRect adjustedRect(QRect r, Qt::Orientation o, int p1, int p2) { if (o == Qt::Vertical) { @@ -315,14 +269,14 @@ public: ~Item() override; bool isRoot() const; - virtual int visibleCount_recursive() const; + virtual int visibleCount_recursive() const; virtual void insertItem(Item *item, Location, AddingOption = AddingOption_None); /** * @brief No widget can have a minimum size smaller than this, regardless of their minimum size. */ - static QSize hardcodedMinimumSize(); + static const QSize hardcodedMinimumSize; static int separatorThickness; int x() const; @@ -334,42 +288,20 @@ public: QPoint pos() const; int pos(Qt::Orientation) const; QRect geometry() const; - bool isContainer() const; - bool isWidget() const { return !isContainer(); } - Qt::Orientation orientation() const; - [[nodiscard]] virtual bool checkSanity(); - void setParentContainer(ItemContainer *parent); // TODO: Make private - void connectParent(ItemContainer *parent); ItemContainer *parentContainer() const; - void setPos(QPoint); // TODO: Make private - void setPos(int pos, Qt::Orientation); - int position(Qt::Orientation) const; - const ItemContainer *asContainer() const; - ItemContainer *asContainer(); void setMinSize(QSize); void setMaxSize(QSize); virtual QSize minSize() const; virtual QSize maxSize() const; virtual void resize(QSize newSize); - int minLength(Qt::Orientation) const; - void setLength(int length, Qt::Orientation); - virtual void setLength_recursive(int length, Qt::Orientation); - int length(Qt::Orientation) const; - int availableLength(Qt::Orientation) const; bool isPlaceholder() const; virtual bool isVisible(bool excludeBeingInserted = false) const; - virtual void setIsVisible(bool); virtual void setGeometry_recursive(QRect rect); virtual void dumpLayout(int level = 0); void setGeometry(QRect rect); - SizingInfo m_sizingInfo; - QSize missingSize() const; - int missingLength(Qt::Orientation) const; - bool isBeingInserted() const; - void setBeingInserted(bool); ItemContainer *root() const; QRect mapToRoot(QRect) const; QPoint mapToRoot(QPoint) const; @@ -390,10 +322,11 @@ public: void unref(); int refCount() const; + int minLength(Qt::Orientation) const; + QWidget *hostWidget() const; void restore(GuestInterface *guest); virtual void setHostWidget(QWidget *); - virtual void updateWidgetGeometries(); virtual QVariantMap toVariantMap() const; virtual void fillFromVariantMap(const QVariantMap &map, const QHash &widgets); static Item* createFromVariantMap(QWidget *hostWidget, ItemContainer *parent, @@ -410,12 +343,32 @@ Q_SIGNALS: protected: friend class ::TestMultiSplitter; explicit Item(bool isContainer, QWidget *hostWidget, ItemContainer *parent); + void setParentContainer(ItemContainer *parent); + void connectParent(ItemContainer *parent); + [[nodiscard]] virtual bool checkSanity(); + void setPos(QPoint); // TODO: Make private + void setPos(int pos, Qt::Orientation); + int position(Qt::Orientation) const; + const ItemContainer *asContainer() const; + ItemContainer *asContainer(); + void setLength(int length, Qt::Orientation); + virtual void setLength_recursive(int length, Qt::Orientation); + int length(Qt::Orientation) const; + int availableLength(Qt::Orientation) const; + QSize missingSize() const; + virtual void updateWidgetGeometries(); + virtual void setIsVisible(bool); + bool isBeingInserted() const; + void setBeingInserted(bool); + + SizingInfo m_sizingInfo; const bool m_isContainer; ItemContainer *m_parent = nullptr; private Q_SLOTS: void onWidgetLayoutRequested(); private: + friend class ItemContainer; void turnIntoPlaceholder(); bool eventFilter(QObject *o, QEvent *event) override; int m_refCount = 0; @@ -449,7 +402,6 @@ public: explicit ItemContainer(QWidget *parent); void insertItem(Item *item, int index); [[nodiscard]] bool checkSanity() override; - void scheduleCheckSanity() const; bool hasOrientation() const; int numChildren() const; int numVisibleChildren() const; @@ -463,7 +415,6 @@ public: ItemContainer *convertChildToContainer(Item *leaf); void insertItem(Item *item, Location, AddingOption = AddingOption_None) override; bool hasOrientationFor(Location) const; - Item::List children() const; Item::List visibleChildren(bool includeBeingInserted = false) const; int usableLength() const; bool hasSingleVisibleItem() const; @@ -479,7 +430,7 @@ public: QVariantList items() const; void dumpLayout(int level = 0) override; void updateChildPercentages(); - void updateChildPercentages_recursive(); + void updateChildPercentages_recursive(); void restoreChild(Item *); void updateWidgetGeometries() override; int oppositeLength() const; @@ -510,26 +461,19 @@ public: QSize availableSize() const; int availableLength() const; LengthOnSide lengthOnSide(const SizingInfo::List &sizes, int fromIndex, Side, Qt::Orientation) const; - int minLength(int fromIndex, Side, Qt::Orientation) const; int neighboursLengthFor(const Item *item, Side, Qt::Orientation) const; int neighboursLengthFor_recursive(const Item *item, Side, Qt::Orientation) const; int neighboursMinLengthFor(const Item *item, Side, Qt::Orientation) const; - int neighboursMinLengthFor_recursive(const Item *item, Side, Qt::Orientation) const; - int neighbourSeparatorWaste(const Item *item, Side, Qt::Orientation) const; - int neighbourSeparatorWaste_recursive(const Item *item, Side, Qt::Orientation) const; int availableOnSide(const Item *child, Side) const; int availableOnSide_recursive(const Item *child, Side, Qt::Orientation orientation) const; - QSize missingSizeFor(Item *item, Qt::Orientation) const; void onChildMinSizeChanged(Item *child); void onChildVisibleChanged(Item *child, bool visible); void updateSizeConstraints(); - SizingInfo::List sizingInfosPerNeighbour(Item *item, Side) const; SizingInfo::List sizes(bool ignoreBeingInserted = false) const; QVector calculateSqueezes(SizingInfo::List::ConstIterator begin, SizingInfo::List::ConstIterator end, int needed) const; QRect suggestedDropRect(QSize minSize, const Item *relativeTo, Location) const; void positionItems(); void positionItems(SizingInfo::List &sizes); - bool isResizing() const { return m_isResizing; } void clear(); Item* itemForFrame(const QWidget *w) const; // TODO: Rename int visibleCount_recursive() const override; @@ -570,6 +514,7 @@ public: QVector separators_recursive() const; Qt::Orientation m_orientation = Qt::Vertical; private: + void scheduleCheckSanity() const; Separator *neighbourSeparator(const Item *item, Side, Qt::Orientation) const; void updateWidgets_recursive(); /// Returns the positions that each separator should have (x position if Qt::Horizontal, y otherwise) @@ -594,7 +539,7 @@ inline QSize widgetMinSize(const QWidget *w) const int minH = w->minimumHeight() > 0 ? w->minimumHeight() : w->minimumSizeHint().height(); - return QSize(minW, minH).expandedTo(Item::hardcodedMinimumSize()); + return QSize(minW, minH).expandedTo(Item::hardcodedMinimumSize); } inline int widgetMinLength(const QWidget *w, Qt::Orientation o) { diff --git a/src/private/multisplitter/tests/tst_multisplitter.cpp b/src/private/multisplitter/tests/tst_multisplitter.cpp index 380eb3c1..6292d1f7 100644 --- a/src/private/multisplitter/tests/tst_multisplitter.cpp +++ b/src/private/multisplitter/tests/tst_multisplitter.cpp @@ -187,7 +187,6 @@ void TestMultiSplitter::tst_createRoot() auto root = createRoot(); QVERIFY(root->isRoot()); QVERIFY(root->isContainer()); - QVERIFY(!root->isWidget()); QVERIFY(root->hasOrientation()); QCOMPARE(root->size(), QSize(1000, 1000)); QVERIFY(root->checkSanity()); @@ -200,7 +199,6 @@ void TestMultiSplitter::tst_insertOne() auto item = createItem(); root->insertItem(item, Location_OnTop); QCOMPARE(root->numChildren(), 1); - QVERIFY(item->isWidget()); QVERIFY(!item->isContainer()); QCOMPARE(root->size(), QSize(1000, 1000)); QCOMPARE(item->size(), root->size()); @@ -605,10 +603,6 @@ void TestMultiSplitter::tst_availableSize() QCOMPARE(root->neighboursLengthFor(item1, Side2, Qt::Horizontal), 0); QCOMPARE(root->neighboursMinLengthFor(item1, Side1, Qt::Horizontal), 0); QCOMPARE(root->neighboursMinLengthFor(item1, Side2, Qt::Horizontal), 0); - QCOMPARE(root->neighbourSeparatorWaste(item1, Side1, Qt::Vertical), 0); - QCOMPARE(root->neighbourSeparatorWaste(item1, Side2, Qt::Vertical), 0); - QCOMPARE(root->neighbourSeparatorWaste(item1, Side1, Qt::Horizontal), 0); - QCOMPARE(root->neighbourSeparatorWaste(item1, Side2, Qt::Horizontal), 0); QCOMPARE(root->neighboursLengthFor_recursive(item1, Side1, Qt::Vertical), 0); QCOMPARE(root->neighboursLengthFor_recursive(item1, Side2, Qt::Vertical), 0); @@ -659,14 +653,6 @@ void TestMultiSplitter::tst_availableSize() QCOMPARE(container4->neighboursLengthFor_recursive(item5, Side1, Qt::Horizontal), item3->width()); QCOMPARE(container4->neighboursLengthFor_recursive(item5, Side2, Qt::Horizontal), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item4, Side1, Qt::Vertical), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item4, Side2, Qt::Vertical), st); - QCOMPARE(container4->neighbourSeparatorWaste(item4, Side1, Qt::Horizontal), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item4, Side2, Qt::Horizontal), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item5, Side1, Qt::Vertical), st); - QCOMPARE(container4->neighbourSeparatorWaste(item5, Side2, Qt::Vertical), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item5, Side1, Qt::Horizontal), 0); - QCOMPARE(container4->neighbourSeparatorWaste(item5, Side2, Qt::Horizontal), 0); QVERIFY(serializeDeserializeTest(root)); } @@ -685,15 +671,8 @@ void TestMultiSplitter::tst_missingSize() Item *item3 = createItem(); item3->setMinSize(root->size() + QSize(100, 200)); - // Test empty root - QCOMPARE(root->missingSizeFor(item1, Qt::Vertical), QSize(0, 0)); - QCOMPARE(root->missingSizeFor(item2, Qt::Vertical), QSize(0, 0)); - QCOMPARE(root->missingSizeFor(item3, Qt::Vertical), QSize(100, 200)); - // Test with an existing item root->insertItem(item1, Location_OnTop); - QCOMPARE(root->missingSizeFor(item2, Qt::Vertical), item1->minSize() + QSize(0, st)); - QCOMPARE(root->missingSizeFor(item3, Qt::Vertical), item1->minSize() + QSize(0, st) + QSize(100, 200)); QVERIFY(serializeDeserializeTest(root)); }