Warning, file /education/gcompris/src/activities/learn_digits/learn_digits.js was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

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 }