main.qml 7.76 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

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

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

    onClosing: Core.quit()
38

39
    GCAudio {
Bruno Coudoin's avatar
Bruno Coudoin committed
40
41
        id: audioVoices
        muted: !ApplicationSettings.isAudioVoicesEnabled
42

43
44
45
46
47
48
49
50
        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: {
51
                DownloadManager.voicesRegistered.disconnect(playWelcome);
52
53
54
55
56
57
58
            }

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

59
        Component.onCompleted: {
60
61
            if(ApplicationSettings.isAudioEffectsEnabled)
                append("qrc:/gcompris/src/core/resource/intro.ogg")
62
63
64
65
66
67
68
69

            if (DownloadManager.areVoicesRegistered())
                delayedWelcomeTimer.playWelcome();
            else {
                DownloadManager.voicesRegistered.connect(
                        delayedWelcomeTimer.playWelcome);
                delayedWelcomeTimer.start();
            }
70
        }
Bruno Coudoin's avatar
Bruno Coudoin committed
71
72
73
74
75
    }

    GCAudio {
        id: audioEffects
        muted: !ApplicationSettings.isAudioEffectsEnabled
76
    }
77
78
79

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

83
    Component.onCompleted: {
84
85
        console.log("enter main.qml (run #" + ApplicationSettings.exeCount
                + ", ratio=" + ApplicationInfo.ratio
86
                + ", fontRatio=" + ApplicationInfo.fontRatio
87
                + ", dpi=" + Math.round(Screen.pixelDensity*25.4) + ")");
88
89
90
91
92
93
94
        if (ApplicationSettings.exeCount == 1) {
            // first run
            var buttonHandler = new Array();
            var dialog;
            buttonHandler[StandardButton.Ok] = function() {};
            dialog = Core.showMessageDialog(main, qsTr("Welcome to GCompris!"),
                    qsTr("You are running GCompris for the first time."),
95
96
97
98
99
                    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("Your current locale is '%1'").arg(ApplicationInfo.localeShort) +
                    "\n" +
                    qsTr("Have Fun!"),
100
101
102
103
104
                    StandardIcon.Information,
                    buttonHandler
            );
        }
    }
105

106
107
108
    StackView {
        id: pageView
        anchors.fill: parent
109
110
111
112
113
114
115
116
        initialItem: {
            "item": "qrc:/gcompris/src/activities/" + ActivityInfoTree.rootMenu.name,
            "properties": {
                'audioVoices': audioVoices,
                'audioEffects': audioEffects
            }
        }

117
        delegate: StackViewDelegate {
118
119
120
            id: root
            function getTransition(properties)
            {
121
                properties.exitItem.pause()
122
                audioVoices.clearQueue()
123
                if(!properties.exitItem.isDialog) {
Bruno Coudoin's avatar
Bruno Coudoin committed
124
125
126
                    if(!properties.enterItem.isDialog) {
                        playIntroVoice(properties.enterItem.activityInfo.name)
                    }
127
128
129
                    properties.enterItem.start()
                }

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
                if(properties.name === "pushTransition") {
                    if(properties.enterItem.isDialog) {
                        return pushVTransition
                    } else {
                        return pushHTransition
                    }
                } else {
                    if(properties.exitItem.isDialog) {
                        return popVTransition
                    } else {
                        return popHTransition
                    }

                }
            }

146
147
148
149
150
151
            function transitionFinished(properties)
            {
                properties.exitItem.opacity = 1
                properties.enterItem.play()
                if(!properties.enterItem.isDialog) {
                    properties.exitItem.stop()
152
                }
153
154
155
            }

            property Component pushHTransition: StackViewTransition {
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
                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
                }
            }
173
174

            property Component popHTransition: StackViewTransition {
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
                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
190
191
                }
            }
192

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
            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
228
229
                }
            }
230
231

            property Component replaceTransition: pushHTransition
232
233
234
        }
    }
}