2 * Copyright (C) 2013-2016 Canonical, Ltd.
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.
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.
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/>.
18 import Ubuntu.Components 1.3
19 import AccountsService 0.1
20 import Unity.Application 0.1
25 property Item launcher
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 launcherEnabled: !running
34 || tutorialLeftLoader.shown
35 || tutorialLeftLongLoader.shown
36 readonly property bool launcherLongSwipeEnabled: tutorialLeftLongLoader.shown
37 || tutorialLeftLongLoader.skipped
38 readonly property bool spreadEnabled: !running || tutorialRightLoader.shown
39 readonly property bool panelEnabled: !running || tutorialTopLoader.shown
40 readonly property bool running: tutorialLeftLoader.shown
41 || tutorialLeftLongLoader.shown
42 || tutorialTopLoader.shown
43 || tutorialRightLoader.shown
56 // We allow "" because it is briefly empty on startup, and we don't
57 // want to improperly skip any mobile tutorials.
58 property bool mobileScenario: root.usageScenario === "" ||
59 root.usageScenario === "phone" ||
60 root.usageScenario === "tablet"
62 function haveShown(tutorialId) {
63 return AccountsService.demoEdgesCompleted.indexOf(tutorialId) != -1;
66 property bool endPointsFinished: tutorialRightLoader.skipped
67 onEndPointsFinishedChanged: if (endPointsFinished) root.finish()
71 id: tutorialLeftLoader
72 objectName: "tutorialLeftLoader"
75 readonly property bool skipped: !d.mobileScenario || d.haveShown("left")
76 readonly property bool shown: item && item.shown
77 active: !skipped || (item && item.visible)
78 onSkippedChanged: if (skipped && shown) item.hide()
80 sourceComponent: TutorialLeft {
82 objectName: "tutorialLeft"
84 launcher: root.launcher
85 hides: [launcher, panel.indicators]
88 isReady: !tutorialLeftLoader.skipped && !paused && !delayed
92 objectName: "tutorialLeftTimer"
94 lastInputTimestamp: root.lastInputTimestamp
98 onIsReadyChanged: if (isReady && !shown) tutorialLeftTimer.start()
99 onFinished: AccountsService.markDemoEdgeCompleted("left")
104 id: tutorialTopLoader
105 objectName: "tutorialTopLoader"
108 readonly property bool skipped: !d.mobileScenario || d.haveShown("top")
109 readonly property bool shown: item && item.shown
110 active: !skipped || (item && item.visible)
111 onSkippedChanged: if (skipped && shown) item.hide()
113 sourceComponent: TutorialTop {
115 objectName: "tutorialTop"
118 hides: [launcher, panel.indicators]
121 skipped: tutorialTopLoader.skipped
122 isReady: tutorialLeftLoader.skipped && !skipped && !paused && !delayed
126 objectName: "tutorialTopTimer"
128 lastInputTimestamp: root.lastInputTimestamp
132 onIsReadyChanged: if (isReady && !shown) tutorialTopTimer.start()
133 onFinished: AccountsService.markDemoEdgeCompleted("top")
138 id: tutorialLeftLongLoader
139 objectName: "tutorialLeftLongLoader"
142 readonly property bool skipped: !d.mobileScenario || d.haveShown("left-long")
143 readonly property bool shown: item && item.shown
144 active: !skipped || (item && item.visible)
145 onSkippedChanged: if (skipped && shown) item.hide()
147 sourceComponent: TutorialLeftLong {
149 objectName: "tutorialLeftLong"
151 launcher: root.launcher
152 hides: [launcher, panel.indicators]
155 skipped: tutorialLeftLongLoader.skipped
156 isReady: tutorialTopLoader.skipped && !skipped && !paused && !delayed
159 id: tutorialLeftLongTimer
160 objectName: "tutorialLeftLongTimer"
162 lastInputTimestamp: root.lastInputTimestamp
166 onIsReadyChanged: if (isReady && !shown) tutorialLeftLongTimer.start()
167 onFinished: AccountsService.markDemoEdgeCompleted("left-long")
172 id: tutorialRightLoader
173 objectName: "tutorialRightLoader"
176 readonly property bool skipped: d.haveShown("right")
177 readonly property bool shown: item && item.shown
178 active: !skipped || (item && item.visible)
179 onSkippedChanged: if (skipped && shown) item.hide()
181 sourceComponent: TutorialRight {
183 objectName: "tutorialRight"
186 usageScenario: root.usageScenario
187 hides: [launcher, panel.indicators]
190 skipped: tutorialRightLoader.skipped
191 isReady: tutorialTopLoader.skipped && !skipped && !paused && !delayed &&
192 ApplicationManager.count >= 4
195 id: tutorialRightTimer
196 objectName: "tutorialRightTimer"
198 lastInputTimestamp: root.lastInputTimestamp
202 onIsReadyChanged: if (isReady && !shown) tutorialRightTimer.start()
203 onFinished: AccountsService.markDemoEdgeCompleted("right")