diff options
author | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2014-10-28 14:20:46 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2014-11-27 11:10:31 +0100 |
commit | cb679241b1df9117ef50664dcf5549341bac8c3e (patch) | |
tree | dad16969d4a176266e929ee196ba97fd88bd116d /src/widgets | |
parent | c6aa76122e209350b8a7b3cb8b5bc8127a3722e7 (diff) |
Implement heightForWidth().
Add a virtual function QWindowPrivate::closestAcceptableGeometry()
which is called from the platform plugin.
Task-number: QTBUG-36220
Task-number: QTBUG-36318
Change-Id: I2b3d205e2c75f1d4dd2ba1d333b0d89bc0fcf13a
Reviewed-by: Jan Arve Sæther <jan-arve.saether@theqtcompany.com>
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index e455b772fb..463eea4ddc 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -33,6 +33,7 @@ #include "private/qwindow_p.h" #include "qwidgetwindow_p.h" +#include "qlayout.h" #include "private/qwidget_p.h" #include "private/qapplication_p.h" @@ -79,8 +80,38 @@ public: widget->focusWidget()->clearFocus(); } + QRectF closestAcceptableGeometry(const QRectF &rect) const Q_DECL_OVERRIDE; }; +QRectF QWidgetWindowPrivate::closestAcceptableGeometry(const QRectF &rect) const +{ + Q_Q(const QWidgetWindow); + const QWidget *widget = q->widget(); + if (!widget->isWindow() || !widget->hasHeightForWidth()) + return QRect(); + const QSize oldSize = rect.size().toSize(); + const QSize newSize = QLayout::closestAcceptableSize(widget, oldSize); + if (newSize == oldSize) + return QRectF(); + const int dw = newSize.width() - oldSize.width(); + const int dh = newSize.height() - oldSize.height(); + QRectF result = rect; + const QRectF currentGeometry(widget->geometry()); + const qreal topOffset = result.top() - currentGeometry.top(); + const qreal bottomOffset = result.bottom() - currentGeometry.bottom(); + if (qAbs(topOffset) > qAbs(bottomOffset)) + result.setTop(result.top() - dh); // top edge drag + else + result.setBottom(result.bottom() + dh); // bottom edge drag + const qreal leftOffset = result.left() - currentGeometry.left(); + const qreal rightOffset = result.right() - currentGeometry.right(); + if (qAbs(leftOffset) > qAbs(rightOffset)) + result.setLeft(result.left() - dw); // left edge drag + else + result.setRight(result.right() + dw); // right edge drag + return result; +} + QWidgetWindow::QWidgetWindow(QWidget *widget) : QWindow(*new QWidgetWindowPrivate(), 0) , m_widget(widget) |