diff options
Diffstat (limited to 'tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp')
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 185 |
1 files changed, 184 insertions, 1 deletions
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index b037cc2141..9109b2e8a3 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -55,6 +55,20 @@ static inline void centerOnScreen(QWidget *w, const QSize &size) w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); } +struct MenuMetrics { + int fw; + int hmargin; + int vmargin; + int tearOffHeight; + + MenuMetrics(const QMenu *menu) { + fw = menu->style()->pixelMetric(QStyle::PM_MenuPanelWidth, nullptr, menu); + hmargin = menu->style()->pixelMetric(QStyle::PM_MenuHMargin, nullptr, menu); + vmargin = menu->style()->pixelMetric(QStyle::PM_MenuVMargin, nullptr, menu); + tearOffHeight = menu->style()->pixelMetric(QStyle::PM_MenuTearoffHeight, nullptr, menu); + } +}; + static inline void centerOnScreen(QWidget *w) { centerOnScreen(w, w->geometry().size()); @@ -114,6 +128,8 @@ private slots: void QTBUG_56917_wideMenuSize(); void QTBUG_56917_wideMenuScreenNumber(); void QTBUG_56917_wideSubmenuScreenNumber(); + void menuSize_Scrolling_data(); + void menuSize_Scrolling(); protected slots: void onActivated(QAction*); void onHighlighted(QAction*); @@ -617,7 +633,10 @@ void tst_QMenu::tearOff() QVERIFY(QTest::qWaitForWindowActive(menu.data())); QVERIFY(!menu->isTearOffMenuVisible()); - QTest::mouseClick(menu.data(), Qt::LeftButton, 0, QPoint(3, 3), 10); + MenuMetrics mm(menu.data()); + const int tearOffOffset = mm.fw + mm.vmargin + mm.tearOffHeight / 2; + + QTest::mouseClick(menu.data(), Qt::LeftButton, 0, QPoint(10, tearOffOffset), 10); QTRY_VERIFY(menu->isTearOffMenuVisible()); QPointer<QMenu> torn = getTornOffMenu(); QVERIFY(torn); @@ -1373,5 +1392,169 @@ void tst_QMenu::QTBUG_56917_wideSubmenuScreenNumber() } } +void tst_QMenu::menuSize_Scrolling_data() +{ + QTest::addColumn<int>("numItems"); + QTest::addColumn<int>("topMargin"); + QTest::addColumn<int>("bottomMargin"); + QTest::addColumn<int>("leftMargin"); + QTest::addColumn<int>("rightMargin"); + QTest::addColumn<int>("topPadding"); + QTest::addColumn<int>("bottomPadding"); + QTest::addColumn<int>("leftPadding"); + QTest::addColumn<int>("rightPadding"); + QTest::addColumn<int>("border"); + QTest::addColumn<bool>("scrollable"); + QTest::addColumn<bool>("tearOff"); + + // test data + // a single column and non-scrollable menu with contents margins + border + QTest::newRow("data0") << 5 << 2 << 2 << 2 << 2 << 0 << 0 << 0 << 0 << 2 << false << false; + // a single column and non-scrollable menu with paddings + border + QTest::newRow("data1") << 5 << 0 << 0 << 0 << 0 << 2 << 2 << 2 << 2 << 2 << false << false; + // a single column and non-scrollable menu with contents margins + paddings + border + QTest::newRow("data2") << 5 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << false << false; + // a single column and non-scrollable menu with contents margins + paddings + border + tear-off + QTest::newRow("data3") << 5 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << false << true; + // a multi-column menu with contents margins + border + QTest::newRow("data4") << 80 << 2 << 2 << 2 << 2 << 0 << 0 << 0 << 0 << 2 << false << false; + // a multi-column menu with paddings + border + QTest::newRow("data5") << 80 << 0 << 0 << 0 << 0 << 2 << 2 << 2 << 2 << 2 << false << false; + // a multi-column menu with contents margins + paddings + border + QTest::newRow("data6") << 80 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << false << false; + // a multi-column menu with contents margins + paddings + border + tear-off + QTest::newRow("data7") << 80 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << false << true; + // a scrollable menu with contents margins + border + QTest::newRow("data8") << 80 << 2 << 2 << 2 << 2 << 0 << 0 << 0 << 0 << 2 << true << false; + // a scrollable menu with paddings + border + QTest::newRow("data9") << 80 << 0 << 0 << 0 << 0 << 2 << 2 << 2 << 2 << 2 << true << false; + // a scrollable menu with contents margins + paddings + border + QTest::newRow("data10") << 80 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << true << false; + // a scrollable menu with contents margins + paddings + border + tear-off + QTest::newRow("data11") << 80 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << 2 << true << true; +} + +void tst_QMenu::menuSize_Scrolling() +{ + class TestMenu : public QMenu + { + public: + struct ContentsMargins + { + ContentsMargins(int l, int t, int r, int b) + : left(l), top(t), right(r), bottom(b) {} + int left; + int top; + int right; + int bottom; + }; + + struct MenuPaddings + { + MenuPaddings(int l, int t, int r, int b) + : left(l), top(t), right(r), bottom(b) {} + int left; + int top; + int right; + int bottom; + }; + + TestMenu(int numItems, const ContentsMargins &margins, const MenuPaddings &paddings, + int border, bool scrollable, bool tearOff) + : QMenu("Test Menu"), + m_numItems(numItems), + m_scrollable(scrollable), + m_tearOff(tearOff) + { + init(margins, paddings, border); + } + + ~TestMenu() {} + + private: + void showEvent(QShowEvent *e) Q_DECL_OVERRIDE + { + QVERIFY(actions().length() == m_numItems); + + int hmargin = style()->pixelMetric(QStyle::PM_MenuHMargin, nullptr, this); + int fw = style()->pixelMetric(QStyle::PM_MenuPanelWidth, nullptr, this); + int leftMargin, topMargin, rightMargin, bottomMargin; + getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin); + QRect lastItem = actionGeometry(actions().at(actions().length() - 1)); + QSize s = size(); + QCOMPARE( s.width(), lastItem.right() + fw + hmargin + rightMargin + 1); + QMenu::showEvent(e); + } + + void init(const ContentsMargins &margins, const MenuPaddings &paddings, int border) + { + setLayoutDirection(Qt::LeftToRight); + + setTearOffEnabled(m_tearOff); + setContentsMargins(margins.left, margins.top, margins.right, margins.bottom); + QString cssStyle("QMenu {menu-scrollable: "); + cssStyle += (m_scrollable ? QString::number(1) : QString::number(0)); + cssStyle += "; border: "; + cssStyle += QString::number(border); + cssStyle += "px solid black; padding: "; + cssStyle += QString::number(paddings.top); + cssStyle += "px "; + cssStyle += QString::number(paddings.right); + cssStyle += "px "; + cssStyle += QString::number(paddings.bottom); + cssStyle += "px "; + cssStyle += QString::number(paddings.left); + cssStyle += "px;}"; + setStyleSheet(cssStyle); + for (int i = 1; i <= m_numItems; i++) + addAction("MenuItem " + QString::number(i)); + } + + private: + int m_numItems; + bool m_scrollable; + bool m_tearOff; + }; + + QFETCH(int, numItems); + QFETCH(int, topMargin); + QFETCH(int, bottomMargin); + QFETCH(int, leftMargin); + QFETCH(int, rightMargin); + QFETCH(int, topPadding); + QFETCH(int, bottomPadding); + QFETCH(int, leftPadding); + QFETCH(int, rightPadding); + QFETCH(int, border); + QFETCH(bool, scrollable); + QFETCH(bool, tearOff); + + qApp->setAttribute(Qt::AA_DontUseNativeMenuBar); + + TestMenu::ContentsMargins margins(leftMargin, topMargin, rightMargin, bottomMargin); + TestMenu::MenuPaddings paddings(leftPadding, topPadding, rightPadding, bottomPadding); + TestMenu menu(numItems, margins, paddings, border, scrollable, tearOff); + menu.popup(QPoint(0,0)); + centerOnScreen(&menu); + QVERIFY(QTest::qWaitForWindowExposed(&menu)); + + QList<QAction *> actions = menu.actions(); + QCOMPARE(actions.length(), numItems); + + MenuMetrics mm(&menu); + QTest::keyClick(&menu, Qt::Key_Home); + QTRY_COMPARE(menu.actionGeometry(actions.first()).y(), mm.fw + mm.vmargin + topMargin + (tearOff ? mm.tearOffHeight : 0)); + QCOMPARE(menu.actionGeometry(actions.first()).x(), mm.fw + mm.hmargin + leftMargin); + + if (!scrollable) + return; + + QTest::keyClick(&menu, Qt::Key_End); + QTRY_COMPARE(menu.actionGeometry(actions.last()).right(), + menu.width() - mm.fw - mm.hmargin - leftMargin - 1); + QCOMPARE(menu.actionGeometry(actions.last()).bottom(), + menu.height() - mm.fw - mm.vmargin - bottomMargin - 1); +} + QTEST_MAIN(tst_QMenu) #include "tst_qmenu.moc" |