aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-21 15:17:55 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-21 16:44:37 +0000
commit47e50cb3d0088e1080c98996601664119d3d588e (patch)
treedb94cf91f79106417e4b2cc4c6d4e6d0988af22c
parentfec1a78618bae112ff8d1c0e6f078ea890cf283e (diff)
Popup: fix margins
Change-Id: I09f974a00a5a2a8f14645ff5d9bfbd6bad03d324 Task-number: QTBUG-51990 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r--src/imports/controls/Popup.qml6
-rw-r--r--src/imports/controls/material/Popup.qml6
-rw-r--r--src/imports/controls/universal/Popup.qml6
-rw-r--r--src/templates/qquickpopup.cpp14
-rw-r--r--tests/auto/controls/data/tst_popup.qml60
5 files changed, 85 insertions, 7 deletions
diff --git a/src/imports/controls/Popup.qml b/src/imports/controls/Popup.qml
index 60ea326a..309c317b 100644
--- a/src/imports/controls/Popup.qml
+++ b/src/imports/controls/Popup.qml
@@ -40,8 +40,10 @@ import Qt.labs.templates 1.0 as T
T.Popup {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
+ implicitWidth: Math.max(background ? background.implicitWidth : 0,
+ contentWidth > 0 ? contentWidth + leftPadding + rightPadding : 0)
+ implicitHeight: Math.max(background ? background.implicitHeight : 0,
+ contentWidth > 0 ? contentHeight + topPadding + bottomPadding : 0)
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
diff --git a/src/imports/controls/material/Popup.qml b/src/imports/controls/material/Popup.qml
index 8fa9f7f7..d882840a 100644
--- a/src/imports/controls/material/Popup.qml
+++ b/src/imports/controls/material/Popup.qml
@@ -42,8 +42,10 @@ import Qt.labs.controls.material 1.0
T.Popup {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
+ implicitWidth: Math.max(background ? background.implicitWidth : 0,
+ contentWidth > 0 ? contentWidth + leftPadding + rightPadding : 0)
+ implicitHeight: Math.max(background ? background.implicitHeight : 0,
+ contentWidth > 0 ? contentHeight + topPadding + bottomPadding : 0)
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
diff --git a/src/imports/controls/universal/Popup.qml b/src/imports/controls/universal/Popup.qml
index d26dd02d..7ab79545 100644
--- a/src/imports/controls/universal/Popup.qml
+++ b/src/imports/controls/universal/Popup.qml
@@ -41,8 +41,10 @@ import Qt.labs.controls.universal 1.0
T.Popup {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + topPadding + bottomPadding)
+ implicitWidth: Math.max(background ? background.implicitWidth : 0,
+ contentWidth > 0 ? contentWidth + leftPadding + rightPadding : 0)
+ implicitHeight: Math.max(background ? background.implicitHeight : 0,
+ contentWidth > 0 ? contentHeight + topPadding + bottomPadding : 0)
contentWidth: contentItem.implicitWidth || (contentChildren.length === 1 ? contentChildren[0].implicitWidth : 0)
contentHeight: contentItem.implicitHeight || (contentChildren.length === 1 ? contentChildren[0].implicitHeight : 0)
diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp
index 8d40dd0c..f8df8df0 100644
--- a/src/templates/qquickpopup.cpp
+++ b/src/templates/qquickpopup.cpp
@@ -488,7 +488,19 @@ void QQuickPopupPositioner::repositionPopup()
QQuickWindow *window = m_parentItem->window();
if (window) {
- const QRectF bounds = QRectF(0, 0, window->width(), window->height()).marginsRemoved(m_popup->getMargins());
+ const QMarginsF margins = m_popup->getMargins();
+ const QRectF bounds = QRectF(0, 0, window->width(), window->height()).marginsRemoved(margins);
+
+ // push inside the margins
+ if (margins.top() > 0 && rect.top() < bounds.top())
+ rect.moveTop(margins.top());
+ if (margins.bottom() > 0 && rect.bottom() > bounds.bottom())
+ rect.moveBottom(bounds.bottom());
+ if (margins.left() > 0 && rect.left() < bounds.left())
+ rect.moveLeft(margins.left());
+ if (margins.right() > 0 && rect.right() > bounds.right())
+ rect.moveRight(bounds.right());
+
if (rect.top() < bounds.top() || rect.bottom() > bounds.bottom()) {
// if the popup doesn't fit inside the window, try flipping it around (below <-> above)
const QRectF flipped = m_parentItem->mapRectToScene(QRectF(m_x, m_parentItem->height() - m_y - rect.height(), rect.width(), rect.height()));
diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml
index 67d9ceac..02635c9a 100644
--- a/tests/auto/controls/data/tst_popup.qml
+++ b/tests/auto/controls/data/tst_popup.qml
@@ -287,6 +287,66 @@ TestCase {
control.destroy()
}
+ function test_margins() {
+ var control = popupControl.createObject(testCase, {width: 100, height: 100})
+ verify(control)
+
+ control.open()
+ verify(control.visible)
+
+ control.margins = 10
+ compare(control.margins, 10)
+ compare(control.topMargin, 10)
+ compare(control.leftMargin, 10)
+ compare(control.rightMargin, 10)
+ compare(control.bottomMargin, 10)
+ compare(control.contentItem.parent.x, 10)
+ compare(control.contentItem.parent.y, 10)
+
+ control.topMargin = 20
+ compare(control.margins, 10)
+ compare(control.topMargin, 20)
+ compare(control.leftMargin, 10)
+ compare(control.rightMargin, 10)
+ compare(control.bottomMargin, 10)
+ compare(control.contentItem.parent.x, 10)
+ compare(control.contentItem.parent.y, 20)
+
+ control.leftMargin = 20
+ compare(control.margins, 10)
+ compare(control.topMargin, 20)
+ compare(control.leftMargin, 20)
+ compare(control.rightMargin, 10)
+ compare(control.bottomMargin, 10)
+ compare(control.contentItem.parent.x, 20)
+ compare(control.contentItem.parent.y, 20)
+
+ control.x = testCase.width
+ control.y = testCase.height
+ compare(control.contentItem.parent.x, testCase.width - control.width - 10)
+ compare(control.contentItem.parent.y, testCase.height - control.height - 10)
+
+ control.rightMargin = 20
+ compare(control.margins, 10)
+ compare(control.topMargin, 20)
+ compare(control.leftMargin, 20)
+ compare(control.rightMargin, 20)
+ compare(control.bottomMargin, 10)
+ compare(control.contentItem.parent.x, testCase.width - control.width - 20)
+ compare(control.contentItem.parent.y, testCase.height - control.height - 10)
+
+ control.bottomMargin = 20
+ compare(control.margins, 10)
+ compare(control.topMargin, 20)
+ compare(control.leftMargin, 20)
+ compare(control.rightMargin, 20)
+ compare(control.bottomMargin, 20)
+ compare(control.contentItem.parent.x, testCase.width - control.width - 20)
+ compare(control.contentItem.parent.y, testCase.height - control.height - 20)
+
+ control.destroy()
+ }
+
function test_background() {
var control = popupTemplate.createObject(testCase)
verify(control)