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

0001 /* GCompris - number_sequence.js
0002 *
0003 * SPDX-FileCopyrightText: 2014 Emmanuel Charruau
0004 *
0005 * Authors:
0006 *   Olivier Ponchaut <opvg@mailoo.org> (GTK+ version)
0007 *   Emmanuel Charruau <echarruau@gmail.com> (Qt Quick port)
0008 *
0009 *   SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 .pragma library
0012 .import QtQuick 2.12 as Quick
0013 .import GCompris 1.0 as GCompris //for ApplicationInfo
0014 .import "qrc:/gcompris/src/core/core.js" as Core
0015 
0016 var items
0017 var mode
0018 var dataset
0019 var numberOfLevel
0020 var pointPositions = []
0021 var pointPositions2 = []
0022 var linePropertiesArray = []
0023 var url
0024 
0025 function start(_items, _mode,_dataset,_url) {
0026     items = _items
0027     mode = _mode
0028     dataset = _dataset.get()
0029     url = _url
0030     numberOfLevel = dataset.length
0031     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0032     initLevel()
0033 }
0034 
0035 function stop() {
0036 }
0037 
0038 function initLevel() {
0039     items.pointIndexToClick = 0
0040     reset()
0041     loadCoordinates()
0042     loadBackgroundImage()
0043     if(mode == "drawletters" || mode == "drawnumbers") {
0044         //function to play letter sound at start
0045         playLetterSound(dataset[items.currentLevel].sound)
0046     }
0047 }
0048 
0049 function nextLevel() {
0050     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0051     initLevel();
0052 }
0053 
0054 function previousLevel() {
0055     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0056     initLevel();
0057 }
0058 
0059 //function to play the sound of character at start & end
0060 function playLetterSound(sound) {
0061     // first we clear the queue in case other voices are there, then we append the new number
0062     // if we play directly, we don't have the bonus sound (or it is truncated)
0063     items.audioVoices.clearQueue()
0064     items.audioVoices.append(sound)
0065 }
0066 
0067 function reset() {
0068     for(var i = 0; i < items.pointImageRepeater.count; i++)
0069         items.pointImageRepeater.itemAt(i).highlight = false;
0070 
0071     for(var i = 0; i < items.segmentsRepeater.count; i++)
0072         items.segmentsRepeater.itemAt(i).opacity = 0
0073 }
0074 
0075 function drawSegment(pointIndex) {
0076     if (pointIndex == items.pointIndexToClick) {
0077         var currentPoint = items.pointImageRepeater.itemAt(pointIndex)
0078         // if we need to draw only a point instead of a line
0079         if(mode == "drawletters" || mode == "drawnumbers") {
0080             currentPoint.highlight = false
0081             if(pointIndex == 0 || (pointPositions2 && pointPositions2[pointIndex] != pointPositions2[pointIndex-1])) {
0082                 currentPoint.markedAsPoint = true
0083             }
0084         }
0085 
0086         if (mode == "clickanddraw" || mode == "drawletters" || mode == "drawnumbers") {
0087             if (pointIndex < items.pointImageRepeater.count-1) {
0088                 items.pointImageRepeater.itemAt(pointIndex+1).highlight = true
0089                 items.audioEffects.play('qrc:/gcompris/src/core/resource/sounds/audioclick.wav')
0090             }
0091         }
0092 
0093         // Draw the line from pointIndex - 1 to pointIndex
0094         if(pointIndex == 0 || (pointPositions2 && pointPositions2[pointIndex] != pointPositions2[pointIndex-1])) {
0095             //do nothing
0096         }
0097         else {
0098             items.segmentsRepeater.itemAt(pointIndex-1).opacity = 1
0099         }
0100 
0101         if (pointIndex == items.pointImageRepeater.count-1) {
0102             for (var i = 1; i < dataset[items.currentLevel].coordinates.length; i++) {
0103                 items.segmentsRepeater.itemAt(i-1).opacity = 0
0104             }
0105             items.imageBack2.source = url + dataset[items.currentLevel].imageName2
0106             won()
0107         }
0108         items.pointIndexToClick++
0109     }
0110 }
0111 
0112 function loadCoordinates() {
0113     // prepare points data
0114     pointPositions = dataset[items.currentLevel].coordinates
0115     pointPositions2 = dataset[items.currentLevel].coordinates2
0116     items.pointImageRepeater.model = pointPositions
0117     if (mode == "clickanddraw" || mode == "drawletters" || mode == "drawnumbers")
0118         items.pointImageRepeater.itemAt(0).highlight = true
0119     // prepare segments data
0120     linePropertiesArray = []
0121     for (var i = 0; i < (pointPositions.length)-1; i++) {
0122         var lineProperties = []                    // properties are x1,y1,x2,y,angle rotation
0123         lineProperties[0] = pointPositions[i][0]   // x
0124         lineProperties[1] = pointPositions[i][1]   // y
0125         lineProperties[2] = pointPositions[i+1][0] // x2
0126         lineProperties[3] = pointPositions[i+1][1] // y2
0127         linePropertiesArray[i] = lineProperties
0128     }
0129     items.segmentsRepeater.model = linePropertiesArray
0130 }
0131 
0132 function loadBackgroundImage() {
0133     items.imageBack.source = url + dataset[items.currentLevel].imageName1
0134     items.imageBack2.source = url + dataset[items.currentLevel].imageName1
0135 }
0136 
0137 function won() {
0138     items.bonus.good("flower")
0139 }