aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-07-10 11:59:47 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2017-07-10 11:24:14 +0000
commit014466f46abad9868e4e8d09c5d9ac6164ccf2f5 (patch)
tree5f1d87568d271c3b9865ee71a2b6c07e1e7a948c
parent83541427f555b73bcc0f8687adb6e81acf32c9ef (diff)
QQuickMenu: add actionAt() and menuAt() accessors
This complements the add/insert/remove/take API that was added for actions and menus. Unlike for menu items, there was no convenient way to access a specific action or menu directly without accessing the respective item first. [ChangeLog][Controls][Menu] Added actionAt() and menuAt() accessors. Change-Id: I5515441626b3a04b05265d5b42afdaea8e256709 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquickmenu.cpp34
-rw-r--r--src/quicktemplates2/qquickmenu_p.h2
-rw-r--r--tests/auto/menu/tst_menu.cpp23
3 files changed, 55 insertions, 4 deletions
diff --git a/src/quicktemplates2/qquickmenu.cpp b/src/quicktemplates2/qquickmenu.cpp
index 6fce1969..4794e36b 100644
--- a/src/quicktemplates2/qquickmenu.cpp
+++ b/src/quicktemplates2/qquickmenu.cpp
@@ -723,6 +723,23 @@ QQuickItem *QQuickMenu::takeItem(int index)
/*!
\since QtQuick.Controls 2.3 (Qt 5.10)
+ \qmlmethod Menu QtQuick.Controls::Menu::menuAt(int index)
+
+ Returns the sub-menu at \a index, or \c null if the index is not valid or
+ there is no sub-menu at the specified index.
+*/
+QQuickMenu *QQuickMenu::menuAt(int index) const
+{
+ Q_D(const QQuickMenu);
+ QQuickMenuItem *item = qobject_cast<QQuickMenuItem *>(d->itemAt(index));
+ if (!item)
+ return nullptr;
+
+ return item->subMenu();
+}
+
+/*!
+ \since QtQuick.Controls 2.3 (Qt 5.10)
\qmlmethod void QtQuick.Controls::Menu::addMenu(Menu menu)
Adds \a menu as a sub-menu to the end of this menu.
@@ -799,6 +816,23 @@ QQuickMenu *QQuickMenu::takeMenu(int index)
/*!
\since QtQuick.Controls 2.3 (Qt 5.10)
+ \qmlmethod Action QtQuick.Controls::Menu::actionAt(int index)
+
+ Returns the action at \a index, or \c null if the index is not valid or
+ there is no action at the specified index.
+*/
+QQuickAction *QQuickMenu::actionAt(int index) const
+{
+ Q_D(const QQuickMenu);
+ QQuickAbstractButton *item = qobject_cast<QQuickAbstractButton *>(d->itemAt(index));
+ if (!item)
+ return nullptr;
+
+ return item->action();
+}
+
+/*!
+ \since QtQuick.Controls 2.3 (Qt 5.10)
\qmlmethod void QtQuick.Controls::Menu::addAction(Action action)
Adds \a action to the end of this menu.
diff --git a/src/quicktemplates2/qquickmenu_p.h b/src/quicktemplates2/qquickmenu_p.h
index b88d380c..a7b86d0e 100644
--- a/src/quicktemplates2/qquickmenu_p.h
+++ b/src/quicktemplates2/qquickmenu_p.h
@@ -83,11 +83,13 @@ public:
void removeItem(QQuickItem *item); // ### Qt 6: Q_INVOKABLE
Q_REVISION(3) Q_INVOKABLE QQuickItem *takeItem(int index);
+ Q_REVISION(3) Q_INVOKABLE QQuickMenu *menuAt(int index) const;
Q_REVISION(3) Q_INVOKABLE void addMenu(QQuickMenu *menu);
Q_REVISION(3) Q_INVOKABLE void insertMenu(int index, QQuickMenu *menu);
Q_REVISION(3) Q_INVOKABLE void removeMenu(QQuickMenu *menu);
Q_REVISION(3) Q_INVOKABLE QQuickMenu *takeMenu(int index);
+ Q_REVISION(3) Q_INVOKABLE QQuickAction *actionAt(int index) const;
Q_REVISION(3) Q_INVOKABLE void addAction(QQuickAction *action);
Q_REVISION(3) Q_INVOKABLE void insertAction(int index, QQuickAction *action);
Q_REVISION(3) Q_INVOKABLE void removeAction(QQuickAction *action);
diff --git a/tests/auto/menu/tst_menu.cpp b/tests/auto/menu/tst_menu.cpp
index 2397a6ef..1c1030e0 100644
--- a/tests/auto/menu/tst_menu.cpp
+++ b/tests/auto/menu/tst_menu.cpp
@@ -682,9 +682,18 @@ void tst_menu::actions()
QQuickMenu *menu = window->property("menu").value<QQuickMenu *>();
QVERIFY(menu);
+ QPointer<QQuickAction> action1 = menu->actionAt(0);
+ QVERIFY(!action1.isNull());
+
+ QPointer<QQuickAction> action3 = menu->actionAt(2);
+ QVERIFY(!action3.isNull());
+
+ QVERIFY(!menu->actionAt(1));
+ QVERIFY(!menu->actionAt(3));
+
QPointer<QQuickMenuItem> menuItem1 = qobject_cast<QQuickMenuItem *>(menu->itemAt(0));
QVERIFY(!menuItem1.isNull());
- QVERIFY(menuItem1->action());
+ QCOMPARE(menuItem1->action(), action1.data());
QCOMPARE(menuItem1->text(), "action1");
QPointer<QQuickMenuItem> menuItem2 = qobject_cast<QQuickMenuItem *>(menu->itemAt(1));
@@ -694,7 +703,7 @@ void tst_menu::actions()
QPointer<QQuickMenuItem> menuItem3 = qobject_cast<QQuickMenuItem *>(menu->itemAt(2));
QVERIFY(!menuItem3.isNull());
- QVERIFY(menuItem3->action());
+ QCOMPARE(menuItem3->action(), action3.data());
QCOMPARE(menuItem3->text(), "action3");
QPointer<QQuickMenuItem> menuItem4 = qobject_cast<QQuickMenuItem *>(menu->itemAt(3));
@@ -703,8 +712,6 @@ void tst_menu::actions()
QCOMPARE(menuItem4->text(), "menuitem4");
// takeAction(int) does not destroy the action, but does destroy the respective item
- QPointer<QQuickAction> action1 = menuItem1->action();
- QVERIFY(!action1.isNull());
QCOMPARE(menu->takeAction(0), action1.data());
QVERIFY(!menu->itemAt(3));
QCoreApplication::sendPostedEvents(action1, QEvent::DeferredDelete);
@@ -1144,11 +1151,19 @@ void tst_menu::addRemoveSubMenus()
QQuickMenu *mainMenu = window->property("mainMenu").value<QQuickMenu *>();
QVERIFY(mainMenu);
+ QVERIFY(!mainMenu->menuAt(0));
+
QPointer<QQuickMenu> subMenu1 = window->property("subMenu1").value<QQuickMenu *>();
QVERIFY(!subMenu1.isNull());
+ QCOMPARE(mainMenu->menuAt(1), subMenu1.data());
+
+ QVERIFY(!mainMenu->menuAt(2));
QPointer<QQuickMenu> subMenu2 = window->property("subMenu2").value<QQuickMenu *>();
QVERIFY(!subMenu2.isNull());
+ QCOMPARE(mainMenu->menuAt(3), subMenu2.data());
+
+ QVERIFY(!mainMenu->menuAt(4));
QPointer<QQuickMenu> subSubMenu1 = window->property("subSubMenu1").value<QQuickMenu *>();
QVERIFY(!subSubMenu1.isNull());