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

0001 /* gcompris - ListWidget.qml
0002  *
0003  * SPDX-FileCopyrightText: 2015 Pulkit Gupta <pulkitgenius@gmail.com>
0004  *
0005  * Authors:
0006  *   Pulkit Gupta <pulkitgenius@gmail.com>
0007  *
0008  *   SPDX-License-Identifier: GPL-3.0-or-later
0009  */
0010 import QtQuick 2.12
0011 import GCompris 1.0
0012 import "../../core"
0013 import "babymatch.js" as Activity
0014 
0015 Item {
0016     id: listWidget
0017     anchors.fill: parent
0018     anchors.topMargin: 5 * ApplicationInfo.ratio
0019     anchors.leftMargin: 5 * ApplicationInfo.ratio
0020     z: 10
0021 
0022     property alias model: mymodel
0023     property alias view: view
0024     property alias showOk: showOk
0025     property alias hideOk: hideOk
0026     property alias repeater: repeater
0027 
0028     ListModel {
0029         id: mymodel
0030     }
0031 
0032     PropertyAnimation {
0033         id: showOk
0034         target: ok
0035         properties: "height"
0036         from: 0
0037         to: view.iconSize * 0.9
0038         duration: 300
0039         onStopped: {
0040             view.okShowed = true;
0041         }
0042     }
0043     PropertyAnimation {
0044         id: hideOk
0045         target: ok
0046         properties: "height"
0047         from: view.iconSize * 0.9
0048         to: 0
0049         duration: 200
0050         onStopped: view.checkDisplayedGroup();
0051     }
0052 
0053     Image {
0054         id: ok
0055         source:"qrc:/gcompris/src/core/resource/bar_ok.svg"
0056         sourceSize.width: view.iconSize
0057         fillMode: Image.PreserveAspectFit
0058         anchors.horizontalCenter: parent.horizontalCenter
0059 
0060         MouseArea {
0061             anchors.fill: parent
0062             enabled: !items.inputLocked
0063             onClicked: view.checkAnswer();
0064         }
0065     }
0066 
0067     Grid {
0068         id: view
0069         width: leftWidget.width
0070         height: background.verticalBar ? background.height - bar.height * 2 : bar.height
0071         spacing: 10
0072         z: 20
0073         columns: background.verticalBar ? 1 : nbItemsByGroup + 1
0074 
0075         property int currentDisplayedGroup: 0
0076         property int setCurrentDisplayedGroup
0077         property int nbItemsByGroup:
0078             background.verticalBar ?
0079                 view.height / iconSize - 1 :
0080                 view.width / iconSize - 2
0081 
0082         property int nbDisplayedGroup: nbItemsByGroup > 0 ? Math.ceil(model.count / nbItemsByGroup) : 0
0083         property int iconSize: 80 * ApplicationInfo.ratio
0084         property int previousNavigation: 1
0085         property int nextNavigation: 1
0086         property bool okShowed: false
0087         property bool showGlow: false
0088         property var displayedGroup: []
0089         property alias ok: ok
0090 
0091         onNbDisplayedGroupChanged: correctDisplayedGroup();
0092 
0093         // For correcting values of Displayed Groups when height or width is changed
0094         function correctDisplayedGroup() {
0095             if(nbDisplayedGroup > 0) {
0096                 for(var i = 0 ; i < nbDisplayedGroup ; i++) {
0097                     var groupEmpty = true;
0098                     for(var j = 0 ; j < nbItemsByGroup && i*nbItemsByGroup + j < model.count ; j++) {
0099                         if(repeater.itemAt(i*nbItemsByGroup + j).dropStatus < 0) {
0100                             groupEmpty = false;
0101                             break;
0102                         }
0103                     }
0104                     if(groupEmpty)
0105                         displayedGroup[i] = false;
0106                     else
0107                         displayedGroup[i] = true;
0108                 }
0109                 view.refreshLeftWidget();
0110                 view.checkDisplayedGroup();
0111             }
0112         }
0113 
0114         //For setting navigation buttons
0115         function setNextNavigation() {
0116             nextNavigation = 0;
0117             for(var i = currentDisplayedGroup + 1 ; i < nbDisplayedGroup ; i++) {
0118                 if(displayedGroup[i]) {
0119                     nextNavigation = i - currentDisplayedGroup;
0120                     break;
0121                 }
0122             }
0123         }
0124 
0125         function setPreviousNavigation() {
0126             previousNavigation = 0;
0127             for(var i = currentDisplayedGroup - 1 ; i >= 0 ; i--) {
0128                 if(displayedGroup[i]) {
0129                     previousNavigation = currentDisplayedGroup - i;
0130                     break;
0131                 }
0132             }
0133         }
0134 
0135         function checkDisplayedGroup() {
0136             var i = currentDisplayedGroup * nbItemsByGroup;
0137             var groupEmpty = true;
0138             while(i < model.count && i < (currentDisplayedGroup + 1) * nbItemsByGroup) {
0139                 if(repeater.itemAt(i).dropStatus < 0) {
0140                     groupEmpty = false;
0141                     break;
0142                 }
0143                 i++;
0144             }
0145 
0146             if(groupEmpty) {
0147                 displayedGroup[currentDisplayedGroup] = false;
0148                 previousNavigation = 0;
0149                 nextNavigation = 0;
0150                 for(var i = 0 ; i < nbDisplayedGroup ; ++i) {
0151                     if(displayedGroup[i]) {
0152                         view.setCurrentDisplayedGroup = i;
0153                         view.refreshLeftWidget();
0154                         break;
0155                     }
0156                 }
0157             }
0158         }
0159 
0160         function refreshLeftWidget() {
0161             availablePieces.view.currentDisplayedGroup = availablePieces.view.setCurrentDisplayedGroup;
0162             availablePieces.view.setNextNavigation();
0163             availablePieces.view.setPreviousNavigation();
0164         }
0165 
0166         function areAllPlaced() {
0167             for(var i = 0 ; i < model.count ; ++i) {
0168                 if(repeater.itemAt(i).dropStatus < 0) {
0169                     return false;
0170                 }
0171             }
0172             return true;
0173         }
0174 
0175         function checkAnswer() {
0176             view.showGlow = true;
0177             for(var i = 0 ; i < model.count ; ++i) {
0178                 if(repeater.itemAt(i).dropStatus !== 1) {
0179                     return;
0180                 }
0181             }
0182             items.inputLocked = true;
0183             Activity.win();
0184         }
0185 
0186         Repeater {
0187             id: repeater
0188             property int currentIndex
0189             onCurrentIndexChanged: {
0190                 for(var i = 0; i < mymodel.count; i++) {
0191                     if(currentIndex != i)
0192                         repeater.itemAt(i).selected = false;
0193                     else
0194                         repeater.itemAt(i).selected = true;
0195                 }
0196                 if(currentIndex == -1)
0197                     toolTip.opacity = 0;
0198             }
0199             DragListItem {
0200                 id: contactsDelegate
0201                 z: 1
0202                 tileSize: view.iconSize
0203                 visible: view.currentDisplayedGroup * view.nbItemsByGroup <= index &&
0204                          index <= (view.currentDisplayedGroup+1) * view.nbItemsByGroup-1
0205 
0206                 onPressed: repeater.currentIndex = index;
0207             }
0208 
0209             clip: true
0210             model: mymodel
0211 
0212             onModelChanged: repeater.currentIndex = -1;
0213         }
0214 
0215         Row {
0216             spacing: view.iconSize * 0.20
0217 
0218             Image {
0219                 id: previous
0220                 opacity: (model.count > view.nbItemsByGroup &&
0221                           view.previousNavigation != 0 && view.currentDisplayedGroup != 0) ? 1 : 0
0222                 source:"qrc:/gcompris/src/core/resource/bar_previous.svg"
0223                 sourceSize.width: view.iconSize * 0.35
0224                 fillMode: Image.PreserveAspectFit
0225                 MouseArea {
0226                     anchors.fill: parent
0227                     enabled: !items.inputLocked && parent.opacity > 0
0228                     onClicked: {
0229                         repeater.currentIndex = -1;
0230                         if(previous.opacity == 1) {
0231                             view.setCurrentDisplayedGroup = view.currentDisplayedGroup - view.previousNavigation;
0232                             view.refreshLeftWidget();
0233                         }
0234                     }
0235                 }
0236             }
0237 
0238             Image {
0239                 id: next
0240                 opacity: (model.count > view.nbItemsByGroup && view.nextNavigation != 0
0241                             && view.currentDisplayedGroup < view.nbDisplayedGroup - 1) ? 1 : 0
0242                 source:"qrc:/gcompris/src/core/resource/bar_next.svg"
0243                 sourceSize.width: view.iconSize * 0.35
0244                 fillMode: Image.PreserveAspectFit
0245                 MouseArea {
0246                     anchors.fill: parent
0247                     enabled: !items.inputLocked && parent.opacity > 0
0248                     onClicked: {
0249                         repeater.currentIndex = -1;
0250                         view.setCurrentDisplayedGroup = view.currentDisplayedGroup + view.nextNavigation;
0251                         view.refreshLeftWidget();
0252                     }
0253                 }
0254             }
0255         }
0256     }
0257 }