diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquickcontainer.cpp | 67 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontainer_p_p.h | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 134 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p.h | 7 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p_p.h | 9 | ||||
-rw-r--r-- | src/quicktemplates2/qquickdialogbuttonbox.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickmenubar.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane.cpp | 96 | ||||
-rw-r--r-- | src/quicktemplates2/qquickpane_p_p.h | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquickscrollview.cpp | 23 | ||||
-rw-r--r-- | src/quicktemplates2/qquickswipeview.cpp | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktabbar.cpp | 10 |
12 files changed, 219 insertions, 163 deletions
diff --git a/src/quicktemplates2/qquickcontainer.cpp b/src/quicktemplates2/qquickcontainer.cpp index b3d0e705..44f943d9 100644 --- a/src/quicktemplates2/qquickcontainer.cpp +++ b/src/quicktemplates2/qquickcontainer.cpp @@ -210,6 +210,8 @@ void QQuickContainerPrivate::init() contentModel = new QQmlObjectModel(q); QObject::connect(contentModel, &QQmlObjectModel::countChanged, q, &QQuickContainer::countChanged); QObject::connect(contentModel, &QQmlObjectModel::childrenChanged, q, &QQuickContainer::contentChildrenChanged); + connect(q, &QQuickControl::implicitContentWidthChanged, this, &QQuickContainerPrivate::updateContentWidth); + connect(q, &QQuickControl::implicitContentHeightChanged, this, &QQuickContainerPrivate::updateContentHeight); } void QQuickContainerPrivate::cleanup() @@ -385,20 +387,6 @@ void QQuickContainerPrivate::itemDestroyed(QQuickItem *item) QQuickControlPrivate::itemDestroyed(item); } -void QQuickContainerPrivate::itemImplicitWidthChanged(QQuickItem *item) -{ - QQuickControlPrivate::itemImplicitWidthChanged(item); - if (item == contentItem) - updateContentWidth(); -} - -void QQuickContainerPrivate::itemImplicitHeightChanged(QQuickItem *item) -{ - QQuickControlPrivate::itemImplicitHeightChanged(item); - if (item == contentItem) - updateContentHeight(); -} - void QQuickContainerPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj) { QQuickContainer *q = static_cast<QQuickContainer *>(prop->object); @@ -456,67 +444,26 @@ void QQuickContainerPrivate::contentChildren_clear(QQmlListProperty<QQuickItem> return QQuickContainerPrivate::get(q)->contentModel->clear(); } -qreal QQuickContainerPrivate::getContentWidth() const -{ - return contentItem ? contentItem->implicitWidth() : 0; -} - -qreal QQuickContainerPrivate::getContentHeight() const -{ - return contentItem ? contentItem->implicitHeight() : 0; -} - void QQuickContainerPrivate::updateContentWidth() { Q_Q(QQuickContainer); - if (hasContentWidth) - return; - - const qreal oldContentWidth = contentWidth; - contentWidth = getContentWidth(); - if (qFuzzyCompare(contentWidth, oldContentWidth)) + if (hasContentWidth || qFuzzyCompare(contentWidth, implicitContentWidth)) return; + contentWidth = implicitContentWidth; emit q->contentWidthChanged(); } void QQuickContainerPrivate::updateContentHeight() { Q_Q(QQuickContainer); - if (hasContentHeight) - return; - - const qreal oldContentHeight = contentHeight; - contentHeight = getContentHeight(); - if (qFuzzyCompare(contentHeight, oldContentHeight)) + if (hasContentHeight || qFuzzyCompare(contentHeight, implicitContentHeight)) return; + contentHeight = implicitContentHeight; emit q->contentHeightChanged(); } -void QQuickContainerPrivate::updateContentSize() -{ - Q_Q(QQuickContainer); - if (hasContentWidth && hasContentHeight) - return; - - const qreal oldContentWidth = contentWidth; - if (!hasContentWidth) - contentWidth = getContentWidth(); - - const qreal oldContentHeight = contentHeight; - if (!hasContentHeight) - contentHeight = getContentHeight(); - - const bool widthChanged = !qFuzzyCompare(contentWidth, oldContentWidth); - const bool heightChanged = !qFuzzyCompare(contentHeight, oldContentHeight); - - if (widthChanged) - emit q->contentWidthChanged(); - if (heightChanged) - emit q->contentHeightChanged(); -} - QQuickContainer::QQuickContainer(QQuickItem *parent) : QQuickControl(*(new QQuickContainerPrivate), parent) { @@ -955,8 +902,6 @@ void QQuickContainer::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem if (signalIndex != -1) QMetaObject::connect(newItem, signalIndex, this, slotIndex); } - - d->updateContentSize(); } bool QQuickContainer::isContent(QQuickItem *item) const diff --git a/src/quicktemplates2/qquickcontainer_p_p.h b/src/quicktemplates2/qquickcontainer_p_p.h index 5c8a8037..28190f07 100644 --- a/src/quicktemplates2/qquickcontainer_p_p.h +++ b/src/quicktemplates2/qquickcontainer_p_p.h @@ -81,8 +81,6 @@ public: void itemSiblingOrderChanged(QQuickItem *item) override; void itemParentChanged(QQuickItem *item, QQuickItem *parent) override; void itemDestroyed(QQuickItem *item) override; - void itemImplicitWidthChanged(QQuickItem *item) override; - void itemImplicitHeightChanged(QQuickItem *item) override; static void contentData_append(QQmlListProperty<QObject> *prop, QObject *obj); static int contentData_count(QQmlListProperty<QObject> *prop); @@ -94,12 +92,8 @@ public: static QQuickItem *contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index); static void contentChildren_clear(QQmlListProperty<QQuickItem> *prop); - virtual qreal getContentWidth() const; - virtual qreal getContentHeight() const; - void updateContentWidth(); void updateContentHeight(); - void updateContentSize(); bool hasContentWidth; bool hasContentHeight; diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index 7a1bb496..de68b4ef 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -130,6 +130,8 @@ QQuickControlPrivate::QQuickControlPrivate() padding(0), horizontalPadding(0), verticalPadding(0), + implicitContentWidth(0), + implicitContentHeight(0), spacing(0), focusPolicy(Qt::NoFocus), focusReason(Qt::OtherFocusReason), @@ -346,8 +348,10 @@ void QQuickControlPrivate::setContentItem_helper(QQuickItem *item, bool notify) cancelContentItem(); QQuickItem *oldContentItem = contentItem; - if (oldContentItem) + if (oldContentItem) { disconnect(oldContentItem, &QQuickItem::baselineOffsetChanged, this, &QQuickControlPrivate::updateBaselineOffset); + removeImplicitSizeListener(oldContentItem); + } contentItem = item; q->contentItemChange(item, oldContentItem); @@ -359,13 +363,57 @@ void QQuickControlPrivate::setContentItem_helper(QQuickItem *item, bool notify) item->setParentItem(q); if (componentComplete) resizeContent(); + addImplicitSizeListener(contentItem); } + + updateImplicitContentSize(); updateBaselineOffset(); if (notify && !contentItem.isExecuting()) emit q->contentItemChanged(); } +qreal QQuickControlPrivate::getContentWidth() const +{ + return contentItem ? contentItem->implicitWidth() : 0; +} + +qreal QQuickControlPrivate::getContentHeight() const +{ + return contentItem ? contentItem->implicitHeight() : 0; +} + +void QQuickControlPrivate::updateImplicitContentWidth() +{ + Q_Q(QQuickControl); + const qreal oldWidth = implicitContentWidth; + implicitContentWidth = getContentWidth(); + if (!qFuzzyCompare(implicitContentWidth, oldWidth)) + emit q->implicitContentWidthChanged(); +} + +void QQuickControlPrivate::updateImplicitContentHeight() +{ + Q_Q(QQuickControl); + const qreal oldHeight = implicitContentHeight; + implicitContentHeight = getContentHeight(); + if (!qFuzzyCompare(implicitContentHeight, oldHeight)) + emit q->implicitContentHeightChanged(); +} + +void QQuickControlPrivate::updateImplicitContentSize() +{ + Q_Q(QQuickControl); + const qreal oldWidth = implicitContentWidth; + const qreal oldHeight = implicitContentHeight; + implicitContentWidth = getContentWidth(); + implicitContentHeight = getContentHeight(); + if (!qFuzzyCompare(implicitContentWidth, oldWidth)) + emit q->implicitContentWidthChanged(); + if (!qFuzzyCompare(implicitContentHeight, oldHeight)) + emit q->implicitContentHeightChanged(); +} + #if QT_CONFIG(accessibility) void QQuickControlPrivate::accessibilityActiveChanged(bool active) { @@ -750,6 +798,8 @@ void QQuickControlPrivate::itemImplicitWidthChanged(QQuickItem *item) Q_Q(QQuickControl); if (item == background) emit q->implicitBackgroundWidthChanged(); + else if (item == contentItem) + updateImplicitContentWidth(); } void QQuickControlPrivate::itemImplicitHeightChanged(QQuickItem *item) @@ -757,6 +807,8 @@ void QQuickControlPrivate::itemImplicitHeightChanged(QQuickItem *item) Q_Q(QQuickControl); if (item == background) emit q->implicitBackgroundHeightChanged(); + else if (item == contentItem) + updateImplicitContentHeight(); } void QQuickControlPrivate::itemDestroyed(QQuickItem *item) @@ -766,6 +818,9 @@ void QQuickControlPrivate::itemDestroyed(QQuickItem *item) background = nullptr; emit q->implicitBackgroundWidthChanged(); emit q->implicitBackgroundHeightChanged(); + } else if (item == contentItem) { + contentItem = nullptr; + updateImplicitContentSize(); } } @@ -787,6 +842,7 @@ QQuickControl::~QQuickControl() { Q_D(QQuickControl); d->removeImplicitSizeListener(d->background); + d->removeImplicitSizeListener(d->contentItem); } void QQuickControl::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) @@ -1622,6 +1678,60 @@ void QQuickControl::resetVerticalPadding() /*! \since QtQuick.Controls 2.5 (Qt 5.12) + \qmlproperty real QtQuick.Controls::Control::implicitContentWidth + \readonly + + This property holds the implicit content width. + + For basic controls, the value is equal to \c {contentItem ? contentItem.implicitWidth : 0}. + For types that inherit Container or Pane, the value is calculated based on the content children. + + This is typically used, together with \l implicitBackgroundWidth, to calculate + the \l {Item::}{implicitWidth}: + + \code + Control { + implicitWidth: Math.max(implicitBackgroundWidth, implicitContentWidth + leftPadding + rightPadding) + } + \endcode + + \sa implicitContentHeight, implicitBackgroundWidth +*/ +qreal QQuickControl::implicitContentWidth() const +{ + Q_D(const QQuickControl); + return d->implicitContentWidth; +} + +/*! + \since QtQuick.Controls 2.5 (Qt 5.12) + \qmlproperty real QtQuick.Controls::Control::implicitContentHeight + \readonly + + This property holds the implicit content height. + + For basic controls, the value is equal to \c {contentItem ? contentItem.implicitHeight : 0}. + For types that inherit Container or Pane, the value is calculated based on the content children. + + This is typically used, together with \l implicitBackgroundHeight, to calculate + the \l {Item::}{implicitHeight}: + + \code + Control { + implicitHeight: Math.max(implicitBackgroundHeight, implicitContentHeight + topPadding + bottomPadding) + } + \endcode + + \sa implicitContentWidth, implicitBackgroundHeight +*/ +qreal QQuickControl::implicitContentHeight() const +{ + Q_D(const QQuickControl); + return d->implicitContentHeight; +} + +/*! + \since QtQuick.Controls 2.5 (Qt 5.12) \qmlproperty real QtQuick.Controls::Control::implicitBackgroundWidth \readonly @@ -1629,7 +1739,16 @@ void QQuickControl::resetVerticalPadding() The value is equal to \c {background ? background.implicitWidth : 0}. - \sa implicitBackgroundHeight + This is typically used, together with \l implicitContentWidth, to calculate + the \l {Item::}{implicitWidth}: + + \code + Control { + implicitWidth: Math.max(implicitBackgroundWidth, implicitContentWidth + leftPadding + rightPadding) + } + \endcode + + \sa implicitBackgroundHeight, implicitContentWidth */ qreal QQuickControl::implicitBackgroundWidth() const { @@ -1648,7 +1767,16 @@ qreal QQuickControl::implicitBackgroundWidth() const The value is equal to \c {background ? background.implicitHeight : 0}. - \sa implicitBackgroundWidth + This is typically used, together with \l implicitContentHeight, to calculate + the \l {Item::}{implicitHeight}: + + \code + Control { + implicitHeight: Math.max(implicitBackgroundHeight, implicitContentHeight + topPadding + bottomPadding) + } + \endcode + + \sa implicitBackgroundWidth, implicitContentHeight */ qreal QQuickControl::implicitBackgroundHeight() const { diff --git a/src/quicktemplates2/qquickcontrol_p.h b/src/quicktemplates2/qquickcontrol_p.h index bde03e94..5716a725 100644 --- a/src/quicktemplates2/qquickcontrol_p.h +++ b/src/quicktemplates2/qquickcontrol_p.h @@ -85,6 +85,8 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickControl : public QQuickItem // 2.5 (Qt 5.12) Q_PROPERTY(qreal horizontalPadding READ horizontalPadding WRITE setHorizontalPadding RESET resetHorizontalPadding NOTIFY horizontalPaddingChanged FINAL REVISION 5) Q_PROPERTY(qreal verticalPadding READ verticalPadding WRITE setVerticalPadding RESET resetVerticalPadding NOTIFY verticalPaddingChanged FINAL REVISION 5) + Q_PROPERTY(qreal implicitContentWidth READ implicitContentWidth NOTIFY implicitContentWidthChanged FINAL REVISION 5) + Q_PROPERTY(qreal implicitContentHeight READ implicitContentHeight NOTIFY implicitContentHeightChanged FINAL REVISION 5) Q_PROPERTY(qreal implicitBackgroundWidth READ implicitBackgroundWidth NOTIFY implicitBackgroundWidthChanged FINAL REVISION 5) Q_PROPERTY(qreal implicitBackgroundHeight READ implicitBackgroundHeight NOTIFY implicitBackgroundHeightChanged FINAL REVISION 5) Q_CLASSINFO("DeferredPropertyNames", "background,contentItem") @@ -172,6 +174,9 @@ public: void setVerticalPadding(qreal padding); void resetVerticalPadding(); + qreal implicitContentWidth() const; + qreal implicitContentHeight() const; + qreal implicitBackgroundWidth() const; qreal implicitBackgroundHeight() const; @@ -201,6 +206,8 @@ Q_SIGNALS: // 2.5 (Qt 5.12) Q_REVISION(5) void horizontalPaddingChanged(); Q_REVISION(5) void verticalPaddingChanged(); + Q_REVISION(5) void implicitContentWidthChanged(); + Q_REVISION(5) void implicitContentHeightChanged(); Q_REVISION(5) void implicitBackgroundWidthChanged(); Q_REVISION(5) void implicitBackgroundHeightChanged(); diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index 5c0d253e..f1873da9 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -166,6 +166,13 @@ public: void itemImplicitHeightChanged(QQuickItem *item) override; void itemDestroyed(QQuickItem *item) override; + virtual qreal getContentWidth() const; + virtual qreal getContentHeight() const; + + void updateImplicitContentWidth(); + void updateImplicitContentHeight(); + void updateImplicitContentSize(); + struct ExtraData { ExtraData(); bool hasTopPadding; @@ -194,6 +201,8 @@ public: qreal padding; qreal horizontalPadding; qreal verticalPadding; + qreal implicitContentWidth; + qreal implicitContentHeight; qreal spacing; QLocale locale; QFont resolvedFont; diff --git a/src/quicktemplates2/qquickdialogbuttonbox.cpp b/src/quicktemplates2/qquickdialogbuttonbox.cpp index bc5b51d9..5e555da3 100644 --- a/src/quicktemplates2/qquickdialogbuttonbox.cpp +++ b/src/quicktemplates2/qquickdialogbuttonbox.cpp @@ -212,7 +212,7 @@ void QQuickDialogButtonBoxPrivate::itemImplicitWidthChanged(QQuickItem *item) if (item == contentItem) resizeContent(); else - updateContentWidth(); + updateImplicitContentWidth(); } void QQuickDialogButtonBoxPrivate::itemImplicitHeightChanged(QQuickItem *item) @@ -221,7 +221,7 @@ void QQuickDialogButtonBoxPrivate::itemImplicitHeightChanged(QQuickItem *item) if (item == contentItem) resizeContent(); else - updateContentHeight(); + updateImplicitContentHeight(); } // adapted from QStyle::alignedRect() @@ -725,7 +725,7 @@ void QQuickDialogButtonBox::itemAdded(int index, QQuickItem *item) QObjectPrivate::connect(button, &QQuickAbstractButton::clicked, d, &QQuickDialogButtonBoxPrivate::handleClick); if (QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(item, false))) QQuickDialogButtonBoxAttachedPrivate::get(attached)->setButtonBox(this); - d->updateContentSize(); + d->updateImplicitContentSize(); if (isComponentComplete()) polish(); } @@ -738,7 +738,7 @@ void QQuickDialogButtonBox::itemRemoved(int index, QQuickItem *item) QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, d, &QQuickDialogButtonBoxPrivate::handleClick); if (QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(item, false))) QQuickDialogButtonBoxAttachedPrivate::get(attached)->setButtonBox(nullptr); - d->updateContentSize(); + d->updateImplicitContentSize(); if (isComponentComplete()) polish(); } diff --git a/src/quicktemplates2/qquickmenubar.cpp b/src/quicktemplates2/qquickmenubar.cpp index ca43f5af..2d4c7a4f 100644 --- a/src/quicktemplates2/qquickmenubar.cpp +++ b/src/quicktemplates2/qquickmenubar.cpp @@ -249,14 +249,14 @@ void QQuickMenuBarPrivate::itemImplicitWidthChanged(QQuickItem *item) { QQuickContainerPrivate::itemImplicitWidthChanged(item); if (item != contentItem) - updateContentWidth(); + updateImplicitContentWidth(); } void QQuickMenuBarPrivate::itemImplicitHeightChanged(QQuickItem *item) { QQuickContainerPrivate::itemImplicitHeightChanged(item); if (item != contentItem) - updateContentHeight(); + updateImplicitContentHeight(); } void QQuickMenuBarPrivate::contentData_append(QQmlListProperty<QObject> *prop, QObject *obj) @@ -540,7 +540,7 @@ void QQuickMenuBar::itemAdded(int index, QQuickItem *item) if (QQuickMenu *menu = menuBarItem->menu()) QObjectPrivate::connect(menu, &QQuickPopup::aboutToHide, d, &QQuickMenuBarPrivate::onMenuAboutToHide); } - d->updateContentSize(); + d->updateImplicitContentSize(); emit menusChanged(); } @@ -561,7 +561,7 @@ void QQuickMenuBar::itemRemoved(int index, QQuickItem *item) if (QQuickMenu *menu = menuBarItem->menu()) QObjectPrivate::disconnect(menu, &QQuickPopup::aboutToHide, d, &QQuickMenuBarPrivate::onMenuAboutToHide); } - d->updateContentSize(); + d->updateImplicitContentSize(); emit menusChanged(); } diff --git a/src/quicktemplates2/qquickpane.cpp b/src/quicktemplates2/qquickpane.cpp index d4c38fb6..72a5ee17 100644 --- a/src/quicktemplates2/qquickpane.cpp +++ b/src/quicktemplates2/qquickpane.cpp @@ -116,6 +116,18 @@ QQuickPanePrivate::QQuickPanePrivate() { } +void QQuickPanePrivate::init() +{ + Q_Q(QQuickPane); + q->setFlag(QQuickItem::ItemIsFocusScope); + q->setAcceptedMouseButtons(Qt::AllButtons); +#if QT_CONFIG(cursor) + q->setCursor(Qt::ArrowCursor); +#endif + connect(q, &QQuickControl::implicitContentWidthChanged, this, &QQuickPanePrivate::updateContentWidth); + connect(q, &QQuickControl::implicitContentHeightChanged, this, &QQuickPanePrivate::updateContentHeight); +} + QList<QQuickItem *> QQuickPanePrivate::contentChildItems() const { if (!contentItem) @@ -136,21 +148,17 @@ QQuickItem *QQuickPanePrivate::getContentItem() void QQuickPanePrivate::itemImplicitWidthChanged(QQuickItem *item) { QQuickControlPrivate::itemImplicitWidthChanged(item); - if (item == contentItem || item == firstChild) - updateContentWidth(); + + if (item == firstChild) + updateImplicitContentWidth(); } void QQuickPanePrivate::itemImplicitHeightChanged(QQuickItem *item) { QQuickControlPrivate::itemImplicitHeightChanged(item); - if (item == contentItem || item == firstChild) - updateContentHeight(); -} -void QQuickPanePrivate::itemDestroyed(QQuickItem *item) -{ - if (item == contentItem) - updateContentSize(); + if (item == firstChild) + updateImplicitContentHeight(); } void QQuickPanePrivate::contentChildrenChange() @@ -165,7 +173,7 @@ void QQuickPanePrivate::contentChildrenChange() firstChild = newFirstChild; } - updateContentSize(); + updateImplicitContentSize(); emit q->contentChildrenChanged(); } @@ -204,18 +212,11 @@ qreal QQuickPanePrivate::getContentHeight() const void QQuickPanePrivate::updateContentWidth() { Q_Q(QQuickPane); - if (hasContentWidth) - return; - - // a special case for width<->height dependent content (wrapping text) in ScrollView - if (contentWidth < 0 && !componentComplete) - return; - - qreal oldContentWidth = contentWidth; - contentWidth = getContentWidth(); - if (qFuzzyCompare(contentWidth, oldContentWidth)) + if (hasContentWidth || qFuzzyCompare(contentWidth, implicitContentWidth)) return; + const qreal oldContentWidth = contentWidth; + contentWidth = implicitContentWidth; q->contentSizeChange(QSizeF(contentWidth, contentHeight), QSizeF(oldContentWidth, contentHeight)); emit q->contentWidthChanged(); } @@ -223,56 +224,20 @@ void QQuickPanePrivate::updateContentWidth() void QQuickPanePrivate::updateContentHeight() { Q_Q(QQuickPane); - if (hasContentHeight) - return; - - // a special case for width<->height dependent content (wrapping text) in ScrollView - if (contentWidth < 0 && !componentComplete) - return; - - qreal oldContentHeight = contentHeight; - contentHeight = getContentHeight(); - if (qFuzzyCompare(contentHeight, oldContentHeight)) + if (hasContentHeight || qFuzzyCompare(contentHeight, implicitContentHeight)) return; + const qreal oldContentHeight = contentHeight; + contentHeight = implicitContentHeight; q->contentSizeChange(QSizeF(contentWidth, contentHeight), QSizeF(contentWidth, oldContentHeight)); emit q->contentHeightChanged(); } -void QQuickPanePrivate::updateContentSize() -{ - Q_Q(QQuickPane); - if ((hasContentWidth && hasContentHeight) || !componentComplete) - return; - - const qreal oldContentWidth = contentWidth; - if (!hasContentWidth) - contentWidth = getContentWidth(); - - const qreal oldContentHeight = contentHeight; - if (!hasContentHeight) - contentHeight = getContentHeight(); - - const bool widthChanged = !qFuzzyCompare(contentWidth, oldContentWidth); - const bool heightChanged = !qFuzzyCompare(contentHeight, oldContentHeight); - - if (widthChanged || heightChanged) - q->contentSizeChange(QSizeF(contentWidth, contentHeight), QSizeF(oldContentWidth, oldContentHeight)); - - if (widthChanged) - emit q->contentWidthChanged(); - if (heightChanged) - emit q->contentHeightChanged(); -} - QQuickPane::QQuickPane(QQuickItem *parent) : QQuickControl(*(new QQuickPanePrivate), parent) { - setFlag(QQuickItem::ItemIsFocusScope); - setAcceptedMouseButtons(Qt::AllButtons); -#if QT_CONFIG(cursor) - setCursor(Qt::ArrowCursor); -#endif + Q_D(QQuickPane); + d->init(); } QQuickPane::~QQuickPane() @@ -285,11 +250,8 @@ QQuickPane::~QQuickPane() QQuickPane::QQuickPane(QQuickPanePrivate &dd, QQuickItem *parent) : QQuickControl(dd, parent) { - setFlag(QQuickItem::ItemIsFocusScope); - setAcceptedMouseButtons(Qt::AllButtons); -#if QT_CONFIG(cursor) - setCursor(Qt::ArrowCursor); -#endif + Q_D(QQuickPane); + d->init(); } /*! @@ -421,7 +383,7 @@ void QQuickPane::componentComplete() { Q_D(QQuickPane); QQuickControl::componentComplete(); - d->updateContentSize(); + d->updateImplicitContentSize(); } void QQuickPane::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) diff --git a/src/quicktemplates2/qquickpane_p_p.h b/src/quicktemplates2/qquickpane_p_p.h index 2e09d82d..808b33c6 100644 --- a/src/quicktemplates2/qquickpane_p_p.h +++ b/src/quicktemplates2/qquickpane_p_p.h @@ -61,24 +61,24 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickPanePrivate : public QQuickControlP public: QQuickPanePrivate(); + void init(); + virtual QQmlListProperty<QObject> contentData(); virtual QQmlListProperty<QQuickItem> contentChildren(); virtual QList<QQuickItem *> contentChildItems() const; QQuickItem *getContentItem() override; - qreal getContentWidth() const; - qreal getContentHeight() const; + qreal getContentWidth() const override; + qreal getContentHeight() const override; void itemImplicitWidthChanged(QQuickItem *item) override; void itemImplicitHeightChanged(QQuickItem *item) override; - void itemDestroyed(QQuickItem *item) override; void contentChildrenChange(); void updateContentWidth(); void updateContentHeight(); - void updateContentSize(); bool hasContentWidth; bool hasContentHeight; diff --git a/src/quicktemplates2/qquickscrollview.cpp b/src/quicktemplates2/qquickscrollview.cpp index 2b348272..c4ca2caa 100644 --- a/src/quicktemplates2/qquickscrollview.cpp +++ b/src/quicktemplates2/qquickscrollview.cpp @@ -135,6 +135,8 @@ public: static QQuickItem *contentChildren_at(QQmlListProperty<QQuickItem> *prop, int index); static void contentChildren_clear(QQmlListProperty<QQuickItem> *prop); + void itemImplicitWidthChanged(QQuickItem *item) override; + bool wasTouched; QQuickFlickable *flickable; }; @@ -223,11 +225,11 @@ void QQuickScrollViewPrivate::updateContentWidth() return; const qreal cw = flickable->contentWidth(); - if (qFuzzyCompare(cw, contentWidth)) + if (qFuzzyCompare(cw, implicitContentWidth)) return; - contentWidth = cw; - emit q->contentWidthChanged(); + implicitContentWidth = cw; + emit q->implicitContentWidthChanged(); } void QQuickScrollViewPrivate::updateContentHeight() @@ -237,11 +239,11 @@ void QQuickScrollViewPrivate::updateContentHeight() return; const qreal ch = flickable->contentHeight(); - if (qFuzzyCompare(ch, contentHeight)) + if (qFuzzyCompare(ch, implicitContentHeight)) return; - contentHeight = ch; - emit q->contentHeightChanged(); + implicitContentHeight = ch; + emit q->implicitContentHeightChanged(); } QQuickScrollBar *QQuickScrollViewPrivate::verticalScrollBar() const @@ -363,6 +365,15 @@ void QQuickScrollViewPrivate::contentChildren_clear(QQmlListProperty<QQuickItem> children.clear(&children); } +void QQuickScrollViewPrivate::itemImplicitWidthChanged(QQuickItem *item) +{ + // a special case for width<->height dependent content (wrapping text) in ScrollView + if (contentWidth < 0 && !componentComplete) + return; + + QQuickPanePrivate::itemImplicitWidthChanged(item); +} + QQuickScrollView::QQuickScrollView(QQuickItem *parent) : QQuickPane(*(new QQuickScrollViewPrivate), parent) { diff --git a/src/quicktemplates2/qquickswipeview.cpp b/src/quicktemplates2/qquickswipeview.cpp index 4031513a..0f3b6851 100644 --- a/src/quicktemplates2/qquickswipeview.cpp +++ b/src/quicktemplates2/qquickswipeview.cpp @@ -189,7 +189,7 @@ void QQuickSwipeViewPrivate::itemImplicitWidthChanged(QQuickItem *item) Q_Q(QQuickSwipeView); QQuickContainerPrivate::itemImplicitWidthChanged(item); if (item == q->currentItem()) - updateContentWidth(); + updateImplicitContentWidth(); } void QQuickSwipeViewPrivate::itemImplicitHeightChanged(QQuickItem *item) @@ -197,7 +197,7 @@ void QQuickSwipeViewPrivate::itemImplicitHeightChanged(QQuickItem *item) Q_Q(QQuickSwipeView); QQuickContainerPrivate::itemImplicitHeightChanged(item); if (item == q->currentItem()) - updateContentHeight(); + updateImplicitContentHeight(); } qreal QQuickSwipeViewPrivate::getContentWidth() const @@ -220,7 +220,7 @@ QQuickSwipeView::QQuickSwipeView(QQuickItem *parent) Q_D(QQuickSwipeView); setFlag(ItemIsFocusScope); setActiveFocusOnTab(true); - QObjectPrivate::connect(this, &QQuickContainer::currentItemChanged, d, &QQuickContainerPrivate::updateContentSize); + QObjectPrivate::connect(this, &QQuickContainer::currentItemChanged, d, &QQuickControlPrivate::updateImplicitContentSize); } /*! diff --git a/src/quicktemplates2/qquicktabbar.cpp b/src/quicktemplates2/qquicktabbar.cpp index ff5bc1a8..9bb6eecf 100644 --- a/src/quicktemplates2/qquicktabbar.cpp +++ b/src/quicktemplates2/qquicktabbar.cpp @@ -241,7 +241,7 @@ void QQuickTabBarPrivate::itemGeometryChanged(QQuickItem *, QQuickGeometryChange { if (!updatingLayout) { if (change.sizeChange()) - updateContentSize(); + updateImplicitContentSize(); updateLayout(); } } @@ -250,14 +250,14 @@ void QQuickTabBarPrivate::itemImplicitWidthChanged(QQuickItem *item) { QQuickContainerPrivate::itemImplicitWidthChanged(item); if (item != contentItem) - updateContentWidth(); + updateImplicitContentWidth(); } void QQuickTabBarPrivate::itemImplicitHeightChanged(QQuickItem *item) { QQuickContainerPrivate::itemImplicitHeightChanged(item); if (item != contentItem) - updateContentHeight(); + updateImplicitContentHeight(); } QQuickTabBar::QQuickTabBar(QQuickItem *parent) @@ -368,7 +368,7 @@ void QQuickTabBar::itemAdded(int index, QQuickItem *item) QQuickTabBarAttached *attached = qobject_cast<QQuickTabBarAttached *>(qmlAttachedPropertiesObject<QQuickTabBar>(item)); if (attached) QQuickTabBarAttachedPrivate::get(attached)->update(this, index); - d->updateContentSize(); + d->updateImplicitContentSize(); if (isComponentComplete()) polish(); } @@ -389,7 +389,7 @@ void QQuickTabBar::itemRemoved(int index, QQuickItem *item) QQuickTabBarAttached *attached = qobject_cast<QQuickTabBarAttached *>(qmlAttachedPropertiesObject<QQuickTabBar>(item)); if (attached) QQuickTabBarAttachedPrivate::get(attached)->update(nullptr, -1); - d->updateContentSize(); + d->updateImplicitContentSize(); if (isComponentComplete()) polish(); } |