Warning, /education/gcompris/src/activities/gnumch-equality/Gnumch.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Gnumch.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Manuel Tondeur <manueltondeur@gmail.com> 0004 * 0005 * Authors: 0006 * Joe Neeman (spuzzzzzzz@gmail.com) (GTK+ version) 0007 * Manuel Tondeur <manueltondeur@gmail.com> (Qt Quick port) 0008 * 0009 * SPDX-License-Identifier: GPL-3.0-or-later 0010 */ 0011 import QtQuick 2.12 0012 import GCompris 1.0 0013 0014 import "../../core" 0015 import "gnumch-equality.js" as Activity 0016 0017 ActivityBase { 0018 id: activity 0019 0020 property string type 0021 property bool useMultipleDataset: false 0022 0023 focus: true 0024 0025 onStart: {} 0026 onStop: {} 0027 0028 pageComponent: Image { 0029 id: background 0030 anchors.fill: parent 0031 source: "qrc:/gcompris/src/activities/guesscount/resource/backgroundW01.svg" 0032 property bool withMonsters: false 0033 0034 function checkAnswer() { 0035 if (!muncher.movable) 0036 return 0037 0038 // Case already discovered 0039 if (!modelCells.get(muncher.index).show) { 0040 return 0041 } 0042 0043 muncher.eating = true 0044 // Set the cell invisible if it's the correct answer. 0045 if (Activity.isAnswerCorrect(muncher.index)) { 0046 modelCells.get(muncher.index).show = false 0047 if (gridPart.isLevelDone()) { 0048 stopLevel(); 0049 } 0050 } else { 0051 modelCells.get(muncher.index).show = false 0052 muncher.getCaught(muncher.index) 0053 } 0054 } 0055 0056 function nextLevel() { 0057 Activity.nextLevel(); 0058 initLevel(); 0059 } 0060 0061 function previousLevel() { 0062 Activity.previousLevel(); 0063 initLevel(); 0064 } 0065 0066 function initLevel() { 0067 topPanel.life.opacity = 1; 0068 forceActiveFocus(); 0069 Activity.initLevel(); 0070 items.operator = Activity.operator; 0071 topPanel.goal = Activity.getGoal(); 0072 stopLevel(); 0073 0074 if(useMultipleDataset) { 0075 if(items.levels[items.currentLevel].spawnMonsters) { 0076 withMonsters = true; 0077 spawningMonsters.restart(); 0078 } 0079 } 0080 else if (items.currentLevel !== 0) { 0081 withMonsters = true; 0082 spawningMonsters.restart(); 0083 } 0084 else { 0085 withMonsters = false; 0086 } 0087 } 0088 0089 function stopLevel() { 0090 monsters.destroyAll(); 0091 spawningMonsters.stop(); 0092 timerActivateWarn.stop(); 0093 } 0094 0095 signal start 0096 signal stop 0097 0098 Component.onCompleted: { 0099 dialogActivityConfig.initialize() 0100 activity.start.connect(start) 0101 activity.stop.connect(stop) 0102 } 0103 0104 QtObject { 0105 id: items 0106 property var levels: activity.datasetLoader ? activity.datasetLoader.data : "" 0107 property alias modelCells: modelCells 0108 property alias bonus: bonus 0109 property int currentLevel: activity.currentLevel 0110 property string operator 0111 } 0112 0113 onStart: { 0114 Activity.start(items, type, useMultipleDataset); 0115 initLevel(); 0116 } 0117 onStop: { 0118 spawningMonsters.stop() 0119 positionTimer.stop() 0120 timerActivateWarn.stop() 0121 monsters.destroyAll() 0122 Activity.stop() 0123 } 0124 0125 Keys.enabled: !bonus.isPlaying 0126 Keys.onRightPressed: muncher.moveTo(muncher.moveRight) 0127 Keys.onLeftPressed: muncher.moveTo(muncher.moveLeft) 0128 Keys.onDownPressed: muncher.moveTo(muncher.moveDown) 0129 Keys.onUpPressed: muncher.moveTo(muncher.moveUp) 0130 0131 Keys.onSpacePressed: { 0132 checkAnswer() 0133 } 0134 0135 Keys.onReturnPressed: { 0136 warningRect.hideWarning() 0137 } 0138 0139 // Debug utility. 0140 // Keys.onAsteriskPressed: { 0141 // nextLevel() 0142 // } 0143 0144 onWidthChanged: { 0145 positionTimer.restart() 0146 } 0147 0148 Timer { 0149 id: positionTimer 0150 0151 interval: 100 0152 0153 onTriggered: { 0154 muncher.updatePosition() 0155 var children = monsters.children 0156 for (var it = 0; it < children.length; it++) { 0157 children[it].updatePosition() 0158 } 0159 } 0160 } 0161 0162 Connections { 0163 target: warningRect.mArea 0164 onClicked: warningRect.hideWarning() 0165 } 0166 0167 Item { 0168 id: gridPart 0169 0170 width: background.width 0171 height: background.height / 7 * 6 0172 anchors.right: parent.right 0173 anchors.top: parent.top 0174 anchors.bottom: topPanel.top 0175 0176 function isLevelDone() { 0177 for (var it = 0; it < modelCells.count; it++) { 0178 if (Activity.isAnswerCorrect(it) && modelCells.get(it).show) { 0179 return false 0180 } 0181 } 0182 bonus.good("gnu") 0183 return true 0184 } 0185 0186 MultiPointTouchArea { 0187 anchors.fill: parent 0188 touchPoints: [ TouchPoint { id: point1 } ] 0189 property real startX 0190 property real startY 0191 // Workaround to avoid having 2 times the onReleased event 0192 property bool started 0193 0194 onPressed: { 0195 startX = point1.x 0196 startY = point1.y 0197 started = true 0198 } 0199 0200 onReleased: { 0201 if(!started) 0202 return false 0203 var moveX = point1.x - startX 0204 var moveY = point1.y - startY 0205 // Find the direction with the most move 0206 if(Math.abs(moveX) * ApplicationInfo.ratio > 10 && 0207 Math.abs(moveX) > Math.abs(moveY)) { 0208 if(moveX > 10 * ApplicationInfo.ratio) 0209 muncher.moveTo(muncher.moveRight) 0210 else if(moveX < -10 * ApplicationInfo.ratio) 0211 muncher.moveTo(muncher.moveLeft) 0212 else 0213 background.checkAnswer() 0214 } else if(Math.abs(moveY) * ApplicationInfo.ratio > 10 && 0215 Math.abs(moveX) < Math.abs(moveY)) { 0216 if(moveY > 10 * ApplicationInfo.ratio) 0217 muncher.moveTo(muncher.moveDown) 0218 else if(moveY < -10 * ApplicationInfo.ratio) 0219 muncher.moveTo(muncher.moveUp) 0220 else 0221 background.checkAnswer() 0222 } else { 0223 // No move, just a tap or mouse click 0224 if(point1.x > muncher.x + muncher.width) 0225 muncher.moveTo(muncher.moveRight) 0226 else if(point1.x < muncher.x) 0227 muncher.moveTo(muncher.moveLeft) 0228 else if(point1.y < muncher.y) 0229 muncher.moveTo(muncher.moveUp) 0230 else if(point1.y > muncher.y + muncher.height) 0231 muncher.moveTo(muncher.moveDown) 0232 else 0233 background.checkAnswer() 0234 } 0235 started = false 0236 } 0237 } 0238 0239 GridView { 0240 id: gridBackground 0241 0242 anchors.fill: parent 0243 cellHeight: (parent.height - 2) / 6 0244 cellWidth: (parent.width - 2) / 6 0245 interactive: false 0246 focus: false 0247 0248 model: modelCells 0249 delegate: Rectangle { 0250 width: gridBackground.cellWidth 0251 height: gridBackground.cellHeight 0252 border.color: "#373737" 0253 border.width: 2 0254 radius: 5 0255 color: "#80ffffff" 0256 } 0257 } 0258 0259 Muncher { 0260 id: muncher 0261 audioEffects: activity.audioEffects 0262 } 0263 0264 Item { 0265 id: monsters 0266 0267 function setMovable(movable) { 0268 var children = monsters.children 0269 for (var it = 0; it < children.length; it++) { 0270 children[it].movable = movable 0271 } 0272 } 0273 0274 function destroyAll() { 0275 var children = monsters.children 0276 for (var it = 0; it < children.length; it++) { 0277 children[it].destroy() 0278 } 0279 } 0280 0281 function isThereAMonster(position) { 0282 var children = monsters.children 0283 for (var it = 0; it < children.length; it++) { 0284 if (children[it].index == position) { 0285 children[it].eating = true 0286 return true 0287 } 0288 } 0289 return false 0290 } 0291 0292 function checkOtherMonster(position) { 0293 var children = monsters.children 0294 var count = 0 0295 for (var it = 0; it < children.length; it++) { 0296 if (children[it].index == position 0297 && !children[it].movingOn) { 0298 count++ 0299 if (count > 1) { 0300 children[it].opacity = 0 0301 } 0302 } 0303 } 0304 } 0305 } 0306 0307 Timer { 0308 id: spawningMonsters 0309 0310 interval: Activity.genTime() 0311 running: false 0312 repeat: true 0313 0314 onTriggered: { 0315 interval = Activity.genTime() 0316 timerActivateWarn.start() 0317 var comp = Qt.createComponent("qrc:/gcompris/src/activities/gnumch-equality/" + 0318 Activity.genMonster( 0319 ) + ".qml") 0320 if (comp.status === Component.Ready) { 0321 var direction = Math.floor(Math.random() * 4) 0322 var result = Activity.genPosition(direction, 0323 grid.cellWidth, 0324 grid.cellHeight) 0325 var reggie = comp.createObject(monsters, { 0326 audioEffects: activity.audioEffects, 0327 direction: direction, 0328 player: muncher, 0329 index: result[0], 0330 x: result[1], 0331 y: result[2] 0332 }) 0333 reggie.opacity = 1 0334 } 0335 } 0336 } 0337 0338 Timer { 0339 id: timerActivateWarn 0340 0341 interval: spawningMonsters.interval - 2000 0342 running: spawningMonsters.running 0343 0344 onTriggered: { 0345 warnMonsters.opacity = 1 0346 } 0347 } 0348 0349 GridView { 0350 id: grid 0351 0352 anchors.fill: parent 0353 cellHeight: (parent.height - 2) / 6 0354 cellWidth: (parent.width - 2) / 6 0355 interactive: false 0356 focus: false 0357 0358 model: modelCells 0359 delegate: gridDelegate.delegate 0360 } 0361 0362 CellDelegate { 0363 id: gridDelegate 0364 } 0365 0366 ListModel { 0367 id: modelCells 0368 0369 function regenCell(position) { 0370 if (type === "equality" || type === "inequality") { 0371 var terms 0372 if (items.operator === " + ") { 0373 terms = Activity.splitPlusNumber( 0374 Activity.genNumber()) 0375 } else if (items.operator === " - ") { 0376 terms = Activity.splitMinusNumber( 0377 Activity.genNumber()) 0378 } else if (items.operator === " * ") { 0379 terms = Activity.splitMultiplicationNumber( 0380 Activity.genNumber()) 0381 } else if (items.operator === " / ") { 0382 terms = Activity.splitDivisionNumber( 0383 Activity.genNumber()) 0384 } 0385 modelCells.setProperty(position, "number1", terms[0]) 0386 modelCells.setProperty(position, "number2", terms[1]) 0387 } else if (type == "multiples") { 0388 modelCells.setProperty(position, "number1", Activity.genMultiple()) 0389 } else if (type == "factors") { 0390 modelCells.setProperty(position, "number1", Activity.genFactor()) 0391 } 0392 0393 modelCells.setProperty(position, "show", true) 0394 gridPart.isLevelDone() 0395 } 0396 } 0397 } 0398 0399 DialogChooseLevel { 0400 id: dialogActivityConfig 0401 currentActivity: activity.activityInfo 0402 onClose: { 0403 home() 0404 } 0405 0406 onSaveData: { 0407 levelFolder = dialogActivityConfig.chosenLevels 0408 currentActivity.currentLevels = dialogActivityConfig.chosenLevels 0409 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels) 0410 } 0411 0412 onStartActivity: { 0413 background.stop() 0414 background.start() 0415 } 0416 } 0417 0418 TopPanel { 0419 id: topPanel 0420 goal: Activity.getGoal() 0421 } 0422 0423 WarnMonster { 0424 id: warnMonsters 0425 } 0426 0427 DialogHelp { 0428 id: dialogHelp 0429 onClose: home() 0430 } 0431 0432 Warning { 0433 id: warningRect 0434 } 0435 0436 Bonus { 0437 id: bonus 0438 0439 onStop: { 0440 if(isWin === true) 0441 parent.nextLevel(); 0442 } 0443 } 0444 } 0445 }