Warning, /education/gcompris/src/activities/algorithm/Algorithm.qml is written in an unsupported language. File is not indexed.

0001 /* GCompris - algorithm.qml
0002  *
0003  * SPDX-FileCopyrightText: 2014 Bharath M S <brat.197@gmail.com>
0004  *
0005  * Authors:
0006  *   Christof Petig and Ingo Konrad (GTK+ version)
0007  *   Bharath M S <brat.197@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 "../../core"
0014 import "algorithm.js" as Activity
0015 
0016 ActivityBase {
0017     id: activity
0018 
0019     onStart: focus = true
0020     onStop: {}
0021 
0022     pageComponent: Image {
0023         id: background
0024         anchors.fill: parent
0025         source: Activity.url + "desert_scene.svg"
0026         sourceSize.width: parent.width
0027         signal start
0028         signal stop
0029 
0030         Component.onCompleted: {
0031             activity.start.connect(start)
0032             activity.stop.connect(stop)
0033         }
0034 
0035         // Add here the QML items you need to access in javascript
0036         QtObject {
0037             id: items
0038             property Item main: activity.main
0039             property alias questionTray: questionTray
0040             property alias answerTray: answerTray
0041             property alias choiceTray: choiceTray
0042             property alias question: question
0043             property alias answer: answer
0044             property GCSfx audioEffects: activity.audioEffects
0045             property alias background: background
0046             property int currentLevel: activity.currentLevel
0047             property alias bonus: bonus
0048             property alias score: score
0049             property int nbSubLevel: 3
0050             property int currentSubLevel: 0
0051             property bool blockClicks: false
0052         }
0053 
0054         onStart: { Activity.start(items) }
0055         onStop: { Activity.stop() }
0056 
0057         property bool keyNavigationVisible: false
0058 
0059         Keys.enabled: !items.blockClicks
0060         Keys.onPressed: {
0061             keyNavigationVisible = true
0062             if(event.key === Qt.Key_Left)
0063                 choiceGridView.moveCurrentIndexLeft()
0064             if(event.key === Qt.Key_Right)
0065                 choiceGridView.moveCurrentIndexRight()
0066             if(event.key === Qt.Key_Space || event.key === Qt.Key_Enter || event.key === Qt.Key_Return)
0067                 choiceGridView.currentItem.clicked()
0068         }
0069 
0070         Column {
0071             id: column
0072             spacing: 10
0073             y: parent.height * 0.05
0074             width: itemWidth * Activity.images.length
0075             anchors.horizontalCenter: parent.horizontalCenter
0076 
0077             property int itemWidth: Math.min(background.width * 0.75 / Activity.images.length, background.height * 0.19)
0078 
0079             Rectangle {
0080                 id: questionTray
0081                 height: column.itemWidth
0082                 width: parent.width
0083                 color: "#55333333"
0084                 radius: 5
0085 
0086                 Row {
0087                     anchors.topMargin: 4
0088                     anchors.bottomMargin: 4
0089                     anchors.leftMargin: 5
0090                     anchors.fill: parent
0091                     spacing: 5.7 * ApplicationInfo.ratio
0092                     Repeater {
0093                         id: question
0094                         // workaround for https://bugreports.qt.io/browse/QTBUG-72643 (qml binding with global variable in Repeater do not work)
0095                         property alias itemWidth: column.itemWidth
0096                         Image {
0097                             source: Activity.url + modelData + '.svg'
0098                             sourceSize.height: height
0099                             sourceSize.width: width
0100                             width: question.itemWidth - 6 * ApplicationInfo.ratio
0101                             height: width
0102                             fillMode: Image.PreserveAspectFit
0103                         }
0104                     }
0105                 }
0106             }
0107 
0108             Rectangle {
0109                 id: answerTray
0110                 height: column.itemWidth
0111                 width: parent.width
0112                 color: "#55333333"
0113                 radius: 5
0114                 Row {
0115                     anchors.topMargin: 4
0116                     anchors.bottomMargin: 4
0117                     anchors.leftMargin: 5
0118                     anchors.fill: parent
0119                     spacing: 5.7 * ApplicationInfo.ratio
0120                     Repeater {
0121                         id: answer
0122                         Image {
0123                             source: "qrc:/gcompris/src/activities/algorithm/resource/" +
0124                                     modelData + '.svg'
0125                             sourceSize.height: height
0126                             sourceSize.width: width
0127                             width: question.itemWidth - 6 * ApplicationInfo.ratio
0128                             height: width
0129                             fillMode: Image.PreserveAspectFit
0130                         }
0131                     }
0132                 }
0133             }
0134 
0135             // A spacer
0136             Item {
0137                 height: column.itemWidth / 2
0138                 width: parent.width
0139             }
0140 
0141             Rectangle {
0142                 id: choiceTray
0143                 height: column.itemWidth + 3 * ApplicationInfo.ratio
0144                 width: parent.width
0145                 color: "#55333333"
0146                 radius: 5
0147 
0148                 GridView {
0149                     id: choiceGridView
0150                     anchors.fill: parent
0151                     model: Activity.images
0152                     cellWidth: column.itemWidth
0153                     cellHeight: cellWidth
0154                     interactive: false
0155                     keyNavigationWraps: true
0156                     highlightFollowsCurrentItem: true
0157                     highlight: Rectangle {
0158                         width: parent.cellWidth
0159                         height: parent.cellHeight
0160                         color:  "#AAFFFFFF"
0161                         border.width: 2
0162                         border.color: "white"
0163                         visible: background.keyNavigationVisible
0164                         Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } }
0165                         Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } }
0166                     }
0167 
0168                     delegate: Item {
0169                         id: cellItem
0170                         width: choiceGridView.cellWidth
0171                         height: choiceTray.height
0172 
0173                         signal clicked
0174                         onClicked: {
0175                             if(Activity.clickHandler(modelData)) {
0176                                 particle.burst(20)
0177                             }
0178                         }
0179 
0180                         Image {
0181                             id: img
0182                             source: Activity.url + modelData + '.svg'
0183                             width: question.itemWidth - 6 * ApplicationInfo.ratio
0184                             height: width
0185                             sourceSize.width: width
0186                             sourceSize.height: height
0187                             anchors.centerIn: parent
0188                             fillMode: Image.PreserveAspectFit
0189                             state: "notclicked"
0190 
0191                             MouseArea {
0192                                 id: mouseArea
0193                                 hoverEnabled: enabled
0194                                 enabled: !items.blockClicks
0195                                 anchors.fill: parent
0196                                 onClicked: cellItem.clicked()
0197                             }
0198                             states: [
0199                                 State {
0200                                     name: "notclicked"
0201                                     PropertyChanges {
0202                                         target: img
0203                                         scale: 1.0
0204                                     }
0205                                 },
0206                                 State {
0207                                     name: "clicked"
0208                                     when: mouseArea.pressed
0209                                     PropertyChanges {
0210                                         target: img
0211                                         scale: 0.9
0212                                     }
0213                                 },
0214                                 State {
0215                                     name: "hover"
0216                                     when: mouseArea.containsMouse
0217                                     PropertyChanges {
0218                                         target: img
0219                                         scale: 1.1
0220                                     }
0221                                 }
0222                             ]
0223 
0224                             Behavior on scale { NumberAnimation { duration: 70 } }
0225 
0226                             ParticleSystemStarLoader {
0227                                 id: particle
0228                                 clip: false
0229                             }
0230                         }
0231                     }
0232                 }
0233             }
0234         }
0235 
0236         DialogHelp {
0237             id: dialogHelp
0238             onClose: home()
0239         }
0240 
0241         Bar {
0242             id: bar
0243             level: items.currentLevel + 1
0244             content: BarEnumContent { value: help | home | level }
0245             onHelpClicked: {
0246                 displayDialog(dialogHelp)
0247             }
0248             onPreviousLevelClicked: Activity.previousLevel()
0249             onNextLevelClicked: Activity.nextLevel()
0250             onHomeClicked: activity.home()
0251         }
0252 
0253         Bonus {
0254             id: bonus
0255             Component.onCompleted: win.connect(Activity.nextLevel)
0256         }
0257 
0258         Score {
0259             id: score
0260             anchors {
0261                 bottom: bar.top
0262                 bottomMargin: 10 * ApplicationInfo.ratio
0263                 right: parent.right
0264                 rightMargin: 5 * ApplicationInfo.ratio
0265                 top: undefined
0266                 left: undefined
0267             }
0268             numberOfSubLevels: items.nbSubLevel
0269             currentSubLevel: items.currentSubLevel
0270             onStop: Activity.nextSubLevel()
0271         }
0272     }
0273 }