@@ -1,4 +1,4 @@
1−/*
1+/*
22 * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
@@ -28,8 +28,8 @@ import ".."
2828
2929Item {
3030 id: root
31− width: Math.max(units.gu(100), page.width + units.gu(6))
32− height: Math.max(units.gu(50), page.height + units.gu(6))
31+ width: Math.max(units.gu(100), loader.width + units.gu(6))
32+ height: Math.max(units.gu(50), loader.height + units.gu(6))
3333
3434 Binding {
3535 target: MouseTouchAdaptor
@@ -39,25 +39,37 @@ Item {
3939
4040 ApplicationMenuDataLoader { id: appMenuData }
4141
42− MenuPopup {
43− id: page
42+ Loader {
43+ id: loader
44+ sourceComponent: MenuPopup {
45+ anchors {
46+ left: parent ? parent.left : undefined
47+ top: parent ? parent.top : undefined
48+ leftMargin: units.gu(3)
49+ topMargin: units.gu(3)
50+ }
4451
45− anchors {
46− left: parent.left
47− top: parent.top
48− leftMargin: units.gu(3)
49− topMargin: units.gu(3)
50− }
52+ unityMenuModel: UnityMenuModel {
53+ modelData: [{
54+ "rowData": {
55+ "label": "Short",
56+ }}, {
57+ "rowData": {
58+ "label": "This is a long menu item which tests width",
59+ }}
60+ ]
61+ }
5162
52− unityMenuModel: UnityMenuModel {
53− id: menuBackend
54− modelData: appMenuData.generateTestData(7,5,2,3,"menu")
63+ Binding {
64+ target: activatedSpy
65+ property: "target"
66+ value: unityMenuModel
67+ }
5568 }
5669 }
5770
5871 SignalSpy {
5972 id: activatedSpy
60− target: menuBackend
6173 signalName: "activated"
6274 }
6375
@@ -66,14 +78,20 @@ Item {
6678 name: "MenuPopup"
6779 when: windowShown
6880
81+ property var menu: loader.status === Loader.Ready ? loader.item : null
82+
6983 function init() {
70− page.show();
84+ loader.active = true;
85+ menu.show();
7186 }
7287
7388 function cleanup() {
74− page.reset();
89+ menu.reset();
7590 wait(100); // let the page dismiss
7691 activatedSpy.clear();
92+
93+ loader.active = false;
94+ tryCompare(loader, "item", null);
7795 }
7896
7997 // visit and verify that all the backend menus have been created
@@ -90,6 +108,7 @@ Item {
90108 // recurse into submenu
91109 var submenu = rows[i]["submenu"];
92110 if (submenu) {
111+ waitForRendering(menuItem);
93112 mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
94113 tryCompare(menuPriv, "currentItem", menuItem);
95114
@@ -113,15 +132,15 @@ Item {
113132 }
114133
115134 function test_mouseNavigation(data) {
116− menuBackend.modelData = data.testData;
135+ menu.unityMenuModel.modelData = data.testData;
117136
118− recurseMenuConstruction(data.testData, page);
137+ recurseMenuConstruction(data.testData, menu);
119138 }
120139
121140 function test_checkableMenuTogglesOnClick() {
122− menuBackend.modelData = appMenuData.singleCheckable;
141+ menu.unityMenuModel.modelData = appMenuData.singleCheckable;
123142
124− var menuItem = findChild(page, "menu-item0-actionItem");
143+ var menuItem = findChild(menu, "menu-item0-actionItem");
125144 verify(menuItem);
126145 compare(menuItem.action.checkable, true, "Menu item should be checkable");
127146 compare(menuItem.action.checked, false, "Menu item should not be checked");
@@ -132,13 +151,13 @@ Item {
132151 }
133152
134153 function test_keyboardNavigation_DownKeySelectsAndOpensNextMenuItemAndRotates() {
135− menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
154+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
136155
137− var item0 = findChild(page, "menu-item0"); verify(item0);
138− var item1 = findChild(page, "menu-item1"); verify(item1);
139− var item2 = findChild(page, "menu-item2"); verify(item2);
156+ var item0 = findChild(menu, "menu-item0"); verify(item0);
157+ var item1 = findChild(menu, "menu-item1"); verify(item1);
158+ var item2 = findChild(menu, "menu-item2"); verify(item2);
140159
141− var priv = findInvisibleChild(page, "d");
160+ var priv = findInvisibleChild(menu, "d");
142161
143162 keyClick(Qt.Key_Down, Qt.NoModifier);
144163 compare(priv.currentItem, item0, "CurrentItem should have moved to item 0");
@@ -154,13 +173,13 @@ Item {
154173 }
155174
156175 function test_keyboardNavigation_UpKeySelectsAndOpensPreviousMenuItemAndRotates() {
157− menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
176+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false);
158177
159− var item0 = findChild(page, "menu-item0"); verify(item0);
160− var item1 = findChild(page, "menu-item1"); verify(item1);
161− var item2 = findChild(page, "menu-item2"); verify(item2);
178+ var item0 = findChild(menu, "menu-item0"); verify(item0);
179+ var item1 = findChild(menu, "menu-item1"); verify(item1);
180+ var item2 = findChild(menu, "menu-item2"); verify(item2);
162181
163− var priv = findInvisibleChild(page, "d");
182+ var priv = findInvisibleChild(menu, "d");
164183
165184 keyClick(Qt.Key_Down, Qt.NoModifier);
166185 compare(priv.currentItem, item0, "CurrentItem should have moved to item 2");
@@ -176,17 +195,17 @@ Item {
176195 }
177196
178197 function test_keyboardNavigation_RightKeyEntersSubMenu() {
179− menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
198+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
180199
181− var menuItem = findChild(page, "menu-item0");
200+ var menuItem = findChild(menu, "menu-item0");
182201
183− var priv = findInvisibleChild(page, "d");
202+ var priv = findInvisibleChild(menu, "d");
184203 priv.currentItem = menuItem;
185204
186205 keyClick(Qt.Key_Right, Qt.NoModifier);
187206 tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true);
188207
189− var submenu0 = findChild(page, "menu-item0-menu"); verify(submenu0);
208+ var submenu0 = findChild(menu, "menu-item0-menu"); verify(submenu0);
190209 var submenu0item0 = findChild(submenu0, "menu-item0-menu-item0"); verify(submenu0item0);
191210
192211 var submenu0Priv = findInvisibleChild(submenu0, "d"); verify(submenu0Priv);
@@ -194,14 +213,106 @@ Item {
194213 }
195214
196215 function test_keyboardNavigation_LeftKeyClosesSubMenu() {
197− menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
216+ menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false);
198217
199− var menuItem = findChild(page, "menu-item0"); verify(menuItem);
218+ var menuItem = findChild(menu, "menu-item0"); verify(menuItem);
200219 mouseClick(menuItem, menuItem.width/2, menuItem.height/2);
201220 tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true);
202221
203222 keyClick(Qt.Key_Left, Qt.NoModifier);
204223 tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false);
205224 }
225+
226+ function test_differentSizes() {
227+ var differentSizesMenu = [{
228+ "rowData": { "label": "Short" }}, {
229+ "rowData": { "label": "This is a long menu item which tests width" }
230+ }];
231+
232+ menu.unityMenuModel.modelData = differentSizesMenu;
233+
234+ waitForRendering(menu);
235+ var longWidth = menu.width;
236+ differentSizesMenu.pop();
237+ menu.unityMenuModel.modelData = differentSizesMenu;
238+
239+ waitForRendering(menu);
240+ verify(menu.width < longWidth);
241+ }
242+
243+ function test_minimumWidth() {
244+ var shortMenu = [{
245+ "rowData": { "label": "Short" }
246+ }];
247+ menu.unityMenuModel.modelData = shortMenu;
248+
249+ var priv = findInvisibleChild(menu, "d");
250+ priv.__minimumWidth = 0;
251+ priv.__maximumWidth = 1000;
252+ tryCompareFunction(function() { return menu.width > priv.__minimumWidth; }, true);
253+
254+ priv.__minimumWidth = 300;
255+ tryCompare(menu, "width", priv.__minimumWidth);
256+ }
257+
258+ function test_maximumWidth() {
259+ var longMenu = [{
260+ "rowData": { "label": "This is a long menu item which tests width" }
261+ }];
262+
263+ var priv = findInvisibleChild(menu, "d");
264+ priv.__minimumWidth = 0;
265+ priv.__maximumWidth = 100;
266+
267+ menu.unityMenuModel.modelData = longMenu;
268+ tryCompare(menu, "width", priv.__maximumWidth);
269+
270+ priv.__maximumWidth = 200;
271+ tryCompare(menu, "width", priv.__maximumWidth);
272+
273+ priv.__maximumWidth = 1200;
274+ tryCompareFunction(function() { return menu.width < priv.__maximumWidth; }, true);
275+ }
276+
277+ function test_minimumHeight() {
278+ var shortMenu = [{
279+ "rowData": { "label": "menu1" }
280+ }];
281+ menu.unityMenuModel.modelData = shortMenu;
282+
283+ var priv = findInvisibleChild(menu, "d");
284+ priv.__minimumHeight = 0;
285+ priv.__maximumHeight = 1000;
286+ tryCompareFunction(function() { return menu.height > priv.__minimumHeight; }, true);
287+
288+ priv.__minimumHeight = 300;
289+ tryCompare(menu, "height", priv.__minimumHeight);
290+ }
291+
292+ function test_maximumHeight() {
293+ var shortMenu = [{
294+ "rowData": { "label": "menu1" }}, {
295+ "rowData": { "label": "menu2" }}, {
296+ "rowData": { "label": "menu3" }}, {
297+ "rowData": { "label": "menu4" }}, {
298+ "rowData": { "label": "menu5" }}, {
299+ "rowData": { "label": "menu6" }}, {
300+ "rowData": { "label": "menu7" }}, {
301+ "rowData": { "label": "menu8" }}, {
302+ "rowData": { "label": "menu9" }
303+ }];
304+ menu.unityMenuModel.modelData = shortMenu;
305+
306+ var priv = findInvisibleChild(menu, "d");
307+ priv.__minimumHeight = 0;
308+ priv.__maximumHeight = 100;
309+ tryCompare(menu, "height", priv.__maximumHeight);
310+
311+ priv.__maximumHeight = 200;
312+ tryCompare(menu, "height", priv.__maximumHeight);
313+
314+ priv.__maximumHeight = 1200;
315+ tryCompareFunction(function() { return menu.height < priv.__maximumHeight; }, true);
316+ }
206317 }
207318}