main.qml 8.62 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* GCompris - main.qml
 *
 * Copyright (C) 2014 Bruno Coudoin
 *
 * Authors:
 *   Bruno Coudoin <bruno.coudoin@gcompris.net>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, see <http://www.gnu.org/licenses/>.
 */
Bruno Coudoin's avatar
Bruno Coudoin committed
21
import QtQuick 2.2
22
23
24
import QtQuick.Controls 1.2
import QtQuick.Window 2.1
import QtQuick.Dialogs 1.1
25
import QtQml 2.2
26

27
import GCompris 1.0
28
import "qrc:/gcompris/src/core/core.js" as Core
29

30
Window {
31
32
33
    id: main
    width: 800
    height: 520
34
    minimumWidth: 400
35
    minimumHeight: 400
36
    title: "GCompris"
37

38
39
40
41
42
43
44
45
46
    property var applicationState: Qt.application.state

    onApplicationStateChanged: {
        if (ApplicationInfo.isMobile && applicationState != Qt.ApplicationActive) {
            audioVoices.stop();
            audioEffects.stop();
        }
    }

47
    onClosing: Core.quit()
48

49
    GCAudio {
Bruno Coudoin's avatar
Bruno Coudoin committed
50
51
        id: audioVoices
        muted: !ApplicationSettings.isAudioVoicesEnabled
52

53
54
55
56
57
58
59
60
        Timer {
            id: delayedWelcomeTimer
            interval: 10000 /* Make sure, that playing welcome.ogg if delayed
                             * because of not yet registered voices, will only
                             * happen max 10sec after startup */
            repeat: false

            onTriggered: {
61
                DownloadManager.voicesRegistered.disconnect(playWelcome);
62
63
64
65
66
67
68
            }

            function playWelcome() {
                audioVoices.append(ApplicationInfo.getAudioFilePath("voices/$LOCALE/misc/welcome.ogg"));
            }
        }

69
        Component.onCompleted: {
70
71
            if(ApplicationSettings.isAudioEffectsEnabled)
                append("qrc:/gcompris/src/core/resource/intro.ogg")
72
73
74
75
76
77
78
79

            if (DownloadManager.areVoicesRegistered())
                delayedWelcomeTimer.playWelcome();
            else {
                DownloadManager.voicesRegistered.connect(
                        delayedWelcomeTimer.playWelcome);
                delayedWelcomeTimer.start();
            }
80
        }
Bruno Coudoin's avatar
Bruno Coudoin committed
81
82
83
84
85
    }

    GCAudio {
        id: audioEffects
        muted: !ApplicationSettings.isAudioEffectsEnabled
86
    }
87
88
89

    function playIntroVoice(name) {
        name = name.split("/")[0]
Bruno Coudoin's avatar
Bruno Coudoin committed
90
        audioVoices.append(ApplicationInfo.getAudioFilePath("voices/$LOCALE/intro/" + name + ".ogg"))
91
92
    }

93
    Component.onCompleted: {
94
95
        console.log("enter main.qml (run #" + ApplicationSettings.exeCount
                + ", ratio=" + ApplicationInfo.ratio
96
                + ", fontRatio=" + ApplicationInfo.fontRatio
97
                + ", dpi=" + Math.round(Screen.pixelDensity*25.4) + ")");
98
        if (ApplicationSettings.exeCount == 1 && !ApplicationSettings.isKioskMode) {
99
100
101
            // first run
            var buttonHandler = new Array();
            var dialog;
102
103
104
            buttonHandler[StandardButton.Yes] = function() {
                // yes -> start download
                if (DownloadManager.downloadResource(
105
                        DownloadManager.getVoicesResourceForLocale(ApplicationSettings.locale)))
106
107
108
                    var downloadDialog = Core.showDownloadDialog(main, {});
            };
            buttonHandler[StandardButton.No] = function() {};
109
110
            dialog = Core.showMessageDialog(main, qsTr("Welcome to GCompris!"),
                    qsTr("You are running GCompris for the first time."),
111
112
                    qsTr("You should verify that your application settings especially your language is set correctly, and that all language specific sound files are installed. You can do this in the Preferences Dialog.") +
                    "\n" +
113
                    qsTr("Have Fun!") +
114
                    "\n" +
115
                    qsTr("Your current language is %1 (%2).")
116
117
                        .arg(Qt.locale(ApplicationSettings.locale).nativeLanguageName)
                        .arg(ApplicationSettings.locale) +
118
119
                    "\n" +
                    qsTr("Do you want to download the corresponding sound files now?"),
120
121
122
123
124
                    StandardIcon.Information,
                    buttonHandler
            );
        }
    }
125

126
127
128
    StackView {
        id: pageView
        anchors.fill: parent
129
130
131
132
133
134
135
136
        initialItem: {
            "item": "qrc:/gcompris/src/activities/" + ActivityInfoTree.rootMenu.name,
            "properties": {
                'audioVoices': audioVoices,
                'audioEffects': audioEffects
            }
        }

137
        delegate: StackViewDelegate {
138
139
140
            id: root
            function getTransition(properties)
            {
141
                properties.exitItem.pause()
142
                audioVoices.clearQueue()
143
                if(!properties.exitItem.isDialog) {
Bruno Coudoin's avatar
Bruno Coudoin committed
144
145
146
                    if(!properties.enterItem.isDialog) {
                        playIntroVoice(properties.enterItem.activityInfo.name)
                    }
147
148
149
                    properties.enterItem.start()
                }

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
                if(properties.name === "pushTransition") {
                    if(properties.enterItem.isDialog) {
                        return pushVTransition
                    } else {
                        return pushHTransition
                    }
                } else {
                    if(properties.exitItem.isDialog) {
                        return popVTransition
                    } else {
                        return popHTransition
                    }

                }
            }

166
167
168
169
170
171
            function transitionFinished(properties)
            {
                properties.exitItem.opacity = 1
                properties.enterItem.play()
                if(!properties.enterItem.isDialog) {
                    properties.exitItem.stop()
172
                }
173
174
175
            }

            property Component pushHTransition: StackViewTransition {
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
                PropertyAnimation {
                    target: enterItem
                    property: "x"
                    from: target.width
                    to: 0
                    duration: 500
                    easing.type: Easing.OutSine
                }
                PropertyAnimation {
                    target: exitItem
                    property: "x"
                    from: 0
                    to: -target.width
                    duration: 500
                    easing.type: Easing.OutSine
                }
            }
193
194

            property Component popHTransition: StackViewTransition {
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
                PropertyAnimation {
                    target: enterItem
                    property: "x"
                    from: -target.width
                    to: 0
                    duration: 500
                    easing.type: Easing.OutSine
                }
                PropertyAnimation {
                    target: exitItem
                    property: "x"
                    from: 0
                    to: target.width
                    duration: 500
                    easing.type: Easing.OutSine
210
211
                }
            }
212

213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
            property Component pushVTransition: StackViewTransition {
                PropertyAnimation {
                    target: enterItem
                    property: "y"
                    from: -target.height
                    to: 0
                    duration: 500
                    easing.type: Easing.OutSine
                }
                PropertyAnimation {
                    target: exitItem
                    property: "y"
                    from: 0
                    to: target.height
                    duration: 500
                    easing.type: Easing.OutSine
                }
            }

            property Component popVTransition: StackViewTransition {
                PropertyAnimation {
                    target: enterItem
                    property: "y"
                    from: target.height
                    to: 0
                    duration: 500
                    easing.type: Easing.OutSine
                }
                PropertyAnimation {
                    target: exitItem
                    property: "y"
                    from: 0
                    to: -target.height
                    duration: 500
                    easing.type: Easing.OutSine
248
249
                }
            }
250
251

            property Component replaceTransition: pushHTransition
252
253
254
        }
    }
}