File indexing completed on 2024-05-19 11:22:42
0001 /* GCompris - spell_it.js 0002 * 0003 * Copyright (C) Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port) 0004 * 0005 * Authors: 0006 * Pascal Georges (pascal.georges1@free.fr) (GTK+ version) 0007 * Holger Kaelberer <holger.k@elberer.de> (Qt Quick port of imageid) 0008 * Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port) 0009 * Bruno Coudoin <bruno.coudoin@gcompris.net> (Integration Lang dataset) 0010 * 0011 * SPDX-License-Identifier: GPL-3.0-or-later 0012 */ 0013 .pragma library 0014 .import QtQuick 2.12 as Quick 0015 .import GCompris 1.0 as GCompris 0016 .import "qrc:/gcompris/src/core/core.js" as Core 0017 .import "qrc:/gcompris/src/activities/lang/lang_api.js" as Lang 0018 0019 var spellItems; 0020 var wordList; 0021 var remainingWords 0022 0023 // @return true if the quiz was ran 0024 function init(loadedItems_, wordList_, mode_) { 0025 spellItems = loadedItems_ 0026 wordList = wordList_ 0027 // Do not set the focus on mobile or the mobile OS keyboard will pop up 0028 // instead of ours. 0029 if(!GCompris.ApplicationInfo.isMobile) 0030 spellItems.answer.forceActiveFocus() 0031 initLevel() 0032 return true 0033 } 0034 0035 function initLevel() { 0036 remainingWords = wordList.slice(); 0037 Core.shuffle(remainingWords) 0038 0039 spellItems.score.currentSubLevel = 0 0040 spellItems.score.numberOfSubLevels = wordList.length 0041 0042 /* populate VirtualKeyboard for mobile: 0043 * 1. for < 10 letters print them all in the same row 0044 * 2. for > 10 letters create 3 rows with equal amount of keys per row 0045 * if possible, otherwise more keys in the upper rows 0046 */ 0047 // first generate a map of needed letters 0048 var letters = []; 0049 for (var i = 0; i < wordList.length; i++) { 0050 var currentWord = wordList[i].translatedTxt; 0051 for (var j = 0; j < currentWord.length; j++) { 0052 var letter = currentWord.charAt(j); 0053 0054 if(letters.indexOf(letter) === -1) 0055 letters.push(currentWord.charAt(j)); 0056 } 0057 } 0058 letters = GCompris.ApplicationInfo.localeSort(letters, spellItems.locale); 0059 // generate layout from letter map 0060 var layout = []; 0061 var row = 0; 0062 var offset = 0; 0063 while (offset < letters.length-1) { 0064 var cols = letters.length <= 10 0065 ? letters.length 0066 : (Math.ceil((letters.length-offset) / (3 - row))); 0067 layout[row] = new Array(); 0068 for (var j = 0; j < cols; j++) 0069 layout[row][j] = { label: letters[j+offset] }; 0070 offset += j; 0071 row++; 0072 } 0073 layout[row-1].push({ label: spellItems.keyboard.backspace }); 0074 spellItems.keyboard.layout = layout; 0075 0076 initSubLevel() 0077 } 0078 0079 function initSubLevel() { 0080 spellItems.goodWord = wordList[spellItems.score.currentSubLevel] 0081 spellItems.wordImage.changeSource(spellItems.goodWord.image) 0082 spellItems.hintText.changeHint(spellItems.goodWord.translatedTxt[0]) 0083 spellItems.hintText.visible = true 0084 spellItems.answer.text = "" 0085 spellItems.maximumLengthAnswer = spellItems.goodWord.translatedTxt.length + 1 0086 } 0087 0088 function nextSubLevel() { 0089 if(spellItems.score.currentSubLevel >= spellItems.score.numberOfSubLevels ) { 0090 spellItems.bonus.good("smiley") 0091 } else { 0092 initSubLevel(); 0093 } 0094 } 0095 0096 function checkAnswer(answer_) { 0097 if(spellItems.goodWord.translatedTxt == answer_) { 0098 spellItems.score.currentSubLevel++ 0099 spellItems.score.playWinAnimation() 0100 nextSubLevel() 0101 return true 0102 } 0103 else { 0104 badWordSelected(spellItems.score.currentSubLevel - 1, answer_) 0105 } 0106 } 0107 0108 // Append to the front of queue of words for the sublevel the error 0109 function badWordSelected(wordIndex, answer) { 0110 if (remainingWords[0] != wordIndex) 0111 remainingWords.unshift(wordIndex); 0112 0113 provideHint(answer) 0114 } 0115 0116 //function to construct hint based on the answer entered by user 0117 function provideHint(answer_) { 0118 var answer = answer_ 0119 var hint = "" 0120 var firstIncorrectIndex = 0 0121 0122 for (var i=0 ; i< spellItems.goodWord.translatedTxt.length; i++) { 0123 var goodChar = spellItems.goodWord.translatedTxt[i] 0124 0125 //skipping hint if the suggestion is a space 0126 if( goodChar == " ") { 0127 hint = hint + " " 0128 continue 0129 } 0130 0131 if( answer[i] == goodChar) { 0132 hint = hint + goodChar 0133 } else { 0134 if(firstIncorrectIndex == 0) { 0135 hint = hint + goodChar 0136 firstIncorrectIndex = i 0137 } else { 0138 hint = hint + "." 0139 } 0140 } 0141 0142 } 0143 spellItems.hintText.changeHint(hint) 0144 spellItems.hintText.visible = true 0145 } 0146 0147 // to handle virtual key board key press events 0148 function processKeyPress(text_){ 0149 var answer = spellItems.answer 0150 var text = text_ 0151 if ( text == spellItems.keyboard.backspace) { 0152 backspace(answer) 0153 return 0154 } 0155 answer.insert(answer.length,text) 0156 } 0157 0158 function backspace(answer) { 0159 answer.text = answer.text.slice(0, -1) 0160 if(answer.text.length === 0) { 0161 answer.text = "" 0162 } 0163 }