diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2020-01-16 20:26:03 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2020-01-22 08:47:57 +0100 |
commit | 477dc115670d7c122d6590b9be10e076ebff8d08 (patch) | |
tree | 68c60d4344eae0968ddc16eba3ac9f034ccac8ca | |
parent | eb18be36ad013c80fe982a77b3eadb9791f96298 (diff) |
QTabBar: fix QStyleOptionTab::position
During 556712f511a02ff8101e648d2e6f0090231d4f3d a small regression was
introduced which set a wrong value for QStyleOptionTab::position.
Fixes: QTBUG-81393
Change-Id: Ie8c66186b1b79c97bf77c7b139e08840233b7b66
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
-rw-r--r-- | src/widgets/widgets/qtabbar.cpp | 2 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp | 36 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index a7b115a1bc..df480629da 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -208,7 +208,7 @@ void QTabBarPrivate::initBasicStyleOption(QStyleOptionTab *option, int tabIndex) option->selectedPosition = QStyleOptionTab::NotAdjacent; const bool paintBeginning = (tabIndex == firstVisible) || (dragInProgress && tabIndex == pressedIndex + 1); - const bool paintEnd = (tabIndex == lastVisible - 1) || (dragInProgress && tabIndex == pressedIndex - 1); + const bool paintEnd = (tabIndex == lastVisible) || (dragInProgress && tabIndex == pressedIndex - 1); if (paintBeginning) { if (paintEnd) option->position = QStyleOptionTab::OnlyOneTab; diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp index bc1496d0f6..e27600bad2 100644 --- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp +++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp @@ -33,6 +33,7 @@ #include <qpushbutton.h> #include <qstyle.h> +#include <qstyleoption.h> class tst_QTabBar : public QObject { @@ -279,30 +280,53 @@ void tst_QTabBar::hideTab() QTEST(tabbar.currentIndex(), "finalIndex"); } +class TabBar : public QTabBar +{ +public: + using QTabBar::QTabBar; + using QTabBar::initStyleOption; + using QTabBar::moveTab; +}; + void tst_QTabBar::hideAllTabs() { - QTabBar tabbar; + TabBar tabbar; + auto checkPositions = [&tabbar](const QVector<int> &positions) + { + QStyleOptionTab option; + int iPos = 0; + for (int i = 0; i < tabbar.count(); ++i) { + if (!tabbar.isTabVisible(i)) + continue; + tabbar.initStyleOption(&option, i); + QCOMPARE(option.position, positions.at(iPos++)); + } + }; tabbar.addTab("foo"); tabbar.addTab("bar"); tabbar.addTab("baz"); tabbar.setCurrentIndex(0); + checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::Middle, QStyleOptionTab::End}); // Check we don't crash trying to hide an unexistant tab QSize prevSizeHint = tabbar.sizeHint(); tabbar.setTabVisible(3, false); + checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::Middle, QStyleOptionTab::End}); QCOMPARE(tabbar.currentIndex(), 0); QSize sizeHint = tabbar.sizeHint(); QVERIFY(sizeHint.width() == prevSizeHint.width()); prevSizeHint = sizeHint; tabbar.setTabVisible(1, false); + checkPositions({QStyleOptionTab::Beginning, QStyleOptionTab::End}); QCOMPARE(tabbar.currentIndex(), 0); sizeHint = tabbar.sizeHint(); QVERIFY(sizeHint.width() < prevSizeHint.width()); prevSizeHint = sizeHint; tabbar.setTabVisible(2, false); + checkPositions({QStyleOptionTab::OnlyOneTab}); QCOMPARE(tabbar.currentIndex(), 0); sizeHint = tabbar.sizeHint(); QVERIFY(sizeHint.width() < prevSizeHint.width()); @@ -571,14 +595,6 @@ void tst_QTabBar::selectionBehaviorOnRemove() QCOMPARE(tabbar.currentIndex(), expected); } -class TabBar : public QTabBar -{ - Q_OBJECT -public: - void callMoveTab(int from, int to){ moveTab(from, to); } -}; - - Q_DECLARE_METATYPE(QTabBar::Shape) void tst_QTabBar::moveTab_data() { @@ -613,7 +629,7 @@ void tst_QTabBar::moveTab() bar.setShape(shape); while(--tabs >= 0) bar.addTab(QString::number(tabs)); - bar.callMoveTab(from, to); + bar.moveTab(from, to); } |