diff options
Diffstat (limited to 'src')
-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; |