File indexing completed on 2024-05-05 15:53:11

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 }