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 }