Warning, /education/gcompris/src/activities/lang/Quiz.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Quiz.qml
0002 *
0003 * Copyright (C) Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port)
0004 *
0005 * Authors:
0006 * Pascal Georges (pascal.georges1@free.fr) (GTK+ version)
0007 * Holger Kaelberer <holger.k@elberer.de> (Qt Quick port of imageid)
0008 * Siddhesh suthar <siddhesh.it@gmail.com> (Qt Quick port)
0009 * Bruno Coudoin <bruno.coudoin@gcompris.net> (Integration Lang dataset)
0010 *
0011 * SPDX-License-Identifier: GPL-3.0-or-later
0012 */
0013 import QtQuick 2.12
0014 import GCompris 1.0
0015 import QtGraphicalEffects 1.0
0016
0017 import "../../core"
0018 import "lang.js" as Activity
0019 import "quiz.js" as QuizActivity
0020
0021 Item {
0022 id: quiz
0023 opacity: 0
0024
0025 property alias background: background
0026 property alias bonus: bonus
0027 property alias score: score
0028 property alias wordImage: wordImage
0029 property alias imageFrame: imageFrame
0030 property alias wordListModel: wordListModel
0031 property alias wordListView: wordListView
0032 property alias parser: parser
0033 property var goodWord
0034 property bool horizontalLayout: background.width >= background.height
0035 property bool buttonsBlocked: false
0036
0037 function init(loadedItems_, wordList_, mode_) {
0038 opacity = 1
0039 loadedItems_.forceActiveFocus()
0040 return QuizActivity.init(loadedItems_, wordList_, mode_)
0041 }
0042
0043 function restoreFocus() {
0044 background.forceActiveFocus();
0045 }
0046
0047 onGoodWordChanged: Activity.playWord(goodWord.voice)
0048
0049 Behavior on opacity { PropertyAnimation { duration: 200 } }
0050
0051 Item {
0052 id: background
0053 anchors.fill: parent
0054
0055 property bool keyNavigation: false
0056
0057 Keys.enabled: !quiz.buttonsBlocked
0058
0059 Keys.onEscapePressed: {
0060 imageReview.start()
0061 }
0062 Keys.onRightPressed: {
0063 keyNavigation = true
0064 wordListView.incrementCurrentIndex()
0065 }
0066 Keys.onLeftPressed: {
0067 keyNavigation = true
0068 wordListView.decrementCurrentIndex()
0069 }
0070 Keys.onDownPressed: {
0071 keyNavigation = true
0072 wordListView.incrementCurrentIndex()
0073 }
0074 Keys.onUpPressed: {
0075 keyNavigation = true
0076 wordListView.decrementCurrentIndex()
0077 }
0078 Keys.onSpacePressed: {
0079 keyNavigation = true
0080 wordListView.currentItem.children[1].pressed()
0081 }
0082 Keys.onEnterPressed: {
0083 keyNavigation = true
0084 wordListView.currentItem.children[1].pressed()
0085 }
0086 Keys.onReturnPressed: {
0087 keyNavigation = true
0088 wordListView.currentItem.children[1].pressed()
0089 }
0090 Keys.onTabPressed: {
0091 repeatItem.clicked()
0092 }
0093 Keys.onReleased: {
0094 if (event.key === Qt.Key_Back) {
0095 event.accepted = true
0096 imageReview.start()
0097 }
0098 }
0099
0100 JsonParser {
0101 id: parser
0102
0103 onError: console.error("Lang: Error parsing json: " + msg);
0104 }
0105
0106 ListModel {
0107 id: wordListModel
0108 }
0109
0110 Grid {
0111 id: gridId
0112 columns: quiz.horizontalLayout ? 2 : 1
0113 spacing: 10 * ApplicationInfo.ratio
0114 anchors.fill: parent
0115 anchors.margins: spacing
0116
0117 Item {
0118 id: imageContainer
0119 width: quiz.horizontalLayout
0120 ? background.width - wordListView.width - gridId.spacing * 3
0121 : wordListView.width
0122 height: quiz.horizontalLayout
0123 ? wordListView.height
0124 : background.height - bar.height - wordListView.height - gridId.spacing * 3
0125
0126 Rectangle {
0127 id: imageFrame
0128 anchors.centerIn: parent
0129 color: "#E0E0F7"
0130 border.color: "#373737"
0131 border.width: ApplicationInfo.ratio
0132 width: quiz.horizontalLayout ?
0133 Math.min(parent.width * 0.6, parent.height - repeatItem.height * 2 - gridId.spacing * 2) :
0134 Math.min(parent.height, parent.width - repeatItem.height * 2 - gridId.spacing * 2)
0135 height: width
0136 radius: width * 0.1
0137 z: 11
0138 visible: QuizActivity.mode !== 3
0139
0140 Image {
0141 id: wordImage
0142 // Images are not svg
0143 width: parent.width * 0.9
0144 height: width
0145 anchors.centerIn: parent
0146
0147 property string nextSource
0148 function changeSource(nextSource_) {
0149 nextSource = nextSource_
0150 animImage.start()
0151 }
0152
0153 SequentialAnimation {
0154 id: animImage
0155 PropertyAnimation {
0156 target: wordImage
0157 property: "opacity"
0158 to: 0
0159 duration: 100
0160 }
0161 PropertyAction {
0162 target: wordImage
0163 property: "source"
0164 value: wordImage.nextSource
0165 }
0166 PropertyAnimation {
0167 target: wordImage
0168 property: "opacity"
0169 to: 1
0170 duration: 100
0171 }
0172 }
0173 MouseArea {
0174 anchors.fill: parent
0175 onClicked: Activity.playWord(goodWord.voice)
0176 }
0177 }
0178 }
0179 }
0180
0181 ListView {
0182 id: wordListView
0183 width: quiz.horizontalLayout
0184 ? background.width * 0.55
0185 : background.width - gridId.anchors.margins * 2
0186 height: quiz.horizontalLayout
0187 ? background.height - bar.height
0188 : (background.height - bar.height) * 0.6
0189 spacing: 2 * ApplicationInfo.ratio
0190 orientation: Qt.Vertical
0191 verticalLayoutDirection: ListView.TopToBottom
0192 interactive: false
0193 model: wordListModel
0194
0195 highlight: Rectangle {
0196 width: (QuizActivity.mode == 1) ? wordListView.width - wordListView.buttonHeight :
0197 wordListView.width
0198 height: wordListView.buttonHeight
0199 color: "#AAFFFFFF"
0200 radius: 5
0201 visible: background.keyNavigation
0202 y: wordListView.currentItem ? wordListView.currentItem.y : 0
0203 Behavior on y {
0204 SpringAnimation {
0205 spring: 3
0206 damping: 0.2
0207 }
0208 }
0209 }
0210 highlightFollowsCurrentItem: false
0211 focus: true
0212 keyNavigationWraps: true
0213
0214 property int buttonHeight: height / wordListModel.count * 0.9
0215
0216 delegate: Item {
0217
0218 id: wordListViewDelegate
0219
0220 width: wordListView.width
0221 height: wordListView.buttonHeight
0222
0223 Image {
0224 id: wordImageQuiz
0225 width: height
0226 height: wordListView.buttonHeight
0227 mipmap: true
0228 source: image
0229 z: 7
0230 fillMode: Image.PreserveAspectFit
0231 anchors.right: parent.right
0232 visible: (QuizActivity.mode == 1) ? true : false // hide images after first mini game
0233 }
0234
0235 AnswerButton {
0236 id: wordRectangle
0237 width: parent.width * 0.6
0238 height: wordListView.buttonHeight
0239 textLabel: translatedTxt
0240 anchors.right: wordImageQuiz.visible ? wordImageQuiz.left : parent.right
0241 anchors.left: parent.left
0242 audioEffects: activity.audioEffects
0243 blockAllButtonClicks: quiz.buttonsBlocked
0244 onPressed: {
0245 quiz.buttonsBlocked = true
0246 if(isCorrectAnswer) {
0247 score.currentSubLevel++
0248 score.playWinAnimation()
0249 }
0250 }
0251 isCorrectAnswer: translatedTxt === quiz.goodWord.translatedTxt
0252 onIncorrectlyPressed: {
0253 // push the error to have it asked again
0254 QuizActivity.remainingWords.unshift(quiz.goodWord);
0255 QuizActivity.nextSubLevelQuiz();
0256 }
0257 onCorrectlyPressed: {
0258 QuizActivity.nextSubLevelQuiz();
0259 }
0260 }
0261 }
0262 }
0263 }
0264
0265 BarButton {
0266 id: repeatItem
0267 source: "qrc:/gcompris/src/core/resource/bar_repeat.svg";
0268 sourceSize.width: 64 * ApplicationInfo.ratio
0269
0270 z: 12
0271 anchors {
0272 top: parent.top
0273 left: parent.left
0274 margins: 10 * ApplicationInfo.ratio
0275 }
0276 onClicked: Activity.playWord(goodWord.voice)
0277 Behavior on opacity { PropertyAnimation { duration: 200 } }
0278 }
0279
0280 Score {
0281 id: score
0282 parent: quiz
0283 }
0284
0285 Bonus {
0286 id: bonus
0287 onWin: imageReview.nextMiniGame()
0288 }
0289 }
0290 }