Warning, /education/gcompris/src/activities/braille_fun/BrailleFun.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - braille_fun.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Arkit Vora <arkitvora123@gmail.com> 0004 * 0005 * Authors: 0006 * Srishti Sethi (GTK+ version) 0007 * Arkit Vora <arkitvora123@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 "../braille_alphabets" 0016 import "braille_fun.js" as Activity 0017 0018 0019 0020 ActivityBase { 0021 id: activity 0022 0023 onStart: focus = true 0024 onStop: {} 0025 0026 pageComponent: Image { 0027 id: background 0028 anchors.fill: parent 0029 fillMode: Image.PreserveAspectCrop 0030 sourceSize.width: width 0031 sourceSize.height: height 0032 source: Activity.url + "hillside.svg" 0033 signal start 0034 signal stop 0035 0036 Component.onCompleted: { 0037 activity.start.connect(start) 0038 activity.stop.connect(stop) 0039 } 0040 0041 Keys.onPressed: { 0042 if(event.key === Qt.Key_Space) 0043 brailleMap.clicked(); 0044 } 0045 0046 // Add here the QML items you need to access in javascript 0047 QtObject { 0048 id: items 0049 property Item main: activity.main 0050 property alias background: background 0051 property GCSfx audioEffects: activity.audioEffects 0052 property int currentLevel: activity.currentLevel 0053 property alias bonus: bonus 0054 property alias questionItem: questionItem 0055 property alias score: score 0056 property alias cardRepeater: cardRepeater 0057 property alias animateX: animateX 0058 property alias charBg: charBg 0059 property string question 0060 property int baseMargins: 10 * ApplicationInfo.ratio 0061 } 0062 0063 onStart: { Activity.start(items) } 0064 onStop: { Activity.stop() } 0065 0066 Item { 0067 id: layoutArea 0068 anchors.top: planeText.bottom 0069 anchors.bottom: background.bottom 0070 anchors.left: background.left 0071 anchors.right: background.right 0072 anchors.bottomMargin: bar.height * 1.3 0073 } 0074 0075 Item { 0076 id: planeText 0077 width: plane.width 0078 height: plane.height 0079 x: - width 0080 anchors.top: parent.top 0081 anchors.topMargin: 20 * ApplicationInfo.ratio 0082 0083 Image { 0084 id: plane 0085 anchors.centerIn: planeText 0086 anchors.top: parent.top 0087 source: Activity.url + "plane.svg" 0088 sourceSize.height: 90 * ApplicationInfo.ratio 0089 } 0090 0091 GCText { 0092 id: questionItem 0093 anchors.right: planeText.right 0094 anchors.rightMargin: plane.width / 2 0095 anchors.verticalCenter: planeText.verticalCenter 0096 fontSize: hugeSize 0097 font.weight: Font.DemiBold 0098 color: "#2a2a2a" 0099 text: items.question 0100 } 0101 0102 PropertyAnimation { 0103 id: animateX 0104 target: planeText 0105 properties: "x" 0106 from: - planeText.width 0107 to: background.width 0108 duration: 11000 0109 easing.type: Easing.OutInCirc 0110 loops: Animation.Infinite 0111 } 0112 } 0113 0114 Item { 0115 id: charBg 0116 anchors { 0117 top: layoutArea.top 0118 bottom: score.top 0119 left: layoutArea.left 0120 right: layoutArea.right 0121 margins: items.baseMargins 0122 } 0123 0124 property int charWidth: Math.min(120 * ApplicationInfo.ratio, width * 0.3) 0125 0126 function clickable(status) { 0127 for(var i=0 ; i < cardRepeater.model ; i++) { 0128 cardRepeater.itemAt(i).ins.clickable = status 0129 } 0130 } 0131 0132 function clearAllLetters() { 0133 for(var i=0 ; i < cardRepeater.model ; i++) { 0134 cardRepeater.itemAt(i).ins.clearLetter() 0135 } 0136 } 0137 0138 Row { 0139 id: row 0140 spacing: items.baseMargins 0141 anchors.centerIn: parent 0142 0143 Repeater { 0144 id: cardRepeater 0145 0146 Item { 0147 id: inner 0148 height: charBg.height - 2 * items.baseMargins 0149 width: charBg.charWidth 0150 property string brailleChar: ins.brailleChar 0151 property alias ins: ins 0152 0153 Rectangle { 0154 id: rect1 0155 width: parent.width 0156 height: ins.height 0157 anchors.horizontalCenter: inner.horizontalCenter 0158 anchors.top: parent.top 0159 border.width: ins.found ? 0 : 2 * ApplicationInfo.ratio 0160 border.color: "#fff" 0161 radius: items.baseMargins 0162 color: ins.found ? '#85d8f6' : "#dfe1e8" 0163 0164 BrailleChar { 0165 id: ins 0166 clickable: true 0167 anchors.centerIn: rect1 0168 width: parent.width * 0.5 0169 isLetter: true 0170 onBrailleCharChanged: { 0171 inner.brailleChar = ins.brailleChar 0172 var answerString = "" ; 0173 if(brailleChar == "") { 0174 // fix TypeError on level change 0175 return 0176 } 0177 for(var i = 0 ; i < items.currentLevel + 1 ; i++ ) { 0178 answerString = answerString + cardRepeater.itemAt(i).brailleChar; 0179 } 0180 if(answerString === items.question) { 0181 charBg.clickable(false) 0182 Activity.goodAnswer() 0183 } 0184 } 0185 property string question: items.question[modelData] ? items.question[modelData] : "" 0186 property bool found: question === brailleChar 0187 } 0188 } 0189 0190 GCText { 0191 text: brailleChar 0192 font.weight: Font.DemiBold 0193 color: "#2a2a2a" 0194 fontSize: hugeSize 0195 anchors { 0196 top: rect1.bottom 0197 topMargin: 4 * ApplicationInfo.ratio 0198 horizontalCenter: rect1.horizontalCenter 0199 } 0200 } 0201 } 0202 0203 } 0204 } 0205 } 0206 0207 Score { 0208 id: score 0209 anchors.bottom: layoutArea.bottom 0210 anchors.right: layoutArea.right 0211 anchors.rightMargin: items.baseMargins 0212 anchors.top: undefined 0213 anchors.left: undefined 0214 onStop: Activity.nextQuestion() 0215 } 0216 0217 0218 DialogHelp { 0219 id: dialogHelp 0220 onClose: home() 0221 } 0222 0223 BrailleMap { 0224 id: dialogMap 0225 onClose: home() 0226 } 0227 0228 Bar { 0229 id: bar 0230 level: items.currentLevel + 1 0231 content: BarEnumContent { value: help | home | level } 0232 onHelpClicked: { 0233 displayDialog(dialogHelp) 0234 } 0235 onPreviousLevelClicked: Activity.previousLevel() 0236 onNextLevelClicked: Activity.nextLevel() 0237 onHomeClicked: activity.home() 0238 } 0239 0240 BarButton { 0241 id: brailleMap 0242 source: "qrc:/gcompris/src/activities/braille_alphabets/resource/braille_button.svg" 0243 anchors { 0244 right: background.right 0245 top: background.top 0246 margins: items.baseMargins 0247 } 0248 sourceSize.width: 60 * ApplicationInfo.ratio 0249 onClicked: { 0250 dialogMap.visible = true 0251 displayDialog(dialogMap) 0252 } 0253 } 0254 0255 Bonus { 0256 id: bonus 0257 Component.onCompleted: { 0258 win.connect(Activity.nextLevel) 0259 } 0260 } 0261 } 0262 0263 }