File indexing completed on 2024-04-28 15:07:58

0001 /* GCompris - ordering.js
0002  *
0003  * SPDX-FileCopyrightText: 2021 Harsh Kumar <hadron43@yahoo.com>
0004  *
0005  * Authors:
0006  *   Harsh Kumar <hadron43@yahoo.com>
0007  *   Emmanuel Charruau <echarruau@gmail.com>
0008  *   Timothée Giet <animtim@gmail.com>
0009  *
0010  *   SPDX-License-Identifier: GPL-3.0-or-later
0011  */
0012 .pragma library
0013 .import QtQuick 2.12 as Quick
0014 .import GCompris 1.0 as GCompris
0015 .import "../../core/core.js" as Core
0016 
0017 var numberOfLevel = 0
0018 
0019 var items
0020 var mode
0021 
0022 // num[] will contain the random values
0023 var num = []
0024 var originalArrangement = []
0025 
0026 // for random datasets, we have to dynamically generate values
0027 // items.levels should be treated as read only, thus we keep a local copy
0028 var levels = []
0029 
0030 function start(items_, mode_) {
0031     items = items_
0032     mode = mode_
0033     levels = items.levels
0034 
0035     // For sentences mode, parse the sentences in the datasets
0036     if(mode === "sentences") {
0037         var datasets = []
0038         for(var level_ind in levels) {
0039             var sentences = levels[level_ind].sentences.split("\n")
0040             for(var ind in sentences) {
0041                 var obj = {
0042                     values: sentences[ind].split("|")
0043                 }
0044                 datasets.push(obj)
0045             }
0046         }
0047         levels = datasets
0048     }
0049 
0050     // For defined letters in ordering_alphabets datasets, parse the string
0051     if(mode === "alphabets") {
0052         for(var level_ind in levels) {
0053             levels[level_ind].values = levels[level_ind].string.split("|")
0054         }
0055     }
0056 
0057     numberOfLevel = levels.length
0058     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0059     initLevel()
0060 }
0061 
0062 function stop() {
0063 }
0064 
0065 function initLevel() {
0066     var numbers_asc = qsTr("Drag and drop the items in ascending order.");
0067     var numbers_desc = qsTr("Drag and drop the items in descending order.");
0068     var alphabets_asc = qsTr("Drag and drop the letters in alphabetical order.");
0069     var alphabets_desc = qsTr("Drag and drop the letters in reverse alphabetical order.");
0070     var chronology = qsTr("Drag and drop the items in chronological order.");
0071     var sentences = qsTr("Drag and drop the words to the upper box to form a meaningful sentence.");
0072 
0073     var display_instruction = "";
0074     if(levels[items.currentLevel].instruction)
0075         display_instruction = levels[items.currentLevel].instruction;
0076     else if(mode === "sentences")
0077         display_instruction = sentences;
0078     else if(mode === "chronology")
0079         display_instruction = chronology;
0080     else if(mode === "alphabets")
0081         display_instruction = (levels[items.currentLevel].mode === 'ascending') ? alphabets_asc : alphabets_desc;
0082     else if(mode === "numbers")
0083         display_instruction = (levels[items.currentLevel].mode === 'ascending') ? numbers_asc : numbers_desc;
0084 
0085     items.instruction.text = display_instruction;
0086     initGrids()
0087 }
0088 
0089 function initGrids() {
0090     generateNumbers()
0091     items.targetListModel.clear()
0092     items.originListModel.clear()
0093 
0094     for(var i = 0;i < num.length; i++) {
0095         items.originListModel.append({
0096             "elementValue" : num[i].toString(),
0097             "borderColor" : "#808080"
0098         })
0099     }
0100 }
0101 
0102 function generateNumbers() {
0103     num = []
0104     // generate a permutation of numbers from the dataset and store it in num[]
0105     if(levels[items.currentLevel].random) {
0106         var min = (mode === "alphabets") ? 1 : levels[items.currentLevel].minNumber
0107         var max = (mode === "alphabets") ? levels[items.currentLevel].values.length : levels[items.currentLevel].maxNumber
0108         var range = max - min + 1
0109         var count = 0
0110         while(count < levels[items.currentLevel].numberOfElementsToOrder) {
0111             var random = min + parseInt(Math.random() * range)
0112             if(mode === "alphabets")
0113                 random = levels[items.currentLevel].values[random-1]
0114             if(num.indexOf(random) === -1) {
0115                 // Unique element found
0116                 count++
0117                 num.push(random)
0118             }
0119         }
0120 
0121         if(mode === "numbers")
0122             num.sort(function(a, b) { return a - b })
0123         // for sorting letters we can't rely on sort default behavior, as in some languages the correct order
0124         // is not the same as Unicode UTF 16 order (issue noticed with Malayalam). Using a.localeCompare(b)
0125         // is also not reliable. So we just sort according to the reference list in the dataset.
0126         else {
0127             num.sort(function (a, b) {
0128                 if(levels[items.currentLevel].values.indexOf(a) > levels[items.currentLevel].values.indexOf(b)) {
0129                     return 1;
0130                 }
0131                 if(levels[items.currentLevel].values.indexOf(a) < levels[items.currentLevel].values.indexOf(b)) {
0132                     return -1;
0133                 }
0134                 return 0;
0135             });
0136         }
0137 
0138     }
0139     else {
0140         num = levels[items.currentLevel].values.slice();
0141     }
0142     if(levels[items.currentLevel].mode === "descending")
0143         num.reverse();
0144 
0145     originalArrangement = num.slice();
0146     num = Core.shuffle(num)
0147 }
0148 
0149 function nextLevel() {
0150     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0151     initLevel()
0152 }
0153 
0154 function previousLevel() {
0155     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0156     initLevel()
0157 }
0158 
0159 function targetColorReset() {
0160     if(!items.targetPlaceholder.colorResetRequired)
0161         return
0162 
0163     for(var i = 0 ; i < items.targetListModel.count; i++)
0164         items.targetListModel.get(i).borderColor = "#808080"
0165 
0166     items.targetPlaceholder.colorResetRequired = false
0167 }
0168 
0169 function checkOrder() {
0170     var success = true
0171     var values = originalArrangement
0172 
0173     for(var i = 0 ; i < items.targetListModel.count; i++) {
0174         if(items.targetListModel.get(i).elementValue != values[i]) {
0175             success = false
0176             items.targetListModel.get(i).borderColor = "#D94444" //red
0177         }
0178         else
0179             items.targetListModel.get(i).borderColor = "#62BA62" //green
0180     }
0181 
0182     items.targetPlaceholder.colorResetRequired = true
0183 
0184     if(success)
0185         items.bonus.good("lion")
0186     else
0187         items.bonus.bad("lion")
0188 }