diff options
author | Thierry Bastian <thierry.bastian@nokia.com> | 2009-06-29 13:38:06 (GMT) |
---|---|---|
committer | Thierry Bastian <thierry.bastian@nokia.com> | 2009-06-29 13:38:45 (GMT) |
commit | 82c48b13249fbcd96d8287f3cd1fdfd61802523c (patch) | |
tree | 5713b0936f049492990db70acdd6da2c53e63781 | |
parent | a9c225e6b464337d253e6b9aa5eaac82d01b3301 (diff) | |
download | Qt-82c48b13249fbcd96d8287f3cd1fdfd61802523c.zip Qt-82c48b13249fbcd96d8287f3cd1fdfd61802523c.tar.gz Qt-82c48b13249fbcd96d8287f3cd1fdfd61802523c.tar.bz2 |
QMenuBar: adding autotest and simplify/fix geometry calculation
-rw-r--r-- | src/gui/widgets/qmenubar.cpp | 21 | ||||
-rw-r--r-- | src/gui/widgets/qmenubar_p.h | 3 | ||||
-rw-r--r-- | tests/auto/qmenubar/tst_qmenubar.cpp | 43 |
3 files changed, 52 insertions, 15 deletions
diff --git a/src/gui/widgets/qmenubar.cpp b/src/gui/widgets/qmenubar.cpp index a31dc67..5a8c0e2 100644 --- a/src/gui/widgets/qmenubar.cpp +++ b/src/gui/widgets/qmenubar.cpp @@ -198,8 +198,6 @@ void QMenuBarPrivate::updateGeometries() } #endif calcActionRects(q_width, q_start); - itemsWidth = q_width; - itemsStart = q_start; currentAction = 0; #ifndef QT_NO_SHORTCUT if(itemsDirty) { @@ -271,6 +269,9 @@ QRect QMenuBarPrivate::actionRect(QAction *act) const if (index == -1) return QRect(); + //makes sure the geometries are up-to-date + const_cast<QMenuBarPrivate*>(this)->updateGeometries(); + QRect ret = actionRects.at(index); const int fw = q->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, q); ret.translate(fw, fw); @@ -415,9 +416,9 @@ void QMenuBarPrivate::calcActionRects(int max_width, int start) const { Q_Q(const QMenuBar); - if(!itemsDirty && itemsWidth == max_width && itemsStart == start) { + if(!itemsDirty) return; - } + //let's reinitialize the buffer actionRects.resize(actions.count()); actionRects.fill(QRect()); @@ -1658,17 +1659,11 @@ QSize QMenuBar::sizeHint() const int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this); int spaceBelowMenuBar = style()->styleHint(QStyle::SH_MainWindow_SpaceBelowMenuBar, 0, this); if(as_gui_menubar) { - QMap<QAction*, QRect> actionRects; - QList<QAction*> actionList; const int w = parentWidget() ? parentWidget()->width() : QApplication::desktop()->width(); d->calcActionRects(w - (2 * fw), 0); - for (QMap<QAction*, QRect>::const_iterator i = actionRects.constBegin(); - i != actionRects.constEnd(); ++i) { - QRect actionRect(i.value()); - if(actionRect.x() + actionRect.width() > ret.width()) - ret.setWidth(actionRect.x() + actionRect.width()); - if(actionRect.y() + actionRect.height() > ret.height()) - ret.setHeight(actionRect.y() + actionRect.height()); + for (int i = 0; i < d->actionRects.count(); ++i) { + const QRect &actionRect = d->actionRects.at(i); + ret = ret.expandedTo(QSize(actionRect.x() + actionRect.width(), actionRect.y() + actionRect.height())); } ret += QSize(2*fw + 2*hmargin, 2*fw + 2*vmargin); } diff --git a/src/gui/widgets/qmenubar_p.h b/src/gui/widgets/qmenubar_p.h index 5b209b2..bac1912 100644 --- a/src/gui/widgets/qmenubar_p.h +++ b/src/gui/widgets/qmenubar_p.h @@ -69,7 +69,7 @@ class QMenuBarPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QMenuBar) public: - QMenuBarPrivate() : itemsDirty(0), itemsWidth(0), itemsStart(-1), currentAction(0), mouseDown(0), + QMenuBarPrivate() : itemsDirty(0), currentAction(0), mouseDown(0), closePopupMode(0), defaultPopDown(1), popupState(0), keyboardState(0), altPressed(0), nativeMenuBar(-1) #ifdef Q_WS_MAC @@ -95,7 +95,6 @@ public: //item calculations uint itemsDirty : 1; - int itemsWidth, itemsStart; QVector<int> shortcutIndexMap; mutable QVector<QRect> actionRects; diff --git a/tests/auto/qmenubar/tst_qmenubar.cpp b/tests/auto/qmenubar/tst_qmenubar.cpp index 8a38782..f6f5873 100644 --- a/tests/auto/qmenubar/tst_qmenubar.cpp +++ b/tests/auto/qmenubar/tst_qmenubar.cpp @@ -50,6 +50,7 @@ #include <qstyle.h> #include <qdesktopwidget.h> #include <qaction.h> +#include <qstyleoption.h> #ifdef Q_WS_WIN #include <windows.h> @@ -150,6 +151,7 @@ private slots: void check_menuPosition(); void task223138_triggered(); void task256322_highlight(); + void menubarSizeHint(); #if defined(QT3_SUPPORT) void indexBasedInsertion_data(); @@ -1556,6 +1558,47 @@ void tst_QMenuBar::task256322_highlight() QVERIFY(!win.menuBar()->activeAction()); } +void tst_QMenuBar::menubarSizeHint() +{ + QMenuBar mb; + //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); + + int left, top, right, bottom; + mb.getContentsMargins(&left, &top, &right, &bottom); + const int panelWidth = mb.style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, &mb); + + mb.show(); + QRect result; + foreach(QAction *action, mb.actions()) { + result |= mb.actionGeometry(action); + QCOMPARE(result.x(), left + panelWidth); + QCOMPARE(result.y(), top + panelWidth); + } + + //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(right + panelWidth, top + panelWidth); + + + resSize = mb.style()->sizeFromContents(QStyle::CT_MenuBar, &opt, + resSize.expandedTo(QApplication::globalStrut()), + &mb); + + QCOMPARE(resSize, mb.sizeHint()); +} + #if defined(QT3_SUPPORT) void tst_QMenuBar::indexBasedInsertion_data() |