File indexing completed on 2024-04-28 15:07:52
0001 /* GCompris - graph-coloring.js 0002 * 0003 * Copyright (C) Akshat Tandon <akshat.tandon@research.iiit.ac.in> 0004 * 0005 * Authors: 0006 * 0007 * Akshat Tandon <akshat.tandon@research.iiit.ac.in> (Qt Quick version) 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 items 0016 var url = "qrc:/gcompris/src/activities/graph-coloring/resource/" 0017 var coloringLeft 0018 var colors = [ 0019 "#FF0000FF", // dark blue 0020 "#FF00FF00", // light green 0021 "#FFFF0000", // red 0022 "#FF00FFFF", // light blue 0023 "#FFFF00FF", // magenta 0024 "#FFFFFF00", // yellow 0025 "#FF8e7016", // brown 0026 "#FF04611a", // dark green 0027 "#FFa0174b" // dark magenta 0028 ]; 0029 0030 var symbols = [ 0031 url + "shapes/" + "star.svg", 0032 url + "shapes/" + "triangle.svg", 0033 url + "shapes/" + "heart.svg", 0034 url + "shapes/" + "cloud.svg", 0035 url + "shapes/" + "diamond.svg", 0036 url + "shapes/" + "star_simple.svg", 0037 url + "shapes/" + "cross.svg", 0038 url + "shapes/" + "ring.svg", 0039 url + "shapes/" + "circle.svg", 0040 ]; 0041 0042 var graphs = [ 0043 { 0044 minColor:3, 0045 edgeList:[ 0046 [0, 1], [0, 4], [1, 4], [1, 2], [1, 3], [2, 3] 0047 ], 0048 nodePositions : [ 0049 [0, 0], [0.5, 0.4], [1, 0], [1, 0.7], [0, 0.7] 0050 ] 0051 }, 0052 { 0053 0054 minColor: 3, 0055 edgeList:[ 0056 [0, 1], [0, 3], [1, 2], [1, 3], [2, 3] 0057 ], 0058 nodePositions : [ 0059 [0, 0.4], [0.5, 0], [1, 0.4], [0.5, 0.8] 0060 ] 0061 }, 0062 { 0063 0064 minColor: 4, 0065 edgeList:[ 0066 [0, 1], [0, 2], [0, 3], 0067 [1, 2], [1, 3], 0068 [2, 3] 0069 ], 0070 nodePositions : [ 0071 [0.628, 0.401], 0072 [0.083, 0.401], 0073 [0.900, 0.030], 0074 [0.900, 0.773] 0075 ] 0076 0077 }, 0078 { 0079 0080 minColor: 3, 0081 edgeList:[ 0082 [0,1], [1,2], [2,3], [3,4], [4,0], [5,7], 0083 [7,9], [9,6], [6,8], [8,5], [0,5], [1,6], 0084 [2,7], [3,8], [4,9] 0085 ], 0086 nodePositions : [ 0087 [0.5,0], [0.90,0.35], [0.80,0.80], 0088 [0.20, 0.80], [0.10, 0.35], [0.5,0.20], 0089 [0.75,0.45], [0.65, 0.65], [0.35, 0.65], [0.25, 0.45] 0090 ] 0091 0092 }, 0093 { 0094 0095 minColor: 5, 0096 edgeList: [ 0097 [5, 1], 0098 [5, 0], 0099 [0, 3], 0100 [0, 1], 0101 [0, 2], 0102 [2, 4], 0103 [2, 1], 0104 [3, 4], 0105 [3, 2], 0106 [4, 1], 0107 [5, 4], 0108 [5, 3] 0109 ], 0110 nodePositions : [ 0111 [0.75, 0.00], 0112 [0.75, 0.80], 0113 [1.00, 0.40], 0114 [0.25, 0.00], 0115 [0.25, 0.80], 0116 [0.00, 0.40] 0117 ] 0118 0119 }, 0120 { 0121 0122 minColor: 3, 0123 edgeList: [ 0124 [5, 4], 0125 [2, 0], 0126 [0, 1], 0127 [1, 5], 0128 [4, 3], 0129 [3, 2], 0130 [0, 11], 0131 [1, 6], 0132 [7, 5], 0133 [3, 9], 0134 [8, 4], 0135 [2, 10], 0136 [11, 9], 0137 [7, 9], 0138 [11, 7], 0139 [6, 8], 0140 [10, 8], 0141 [6, 10] 0142 ], 0143 nodePositions : [ 0144 [0.26, 0.00], 0145 [0.74, 0.00], 0146 [0.00, 0.40], 0147 [0.26, 0.80], 0148 [0.74, 0.80], 0149 [1.00, 0.40], 0150 [0.62, 0.26], 0151 [0.74, 0.40], 0152 [0.62, 0.64], 0153 [0.38, 0.64], 0154 [0.26, 0.40], 0155 [0.38, 0.26] 0156 ] 0157 }, 0158 { 0159 0160 minColor: 4, 0161 edgeList: [ 0162 [0, 8], 0163 [0, 4], 0164 [3, 6], 0165 [10, 3], 0166 [2, 11], 0167 [7, 2], 0168 [9, 1], 0169 [5, 1], 0170 [0, 1], 0171 [1, 2], 0172 [4, 6], 0173 [8, 9], 0174 [10, 11], 0175 [0, 3], 0176 [3, 2], 0177 [8, 11], 0178 [10, 9], 0179 [4, 7], 0180 [5, 7], 0181 [6, 5], 0182 [6, 9], 0183 [10, 5], 0184 [4, 11], 0185 [8, 7] 0186 ], 0187 nodePositions : [ 0188 [0.00, 0.00], 0189 [1.00, 0.00], 0190 [1.00, 0.80], 0191 [0.00, 0.80], 0192 [0.32, 0.32], 0193 [0.74, 0.32], 0194 [0.32, 0.53], 0195 [0.74, 0.53], 0196 [0.42, 0.22], 0197 [0.63, 0.22], 0198 [0.42, 0.64], 0199 [0.63, 0.64] 0200 ] 0201 } 0202 ] 0203 0204 var levels = [ 0205 {extraColor:1, graph:graphs[0]}, 0206 {extraColor:0, graph:graphs[0]}, 0207 {extraColor:1, graph:graphs[1]}, 0208 {extraColor:0, graph:graphs[1]}, 0209 {extraColor:1, graph:graphs[2]}, 0210 {extraColor:0, graph:graphs[2]}, 0211 {extraColor:1, graph:graphs[3]}, 0212 {extraColor:0, graph:graphs[3]}, 0213 {extraColor:1, graph:graphs[4]}, 0214 {extraColor:0, graph:graphs[4]}, 0215 {extraColor:1, graph:graphs[5]}, 0216 {extraColor:0, graph:graphs[5]}, 0217 {extraColor:1, graph:graphs[6]}, 0218 {extraColor:0, graph:graphs[6]} 0219 ]; 0220 0221 var numberOfLevel = levels.length 0222 0223 function start(items_) { 0224 items = items_ 0225 items.currentLevel = Core.getInitialLevel(numberOfLevel) 0226 initLevel() 0227 } 0228 0229 function stop() { 0230 } 0231 0232 function initLevel() { 0233 coloringLeft = true 0234 var currentIndeces = new Array(); 0235 var levelData = levels[items.currentLevel].graph 0236 items.colorsRepeater.model.clear(); 0237 items.nodesRepeater.model.clear(); 0238 items.edgesRepeater.model.clear(); 0239 var numColors = levelData.minColor + levels[items.currentLevel].extraColor; 0240 for (var i = 0; i < numColors; ++i) { 0241 currentIndeces[i] = i; 0242 items.colorsRepeater.model.append({"itemIndex": i}); 0243 } 0244 items.chooserGrid.model = currentIndeces 0245 for (var i = 0; i < levelData.nodePositions.length; ++i){ 0246 items.nodesRepeater.model.append({ 0247 "posX":levelData.nodePositions[i][0], 0248 "posY":levelData.nodePositions[i][1], 0249 "colIndex": -1, 0250 "highlight": false 0251 }); 0252 } 0253 for (var i = 0; i < levelData.edgeList.length; ++i){ 0254 var node1 = levelData.edgeList[i][0] 0255 var node2 = levelData.edgeList[i][1] 0256 items.edgesRepeater.model.append({ 0257 "xp": levelData.nodePositions[node1][0], 0258 "yp": levelData.nodePositions[node1][1], 0259 "xpp": levelData.nodePositions[node2][0], 0260 "ypp": levelData.nodePositions[node2][1], 0261 "highlight": false 0262 }); 0263 } 0264 if(items.keyNavigationMode) { 0265 items.nodeHighlight.setHighlight(0); 0266 } 0267 } 0268 0269 function checkGuess() { 0270 var flag = false; 0271 var levelData = levels[items.currentLevel].graph 0272 //Check whether all the nodes have been colored or not 0273 for (var i = 0; i < levelData.nodePositions.length; i++){ 0274 var node1 = items.nodesRepeater.model.get(i) 0275 if (node1.colIndex == -1){ 0276 flag = true; 0277 break; 0278 } 0279 } 0280 0281 //Check whether the adjacent nodes do not have the same color 0282 for (var i = 0; i < levelData.edgeList.length; i++){ 0283 var node1 = items.nodesRepeater.model.get(levelData.edgeList[i][0]) 0284 var node2 = items.nodesRepeater.model.get(levelData.edgeList[i][1]) 0285 //console.log("node1 " + levelData.edgeList[i][0] + " node2 "+ levelData.edgeList[i][1]+" node1 color "+ node1.colIndex+ " node2 color " + node2.colIndex); 0286 if (node1.colIndex == node2.colIndex) { 0287 //console.log("node1 " + levelData.edgeList[i][0] + " node2 "+ levelData.edgeList[i][1]+" node1 color "+ node1.colIndex+ " node2 color " + node2.colIndex); 0288 flag = true; 0289 break; 0290 } 0291 } 0292 //console.log("flag is " + flag); 0293 if (flag == false) { 0294 items.bonus.good("lion"); 0295 } 0296 } 0297 0298 function checkAdjacent() { 0299 var levelData = levels[items.currentLevel].graph 0300 var flagNodes = new Array(levelData.nodePositions.length) 0301 for (var i = 0; i < levelData.nodePositions.length; i++){ 0302 flagNodes[i] = false 0303 } 0304 0305 for (var i = 0; i < levelData.edgeList.length; i++){ 0306 0307 var node1 = items.nodesRepeater.model.get(levelData.edgeList[i][0]) 0308 var node1Num = levelData.edgeList[i][0] 0309 var node2 = items.nodesRepeater.model.get(levelData.edgeList[i][1]) 0310 var node2Num = levelData.edgeList[i][1] 0311 if (node1.colIndex == node2.colIndex && node2.colIndex != -1) { 0312 items.nodesRepeater.model.setProperty(node1Num, "highlight", true) 0313 items.nodesRepeater.model.setProperty(node2Num, "highlight", true) 0314 items.edgesRepeater.model.setProperty(i, "highlight", true) 0315 flagNodes[node1Num] = true 0316 flagNodes[node2Num] = true 0317 } 0318 else { 0319 if(!flagNodes[node1Num]) { 0320 items.nodesRepeater.model.setProperty(node1Num, "highlight", false) 0321 } 0322 if(!flagNodes[node2Num]) { 0323 items.nodesRepeater.model.setProperty(node2Num, "highlight", false) 0324 } 0325 items.edgesRepeater.model.setProperty(i, "highlight", false) 0326 0327 } 0328 0329 } 0330 0331 } 0332 0333 function nextLevel() { 0334 items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel); 0335 initLevel(); 0336 } 0337 0338 function previousLevel() { 0339 items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel); 0340 initLevel(); 0341 } 0342 0343 function focusEventInput() { 0344 if (items && items.eventHandler) 0345 items.eventHandler.forceActiveFocus(); 0346 }