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 }