diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-19 13:19:40 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-19 18:34:57 +0000 |
commit | 20b60be518f05611fb11a98b57e73f6bb6c8b46e (patch) | |
tree | baf1c73681dd290138af501fb73cd673364fc0be /src/templates | |
parent | da3bf2a7c16763c21b1bc127382130f8eee92cd0 (diff) |
Popup: use available size and paddings from the popup item
Now that the internal popup item inherits Control, which already
provides these features, we may use them directly instead of re-doing
them in Popup.
NOTE: QQuickMenu code has lots of direct references to the content
item, which used to be stored in QQuickPopupPrivate, which is the
base class of QQuickMenuPrivate. Now that the content item is stored
by QQuickPopupItem instead, the direct references don't work. Thus,
as a temporary solution to avoid this patch growing large, we'll
store the content item in QQuickMenuPrivate.
Change-Id: I80a16d34432131a4326c1b6ae54419470be53f96
Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
Diffstat (limited to 'src/templates')
-rw-r--r-- | src/templates/qquickmenu.cpp | 1 | ||||
-rw-r--r-- | src/templates/qquickmenu_p_p.h | 1 | ||||
-rw-r--r-- | src/templates/qquickpopup.cpp | 235 | ||||
-rw-r--r-- | src/templates/qquickpopup_p_p.h | 21 |
4 files changed, 71 insertions, 187 deletions
diff --git a/src/templates/qquickmenu.cpp b/src/templates/qquickmenu.cpp index d3fc88d9..b61985d5 100644 --- a/src/templates/qquickmenu.cpp +++ b/src/templates/qquickmenu.cpp @@ -484,6 +484,7 @@ void QQuickMenu::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) QObjectPrivate::connect(d->dummyFocusItem.data(), &QQuickItem::activeFocusChanged, d, &QQuickMenuPrivate::maybeUnsetDummyFocusOnTab); } + d->contentItem = newItem; } bool QQuickMenu::eventFilter(QObject *object, QEvent *event) diff --git a/src/templates/qquickmenu_p_p.h b/src/templates/qquickmenu_p_p.h index 167f865b..4c2aed16 100644 --- a/src/templates/qquickmenu_p_p.h +++ b/src/templates/qquickmenu_p_p.h @@ -89,6 +89,7 @@ public: static QObject *contentData_at(QQmlListProperty<QObject> *prop, int index); static void contentData_clear(QQmlListProperty<QObject> *prop); + QQuickItem *contentItem; // TODO: cleanup QVector<QObject *> contentData; QQmlObjectModel *contentModel; QPointer<QQuickItem> dummyFocusItem; diff --git a/src/templates/qquickpopup.cpp b/src/templates/qquickpopup.cpp index df452a73..18a11208 100644 --- a/src/templates/qquickpopup.cpp +++ b/src/templates/qquickpopup.cpp @@ -109,26 +109,15 @@ QQuickPopupPrivate::QQuickPopupPrivate() , hasLeftMargin(false) , hasRightMargin(false) , hasBottomMargin(false) - , hasTopPadding(false) - , hasLeftPadding(false) - , hasRightPadding(false) - , hasBottomPadding(false) , margins(0) , topMargin(0) , leftMargin(0) , rightMargin(0) , bottomMargin(0) - , padding(0) - , topPadding(0) - , leftPadding(0) - , rightPadding(0) - , bottomPadding(0) , contentWidth(0) , contentHeight(0) , closePolicy(QQuickPopup::OnEscape) , parentItem(Q_NULLPTR) - , background(Q_NULLPTR) - , contentItem(Q_NULLPTR) , enter(Q_NULLPTR) , exit(Q_NULLPTR) , popupItem(Q_NULLPTR) @@ -142,6 +131,7 @@ void QQuickPopupPrivate::init() Q_Q(QQuickPopup); popupItem = new QQuickPopupItem(q); q->setParentItem(qobject_cast<QQuickItem *>(parent)); + QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged); } bool QQuickPopupPrivate::tryClose(QQuickItem *item, QMouseEvent *event) @@ -180,31 +170,6 @@ void QQuickPopupPrivate::finalizeExitTransition() popupItem->setVisible(false); } -void QQuickPopupPrivate::resizeBackground() -{ - Q_Q(QQuickPopup); - if (background) { - QQuickItemPrivate *p = QQuickItemPrivate::get(background); - if (!p->widthValid && qFuzzyIsNull(background->x())) { - background->setWidth(q->width()); - p->widthValid = false; - } - if (!p->heightValid && qFuzzyIsNull(background->y())) { - background->setHeight(q->height()); - p->heightValid = false; - } - } -} - -void QQuickPopupPrivate::resizeContent() -{ - Q_Q(QQuickPopup); - if (contentItem) { - contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding())); - contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight())); - } -} - QMarginsF QQuickPopupPrivate::getMargins() const { Q_Q(const QQuickPopup); @@ -263,62 +228,6 @@ void QQuickPopupPrivate::setBottomMargin(qreal value, bool reset) } } -void QQuickPopupPrivate::setTopPadding(qreal value, bool reset) -{ - Q_Q(QQuickPopup); - qreal oldPadding = q->topPadding(); - topPadding = value; - hasTopPadding = !reset; - if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) { - emit q->topPaddingChanged(); - emit q->availableHeightChanged(); - q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding), - QMarginsF(leftPadding, oldPadding, rightPadding, bottomPadding)); - } -} - -void QQuickPopupPrivate::setLeftPadding(qreal value, bool reset) -{ - Q_Q(QQuickPopup); - qreal oldPadding = q->leftPadding(); - leftPadding = value; - hasLeftPadding = !reset; - if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) { - emit q->leftPaddingChanged(); - emit q->availableWidthChanged(); - q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding), - QMarginsF(oldPadding, topPadding, rightPadding, bottomPadding)); - } -} - -void QQuickPopupPrivate::setRightPadding(qreal value, bool reset) -{ - Q_Q(QQuickPopup); - qreal oldPadding = q->rightPadding(); - rightPadding = value; - hasRightPadding = !reset; - if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) { - emit q->rightPaddingChanged(); - emit q->availableWidthChanged(); - q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding), - QMarginsF(leftPadding, topPadding, oldPadding, bottomPadding)); - } -} - -void QQuickPopupPrivate::setBottomPadding(qreal value, bool reset) -{ - Q_Q(QQuickPopup); - qreal oldPadding = q->bottomPadding(); - bottomPadding = value; - hasBottomPadding = !reset; - if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) { - emit q->bottomPaddingChanged(); - emit q->availableHeightChanged(); - q->paddingChange(QMarginsF(leftPadding, topPadding, rightPadding, bottomPadding), - QMarginsF(leftPadding, topPadding, rightPadding, oldPadding)); - } -} - class QQuickPopupItemPrivate : public QQuickControlPrivate { Q_DECLARE_PUBLIC(QQuickPopupItem) @@ -339,11 +248,13 @@ QQuickPopupItemPrivate::QQuickPopupItemPrivate(QQuickPopup *popup) : popup(popup void QQuickPopupItemPrivate::implicitWidthChanged() { + QQuickControlPrivate::implicitWidthChanged(); emit popup->implicitHeightChanged(); } void QQuickPopupItemPrivate::implicitHeightChanged() { + QQuickControlPrivate::implicitHeightChanged(); emit popup->implicitHeightChanged(); } @@ -416,9 +327,17 @@ void QQuickPopupItem::wheelEvent(QWheelEvent *event) d->popup->wheelEvent(event); } +void QQuickPopupItem::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) +{ + Q_D(QQuickPopupItem); + QQuickControl::contentItemChange(newItem, oldItem); + d->popup->contentItemChange(newItem, oldItem); +} + void QQuickPopupItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(QQuickPopupItem); + QQuickControl::geometryChanged(newGeometry, oldGeometry); d->popup->geometryChanged(newGeometry, oldGeometry); } @@ -441,6 +360,13 @@ void QQuickPopupItem::itemChange(ItemChange change, const ItemChangeData &data) } } +void QQuickPopupItem::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) +{ + Q_D(QQuickPopupItem); + QQuickControl::paddingChange(newPadding, oldPadding); + d->popup->paddingChange(newPadding, oldPadding); +} + QQuickPopupPositioner::QQuickPopupPositioner(QQuickPopupPrivate *popup) : m_x(0), m_y(0), @@ -925,7 +851,8 @@ void QQuickPopup::setContentHeight(qreal height) */ qreal QQuickPopup::availableWidth() const { - return qMax<qreal>(0.0, width() - leftPadding() - rightPadding()); + Q_D(const QQuickPopup); + return d->popupItem->availableWidth(); } /*! @@ -938,7 +865,8 @@ qreal QQuickPopup::availableWidth() const */ qreal QQuickPopup::availableHeight() const { - return qMax<qreal>(0.0, height() - topPadding() - bottomPadding()); + Q_D(const QQuickPopup); + return d->popupItem->availableHeight(); } /*! @@ -1097,36 +1025,19 @@ void QQuickPopup::resetBottomMargin() qreal QQuickPopup::padding() const { Q_D(const QQuickPopup); - return d->padding; + return d->popupItem->padding(); } void QQuickPopup::setPadding(qreal padding) { Q_D(QQuickPopup); - if (qFuzzyCompare(d->padding, padding)) - return; - QMarginsF oldPadding(leftPadding(), topPadding(), rightPadding(), bottomPadding()); - d->padding = padding; - emit paddingChanged(); - QMarginsF newPadding(leftPadding(), topPadding(), rightPadding(), bottomPadding()); - if (!qFuzzyCompare(newPadding.top(), oldPadding.top())) - emit topPaddingChanged(); - if (!qFuzzyCompare(newPadding.left(), oldPadding.left())) - emit leftPaddingChanged(); - if (!qFuzzyCompare(newPadding.right(), oldPadding.right())) - emit rightPaddingChanged(); - if (!qFuzzyCompare(newPadding.bottom(), oldPadding.bottom())) - emit bottomPaddingChanged(); - if (!qFuzzyCompare(newPadding.top(), oldPadding.top()) || !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom())) - emit availableHeightChanged(); - if (!qFuzzyCompare(newPadding.left(), oldPadding.left()) || !qFuzzyCompare(newPadding.right(), oldPadding.right())) - emit availableWidthChanged(); - paddingChange(newPadding, oldPadding); + d->popupItem->setPadding(padding); } void QQuickPopup::resetPadding() { - setPadding(0); + Q_D(QQuickPopup); + d->popupItem->resetPadding(); } /*! @@ -1139,21 +1050,19 @@ void QQuickPopup::resetPadding() qreal QQuickPopup::topPadding() const { Q_D(const QQuickPopup); - if (d->hasTopPadding) - return d->topPadding; - return d->padding; + return d->popupItem->topPadding(); } void QQuickPopup::setTopPadding(qreal padding) { Q_D(QQuickPopup); - d->setTopPadding(padding); + d->popupItem->setTopPadding(padding); } void QQuickPopup::resetTopPadding() { Q_D(QQuickPopup); - d->setTopPadding(0, true); + d->popupItem->resetTopPadding(); } /*! @@ -1166,21 +1075,19 @@ void QQuickPopup::resetTopPadding() qreal QQuickPopup::leftPadding() const { Q_D(const QQuickPopup); - if (d->hasLeftPadding) - return d->leftPadding; - return d->padding; + return d->popupItem->leftPadding(); } void QQuickPopup::setLeftPadding(qreal padding) { Q_D(QQuickPopup); - d->setLeftPadding(padding); + d->popupItem->setLeftPadding(padding); } void QQuickPopup::resetLeftPadding() { Q_D(QQuickPopup); - d->setLeftPadding(0, true); + d->popupItem->resetLeftPadding(); } /*! @@ -1193,21 +1100,19 @@ void QQuickPopup::resetLeftPadding() qreal QQuickPopup::rightPadding() const { Q_D(const QQuickPopup); - if (d->hasRightPadding) - return d->rightPadding; - return d->padding; + return d->popupItem->rightPadding(); } void QQuickPopup::setRightPadding(qreal padding) { Q_D(QQuickPopup); - d->setRightPadding(padding); + d->popupItem->setRightPadding(padding); } void QQuickPopup::resetRightPadding() { Q_D(QQuickPopup); - d->setRightPadding(0, true); + d->popupItem->resetRightPadding(); } /*! @@ -1220,21 +1125,19 @@ void QQuickPopup::resetRightPadding() qreal QQuickPopup::bottomPadding() const { Q_D(const QQuickPopup); - if (d->hasBottomPadding) - return d->bottomPadding; - return d->padding; + return d->popupItem->bottomPadding(); } void QQuickPopup::setBottomPadding(qreal padding) { Q_D(QQuickPopup); - d->setBottomPadding(padding); + d->popupItem->setBottomPadding(padding); } void QQuickPopup::resetBottomPadding() { Q_D(QQuickPopup); - d->setBottomPadding(0, true); + d->popupItem->resetBottomPadding(); } QQuickItem *QQuickPopup::popupItem() const @@ -1281,24 +1184,17 @@ void QQuickPopup::setParentItem(QQuickItem *parent) QQuickItem *QQuickPopup::background() const { Q_D(const QQuickPopup); - return d->background; + return d->popupItem->background(); } void QQuickPopup::setBackground(QQuickItem *background) { Q_D(QQuickPopup); - if (d->background != background) { - delete d->background; - d->background = background; - if (background) { - background->setParentItem(d->popupItem); - if (qFuzzyIsNull(background->z())) - background->setZ(-1); - if (isComponentComplete()) - d->resizeBackground(); - } - emit backgroundChanged(); - } + if (d->popupItem->background() == background) + return; + + d->popupItem->setBackground(background); + emit backgroundChanged(); } /*! @@ -1314,23 +1210,13 @@ void QQuickPopup::setBackground(QQuickItem *background) QQuickItem *QQuickPopup::contentItem() const { Q_D(const QQuickPopup); - return d->contentItem; + return d->popupItem->contentItem(); } void QQuickPopup::setContentItem(QQuickItem *item) { Q_D(QQuickPopup); - if (d->contentItem != item) { - contentItemChange(item, d->contentItem); - delete d->contentItem; - d->contentItem = item; - if (item) { - item->setParentItem(d->popupItem); - if (isComponentComplete()) - d->resizeContent(); - } - emit contentItemChanged(); - } + d->popupItem->setContentItem(item); } /*! @@ -1344,7 +1230,7 @@ void QQuickPopup::setContentItem(QQuickItem *item) QQmlListProperty<QObject> QQuickPopup::contentData() { Q_D(QQuickPopup); - return QQmlListProperty<QObject>(d->contentItem, Q_NULLPTR, + return QQmlListProperty<QObject>(d->popupItem->contentItem(), Q_NULLPTR, QQuickItemPrivate::data_append, QQuickItemPrivate::data_count, QQuickItemPrivate::data_at, @@ -1361,7 +1247,7 @@ QQmlListProperty<QObject> QQuickPopup::contentData() QQmlListProperty<QQuickItem> QQuickPopup::contentChildren() { Q_D(QQuickPopup); - return QQmlListProperty<QQuickItem>(d->contentItem, Q_NULLPTR, + return QQmlListProperty<QQuickItem>(d->popupItem->contentItem(), Q_NULLPTR, QQuickItemPrivate::children_append, QQuickItemPrivate::children_count, QQuickItemPrivate::children_at, @@ -1712,13 +1598,12 @@ void QQuickPopup::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) { Q_UNUSED(newItem); Q_UNUSED(oldItem); + emit contentItemChanged(); } void QQuickPopup::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(QQuickPopup); - d->resizeBackground(); - d->resizeContent(); d->positioner.repositionPopup(); if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) { emit widthChanged(); @@ -1740,10 +1625,24 @@ void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &ol void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) { - Q_D(QQuickPopup); - Q_UNUSED(newPadding); - Q_UNUSED(oldPadding); - d->resizeContent(); + const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top()); + const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left()); + const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right()); + const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom()); + + if (tp) + emit topPaddingChanged(); + if (lp) + emit leftPaddingChanged(); + if (rp) + emit rightPaddingChanged(); + if (bp) + emit bottomPaddingChanged(); + + if (lp || rp) + emit availableWidthChanged(); + if (tp || bp) + emit availableHeightChanged(); } QT_END_NAMESPACE diff --git a/src/templates/qquickpopup_p_p.h b/src/templates/qquickpopup_p_p.h index ab53a616..45dd7fd9 100644 --- a/src/templates/qquickpopup_p_p.h +++ b/src/templates/qquickpopup_p_p.h @@ -103,8 +103,10 @@ protected: void mouseUngrabEvent() Q_DECL_OVERRIDE; void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; + void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) Q_DECL_OVERRIDE; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; void itemChange(ItemChange change, const ItemChangeData &data) Q_DECL_OVERRIDE; + void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE; private: Q_DECLARE_PRIVATE(QQuickPopupItem) @@ -163,9 +165,6 @@ public: void finalizeEnterTransition(); void finalizeExitTransition(); - void resizeBackground(); - void resizeContent(); - QMarginsF getMargins() const; void setTopMargin(qreal value, bool reset = false); @@ -173,11 +172,6 @@ public: void setRightMargin(qreal value, bool reset = false); void setBottomMargin(qreal value, bool reset = false); - void setTopPadding(qreal value, bool reset = false); - void setLeftPadding(qreal value, bool reset = false); - void setRightPadding(qreal value, bool reset = false); - void setBottomPadding(qreal value, bool reset = false); - bool focus; bool modal; bool complete; @@ -185,26 +179,15 @@ public: bool hasLeftMargin; bool hasRightMargin; bool hasBottomMargin; - bool hasTopPadding; - bool hasLeftPadding; - bool hasRightPadding; - bool hasBottomPadding; qreal margins; qreal topMargin; qreal leftMargin; qreal rightMargin; qreal bottomMargin; - qreal padding; - qreal topPadding; - qreal leftPadding; - qreal rightPadding; - qreal bottomPadding; qreal contentWidth; qreal contentHeight; QQuickPopup::ClosePolicy closePolicy; QQuickItem *parentItem; - QQuickItem *background; - QQuickItem *contentItem; QQuickTransition *enter; QQuickTransition *exit; QQuickPopupItem *popupItem; |