main.qml 9.76 KB
Newer Older
1
2
/* GCompris - main.qml
 *
3
 * Copyright (C) 2014 Bruno Coudoin <bruno.coudoin@gcompris.net>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 *
 * 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
import QtQuick.Controls 1.0
23
import QtQuick.Window 2.1
24
import QtQml 2.2
25

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

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
 * GCompris' main QML file defining the top level window.
 * @ingroup infrastructure
 *
 * Handles application start (Component.onCompleted) and shutdown (onClosing)
 * on the QML layer.
 *
 * Contains the central GCAudio objects audio effects and audio voices.
 *
 * Contains the top level StackView presenting and animating GCompris'
 * full screen views.
 *
 * @sa BarButton, BarEnumContent
 * @inherit QtQuick.Window
 */
44
Window {
45
    id: main
46
47
48
    // Start in window mode at full screen size
    width: Screen.width
    height: Screen.height
49
50
    minimumWidth: 400 * ApplicationInfo.ratio
    minimumHeight: 400 * ApplicationInfo.ratio
51
    title: "GCompris"
52

53
54
    /// @cond INTERNAL_DOCS

55
56
57
58
59
60
61
62
63
    property var applicationState: Qt.application.state

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

64
    onClosing: Core.quit(main)
65

66
    GCAudio {
Bruno Coudoin's avatar
Bruno Coudoin committed
67
68
        id: audioVoices
        muted: !ApplicationSettings.isAudioVoicesEnabled
69

70
71
72
73
74
75
76
77
        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: {
78
                DownloadManager.voicesRegistered.disconnect(playWelcome);
79
80
81
            }

            function playWelcome() {
82
                audioVoices.append(ApplicationInfo.getAudioFilePath("voices-$CA/$LOCALE/misc/welcome.$CA"));
83
84
85
            }
        }

86
        Component.onCompleted: {
87
            if(ApplicationSettings.isAudioEffectsEnabled)
88
                append(ApplicationInfo.getAudioFilePath("qrc:/gcompris/src/core/resource/intro.$CA"))
89
90
91
92
93
94
95
96

            if (DownloadManager.areVoicesRegistered())
                delayedWelcomeTimer.playWelcome();
            else {
                DownloadManager.voicesRegistered.connect(
                        delayedWelcomeTimer.playWelcome);
                delayedWelcomeTimer.start();
            }
97
        }
Bruno Coudoin's avatar
Bruno Coudoin committed
98
99
100
101
102
    }

    GCAudio {
        id: audioEffects
        muted: !ApplicationSettings.isAudioEffectsEnabled
103
    }
104
105
106

    function playIntroVoice(name) {
        name = name.split("/")[0]
107
        audioVoices.append(ApplicationInfo.getAudioFilePath("voices-$CA/$LOCALE/intro/" + name + ".$CA"))
108
109
    }

110
    Component.onCompleted: {
111
        console.log("enter main.qml (run #" + ApplicationSettings.exeCount
112
113
114
115
116
                    + ", ratio=" + ApplicationInfo.ratio
                    + ", fontRatio=" + ApplicationInfo.fontRatio
                    + ", dpi=" + Math.round(Screen.pixelDensity*25.4)
                    + ", sharedWritablePath=" + ApplicationInfo.getSharedWritablePath()
                    + ")");
117
        if (ApplicationSettings.exeCount == 1 && !ApplicationSettings.isKioskMode) {
118
119
            // first run
            var dialog;
120
121
122
123
124
125
126
127
128
            dialog = Core.showMessageDialog(
                        main,
                        qsTr("Welcome to GCompris!") + '\n'
                        + qsTr("You are running GCompris for the first time.") + '\n'
                        + 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"
                        + qsTr("Have Fun!")
                        + "\n"
                        + qsTr("Your current language is %1 (%2).")
129
130
                          .arg(Qt.locale(ApplicationInfo.getVoicesLocale(ApplicationSettings.locale)).nativeLanguageName)
                          .arg(ApplicationInfo.getVoicesLocale(ApplicationSettings.locale))
131
132
                        + "\n"
                        + qsTr("Do you want to download the corresponding sound files now?"),
133
                        qsTr("Yes"),
134
135
                        function() {
                            if (DownloadManager.downloadResource(
136
                                        DownloadManager.getVoicesResourceForLocale(ApplicationSettings.locale)))
137
138
                                var downloadDialog = Core.showDownloadDialog(pageView.currentItem, {});
                        },
139
                        qsTr("No"), null,
140
                        function() { pageView.currentItem.focus = true }
141
142
143
            );
        }
    }
144

145
146
147
    StackView {
        id: pageView
        anchors.fill: parent
148
149
150
151
152
153
154
155
        initialItem: {
            "item": "qrc:/gcompris/src/activities/" + ActivityInfoTree.rootMenu.name,
            "properties": {
                'audioVoices': audioVoices,
                'audioEffects': audioEffects
            }
        }

Johnny Jazeix's avatar
Johnny Jazeix committed
156
157
        focus: ApplicationInfo.QTVersion >= "5.4.0"

158
        delegate: StackViewDelegate {
159
160
161
            id: root
            function getTransition(properties)
            {
162
                console.log("XXX getTransition: exitItem=" + properties.exitItem + " enterItem=" + properties.enterItem);
163
                audioVoices.clearQueue()
164
                if(!properties.exitItem.isDialog) {
Bruno Coudoin's avatar
Bruno Coudoin committed
165
166
167
                    if(!properties.enterItem.isDialog) {
                        playIntroVoice(properties.enterItem.activityInfo.name)
                    }
168
                    //properties.enterItem.start() // hkaelber // moved outside of if for configDialog -> Editor transition in balancebox
169
                }
170
171
                if (properties.enterItem.start)
                    properties.enterItem.start();
172

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
                if(properties.name === "pushTransition") {
                    if(properties.enterItem.isDialog) {
                        return pushVTransition
                    } else {
                        return pushHTransition
                    }
                } else {
                    if(properties.exitItem.isDialog) {
                        return popVTransition
                    } else {
                        return popHTransition
                    }

                }
            }

189
190
191
192
193
            function transitionFinished(properties)
            {
                properties.exitItem.opacity = 1
                if(!properties.enterItem.isDialog) {
                    properties.exitItem.stop()
194
                }
195
196
197
            }

            property Component pushHTransition: StackViewTransition {
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
                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
                }
            }
215
216

            property Component popHTransition: StackViewTransition {
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
                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
232
233
                }
            }
234

235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
            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
270
271
                }
            }
272
273

            property Component replaceTransition: pushHTransition
274
275
        }
    }
276
277

    /// @endcond
278
}