@@ -0,0 +1,231 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import AccountsService 0.1
18+import LightDM 0.1 as LightDM
19+import QtQuick 2.0
20+
21+Item {
22+ id: demo
23+
24+ property Item greeter
25+ property Item dash
26+ property Item launcher
27+ property Item indicators
28+ property Item underlay
29+
30+ property bool launcherEnabled: true
31+ property bool dashEnabled: true
32+ property bool panelEnabled: true
33+ property bool panelContentEnabled: true
34+
35+ property bool paused: false
36+
37+ onPausedChanged: {
38+ if (d.rightEdgeDemo) d.rightEdgeDemo.paused = paused
39+ if (d.topEdgeDemo) d.topEdgeDemo.paused = paused
40+ if (d.bottomEdgeDemo) d.bottomEdgeDemo.paused = paused
41+ if (d.leftEdgeDemo) d.leftEdgeDemo.paused = paused
42+ if (d.finalEdgeDemo) d.finalEdgeDemo.paused = paused
43+ }
44+
45+ function hideEdgeDemoInShell() {
46+ var user = LightDM.Users.data(greeter.currentIndex, LightDM.UserRoles.NameRole);
47+ AccountsService.setUserProperty(user, "demo-edges", false);
48+ d.showEdgeDemo = false;
49+ stopDemo();
50+ }
51+
52+ function hideEdgeDemoInGreeter() {
53+ // TODO: AccountsService.setUserProperty("lightdm", "demo-edges", false);
54+ d.showEdgeDemoInGreeter = false;
55+ }
56+
57+ function hideEdgeDemos() {
58+ hideEdgeDemoInGreeter();
59+ hideEdgeDemoInShell();
60+ }
61+
62+ function stopDemo() {
63+ launcherEnabled = true
64+ dashEnabled = true
65+ panelEnabled = true
66+ panelContentEnabled = true
67+ if (d.rightEdgeDemo) d.rightEdgeDemo.destroy()
68+ if (d.topEdgeDemo) d.topEdgeDemo.destroy()
69+ if (d.bottomEdgeDemo) d.bottomEdgeDemo.destroy()
70+ if (d.leftEdgeDemo) d.leftEdgeDemo.destroy()
71+ if (d.finalEdgeDemo) d.finalEdgeDemo.destroy()
72+ }
73+
74+ QtObject {
75+ id: d
76+ property Component overlay
77+ property QtObject rightEdgeDemo
78+ property QtObject topEdgeDemo
79+ property QtObject bottomEdgeDemo
80+ property QtObject leftEdgeDemo
81+ property QtObject finalEdgeDemo
82+ property bool showEdgeDemo: false
83+ property bool showEdgeDemoInGreeter: d.showEdgeDemo // TODO: AccountsService.getUserProperty("lightdm", "demo-edges")
84+
85+ onShowEdgeDemoInGreeterChanged: {
86+ if (!d.overlay && d.showEdgeDemoInGreeter) {
87+ d.overlay = Qt.createComponent("EdgeDemoOverlay.qml")
88+ startRightEdgeDemo()
89+ }
90+ }
91+ }
92+
93+ function startRightEdgeDemo() {
94+ launcherEnabled = false;
95+ demo.dashEnabled = false;
96+ demo.panelEnabled = false;
97+ demo.panelContentEnabled = false;
98+ if (demo.greeter) {
99+ d.rightEdgeDemo = d.overlay.createObject(demo.greeter, {
100+ "edge": "right",
101+ "title": i18n.tr("Right edge"),
102+ "text": i18n.tr("Try swiping from the right edge to unlock the phone"),
103+ "anchors.fill": demo.greeter,
104+ });
105+ }
106+ if (d.rightEdgeDemo) {
107+ d.rightEdgeDemo.onSkip.connect(demo.hideEdgeDemos)
108+ } else {
109+ stopDemo();
110+ }
111+ }
112+
113+ Connections {
114+ target: demo.greeter
115+
116+ function hide() {
117+ if (d.rightEdgeDemo && d.rightEdgeDemo.available) {
118+ d.rightEdgeDemo.hide()
119+ hideEdgeDemoInGreeter()
120+ startTopEdgeDemo()
121+ }
122+ }
123+
124+ onUnlocked: hide()
125+ onShownChanged: if (!greeter.shown) hide()
126+
127+ onSelected: {
128+ var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole)
129+ d.showEdgeDemo = AccountsService.getUserProperty(user, "demo-edges")
130+ }
131+ }
132+
133+ function startTopEdgeDemo() {
134+ demo.panelEnabled = true;
135+ if (demo.dash && demo.underlay) {
136+ d.topEdgeDemo = d.overlay.createObject(demo.underlay, {
137+ "edge": "top",
138+ "title": i18n.tr("Top edge"),
139+ "text": i18n.tr("Try swiping from the top edge to access the indicators"),
140+ "anchors.fill": demo.dash,
141+ });
142+ }
143+ if (d.topEdgeDemo) {
144+ d.topEdgeDemo.onSkip.connect(demo.hideEdgeDemoInShell)
145+ } else {
146+ stopDemo();
147+ }
148+ }
149+
150+ Connections {
151+ target: demo.indicators
152+ onFullyOpenedChanged: {
153+ if (d.topEdgeDemo && d.topEdgeDemo.available && demo.indicators.fullyOpened) {
154+ d.topEdgeDemo.hideNow()
155+ startBottomEdgeDemo()
156+ }
157+ }
158+ }
159+
160+ function startBottomEdgeDemo() {
161+ if (demo.indicators) {
162+ d.bottomEdgeDemo = d.overlay.createObject(demo.indicators, {
163+ "edge": "bottom",
164+ "title": i18n.tr("Close"),
165+ "text": i18n.tr("Swipe up again to close the settings screen"),
166+ "anchors.fill": demo.indicators,
167+ });
168+ }
169+ if (d.bottomEdgeDemo) {
170+ d.bottomEdgeDemo.onSkip.connect(demo.hideEdgeDemoInShell)
171+ } else {
172+ stopDemo();
173+ }
174+ }
175+
176+ Connections {
177+ target: demo.indicators
178+ onPartiallyOpenedChanged: {
179+ if (d.bottomEdgeDemo && d.bottomEdgeDemo.available && !demo.indicators.partiallyOpened && !demo.indicators.fullyOpened) {
180+ d.bottomEdgeDemo.hideNow()
181+ startLeftEdgeDemo()
182+ }
183+ }
184+ }
185+
186+ function startLeftEdgeDemo() {
187+ demo.panelEnabled = false;
188+ demo.launcherEnabled = true;
189+ if (demo.dash && demo.underlay) {
190+ d.leftEdgeDemo = d.overlay.createObject(demo.underlay, {
191+ "edge": "left",
192+ "title": i18n.tr("Left edge"),
193+ "text": i18n.tr("Swipe from the left to reveal the launcher for quick access to apps"),
194+ "anchors.fill": demo.dash,
195+ });
196+ }
197+ if (d.leftEdgeDemo) {
198+ d.leftEdgeDemo.onSkip.connect(demo.hideEdgeDemoInShell)
199+ } else {
200+ stopDemo();
201+ }
202+ }
203+
204+ Connections {
205+ target: demo.launcher
206+ onStateChanged: {
207+ if (d.leftEdgeDemo && d.leftEdgeDemo.available && launcher.state == "visible") {
208+ d.leftEdgeDemo.hide()
209+ launcher.hide()
210+ startFinalEdgeDemo()
211+ }
212+ }
213+ }
214+
215+ function startFinalEdgeDemo() {
216+ demo.launcherEnabled = false;
217+ if (demo.dash && demo.underlay) {
218+ d.finalEdgeDemo = d.overlay.createObject(demo.underlay, {
219+ "edge": "none",
220+ "title": i18n.tr("Well done"),
221+ "text": i18n.tr("You have now mastered the edge gestures and can start using the phone"),
222+ "anchors.fill": demo.dash,
223+ });
224+ }
225+ if (d.finalEdgeDemo) {
226+ d.finalEdgeDemo.onSkip.connect(demo.hideEdgeDemoInShell)
227+ } else {
228+ stopDemo();
229+ }
230+ }
231+}