Warning, /education/gcompris/src/activities/gletters/FallingImage.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Word.qml
0002 *
0003 * SPDX-FileCopyrightText: 2014 Holger Kaelberer <holger.k@elberer.de>
0004 *
0005 * Authors:
0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version)
0007 * Holger Kaelberer <holger.k@elberer.de> (Qt Quick port)
0008 *
0009 *
0010 * SPDX-License-Identifier: GPL-3.0-or-later
0011 */
0012 import QtQuick 2.12
0013 import QtGraphicalEffects 1.0
0014 import GCompris 1.0
0015
0016 import "../../core"
0017 import "gletters.js" as Activity
0018
0019 Item {
0020 id: word
0021
0022 width: image.width
0023 height: image.height
0024
0025 /// index into text.split("") where next typed match should occur
0026 property int unmatchedIndex: 0;
0027 property string text
0028 property alias image: image.source;
0029 property bool wonState: false
0030
0031 signal won
0032
0033 onWon: {
0034 wonState = true
0035 particle.burst(30)
0036 dropShadow.opacity = 0
0037 fadeout.restart();
0038 }
0039
0040 Component.onCompleted: {
0041 // make sure our word is completely visible
0042 if (x + width >= parent.width)
0043 x = parent.width - width;
0044 }
0045
0046 PropertyAnimation {
0047 id: fadeout
0048 target: word;
0049 property: "opacity"
0050 to: 0
0051 duration: 1000
0052 onStopped: Activity.deleteWord(word);
0053 }
0054
0055 function checkMatch(c)
0056 {
0057 // We are in the ending animation
0058 if (wonState)
0059 return
0060
0061 var chars = text.split("");
0062 if (chars[unmatchedIndex] === c) {
0063 unmatchedIndex++;
0064 return true;
0065 } else {
0066 unmatchedIndex = 0;
0067 return false;
0068 }
0069 }
0070
0071 function startMoving(dur)
0072 {
0073 down.duration = dur;
0074 down.restart();
0075 }
0076
0077 function isCompleted()
0078 {
0079 return (unmatchedIndex === text.length);
0080 }
0081
0082 Image {
0083 id: image
0084 // FIXME, the size should be passed from the caller
0085 sourceSize.height: 106 * ApplicationInfo.ratio
0086
0087 ParticleSystemStarLoader {
0088 id: particle
0089 clip: false
0090 }
0091 }
0092
0093 DropShadow {
0094 id: dropShadow
0095 anchors.fill: image
0096 cached: false
0097 horizontalOffset: 1
0098 verticalOffset: 1
0099 radius: 3.0
0100 samples: 16
0101 color: "#422a2a2a"
0102 source: image
0103 }
0104
0105 NumberAnimation {
0106 id: down
0107 target: word
0108 property: "y"
0109 to: parent.height
0110 duration: 10000
0111
0112 onStopped: {
0113 Activity.audioCrashPlay();
0114 Activity.appendRandomWord(word.text)
0115 Activity.deleteWord(word);
0116 }
0117 }
0118 }