diff --git a/src/private/multisplitter/Widget.h b/src/private/multisplitter/Widget.h index 21b3639c..2fa77888 100644 --- a/src/private/multisplitter/Widget.h +++ b/src/private/multisplitter/Widget.h @@ -15,12 +15,14 @@ #pragma once #include "multisplitter_export.h" +#include "Item_p.h" #include #include #include #include #include +#include #include @@ -98,6 +100,39 @@ public: ///@brief returns an id for corelation purposes for saving layouts QString id() const; + 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(Item::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 = 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 = boundedMaxSize(min, max); // for safety against weird values + return max; + } + protected: static QSize boundedMaxSize(QSize min, QSize max); diff --git a/src/private/multisplitter/Widget_qwidget.cpp b/src/private/multisplitter/Widget_qwidget.cpp index 6138f201..31df5262 100644 --- a/src/private/multisplitter/Widget_qwidget.cpp +++ b/src/private/multisplitter/Widget_qwidget.cpp @@ -111,37 +111,6 @@ void Widget_qwidget::move(int x, int y) m_thisWidget->move(x, y); } -QSize Widget_qwidget::widgetMinSize(const QWidget *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(Item::hardcodedMinimumSize); -} - -QSize Widget_qwidget::widgetMaxSize(const QWidget *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 = 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 = boundedMaxSize(min, max); // for safety against weird values - return max; -} - void Widget_qwidget::setSize(int width, int height) { m_thisWidget->resize(QSize(width, height)); diff --git a/src/private/multisplitter/Widget_qwidget.h b/src/private/multisplitter/Widget_qwidget.h index fd0e60cd..1c9f85a9 100644 --- a/src/private/multisplitter/Widget_qwidget.h +++ b/src/private/multisplitter/Widget_qwidget.h @@ -59,8 +59,6 @@ public: QPoint mapFromGlobal(QPoint p) const override; QPoint mapToGlobal(QPoint p) const override; - static QSize widgetMinSize(const QWidget *w); - static QSize widgetMaxSize(const QWidget *w); private: QWidget *const m_thisWidget; Q_DISABLE_COPY(Widget_qwidget)