on xenial help sign in
Auto open submenus on hover
5a0e98aAlbert Astals Cid
qml/ApplicationMenus/MenuPopup.qml+13−2
@@ -208,6 +208,12 @@ UbuntuShape {
208 contentHeight: menuColumn.height
208 contentHeight: menuColumn.height
209 interactive: height < contentHeight
209 interactive: height < contentHeight
210
210
211+ Timer {
212+ id: submenuHoverTimer
213+ interval: 225 // GTK MENU_POPUP_DELAY, Qt SH_Menu_SubMenuPopupDelay in QCommonStyle is 256
214+ onTriggered: d.currentItem.item.trigger();
215+ }
216+
211 MouseArea {
217 MouseArea {
212 anchors.fill: parent
218 anchors.fill: parent
213 hoverEnabled: true
219 hoverEnabled: true
@@ -221,12 +227,17 @@ UbuntuShape {
221
227
222 if (!d.hoveredItem || !d.currentItem ||
228 if (!d.hoveredItem || !d.currentItem ||
223 !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) {
229 !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) {
230+ submenuHoverTimer.stop();
231+
224 d.hoveredItem = menuColumn.childAt(pos.x, pos.y)
232 d.hoveredItem = menuColumn.childAt(pos.x, pos.y)
225 if (!d.hoveredItem || !d.hoveredItem.enabled)
233 if (!d.hoveredItem || !d.hoveredItem.enabled)
226− return false;
234+ return;
227 d.currentItem = d.hoveredItem;
235 d.currentItem = d.hoveredItem;
236+
237+ if (!d.currentItem.__isSeparator && d.currentItem.item.hasSubmenu) {
238+ submenuHoverTimer.start();
239+ }
228 }
240 }
229− return true;
230 }
241 }
231 }
242 }
232
243
tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+14
@@ -223,6 +223,20 @@ Item {
223 tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false);
223 tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false);
224 }
224 }
225
225
226+ function test_mouseHoverOpensSubMenu() {
227+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
228+
229+ var menuItem = findChild(menu, "menu-item0");
230+
231+ var priv = findInvisibleChild(menu, "d");
232+ priv.currentItem = menuItem;
233+
234+ mouseMove(menuItem, menuItem.width/2, menuItem.height/2);
235+ verify(!menuItem.popup);
236+
237+ tryCompareFunction(function() { return menuItem.popup != null; }, true);
238+ }
239+
226 function test_differentSizes() {
240 function test_differentSizes() {
227 var differentSizesMenu = [{
241 var differentSizesMenu = [{
228 "rowData": { "label": "Short" }}, {
242 "rowData": { "label": "Short" }}, {