diff options
| author | Gabriel de Dietrich <gabriel.dedietrich@digia.com> | 2013-02-25 14:40:24 +0100 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-25 15:43:37 +0100 |
| commit | 7cf9b32258c0c1b11cc12693f6feef7dc9d13ef7 (patch) | |
| tree | ba7334c3f36c0a0de1320356836f1b3bfda14544 | |
| parent | ea4a6d3c095b62e1afb4ccf5125f1280f172e30e (diff) | |
Menu: Fix 'selectedIndex' update on item trigger
This demanded some code refactoring, and the introduction
of the parent menu property. Updated auto-tests too.
Change-Id: I3d9070b0a1a76d6c174ccf13965d30413f23aadd
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Reviewed-by: Caroline Chao <caroline.chao@digia.com>
| -rw-r--r-- | src/controls/Menu.qml | 1 | ||||
| -rw-r--r-- | src/controls/qtmenu.cpp | 55 | ||||
| -rw-r--r-- | src/controls/qtmenu_p.h | 3 | ||||
| -rw-r--r-- | src/controls/qtmenuitem.cpp | 24 | ||||
| -rw-r--r-- | src/controls/qtmenuitem_p.h | 9 | ||||
| -rw-r--r-- | tests/auto/controls/data/tst_menu.qml | 7 |
6 files changed, 47 insertions, 52 deletions
diff --git a/src/controls/Menu.qml b/src/controls/Menu.qml index 270c7869c..7eaa0ded4 100644 --- a/src/controls/Menu.qml +++ b/src/controls/Menu.qml @@ -180,7 +180,6 @@ MenuPrivate { function triggerAndDismiss() { var item = itemsRepeater.itemAt(root.currentIndex) if (item && !item.isSeparator) { - root.selectedIndex = root.currentIndex item.menuItem.trigger() root.dismissMenu() } diff --git a/src/controls/qtmenu.cpp b/src/controls/qtmenu.cpp index 5c1587c8e..766379049 100644 --- a/src/controls/qtmenu.cpp +++ b/src/controls/qtmenu.cpp @@ -157,15 +157,17 @@ void QtMenu::setSelectedIndex(int index) return; m_selectedIndex = index; - - if (m_selectedIndex >= 0 && m_selectedIndex < m_menuItems.size()) - if (QtMenuItem *item = qobject_cast<QtMenuItem *>(m_menuItems[m_selectedIndex])) - if (item->checkable()) - item->setChecked(true); - emit selectedIndexChanged(); } +void QtMenu::updateSelectedIndex() +{ + if (QtMenuBase *menuItem = qobject_cast<QtMenuItem*>(sender())) { + int index = m_menuItems.indexOf(menuItem); + setSelectedIndex(index); + } +} + QQmlListProperty<QtMenuBase> QtMenu::menuItems() { return QQmlListProperty<QtMenuBase>(this, 0, &QtMenu::append_menuItems, &QtMenu::count_menuItems, &QtMenu::at_menuItems, 0); @@ -268,40 +270,24 @@ void QtMenu::clearMenuItems() m_menuItems.clear(); } -QtMenuItem *QtMenu::addMenuItem(const QString &text) +void QtMenu::addMenuItem(QtMenuBase *menuItem) { - QtMenuItem *menuItem = new QtMenuItem(this); - menuItem->setText(text); + menuItem->setParentMenu(this); m_menuItems.append(menuItem); if (QPlatformMenuItem *platformItem = menuItem->platformItem()) { if (m_platformMenu) m_platformMenu->insertMenuItem(platformItem, 0 /* append */); - - connect(platformItem, SIGNAL(activated()), this, SLOT(emitSelected())); } - - if (m_menuItems.size() == 1) - // Inform QML that the selected action (0) now has changed contents: - emit selectedIndexChanged(); - - emit menuItemsChanged(); - return menuItem; } -void QtMenu::emitSelected() +QtMenuItem *QtMenu::addMenuItem(const QString &text) { - QPlatformMenuItem *platformItem = qobject_cast<QPlatformMenuItem *>(sender()); - if (!platformItem) - return; - - int index = -1; - foreach (QtMenuBase *item, m_menuItems) { - ++index; - if (item->platformItem() == platformItem) - break; - } + QtMenuItem *menuItem = new QtMenuItem(this); + menuItem->setText(text); + addMenuItem(menuItem); - setSelectedIndex(index); + emit menuItemsChanged(); + return menuItem; } QString QtMenu::itemTextAt(int index) const @@ -336,13 +322,8 @@ int QtMenu::modelCount() const void QtMenu::append_menuItems(QQmlListProperty<QtMenuBase> *list, QtMenuBase *menuItem) { - QtMenu *menu = qobject_cast<QtMenu *>(list->object); - if (menu) { - menuItem->setParent(menu); - menu->m_menuItems.append(menuItem); - if (menu->m_platformMenu) - menu->m_platformMenu->insertMenuItem(menuItem->platformItem(), 0 /* append */); - } + if (QtMenu *menu = qobject_cast<QtMenu *>(list->object)) + menu->addMenuItem(menuItem); } int QtMenu::count_menuItems(QQmlListProperty<QtMenuBase> *list) diff --git a/src/controls/qtmenu_p.h b/src/controls/qtmenu_p.h index 85f1530ef..f45b13bbb 100644 --- a/src/controls/qtmenu_p.h +++ b/src/controls/qtmenu_p.h @@ -75,6 +75,7 @@ public: QQmlListProperty<QtMenuBase> menuItems(); QPlatformMenu* platformMenu() { return m_platformMenu; } + void addMenuItem(QtMenuBase *); int minimumWidth() const { return m_minimumWidth; } void setMinimumWidth(int w); @@ -105,6 +106,7 @@ public Q_SLOTS: void setModel(const QVariant &newModel); void closeMenu(); void dismissMenu(); + void updateSelectedIndex(); void setMenuContentItem(QQuickItem * arg) { @@ -137,7 +139,6 @@ protected: bool isNative() { return m_platformMenu != 0; } protected Q_SLOTS: - void emitSelected(); void updateText(); void windowVisibleChanged(bool); diff --git a/src/controls/qtmenuitem.cpp b/src/controls/qtmenuitem.cpp index a62845123..c53f9858f 100644 --- a/src/controls/qtmenuitem.cpp +++ b/src/controls/qtmenuitem.cpp @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE QtMenuBase::QtMenuBase(QObject *parent) - : QObject(parent), m_visualItem(0) + : QObject(parent), m_parentMenu(0), m_visualItem(0) { m_platformItem = QGuiApplicationPrivate::platformTheme()->createPlatformMenuItem(); } @@ -61,6 +61,16 @@ QtMenuBase::~QtMenuBase() delete m_platformItem; } +QtMenu *QtMenuBase::parentMenu() const +{ + return m_parentMenu; +} + +void QtMenuBase::setParentMenu(QtMenu *parentMenu) +{ + m_parentMenu = parentMenu; +} + void QtMenuBase::syncWithPlatformMenu() { QtMenu *menu = qobject_cast<QtMenu *>(parent()); @@ -79,7 +89,6 @@ void QtMenuBase::setVisualItem(QQuickItem *item) m_visualItem = item; } - /*! \qmltype MenuSeparator \instantiates QtMenuSeparator @@ -206,6 +215,12 @@ QtMenuItem::~QtMenuItem() unbindFromAction(m_action); } +void QtMenuItem::setParentMenu(QtMenu *parentMenu) +{ + QtMenuBase::setParentMenu(parentMenu); + connect(this, SIGNAL(triggered()), parentMenu, SLOT(updateSelectedIndex())); +} + void QtMenuItem::bindToAction(QtAction *action) { m_action = action; @@ -289,11 +304,6 @@ void QtMenuItem::setAction(QtAction *a) emit actionChanged(); } -QtMenu *QtMenuItem::parentMenu() const -{ - return qobject_cast<QtMenu *>(parent()); -} - QString QtMenuItem::text() const { return m_action ? m_action->text() : QString(); diff --git a/src/controls/qtmenuitem_p.h b/src/controls/qtmenuitem_p.h index 2cdb9cf81..9bf0e1fe2 100644 --- a/src/controls/qtmenuitem_p.h +++ b/src/controls/qtmenuitem_p.h @@ -66,8 +66,10 @@ public: QtMenuBase(QObject *parent = 0); ~QtMenuBase(); - inline QPlatformMenuItem *platformItem() { return m_platformItem; } + QtMenu *parentMenu() const; + virtual void setParentMenu(QtMenu *parentMenu); + inline QPlatformMenuItem *platformItem() { return m_platformItem; } void syncWithPlatformMenu(); QQuickItem *visualItem() const; @@ -77,6 +79,7 @@ protected: virtual bool isNative() { return m_platformItem != 0; } private: + QtMenu *m_parentMenu; QPlatformMenuItem *m_platformItem; QPointer<QQuickItem> m_visualItem; }; @@ -107,11 +110,11 @@ public: QtMenuItem(QObject *parent = 0); ~QtMenuItem(); + void setParentMenu(QtMenu *parentMenu); + QtAction *action(); void setAction(QtAction *a); - QtMenu *parentMenu() const; - QString text() const; void setText(const QString &text); diff --git a/tests/auto/controls/data/tst_menu.qml b/tests/auto/controls/data/tst_menu.qml index 95cdc5259..a391d9a7c 100644 --- a/tests/auto/controls/data/tst_menu.qml +++ b/tests/auto/controls/data/tst_menu.qml @@ -111,7 +111,6 @@ TestCase { menuItem.trigger() compare(menuItemSpy.count, 1) - expectFail('', "MenuItem.trigger() won't always update selectedIndex") compare(menuSpy.count, 1) compare(menu.selectedIndex, 2) } @@ -137,7 +136,6 @@ TestCase { compare(menu.menuItems[i].checked, i === 2 || i === 3) compare(menuItemSpy.count, 2) - expectFail('', "MenuItem.trigger() won't always update selectedIndex") compare(menuSpy.count, 2) compare(menu.selectedIndex, 3) } @@ -167,7 +165,6 @@ TestCase { compare(menu.menuItems[i].checked, i === 3) compare(menuItemSpy.count, 2) - expectFail('', "MenuItem.trigger() won't always update selectedIndex") compare(menuSpy.count, 2) compare(menu.selectedIndex, 3) } @@ -178,6 +175,10 @@ TestCase { menu.selectedIndex = 3 compare(menu.selectedIndex, 3) + verify(!menu.menuItems[menu.selectedIndex].checked) + + menu.menuItems[2].trigger() + compare(menu.selectedIndex, 2) verify(menu.menuItems[menu.selectedIndex].checked) } } |
