on b0fa722 help sign in
unity8/qml/Tutorial/TutorialContent.qml
229 lines 8.1 kB history raw
1/*
2 * Copyright (C) 2013-2016 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 */
17import QtQuick 2.4
18import Ubuntu.Components 1.3
19import AccountsService 0.1
20import Unity.Application 0.1
22Item {
23 id: root
25 property Item launcher
26 property Item panel
27 property Item stage
28 property string usageScenario
29 property bool paused: true // default to true so that we won't start until top level is all ready
30 property bool delayed: true // same
31 property var lastInputTimestamp
33 readonly property bool demonstrateLauncher: !tutorialLeftLoader.skipped
34 readonly property bool launcherEnabled: !running
35 || tutorialLeftLoader.shown
36 || tutorialLeftLongLoader.shown
37 readonly property bool launcherLongSwipeEnabled: tutorialLeftLongLoader.shown
38 || tutorialLeftLongLoader.skipped
39 || paused
40 || delayed
41 readonly property bool spreadEnabled: !running || tutorialRightLoader.shown
42 readonly property bool panelEnabled: !running || tutorialTopLoader.shown
43 readonly property bool running: tutorialLeftLoader.shown
44 || tutorialLeftLongLoader.shown
45 || tutorialTopLoader.shown
46 || tutorialRightLoader.shown
48 signal finished()
50 function finish() {
51 finished();
52 }
54 ////
56 QtObject {
57 id: d
59 // We allow "" because it is briefly empty on startup, and we don't
60 // want to improperly skip any mobile tutorials.
61 property bool mobileScenario: root.usageScenario === "" ||
62 root.usageScenario === "phone" ||
63 root.usageScenario === "tablet"
65 function haveShown(tutorialId) {
66 return AccountsService.demoEdgesCompleted.indexOf(tutorialId) != -1;
67 }
69 property bool endPointsFinished: tutorialRightLoader.skipped
70 onEndPointsFinishedChanged: if (endPointsFinished) root.finish()
71 }
73 Loader {
74 id: tutorialTopLoader
75 objectName: "tutorialTopLoader"
76 anchors.fill: parent
78 readonly property bool skipped: !d.mobileScenario || d.haveShown("top")
79 readonly property bool shown: item && item.shown
80 active: !skipped || (item && item.visible)
81 onSkippedChanged: if (skipped && shown) item.hide()
83 sourceComponent: TutorialTop {
84 id: tutorialTop
85 objectName: "tutorialTop"
86 anchors.fill: parent
87 panel: root.panel
88 hides: [launcher, panel.indicators]
89 paused: root.paused
91 skipped: tutorialTopLoader.skipped
92 isReady: !skipped && !paused && !delayed
94 InactivityTimer {
95 id: tutorialTopTimer
96 objectName: "tutorialTopTimer"
97 interval: 1000
98 lastInputTimestamp: root.lastInputTimestamp
99 page: parent
100 }
102 onIsReadyChanged: if (isReady && !shown) tutorialTopTimer.start()
103 onFinished: AccountsService.markDemoEdgeCompleted("top")
104 }
105 }
107 Loader {
108 id: tutorialLeftLoader
109 objectName: "tutorialLeftLoader"
110 anchors.fill: parent
112 readonly property bool skipped: !d.mobileScenario || d.haveShown("left")
113 readonly property bool shown: item && item.shown
114 active: !skipped || (item && item.visible)
115 onSkippedChanged: {
116 console.log("SKIPPED HAS CHANGED TO " + skipped);
117 console.trace();
118 if (skipped && shown) item.hide()
119 }
121 sourceComponent: TutorialLeft {
122 id: tutorialLeft
123 objectName: "tutorialLeft"
124 anchors.fill: parent
125 launcher: root.launcher
126 hides: [launcher, panel.indicators]
127 paused: root.paused
129 isReady: !tutorialLeftLoader.skipped
130 && tutorialTopLoader.skipped
131 && !paused
132 && !delayed
134 InactivityTimer {
135 id: tutorialLeftTimer
136 objectName: "tutorialLeftTimer"
137 interval: 1000
138 lastInputTimestamp: root.lastInputTimestamp
139 page: parent
140 }
142 onIsReadyChanged: {
143 if (isReady && !shown) {
144 tutorialLeftTimer.start();
145 }
146 }
147 onFinished: AccountsService.markDemoEdgeCompleted("left")
148 }
149 }
151 Loader {
152 id: tutorialLeftLongLoader
153 objectName: "tutorialLeftLongLoader"
154 anchors.fill: parent
156 readonly property bool skipped: !d.mobileScenario || d.haveShown("left-long")
157 readonly property bool shown: item && item.shown
158 active: !skipped || (item && item.visible)
159 onSkippedChanged: if (skipped && shown) item.hide()
161 sourceComponent: TutorialLeftLong {
162 id: tutorialLeftLong
163 objectName: "tutorialLeftLong"
164 anchors.fill: parent
165 launcher: root.launcher
166 hides: [launcher, panel.indicators]
167 paused: root.paused
169 skipped: tutorialLeftLongLoader.skipped
170 isReady: tutorialLeftLoader.skipped
171 && tutorialTopLoader.skipped
172 && !skipped
173 && !paused
174 && !delayed
176 InactivityTimer {
177 id: tutorialLeftLongTimer
178 objectName: "tutorialLeftLongTimer"
179 interval: 1000
180 lastInputTimestamp: root.lastInputTimestamp
181 page: parent
182 }
184 onIsReadyChanged: if (isReady && !shown) tutorialLeftLongTimer.start()
185 onFinished: AccountsService.markDemoEdgeCompleted("left-long")
186 }
187 }
189 Loader {
190 id: tutorialRightLoader
191 objectName: "tutorialRightLoader"
192 anchors.fill: parent
194 readonly property bool skipped: d.haveShown("right")
195 readonly property bool shown: item && item.shown
196 active: !skipped || (item && item.visible)
197 onSkippedChanged: if (skipped && shown) item.hide()
199 sourceComponent: TutorialRight {
200 id: tutorialRight
201 objectName: "tutorialRight"
202 anchors.fill: parent
203 stage: root.stage
204 usageScenario: root.usageScenario
205 hides: [launcher, panel.indicators]
206 paused: root.paused
208 skipped: tutorialRightLoader.skipped
209 isReady: tutorialTopLoader.skipped
210 && tutorialLeftLoader.skipped
211 && tutorialLeftLongLoader.skipped
212 && !skipped
213 && !paused
214 && !delayed
215 && ApplicationManager.count >= 1
217 InactivityTimer {
218 id: tutorialRightTimer
219 objectName: "tutorialRightTimer"
220 interval: 1000
221 lastInputTimestamp: root.lastInputTimestamp
222 page: parent
223 }
225 onIsReadyChanged: if (isReady && !shown) tutorialRightTimer.start()
226 onFinished: AccountsService.markDemoEdgeCompleted("right")
227 }
228 }