diff --git a/src/View.h b/src/View.h index 812526f7..0c0f7b42 100644 --- a/src/View.h +++ b/src/View.h @@ -121,7 +121,6 @@ public: } virtual QSize maxSizeHint() const = 0; - virtual QSize minimumSizeHint() const = 0; virtual QSize maximumSize() const = 0; virtual QRect geometry() const = 0; virtual QRect normalGeometry() const = 0; @@ -228,39 +227,6 @@ public: /// @brief Returns this view, but as a wrapper virtual std::shared_ptr asWrapper() = 0; - template - static QSize widgetMinSize(const T *w) - { - const int minW = w->minimumWidth() > 0 ? w->minimumWidth() - : w->minimumSizeHint().width(); - - const int minH = w->minimumHeight() > 0 ? w->minimumHeight() - : w->minimumSizeHint().height(); - - return QSize(minW, minH).expandedTo(View::hardcodedMinimumSize()); - } - - template - static QSize widgetMaxSize(const T *w) - { - // The max size is usually QWidget::maximumSize(), but we also honour the QSizePolicy::Fixed+sizeHint() case - // as widgets don't need to have QWidget::maximumSize() to have a max size honoured - - const QSize min = widgetMinSize(w); - QSize max = w->maximumSize(); - max = View::boundedMaxSize(min, max); // for safety against weird values - - const QSizePolicy policy = w->sizePolicy(); - - if (policy.verticalPolicy() == QSizePolicy::Fixed || policy.verticalPolicy() == QSizePolicy::Maximum) - max.setHeight(qMin(max.height(), w->sizeHint().height())); - if (policy.horizontalPolicy() == QSizePolicy::Fixed || policy.horizontalPolicy() == QSizePolicy::Maximum) - max.setWidth(qMin(max.width(), w->sizeHint().width())); - - max = View::boundedMaxSize(min, max); // for safety against weird values - return max; - } - /// @brief Returns whether the view is of the specified type /// Virtual so it can be overridden by ViewWrapper. When we're wrapping an existing GUI element /// only the specific frontend can know what's the actual type diff --git a/src/ViewWrapper.cpp b/src/ViewWrapper.cpp index eec0774e..b9b2e2a0 100644 --- a/src/ViewWrapper.cpp +++ b/src/ViewWrapper.cpp @@ -31,24 +31,12 @@ void ViewWrapper::setMinimumSize(QSize) qFatal("Not implemented"); } -QSize ViewWrapper::minSize() const -{ - qFatal("Not implemented"); - return {}; -} - QSize ViewWrapper::maxSizeHint() const { qFatal("Not implemented"); return {}; } -QSize ViewWrapper::minimumSizeHint() const -{ - qFatal("Not implemented"); - return {}; -} - QRect ViewWrapper::normalGeometry() const { qFatal("Not implemented"); diff --git a/src/ViewWrapper.h b/src/ViewWrapper.h index b71d3b7f..6417523a 100644 --- a/src/ViewWrapper.h +++ b/src/ViewWrapper.h @@ -33,10 +33,8 @@ public: explicit ViewWrapper(Controller *controller, QObject *thisObj); // TODOv2: Remove thisObj argument once all calls to asQWidget() are removed void setParent(View *) override; - QSize minSize() const override; void setMinimumSize(QSize) override; QSize maxSizeHint() const override; - QSize minimumSizeHint() const override; QRect normalGeometry() const override; void setWidth(int width) override; void setHeight(int height) override; diff --git a/src/private/WidgetResizeHandler.cpp b/src/private/WidgetResizeHandler.cpp index 02e083c9..20e07238 100644 --- a/src/private/WidgetResizeHandler.cpp +++ b/src/private/WidgetResizeHandler.cpp @@ -187,8 +187,8 @@ bool WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) { int deltaWidth = 0; int newWidth = 0; - const int maxWidth = View::widgetMaxSize(mTarget).width(); - const int minWidth = View::widgetMinSize(mTarget).width(); + const int maxWidth = mTarget->maximumSize().width(); + const int minWidth = mTarget->minSize().width(); switch (mCursorPos) { case CursorPosition_TopLeft: @@ -223,8 +223,8 @@ bool WidgetResizeHandler::mouseMoveEvent(QMouseEvent *e) } { - const int maxHeight = View::widgetMaxSize(mTarget).height(); - const int minHeight = View::widgetMinSize(mTarget).height(); + const int maxHeight = mTarget->maximumSize().height(); + const int minHeight = mTarget->minSize().height(); int deltaHeight = 0; int newHeight = 0; switch (mCursorPos) { diff --git a/src/qtquick/views/ViewWrapper_qtquick.cpp b/src/qtquick/views/ViewWrapper_qtquick.cpp index 64804524..43d6a1b7 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.cpp +++ b/src/qtquick/views/ViewWrapper_qtquick.cpp @@ -230,3 +230,8 @@ bool ViewWrapper_qtquick::testAttribute(Qt::WidgetAttribute) const void ViewWrapper_qtquick::setCursor(Qt::CursorShape) { } + +QSize ViewWrapper_qtquick::minSize() const +{ + return {}; +} diff --git a/src/qtquick/views/ViewWrapper_qtquick.h b/src/qtquick/views/ViewWrapper_qtquick.h index f2d0c742..5d4dd2d9 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.h +++ b/src/qtquick/views/ViewWrapper_qtquick.h @@ -59,6 +59,7 @@ public: QPoint mapTo(View *someAncestor, QPoint pos) const override; bool testAttribute(Qt::WidgetAttribute) const override; void setCursor(Qt::CursorShape) override; + QSize minSize() const override; private: QPointer m_item; diff --git a/src/qtquick/views/View_qtquick.h b/src/qtquick/views/View_qtquick.h index a6696491..15a7adb6 100644 --- a/src/qtquick/views/View_qtquick.h +++ b/src/qtquick/views/View_qtquick.h @@ -32,7 +32,7 @@ public: using View::close; using View::height; using View::minimumHeight; - using View::minimumSizeHint; + using View::minimumWidth; using View::rect; using View::resize; @@ -60,11 +60,6 @@ public: return {}; } - QSize minimumSizeHint() const override - { - return {}; - } - QSize maxSizeHint() const override { return {}; diff --git a/src/qtquick/views/old/QWidgetAdapter_quick_p.h b/src/qtquick/views/old/QWidgetAdapter_quick_p.h index a175f9ff..70860ba5 100644 --- a/src/qtquick/views/old/QWidgetAdapter_quick_p.h +++ b/src/qtquick/views/old/QWidgetAdapter_quick_p.h @@ -138,10 +138,7 @@ public: { return QQuickItem::size().toSize(); } - virtual QSize minimumSizeHint() const - { - return minimumSize(); - } + virtual QSize minimumSize() const; virtual QSize maximumSize() const; int minimumHeight() const diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp index c5762284..2d60a8ee 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp @@ -333,3 +333,15 @@ void ViewWrapper_qtwidgets::setCursor(Qt::CursorShape cursor) { m_widget->setCursor(cursor); } + +QSize ViewWrapper_qtwidgets::minSize() const +{ + // TODOv2: Remove duplication + const int minW = m_widget->minimumWidth() > 0 ? m_widget->minimumWidth() + : m_widget->minimumSizeHint().width(); + + const int minH = m_widget->minimumHeight() > 0 ? m_widget->minimumHeight() + : m_widget->minimumSizeHint().height(); + + return QSize(minW, minH).expandedTo(View::hardcodedMinimumSize()); +} diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.h b/src/qtwidgets/views/ViewWrapper_qtwidgets.h index 5f07c6aa..0b5752d5 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.h +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.h @@ -60,6 +60,7 @@ public: Controllers::DropArea *asDropArea() const override; bool testAttribute(Qt::WidgetAttribute) const override; void setCursor(Qt::CursorShape) override; + QSize minSize() const override; QWidget *widget() const; diff --git a/src/qtwidgets/views/View_qtwidgets.h b/src/qtwidgets/views/View_qtwidgets.h index bf806c85..e525ac9b 100644 --- a/src/qtwidgets/views/View_qtwidgets.h +++ b/src/qtwidgets/views/View_qtwidgets.h @@ -34,7 +34,6 @@ public: using View::close; using View::height; using View::minimumHeight; - using View::minimumSizeHint; using View::minimumWidth; using View::rect; using View::resize; @@ -60,27 +59,42 @@ public: QSize minSize() const override { const int minW = Base::minimumWidth() > 0 ? Base::minimumWidth() - : Base::minimumSizeHint().width(); + : minimumSizeHint().width(); const int minH = Base::minimumHeight() > 0 ? Base::minimumHeight() - : Base::minimumSizeHint().height(); + : minimumSizeHint().height(); return QSize(minW, minH).expandedTo(View::hardcodedMinimumSize()); } - void setMinimumSize(QSize sz) override - { - QWidget::setMinimumSize(sz); - } - QSize minimumSizeHint() const override { return Base::minimumSizeHint(); } + void setMinimumSize(QSize sz) override + { + QWidget::setMinimumSize(sz); + } + QSize maxSizeHint() const override { - return widgetMaxSize(this); + // The max size is usually QWidget::maximumSize(), but we also honour the QSizePolicy::Fixed+sizeHint() case + // as widgets don't need to have QWidget::maximumSize() to have a max size honoured + + const QSize min = minSize(); + QSize max = maximumSize(); + max = boundedMaxSize(min, max); // for safety against weird values + + const QSizePolicy policy = sizePolicy(); + + if (policy.verticalPolicy() == QSizePolicy::Fixed || policy.verticalPolicy() == QSizePolicy::Maximum) + max.setHeight(qMin(max.height(), sizeHint().height())); + if (policy.horizontalPolicy() == QSizePolicy::Fixed || policy.horizontalPolicy() == QSizePolicy::Maximum) + max.setWidth(qMin(max.width(), sizeHint().width())); + + max = View::boundedMaxSize(min, max); // for safety against weird values + return max; } QSize maximumSize() const override diff --git a/tests/qtwidgets/tst_qtwidgets.cpp b/tests/qtwidgets/tst_qtwidgets.cpp index 3265deff..b260fd20 100644 --- a/tests/qtwidgets/tst_qtwidgets.cpp +++ b/tests/qtwidgets/tst_qtwidgets.cpp @@ -1107,7 +1107,9 @@ void TestQtWidgets::tst_maxSizePropagates() dock1->setWidget(w); dock1->show(); - QCOMPARE(dock1->view()->minSize(), View::widgetMinSize(w)); + Views::ViewWrapper_qtwidgets guestWrapper(w); + + QCOMPARE(dock1->view()->minSize(), guestWrapper.minSize()); QCOMPARE(dock1->view()->maximumSize(), w->maximumSize()); w->setMinimumSize(121, 121); @@ -1115,7 +1117,7 @@ void TestQtWidgets::tst_maxSizePropagates() Platform::instance()->tests_waitForEvent(w, QEvent::LayoutRequest); - QCOMPARE(dock1->view()->minSize(), View::widgetMinSize(w)); + QCOMPARE(dock1->view()->minSize(), guestWrapper.minSize()); QCOMPARE(dock1->view()->maximumSize(), w->maximumSize()); // Now let's see if our Frame also has proper size-constraints diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 1d75a121..fc259b5c 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -55,10 +55,9 @@ inline int lengthForSize(QSize sz, Qt::Orientation o) return o == Qt::Vertical ? sz.height() : sz.width(); } -template -inline int widgetMinLength(const T *w, Qt::Orientation o) +inline int widgetMinLength(View *view, Qt::Orientation o) { - const QSize sz = View::widgetMinSize(w); + const QSize sz = view->minSize(); return lengthForSize(sz, o); } @@ -5739,7 +5738,7 @@ void TestDocks::tst_propagateSizeHonoursMinSize() if (dock1->width() < min1) { qDebug() << "\ndock1->width()=" << dock1->width() << "\nmin1=" << min1 - << "\ndock min sizes=" << dock1->view()->minimumWidth() << dock1->view()->minimumSizeHint().width() + << "\ndock min sizes=" << dock1->view()->minimumWidth() << "\nframe1->width()=" << dock1->dptr()->frame()->view()->width() << "\nframe1->min=" << lengthForSize(dock1->dptr()->frame()->view()->minSize(), Qt::Horizontal); l->dumpLayout(); @@ -5774,8 +5773,11 @@ void TestDocks::tst_constraintsPropagateUp() auto dock1 = createDockWidget("dock1", guestWidget); auto dock2 = createDockWidget("dock2", new MyWidget2(QSize(minWidth, minHeight))); - QCOMPARE(widgetMinLength(guestWidget, Qt::Vertical), minHeight); - QCOMPARE(widgetMinLength(guestWidget, Qt::Horizontal), minWidth); + // TODOv2: Remove + Views::ViewWrapper_qtwidgets guestWrapper(guestWidget); + + QCOMPARE(widgetMinLength(&guestWrapper, Qt::Vertical), minHeight); + QCOMPARE(widgetMinLength(&guestWrapper, Qt::Horizontal), minWidth); QCOMPARE(dock1->view()->minimumWidth(), minWidth); QCOMPARE(dock1->view()->minimumHeight(), minHeight); QCOMPARE(dock1->view()->minSize(), minSz); @@ -5826,7 +5828,7 @@ void TestDocks::tst_constraintsAfterPlaceholder() const int expectedMinHeight = item2->minLength(Qt::Vertical) + item3->minLength(Qt::Vertical) + 1 * Item::separatorThickness + margins.top() + margins.bottom(); - QCOMPARE(m->view()->minimumSizeHint().height(), expectedMinHeight); + QCOMPARE(m->view()->minSize().height(), expectedMinHeight); dock1->deleteLater(); Testing::waitForDeleted(dock1);