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

0001 /* GCompris - enumerate.js
0002 *
0003 * SPDX-FileCopyrightText: 2014 Thib ROMAIN <thibrom@gmail.com>
0004 *
0005 * Authors:
0006 *   Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version)
0007 *   Thib ROMAIN <thibrom@gmail.com> (Qt Quick port)
0008 *
0009 *   SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 .pragma library
0012 .import QtQuick 2.12 as Quick
0013 .import "qrc:/gcompris/src/core/core.js" as Core
0014 
0015 var url = "qrc:/gcompris/src/activities/enumerate/resource/";
0016 var url2 = "qrc:/gcompris/src/activities/algorithm/resource/";
0017 var items;
0018 var maxSubLevel;
0019 var dataset;
0020 var numberOfLevel;
0021 var numberOfItemType;
0022 var numberOfItemMax;
0023 var itemIcons = [
0024             url2 + "apple.svg",
0025             url2 + "banana.svg",
0026             url2 + "cherries.svg",
0027             url + "grapes.svg",
0028             url2 + "lemon.svg",
0029             url2 + "orange.svg",
0030             url + "peach.svg",
0031             url2 + "pear.svg",
0032             url2 + "plum.svg",
0033             url + "strawberry.svg",
0034             url + "watermelon.svg",
0035         ];
0036 var numberOfTypes = itemIcons.length;
0037 var userAnswers = new Array();
0038 var answerToFind = new Array();
0039 var answersMode;
0040 var lockKeyboard = true;
0041 
0042 
0043 // We keep a globalZ across all items. It is increased on each
0044 // item selection to put it on top
0045 var globalZ = 0;
0046 
0047 function start(items_) {
0048     items = items_;
0049     answersMode = items.mode;
0050     dataset = items.levels;
0051     numberOfLevel = dataset.length;
0052     items.currentLevel = Core.getInitialLevel(numberOfLevel);
0053     initLevel();
0054 }
0055 
0056 function stop() {
0057     cleanUp();
0058 }
0059 
0060 function initLevel() {
0061     if(items.levels) {
0062         items.instructionText = items.levels[items.currentLevel].objective;
0063         items.instruction.opacity = 0.8;
0064     }
0065     items.score.currentSubLevel = 0;
0066     numberOfItemType = dataset[items.currentLevel].numberOfItemType;
0067     numberOfItemMax = dataset[items.currentLevel].numberOfItemMax;
0068     maxSubLevel = dataset[items.currentLevel].sublevels;
0069     items.score.numberOfSubLevels = maxSubLevel;
0070     initSubLevel();
0071 }
0072 
0073 function nextLevel() {
0074     items.score.stopWinAnimation();
0075     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0076     initLevel();
0077 }
0078 
0079 function previousLevel() {
0080     items.score.stopWinAnimation();
0081     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0082     initLevel();
0083 }
0084 
0085 function cleanUp() {
0086     userAnswers = new Array();
0087     answerToFind = new Array();
0088     items.answerColumn.model = null;
0089     items.itemListModel = null;
0090 }
0091 
0092 function setUserAnswer(imgPath, userValue) {
0093     userAnswers[imgPath] = userValue;
0094     if (answersMode === 1) {
0095         return userAnswers[imgPath] === answerToFind[imgPath];
0096     }
0097 }
0098 
0099 function checkAnswersAuto() {
0100     for (var key in answerToFind) {
0101         if(userAnswers[key] !== answerToFind[key]) {
0102             return;
0103         }
0104     }
0105     items.buttonsBlocked = true;
0106     items.score.currentSubLevel += 1;
0107     items.score.playWinAnimation();
0108     items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav");
0109 }
0110 
0111 function checkAnswers() {
0112     items.okButton.enabled = false;
0113     var i = 0;
0114     var isAnswerGood =  true;
0115     for (var key in answerToFind) {
0116         if(userAnswers[key] !== answerToFind[key]) {
0117             items.answerColumn.itemAt(i).state = "badAnswer";
0118             isAnswerGood = false;
0119         }
0120         else
0121             items.answerColumn.itemAt(i).state = "goodAnswer";
0122          i++;
0123     }
0124 
0125     if(isAnswerGood) {
0126         items.buttonsBlocked = true;
0127         items.score.currentSubLevel += 1;
0128         items.score.playWinAnimation();
0129         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav");
0130     } else {
0131         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav");
0132         items.errorRectangle.startAnimation();
0133     }
0134 }
0135 
0136 function resetAnswerAreaColor() {
0137      for(var i = 0; i < numberOfItemType; i++ )
0138          items.answerColumn.itemAt(i).state = "default";
0139 }
0140 
0141 function getRandomInt(min, max) {
0142     return Math.floor(Math.random() * (max - min + 1) + min);
0143 }
0144 
0145 var currentAnswerItem;
0146 
0147 function registerAnswerItem(item) {
0148     currentAnswerItem = item;
0149     item.forceActiveFocus();
0150 }
0151 
0152 function initSubLevel() {
0153     items.errorRectangle.resetState()
0154     cleanUp();
0155     itemIcons = Core.shuffle(itemIcons);
0156     items.okButton.enabled = false;
0157     var enumItems = new Array();
0158     var types = new Array();
0159     for(var type = 0; type < numberOfItemType; type++) {
0160         var nbItems = getRandomInt(1, numberOfItemMax);
0161         for(var j = 0; j < nbItems; j++) {
0162             enumItems.push(itemIcons[type]);
0163         }
0164         answerToFind[itemIcons[type]] = nbItems;
0165         types.push(itemIcons[type]);
0166     }
0167     items.answerColumn.model = types;
0168     items.itemListModel = enumItems;
0169     lockKeyboard = false;
0170     items.buttonsBlocked = false;
0171 }
0172 
0173 function nextSubLevel() {
0174     lockKeyboard = true;
0175     if( items.score.currentSubLevel >= maxSubLevel) {
0176         items.okButton.enabled = false;
0177         items.bonus.good("smiley");
0178     }
0179     else
0180         initSubLevel();
0181 }
0182 
0183 function enableOkButton() {
0184     for (var key in answerToFind) {
0185         if(typeof userAnswers[key] == 'undefined')
0186             return;
0187     }
0188     items.okButton.enabled = true;
0189 }
0190 
0191 function playAudio() {
0192     items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/win.wav");
0193 }
0194 
0195 function focusAnswerInput() {
0196     if(items && items.answerColumn) {
0197         registerAnswerItem(items.answerColumn.itemAt(items.answerColumn.currentIndex));
0198     }
0199 }