From ce8fa1262227af30005cc6f8f820473225255065580dd2d4f21fb39896f305cd Mon Sep 17 00:00:00 2001 From: Fabian Vogt Date: Wed, 7 Jun 2023 18:19:02 +0000 Subject: [PATCH] Accepting request 1091330 from home:jonaski:branches:KDE:Qt6 - Add patch for QTabBar regression in Qt 6.5.1 (QTBUG-114204) * 0001-tabbar-fix.patch This bug affects strawberry and all menu items (tabs) above the last selected left menu (tabbar) is missing without this fix. OBS-URL: https://build.opensuse.org/request/show/1091330 OBS-URL: https://build.opensuse.org/package/show/KDE:Qt6/qt6-base?expand=0&rev=56 --- 0001-tabbar-fix.patch | 99 +++++++++++++++++++++++++++++++++++++++++++ qt6-base.changes | 6 +++ qt6-base.spec | 7 +-- 3 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 0001-tabbar-fix.patch diff --git a/0001-tabbar-fix.patch b/0001-tabbar-fix.patch new file mode 100644 index 0000000..f08ae31 --- /dev/null +++ b/0001-tabbar-fix.patch @@ -0,0 +1,99 @@ +From 2a7da1b3c8c4096d7c2b09f3fcc58e9cf47867cd Mon Sep 17 00:00:00 2001 +From: Volker Hilsheimer +Date: Mon, 5 Jun 2023 17:10:00 +0200 +Subject: QTabBar: recalculate scroll offset when showing + +If an application sets the current index and resizes the tab widget +before showing it, then the scroll offset might be calculated based on +an old size. Since after ca15f650a1a914bb9a41131109c46c4e52c5ebb1, +resizing explicitly avoids scrolling, this could result in tabs ending +up scrolled outside of the tab bar when showing the tab widget. + +Fix that by explicitly making the current tab visible in the tab bar's +showEvent handler, which recalculates the scroll offset based on the +actual size. + +This is only reproducible with a tab widget, which lays out the tab bar +for each change and resets the tab bar's layoutDirty flag. Add a test +case there. + +Pick-to: 6.5 6.6 +Fixes: QTBUG-114204 +Change-Id: I1e9506b9dde1dd892291d108dd2c7b675ef99509 +Reviewed-by: Axel Spoerl +Reviewed-by: Jonas Kvinge +--- + src/widgets/widgets/qtabbar.cpp | 2 ++ + .../widgets/widgets/qtabwidget/tst_qtabwidget.cpp | 37 ++++++++++++++++++++++ + 2 files changed, 39 insertions(+) + +diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp +index 75cb6dd4ea..ea408ec7f6 100644 +--- a/src/widgets/widgets/qtabbar.cpp ++++ b/src/widgets/widgets/qtabbar.cpp +@@ -1656,6 +1656,8 @@ void QTabBar::showEvent(QShowEvent *) + d->refresh(); + if (!d->validIndex(d->currentIndex)) + setCurrentIndex(0); ++ else ++ d->makeVisible(d->currentIndex); + d->updateMacBorderMetrics(); + } + +diff --git a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp +index 00cb26c2d3..eb29933fd1 100644 +--- a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp ++++ b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp +@@ -79,6 +79,9 @@ private slots: + void moveCurrentTab(); + void autoHide(); + ++ void setCurrentBeforeShow_data(); ++ void setCurrentBeforeShow(); ++ + private: + int addPage(); + void removePage(int index); +@@ -750,5 +753,39 @@ void tst_QTabWidget::autoHide() + QVERIFY(heightForWidth1 > tabWidget.heightForWidth(20)); + } + ++void tst_QTabWidget::setCurrentBeforeShow_data() ++{ ++ QTest::addColumn("tabPosition"); ++ QTest::newRow("West") << QTabWidget::West; ++ QTest::newRow("North") << QTabWidget::North; ++ QTest::newRow("East") << QTabWidget::East; ++ QTest::newRow("South") << QTabWidget::South; ++} ++ ++void tst_QTabWidget::setCurrentBeforeShow() ++{ ++ QFETCH(QTabWidget::TabPosition, tabPosition); ++ ++ QTabWidget tabWidget; ++ tabWidget.setTabPosition(tabPosition); ++ ++ QPixmap pm(50, 50); ++ pm.fill(Qt::red); ++ const QIcon icon(pm); ++ for (int i = 0; i < 4; ++i) ++ tabWidget.addTab(new QWidget, icon, QString("Tab %1").arg(i)); ++ ++ // the tab widget has space for the entire tab bar ++ tabWidget.resize(tabWidget.tabBar()->sizeHint() + QSize(50, 50)); ++ tabWidget.setCurrentIndex(2); ++ tabWidget.show(); ++ QVERIFY(QTest::qWaitForWindowExposed(&tabWidget)); ++ ++ QCOMPARE_GE(tabWidget.tabBar()->tabRect(0).x(), 0); ++ QCOMPARE_GE(tabWidget.tabBar()->tabRect(0).y(), 0); ++ ++ QTest::qWait(2000); ++} ++ + QTEST_MAIN(tst_QTabWidget) + #include "tst_qtabwidget.moc" +-- +cgit v1.2.3 + diff --git a/qt6-base.changes b/qt6-base.changes index 966b8a1..7b7e9f5 100644 --- a/qt6-base.changes +++ b/qt6-base.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Jun 7 17:58:46 UTC 2023 - Jonas Kvinge + +- Add patch for QTabBar regression in Qt 6.5.1 (QTBUG-114204) + * 0001-tabbar-fix.patch + ------------------------------------------------------------------- Mon Jun 5 08:59:52 UTC 2023 - Christophe Marin diff --git a/qt6-base.spec b/qt6-base.spec index abcc779..0ddfd92 100644 --- a/qt6-base.spec +++ b/qt6-base.spec @@ -1,5 +1,5 @@ # -# spec file for package qt6-base +# spec file # # Copyright (c) 2023 SUSE LLC # @@ -41,6 +41,7 @@ Source99: qt6-base-rpmlintrc # Patches 0-100 are upstream patches # Patch0: 0001-Schannel-Reject-certificate-not-signed-by-a-configur.patch Patch1: 0001-Ssl-Copy-the-on-demand-cert-loading-bool-from-defaul.patch +Patch2: 0001-tabbar-fix.patch # Patches 100-200 are openSUSE and/or non-upstream(able) patches # Patch100: 0001-Tell-the-truth-about-private-API.patch # No need to pollute the library dir with object files, install them in the qt6 subfolder @@ -577,8 +578,8 @@ BuildArch: noarch %description -n qt6-docs-common This package contains common files used for building Qt documentation. -### Static libraries ### +### Static libraries ### %package -n qt6-exampleicons-devel-static Summary: Qt ExampleIcons module # TODO @@ -635,8 +636,8 @@ Requires: qt6-platformsupport-devel-static = %{version} This package provides private headers of libQt6PlatformSupport that do not have any ABI or API guarantees. -### Plugins ### +### Plugins ### %package -n qt6-networkinformation-glib Summary: Network information for QNetworkInformation using GNetworkMonitor