on xenial help sign in
Implement maximizing windows horizontally/vertically

- RMB to maximize horizontally - MMB to maximize vertically The various maximization states are now correctly saved and restored. Also refactored signal names like close/maximize/minimize to closeClicked/maximizeClicked/minimizeClicked. Approved by: Daniel d'Andrada

commit760bfdfe3acb2cfdf86e90234182c2d9724bd275 authorLukáš Tinkl <lukas.tinkl@canonical.com> dateFri 27 May 2016, 13:53 (10 years ago) parent30179a3a3fc9b2
11 files changed+199−86
plugins/Utils/windowstatestorage.h+13−3 qml/Components/PanelState/PanelState.qml+3−3 qml/Components/WindowControlButtons.qml+17−6 qml/Panel/Panel.qml+4−4 qml/Stages/DecoratedWindow.qml+10−6 qml/Stages/DesktopStage.qml+54−42 qml/Stages/WindowDecoration.qml+12−8 qml/Stages/WindowResizeArea.qml+25−5 tests/mocks/Utils/windowstatestorage.h+14−3 tests/qmltests/Stages/tst_DesktopStage.qml+31−1 tests/qmltests/Stages/tst_WindowResizeArea.qml+16−5
plugins/Utils/windowstatestorage.h+13−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright 2015-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -25,9 +25,19 @@ class WindowStateStorage: public QObject
2525 Q_ENUMS(WindowState)
2626public:
2727 enum WindowState {
28− WindowStateNormal,
29− WindowStateMaximized
28+ WindowStateNormal = 1 << 0,
29+ WindowStateMaximized = 1 << 1,
30+ WindowStateMinimized = 1 << 2,
31+ WindowStateFullscreen = 1 << 3,
32+ WindowStateMaximizedLeft = 1 << 4,
33+ WindowStateMaximizedRight = 1 << 5,
34+ WindowStateMaximizedHorizontally = 1 << 6,
35+ WindowStateMaximizedVertically = 1 << 7
3036 };
37+ Q_DECLARE_FLAGS(WindowStates, WindowState)
38+#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
39+ Q_FLAG(WindowStates)
40+#endif
3141
3242 WindowStateStorage(QObject *parent = 0);
3343 virtual ~WindowStateStorage();
qml/Components/PanelState/PanelState.qml+3−3
@@ -26,8 +26,8 @@ QtObject {
2626 property bool dropShadow: false
2727 property int panelHeight: 0
2828
29− signal close()
30− signal minimize()
31− signal maximize()
29+ signal closeClicked()
30+ signal minimizeClicked()
31+ signal restoreClicked()
3232 signal focusMaximizedApp()
3333}
qml/Components/WindowControlButtons.qml+17−6
@@ -25,9 +25,11 @@ Row {
2525 property bool active: false
2626 property bool closeButtonShown: true
2727
28− signal close()
29− signal minimize()
30− signal maximize()
28+ signal closeClicked()
29+ signal minimizeClicked()
30+ signal maximizeClicked()
31+ signal maximizeVerticallyClicked()
32+ signal maximizeHorizontallyClicked()
3133
3234 MouseArea {
3335 id: closeWindowButton
@@ -35,7 +37,7 @@ Row {
3537 hoverEnabled: true
3638 height: parent.height
3739 width: height
38− onClicked: root.close()
40+ onClicked: root.closeClicked()
3941 visible: root.closeButtonShown
4042
4143 Rectangle {
@@ -62,7 +64,7 @@ Row {
6264 hoverEnabled: true
6365 height: parent.height
6466 width: height
65− onClicked: root.minimize()
67+ onClicked: root.minimizeClicked()
6668
6769 Rectangle {
6870 anchors.centerIn: parent
@@ -88,7 +90,16 @@ Row {
8890 hoverEnabled: true
8991 height: parent.height
9092 width: height
91− onClicked: root.maximize()
93+ acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
94+ onClicked: {
95+ if (mouse.button == Qt.LeftButton) {
96+ root.maximizeClicked();
97+ } else if (mouse.button == Qt.RightButton) {
98+ root.maximizeHorizontallyClicked();
99+ } else if (mouse.button == Qt.MiddleButton) {
100+ root.maximizeVerticallyClicked();
101+ }
102+ }
92103
93104 Rectangle {
94105 anchors.centerIn: parent
qml/Panel/Panel.qml+4−4
@@ -101,7 +101,7 @@ Item {
101101 height: indicators.minimizedPanelHeight
102102 hoverEnabled: true
103103 onClicked: callHint.visible ? callHint.showLiveCall() : PanelState.focusMaximizedApp()
104− onDoubleClicked: PanelState.maximize()
104+ onDoubleClicked: PanelState.restoreClicked()
105105
106106 property bool mouseWasPressed: false
107107 onPressed: mouseWasPressed = containsPress
@@ -127,10 +127,10 @@ Item {
127127 height: indicators.minimizedPanelHeight - anchors.topMargin - anchors.bottomMargin
128128 visible: PanelState.buttonsVisible && parent.containsMouse && !root.locked && !callHint.visible
129129 active: PanelState.buttonsVisible
130+ onCloseClicked: PanelState.closeClicked()
131+ onMinimizeClicked: PanelState.minimizeClicked()
132+ onMaximizeClicked: PanelState.restoreClicked()
130133 closeButtonShown: PanelState.closeButtonShown
131− onClose: PanelState.close()
132− onMinimize: PanelState.minimize()
133− onMaximize: PanelState.maximize()
134134 }
135135 }
136136
qml/Stages/DecoratedWindow.qml+10−6
@@ -46,9 +46,11 @@ FocusScope {
4646 property alias widthIncrement: applicationWindow.widthIncrement
4747 property alias heightIncrement: applicationWindow.heightIncrement
4848
49− signal close()
50− signal maximize()
51− signal minimize()
49+ signal closeClicked()
50+ signal maximizeClicked()
51+ signal maximizeHorizontallyClicked()
52+ signal maximizeVerticallyClicked()
53+ signal minimizeClicked()
5254 signal decorationPressed()
5355
5456 Rectangle {
@@ -86,9 +88,11 @@ FocusScope {
8688 title: applicationWindow.title
8789 visible: root.decorationShown
8890
89− onClose: root.close();
90− onMaximize: { root.decorationPressed(); root.maximize(); }
91− onMinimize: root.minimize();
91+ onCloseClicked: root.closeClicked();
92+ onMaximizeClicked: { root.decorationPressed(); root.maximizeClicked(); }
93+ onMaximizeHorizontallyClicked: { root.decorationPressed(); root.maximizeHorizontallyClicked(); }
94+ onMaximizeVerticallyClicked: { root.decorationPressed(); root.maximizeVerticallyClicked(); }
95+ onMinimizeClicked: root.minimizeClicked();
9296 onPressed: root.decorationPressed();
9397 }
9498
qml/Stages/DesktopStage.qml+54−42
@@ -90,7 +90,8 @@ AbstractStage {
9090 GlobalShortcut {
9191 id: minimizeRestoreShortcut
9292 shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Down
93− onTriggered: priv.focusedAppDelegate.maximized || priv.focusedAppDelegate.maximizedLeft || priv.focusedAppDelegate.maximizedRight
93+ onTriggered: priv.focusedAppDelegate.maximized || priv.focusedAppDelegate.maximizedLeft || priv.focusedAppDelegate.maximizedRight ||
94+ priv.focusedAppDelegate.maximizedHorizontally || priv.focusedAppDelegate.maximizedVertically
9495 ? priv.focusedAppDelegate.restoreFromMaximized() : priv.focusedAppDelegate.minimize()
9596 active: priv.focusedAppDelegate !== null
9697 }
@@ -159,9 +160,9 @@ AbstractStage {
159160
160161 Connections {
161162 target: PanelState
162− onClose: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
163− onMinimize: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.minimize(); } }
164− onMaximize: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.restoreFromMaximized(); } }
163+ onCloseClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.close(); } }
164+ onMinimizeClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.minimize(); } }
165+ onRestoreClicked: { if (priv.focusedAppDelegate) { priv.focusedAppDelegate.restoreFromMaximized(); } }
165166 onFocusMaximizedApp: {
166167 if (priv.foregroundMaximizedAppDelegate) {
167168 priv.foregroundMaximizedAppDelegate.focus = true;
@@ -276,19 +277,16 @@ AbstractStage {
276277 property alias widthIncrement: decoratedWindow.widthIncrement
277278 property alias heightIncrement: decoratedWindow.heightIncrement
278279
279− QtObject {
280− id: appDelegatePrivate
281− property bool maximized: false
282− property bool maximizedLeft: false
283− property bool maximizedRight: false
284− property bool minimized: false
285− }
286− readonly property alias maximized: appDelegatePrivate.maximized
287− readonly property alias maximizedLeft: appDelegatePrivate.maximizedLeft
288− readonly property alias maximizedRight: appDelegatePrivate.maximizedRight
289− readonly property alias minimized: appDelegatePrivate.minimized
280+ readonly property bool maximized: windowState & WindowStateStorage.WindowStateMaximized
281+ readonly property bool maximizedLeft: windowState & WindowStateStorage.WindowStateMaximizedLeft
282+ readonly property bool maximizedRight: windowState & WindowStateStorage.WindowStateMaximizedRight
283+ readonly property bool maximizedHorizontally: windowState & WindowStateStorage.WindowStateMaximizedHorizontally
284+ readonly property bool maximizedVertically: windowState & WindowStateStorage.WindowStateMaximizedVertically
285+ readonly property bool minimized: windowState & WindowStateStorage.WindowStateMinimized
290286 readonly property alias fullscreen: decoratedWindow.fullscreen
291287
288+ property int windowState: WindowStateStorage.WindowStateNormal
289+
292290 readonly property var application: model.application
293291 property bool animationsEnabled: true
294292 property alias title: decoratedWindow.title
@@ -386,43 +384,45 @@ AbstractStage {
386384
387385 function maximize(animated) {
388386 animationsEnabled = (animated === undefined) || animated;
389− appDelegatePrivate.minimized = false;
390− appDelegatePrivate.maximized = true;
391− appDelegatePrivate.maximizedLeft = false;
392− appDelegatePrivate.maximizedRight = false;
387+ windowState = WindowStateStorage.WindowStateMaximized;
388+ }
389+ function maximizeLeft(animated) {
390+ animationsEnabled = (animated === undefined) || animated;
391+ windowState = WindowStateStorage.WindowStateMaximizedLeft;
392+ }
393+ function maximizeRight(animated) {
394+ animationsEnabled = (animated === undefined) || animated;
395+ windowState = WindowStateStorage.WindowStateMaximizedRight;
393396 }
394− function maximizeLeft() {
395− appDelegatePrivate.minimized = false;
396− appDelegatePrivate.maximized = false;
397− appDelegatePrivate.maximizedLeft = true;
398− appDelegatePrivate.maximizedRight = false;
397+ function maximizeHorizontally(animated) {
398+ animationsEnabled = (animated === undefined) || animated;
399+ windowState = WindowStateStorage.WindowStateMaximizedHorizontally;
399400 }
400− function maximizeRight() {
401− appDelegatePrivate.minimized = false;
402− appDelegatePrivate.maximized = false;
403− appDelegatePrivate.maximizedLeft = false;
404− appDelegatePrivate.maximizedRight = true;
401+ function maximizeVertically(animated) {
402+ animationsEnabled = (animated === undefined) || animated;
403+ windowState = WindowStateStorage.WindowStateMaximizedVertically;
405404 }
406405 function minimize(animated) {
407406 animationsEnabled = (animated === undefined) || animated;
408− appDelegatePrivate.minimized = true;
407+ windowState |= WindowStateStorage.WindowStateMinimized; // add the minimized bit
409408 }
410409 function restoreFromMaximized(animated) {
411410 animationsEnabled = (animated === undefined) || animated;
412− appDelegatePrivate.minimized = false;
413− appDelegatePrivate.maximized = false;
414− appDelegatePrivate.maximizedLeft = false;
415− appDelegatePrivate.maximizedRight = false;
411+ windowState = WindowStateStorage.WindowStateNormal;
416412 }
417413 function restore(animated) {
418414 animationsEnabled = (animated === undefined) || animated;
419− appDelegatePrivate.minimized = false;
415+ windowState &= ~WindowStateStorage.WindowStateMinimized; // clear the minimized bit
420416 if (maximized)
421417 maximize();
422418 else if (maximizedLeft)
423419 maximizeLeft();
424420 else if (maximizedRight)
425421 maximizeRight();
422+ else if (maximizedHorizontally)
423+ maximizeHorizontally();
424+ else if (maximizedVertically)
425+ maximizeVertically();
426426
427427 focus = true;
428428 }
@@ -453,8 +453,7 @@ AbstractStage {
453453 },
454454 State {
455455 name: "normal";
456− when: !appDelegate.maximized && !appDelegate.minimized
457− && !appDelegate.maximizedLeft && !appDelegate.maximizedRight
456+ when: appDelegate.windowState == WindowStateStorage.WindowStateNormal
458457 PropertyChanges {
459458 target: appDelegate;
460459 visuallyMinimized: false;
@@ -502,13 +501,23 @@ AbstractStage {
502501 requestedHeight: appContainer.height - PanelState.panelHeight
503502 }
504503 },
504+ State {
505+ name: "maximizedHorizontally"; when: appDelegate.maximizedHorizontally && !appDelegate.minimized
506+ PropertyChanges { target: appDelegate; x: root.leftMargin }
507+ PropertyChanges { target: decoratedWindow; requestedWidth: appContainer.width - root.leftMargin }
508+ },
509+ State {
510+ name: "maximizedVertically"; when: appDelegate.maximizedVertically && !appDelegate.minimized
511+ PropertyChanges { target: appDelegate; y: PanelState.panelHeight }
512+ PropertyChanges { target: decoratedWindow; requestedHeight: appContainer.height - PanelState.panelHeight }
513+ },
505514 State {
506515 name: "minimized"; when: appDelegate.minimized
507516 PropertyChanges {
508517 target: appDelegate;
509518 x: -appDelegate.width / 2;
510519 scale: units.gu(5) / appDelegate.width;
511− opacity: 0
520+ opacity: 0;
512521 visuallyMinimized: true;
513522 visuallyMaximized: false
514523 }
@@ -611,10 +620,13 @@ AbstractStage {
611620 requestedWidth: appDelegate.requestedWidth
612621 requestedHeight: appDelegate.requestedHeight
613622
614− onClose: { appDelegate.close(); }
615− onMaximize: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
616− ? appDelegate.restoreFromMaximized() : appDelegate.maximize()
617− onMinimize: appDelegate.minimize()
623+ onCloseClicked: { appDelegate.close(); }
624+ onMaximizeClicked: appDelegate.maximized || appDelegate.maximizedLeft || appDelegate.maximizedRight
625+ || appDelegate.maximizedHorizontally || appDelegate.maximizedVertically
626+ ? appDelegate.restoreFromMaximized() : appDelegate.maximize()
627+ onMaximizeHorizontallyClicked: appDelegate.maximizedHorizontally ? appDelegate.restoreFromMaximized() : appDelegate.maximizeHorizontally()
628+ onMaximizeVerticallyClicked: appDelegate.maximizedVertically ? appDelegate.restoreFromMaximized() : appDelegate.maximizeVertically()
629+ onMinimizeClicked: appDelegate.minimize()
618630 onDecorationPressed: { appDelegate.focus = true; }
619631 }
620632
qml/Stages/WindowDecoration.qml+12−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -29,11 +29,13 @@ MouseArea {
2929 property bool active: false
3030 hoverEnabled: true
3131
32− signal close()
33− signal minimize()
34− signal maximize()
32+ signal closeClicked()
33+ signal minimizeClicked()
34+ signal maximizeClicked()
35+ signal maximizeHorizontallyClicked()
36+ signal maximizeVerticallyClicked()
3537
36− onDoubleClicked: root.maximize()
38+ onDoubleClicked: root.maximizeClicked()
3739
3840 QtObject {
3941 id: priv
@@ -84,10 +86,12 @@ MouseArea {
8486 id: buttons
8587 height: parent.height
8688 active: root.active
89+ onCloseClicked: root.closeClicked();
90+ onMinimizeClicked: root.minimizeClicked();
91+ onMaximizeClicked: root.maximizeClicked();
92+ onMaximizeHorizontallyClicked: root.maximizeHorizontallyClicked();
93+ onMaximizeVerticallyClicked: root.maximizeVerticallyClicked();
8794 closeButtonShown: root.target.application.appId !== "unity8-dash"
88− onClose: root.close();
89− onMinimize: root.minimize();
90− onMaximize: root.maximize();
9195 }
9296
9397 Label {
qml/Stages/WindowResizeArea.qml+25−5
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2014-2015 Canonical, Ltd.
2+ * Copyright (C) 2014-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -81,15 +81,35 @@ MouseArea {
8181 target.y = Qt.binding(function() { return Math.max(Math.min(windowGeometry.y, root.screenHeight - target.requestedHeight), PanelState.panelHeight); });
8282
8383 var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal)
84− if (windowState === WindowStateStorage.WindowStateMaximized) {
85− target.maximize(false)
84+ switch (windowState) {
85+ case WindowStateStorage.WindowStateNormal:
86+ break;
87+ case WindowStateStorage.WindowStateMaximized:
88+ target.maximize(false);
89+ break;
90+ case WindowStateStorage.WindowStateMaximizedLeft:
91+ target.maximizeLeft(false);
92+ break;
93+ case WindowStateStorage.WindowStateMaximizedRight:
94+ target.maximizeRight(false);
95+ break;
96+ case WindowStateStorage.WindowStateMaximizedHorizontally:
97+ target.maximizeHorizontally(false);
98+ break;
99+ case WindowStateStorage.WindowStateMaximizedVertically:
100+ target.maximizeVertically(false);
101+ break;
102+ default:
103+ console.warn("Unsupported window state");
104+ break;
86105 }
106+
87107 priv.updateNormalGeometry();
88108 }
89109
90110 function saveWindowState() {
91− windowStateStorage.saveState(root.windowId, target.state == "maximized" ? WindowStateStorage.WindowStateMaximized : WindowStateStorage.WindowStateNormal)
92− windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight))
111+ windowStateStorage.saveState(root.windowId, target.windowState & ~WindowStateStorage.WindowStateMinimized); // clear the minimized bit when saving
112+ windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight));
93113 }
94114
95115 QtObject {
tests/mocks/Utils/windowstatestorage.h+14−3
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2015 Canonical Ltd.
2+ * Copyright 2015-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU Lesser General Public License as published by
@@ -25,9 +25,20 @@ class WindowStateStorage: public QObject
2525 Q_ENUMS(WindowState)
2626public:
2727 enum WindowState {
28− WindowStateNormal,
29− WindowStateMaximized
28+ WindowStateNormal = 1 << 0,
29+ WindowStateMaximized = 1 << 1,
30+ WindowStateMinimized = 1 << 2,
31+ WindowStateFullscreen = 1 << 3,
32+ WindowStateMaximizedLeft = 1 << 4,
33+ WindowStateMaximizedRight = 1 << 5,
34+ WindowStateMaximizedHorizontally = 1 << 6,
35+ WindowStateMaximizedVertically = 1 << 7
3036 };
37+ Q_DECLARE_FLAGS(WindowStates, WindowState)
38+#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
39+ Q_FLAG(WindowStates)
40+#endif
41+
3142 WindowStateStorage(QObject *parent = 0);
3243
3344 Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
tests/qmltests/Stages/tst_DesktopStage.qml+31−1
@@ -462,6 +462,36 @@ Item {
462462 verify(topSurfaceList.indexForId(dialerSurfaceId) === -1);
463463 }
464464
465+ function test_windowMaximizeHorizontally() {
466+ var dialerDelegate = startApplication("dialer-app");
467+
468+ var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
469+ verify(dialerMaximizeButton);
470+
471+ // RMB to maximize horizontally
472+ mouseClick(dialerMaximizeButton, dialerMaximizeButton.width/2, dialerMaximizeButton.height/2, Qt.RightButton);
473+ tryCompare(dialerDelegate, "windowState", WindowStateStorage.WindowStateMaximizedHorizontally);
474+
475+ // click again to restore
476+ mouseClick(dialerMaximizeButton);
477+ tryCompare(dialerDelegate, "windowState", WindowStateStorage.WindowStateNormal);
478+ }
479+
480+ function test_windowMaximizeVertically() {
481+ var dialerDelegate = startApplication("dialer-app");
482+
483+ var dialerMaximizeButton = findChild(dialerDelegate, "maximizeWindowButton");
484+ verify(dialerMaximizeButton);
485+
486+ // MMB to maximize vertically
487+ mouseClick(dialerMaximizeButton, dialerMaximizeButton.width/2, dialerMaximizeButton.height/2, Qt.MiddleButton);
488+ tryCompare(dialerDelegate, "windowState", WindowStateStorage.WindowStateMaximizedVertically);
489+
490+ // click again to restore
491+ mouseClick(dialerMaximizeButton);
492+ tryCompare(dialerDelegate, "windowState", WindowStateStorage.WindowStateNormal);
493+ }
494+
465495 function test_smashCursorKeys() {
466496 var apps = ["dialer-app", "gmail-webapp"];
467497 apps.forEach(startApplication);
@@ -483,7 +513,7 @@ Item {
483513 verify(decoratedWindow);
484514
485515 tryCompare(dashSurface, "visible", true);
486− decoratedWindow.minimize();
516+ decoratedWindow.minimizeClicked();
487517 tryCompare(dashSurface, "visible", false);
488518 }
489519
tests/qmltests/Stages/tst_WindowResizeArea.qml+16−5
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2014-2015 Canonical Ltd.
2+ * Copyright 2014-2016 Canonical Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -24,6 +24,7 @@ import "../../../qml/Stages"
2424import Ubuntu.Components 1.3
2525import Ubuntu.Components.ListItems 1.3 as ListItem
2626import Unity.Application 0.1
27+import Utils 0.1
2728
2829Item {
2930 id: root
@@ -55,10 +56,20 @@ Item {
5556 property real maximumHeight: 0
5657 property real widthIncrement: 0
5758 property real heightIncrement: 0
58− state: "normal"
59+
60+ property int windowState: WindowStateStorage.WindowStateNormal
61+
62+ states: [
63+ State { name: "normal"; when: windowState == WindowStateStorage.WindowStateNormal },
64+ State { name: "maximized"; when: windowState == WindowStateStorage.WindowStateMaximized }
65+ ]
5966
6067 function maximize() {
61− state = "maximized"
68+ windowState = WindowStateStorage.WindowStateMaximized
69+ }
70+
71+ function restoreFromMaximized() {
72+ windowState = WindowStateStorage.WindowStateNormal
6273 }
6374
6475 WindowResizeArea {
@@ -346,7 +357,7 @@ Item {
346357 fakeWindow.y = initialWindowY + moveDelta
347358
348359 // Now change the state to maximized. The window should not keep updating the stored values
349− fakeWindow.state = "maximized"
360+ fakeWindow.maximize()
350361 fakeWindow.x = 31415 // 0 is too risky to pass the test even when broken
351362 fakeWindow.y = 31415
352363
@@ -363,7 +374,7 @@ Item {
363374 tryCompare(fakeWindow, "state", "maximized")
364375
365376 // clean up
366− fakeWindow.state = "normal"
377+ fakeWindow.restoreFromMaximized()
367378 }
368379
369380 function test_restoreMovesIntoBounds_data() {