Merge lp:~lukas-kde/unity8/fix-window-buttons-touch into lp:unity8
- fix-window-buttons-touch
- Merge into trunk
Status: | Merged | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Approved by: | Albert Astals Cid | ||||||||||||
Approved revision: | 2857 | ||||||||||||
Merged at revision: | 2863 | ||||||||||||
Proposed branch: | lp:~lukas-kde/unity8/fix-window-buttons-touch | ||||||||||||
Merge into: | lp:unity8 | ||||||||||||
Prerequisite: | lp:~aacid/unity8/create_less_components | ||||||||||||
Diff against target: |
369 lines (+100/-46) 9 files modified
qml/ApplicationMenus/MenuBar.qml (+35/-11) qml/Components/WindowControlButtons.qml (+0/-21) qml/Panel/Panel.qml (+2/-0) qml/Stage/DecoratedWindow.qml (+3/-0) qml/Stage/MoveHandler.qml (+4/-0) qml/Stage/WindowDecoration.qml (+12/-14) tests/qmltests/ApplicationMenus/tst_MenuBar.qml (+2/-0) tests/qmltests/Stage/tst_DesktopStage.qml (+18/-0) tests/qmltests/tst_Shell.qml (+24/-0) |
||||||||||||
To merge this branch: | bzr merge lp:~lukas-kde/unity8/fix-window-buttons-touch | ||||||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Unity8 CI Bot | continuous-integration | Approve | |
Albert Astals Cid (community) | Approve | ||
Review via email: mp+318850@code.launchpad.net |
This proposal supersedes a proposal from 2017-02-26.
Commit message
Fix being unable to use window control buttons or menus with touch
Description of the change
Fix being unable to use window control buttons or menus with touch and incorrect grabbing of the decoration.
* Are there any related MPs required for this MP to build/function as expected? Please list.
Yes, prereq
* 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
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal | # |
Added a regression test (+ fixed the other 2 failing)
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2840
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2842
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2842
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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2843
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2844
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2847
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2849
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2850
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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2851
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2852
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2853
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2854
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:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2855
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:
https:/
Albert Astals Cid (aacid) wrote : | # |
Looks good :)
Some minor things
Why did you remove
menuBackend.
from init() in the test?
Are the compare -> tryCompare still needed now that we don't have a timer anymore?
Can
readonly property bool moving: priv.moving
be an alias?
Lukáš Tinkl (lukas-kde) wrote : | # |
> Looks good :)
>
> Some minor things
>
> Why did you remove
> menuBackend.
> from init() in the test?
It's in every method anyway
> Are the compare -> tryCompare still needed now that we don't have a timer
> anymore?
OK, fixed
> Can
> readonly property bool moving: priv.moving
> be an alias?
Nope, it doesn't work due to the "priv" declaration:
property QtObject priv: QtObject {}
- 2856. By Lukáš Tinkl
-
revert now unneeded test change
- 2857. By Lukáš Tinkl
-
revert even more
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.
Let's give those last minute changes a chance to run and i'll top approve
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2857
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:
https:/
Preview Diff
1 | === modified file 'qml/ApplicationMenus/MenuBar.qml' |
2 | --- qml/ApplicationMenus/MenuBar.qml 2017-03-03 10:22:19 +0000 |
3 | +++ qml/ApplicationMenus/MenuBar.qml 2017-03-03 10:22:19 +0000 |
4 | @@ -28,11 +28,19 @@ |
5 | property alias unityMenuModel: rowRepeater.model |
6 | property bool enableKeyFilter: false |
7 | property real overflowWidth: width |
8 | + property bool windowMoving: false |
9 | |
10 | // read from outside |
11 | readonly property bool valid: rowRepeater.count > 0 |
12 | readonly property bool showRequested: d.longAltPressed || d.currentItem != null |
13 | |
14 | + // MoveHandler API for DecoratedWindow |
15 | + signal pressed(var mouse) |
16 | + signal pressedChangedEx(bool pressed, var pressedButtons, real mouseX, real mouseY) |
17 | + signal positionChanged(var mouse) |
18 | + signal released(var mouse) |
19 | + signal doubleClicked(var mouse) |
20 | + |
21 | implicitWidth: row.width |
22 | height: parent.height |
23 | |
24 | @@ -77,7 +85,7 @@ |
25 | anchors.fill: parent |
26 | enabled: d.currentItem != null |
27 | hoverEnabled: enabled && d.currentItem && d.currentItem.__popup != null |
28 | - onPressed: d.dismissAll() |
29 | + onPressed: { mouse.accepted = false; d.dismissAll(); } |
30 | } |
31 | |
32 | Row { |
33 | @@ -218,26 +226,42 @@ |
34 | } // Row |
35 | |
36 | MouseArea { |
37 | - anchors.fill: row |
38 | + anchors.fill: parent |
39 | hoverEnabled: d.currentItem |
40 | |
41 | + property bool moved: false |
42 | + |
43 | onEntered: { |
44 | if (d.currentItem) { |
45 | updateCurrentItemFromPosition(Qt.point(mouseX, mouseY)) |
46 | } |
47 | } |
48 | - onPositionChanged: { |
49 | + |
50 | + onClicked: { |
51 | + if (!moved) { |
52 | + var prevItem = d.currentItem; |
53 | + updateCurrentItemFromPosition(Qt.point(mouseX, mouseY)); |
54 | + if (prevItem && d.currentItem == prevItem) { |
55 | + prevItem.hide(); |
56 | + } |
57 | + } |
58 | + moved = false; |
59 | + } |
60 | + |
61 | + // for the MoveHandler |
62 | + onPressed: root.pressed(mouse) |
63 | + onPressedChanged: root.pressedChangedEx(pressed, pressedButtons, mouseX, mouseY) |
64 | + onReleased: root.released(mouse) |
65 | + onDoubleClicked: root.doubleClicked(mouse) |
66 | + |
67 | + Mouse.ignoreSynthesizedEvents: true |
68 | + Mouse.onPositionChanged: { |
69 | + root.positionChanged(mouse); |
70 | + moved = root.windowMoving; |
71 | if (d.currentItem) { |
72 | updateCurrentItemFromPosition(Qt.point(mouse.x, mouse.y)) |
73 | } |
74 | } |
75 | - onClicked: { |
76 | - var prevItem = d.currentItem; |
77 | - updateCurrentItemFromPosition(Qt.point(mouse.x, mouse.y)) |
78 | - if (prevItem && d.currentItem == prevItem) { |
79 | - prevItem.hide(); |
80 | - } |
81 | - } |
82 | |
83 | function updateCurrentItemFromPosition(point) { |
84 | var pos = mapToItem(row, point.x, point.y); |
85 | @@ -260,7 +284,7 @@ |
86 | hoverEnabled: d.currentItem |
87 | onEntered: d.currentItem = this |
88 | onPositionChanged: d.currentItem = this |
89 | - onClicked: d.currentItem = this |
90 | + onPressed: d.currentItem = this |
91 | |
92 | property Item __popup: null; |
93 | readonly property bool popupVisible: __popup && __popup.visible |
94 | |
95 | === modified file 'qml/Components/WindowControlButtons.qml' |
96 | --- qml/Components/WindowControlButtons.qml 2017-01-26 11:10:01 +0000 |
97 | +++ qml/Components/WindowControlButtons.qml 2017-03-03 10:22:19 +0000 |
98 | @@ -47,13 +47,6 @@ |
99 | onClicked: root.closeClicked() |
100 | visible: root.closeButtonShown |
101 | |
102 | - // We dont want touch events to fall through to parent, |
103 | - // otherwise the containsMouse will not work. |
104 | - MouseArea { |
105 | - anchors.fill: parent |
106 | - propagateComposedEvents: true |
107 | - } |
108 | - |
109 | Rectangle { |
110 | anchors.fill: parent |
111 | anchors.margins: windowIsMaximized ? units.dp(3) : 0 |
112 | @@ -78,13 +71,6 @@ |
113 | onClicked: root.minimizeClicked() |
114 | visible: root.minimizeButtonVisible |
115 | |
116 | - // We dont want touch events to fall through to parent, |
117 | - // otherwise the containsMouse will not work. |
118 | - MouseArea { |
119 | - anchors.fill: parent |
120 | - propagateComposedEvents: true |
121 | - } |
122 | - |
123 | Rectangle { |
124 | anchors.fill: parent |
125 | anchors.margins: windowIsMaximized ? units.dp(3) : 0 |
126 | @@ -118,13 +104,6 @@ |
127 | } |
128 | } |
129 | |
130 | - // We dont want touch events to fall through to parent, |
131 | - // otherwise the containsMouse will not work. |
132 | - MouseArea { |
133 | - anchors.fill: parent |
134 | - propagateComposedEvents: true |
135 | - } |
136 | - |
137 | Rectangle { |
138 | anchors.fill: parent |
139 | anchors.margins: windowIsMaximized ? units.dp(3) : 0 |
140 | |
141 | === modified file 'qml/Panel/Panel.qml' |
142 | --- qml/Panel/Panel.qml 2017-02-07 14:10:41 +0000 |
143 | +++ qml/Panel/Panel.qml 2017-03-03 10:22:19 +0000 |
144 | @@ -231,6 +231,8 @@ |
145 | target: __indicators |
146 | onShownChanged: bar.dismiss(); |
147 | } |
148 | + |
149 | + onDoubleClicked: PanelState.restoreClicked() |
150 | } |
151 | } |
152 | } |
153 | |
154 | === modified file 'qml/Stage/DecoratedWindow.qml' |
155 | --- qml/Stage/DecoratedWindow.qml 2017-01-26 11:10:01 +0000 |
156 | +++ qml/Stage/DecoratedWindow.qml 2017-03-03 10:22:19 +0000 |
157 | @@ -204,12 +204,14 @@ |
158 | height: units.gu(3) |
159 | |
160 | title: applicationWindow.title |
161 | + windowMoving: moveHandler.moving && !altDragHandler.dragging |
162 | |
163 | opacity: root.hasDecoration ? Math.min(1, root.showDecoration) : 0 |
164 | Behavior on opacity { UbuntuNumberAnimation { } } |
165 | |
166 | onPressed: root.decorationPressed(); |
167 | onPressedChanged: moveHandler.handlePressedChanged(pressed, pressedButtons, mouseX, mouseY) |
168 | + onPressedChangedEx: moveHandler.handlePressedChanged(pressed, pressedButtons, mouseX, mouseY) |
169 | onPositionChanged: moveHandler.handlePositionChanged(mouse) |
170 | onReleased: { |
171 | root.decorationReleased(); |
172 | @@ -255,6 +257,7 @@ |
173 | } |
174 | |
175 | MouseArea { |
176 | + id: altDragHandler |
177 | anchors.fill: applicationWindow |
178 | acceptedButtons: Qt.LeftButton |
179 | property bool dragging: false |
180 | |
181 | === modified file 'qml/Stage/MoveHandler.qml' |
182 | --- qml/Stage/MoveHandler.qml 2017-01-26 11:10:01 +0000 |
183 | +++ qml/Stage/MoveHandler.qml 2017-03-03 10:22:19 +0000 |
184 | @@ -29,6 +29,7 @@ |
185 | property real boundsTopMargin: 0 |
186 | |
187 | readonly property bool dragging: priv.dragging |
188 | + readonly property bool moving: priv.moving |
189 | |
190 | signal fakeMaximizeAnimationRequested(real amount) |
191 | signal fakeMaximizeLeftAnimationRequested(real amount) |
192 | @@ -43,6 +44,7 @@ |
193 | property real distanceX |
194 | property real distanceY |
195 | property bool dragging |
196 | + property bool moving |
197 | |
198 | readonly property int triggerArea: units.gu(8) |
199 | property bool nearLeftEdge: target.maximizedLeft |
200 | @@ -110,6 +112,7 @@ |
201 | |
202 | function handlePositionChanged(mouse, sensingPoints) { |
203 | if (priv.dragging) { |
204 | + priv.moving = true; |
205 | priv.mouseDownTimer.stop(); |
206 | Mir.cursorName = "grabbing"; |
207 | |
208 | @@ -180,6 +183,7 @@ |
209 | } |
210 | |
211 | function handleReleased(touchMode) { |
212 | + priv.moving = false; |
213 | if (touchMode) { |
214 | priv.progress = 0; |
215 | priv.resetEdges(); |
216 | |
217 | === modified file 'qml/Stage/WindowDecoration.qml' |
218 | --- qml/Stage/WindowDecoration.qml 2017-01-26 11:10:01 +0000 |
219 | +++ qml/Stage/WindowDecoration.qml 2017-03-03 10:22:19 +0000 |
220 | @@ -33,23 +33,21 @@ |
221 | property alias overlayShown: buttons.overlayShown |
222 | property var menu: undefined |
223 | property bool enableMenus: true |
224 | + property bool windowMoving: false |
225 | |
226 | readonly property real buttonsWidth: buttons.width + row.spacing |
227 | |
228 | acceptedButtons: Qt.AllButtons // prevent leaking unhandled mouse events |
229 | hoverEnabled: true |
230 | |
231 | - drag.target: Item {} |
232 | - drag.filterChildren: true |
233 | - drag.threshold: 0 |
234 | - |
235 | signal closeClicked() |
236 | signal minimizeClicked() |
237 | signal maximizeClicked() |
238 | signal maximizeHorizontallyClicked() |
239 | signal maximizeVerticallyClicked() |
240 | |
241 | - onClicked: mouse.accepted = true // propogated event |
242 | + signal pressedChangedEx(bool pressed, var pressedButtons, real mouseX, real mouseY) |
243 | + |
244 | onDoubleClicked: { |
245 | if (mouse.button == Qt.LeftButton) { |
246 | root.maximizeClicked(); |
247 | @@ -69,13 +67,6 @@ |
248 | (menuBar.showRequested || root.containsMouse) |
249 | } |
250 | |
251 | - // We dont want touch events to fall through to parent as it expect some child MouseArea to have them |
252 | - // If not some MouseArea in the menu bar, it will be this one. |
253 | - MouseArea { |
254 | - anchors.fill: parent |
255 | - propagateComposedEvents: true |
256 | - } |
257 | - |
258 | Rectangle { |
259 | id: background |
260 | anchors.fill: parent |
261 | @@ -136,7 +127,7 @@ |
262 | fontSize: "medium" |
263 | font.weight: root.active ? Font.Light : Font.Medium |
264 | elide: Text.ElideRight |
265 | - opacity: overlayShown || priv.shouldShowMenus ? 0 : 1 |
266 | + opacity: overlayShown || menuBarLoader.visible ? 0 : 1 |
267 | visible: opacity != 0 |
268 | Behavior on opacity { UbuntuNumberAnimation {} } |
269 | } |
270 | @@ -154,9 +145,16 @@ |
271 | height: menuBarLoader.height |
272 | enableKeyFilter: valid && root.active && root.enableMenus |
273 | unityMenuModel: root.menu |
274 | + windowMoving: root.windowMoving |
275 | + |
276 | + onPressed: root.onPressed(mouse) |
277 | + onPressedChangedEx: root.pressedChangedEx(pressed, pressedButtons, mouseX, mouseY) |
278 | + onPositionChanged: root.onPositionChanged(mouse) |
279 | + onReleased: root.onReleased(mouse) |
280 | + onDoubleClicked: root.onDoubleClicked(mouse) |
281 | } |
282 | |
283 | - opacity: !overlayShown && priv.shouldShowMenus ? 1 : 0 |
284 | + opacity: (!overlayShown && priv.shouldShowMenus) || (active && priv.menuBar.valid && root.windowMoving) ? 1 : 0 |
285 | visible: opacity == 1 |
286 | Behavior on opacity { UbuntuNumberAnimation {} } |
287 | } |
288 | |
289 | === modified file 'tests/qmltests/ApplicationMenus/tst_MenuBar.qml' |
290 | --- tests/qmltests/ApplicationMenus/tst_MenuBar.qml 2017-03-03 10:22:19 +0000 |
291 | +++ tests/qmltests/ApplicationMenus/tst_MenuBar.qml 2017-03-03 10:22:19 +0000 |
292 | @@ -98,6 +98,7 @@ |
293 | var menuItem2 = findChild(menuBar, "menuBar-item2"); verify(menuItem2); |
294 | |
295 | menuItem0.show(); |
296 | + mouseMove(menuItem0, menuItem0.width/2, menuItem0.height/2); |
297 | compare(priv.currentItem, menuItem0, "CurrentItem should be set to item 0"); |
298 | compare(priv.currentItem.popupVisible, true, "Popup should be visible"); |
299 | |
300 | @@ -179,6 +180,7 @@ |
301 | |
302 | keyPress(data.tag, Qt.AltModifier, 100); |
303 | tryCompare(priv, "currentItem", menuItem); |
304 | + keyRelease(data.tag, Qt.AltModifier, 100); |
305 | } |
306 | |
307 | function test_menuActivateClosesMenu() { |
308 | |
309 | === modified file 'tests/qmltests/Stage/tst_DesktopStage.qml' |
310 | --- tests/qmltests/Stage/tst_DesktopStage.qml 2017-02-16 13:43:56 +0000 |
311 | +++ tests/qmltests/Stage/tst_DesktopStage.qml 2017-03-03 10:22:19 +0000 |
312 | @@ -1013,5 +1013,23 @@ |
313 | expectFail("", "Hovering the window controls should be ignored when the menu is open"); |
314 | tryCompare(closeButton, "containsMouse", true); |
315 | } |
316 | + |
317 | + function test_windowControlsTouchInteractionWithMenu() { |
318 | + var appDelegate = startApplication("gmail-webapp"); |
319 | + |
320 | + var wd = findChild(appDelegate, "appWindowDecoration"); |
321 | + var maxButton = findChild(wd, "maximizeWindowButton"); |
322 | + var menuBarLoader = findChild(wd, "menuBarLoader"); |
323 | + var menuNav = findInvisibleChild(menuBarLoader, "d"); |
324 | + |
325 | + // make the menubar active and visible, select first item |
326 | + menuBarLoader.active = true; |
327 | + menuNav.select(0); |
328 | + tryCompare(menuBarLoader.item, "visible", true); |
329 | + |
330 | + // verify the maximized button can still be tapped |
331 | + tap(maxButton); |
332 | + tryCompare(appDelegate, "state", "maximized"); |
333 | + } |
334 | } |
335 | } |
336 | |
337 | === modified file 'tests/qmltests/tst_Shell.qml' |
338 | --- tests/qmltests/tst_Shell.qml 2017-02-16 13:46:11 +0000 |
339 | +++ tests/qmltests/tst_Shell.qml 2017-03-03 10:22:19 +0000 |
340 | @@ -2910,5 +2910,29 @@ |
341 | tryCompare(topLevelSurfaceList.focusedWindow, "surface", appDelegate.surface); |
342 | tryCompare(topLevelSurfaceList.applicationAt(0), "appId", "dialer-app"); |
343 | } |
344 | + |
345 | + function test_doubleClickPanelRestoresWindow() { |
346 | + loadShell("desktop"); |
347 | + shell.usageScenario = "desktop"; |
348 | + waitForRendering(shell); |
349 | + swipeAwayGreeter(); |
350 | + |
351 | + // start dialer |
352 | + var appDelegate = startApplication("dialer-app") |
353 | + verify(appDelegate); |
354 | + tryCompare(appDelegate, "state", "normal"); |
355 | + |
356 | + // maximize dialer |
357 | + var decoration = findChild(appDelegate, "appWindowDecoration"); |
358 | + verify(decoration); |
359 | + mouseDoubleClickSequence(decoration); |
360 | + tryCompare(appDelegate, "state", "maximized"); |
361 | + |
362 | + // double click the panel |
363 | + var panel = findChild(shell, "panel"); |
364 | + verify(panel); |
365 | + mouseDoubleClickSequence(panel, panel.width/2, PanelState.panelHeight/2, Qt.LeftButton, Qt.NoModifier, 300); |
366 | + tryCompare(appDelegate, "state", "restored"); |
367 | + } |
368 | } |
369 | } |
FAILED: Continuous integration, rev:2839 /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/3215/ /unity8- jenkins. ubuntu. com/job/ build/4219 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= xenial+ overlay, testname= qmluitests. sh/2492 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= zesty,testname= qmluitests. sh/2492 /unity8- jenkins. ubuntu. com/job/ build-0- fetch/4247 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 4082/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/4082/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 4082/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/4082/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 4082/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/4082 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/4082/ artifact/ output/ *zip*/output. zip
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: 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/3215/ rebuild
https:/