Warning, /education/gcompris/src/activities/enumerate/Enumerate.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Enumerate.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Thib ROMAIN <thibrom@gmail.com> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Thib ROMAIN <thibrom@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 import "." 0014 0015 import "../../core" 0016 import "enumerate.js" as Activity 0017 0018 ActivityBase { 0019 id: activity 0020 0021 onStart: { focus: true } 0022 onStop: {} 0023 0024 // When opening a dialog, it steals the focus and re set it to the activity. 0025 // We need to set it back to the answerColumn item in order to have key events. 0026 onFocusChanged: { 0027 if(focus) { 0028 Activity.focusAnswerInput(); 0029 } 0030 } 0031 0032 pageComponent: Image { 0033 id: background 0034 anchors.fill: parent 0035 signal start 0036 signal stop 0037 fillMode: Image.PreserveAspectCrop 0038 source: Activity.url + "background.svg" 0039 sourceSize.width: width 0040 sourceSize.height: height 0041 0042 Component.onCompleted: { 0043 dialogActivityConfig.initialize() 0044 activity.start.connect(start) 0045 activity.stop.connect(stop) 0046 } 0047 onStart: { Activity.start(items); keyboard.populate(); } 0048 onStop: { Activity.stop() } 0049 0050 //instruction rectangle 0051 Rectangle { 0052 id: instruction 0053 anchors { 0054 top: parent.top 0055 topMargin: 5 0056 horizontalCenter: parent.horizontalCenter 0057 } 0058 height: instructionTxt.contentHeight * 1.1 0059 width: Math.max(Math.min(parent.width * 0.8, instructionTxt.text.length * 10), parent.width * 0.3) 0060 opacity: 0.8 0061 visible: items.levels 0062 radius: 10 0063 border.width: 2 0064 z: instruction.opacity === 0 ? -10 : 10 0065 border.color: "#DDD" 0066 color: "#373737" 0067 0068 Behavior on opacity { PropertyAnimation { duration: 200 } } 0069 0070 //shows/hides the Instruction 0071 MouseArea { 0072 anchors.fill: parent 0073 onClicked: instruction.opacity = instruction.opacity == 0 ? 0.8 : 0 0074 } 0075 0076 GCText { 0077 id: instructionTxt 0078 anchors { 0079 top: parent.top 0080 topMargin: 5 0081 horizontalCenter: parent.horizontalCenter 0082 } 0083 opacity: instruction.opacity 0084 z: instruction.z 0085 fontSize: smallSize 0086 color: "white" 0087 text: items.instructionText 0088 horizontalAlignment: Text.AlignHCenter 0089 width: parent.width * 0.8 0090 wrapMode: TextEdit.WordWrap 0091 } 0092 } 0093 0094 Keys.onDownPressed: { 0095 if(++answerColumn.currentIndex >= answerColumn.count) 0096 answerColumn.currentIndex = 0 0097 Activity.registerAnswerItem(answerColumn.itemAt(answerColumn.currentIndex)) 0098 } 0099 Keys.onUpPressed: { 0100 if(--answerColumn.currentIndex < 0) 0101 answerColumn.currentIndex = answerColumn.count - 1 0102 Activity.registerAnswerItem(answerColumn.itemAt(answerColumn.currentIndex)) 0103 } 0104 0105 QtObject { 0106 id: items 0107 property alias background: background 0108 property int currentLevel: activity.currentLevel 0109 property alias bonus: bonus 0110 property alias okButton: okButton 0111 property alias answerColumn: answerColumn 0112 property alias itemListModel: itemList.model 0113 property alias instruction: instruction 0114 property string instructionText: "" 0115 property alias score: score 0116 property alias errorRectangle: errorRectangle 0117 property GCSfx audioEffects: activity.audioEffects 0118 readonly property var levels: activity.datasetLoader.data.length !== 0 ? activity.datasetLoader.data : null 0119 property int mode: 1 // default is automatic 0120 property bool buttonsBlocked: false 0121 } 0122 0123 DropArea { 0124 id: dropableArea 0125 anchors.left: background.left 0126 anchors.bottom: background.bottom 0127 width: background.width 0128 height: background.height 0129 onEntered: instruction.opacity !== 0 ? instruction.opacity = 0 : null 0130 } 0131 0132 Image { 0133 source: Activity.url + 'turtle.svg' 0134 anchors.fill: parent 0135 fillMode: Image.PreserveAspectFit 0136 sourceSize.width: Math.max(parent.width, parent.height) 0137 } 0138 0139 Column { 0140 id: answer 0141 anchors { 0142 left: parent.left 0143 top: parent.top 0144 margins: 10 0145 } 0146 spacing: 5 0147 0148 Repeater { 0149 id: answerColumn 0150 property int currentIndex 0151 0152 onModelChanged: currentIndex = count - 1 0153 AnswerArea { 0154 imgPath: modelData 0155 focus: true 0156 state: "default" 0157 } 0158 } 0159 0160 add: Transition { 0161 NumberAnimation { properties: "x,y"; duration: 200 } 0162 } 0163 } 0164 0165 // Reposition the items to find when whidh or height changes 0166 onWidthChanged: { 0167 for(var i in itemList.model) 0168 itemList.itemAt(i).positionMe() 0169 } 0170 0171 onHeightChanged: { 0172 for(var i in itemList.model) 0173 itemList.itemAt(i).positionMe() 0174 } 0175 0176 Repeater { 0177 id: itemList 0178 0179 ItemToEnumerate { 0180 source: modelData 0181 main: background 0182 } 0183 } 0184 0185 ErrorRectangle { 0186 id: errorRectangle 0187 anchors.fill: answer 0188 imageSize: okButton.width 0189 function releaseControls() { items.buttonsBlocked = false; } 0190 } 0191 0192 VirtualKeyboard { 0193 id: keyboard 0194 anchors.bottom: parent.bottom 0195 anchors.horizontalCenter: parent.horizontalCenter 0196 enabled: visible && !items.buttonsBlocked 0197 0198 function populate() { 0199 layout = [ [ 0200 { label: "0" }, 0201 { label: "1" }, 0202 { label: "2" }, 0203 { label: "3" }, 0204 { label: "4" }, 0205 { label: "5" }, 0206 { label: "6" }, 0207 { label: "7" }, 0208 { label: "8" }, 0209 { label: "9" } 0210 ] ] 0211 } 0212 0213 onKeypress: Activity.currentAnswerItem.appendText(text) 0214 0215 onError: console.log("VirtualKeyboard error: " + msg); 0216 } 0217 0218 0219 DialogChooseLevel { 0220 id: dialogActivityConfig 0221 currentActivity: activity.activityInfo 0222 onSaveData: { 0223 levelFolder = dialogActivityConfig.chosenLevels 0224 currentActivity.currentLevels = dialogActivityConfig.chosenLevels 0225 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels) 0226 } 0227 onLoadData: { 0228 if(activityData && activityData["mode"]) { 0229 items.mode = activityData["mode"]; 0230 } 0231 } 0232 onClose: { 0233 home() 0234 } 0235 onStartActivity: { 0236 background.stop() 0237 background.start() 0238 } 0239 } 0240 0241 Score { 0242 id: score 0243 anchors.top: undefined 0244 anchors.bottom: undefined 0245 anchors.verticalCenter: okButton.verticalCenter 0246 anchors.right: okButton.visible ? okButton.left : background.right 0247 anchors.rightMargin: 10 * ApplicationInfo.ratio 0248 onStop: Activity.nextSubLevel() 0249 } 0250 0251 DialogHelp { 0252 id: dialogHelp 0253 onClose: home() 0254 } 0255 0256 Bar { 0257 id: bar 0258 level: items.currentLevel + 1 0259 anchors.bottom: keyboard.top 0260 content: BarEnumContent { value: help | home | level | activityConfig } 0261 onHelpClicked: { 0262 displayDialog(dialogHelp) 0263 } 0264 onPreviousLevelClicked: Activity.previousLevel() 0265 onNextLevelClicked: Activity.nextLevel() 0266 onHomeClicked: activity.home() 0267 onActivityConfigClicked: { 0268 displayDialog(dialogActivityConfig) 0269 } 0270 } 0271 0272 BarButton { 0273 id: okButton 0274 enabled: items.mode === 2 && !items.buttonsBlocked 0275 visible: items.mode === 2 0276 anchors { 0277 bottom: bar.top 0278 right: parent.right 0279 rightMargin: 9 * ApplicationInfo.ratio 0280 bottomMargin: 9 * ApplicationInfo.ratio 0281 } 0282 source: "qrc:/gcompris/src/core/resource/bar_ok.svg" 0283 sourceSize.width: 80 * ApplicationInfo.ratio 0284 onClicked: Activity.checkAnswers(); 0285 } 0286 0287 Keys.onReturnPressed: okButton.visible && okButton.enabled === true ? Activity.checkAnswers() : "" 0288 Keys.onEnterPressed: okButton.visible && okButton.enabled === true ? Activity.checkAnswers() : "" 0289 0290 Bonus { 0291 id: bonus 0292 Component.onCompleted: win.connect(Activity.nextLevel) 0293 } 0294 } 0295 }