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

0001 /* GCompris - CalcudokuListWidget.qml
0002  *
0003  * SPDX-FileCopyrightText: 2023 Johnny Jazeix <jazeix@gmail.com>
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 import QtQuick 2.12
0007 import GCompris 1.0
0008 import "calcudoku.js" as Activity
0009 import "../../core"
0010 
0011 Item {
0012     id: listWidget
0013     width: view.width
0014     height: view.height
0015     anchors {
0016         left: parent.left
0017         leftMargin: background.baseMargins
0018         top: parent.top
0019         topMargin: background.baseMargins
0020     }
0021 
0022 
0023     property alias model: mymodel;
0024     property alias view: view;
0025     property GCSfx audioEffects
0026     property bool inputBlocked: false
0027 
0028     ListModel {
0029         id: mymodel
0030     }
0031 
0032     ListView {
0033         id: view
0034         interactive: false
0035         spacing: 5 * ApplicationInfo.ratio
0036         model: mymodel
0037         delegate: listItemComponent
0038 
0039         property int iconSize
0040 
0041         states: [
0042             State {
0043                 name: "horizontalLayout"
0044                 when: background.isHorizontalLayout
0045                 PropertyChanges {
0046                     target: view
0047                     width: iconSize
0048                     height: background.height - 2 * bar.height
0049                     orientation: ListView.Vertical
0050                     iconSize: Math.min((height - (mymodel.count - 1) * spacing) / mymodel.count,
0051                                        100 * ApplicationInfo.ratio)
0052                 }
0053             },
0054             State {
0055                 name: "verticalLayout"
0056                 when: !background.isHorizontalLayout
0057                 PropertyChanges {
0058                     target: view
0059                     width: background.width - background.baseMargins * 2
0060                     height: iconSize
0061                     orientation: ListView.Horizontal
0062                     iconSize: Math.min((width - (model.count - 1) * spacing) / mymodel.count,
0063                                        100 * ApplicationInfo.ratio)
0064                 }
0065             }
0066         ]
0067 
0068         Component {
0069             id: listItemComponent
0070 
0071             Rectangle {
0072                 id: iconBg
0073                 width: view.iconSize
0074                 height: view.iconSize
0075                 color: "#AAFFFFFF"
0076                 radius: height * 0.1
0077 
0078                 Image {
0079                     id: icon
0080                     anchors.centerIn: parent
0081                     sourceSize.height: view.iconSize
0082                     source: model.imgName === undefined ? "" :
0083                                                           Activity.url + model.imgName
0084                     z: iAmSelected ? 10 : 1
0085 
0086                     property bool iAmSelected: view.currentIndex == index
0087 
0088                     states: [
0089                         State {
0090                             name: "notclicked"
0091                             when: !icon.iAmSelected && !mouseArea.containsMouse
0092                             PropertyChanges {
0093                                 target: icon
0094                                 scale: 0.8
0095                             }
0096                         },
0097                         State {
0098                             name: "clicked"
0099                             when: mouseArea.pressed
0100                             PropertyChanges {
0101                                 target: icon
0102                                 scale: 0.7
0103                             }
0104                         },
0105                         State {
0106                             name: "hover"
0107                             when: mouseArea.containsMouse && !icon.iAmSelected
0108                             PropertyChanges {
0109                                 target: icon
0110                                 scale: 1
0111                             }
0112                         },
0113                         State {
0114                             name: "selected"
0115                             when: icon.iAmSelected
0116                             PropertyChanges {
0117                                 target: icon
0118                                 scale: 0.9
0119                             }
0120                         }
0121                     ]
0122 
0123                     SequentialAnimation {
0124                         id: anim
0125                         running: icon.iAmSelected
0126                         loops: Animation.Infinite
0127                         alwaysRunToEnd: true
0128                         NumberAnimation {
0129                             target: iconBg
0130                             property: "rotation"
0131                             from: 0; to: 5
0132                             duration: 200
0133                             easing.type: Easing.OutQuad
0134                         }
0135                         NumberAnimation {
0136                             target: iconBg
0137                             property: "rotation"
0138                             from: 5; to: -5
0139                             duration: 400
0140                             easing.type: Easing.InOutQuad
0141                         }
0142                         NumberAnimation {
0143                             target: iconBg
0144                             property: "rotation"
0145                             from: -5; to: 0
0146                             duration: 200
0147                             easing.type: Easing.InQuad
0148                         }
0149                     }
0150 
0151                     Behavior on scale { NumberAnimation { duration: 70 } }
0152 
0153                     MouseArea {
0154                         id: mouseArea
0155                         anchors.fill: icon
0156                         hoverEnabled: true
0157                         enabled: !listWidget.inputBlocked
0158                         onClicked: {
0159                             listWidget.audioEffects.play('qrc:/gcompris/src/core/resource/sounds/scroll.wav')
0160                             view.currentIndex = index
0161                         }
0162                     }
0163                 }
0164             }
0165         }
0166     }
0167 }
0168