Warning, /education/gcompris/src/activities/target/Target.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - target.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Bruno coudoin <bruno.coudoin@gcompris.net> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Bruno Coudoin <bruno.coudoin@gcompris.net> (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 "target.js" as Activity 0016 0017 ActivityBase { 0018 id: activity 0019 0020 onStart: focus = true 0021 onStop: {} 0022 0023 pageComponent: Item { 0024 id: background 0025 anchors.fill: parent 0026 0027 signal start 0028 signal stop 0029 signal targetReached 0030 0031 Keys.onPressed: { 0032 if(items.currentArrow != items.nbArrow) 0033 return 0034 0035 if(bonus.isPlaying || items.inputLocked) 0036 return 0037 0038 if(event.key === Qt.Key_Backspace) { 0039 backspace() 0040 event.accepted = true 0041 } 0042 else if(event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { 0043 Activity.checkAnswer(); 0044 event.accepted = true 0045 } 0046 else if(appendText(event.text)) { 0047 event.accepted = true 0048 } 0049 } 0050 0051 Component.onCompleted: { 0052 dialogActivityConfig.initialize() 0053 activity.start.connect(start) 0054 activity.stop.connect(stop) 0055 } 0056 0057 // Add here the QML items you need to access in javascript 0058 QtObject { 0059 id: items 0060 property Item main: activity.main 0061 property alias background: background 0062 property GCSfx audioEffects: activity.audioEffects 0063 property int currentLevel: activity.currentLevel 0064 property alias bonus: bonus 0065 property alias score: score 0066 property alias errorRectangle: errorRectangle 0067 property alias targetModel: targetItem.model 0068 readonly property var levels: activity.datasetLoader.data 0069 property alias targetItem: targetItem 0070 property alias userEntry: userEntry 0071 property int currentArrow 0072 property int nbArrow 0073 property int currentSubLevel 0074 property int numberOfSubLevel 0075 property bool arrowFlying 0076 property bool inputLocked: true 0077 0078 onNbArrowChanged: { 0079 arrowRepeater.init(nbArrow) 0080 } 0081 } 0082 0083 onStart: { 0084 keyboard.populate(); 0085 Activity.start(items) 0086 } 0087 onStop: { Activity.stop() } 0088 0089 TargetItem { 0090 id: targetItem 0091 } 0092 0093 onTargetReached: { 0094 items.arrowFlying = false 0095 if(items.currentArrow == items.nbArrow) { 0096 targetItem.stop() 0097 targetItem.scoreText += " = " 0098 userEntry.text = "?" 0099 items.inputLocked = false 0100 } 0101 } 0102 0103 Arrow { 0104 id: arrowRepeater 0105 } 0106 0107 Image { 0108 id: cross 0109 anchors.centerIn: parent 0110 source: Activity.url + "cross.svg" 0111 opacity: items.currentArrow != items.nbArrow ? 1 : 0 0112 sourceSize.width: 50 * ApplicationInfo.ratio 0113 } 0114 0115 MouseArea { 0116 id: mouseArea 0117 anchors.fill: parent 0118 enabled: items.currentArrow != items.nbArrow && !items.arrowFlying && !items.inputLocked 0119 onClicked: { 0120 activity.audioEffects.play(Activity.url + 'arrow.wav') 0121 items.arrowFlying = true 0122 if(items.currentArrow != items.nbArrow) { 0123 arrowRepeater.itemAt(items.currentArrow).opacity = 1 0124 arrowRepeater.itemAt(items.currentArrow++).scale = 1 0125 } 0126 } 0127 } 0128 0129 GCText { 0130 id: scoreItem 0131 anchors.horizontalCenter: parent.horizontalCenter 0132 width: parent.width 0133 text: targetItem.scoreText 0134 fontSize: 22 0135 font.bold: true 0136 style: Text.Outline 0137 styleColor: "black" 0138 color: "white" 0139 wrapMode: Text.WordWrap 0140 horizontalAlignment: Text.AlignHCenter 0141 } 0142 0143 function backspace() { 0144 userEntry.text = userEntry.text.slice(0, -1) 0145 if(userEntry.text.length === 0) { 0146 userEntry.text = "?" 0147 } 0148 } 0149 0150 function appendText(text) { 0151 if(items.inputLocked) 0152 return false 0153 0154 if(text === keyboard.backspace) { 0155 backspace() 0156 return true 0157 } 0158 0159 var number = parseInt(text) 0160 if(isNaN(number)) 0161 return false 0162 0163 if(userEntry.text === "?") { 0164 userEntry.text = "" 0165 } 0166 0167 if(userEntry.text.length > ('' + targetItem.scoreTotal).length) { 0168 return false 0169 } 0170 0171 userEntry.text += text 0172 return true 0173 } 0174 0175 GCText { 0176 id: userEntry 0177 anchors.top: scoreItem.bottom 0178 width: parent.width 0179 fontSize: 22 0180 font.bold: true 0181 style: Text.Outline 0182 styleColor: "black" 0183 color: "white" 0184 wrapMode: Text.WordWrap 0185 horizontalAlignment: Text.AlignHCenter 0186 } 0187 0188 BarButton { 0189 id: okButton 0190 source: "qrc:/gcompris/src/core/resource/bar_ok.svg" 0191 sourceSize.width: 60 * ApplicationInfo.ratio 0192 anchors.bottom: bar.top 0193 anchors.bottomMargin: 20 * ApplicationInfo.ratio 0194 anchors.right: parent.right 0195 anchors.rightMargin: 10 * ApplicationInfo.ratio 0196 mouseArea.enabled: !items.inputLocked 0197 visible: items.currentArrow == items.nbArrow 0198 onClicked: { 0199 Activity.checkAnswer(); 0200 } 0201 } 0202 0203 ErrorRectangle { 0204 id: errorRectangle 0205 anchors.fill: userEntry 0206 imageSize: height * 0.75 0207 function releaseControls() { items.inputLocked = false; } 0208 } 0209 0210 VirtualKeyboard { 0211 id: keyboard 0212 anchors.bottom: parent.bottom 0213 anchors.horizontalCenter: parent.horizontalCenter 0214 hide: items.currentArrow == items.nbArrow ? false : true 0215 enabled: visible && !items.inputLocked 0216 0217 function populate() { 0218 layout = [ 0219 [ 0220 { label: "0" }, 0221 { label: "1" }, 0222 { label: "2" }, 0223 { label: "3" }, 0224 { label: "4" }, 0225 { label: "5" }, 0226 { label: "6" }, 0227 { label: "7" }, 0228 { label: "8" }, 0229 { label: "9" }, 0230 { label: keyboard.backspace } 0231 ] ] 0232 } 0233 onKeypress: background.appendText(text) 0234 0235 onError: console.log("VirtualKeyboard error: " + msg); 0236 } 0237 0238 DialogChooseLevel { 0239 id: dialogActivityConfig 0240 currentActivity: activity.activityInfo 0241 0242 onSaveData: { 0243 levelFolder = dialogActivityConfig.chosenLevels 0244 currentActivity.currentLevels = dialogActivityConfig.chosenLevels 0245 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels) 0246 } 0247 onClose: { 0248 home() 0249 } 0250 onStartActivity: { 0251 background.stop() 0252 background.start() 0253 } 0254 } 0255 0256 DialogHelp { 0257 id: dialogHelp 0258 onClose: home() 0259 } 0260 0261 Bar { 0262 id: bar 0263 level: items.currentLevel + 1 0264 anchors.bottom: keyboard.top 0265 content: BarEnumContent { value: help | home | level | activityConfig } 0266 onHelpClicked: { 0267 displayDialog(dialogHelp) 0268 } 0269 onActivityConfigClicked: { 0270 displayDialog(dialogActivityConfig) 0271 } 0272 onPreviousLevelClicked: Activity.previousLevel() 0273 onNextLevelClicked: Activity.nextLevel() 0274 onHomeClicked: activity.home() 0275 } 0276 0277 Score { 0278 id: score 0279 anchors.right: parent.right 0280 anchors.top: parent.top 0281 anchors.bottom: undefined 0282 currentSubLevel: 0 0283 numberOfSubLevels: items.numberOfSubLevel 0284 onStop: Activity.nextSubLevel() 0285 } 0286 0287 Bonus { 0288 id: bonus 0289 Component.onCompleted: win.connect(Activity.nextLevel) 0290 } 0291 } 0292 }