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/>.
18import Lomiri.Components 1.3
19import AccountsService 0.1
20import QtMir.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 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
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
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;
69 property bool endPointsFinished: tutorialRightLoader.skipped
70 onEndPointsFinishedChanged: if (endPointsFinished) root.finish()
75 objectName: "tutorialTopLoader"
78 readonly property bool skipped: !d.mobileScenario || d.haveShown("top")
79 readonly property bool shown: item && item.shown
81 onSkippedChanged: if (skipped && shown) item.hide()
83 sourceComponent: TutorialTop {
85 objectName: "tutorialTop"
88 hides: [root.launcher, panel.indicators]
91 skipped: tutorialTopLoader.skipped
92 isReady: !skipped && !paused && !delayed
96 objectName: "tutorialTopTimer"
98 lastInputTimestamp: root.lastInputTimestamp
102 onIsReadyChanged: if (isReady && !shown) tutorialTopTimer.start()
103 onFinished: AccountsService.markDemoEdgeCompleted("top")
108 id: tutorialLeftLoader
109 objectName: "tutorialLeftLoader"
112 readonly property bool skipped: !d.mobileScenario || d.haveShown("left")
113 readonly property bool shown: item && item.shown
115 onSkippedChanged: if (skipped && shown) item.hide()
117 sourceComponent: TutorialLeft {
119 objectName: "tutorialLeft"
121 launcher: root.launcher
122 hides: [launcher, root.panel.indicators]
125 isReady: !tutorialLeftLoader.skipped
126 && tutorialTopLoader.skipped
131 id: tutorialLeftTimer
132 objectName: "tutorialLeftTimer"
134 lastInputTimestamp: root.lastInputTimestamp
139 if (isReady && !shown) {
140 tutorialLeftTimer.start();
143 onFinished: AccountsService.markDemoEdgeCompleted("left")
148 id: tutorialLeftLongLoader
149 objectName: "tutorialLeftLongLoader"
152 readonly property bool skipped: !d.mobileScenario || d.haveShown("left-drawer")
153 readonly property bool shown: item && item.shown
155 onSkippedChanged: if (skipped && shown) item.hide()
157 sourceComponent: TutorialLeftLong {
159 objectName: "tutorialLeftLong"
161 launcher: root.launcher
162 hides: [launcher, root.panel.indicators]
165 skipped: tutorialLeftLongLoader.skipped
166 isReady: tutorialLeftLoader.skipped
167 && tutorialTopLoader.skipped
173 id: tutorialLeftLongTimer
174 objectName: "tutorialLeftLongTimer"
176 lastInputTimestamp: root.lastInputTimestamp
180 onIsReadyChanged: if (isReady && !shown) tutorialLeftLongTimer.start()
181 onFinished: AccountsService.markDemoEdgeCompleted("left-drawer")
186 id: tutorialRightLoader
187 objectName: "tutorialRightLoader"
190 readonly property bool skipped: d.haveShown("right")
191 readonly property bool shown: item && item.shown
193 onSkippedChanged: if (skipped && shown) item.hide()
195 sourceComponent: TutorialRight {
197 objectName: "tutorialRight"
200 usageScenario: root.usageScenario
201 hides: [root.launcher, panel.indicators]
204 skipped: tutorialRightLoader.skipped
205 isReady: tutorialTopLoader.skipped
206 && tutorialLeftLoader.skipped
207 && tutorialLeftLongLoader.skipped
211 && ApplicationManager.count >= 1
214 id: tutorialRightTimer
215 objectName: "tutorialRightTimer"
217 lastInputTimestamp: root.lastInputTimestamp
221 onIsReadyChanged: if (isReady && !shown) tutorialRightTimer.start()
222 onFinished: AccountsService.markDemoEdgeCompleted("right")