Merge lp:~nick-dedekind/unity8/menu.width.fix into lp:unity8
- menu.width.fix
- Merge into trunk
Proposed by
Nick Dedekind
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Albert Astals Cid | ||||
Approved revision: | 2771 | ||||
Merged at revision: | 2784 | ||||
Proposed branch: | lp:~nick-dedekind/unity8/menu.width.fix | ||||
Merge into: | lp:unity8 | ||||
Diff against target: |
806 lines (+352/-194) 4 files modified
qml/ApplicationMenus/MenuPopup.qml (+178/-139) tests/qmltests/ApplicationMenuDataLoader.qml (+13/-5) tests/qmltests/ApplicationMenus/tst_MenuBar.qml (+5/-5) tests/qmltests/ApplicationMenus/tst_MenuPopup.qml (+156/-45) |
||||
To merge this branch: | bzr merge lp:~nick-dedekind/unity8/menu.width.fix | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Astals Cid (community) | Approve | ||
Unity8 CI Bot | continuous-integration | Approve | |
Review via email: mp+315021@code.launchpad.net |
Commit message
Fixed menu layout width calculations.
Description of the change
* Are there any related MPs required for this MP to build/function as expected? Please list.
No
* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A
* If you changed the UI, has there been a design review?
N/A
To post a comment you must log in.
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
review:
Approve
(continuous-integration)
Revision history for this message
Albert Astals Cid (aacid) wrote : | # |
* Did you perform an exploratory manual test run of the code change and any related functionality?
Yes
* Did CI run pass? If not, please explain why.
Yes
review:
Approve
- 2772. By Nick Dedekind
-
color fixes
- 2773. By Nick Dedekind
-
Auto scroll. Maximum height to bottom of screen
- 2774. By Nick Dedekind
-
Added overflow button
- 2775. By Nick Dedekind
-
enabled only when item enabled
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'qml/ApplicationMenus/MenuPopup.qml' | |||
2 | --- qml/ApplicationMenus/MenuPopup.qml 2017-01-09 15:26:05 +0000 | |||
3 | +++ qml/ApplicationMenus/MenuPopup.qml 2017-01-18 14:44:04 +0000 | |||
4 | @@ -26,19 +26,7 @@ | |||
5 | 26 | objectName: "menu" | 26 | objectName: "menu" |
6 | 27 | backgroundColor: theme.palette.normal.overlay | 27 | backgroundColor: theme.palette.normal.overlay |
7 | 28 | 28 | ||
21 | 29 | property alias unityMenuModel: listView.model | 29 | property alias unityMenuModel: repeater.model |
9 | 30 | |||
10 | 31 | readonly property real __ajustedMinimumHeight: { | ||
11 | 32 | if (listView.contentHeight > __minimumHeight) { | ||
12 | 33 | return units.gu(30); | ||
13 | 34 | } | ||
14 | 35 | return Math.max(listView.contentHeight, units.gu(2)); | ||
15 | 36 | } | ||
16 | 37 | |||
17 | 38 | readonly property real __minimumWidth: units.gu(20) | ||
18 | 39 | readonly property real __minimumHeight: units.gu(30) | ||
19 | 40 | readonly property real __maximumWidth: Screen.width * 0.7 | ||
20 | 41 | readonly property real __maximumHeight: Screen.height * 0.7 | ||
22 | 42 | 30 | ||
23 | 43 | function show() { | 31 | function show() { |
24 | 44 | visible = true; | 32 | visible = true; |
25 | @@ -63,18 +51,23 @@ | |||
26 | 63 | d.dismissAll(); | 51 | d.dismissAll(); |
27 | 64 | } | 52 | } |
28 | 65 | 53 | ||
31 | 66 | implicitWidth: container.width | 54 | implicitWidth: focusScope.width |
32 | 67 | implicitHeight: MathUtils.clamp(listView.contentHeight, __ajustedMinimumHeight, __maximumHeight) | 55 | implicitHeight: focusScope.height |
33 | 68 | 56 | ||
34 | 69 | MenuNavigator { | 57 | MenuNavigator { |
35 | 70 | id: d | 58 | id: d |
36 | 71 | objectName: "d" | 59 | objectName: "d" |
38 | 72 | itemView: listView | 60 | itemView: repeater |
39 | 73 | 61 | ||
40 | 74 | property Item currentItem: null | 62 | property Item currentItem: null |
41 | 75 | property Item hoveredItem: null | 63 | property Item hoveredItem: null |
42 | 76 | readonly property int currentIndex: currentItem ? currentItem.__ownIndex : -1 | 64 | readonly property int currentIndex: currentItem ? currentItem.__ownIndex : -1 |
43 | 77 | 65 | ||
44 | 66 | property real __minimumWidth: units.gu(20) | ||
45 | 67 | property real __maximumWidth: Screen.width * 0.7 | ||
46 | 68 | property real __minimumHeight: units.gu(2) | ||
47 | 69 | property real __maximumHeight: Screen.height * 0.7 | ||
48 | 70 | |||
49 | 78 | signal dismissAll() | 71 | signal dismissAll() |
50 | 79 | 72 | ||
51 | 80 | onCurrentItemChanged: { | 73 | onCurrentItemChanged: { |
52 | @@ -86,13 +79,26 @@ | |||
53 | 86 | } | 79 | } |
54 | 87 | 80 | ||
55 | 88 | onSelect: { | 81 | onSelect: { |
57 | 89 | currentItem = listView.itemAt(index); | 82 | currentItem = repeater.itemAt(index); |
58 | 83 | if (currentItem) { | ||
59 | 84 | if (currentItem.y < listView.contentY) { | ||
60 | 85 | listView.contentY = currentItem.y; | ||
61 | 86 | } else if (currentItem.y + currentItem.height > listView.contentY + listView.height) { | ||
62 | 87 | listView.contentY = currentItem.y + currentItem.height - listView.height; | ||
63 | 88 | } | ||
64 | 89 | } | ||
65 | 90 | } | 90 | } |
66 | 91 | } | 91 | } |
67 | 92 | 92 | ||
68 | 93 | MouseArea { | ||
69 | 94 | // Eat events. | ||
70 | 95 | anchors.fill: parent | ||
71 | 96 | } | ||
72 | 97 | |||
73 | 93 | Item { | 98 | Item { |
74 | 94 | id: focusScope | 99 | id: focusScope |
76 | 95 | anchors.fill: parent | 100 | width: container.width |
77 | 101 | height: container.height | ||
78 | 96 | focus: visible | 102 | focus: visible |
79 | 97 | 103 | ||
80 | 98 | Keys.onUpPressed: d.selectPrevious(d.currentIndex) | 104 | Keys.onUpPressed: d.selectPrevious(d.currentIndex) |
81 | @@ -108,17 +114,17 @@ | |||
82 | 108 | id: container | 114 | id: container |
83 | 109 | objectName: "container" | 115 | objectName: "container" |
84 | 110 | 116 | ||
87 | 111 | width: listView.contentWidth | 117 | height: MathUtils.clamp(listView.contentHeight, d.__minimumHeight, d.__maximumHeight) |
88 | 112 | height: parent.height | 118 | width: menuColumn.width |
89 | 113 | spacing: 0 | 119 | spacing: 0 |
90 | 114 | 120 | ||
92 | 115 | // FIXME use ListView.header - tried but was flaky with positionViewAtIndex. | 121 | // Header - scroll up |
93 | 116 | Item { | 122 | Item { |
97 | 117 | Layout.fillWidth: true; | 123 | Layout.fillWidth: true |
98 | 118 | Layout.maximumHeight: units.gu(3) | 124 | height: units.gu(3) |
96 | 119 | Layout.minimumHeight: units.gu(3) | ||
99 | 120 | visible: listView.contentHeight > root.height | 125 | visible: listView.contentHeight > root.height |
100 | 121 | enabled: !listView.atYBeginning | 126 | enabled: !listView.atYBeginning |
101 | 127 | z: 1 | ||
102 | 122 | 128 | ||
103 | 123 | Rectangle { | 129 | Rectangle { |
104 | 124 | color: enabled ? theme.palette.normal.overlayText : | 130 | color: enabled ? theme.palette.normal.overlayText : |
105 | @@ -143,47 +149,35 @@ | |||
106 | 143 | MouseArea { | 149 | MouseArea { |
107 | 144 | anchors.fill: parent | 150 | anchors.fill: parent |
108 | 145 | onPressed: { | 151 | onPressed: { |
111 | 146 | var index = listView.indexAt(0, listView.contentY); | 152 | var item = menuColumn.childAt(0, listView.contentY); |
112 | 147 | listView.positionViewAtIndex(index-1, ListView.Beginning); | 153 | if (item) { |
113 | 154 | var previousItem = item; | ||
114 | 155 | do { | ||
115 | 156 | previousItem = repeater.itemAt(previousItem.__ownIndex-1); | ||
116 | 157 | if (!previousItem) { | ||
117 | 158 | listView.contentY = 0; | ||
118 | 159 | return; | ||
119 | 160 | } | ||
120 | 161 | } while (previousItem.__isSeparator); | ||
121 | 162 | |||
122 | 163 | listView.contentY = previousItem.y | ||
123 | 164 | } | ||
124 | 148 | } | 165 | } |
125 | 149 | } | 166 | } |
126 | 150 | } | 167 | } |
127 | 151 | 168 | ||
129 | 152 | ListView { | 169 | // Menu Items |
130 | 170 | Flickable { | ||
131 | 153 | id: listView | 171 | id: listView |
133 | 154 | objectName: "listView" | 172 | clip: interactive |
134 | 173 | |||
135 | 155 | Layout.fillHeight: true | 174 | Layout.fillHeight: true |
136 | 156 | Layout.fillWidth: true | 175 | Layout.fillWidth: true |
163 | 157 | contentWidth: MathUtils.clamp(contentItem.childrenRect.width, | 176 | contentHeight: menuColumn.height |
164 | 158 | __minimumWidth, | 177 | interactive: height < contentHeight |
139 | 159 | __maximumWidth) | ||
140 | 160 | |||
141 | 161 | orientation: Qt.Vertical | ||
142 | 162 | interactive: contentHeight > height | ||
143 | 163 | clip: interactive | ||
144 | 164 | highlightFollowsCurrentItem: false | ||
145 | 165 | |||
146 | 166 | highlight: Rectangle { | ||
147 | 167 | color: "transparent" | ||
148 | 168 | border.width: units.dp(1) | ||
149 | 169 | border.color: UbuntuColors.orange | ||
150 | 170 | z: 1 | ||
151 | 171 | |||
152 | 172 | width: listView.width | ||
153 | 173 | height: d.currentItem ? d.currentItem.height : 0 | ||
154 | 174 | y: d.currentItem ? d.currentItem.y : 0 | ||
155 | 175 | visible: d.currentItem | ||
156 | 176 | } | ||
157 | 177 | |||
158 | 178 | function itemAt(index) { | ||
159 | 179 | if (index > count || index < 0) return null; | ||
160 | 180 | currentIndex = index; | ||
161 | 181 | return currentItem; | ||
162 | 182 | } | ||
165 | 183 | 178 | ||
166 | 184 | MouseArea { | 179 | MouseArea { |
169 | 185 | id: menuMouseArea | 180 | anchors.fill: parent |
168 | 186 | anchors.fill: listView | ||
170 | 187 | hoverEnabled: true | 181 | hoverEnabled: true |
171 | 188 | propagateComposedEvents: true // propogate events so we send clicks to children. | 182 | propagateComposedEvents: true // propogate events so we send clicks to children. |
172 | 189 | z: 1 // on top so we override any other hovers | 183 | z: 1 // on top so we override any other hovers |
173 | @@ -195,7 +189,7 @@ | |||
174 | 195 | 189 | ||
175 | 196 | if (!d.hoveredItem || !d.currentItem || | 190 | if (!d.hoveredItem || !d.currentItem || |
176 | 197 | !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) { | 191 | !d.hoveredItem.contains(Qt.point(pos.x - d.currentItem.x, pos.y - d.currentItem.y))) { |
178 | 198 | d.hoveredItem = listView.itemAt(listView.indexAt(pos.x, pos.y)); | 192 | d.hoveredItem = menuColumn.childAt(pos.x, pos.y) |
179 | 199 | if (!d.hoveredItem || !d.hoveredItem.enabled) | 193 | if (!d.hoveredItem || !d.hoveredItem.enabled) |
180 | 200 | return false; | 194 | return false; |
181 | 201 | d.currentItem = d.hoveredItem; | 195 | d.currentItem = d.hoveredItem; |
182 | @@ -216,89 +210,123 @@ | |||
183 | 216 | } | 210 | } |
184 | 217 | } | 211 | } |
185 | 218 | 212 | ||
263 | 219 | delegate: Loader { | 213 | ColumnLayout { |
264 | 220 | id: loader | 214 | id: menuColumn |
265 | 221 | objectName: root.objectName + "-item" + __ownIndex | 215 | spacing: 0 |
266 | 222 | 216 | ||
267 | 223 | property int __ownIndex: index | 217 | width: MathUtils.clamp(implicitWidth, d.__minimumWidth, d.__maximumWidth) |
268 | 224 | 218 | ||
269 | 225 | width: root.width | 219 | Repeater { |
270 | 226 | enabled: model.isSeparator ? false : model.sensitive | 220 | id: repeater |
271 | 227 | 221 | ||
272 | 228 | sourceComponent: { | 222 | Loader { |
273 | 229 | if (model.isSeparator) { | 223 | id: loader |
274 | 230 | return separatorComponent; | 224 | objectName: root.objectName + "-item" + __ownIndex |
275 | 231 | } | 225 | |
276 | 232 | return menuItemComponent; | 226 | property int __ownIndex: index |
277 | 233 | } | 227 | property bool __isSeparator: model.isSeparator |
278 | 234 | 228 | ||
279 | 235 | property Item popup: null | 229 | enabled: __isSeparator ? false : model.sensitive |
280 | 236 | 230 | ||
281 | 237 | Component { | 231 | sourceComponent: { |
282 | 238 | id: menuItemComponent | 232 | if (model.isSeparator) { |
283 | 239 | MenuItem { | 233 | return separatorComponent; |
284 | 240 | id: menuItem | 234 | } |
285 | 241 | menuData: model | 235 | return menuItemComponent; |
286 | 242 | objectName: loader.objectName + "-actionItem" | 236 | } |
287 | 243 | 237 | ||
288 | 244 | action.onTriggered: { | 238 | property Item popup: null |
289 | 245 | d.currentItem = loader; | 239 | |
290 | 246 | 240 | Layout.fillWidth: true | |
291 | 247 | if (hasSubmenu) { | 241 | |
292 | 248 | if (!popup) { | 242 | Component { |
293 | 249 | var model = root.unityMenuModel.submenu(__ownIndex); | 243 | id: menuItemComponent |
294 | 250 | popup = submenuComponent.createObject(focusScope, { | 244 | MenuItem { |
295 | 251 | objectName: loader.objectName + "-", | 245 | id: menuItem |
296 | 252 | unityMenuModel: model, | 246 | menuData: model |
297 | 253 | x: Qt.binding(function() { return root.width }), | 247 | objectName: loader.objectName + "-actionItem" |
298 | 254 | y: Qt.binding(function() { return loader.y }) | 248 | |
299 | 255 | }); | 249 | width: MathUtils.clamp(implicitWidth, d.__minimumWidth, d.__maximumWidth) |
300 | 256 | } else if (popup) { | 250 | |
301 | 257 | popup.visible = true; | 251 | action.onTriggered: { |
302 | 258 | } | 252 | d.currentItem = loader; |
303 | 259 | popup.retreat.connect(function() { | 253 | |
304 | 260 | popup.destroy(); | 254 | if (hasSubmenu) { |
305 | 261 | popup = null; | 255 | if (!popup) { |
306 | 262 | menuItem.forceActiveFocus(); | 256 | var model = root.unityMenuModel.submenu(__ownIndex); |
307 | 263 | }) | 257 | popup = submenuComponent.createObject(focusScope, { |
308 | 264 | } else { | 258 | objectName: loader.objectName + "-", |
309 | 265 | root.unityMenuModel.activate(__ownIndex); | 259 | unityMenuModel: model, |
310 | 266 | } | 260 | x: Qt.binding(function() { return root.width }), |
311 | 267 | } | 261 | y: Qt.binding(function() { |
312 | 268 | 262 | var dummy = listView.contentY; // force a recalc on contentY change. | |
313 | 269 | Connections { | 263 | return mapToItem(container, 0, y).y; |
314 | 270 | target: d | 264 | }) |
315 | 271 | onCurrentIndexChanged: { | 265 | }); |
316 | 272 | if (popup && d.currentIndex != __ownIndex) { | 266 | } else if (popup) { |
317 | 273 | popup.visible = false; | 267 | popup.visible = true; |
318 | 274 | } | 268 | } |
319 | 275 | } | 269 | popup.retreat.connect(function() { |
320 | 276 | onDismissAll: { | 270 | popup.destroy(); |
321 | 277 | if (popup) { | 271 | popup = null; |
322 | 278 | popup.destroy(); | 272 | menuItem.forceActiveFocus(); |
323 | 279 | popup = null; | 273 | }) |
324 | 280 | } | 274 | } else { |
325 | 281 | } | 275 | root.unityMenuModel.activate(__ownIndex); |
326 | 282 | } | 276 | } |
327 | 283 | } | 277 | } |
328 | 284 | } | 278 | |
329 | 285 | 279 | Connections { | |
330 | 286 | Component { | 280 | target: d |
331 | 287 | id: separatorComponent | 281 | onCurrentIndexChanged: { |
332 | 288 | ListItems.ThinDivider { | 282 | if (popup && d.currentIndex != __ownIndex) { |
333 | 289 | objectName: loader.objectName + "-separator" | 283 | popup.visible = false; |
334 | 290 | } | 284 | } |
335 | 291 | } | 285 | } |
336 | 292 | } | 286 | onDismissAll: { |
337 | 293 | } // ListView | 287 | if (popup) { |
338 | 294 | 288 | popup.destroy(); | |
339 | 295 | // FIXME use ListView.footer - tried but was flaky with positionViewAtIndex. | 289 | popup = null; |
340 | 290 | } | ||
341 | 291 | } | ||
342 | 292 | } | ||
343 | 293 | } | ||
344 | 294 | } | ||
345 | 295 | |||
346 | 296 | Component { | ||
347 | 297 | id: separatorComponent | ||
348 | 298 | ListItems.ThinDivider { | ||
349 | 299 | objectName: loader.objectName + "-separator" | ||
350 | 300 | implicitHeight: units.dp(2) | ||
351 | 301 | } | ||
352 | 302 | } | ||
353 | 303 | } | ||
354 | 304 | |||
355 | 305 | } | ||
356 | 306 | } | ||
357 | 307 | |||
358 | 308 | // Highlight | ||
359 | 309 | Rectangle { | ||
360 | 310 | color: "transparent" | ||
361 | 311 | border.width: units.dp(1) | ||
362 | 312 | border.color: UbuntuColors.orange | ||
363 | 313 | z: 1 | ||
364 | 314 | |||
365 | 315 | width: listView.width | ||
366 | 316 | height: d.currentItem ? d.currentItem.height : 0 | ||
367 | 317 | y: d.currentItem ? d.currentItem.y : 0 | ||
368 | 318 | visible: d.currentItem | ||
369 | 319 | } | ||
370 | 320 | |||
371 | 321 | } // Flickable | ||
372 | 322 | |||
373 | 323 | // Header - scroll down | ||
374 | 296 | Item { | 324 | Item { |
378 | 297 | Layout.fillWidth: true; | 325 | Layout.fillWidth: true |
379 | 298 | Layout.maximumHeight: units.gu(3) | 326 | height: units.gu(3) |
377 | 299 | Layout.minimumHeight: units.gu(3) | ||
380 | 300 | visible: listView.contentHeight > root.height | 327 | visible: listView.contentHeight > root.height |
381 | 301 | enabled: !listView.atYEnd | 328 | enabled: !listView.atYEnd |
382 | 329 | z: 1 | ||
383 | 302 | 330 | ||
384 | 303 | Rectangle { | 331 | Rectangle { |
385 | 304 | color: enabled ? theme.palette.normal.overlayText : | 332 | color: enabled ? theme.palette.normal.overlayText : |
386 | @@ -323,8 +351,19 @@ | |||
387 | 323 | MouseArea { | 351 | MouseArea { |
388 | 324 | anchors.fill: parent | 352 | anchors.fill: parent |
389 | 325 | onPressed: { | 353 | onPressed: { |
392 | 326 | var index = listView.indexAt(0, listView.contentY); | 354 | var item = menuColumn.childAt(0, listView.contentY + listView.height); |
393 | 327 | listView.positionViewAtIndex(index+1, ListView.Beginning); | 355 | if (item) { |
394 | 356 | var nextItem = item; | ||
395 | 357 | do { | ||
396 | 358 | nextItem = repeater.itemAt(nextItem.__ownIndex+1); | ||
397 | 359 | if (!nextItem) { | ||
398 | 360 | listView.contentY = listView.contentHeight - listView.height; | ||
399 | 361 | return; | ||
400 | 362 | } | ||
401 | 363 | } while (nextItem.__isSeparator); | ||
402 | 364 | |||
403 | 365 | listView.contentY = nextItem.y - listView.height | ||
404 | 366 | } | ||
405 | 328 | } | 367 | } |
406 | 329 | } | 368 | } |
407 | 330 | } | 369 | } |
408 | 331 | 370 | ||
409 | === modified file 'tests/qmltests/ApplicationMenuDataLoader.qml' | |||
410 | --- tests/qmltests/ApplicationMenuDataLoader.qml 2017-01-06 14:07:36 +0000 | |||
411 | +++ tests/qmltests/ApplicationMenuDataLoader.qml 2017-01-18 14:44:04 +0000 | |||
412 | @@ -10,6 +10,7 @@ | |||
413 | 10 | 10 | ||
414 | 11 | Connections { | 11 | Connections { |
415 | 12 | id: sMgrHandler | 12 | id: sMgrHandler |
416 | 13 | target: null | ||
417 | 13 | onSurfaceCreated: { | 14 | onSurfaceCreated: { |
418 | 14 | var fakeMenuPath = "/" + surface.persistentId.replace(/\W+/g, ""); | 15 | var fakeMenuPath = "/" + surface.persistentId.replace(/\W+/g, ""); |
419 | 15 | 16 | ||
420 | @@ -25,21 +26,28 @@ | |||
421 | 25 | var data = []; | 26 | var data = []; |
422 | 26 | if (root === undefined) root = true; | 27 | if (root === undefined) root = true; |
423 | 27 | 28 | ||
424 | 28 | if (prefix === undefined) prefix = "menu" | ||
425 | 29 | |||
426 | 30 | for (var i = 0; i < length; i++) { | 29 | for (var i = 0; i < length; i++) { |
427 | 31 | 30 | ||
428 | 31 | var menuName = prefix; | ||
429 | 32 | if (menuName === undefined) { | ||
430 | 33 | var chars = Math.random() * 20; | ||
431 | 34 | menuName = ""; | ||
432 | 35 | for (var x = 0; x < chars; x++) { | ||
433 | 36 | menuName += String.fromCharCode((Math.random() * 26) + 65); | ||
434 | 37 | } | ||
435 | 38 | } | ||
436 | 39 | |||
437 | 32 | var menuCode = String.fromCharCode(i+65); | 40 | var menuCode = String.fromCharCode(i+65); |
438 | 33 | 41 | ||
439 | 34 | var isSeparator = !root && separatorInterval > 0 && ((i+1) % separatorInterval == 0); | 42 | var isSeparator = !root && separatorInterval > 0 && ((i+1) % separatorInterval == 0); |
440 | 35 | var row = { | 43 | var row = { |
441 | 36 | "rowData": { // 1 | 44 | "rowData": { // 1 |
443 | 37 | "label": prefix + "&" + menuCode, | 45 | "label": menuName + "&" + menuCode, |
444 | 38 | "sensitive": true, | 46 | "sensitive": true, |
445 | 39 | "isSeparator": isSeparator, | 47 | "isSeparator": isSeparator, |
446 | 40 | "icon": "", | 48 | "icon": "", |
447 | 41 | "ext": {}, | 49 | "ext": {}, |
449 | 42 | "action": prefix + menuCode, | 50 | "action": menuName + menuCode, |
450 | 43 | "actionState": {}, | 51 | "actionState": {}, |
451 | 44 | "isCheck": false, | 52 | "isCheck": false, |
452 | 45 | "isRadio": false, | 53 | "isRadio": false, |
453 | @@ -49,7 +57,7 @@ | |||
454 | 49 | } | 57 | } |
455 | 50 | var isSubmenu = root === undefined || root === true || (submenuInterval > 0 && ((i+1) % submenuInterval == 0)); | 58 | var isSubmenu = root === undefined || root === true || (submenuInterval > 0 && ((i+1) % submenuInterval == 0)); |
456 | 51 | if (isSubmenu && !isSeparator && depth > 1) { | 59 | if (isSubmenu && !isSeparator && depth > 1) { |
458 | 52 | row["submenu"] = generateTestData(length, depth-1, submenuInterval, separatorInterval, prefix + menuCode + ".", false); | 60 | row["submenu"] = generateTestData(length, depth-1, submenuInterval, separatorInterval,prefix, false); |
459 | 53 | } | 61 | } |
460 | 54 | data[i] = row; | 62 | data[i] = row; |
461 | 55 | } | 63 | } |
462 | 56 | 64 | ||
463 | === modified file 'tests/qmltests/ApplicationMenus/tst_MenuBar.qml' | |||
464 | --- tests/qmltests/ApplicationMenus/tst_MenuBar.qml 2017-01-09 15:26:05 +0000 | |||
465 | +++ tests/qmltests/ApplicationMenus/tst_MenuBar.qml 2017-01-18 14:44:04 +0000 | |||
466 | @@ -65,7 +65,7 @@ | |||
467 | 65 | 65 | ||
468 | 66 | unityMenuModel: UnityMenuModel { | 66 | unityMenuModel: UnityMenuModel { |
469 | 67 | id: menuBackend | 67 | id: menuBackend |
471 | 68 | modelData: appMenuData.generateTestData(7,5,2,3,"menu") | 68 | modelData: appMenuData.generateTestData(17,5,2,3) |
472 | 69 | } | 69 | } |
473 | 70 | } | 70 | } |
474 | 71 | } | 71 | } |
475 | @@ -83,12 +83,12 @@ | |||
476 | 83 | 83 | ||
477 | 84 | function init() { | 84 | function init() { |
478 | 85 | menuBar.dismiss(); | 85 | menuBar.dismiss(); |
480 | 86 | menuBackend.modelData = appMenuData.generateTestData(5,5,2,3,"menu") | 86 | menuBackend.modelData = appMenuData.generateTestData(5,5,2,3) |
481 | 87 | activatedSpy.clear(); | 87 | activatedSpy.clear(); |
482 | 88 | } | 88 | } |
483 | 89 | 89 | ||
484 | 90 | function test_mouseNavigation() { | 90 | function test_mouseNavigation() { |
486 | 91 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu"); | 91 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0); |
487 | 92 | wait(50) // wait for row to build | 92 | wait(50) // wait for row to build |
488 | 93 | var priv = findInvisibleChild(menuBar, "d"); | 93 | var priv = findInvisibleChild(menuBar, "d"); |
489 | 94 | 94 | ||
490 | @@ -114,7 +114,7 @@ | |||
491 | 114 | } | 114 | } |
492 | 115 | 115 | ||
493 | 116 | function test_keyboardNavigation_RightKeySelectsNextMenuItem(data) { | 116 | function test_keyboardNavigation_RightKeySelectsNextMenuItem(data) { |
495 | 117 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu"); | 117 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0); |
496 | 118 | var priv = findInvisibleChild(menuBar, "d"); | 118 | var priv = findInvisibleChild(menuBar, "d"); |
497 | 119 | 119 | ||
498 | 120 | var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0); | 120 | var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0); |
499 | @@ -139,7 +139,7 @@ | |||
500 | 139 | } | 139 | } |
501 | 140 | 140 | ||
502 | 141 | function test_keyboardNavigation_LeftKeySelectsPreviousMenuItem(data) { | 141 | function test_keyboardNavigation_LeftKeySelectsPreviousMenuItem(data) { |
504 | 142 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu"); | 142 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0); |
505 | 143 | var priv = findInvisibleChild(menuBar, "d"); | 143 | var priv = findInvisibleChild(menuBar, "d"); |
506 | 144 | 144 | ||
507 | 145 | var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0); | 145 | var menuItem0 = findChild(menuBar, "menuBar-item0"); verify(menuItem0); |
508 | 146 | 146 | ||
509 | === modified file 'tests/qmltests/ApplicationMenus/tst_MenuPopup.qml' | |||
510 | --- tests/qmltests/ApplicationMenus/tst_MenuPopup.qml 2017-01-09 15:26:05 +0000 | |||
511 | +++ tests/qmltests/ApplicationMenus/tst_MenuPopup.qml 2017-01-18 14:44:04 +0000 | |||
512 | @@ -1,4 +1,4 @@ | |||
514 | 1 | /* | 1 | /* |
515 | 2 | * Copyright (C) 2016 Canonical, Ltd. | 2 | * Copyright (C) 2016 Canonical, Ltd. |
516 | 3 | * | 3 | * |
517 | 4 | * This program is free software; you can redistribute it and/or modify | 4 | * This program is free software; you can redistribute it and/or modify |
518 | @@ -28,8 +28,8 @@ | |||
519 | 28 | 28 | ||
520 | 29 | Item { | 29 | Item { |
521 | 30 | id: root | 30 | id: root |
524 | 31 | width: Math.max(units.gu(100), page.width + units.gu(6)) | 31 | width: Math.max(units.gu(100), loader.width + units.gu(6)) |
525 | 32 | height: Math.max(units.gu(50), page.height + units.gu(6)) | 32 | height: Math.max(units.gu(50), loader.height + units.gu(6)) |
526 | 33 | 33 | ||
527 | 34 | Binding { | 34 | Binding { |
528 | 35 | target: MouseTouchAdaptor | 35 | target: MouseTouchAdaptor |
529 | @@ -39,25 +39,37 @@ | |||
530 | 39 | 39 | ||
531 | 40 | ApplicationMenuDataLoader { id: appMenuData } | 40 | ApplicationMenuDataLoader { id: appMenuData } |
532 | 41 | 41 | ||
546 | 42 | MenuPopup { | 42 | Loader { |
547 | 43 | id: page | 43 | id: loader |
548 | 44 | 44 | sourceComponent: MenuPopup { | |
549 | 45 | anchors { | 45 | anchors { |
550 | 46 | left: parent.left | 46 | left: parent ? parent.left : undefined |
551 | 47 | top: parent.top | 47 | top: parent ? parent.top : undefined |
552 | 48 | leftMargin: units.gu(3) | 48 | leftMargin: units.gu(3) |
553 | 49 | topMargin: units.gu(3) | 49 | topMargin: units.gu(3) |
554 | 50 | } | 50 | } |
555 | 51 | 51 | ||
556 | 52 | unityMenuModel: UnityMenuModel { | 52 | unityMenuModel: UnityMenuModel { |
557 | 53 | id: menuBackend | 53 | modelData: [{ |
558 | 54 | modelData: appMenuData.generateTestData(7,5,2,3,"menu") | 54 | "rowData": { |
559 | 55 | "label": "Short", | ||
560 | 56 | }}, { | ||
561 | 57 | "rowData": { | ||
562 | 58 | "label": "This is a long menu item which tests width", | ||
563 | 59 | }} | ||
564 | 60 | ] | ||
565 | 61 | } | ||
566 | 62 | |||
567 | 63 | Binding { | ||
568 | 64 | target: activatedSpy | ||
569 | 65 | property: "target" | ||
570 | 66 | value: unityMenuModel | ||
571 | 67 | } | ||
572 | 55 | } | 68 | } |
573 | 56 | } | 69 | } |
574 | 57 | 70 | ||
575 | 58 | SignalSpy { | 71 | SignalSpy { |
576 | 59 | id: activatedSpy | 72 | id: activatedSpy |
577 | 60 | target: menuBackend | ||
578 | 61 | signalName: "activated" | 73 | signalName: "activated" |
579 | 62 | } | 74 | } |
580 | 63 | 75 | ||
581 | @@ -66,14 +78,20 @@ | |||
582 | 66 | name: "MenuPopup" | 78 | name: "MenuPopup" |
583 | 67 | when: windowShown | 79 | when: windowShown |
584 | 68 | 80 | ||
585 | 81 | property var menu: loader.status === Loader.Ready ? loader.item : null | ||
586 | 82 | |||
587 | 69 | function init() { | 83 | function init() { |
589 | 70 | page.show(); | 84 | loader.active = true; |
590 | 85 | menu.show(); | ||
591 | 71 | } | 86 | } |
592 | 72 | 87 | ||
593 | 73 | function cleanup() { | 88 | function cleanup() { |
595 | 74 | page.reset(); | 89 | menu.reset(); |
596 | 75 | wait(100); // let the page dismiss | 90 | wait(100); // let the page dismiss |
597 | 76 | activatedSpy.clear(); | 91 | activatedSpy.clear(); |
598 | 92 | |||
599 | 93 | loader.active = false; | ||
600 | 94 | tryCompare(loader, "item", null); | ||
601 | 77 | } | 95 | } |
602 | 78 | 96 | ||
603 | 79 | // visit and verify that all the backend menus have been created | 97 | // visit and verify that all the backend menus have been created |
604 | @@ -90,6 +108,7 @@ | |||
605 | 90 | // recurse into submenu | 108 | // recurse into submenu |
606 | 91 | var submenu = rows[i]["submenu"]; | 109 | var submenu = rows[i]["submenu"]; |
607 | 92 | if (submenu) { | 110 | if (submenu) { |
608 | 111 | waitForRendering(menuItem); | ||
609 | 93 | mouseClick(menuItem, menuItem.width/2, menuItem.height/2); | 112 | mouseClick(menuItem, menuItem.width/2, menuItem.height/2); |
610 | 94 | tryCompare(menuPriv, "currentItem", menuItem); | 113 | tryCompare(menuPriv, "currentItem", menuItem); |
611 | 95 | 114 | ||
612 | @@ -113,15 +132,15 @@ | |||
613 | 113 | } | 132 | } |
614 | 114 | 133 | ||
615 | 115 | function test_mouseNavigation(data) { | 134 | function test_mouseNavigation(data) { |
617 | 116 | menuBackend.modelData = data.testData; | 135 | menu.unityMenuModel.modelData = data.testData; |
618 | 117 | 136 | ||
620 | 118 | recurseMenuConstruction(data.testData, page); | 137 | recurseMenuConstruction(data.testData, menu); |
621 | 119 | } | 138 | } |
622 | 120 | 139 | ||
623 | 121 | function test_checkableMenuTogglesOnClick() { | 140 | function test_checkableMenuTogglesOnClick() { |
625 | 122 | menuBackend.modelData = appMenuData.singleCheckable; | 141 | menu.unityMenuModel.modelData = appMenuData.singleCheckable; |
626 | 123 | 142 | ||
628 | 124 | var menuItem = findChild(page, "menu-item0-actionItem"); | 143 | var menuItem = findChild(menu, "menu-item0-actionItem"); |
629 | 125 | verify(menuItem); | 144 | verify(menuItem); |
630 | 126 | compare(menuItem.action.checkable, true, "Menu item should be checkable"); | 145 | compare(menuItem.action.checkable, true, "Menu item should be checkable"); |
631 | 127 | compare(menuItem.action.checked, false, "Menu item should not be checked"); | 146 | compare(menuItem.action.checked, false, "Menu item should not be checked"); |
632 | @@ -132,13 +151,13 @@ | |||
633 | 132 | } | 151 | } |
634 | 133 | 152 | ||
635 | 134 | function test_keyboardNavigation_DownKeySelectsAndOpensNextMenuItemAndRotates() { | 153 | function test_keyboardNavigation_DownKeySelectsAndOpensNextMenuItemAndRotates() { |
643 | 135 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false); | 154 | menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false); |
644 | 136 | 155 | ||
645 | 137 | var item0 = findChild(page, "menu-item0"); verify(item0); | 156 | var item0 = findChild(menu, "menu-item0"); verify(item0); |
646 | 138 | var item1 = findChild(page, "menu-item1"); verify(item1); | 157 | var item1 = findChild(menu, "menu-item1"); verify(item1); |
647 | 139 | var item2 = findChild(page, "menu-item2"); verify(item2); | 158 | var item2 = findChild(menu, "menu-item2"); verify(item2); |
648 | 140 | 159 | ||
649 | 141 | var priv = findInvisibleChild(page, "d"); | 160 | var priv = findInvisibleChild(menu, "d"); |
650 | 142 | 161 | ||
651 | 143 | keyClick(Qt.Key_Down, Qt.NoModifier); | 162 | keyClick(Qt.Key_Down, Qt.NoModifier); |
652 | 144 | compare(priv.currentItem, item0, "CurrentItem should have moved to item 0"); | 163 | compare(priv.currentItem, item0, "CurrentItem should have moved to item 0"); |
653 | @@ -154,13 +173,13 @@ | |||
654 | 154 | } | 173 | } |
655 | 155 | 174 | ||
656 | 156 | function test_keyboardNavigation_UpKeySelectsAndOpensPreviousMenuItemAndRotates() { | 175 | function test_keyboardNavigation_UpKeySelectsAndOpensPreviousMenuItemAndRotates() { |
664 | 157 | menuBackend.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false); | 176 | menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,0,0,"menu",false); |
665 | 158 | 177 | ||
666 | 159 | var item0 = findChild(page, "menu-item0"); verify(item0); | 178 | var item0 = findChild(menu, "menu-item0"); verify(item0); |
667 | 160 | var item1 = findChild(page, "menu-item1"); verify(item1); | 179 | var item1 = findChild(menu, "menu-item1"); verify(item1); |
668 | 161 | var item2 = findChild(page, "menu-item2"); verify(item2); | 180 | var item2 = findChild(menu, "menu-item2"); verify(item2); |
669 | 162 | 181 | ||
670 | 163 | var priv = findInvisibleChild(page, "d"); | 182 | var priv = findInvisibleChild(menu, "d"); |
671 | 164 | 183 | ||
672 | 165 | keyClick(Qt.Key_Down, Qt.NoModifier); | 184 | keyClick(Qt.Key_Down, Qt.NoModifier); |
673 | 166 | compare(priv.currentItem, item0, "CurrentItem should have moved to item 2"); | 185 | compare(priv.currentItem, item0, "CurrentItem should have moved to item 2"); |
674 | @@ -176,17 +195,17 @@ | |||
675 | 176 | } | 195 | } |
676 | 177 | 196 | ||
677 | 178 | function test_keyboardNavigation_RightKeyEntersSubMenu() { | 197 | function test_keyboardNavigation_RightKeyEntersSubMenu() { |
683 | 179 | menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false); | 198 | menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false); |
684 | 180 | 199 | ||
685 | 181 | var menuItem = findChild(page, "menu-item0"); | 200 | var menuItem = findChild(menu, "menu-item0"); |
686 | 182 | 201 | ||
687 | 183 | var priv = findInvisibleChild(page, "d"); | 202 | var priv = findInvisibleChild(menu, "d"); |
688 | 184 | priv.currentItem = menuItem; | 203 | priv.currentItem = menuItem; |
689 | 185 | 204 | ||
690 | 186 | keyClick(Qt.Key_Right, Qt.NoModifier); | 205 | keyClick(Qt.Key_Right, Qt.NoModifier); |
691 | 187 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true); | 206 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true); |
692 | 188 | 207 | ||
694 | 189 | var submenu0 = findChild(page, "menu-item0-menu"); verify(submenu0); | 208 | var submenu0 = findChild(menu, "menu-item0-menu"); verify(submenu0); |
695 | 190 | var submenu0item0 = findChild(submenu0, "menu-item0-menu-item0"); verify(submenu0item0); | 209 | var submenu0item0 = findChild(submenu0, "menu-item0-menu-item0"); verify(submenu0item0); |
696 | 191 | 210 | ||
697 | 192 | var submenu0Priv = findInvisibleChild(submenu0, "d"); verify(submenu0Priv); | 211 | var submenu0Priv = findInvisibleChild(submenu0, "d"); verify(submenu0Priv); |
698 | @@ -194,14 +213,106 @@ | |||
699 | 194 | } | 213 | } |
700 | 195 | 214 | ||
701 | 196 | function test_keyboardNavigation_LeftKeyClosesSubMenu() { | 215 | function test_keyboardNavigation_LeftKeyClosesSubMenu() { |
703 | 197 | menuBackend.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false); | 216 | menu.unityMenuModel.modelData = appMenuData.generateTestData(3,3,1,0,"menu",false); |
704 | 198 | 217 | ||
706 | 199 | var menuItem = findChild(page, "menu-item0"); verify(menuItem); | 218 | var menuItem = findChild(menu, "menu-item0"); verify(menuItem); |
707 | 200 | mouseClick(menuItem, menuItem.width/2, menuItem.height/2); | 219 | mouseClick(menuItem, menuItem.width/2, menuItem.height/2); |
708 | 201 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true); | 220 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, true); |
709 | 202 | 221 | ||
710 | 203 | keyClick(Qt.Key_Left, Qt.NoModifier); | 222 | keyClick(Qt.Key_Left, Qt.NoModifier); |
711 | 204 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false); | 223 | tryCompareFunction(function() { return menuItem.popup !== null && menuItem.popup.visible }, false); |
712 | 205 | } | 224 | } |
713 | 225 | |||
714 | 226 | function test_differentSizes() { | ||
715 | 227 | var differentSizesMenu = [{ | ||
716 | 228 | "rowData": { "label": "Short" }}, { | ||
717 | 229 | "rowData": { "label": "This is a long menu item which tests width" } | ||
718 | 230 | }]; | ||
719 | 231 | |||
720 | 232 | menu.unityMenuModel.modelData = differentSizesMenu; | ||
721 | 233 | |||
722 | 234 | waitForRendering(menu); | ||
723 | 235 | var longWidth = menu.width; | ||
724 | 236 | differentSizesMenu.pop(); | ||
725 | 237 | menu.unityMenuModel.modelData = differentSizesMenu; | ||
726 | 238 | |||
727 | 239 | waitForRendering(menu); | ||
728 | 240 | verify(menu.width < longWidth); | ||
729 | 241 | } | ||
730 | 242 | |||
731 | 243 | function test_minimumWidth() { | ||
732 | 244 | var shortMenu = [{ | ||
733 | 245 | "rowData": { "label": "Short" } | ||
734 | 246 | }]; | ||
735 | 247 | menu.unityMenuModel.modelData = shortMenu; | ||
736 | 248 | |||
737 | 249 | var priv = findInvisibleChild(menu, "d"); | ||
738 | 250 | priv.__minimumWidth = 0; | ||
739 | 251 | priv.__maximumWidth = 1000; | ||
740 | 252 | tryCompareFunction(function() { return menu.width > priv.__minimumWidth; }, true); | ||
741 | 253 | |||
742 | 254 | priv.__minimumWidth = 300; | ||
743 | 255 | tryCompare(menu, "width", priv.__minimumWidth); | ||
744 | 256 | } | ||
745 | 257 | |||
746 | 258 | function test_maximumWidth() { | ||
747 | 259 | var longMenu = [{ | ||
748 | 260 | "rowData": { "label": "This is a long menu item which tests width" } | ||
749 | 261 | }]; | ||
750 | 262 | |||
751 | 263 | var priv = findInvisibleChild(menu, "d"); | ||
752 | 264 | priv.__minimumWidth = 0; | ||
753 | 265 | priv.__maximumWidth = 100; | ||
754 | 266 | |||
755 | 267 | menu.unityMenuModel.modelData = longMenu; | ||
756 | 268 | tryCompare(menu, "width", priv.__maximumWidth); | ||
757 | 269 | |||
758 | 270 | priv.__maximumWidth = 200; | ||
759 | 271 | tryCompare(menu, "width", priv.__maximumWidth); | ||
760 | 272 | |||
761 | 273 | priv.__maximumWidth = 1200; | ||
762 | 274 | tryCompareFunction(function() { return menu.width < priv.__maximumWidth; }, true); | ||
763 | 275 | } | ||
764 | 276 | |||
765 | 277 | function test_minimumHeight() { | ||
766 | 278 | var shortMenu = [{ | ||
767 | 279 | "rowData": { "label": "menu1" } | ||
768 | 280 | }]; | ||
769 | 281 | menu.unityMenuModel.modelData = shortMenu; | ||
770 | 282 | |||
771 | 283 | var priv = findInvisibleChild(menu, "d"); | ||
772 | 284 | priv.__minimumHeight = 0; | ||
773 | 285 | priv.__maximumHeight = 1000; | ||
774 | 286 | tryCompareFunction(function() { return menu.height > priv.__minimumHeight; }, true); | ||
775 | 287 | |||
776 | 288 | priv.__minimumHeight = 300; | ||
777 | 289 | tryCompare(menu, "height", priv.__minimumHeight); | ||
778 | 290 | } | ||
779 | 291 | |||
780 | 292 | function test_maximumHeight() { | ||
781 | 293 | var shortMenu = [{ | ||
782 | 294 | "rowData": { "label": "menu1" }}, { | ||
783 | 295 | "rowData": { "label": "menu2" }}, { | ||
784 | 296 | "rowData": { "label": "menu3" }}, { | ||
785 | 297 | "rowData": { "label": "menu4" }}, { | ||
786 | 298 | "rowData": { "label": "menu5" }}, { | ||
787 | 299 | "rowData": { "label": "menu6" }}, { | ||
788 | 300 | "rowData": { "label": "menu7" }}, { | ||
789 | 301 | "rowData": { "label": "menu8" }}, { | ||
790 | 302 | "rowData": { "label": "menu9" } | ||
791 | 303 | }]; | ||
792 | 304 | menu.unityMenuModel.modelData = shortMenu; | ||
793 | 305 | |||
794 | 306 | var priv = findInvisibleChild(menu, "d"); | ||
795 | 307 | priv.__minimumHeight = 0; | ||
796 | 308 | priv.__maximumHeight = 100; | ||
797 | 309 | tryCompare(menu, "height", priv.__maximumHeight); | ||
798 | 310 | |||
799 | 311 | priv.__maximumHeight = 200; | ||
800 | 312 | tryCompare(menu, "height", priv.__maximumHeight); | ||
801 | 313 | |||
802 | 314 | priv.__maximumHeight = 1200; | ||
803 | 315 | tryCompareFunction(function() { return menu.height < priv.__maximumHeight; }, true); | ||
804 | 316 | } | ||
805 | 206 | } | 317 | } |
806 | 207 | } | 318 | } |
PASSED: Continuous integration, rev:2771 /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2944/ /unity8- jenkins. ubuntu. com/job/ build/3841 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= xenial+ overlay, testname= qmluitests. sh/2234 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= zesty,testname= qmluitests. sh/2234 /unity8- jenkins. ubuntu. com/job/ build-0- fetch/3869 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 3712/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/3712/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 3712/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/3712/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 3712/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/3712 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/3712/ artifact/ output/ *zip*/output. zip
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild: /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2944/ rebuild
https:/