@@ -34,6 +34,7 @@ import Powerd 0.1
3434import Wizard 0.1 as Wizard
3535
3636import "../../qml"
37+import "Stages"
3738
3839Rectangle {
3940 id: root
@@ -109,19 +110,25 @@ Rectangle {
109110 }
110111 }
111112
112− Rectangle {
113+ Flickable {
113114 id: controls
114− color: "darkgrey"
115− width: units.gu(30)
115+ contentHeight: controlRect.height
116+
116117 anchors.top: root.top
117118 anchors.bottom: root.bottom
118119 anchors.right: root.right
120+ width: units.gu(30)
121+
122+ Rectangle {
123+ id: controlRect
124+ anchors { left: parent.left; right: parent.right }
125+ color: "darkgrey"
126+ height: childrenRect.height + units.gu(2)
127+
128+ Column {
129+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
130+ spacing: units.gu(1)
119131
120− Column {
121− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
122− spacing: units.gu(1)
123− Row {
124− anchors { left: parent.left; right: parent.right }
125132 Button {
126133 text: "Show Greeter"
127134 activeFocusOnPress: false
@@ -135,30 +142,54 @@ Rectangle {
135142 }
136143 }
137144 }
138− }
139− ListItem.ItemSelector {
140− anchors { left: parent.left; right: parent.right }
141− activeFocusOnPress: false
142− text: "LightDM mock mode"
143− model: ["single", "single-passphrase", "single-pin", "full"]
144− onSelectedIndexChanged: {
145− shellLoader.active = false;
146− LightDM.Greeter.mockMode = model[selectedIndex];
147− LightDM.Users.mockMode = model[selectedIndex];
148− shellLoader.active = true;
145+ ListItem.ItemSelector {
146+ anchors { left: parent.left; right: parent.right }
147+ activeFocusOnPress: false
148+ text: "LightDM mock mode"
149+ model: ["single", "single-passphrase", "single-pin", "full"]
150+ onSelectedIndexChanged: {
151+ shellLoader.active = false;
152+ LightDM.Greeter.mockMode = model[selectedIndex];
153+ LightDM.Users.mockMode = model[selectedIndex];
154+ shellLoader.active = true;
155+ }
149156 }
150− }
151− ListItem.ItemSelector {
152− anchors { left: parent.left; right: parent.right }
153− activeFocusOnPress: false
154− text: "Size"
155− model: ["phone", "tablet"]
156− onSelectedIndexChanged: {
157− shellLoader.active = false;
158− shellLoader.state = model[selectedIndex];
159− shellLoader.active = true;
157+ ListItem.ItemSelector {
158+ anchors { left: parent.left; right: parent.right }
159+ activeFocusOnPress: false
160+ text: "Size"
161+ model: ["phone", "tablet"]
162+ onSelectedIndexChanged: {
163+ shellLoader.active = false;
164+ shellLoader.state = model[selectedIndex];
165+ shellLoader.active = true;
166+ }
167+ }
168+ ListItem.ItemSelector {
169+ id: usageModeSelector
170+ anchors { left: parent.left; right: parent.right }
171+ activeFocusOnPress: false
172+ text: "Usage mode"
173+ model: ["Staged", "Windowed"]
174+ onSelectedIndexChanged: {
175+ GSettingsController.setUsageMode(model[selectedIndex]);
176+ }
177+ }
178+ MouseTouchEmulationCheckbox {
179+ id: mouseEmulation
180+ checked: true
181+ color: "white"
182+ }
183+
184+ Label { text: "Applications"; font.bold: true }
185+
186+ Repeater {
187+ id: appRepeater
188+ model: ApplicationManager.availableApplications
189+ ApplicationCheckBox {
190+ appId: modelData
191+ }
160192 }
161− MouseTouchEmulationCheckbox { color: "white" }
162193 }
163194 }
164195 }
@@ -239,6 +270,7 @@ Rectangle {
239270 function cleanup() {
240271 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
241272 tearDown();
273+ GSettingsController.setUsageMode("Staged");
242274 }
243275
244276 function loadShell(formFactor) {
@@ -685,22 +717,57 @@ Rectangle {
685717
686718 function test_launchedAppHasActiveFocus_data() {
687719 return [
688− {tag:"phone", formFactor:"phone"},
689− {tag:"tablet", formFactor:"tablet"},
690− ];
720+ {tag: "phone", formFactor: "phone", usageMode: "Staged"},
721+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged"},
722+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed"}
723+ ]
691724 }
692725
693726 function test_launchedAppHasActiveFocus(data) {
727+ GSettingsController.setUsageMode(data.usageMode);
694728 loadShell(data.formFactor);
695729 swipeAwayGreeter();
696730
697− var dialerApp = ApplicationManager.startApplication("webbrowser-app");
698− verify(dialerApp);
731+ var webApp = ApplicationManager.startApplication("webbrowser-app");
732+ verify(webApp);
699733 waitUntilAppSurfaceShowsUp("webbrowser-app")
700734
701− verify(dialerApp.session.surface);
735+ verify(webApp.session.surface);
702736
703− tryCompare(dialerApp.session.surface, "activeFocus", true);
737+ tryCompare(webApp.session.surface, "activeFocus", true);
738+ }
739+
740+ function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
741+ loadShell("tablet");
742+ swipeAwayGreeter();
743+
744+ var webApp = ApplicationManager.startApplication("webbrowser-app");
745+ verify(webApp);
746+ waitUntilAppSurfaceShowsUp("webbrowser-app")
747+
748+ verify(webApp.session.surface);
749+
750+ tryCompare(webApp.session.surface, "activeFocus", true);
751+
752+ GSettingsController.setUsageMode("Windowed");
753+
754+ // check that the desktop stage and window have been loaded
755+ {
756+ var desktopWindow = findChild(shell, "decoratedWindow_webbrowser-app");
757+ verify(desktopWindow);
758+ }
759+
760+ tryCompare(webApp.session.surface, "activeFocus", true);
761+
762+ GSettingsController.setUsageMode("Staged");
763+
764+ // check that the tablet stage and app surface delegate have been loaded
765+ {
766+ var desktopWindow = findChild(shell, "tabletSpreadDelegate_webbrowser-app");
767+ verify(desktopWindow);
768+ }
769+
770+ tryCompare(webApp.session.surface, "activeFocus", true);
704771 }
705772
706773 function waitUntilAppSurfaceShowsUp(appId) {
@@ -1130,8 +1197,7 @@ Rectangle {
11301197 loadShell("phone");
11311198 swipeAwayGreeter();
11321199 AccountsService.backgroundFile = data.accounts;
1133− var backgroundSettings = findInvisibleChild(shell, "backgroundSettings");
1134− backgroundSettings.pictureUri = data.gsettings;
1200+ GSettingsController.setPictureUri(data.gsettings);
11351201
11361202 if (data.output === "defaultBackground") {
11371203 tryCompare(shell, "background", shell.defaultBackground);
@@ -1188,5 +1254,36 @@ Rectangle {
11881254 tryCompare(passwordInput, "focus", true)
11891255 }
11901256 }
1257+
1258+ function test_stageLoader_data() {
1259+ return [
1260+ {tag: "phone", source: "Stages/PhoneStage.qml", formFactor: "phone", usageMode: "Staged"},
1261+ {tag: "tablet", source: "Stages/TabletStage.qml", formFactor: "tablet", usageMode: "Staged"},
1262+ {tag: "desktop", source: "Stages/DesktopStage.qml", formFactor: "tablet", usageMode: "Windowed"}
1263+ ]
1264+ }
1265+
1266+ function test_stageLoader(data) {
1267+ GSettingsController.setUsageMode(data.usageMode);
1268+ loadShell(data.formFactor);
1269+ var stageLoader = findChild(shell, "applicationsDisplayLoader");
1270+ verify(String(stageLoader.source).indexOf(data.source) >= 0);
1271+ }
1272+
1273+ function test_launcherInverted_data() {
1274+ return [
1275+ {tag: "phone", formFactor: "phone", usageMode: "Staged", launcherInverted: true},
1276+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged", launcherInverted: true},
1277+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed", launcherInverted: false}
1278+ ]
1279+ }
1280+
1281+ function test_launcherInverted(data) {
1282+ GSettingsController.setUsageMode(data.usageMode);
1283+ loadShell(data.formFactor);
1284+
1285+ var launcher = findChild(shell, "launcher");
1286+ compare(launcher.inverted, data.launcherInverted);
1287+ }
11911288 }
11921289}