on xenial help sign in
Make menus items close the menu on clicking on them
commitd3398611137084e502cdff4f132186e018b06af6 authorAlbert Astals Cid <albert.astals@canonical.com> dateFri 20 Jan 2017, 16:46 (10 years ago) parent75ef09c
3 files changed+55−5
qml/ApplicationMenus/MenuBar.qml+1 qml/ApplicationMenus/MenuPopup.qml+19−5 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+35
qml/ApplicationMenus/MenuBar.qml+1
@@ -100,6 +100,7 @@ Item {
100100 function show() {
101101 if (!__popup) {
102102 __popup = menuComponent.createObject(root, { objectName: visualItem.objectName + "-menu" });
103+ __popup.childActivated.connect(dismiss);
103104 // force the current item to be the newly popped up menu
104105 } else {
105106 __popup.show();
qml/ApplicationMenus/MenuPopup.qml+19−5
@@ -26,6 +26,8 @@ UbuntuShape {
2626 objectName: "menu"
2727 backgroundColor: theme.palette.normal.overlay
2828
29+ signal childActivated()
30+
2931 property alias unityMenuModel: repeater.model
3032
3133 function show() {
@@ -263,16 +265,22 @@ UbuntuShape {
263265 return mapToItem(container, 0, y).y;
264266 })
265267 });
268+ popup.retreat.connect(function() {
269+ popup.destroy();
270+ popup = null;
271+ menuItem.forceActiveFocus();
272+ });
273+ popup.childActivated.connect(function() {
274+ popup.destroy();
275+ popup = null;
276+ root.childActivated();
277+ });
266278 } else if (popup) {
267279 popup.visible = true;
268280 }
269− popup.retreat.connect(function() {
270− popup.destroy();
271− popup = null;
272− menuItem.forceActiveFocus();
273− })
274281 } else {
275282 root.unityMenuModel.activate(__ownIndex);
283+ root.childActivated();
276284 }
277285 }
278286
@@ -377,6 +385,7 @@ UbuntuShape {
377385
378386 property var unityMenuModel: null
379387 signal retreat()
388+ signal childActivated()
380389
381390 Binding {
382391 target: item
@@ -392,6 +401,11 @@ UbuntuShape {
392401
393402 Keys.onLeftPressed: retreat()
394403
404+ Connections {
405+ target: item
406+ onChildActivated: childActivated();
407+ }
408+
395409 Component.onCompleted: item.select(0);
396410 onVisibleChanged: if (visible) { item.select(0); }
397411 }
tests/qmltests/ApplicationMenus/tst_MenuBar.qml+35
@@ -179,5 +179,40 @@ Item {
179179 keyPress(data.tag, Qt.AltModifier, 100);
180180 tryCompare(priv, "currentItem", menuItem);
181181 }
182+
183+ function test_menuActivateClosesMenu() {
184+ menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu");
185+ var priv = findInvisibleChild(menuBar, "d");
186+
187+ var menuItem = findChild(menuBar, "menuBar-item0");
188+ menuItem.show();
189+ compare(priv.currentItem, menuItem, "CurrentItem should be set to item 0");
190+ compare(priv.currentItem.popupVisible, true, "Popup should be visible");
191+
192+ var actionItem = findChild(menuBar, "menuBar-item0-menu-item0-actionItem");
193+ mouseClick(actionItem);
194+ compare(priv.currentItem, null, "CurrentItem should be null");
195+ }
196+
197+ function test_subMenuActivateClosesMenu() {
198+ menuBackend.modelData = appMenuData.generateTestData(3,4,1,0,"menu");
199+ var priv = findInvisibleChild(menuBar, "d");
200+
201+ var menuItem = findChild(menuBar, "menuBar-item0");
202+ menuItem.show();
203+ compare(priv.currentItem, menuItem, "CurrentItem should be set to item 0");
204+ compare(priv.currentItem.popupVisible, true, "Popup should be visible");
205+
206+ var actionItem = findChild(menuBar, "menuBar-item0-menu-item0-actionItem");
207+ mouseClick(actionItem);
208+
209+ actionItem = findChild(menuBar, "menuBar-item0-menu-item0-menu-item0-actionItem");
210+ mouseClick(actionItem);
211+
212+ actionItem = findChild(menuBar, "menuBar-item0-menu-item0-menu-item0-menu-item0-actionItem");
213+ mouseClick(actionItem);
214+
215+ compare(priv.currentItem, null, "CurrentItem should be null");
216+ }
182217 }
183218}