diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-29 13:23:13 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-01 21:25:29 +0000 |
commit | 1e77bf8467cc3c5919019eb2a65a3da4a1229837 (patch) | |
tree | 171216ca0306ef5fa44ef0bf7d8c250bea383280 /src | |
parent | 567dc4de269317e81facd08f5b5f1e31b0b6cc65 (diff) |
Add virtual QQuickPopupPrivate::reposition() for QQuickDrawer
QQuickDrawer implements different kind of positioning than other
popups. Unlike other popups, it specificly wants to go outside the
window bounds.
Change-Id: I33a885066ce750f73479be490274389d09eae442
Task-number: QTBUG-51007
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/templates/qquickpopup.cpp | 89 | ||||
-rw-r--r-- | src/templates/qquickpopup_p_p.h | 13 |
2 files changed, 39 insertions, 63 deletions
diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index 5e105d9d..b4683cff 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -110,6 +110,8 @@ QQuickPopupPrivate::QQuickPopupPrivate() , hasLeftMargin(false) , hasRightMargin(false) , hasBottomMargin(false) + , x(0) + , y(0) , margins(0) , topMargin(0) , leftMargin(0) @@ -383,8 +385,6 @@ QAccessible::Role QQuickPopupItem::accessibleRole() const #endif // QT_NO_ACCESSIBILITY QQuickPopupPositioner::QQuickPopupPositioner(QQuickPopupPrivate *popup) : - m_x(0), - m_y(0), m_parentItem(nullptr), m_popup(popup) { @@ -398,36 +398,6 @@ QQuickPopupPositioner::~QQuickPopupPositioner() } } -qreal QQuickPopupPositioner::x() const -{ - return m_x; -} - -void QQuickPopupPositioner::setX(qreal x) -{ - if (m_x == x) - return; - - m_x = x; - if (m_popup->popupItem->isVisible()) - repositionPopup(); -} - -qreal QQuickPopupPositioner::y() const -{ - return m_y; -} - -void QQuickPopupPositioner::setY(qreal y) -{ - if (m_y == y) - return; - - m_y = y; - if (m_popup->popupItem->isVisible()) - repositionPopup(); -} - QQuickItem *QQuickPopupPositioner::parentItem() const { return m_parentItem; @@ -452,13 +422,13 @@ void QQuickPopupPositioner::setParentItem(QQuickItem *parent) addAncestorListeners(parent->parentItem()); if (m_popup->popupItem->isVisible()) - repositionPopup(); + m_popup->reposition(); } void QQuickPopupPositioner::itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &) { if (m_popup->popupItem->isVisible()) - repositionPopup(); + m_popup->reposition(); } void QQuickPopupPositioner::itemParentChanged(QQuickItem *, QQuickItem *parent) @@ -481,24 +451,25 @@ void QQuickPopupPositioner::itemDestroyed(QQuickItem *item) removeAncestorListeners(item->parentItem()); } -void QQuickPopupPositioner::repositionPopup() +void QQuickPopupPrivate::reposition() { - const qreal w = m_popup->popupItem->width(); - const qreal h = m_popup->popupItem->height(); - const qreal iw = m_popup->popupItem->implicitWidth(); - const qreal ih = m_popup->popupItem->implicitHeight(); + Q_Q(QQuickPopup); + const qreal w = popupItem->width(); + const qreal h = popupItem->height(); + const qreal iw = popupItem->implicitWidth(); + const qreal ih = popupItem->implicitHeight(); bool adjusted = false; - QRectF rect(m_x, m_y, iw > 0 ? iw : w, ih > 0 ? ih : h); - if (m_parentItem) { - rect = m_parentItem->mapRectToScene(rect); + QRectF rect(x, y, iw > 0 ? iw : w, ih > 0 ? ih : h); + if (parentItem) { + rect = parentItem->mapRectToScene(rect); - QQuickWindow *window = m_parentItem->window(); + QQuickWindow *window = q->window(); if (window) { - const QRectF bounds = QRectF(0, 0, window->width(), window->height()).marginsRemoved(m_popup->getMargins()); + const QRectF bounds = QRectF(0, 0, window->width(), window->height()).marginsRemoved(getMargins()); 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())); + const QRectF flipped = parentItem->mapRectToScene(QRectF(x, parentItem->height() - y - rect.height(), rect.width(), rect.height())); if (flipped.top() >= bounds.top() && flipped.bottom() < bounds.bottom()) { adjusted = true; rect = flipped; @@ -521,9 +492,9 @@ void QQuickPopupPositioner::repositionPopup() } } - m_popup->popupItem->setPosition(rect.topLeft()); + popupItem->setPosition(rect.topLeft()); if (adjusted && ih > 0) - m_popup->popupItem->setHeight(rect.height()); + popupItem->setHeight(rect.height()); } void QQuickPopupPositioner::removeAncestorListeners(QQuickItem *item) @@ -681,13 +652,19 @@ void QQuickPopup::close() qreal QQuickPopup::x() const { Q_D(const QQuickPopup); - return d->positioner.x(); + return d->x; } void QQuickPopup::setX(qreal x) { Q_D(QQuickPopup); - d->positioner.setX(x); + if (qFuzzyCompare(d->x, x)) + return; + + d->x = x; + if (d->popupItem->isVisible()) + d->reposition(); + emit xChanged(); } /*! @@ -698,13 +675,19 @@ void QQuickPopup::setX(qreal x) qreal QQuickPopup::y() const { Q_D(const QQuickPopup); - return d->positioner.y(); + return d->y; } void QQuickPopup::setY(qreal y) { Q_D(QQuickPopup); - d->positioner.setY(y); + if (qFuzzyCompare(d->y, y)) + return; + + d->y = y; + if (d->popupItem->isVisible()) + d->reposition(); + emit yChanged(); } /*! @@ -1641,7 +1624,7 @@ void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) void QQuickPopup::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(QQuickPopup); - d->positioner.repositionPopup(); + d->reposition(); if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) { emit widthChanged(); emit availableWidthChanged(); @@ -1657,7 +1640,7 @@ void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &ol Q_D(QQuickPopup); Q_UNUSED(newMargins); Q_UNUSED(oldMargins); - d->positioner.repositionPopup(); + d->reposition(); } void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index f62a82ec..0f8f4d7c 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -123,17 +123,9 @@ public: explicit QQuickPopupPositioner(QQuickPopupPrivate *popup); ~QQuickPopupPositioner(); - qreal x() const; - void setX(qreal x); - - qreal y() const; - void setY(qreal y); - QQuickItem *parentItem() const; void setParentItem(QQuickItem *parent); - void repositionPopup(); - protected: void itemGeometryChanged(QQuickItem *, const QRectF &, const QRectF &); void itemParentChanged(QQuickItem *, QQuickItem *parent); @@ -146,8 +138,6 @@ private: bool isAncestor(QQuickItem *item) const; - qreal m_x; - qreal m_y; QQuickItem *m_parentItem; QQuickPopupPrivate *m_popup; }; @@ -166,6 +156,7 @@ public: void init(); bool tryClose(QQuickItem *item, QMouseEvent *event); + virtual void reposition(); void finalizeEnterTransition(); void finalizeExitTransition(); @@ -184,6 +175,8 @@ public: bool hasLeftMargin; bool hasRightMargin; bool hasBottomMargin; + qreal x; + qreal y; qreal margins; qreal topMargin; qreal leftMargin; |