aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickpopup.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-09-22 08:44:34 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-09-22 08:55:29 +0200
commitab91c57135f7a86437a5a4341cd32df1d4682480 (patch)
tree713612fe2c27ff43ab4a3d5ed3b363c6141d5fbf /src/quicktemplates2/qquickpopup.cpp
parentc5a44092c8b73c540862c4a160c31487a8518992 (diff)
parent7193318330bc518255fb7ed008c144578f49b4bd (diff)
Merge remote-tracking branch 'origin/5.7' into 5.8
Diffstat (limited to 'src/quicktemplates2/qquickpopup.cpp')
-rw-r--r--src/quicktemplates2/qquickpopup.cpp116
1 files changed, 82 insertions, 34 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp
index 4143ee3f..1a5310bf 100644
--- a/src/quicktemplates2/qquickpopup.cpp
+++ b/src/quicktemplates2/qquickpopup.cpp
@@ -125,12 +125,18 @@ QQuickPopupPrivate::QQuickPopupPrivate()
, hasDim(false)
, visible(false)
, complete(false)
+ , hasWidth(false)
+ , hasHeight(false)
, hasTopMargin(false)
, hasLeftMargin(false)
, hasRightMargin(false)
, hasBottomMargin(false)
, allowVerticalFlip(false)
, allowHorizontalFlip(false)
+ , allowVerticalMove(true)
+ , allowHorizontalMove(true)
+ , allowVerticalResize(true)
+ , allowHorizontalResize(true)
, hadActiveFocusBeforeExitTransition(false)
, x(0)
, y(0)
@@ -587,13 +593,19 @@ void QQuickPopupPrivate::reposition()
bool widthAdjusted = false;
bool heightAdjusted = false;
- QRectF rect(x, y, iw > 0 ? iw : w, ih > 0 ? ih : h);
+ QRectF rect(allowHorizontalMove ? x : popupItem->x(),
+ allowVerticalMove ? y : popupItem->y(),
+ !hasWidth && iw > 0 ? iw : w,
+ !hasHeight && ih > 0 ? ih : h);
if (parentItem) {
rect = parentItem->mapRectToScene(rect);
if (window) {
const QMarginsF margins = getMargins();
- const QRectF bounds = QRectF(0, 0, window->width(), window->height()).marginsRemoved(margins);
+ const QRectF bounds(qMax<qreal>(0.0, margins.left()),
+ qMax<qreal>(0.0, margins.top()),
+ window->width() - qMax<qreal>(0.0, margins.left()) - qMax<qreal>(0.0, margins.right()),
+ window->height() - qMax<qreal>(0.0, margins.top()) - qMax<qreal>(0.0, margins.bottom()));
// if the popup doesn't fit horizontally inside the window, try flipping it around (left <-> right)
if (allowHorizontalFlip && (rect.left() < bounds.left() || rect.right() > bounds.right())) {
@@ -610,31 +622,39 @@ void QQuickPopupPrivate::reposition()
}
// push inside the margins if specified
- 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 (allowVerticalMove) {
+ 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 (allowHorizontalMove) {
+ 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 (iw > 0 && (rect.left() < bounds.left() || rect.right() > bounds.right())) {
// neither the flipped or pushed geometry fits inside the window, choose
// whichever side (left vs. right) fits larger part of the popup
- if (rect.left() < bounds.left() && bounds.left() + rect.width() <= bounds.right())
- rect.moveLeft(bounds.left());
- else if (rect.right() > bounds.right() && bounds.right() - rect.width() >= bounds.left())
- rect.moveRight(bounds.right());
+ if (allowHorizontalMove && allowHorizontalFlip) {
+ if (rect.left() < bounds.left() && bounds.left() + rect.width() <= bounds.right())
+ rect.moveLeft(bounds.left());
+ else if (rect.right() > bounds.right() && bounds.right() - rect.width() >= bounds.left())
+ rect.moveRight(bounds.right());
+ }
// as a last resort, adjust the width to fit the window
- if (rect.left() < bounds.left()) {
- rect.setLeft(bounds.left());
- widthAdjusted = true;
- }
- if (rect.right() > bounds.right()) {
- rect.setRight(bounds.right());
- widthAdjusted = true;
+ if (allowHorizontalResize) {
+ if (rect.left() < bounds.left()) {
+ rect.setLeft(bounds.left());
+ widthAdjusted = true;
+ }
+ if (rect.right() > bounds.right()) {
+ rect.setRight(bounds.right());
+ widthAdjusted = true;
+ }
}
} else if (iw > 0 && rect.left() >= bounds.left() && rect.right() <= bounds.right()
&& iw != w) {
@@ -646,19 +666,23 @@ void QQuickPopupPrivate::reposition()
if (ih > 0 && (rect.top() < bounds.top() || rect.bottom() > bounds.bottom())) {
// neither the flipped or pushed geometry fits inside the window, choose
// whichever side (above vs. below) fits larger part of the popup
- if (rect.top() < bounds.top() && bounds.top() + rect.height() <= bounds.bottom())
- rect.moveTop(bounds.top());
- else if (rect.bottom() > bounds.bottom() && bounds.bottom() - rect.height() >= bounds.top())
- rect.moveBottom(bounds.bottom());
+ if (allowVerticalMove && allowVerticalFlip) {
+ if (rect.top() < bounds.top() && bounds.top() + rect.height() <= bounds.bottom())
+ rect.moveTop(bounds.top());
+ else if (rect.bottom() > bounds.bottom() && bounds.bottom() - rect.height() >= bounds.top())
+ rect.moveBottom(bounds.bottom());
+ }
// as a last resort, adjust the height to fit the window
- if (rect.top() < bounds.top()) {
- rect.setTop(bounds.top());
- heightAdjusted = true;
- }
- if (rect.bottom() > bounds.bottom()) {
- rect.setBottom(bounds.bottom());
- heightAdjusted = true;
+ if (allowVerticalResize) {
+ if (rect.top() < bounds.top()) {
+ rect.setTop(bounds.top());
+ heightAdjusted = true;
+ }
+ if (rect.bottom() > bounds.bottom()) {
+ rect.setBottom(bounds.bottom());
+ heightAdjusted = true;
+ }
}
} else if (ih > 0 && rect.top() >= bounds.top() && rect.bottom() <= bounds.bottom()
&& ih != h) {
@@ -681,12 +705,22 @@ void QQuickPopupPrivate::reposition()
emit q->yChanged();
}
- if (widthAdjusted && rect.width() > 0)
+ if (!hasWidth && widthAdjusted && rect.width() > 0)
popupItem->setWidth(rect.width());
- if (heightAdjusted && rect.height() > 0)
+ if (!hasHeight && heightAdjusted && rect.height() > 0)
popupItem->setHeight(rect.height());
}
+void QQuickPopupPrivate::resizeOverlay()
+{
+ if (!dimmer)
+ return;
+
+ qreal w = window ? window->width() : 0;
+ qreal h = window ? window->height() : 0;
+ dimmer->setSize(QSizeF(w, h));
+}
+
void QQuickPopupPositioner::removeAncestorListeners(QQuickItem *item)
{
if (item == m_parentItem)
@@ -907,13 +941,20 @@ qreal QQuickPopup::width() const
void QQuickPopup::setWidth(qreal width)
{
Q_D(QQuickPopup);
+ d->hasWidth = true;
d->popupItem->setWidth(width);
}
void QQuickPopup::resetWidth()
{
Q_D(QQuickPopup);
+ if (!d->hasWidth)
+ return;
+
+ d->hasWidth = false;
d->popupItem->resetWidth();
+ if (d->popupItem->isVisible())
+ d->reposition();
}
/*!
@@ -930,13 +971,20 @@ qreal QQuickPopup::height() const
void QQuickPopup::setHeight(qreal height)
{
Q_D(QQuickPopup);
+ d->hasHeight = true;
d->popupItem->setHeight(height);
}
void QQuickPopup::resetHeight()
{
Q_D(QQuickPopup);
+ if (!d->hasHeight)
+ return;
+
+ d->hasHeight = false;
d->popupItem->resetHeight();
+ if (d->popupItem->isVisible())
+ d->reposition();
}
/*!