diff options
Diffstat (limited to 'tests/auto/qmenubar')
-rw-r--r-- | tests/auto/qmenubar/qmenubar.pro | 2 | ||||
-rw-r--r-- | tests/auto/qmenubar/tst_qmenubar.cpp | 112 |
2 files changed, 113 insertions, 1 deletions
diff --git a/tests/auto/qmenubar/qmenubar.pro b/tests/auto/qmenubar/qmenubar.pro index 51cf21d14d..a0a6420221 100644 --- a/tests/auto/qmenubar/qmenubar.pro +++ b/tests/auto/qmenubar/qmenubar.pro @@ -2,5 +2,5 @@ load(qttest_p4) HEADERS += SOURCES += tst_qmenubar.cpp -contains(QT_CONFIG, qt3support):QT += qt3support +contains(QT_CONFIG, qt3support):!symbian*:QT += qt3support diff --git a/tests/auto/qmenubar/tst_qmenubar.cpp b/tests/auto/qmenubar/tst_qmenubar.cpp index 61a16ff25c..96f737fe97 100644 --- a/tests/auto/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/qmenubar/tst_qmenubar.cpp @@ -48,8 +48,10 @@ #include <q3popupmenu.h> #endif #include <qstyle.h> +#include <qwindowsstyle.h> #include <qdesktopwidget.h> #include <qaction.h> +#include <qstyleoption.h> #ifdef Q_WS_WIN #include <windows.h> @@ -57,6 +59,8 @@ #include <qobject.h> +#include "../../shared/util.h" + QT_FORWARD_DECLARE_CLASS(QMainWindow) #include <qmenubar.h> @@ -149,6 +153,8 @@ private slots: void check_shortcutPress(); void check_menuPosition(); void task223138_triggered(); + void task256322_highlight(); + void menubarSizeHint(); #if defined(QT3_SUPPORT) void indexBasedInsertion_data(); @@ -460,6 +466,10 @@ void tst_QMenuBar::accel_noQt3() #if defined(Q_WS_MAC) || defined(Q_OS_WINCE_WM) QSKIP("On Mac/WinCE, native key events are needed to test menu action activation", SkipAll); #endif +#ifdef Q_OS_SYMBIAN + QSKIP("On Symbian OS, native key events are needed to test menu action activation", SkipAll); +#endif + // create a popup menu with menu items set the accelerators later... initSimpleMenubar_noQt3(); // QTest::keyClick( 0, Qt::Key_A, AltKey ); @@ -1520,6 +1530,108 @@ void tst_QMenuBar::task223138_triggered() QCOMPARE(submenuSpy.count(), 1); } +void tst_QMenuBar::task256322_highlight() +{ + QMainWindow win; + win.menuBar()->setNativeMenuBar(false); //we can't check the geometry of native menubars + QMenu menu; + QAction *file = win.menuBar()->addMenu(&menu); + file->setText("file"); + QMenu menu2; + QAction *file2 = win.menuBar()->addMenu(&menu2); + file2->setText("file2"); + QAction *nothing = win.menuBar()->addAction("nothing"); + + win.show(); + QTest::qWait(200); + + QTest::mouseMove(win.menuBar(), win.menuBar()->actionGeometry(file).center()); + QTest::mouseClick(win.menuBar(), Qt::LeftButton, 0, win.menuBar()->actionGeometry(file).center()); + QTRY_VERIFY(menu.isVisible()); + QVERIFY(!menu2.isVisible()); + QCOMPARE(win.menuBar()->activeAction(), file); + + QTest::mouseMove(win.menuBar(), win.menuBar()->actionGeometry(file2).center()); + QTRY_VERIFY(!menu.isVisible()); + QVERIFY(menu2.isVisible()); + QCOMPARE(win.menuBar()->activeAction(), file2); + + QPoint nothingCenter = win.menuBar()->actionGeometry(nothing).center(); + QTest::mouseMove(win.menuBar(), nothingCenter); + QTRY_VERIFY(!menu2.isVisible()); + QVERIFY(!menu.isVisible()); + QCOMPARE(win.menuBar()->activeAction(), nothing); +} + +void tst_QMenuBar::menubarSizeHint() +{ + struct MyStyle : public QWindowsStyle + { + virtual int pixelMetric(PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0 ) const + { + // I chose strange values (prime numbers to be more sure that the size of the menubar is correct) + switch (metric) + { + case QStyle::PM_MenuBarItemSpacing: + return 7; + case PM_MenuBarHMargin: + return 13; + case PM_MenuBarVMargin: + return 11; + case PM_MenuBarPanelWidth: + return 1; + default: + return QWindowsStyle::pixelMetric(metric, option, widget); + } + } + } style; + + QMenuBar mb; + mb.setNativeMenuBar(false); //we can't check the geometry of native menubars + + mb.setStyle(&style); + //this is a list of arbitrary strings so that we check the geometry + QStringList list = QStringList() << "trer" << "ezrfgtgvqd" << "sdgzgzerzerzer" << "eerzertz" << "er"; + foreach(QString str, list) + mb.addAction(str); + + const int panelWidth = style.pixelMetric(QStyle::PM_MenuBarPanelWidth); + const int hmargin = style.pixelMetric(QStyle::PM_MenuBarHMargin); + const int vmargin = style.pixelMetric(QStyle::PM_MenuBarVMargin); + const int spacing = style.pixelMetric(QStyle::PM_MenuBarItemSpacing); + + mb.show(); + QRect result; + foreach(QAction *action, mb.actions()) { + const QRect actionRect = mb.actionGeometry(action); + if (!result.isNull()) //this is the first item + QCOMPARE(actionRect.left() - result.right() - 1, spacing); + result |= actionRect; + QCOMPARE(result.x(), panelWidth + hmargin + spacing); + QCOMPARE(result.y(), panelWidth + vmargin); + } + + //this code is copied from QMenuBar + //there is no public member that allows to initialize a styleoption instance + QStyleOptionMenuItem opt; + opt.rect = mb.rect(); + opt.menuRect = mb.rect(); + opt.state = QStyle::State_None; + opt.menuItemType = QStyleOptionMenuItem::Normal; + opt.checkType = QStyleOptionMenuItem::NotCheckable; + opt.palette = mb.palette(); + + QSize resSize = QSize(result.x(), result.y()) + result.size() + + QSize(panelWidth + hmargin, panelWidth + vmargin); + + + resSize = style.sizeFromContents(QStyle::CT_MenuBar, &opt, + resSize.expandedTo(QApplication::globalStrut()), + &mb); + + QCOMPARE(resSize, mb.sizeHint()); +} + #if defined(QT3_SUPPORT) void tst_QMenuBar::indexBasedInsertion_data() |