File indexing completed on 2024-05-19 07:29:44
0001 /* GCompris - learn_digits.js 0002 * 0003 * SPDX-FileCopyrightText: 2020 Timothée Giet <animtim@gmail.com> 0004 * 0005 * Authors: 0006 * Timothée Giet <animtim@gmail.com> 0007 * 0008 * SPDX-License-Identifier: GPL-3.0-or-later 0009 */ 0010 .pragma library 0011 .import QtQuick 2.12 as Quick 0012 .import GCompris 1.0 as GCompris 0013 .import "qrc:/gcompris/src/core/core.js" as Core 0014 0015 var numberOfLevel; 0016 var items; 0017 var operationMode; 0018 var questionsArray; 0019 var answersArray; 0020 var url = "" 0021 0022 function start(items_, operationMode_) { 0023 items = items_; 0024 operationMode = operationMode_; 0025 if(!operationMode && items.voicesEnabled) 0026 Core.checkForVoices(items_.activityPage); 0027 numberOfLevel = items.levels.length; 0028 items.currentLevel = Core.getInitialLevel(numberOfLevel); 0029 } 0030 0031 function stop() { 0032 items.audioVoices.stop(); 0033 items.audioVoices.clearQueue(); 0034 } 0035 0036 function initLevel() { 0037 items.errorRectangle.resetState(); 0038 items.circlesModel = 0 0039 items.question = 0 0040 items.questionText = "" 0041 items.answer = 0 0042 questionsArray = items.levels[items.currentLevel].questionsArray.slice(0); 0043 if(operationMode) { 0044 answersArray = items.levels[items.currentLevel].answersArray.slice(0); 0045 } 0046 items.circlesModel = items.levels[items.currentLevel].circlesModel; 0047 items.score.currentSubLevel = 0; 0048 items.nbSubLevel = questionsArray.length; 0049 if(items.mode === 2) 0050 url = "qrc:/gcompris/src/activities/learn_digits/resource/dots-"; 0051 else if(items.mode === 3) 0052 url = "qrc:/gcompris/src/activities/learn_digits/resource/hands-"; 0053 else 0054 url = ""; 0055 if(!items.iAmReady.visible) 0056 initQuestion(); 0057 if(items.selectedCircle >= 0) 0058 items.selectedCircle = 0; 0059 } 0060 0061 function nextLevel() { 0062 items.score.stopWinAnimation(); 0063 items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel); 0064 items.score.currentSubLevel = 0; 0065 initLevel(); 0066 } 0067 0068 function previousLevel() { 0069 items.score.stopWinAnimation(); 0070 items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel); 0071 items.score.currentSubLevel = 0; 0072 initLevel(); 0073 } 0074 0075 function removeLastQuestion() { 0076 if(operationMode) { 0077 for(var i = 0; i < questionsArray.length; i++) { 0078 if(questionsArray[i] === items.questionText) { 0079 questionsArray.splice(i, 1); 0080 answersArray.splice(i, 1); 0081 return; 0082 } 0083 } 0084 } else { 0085 for(var i = 0; i < questionsArray.length; i++) { 0086 if(questionsArray[i] === items.question) { 0087 questionsArray.splice(i, 1); 0088 return; 0089 } 0090 } 0091 } 0092 } 0093 0094 function initQuestion() { 0095 resetCircles(); 0096 items.answer = 0; 0097 var questionIndex = Math.floor(Math.random() * Math.floor(questionsArray.length - 1)); 0098 if(operationMode) { 0099 items.question = answersArray[questionIndex]; 0100 items.questionText = questionsArray[questionIndex]; 0101 } else { 0102 items.question = questionsArray[questionIndex]; 0103 items.questionText = items.question.toString() 0104 if(items.voicesEnabled) 0105 playLetter(items.questionText); 0106 } 0107 if(items.mode != 1) { 0108 items.imageSource = url + items.questionText + ".svg" 0109 } 0110 items.inputLocked = false; 0111 } 0112 0113 function resetCircles() { 0114 for(var i = 0; i < items.circlesLine.count; i++) { 0115 if(items.circlesLine.itemAt(i) != undefined) 0116 items.circlesLine.itemAt(i).resetCircle(); 0117 } 0118 } 0119 0120 function checkAnswer() { 0121 items.inputLocked = true 0122 if(items.answer === items.question) { 0123 ++items.score.currentSubLevel; 0124 items.score.playWinAnimation(); 0125 items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav"); 0126 removeLastQuestion(); 0127 } else { 0128 items.errorRectangle.startAnimation(); 0129 items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav"); 0130 } 0131 } 0132 0133 function nextSubLevel() { 0134 if(items.score.currentSubLevel >= items.nbSubLevel) { 0135 items.bonus.good('flower'); 0136 } else { 0137 initQuestion(); 0138 } 0139 } 0140 0141 function playLetter(letter) { 0142 var locale = GCompris.ApplicationInfo.getVoicesLocale(items.locale); 0143 var voiceFile = GCompris.ApplicationInfo.getAudioFilePath("voices-$CA/"+locale+"/alphabet/" 0144 + Core.getSoundFilenamForChar(letter)) 0145 stopVoice(); 0146 if(items.fileId.exists(voiceFile)) { 0147 items.audioVoices.append(voiceFile); 0148 } 0149 } 0150 0151 function stopVoice() { 0152 items.audioVoices.stop(); 0153 items.audioVoices.clearQueue(); 0154 } 0155 0156 function processKey(event) { 0157 if(items.inputLocked) 0158 return; 0159 if(items.iAmReady.visible) { 0160 items.iAmReady.clicked(); 0161 return; 0162 } 0163 if(event.key === Qt.Key_Right || event.key === Qt.Key_Down) { 0164 if(items.selectedCircle < items.circlesModel - 1 ) 0165 ++items.selectedCircle; 0166 else 0167 items.selectedCircle = 0; 0168 } else if(event.key === Qt.Key_Left || event.key === Qt.Key_Up) { 0169 if(items.selectedCircle > 0) 0170 --items.selectedCircle; 0171 else 0172 items.selectedCircle = items.circlesModel - 1; 0173 } else if(event.key === Qt.Key_Space) { 0174 if(items.selectedCircle >= 0) 0175 items.circlesLine.itemAt(items.selectedCircle).clickCircle(); 0176 } else if(event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { 0177 checkAnswer(); 0178 } else if(event.key === Qt.Key_Tab && !operationMode && items.voicesEnabled) { 0179 playLetter(items.question.toString()); 0180 } 0181 }