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