on xenial help sign in
Auto open submenus on hover (LP: #1657085)
903afa9Albert Astals Cid
qml/ApplicationMenus/MenuPopup.qml+17−2
@@ -110,6 +110,8 @@ UbuntuShape {
110 } else {
110 } else {
111 hoveredItem = null;
111 hoveredItem = null;
112 }
112 }
113+
114+ submenuHoverTimer.stop();
113 }
115 }
114
116
115 onSelect: {
117 onSelect: {
@@ -210,6 +212,12 @@ UbuntuShape {
210 contentHeight: menuColumn.height
212 contentHeight: menuColumn.height
211 interactive: height < contentHeight
213 interactive: height < contentHeight
212
214
215+ Timer {
216+ id: submenuHoverTimer
217+ interval: 225 // GTK MENU_POPUP_DELAY, Qt SH_Menu_SubMenuPopupDelay in QCommonStyle is 256
218+ onTriggered: d.currentItem.item.trigger();
219+ }
220+
213 MouseArea {
221 MouseArea {
214 anchors.fill: parent
222 anchors.fill: parent
215 hoverEnabled: true
223 hoverEnabled: true
@@ -223,12 +231,17 @@ UbuntuShape {
223
231
224 if (!d.hoveredItem || !d.currentItem ||
232 if (!d.hoveredItem || !d.currentItem ||
225 !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) {
233 !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) {
234+ submenuHoverTimer.stop();
235+
226 d.hoveredItem = menuColumn.childAt(pos.x, pos.y)
236 d.hoveredItem = menuColumn.childAt(pos.x, pos.y)
227 if (!d.hoveredItem || !d.hoveredItem.enabled)
237 if (!d.hoveredItem || !d.hoveredItem.enabled)
228− return false;
238+ return;
229 d.currentItem = d.hoveredItem;
239 d.currentItem = d.hoveredItem;
240+
241+ if (!d.currentItem.__isSeparator && d.currentItem.item.hasSubmenu && d.currentItem.item.enabled) {
242+ submenuHoverTimer.start();
243+ }
230 }
244 }
231− return true;
232 }
245 }
233 }
246 }
234
247
@@ -283,6 +296,8 @@ UbuntuShape {
283 width: MathUtils.clamp(implicitWidth, d.__minimumWidth, d.__maximumWidth)
296 width: MathUtils.clamp(implicitWidth, d.__minimumWidth, d.__maximumWidth)
284
297
285 action.onTriggered: {
298 action.onTriggered: {
299+ submenuHoverTimer.stop();
300+
286 d.currentItem = loader;
301 d.currentItem = loader;
287
302
288 if (hasSubmenu) {
303 if (hasSubmenu) {
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" }}, {