diff options
-rw-r--r-- | examples/quickcontrols2/chattutorial/doc/src/qtquickcontrols2-chattutorial.qdoc | 2 | ||||
-rw-r--r-- | src/imports/controls/imagine/qquickninepatchimage.cpp | 19 | ||||
-rw-r--r-- | src/imports/controls/universal/TabBar.qml | 23 | ||||
-rw-r--r-- | src/quickcontrols2/qquicktumblerview.cpp | 3 | ||||
-rw-r--r-- | tests/auto/auto.pro | 3 | ||||
-rw-r--r-- | tests/auto/qquickimaginestyle/data/tst_imagine.qml | 48 | ||||
-rw-r--r-- | tests/auto/qquickimaginestyle/qquickimaginestyle.pro | 4 | ||||
-rw-r--r-- | tests/auto/qquickimaginestyle/test-assets/button-background-1.png | bin | 0 -> 211 bytes | |||
-rw-r--r-- | tests/auto/qquickimaginestyle/test-assets/button-background-2.png | bin | 0 -> 211 bytes | |||
-rw-r--r-- | tests/auto/qquickpopup/tst_qquickpopup.cpp | 14 |
10 files changed, 93 insertions, 23 deletions
diff --git a/examples/quickcontrols2/chattutorial/doc/src/qtquickcontrols2-chattutorial.qdoc b/examples/quickcontrols2/chattutorial/doc/src/qtquickcontrols2-chattutorial.qdoc index 0da8f7c5..49e98068 100644 --- a/examples/quickcontrols2/chattutorial/doc/src/qtquickcontrols2-chattutorial.qdoc +++ b/examples/quickcontrols2/chattutorial/doc/src/qtquickcontrols2-chattutorial.qdoc @@ -309,7 +309,7 @@ in an application. Here's the revised \c main.qml: \printuntil } \printuntil } -\section2 StackView +\section2 Navigating with StackView As its name suggests, StackView provides stack-based navigation. The last item to be \e "pushed" onto the stack is the first one to be removed, and the diff --git a/src/imports/controls/imagine/qquickninepatchimage.cpp b/src/imports/controls/imagine/qquickninepatchimage.cpp index c840c6f8..7d5e4f71 100644 --- a/src/imports/controls/imagine/qquickninepatchimage.cpp +++ b/src/imports/controls/imagine/qquickninepatchimage.cpp @@ -397,7 +397,24 @@ void QQuickNinePatchImage::pixmapChange() d->updatePatches(); } else { - d->resetNode = !d->ninePatch.isNull(); + /* + Only change resetNode when it's false; i.e. when no reset is pending. + updatePaintNode() will take care of setting it to false if it's true. + + Consider the following changes in source: + + normal.png => press.9.png => normal.png => focus.png + + If the last two events happen quickly, pixmapChange() can be called + twice with no call to updatePaintNode() inbetween. On the first call, + resetNode will be true (because ninePatch is not null since it is still + in the process of going from a 9-patch image to a regular image), + and on the second call, resetNode would be false if we didn't have this check. + This results in the oldNode never being deleted, and QQuickImage + tries to static_cast a QQuickNinePatchImage to a QSGInternalImageNode. + */ + if (!d->resetNode) + d->resetNode = !d->ninePatch.isNull(); d->ninePatch = QImage(); } QQuickImage::pixmapChange(); diff --git a/src/imports/controls/universal/TabBar.qml b/src/imports/controls/universal/TabBar.qml index ab660c93..c7d27cbd 100644 --- a/src/imports/controls/universal/TabBar.qml +++ b/src/imports/controls/universal/TabBar.qml @@ -46,23 +46,20 @@ T.TabBar { implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, contentHeight + topPadding + bottomPadding) - contentItem: PathView { + contentItem: ListView { model: control.contentModel currentIndex: control.currentIndex - interactive: false - snapMode: PathView.SnapToItem - movementDirection: PathView.Positive - highlightMoveDuration: 100 + spacing: control.spacing + orientation: ListView.Horizontal + boundsBehavior: Flickable.StopAtBounds + flickableDirection: Flickable.AutoFlickIfNeeded + snapMode: ListView.SnapToItem - path: Path { - startX: control.count ? control.availableWidth / control.count / 2 : 0 - startY: control.availableHeight / 2 - PathLine { - x: control.count ? control.availableWidth + (control.availableWidth / control.count / 2) : 0 - y: control.availableHeight / 2 - } - } + highlightMoveDuration: 100 + highlightRangeMode: ListView.ApplyRange + preferredHighlightBegin: 48 + preferredHighlightEnd: width - 48 } background: Rectangle { diff --git a/src/quickcontrols2/qquicktumblerview.cpp b/src/quickcontrols2/qquicktumblerview.cpp index 5f5c065d..4a64ad7f 100644 --- a/src/quickcontrols2/qquicktumblerview.cpp +++ b/src/quickcontrols2/qquicktumblerview.cpp @@ -180,7 +180,6 @@ void QQuickTumblerView::createView() QQml_setParent_noEvent(m_listView, this); m_listView->setParentItem(this); m_listView->setSnapMode(QQuickListView::SnapToItem); - m_listView->setHighlightRangeMode(QQuickListView::StrictlyEnforceRange); m_listView->setClip(true); // Give the view a size. @@ -193,6 +192,8 @@ void QQuickTumblerView::createView() // the view animates any potential currentIndex change over one second, // which we don't want when the contentItem has just been created. m_listView->setDelegate(m_delegate); + // Set this after setting the delegate to avoid unexpected currentIndex changes: QTBUG-79150 + m_listView->setHighlightRangeMode(QQuickListView::StrictlyEnforceRange); m_listView->setHighlightMoveDuration(1000); qCDebug(lcTumblerView) << "finished creating ListView"; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index d528b848..8612e2c1 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -30,3 +30,6 @@ SUBDIRS += \ revisions \ sanity \ snippets + +# Requires lrelease, which isn't always available in CI. +qtHaveModule(tools): translation diff --git a/tests/auto/qquickimaginestyle/data/tst_imagine.qml b/tests/auto/qquickimaginestyle/data/tst_imagine.qml index 03bb9602..b9078d78 100644 --- a/tests/auto/qquickimaginestyle/data/tst_imagine.qml +++ b/tests/auto/qquickimaginestyle/data/tst_imagine.qml @@ -54,6 +54,7 @@ import QtTest 1.1 import QtQuick.Templates 2.12 as T import QtQuick.Controls 2.12 import QtQuick.Controls.Imagine 2.12 +import QtQuick.Controls.Imagine.impl 2.12 TestCase { id: testCase @@ -105,4 +106,51 @@ TestCase { verify(control) compare(control.font.pixelSize, 80) } + + Component { + id: ninePatchImageComponent + + NinePatchImage { + property alias mouseArea: mouseArea + + MouseArea { + id: mouseArea + anchors.fill: parent + // The name of the images isn't important; we just want to check that + // going from regular to 9-patch to regular to regular works without crashing. + onPressed: parent.source = "qrc:/control-assets/button-background.9.png" + onReleased: parent.source = "qrc:/test-assets/button-background-1.png" + onClicked: parent.source = "qrc:/test-assets/button-background-2.png" + } + } + } + + Component { + id: signalSpyComponent + + SignalSpy {} + } + + // QTBUG-78790 + function test_switchBetween9PatchAndRegular() { + var ninePatchImage = createTemporaryObject(ninePatchImageComponent, testCase, + { source: "qrc:/test-assets/button-background-1.png" }) + verify(ninePatchImage) + + var clickSpy = signalSpyComponent.createObject(ninePatchImage, + { target: ninePatchImage.mouseArea, signalName: "clicked" }) + verify(clickSpy.valid) + + var afterRenderingSpy = signalSpyComponent.createObject(ninePatchImage, + { target: testCase.Window.window, signalName: "afterRendering" }) + verify(afterRenderingSpy.valid) + + mousePress(ninePatchImage) + // Wait max 1 second - in reality it should take a handful of milliseconds. + afterRenderingSpy.wait(1000) + mouseRelease(ninePatchImage) + compare(clickSpy.count, 1) + // Shouldn't result in a crash. + afterRenderingSpy.wait(1000) + } } diff --git a/tests/auto/qquickimaginestyle/qquickimaginestyle.pro b/tests/auto/qquickimaginestyle/qquickimaginestyle.pro index c421f2dc..4b1a309a 100644 --- a/tests/auto/qquickimaginestyle/qquickimaginestyle.pro +++ b/tests/auto/qquickimaginestyle/qquickimaginestyle.pro @@ -7,7 +7,9 @@ SOURCES += \ RESOURCES += \ $$PWD/qtquickcontrols2.conf \ - $$PWD/control-assets/button-background.9.png + $$PWD/control-assets/button-background.9.png \ + $$PWD/test-assets/button-background-1.png \ + $$PWD/test-assets/button-background-2.png OTHER_FILES += \ $$PWD/data/*.qml diff --git a/tests/auto/qquickimaginestyle/test-assets/button-background-1.png b/tests/auto/qquickimaginestyle/test-assets/button-background-1.png Binary files differnew file mode 100644 index 00000000..244b707b --- /dev/null +++ b/tests/auto/qquickimaginestyle/test-assets/button-background-1.png diff --git a/tests/auto/qquickimaginestyle/test-assets/button-background-2.png b/tests/auto/qquickimaginestyle/test-assets/button-background-2.png Binary files differnew file mode 100644 index 00000000..54f5ecd8 --- /dev/null +++ b/tests/auto/qquickimaginestyle/test-assets/button-background-2.png diff --git a/tests/auto/qquickpopup/tst_qquickpopup.cpp b/tests/auto/qquickpopup/tst_qquickpopup.cpp index 4d238663..8a8cd143 100644 --- a/tests/auto/qquickpopup/tst_qquickpopup.cpp +++ b/tests/auto/qquickpopup/tst_qquickpopup.cpp @@ -1197,9 +1197,11 @@ void tst_QQuickPopup::toolTipCrashOnClose() QQuickWindow *window = helper.window; window->show(); - // TODO: Using ignoreMessage() fails in CI with macOS for release builds, - // so for now we let the warning through. -// QTest::ignoreMessage(QtWarningMsg, "ShaderEffectSource: 'recursive' must be set to true when rendering recursively."); + // The warning only occurs with debug builds for some reason. + // In any case, the warning is irrelevant, but using ShaderEffectSource is important, so we ignore it. +#ifdef QT_DEBUG + QTest::ignoreMessage(QtWarningMsg, "ShaderEffectSource: 'recursive' must be set to true when rendering recursively."); +#endif QVERIFY(QTest::qWaitForWindowActive(window)); QTest::mouseMove(window, QPoint(window->width() / 2, window->height() / 2)); @@ -1215,9 +1217,9 @@ void tst_QQuickPopup::setOverlayParentToNull() QQuickWindow *window = helper.window; window->show(); - // TODO: Using ignoreMessage() fails in CI with macOS for release builds, - // so for now we let the warning through. -// QTest::ignoreMessage(QtWarningMsg, "ShaderEffectSource: 'recursive' must be set to true when rendering recursively."); +#ifdef QT_DEBUG + QTest::ignoreMessage(QtWarningMsg, "ShaderEffectSource: 'recursive' must be set to true when rendering recursively."); +#endif QVERIFY(QTest::qWaitForWindowActive(window)); QVERIFY(QMetaObject::invokeMethod(window, "nullifyOverlayParent")); |