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 &&
157 ApplicationManager.focusedApplicationId != "unity8-dash"
160 id: tutorialLeftLongTimer
161 objectName: "tutorialLeftLongTimer"
163 lastInputTimestamp: root.lastInputTimestamp
167 onIsReadyChanged: if (isReady && !shown) tutorialLeftLongTimer.start()
168 onFinished: AccountsService.markDemoEdgeCompleted("left-long")
173 id: tutorialRightLoader
174 objectName: "tutorialRightLoader"
177 readonly property bool skipped: d.haveShown("right")
178 readonly property bool shown: item && item.shown
179 active: !skipped || (item && item.visible)
180 onSkippedChanged: if (skipped && shown) item.hide()
182 sourceComponent: TutorialRight {
184 objectName: "tutorialRight"
187 usageScenario: root.usageScenario
188 hides: [launcher, panel.indicators]
191 skipped: tutorialRightLoader.skipped
192 isReady: tutorialTopLoader.skipped && !skipped && !paused && !delayed &&
193 ApplicationManager.count >= 4
196 id: tutorialRightTimer
197 objectName: "tutorialRightTimer"
199 lastInputTimestamp: root.lastInputTimestamp
203 onIsReadyChanged: if (isReady && !shown) tutorialRightTimer.start()
204 onFinished: AccountsService.markDemoEdgeCompleted("right")