summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2013-02-25 14:40:24 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-25 15:43:37 +0100
commit7cf9b32258c0c1b11cc12693f6feef7dc9d13ef7 (patch)
treeba7334c3f36c0a0de1320356836f1b3bfda14544
parentea4a6d3c095b62e1afb4ccf5125f1280f172e30e (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.qml1
-rw-r--r--src/controls/qtmenu.cpp55
-rw-r--r--src/controls/qtmenu_p.h3
-rw-r--r--src/controls/qtmenuitem.cpp24
-rw-r--r--src/controls/qtmenuitem_p.h9
-rw-r--r--tests/auto/controls/data/tst_menu.qml7
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)
}
}