summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2014-10-28 14:20:46 +0100
committerFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2014-11-27 11:10:31 +0100
commitcb679241b1df9117ef50664dcf5549341bac8c3e (patch)
treedad16969d4a176266e929ee196ba97fd88bd116d /src/widgets/kernel
parentc6aa76122e209350b8a7b3cb8b5bc8127a3722e7 (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/kernel')
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp31
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)