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 }