@@ -34,6 +34,7 @@ import Powerd 0.1
34import Wizard 0.1 as Wizard
34import Wizard 0.1 as Wizard
36import "../../qml"
36import "../../qml"
38Rectangle {
39Rectangle {
@@ -109,19 +110,25 @@ Rectangle {
112− Rectangle {
113+ Flickable {
113 id: controls
114 id: controls
114− color: "darkgrey"
115+ contentHeight: controlRect.height
115− width: units.gu(30)
116+
116 anchors.top: root.top
117 anchors.top: root.top
117 anchors.bottom: root.bottom
118 anchors.bottom: root.bottom
118 anchors.right: root.right
119 anchors.right: root.right
124+ anchors { left: parent.left; right: parent.right }
126+ height: childrenRect.height + units.gu(2)
129+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
130+ spacing: units.gu(1)
121− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
122− spacing: units.gu(1)
124− anchors { left: parent.left; right: parent.right }
126 text: "Show Greeter"
133 text: "Show Greeter"
127 activeFocusOnPress: false
134 activeFocusOnPress: false
@@ -135,30 +142,54 @@ Rectangle {
139− ListItem.ItemSelector {
145+ ListItem.ItemSelector {
140− anchors { left: parent.left; right: parent.right }
146+ anchors { left: parent.left; right: parent.right }
141− activeFocusOnPress: false
147+ activeFocusOnPress: false
142− text: "LightDM mock mode"
148+ text: "LightDM mock mode"
143− model: ["single", "single-passphrase", "single-pin", "full"]
149+ model: ["single", "single-passphrase", "single-pin", "full"]
144− onSelectedIndexChanged: {
150+ onSelectedIndexChanged: {
145− shellLoader.active = false;
151+ shellLoader.active = false;
146− LightDM.Greeter.mockMode = model[selectedIndex];
152+ LightDM.Greeter.mockMode = model[selectedIndex];
147− LightDM.Users.mockMode = model[selectedIndex];
153+ LightDM.Users.mockMode = model[selectedIndex];
148− shellLoader.active = true;
154+ shellLoader.active = true;
151− ListItem.ItemSelector {
157+ ListItem.ItemSelector {
152− anchors { left: parent.left; right: parent.right }
158+ anchors { left: parent.left; right: parent.right }
153− activeFocusOnPress: false
159+ activeFocusOnPress: false
154− text: "Size"
160+ text: "Size"
155− model: ["phone", "tablet"]
161+ model: ["phone", "tablet"]
156− onSelectedIndexChanged: {
162+ onSelectedIndexChanged: {
157− shellLoader.active = false;
163+ shellLoader.active = false;
158− shellLoader.state = model[selectedIndex];
164+ shellLoader.state = model[selectedIndex];
159− shellLoader.active = true;
165+ shellLoader.active = true;
168+ ListItem.ItemSelector {
169+ id: usageModeSelector
170+ anchors { left: parent.left; right: parent.right }
171+ activeFocusOnPress: false
173+ model: ["Staged", "Windowed"]
174+ onSelectedIndexChanged: {
175+ GSettingsController.setUsageMode(model[selectedIndex]);
178+ MouseTouchEmulationCheckbox {
184+ Label { text: "Applications"; font.bold: true }
188+ model: ApplicationManager.availableApplications
189+ ApplicationCheckBox {
161− MouseTouchEmulationCheckbox { color: "white" }
@@ -239,6 +270,7 @@ Rectangle {
239 function cleanup() {
270 function cleanup() {
240 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
271 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
241 tearDown();
272 tearDown();
273+ GSettingsController.setUsageMode("Staged");
244 function loadShell(formFactor) {
276 function loadShell(formFactor) {
@@ -685,22 +717,57 @@ Rectangle {
686 function test_launchedAppHasActiveFocus_data() {
718 function test_launchedAppHasActiveFocus_data() {
688− {tag:"phone", formFactor:"phone"},
720+ {tag: "phone", formFactor: "phone", usageMode: "Staged"},
689− {tag:"tablet", formFactor:"tablet"},
721+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged"},
722+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed"}
693 function test_launchedAppHasActiveFocus(data) {
726 function test_launchedAppHasActiveFocus(data) {
727+ GSettingsController.setUsageMode(data.usageMode);
694 loadShell(data.formFactor);
728 loadShell(data.formFactor);
695 swipeAwayGreeter();
729 swipeAwayGreeter();
697− var dialerApp = ApplicationManager.startApplication("webbrowser-app");
731+ var webApp = ApplicationManager.startApplication("webbrowser-app");
698− verify(dialerApp);
732+ verify(webApp);
699 waitUntilAppSurfaceShowsUp("webbrowser-app")
733 waitUntilAppSurfaceShowsUp("webbrowser-app")
701− verify(dialerApp.session.surface);
735+ verify(webApp.session.surface);
737+ tryCompare(webApp.session.surface, "activeFocus", true);
740+ function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
741+ loadShell("tablet");
744+ var webApp = ApplicationManager.startApplication("webbrowser-app");
746+ waitUntilAppSurfaceShowsUp("webbrowser-app")
748+ verify(webApp.session.surface);
750+ tryCompare(webApp.session.surface, "activeFocus", true);
752+ GSettingsController.setUsageMode("Windowed");
754+ // check that the desktop stage and window have been loaded
756+ var desktopWindow = findChild(shell, "decoratedWindow_webbrowser-app");
757+ verify(desktopWindow);
760+ tryCompare(webApp.session.surface, "activeFocus", true);
762+ GSettingsController.setUsageMode("Staged");
764+ // check that the tablet stage and app surface delegate have been loaded
766+ var desktopWindow = findChild(shell, "tabletSpreadDelegate_webbrowser-app");
767+ verify(desktopWindow);
703− tryCompare(dialerApp.session.surface, "activeFocus", true);
770+ tryCompare(webApp.session.surface, "activeFocus", true);
706 function waitUntilAppSurfaceShowsUp(appId) {
773 function waitUntilAppSurfaceShowsUp(appId) {
@@ -1130,8 +1197,7 @@ Rectangle {
1130 loadShell("phone");
1197 loadShell("phone");
1131 swipeAwayGreeter();
1198 swipeAwayGreeter();
1132 AccountsService.backgroundFile = data.accounts;
1199 AccountsService.backgroundFile = data.accounts;
1133− var backgroundSettings = findInvisibleChild(shell, "backgroundSettings");
1200+ GSettingsController.setPictureUri(data.gsettings);
1134− backgroundSettings.pictureUri = data.gsettings;
1136 if (data.output === "defaultBackground") {
1202 if (data.output === "defaultBackground") {
1137 tryCompare(shell, "background", shell.defaultBackground);
1203 tryCompare(shell, "background", shell.defaultBackground);
@@ -1188,5 +1254,36 @@ Rectangle {
1188 tryCompare(passwordInput, "focus", true)
1254 tryCompare(passwordInput, "focus", true)
1258+ function test_stageLoader_data() {
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"}
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);
1273+ function test_launcherInverted_data() {
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}
1281+ function test_launcherInverted(data) {
1282+ GSettingsController.setUsageMode(data.usageMode);
1283+ loadShell(data.formFactor);
1285+ var launcher = findChild(shell, "launcher");
1286+ compare(launcher.inverted, data.launcherInverted);