From a60a28f8225709bfca338416630a0493853264e1 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 13 Dec 2017 16:10:51 +0100 Subject: SpinBox: use deferred execution tst_controls::SpinBox::test_initialFocus() caught an issue that focus was not transferred as expected when the creation of the content item was deferred. Task-number: QTBUG-50992 Change-Id: I6b9f5684ab7141fa4ebfe4c7fe3e32528553b96d Reviewed-by: J-P Nurmi --- src/quicktemplates2/qquickspinbox.cpp | 85 ++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 15 deletions(-) (limited to 'src/quicktemplates2/qquickspinbox.cpp') diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index 1989d768..d390f570 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -36,6 +36,7 @@ #include "qquickspinbox_p.h" #include "qquickcontrol_p_p.h" +#include "qquickdeferredexecute_p_p.h" #include #include @@ -144,6 +145,8 @@ public: void handleRelease(const QPointF &point) override; void handleUngrab() override; + QQuickItem *getContentItem() override; + bool editable; int from; int to; @@ -159,6 +162,30 @@ public: Qt::InputMethodHints inputMethodHints; }; +class QQuickSpinButtonPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQuickSpinButton) + +public: + QQuickSpinButtonPrivate() + : pressed(false), + hovered(false), + indicator(nullptr) + { + } + + static QQuickSpinButtonPrivate *get(QQuickSpinButton *button) + { + return button->d_func(); + } + + void executeIndicator(bool complete = false); + + bool pressed; + bool hovered; + QQuickDeferredPointer indicator; +}; + int QQuickSpinBoxPrivate::boundValue(int value) const { return from > to ? qBound(to, value, from) : qBound(from, value, to); @@ -347,6 +374,13 @@ void QQuickSpinBoxPrivate::handleUngrab() stopPressRepeat(); } +QQuickItem *QQuickSpinBoxPrivate::getContentItem() +{ + if (!contentItem) + executeContentItem(); + return contentItem; +} + QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) : QQuickControl(*(new QQuickSpinBoxPrivate), parent) { @@ -833,9 +867,26 @@ void QQuickSpinBox::wheelEvent(QWheelEvent *event) } #endif +void QQuickSpinBox::classBegin() +{ + Q_D(QQuickSpinBox); + QQuickControl::classBegin(); + + QQmlContext *context = qmlContext(this); + if (context) { + QQmlEngine::setContextForObject(d->up, context); + QQmlEngine::setContextForObject(d->down, context); + } +} + void QQuickSpinBox::componentComplete() { Q_D(QQuickSpinBox); + QQuickSpinButtonPrivate::get(d->up)->executeIndicator(true); + QQuickSpinButtonPrivate::get(d->down)->executeIndicator(true); + d->executeBackground(true); + d->executeContentItem(true); + QQuickControl::componentComplete(); if (!d->setValue(d->value, false)) { d->updateUpEnabled(); @@ -859,6 +910,8 @@ void QQuickSpinBox::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) if (newItem) { newItem->setActiveFocusOnTab(true); + if (d->activeFocus) + newItem->forceActiveFocus(d->focusReason); #if QT_CONFIG(cursor) if (d->editable) newItem->setCursor(Qt::IBeamCursor); @@ -890,20 +943,19 @@ void QQuickSpinBox::accessibilityActiveChanged(bool active) } #endif -class QQuickSpinButtonPrivate : public QObjectPrivate +static inline QString indicatorName() { return QStringLiteral("indicator"); } + +void QQuickSpinButtonPrivate::executeIndicator(bool complete) { -public: - QQuickSpinButtonPrivate() - : pressed(false), - hovered(false), - indicator(nullptr) - { - } + Q_Q(QQuickSpinButton); + if (indicator.wasExecuted()) + return; - bool pressed; - bool hovered; - QQuickItem *indicator; -}; + if (!indicator) + quickBeginDeferred(q, indicatorName(), indicator); + if (complete) + quickCompleteDeferred(q, indicatorName(), indicator); +} QQuickSpinButton::QQuickSpinButton(QQuickSpinBox *parent) : QObject(*(new QQuickSpinButtonPrivate), parent) @@ -928,7 +980,9 @@ void QQuickSpinButton::setPressed(bool pressed) QQuickItem *QQuickSpinButton::indicator() const { - Q_D(const QQuickSpinButton); + QQuickSpinButtonPrivate *d = const_cast(d_func()); + if (!d->indicator) + d->executeIndicator(); return d->indicator; } @@ -938,14 +992,15 @@ void QQuickSpinButton::setIndicator(QQuickItem *indicator) if (d->indicator == indicator) return; - QQuickControlPrivate::destroyDelegate(d->indicator, d->parent); + delete d->indicator; d->indicator = indicator; if (indicator) { if (!indicator->parentItem()) indicator->setParentItem(static_cast(parent())); } - emit indicatorChanged(); + if (!d->indicator.isExecuting()) + emit indicatorChanged(); } bool QQuickSpinButton::isHovered() const -- cgit v1.2.3 From a03f18e026bb564237702cab477589b6916a0102 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 14 Dec 2017 15:50:32 +0100 Subject: Control: defer the execution of the background item Task-number: QTBUG-50992 Change-Id: I6372e143c68f0a5bf7212d759281acef3c81618e Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickspinbox.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/quicktemplates2/qquickspinbox.cpp') diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index d390f570..1f821ac6 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -884,7 +884,6 @@ void QQuickSpinBox::componentComplete() Q_D(QQuickSpinBox); QQuickSpinButtonPrivate::get(d->up)->executeIndicator(true); QQuickSpinButtonPrivate::get(d->down)->executeIndicator(true); - d->executeBackground(true); d->executeContentItem(true); QQuickControl::componentComplete(); -- cgit v1.2.3 From 6b89293b99e763589181fd1f75470712f52cee3c Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 14 Dec 2017 20:00:46 +0100 Subject: Control: defer the execution of the content item Tumbler is excluded because test_customContentItemAtConstruction() starts failing if deferred execution is enabled for the content item. Task-number: QTBUG-50992 Change-Id: I11022c3c380311396453cf6229e068e4aae2d82a Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickspinbox.cpp | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'src/quicktemplates2/qquickspinbox.cpp') diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index 1f821ac6..80bef2db 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -145,8 +145,6 @@ public: void handleRelease(const QPointF &point) override; void handleUngrab() override; - QQuickItem *getContentItem() override; - bool editable; int from; int to; @@ -374,13 +372,6 @@ void QQuickSpinBoxPrivate::handleUngrab() stopPressRepeat(); } -QQuickItem *QQuickSpinBoxPrivate::getContentItem() -{ - if (!contentItem) - executeContentItem(); - return contentItem; -} - QQuickSpinBox::QQuickSpinBox(QQuickItem *parent) : QQuickControl(*(new QQuickSpinBoxPrivate), parent) { @@ -884,7 +875,6 @@ void QQuickSpinBox::componentComplete() Q_D(QQuickSpinBox); QQuickSpinButtonPrivate::get(d->up)->executeIndicator(true); QQuickSpinButtonPrivate::get(d->down)->executeIndicator(true); - d->executeContentItem(true); QQuickControl::componentComplete(); if (!d->setValue(d->value, false)) { -- cgit v1.2.3