Warning, /education/gcompris/src/activities/watercycle/Watercycle.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - watercycle.qml
0002 *
0003 * SPDX-FileCopyrightText: 2015 Sagar Chand Agarwal <atomsagar@gmail.com>
0004 * SPDX-FileCopyrightText: 2022 Timothée Giet <animtim@gmail.com>
0005 *
0006 * Authors:
0007 * Bruno Coudoin <bruno.coudoin@gcompris.net>(GTK+ version)
0008 * Sagar Chand Agarwal <atomsagar@gmail.com> (Qt Quick port)
0009 * Timothée Giet <animtim@gmail.com> (Big refactoring)
0010 *
0011 * SPDX-License-Identifier: GPL-3.0-or-later
0012 */
0013
0014 import QtQuick 2.12
0015 import GCompris 1.0
0016
0017 import "../../core"
0018 import "."
0019
0020 ActivityBase {
0021 id: activity
0022
0023 onStart: focus = true
0024 onStop: {}
0025
0026 property string url: "qrc:/gcompris/src/activities/watercycle/resource/"
0027
0028 pageComponent: Image {
0029 id: background
0030 anchors.fill: parent
0031 source: "qrc:/gcompris/src/activities/chess/resource/background-wood.svg"
0032 sourceSize.width: width
0033 sourceSize.height: height
0034
0035 signal start
0036 signal stop
0037
0038 Component.onCompleted: {
0039 activity.start.connect(start)
0040 activity.stop.connect(stop)
0041 }
0042
0043 // Needed to get keyboard focus on IntroMessage
0044 Keys.forwardTo: message
0045
0046 onStart: {}
0047 onStop: {
0048 timer.stop()
0049 activity.audioEffects.stop()
0050 }
0051
0052 function initLevel() {
0053 if(message.visible)
0054 return;
0055 timer.stop();
0056 items.cycleDone = false;
0057 river.level = 0;
0058 sun_area.enabled = true;
0059 sun.state = "sunDown";
0060 sun.hasRun = false;
0061 vapor.animLoop = false;
0062 vapor.state = "vaporDownRestarted";
0063 rainAnim.stop();
0064 rain.down();
0065 cloud.isUp = false;
0066 tuxboat.state = "tuxboatRestarted";
0067 boatparked.opacity = 1;
0068 shower.stop();
0069 waterplant.running = false;
0070 sewageplant.running = false;
0071 tower.level = 0;
0072 info.visible = true;
0073 info.setKey('start');
0074 timer.restart();
0075 }
0076
0077 QtObject {
0078 id: items
0079 property var dataset: {
0080 "none": "",
0081 "start": qsTr("The sun is the main component of the water cycle. Click on the sun to start the water cycle."),
0082 "sun": qsTr("As the sun rises, the water of the sea starts heating and evaporates."),
0083 "cloud": qsTr("Water vapor condenses to form clouds and when clouds become heavy, it rains. Click on the cloud."),
0084 "rain": qsTr("The rain causes rivers to swell up and this water is transported to us via motor pumps through water-towers." +
0085 " Click on the motor pump to supply water to residents."),
0086 "tower": qsTr("See the tower filled with water. Activate the sewage treatment station by clicking on it."),
0087 "shower": qsTr("Great, click on the shower, as Tux arrives home."),
0088 "done": qsTr("Fantastic, you have completed the water cycle. You can continue playing.")
0089 }
0090
0091 property bool cycleDone: false
0092 property bool isVertical: background.width < background.height - bar.height * 1.2
0093 property bool textOnSide: background.width > layoutArea.width * 1.5
0094 property GCSfx audioEffects: activity.audioEffects
0095 }
0096
0097 IntroMessage {
0098 id: message
0099 anchors {
0100 top: parent.top
0101 topMargin: 10
0102 right: parent.right
0103 rightMargin: 5
0104 left: parent.left
0105 leftMargin: 5
0106 }
0107 z: 100
0108 onIntroDone: {
0109 tuxboat.state = "tuxboatRight";
0110 sun.state = "sunDown";
0111 info.visible = true;
0112 sun_area.enabled = true;
0113 }
0114 intro: [
0115 qsTr("The water cycle (also known as the hydrologic cycle) is the journey water takes"
0116 +" as it circulates from the land to the sky and back again."
0117 +" The sun's heat provides energy to evaporate water from water bodies like oceans."),
0118 qsTr("Plants also lose water to the air through transpiration. The water vapor "
0119 +"cools down forming tiny droplets in clouds. When the clouds meet cool air over the land, "
0120 +"precipitation is triggered and falls down as rain.") ,
0121 qsTr("Some of the water is trapped between rock or clay layers, called groundwater. "
0122 +"But most of the water flows as runoff, eventually returning to the seas via rivers."),
0123 qsTr("Your goal is to complete the water cycle before Tux reaches home. "
0124 +"Click on the different components which make up the water cycle. "
0125 +"First click on the sun, then on the cloud, the water pumping station near the river, "
0126 +"the sewage treatment, and at last regulate the switch to provide water to Tux's shower.")
0127 ]
0128 }
0129
0130 Item {
0131 id: layoutArea
0132 width: parent.height - bar.height * 1.2
0133 height: width
0134 anchors.left: background.left
0135 states: [
0136 State {
0137 name: "verticalLayout"
0138 when: items.isVertical
0139 PropertyChanges {
0140 target: layoutArea
0141 width: parent.width
0142 anchors.bottomMargin: bar.height * 0.2
0143 anchors.leftMargin: 0
0144 }
0145 AnchorChanges {
0146 target: layoutArea
0147 anchors.top: undefined
0148 anchors.bottom: bar.top
0149 }
0150 },
0151 State {
0152 name: "horizontalLayout"
0153 when: !items.isVertical
0154 PropertyChanges {
0155 target: layoutArea
0156 width: parent.height - bar.height * 1.2
0157 anchors.bottomMargin: 0
0158 anchors.leftMargin: 10 * ApplicationInfo.ratio
0159 }
0160 AnchorChanges {
0161 target: layoutArea
0162 anchors.top: parent.top
0163 anchors.bottom: undefined
0164 }
0165 }
0166 ]
0167 }
0168
0169 Image {
0170 id: sky
0171 anchors.top: layoutArea.top
0172 anchors.left: layoutArea.left
0173 width: layoutArea.width
0174 height: layoutArea.height * 0.305
0175 sourceSize.width: width
0176 sourceSize.height: height
0177 source: activity.url + "sky.svg"
0178 z: 1
0179 }
0180
0181 Image {
0182 id: sea
0183 anchors.left: layoutArea.left
0184 anchors.bottom: layoutArea.bottom
0185 width: layoutArea.width
0186 height: layoutArea.height * 0.7
0187 sourceSize.width: width
0188 sourceSize.height: height
0189 source: activity.url + "sea.svg"
0190 z:3
0191 }
0192
0193 Image {
0194 id: landscape
0195 anchors.fill: layoutArea
0196 sourceSize.width: width
0197 sourceSize.height: height
0198 source: activity.url + "landscape.svg"
0199 z: 6
0200 }
0201
0202 Image {
0203 id: tuxboat
0204 opacity: 1
0205 source: activity.url + "boat.svg"
0206 width: layoutArea.width * 0.12
0207 fillMode: Image.PreserveAspectFit
0208 sourceSize.width: width
0209 anchors{
0210 bottom: layoutArea.bottom
0211 bottomMargin: layoutArea.height * 0.02
0212 left: layoutArea.left
0213 leftMargin: 0
0214 }
0215 z:30
0216 state: "tuxboatLeft"
0217
0218 states: [
0219 State {
0220 name: "tuxboatLeft"
0221 PropertyChanges {
0222 target: tuxboat
0223 anchors.leftMargin: 0
0224 opacity: 1
0225 }
0226 },
0227 State {
0228 name: "tuxboatRight"
0229 PropertyChanges {
0230 target: tuxboat
0231 anchors.leftMargin: layoutArea.width - tuxboat.width
0232 opacity: 0
0233 }
0234 },
0235 State {
0236 name: "tuxboatRestarted"
0237 PropertyChanges {
0238 target: tuxboat
0239 anchors.leftMargin: layoutArea.width - tuxboat.width
0240 opacity: 0
0241 }
0242 }
0243 ]
0244
0245 transitions: [
0246 Transition {
0247 from: "tuxboatLeft"; to: "tuxboatRight";
0248 SequentialAnimation {
0249 ScriptAction { script: items.audioEffects.play("qrc:/gcompris/src/activities/watercycle/resource/harbor1.wav") }
0250 NumberAnimation { property: "anchors.leftMargin"; easing.type: Easing.InOutSine; duration: 15000 }
0251 ScriptAction { script: items.audioEffects.play("qrc:/gcompris/src/activities/watercycle/resource/harbor2.wav") }
0252 NumberAnimation { property: "opacity"; easing.type: Easing.InOutQuad; duration: 200 }
0253 ScriptAction { script: {
0254 boatparked.opacity = 1;
0255 shower.stop();
0256 if(!sun.hasRun)
0257 info.setKey('start');
0258 }
0259 }
0260 }
0261 },
0262 Transition {
0263 from: "tuxboatRight"; to: "tuxboatLeft";
0264 PropertyAction { properties: "anchors.leftMargin, opacity" }
0265 ScriptAction { script: boatparked.opacity = 0 }
0266 },
0267 Transition {
0268 from: "tuxboatRight, tuxboatLeft"; to: "tuxboatRestarted"
0269 PropertyAction { properties: "anchors.leftMargin, opacity" }
0270 }
0271 ]
0272 }
0273
0274 Image {
0275 id: boatparked
0276 source: activity.url + "boat_parked.svg"
0277 width: layoutArea.width * 0.12
0278 fillMode: Image.PreserveAspectFit
0279 sourceSize.width: width
0280 opacity: 0
0281 anchors {
0282 right: layoutArea.right
0283 bottom: layoutArea.bottom
0284 bottomMargin: tuxboat.anchors.bottomMargin
0285 }
0286 z: 29
0287 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 200 } }
0288 }
0289
0290 Image {
0291 id: sun
0292 source: activity.url + "sun.svg"
0293 width: layoutArea.width * 0.1
0294 fillMode: Image.PreserveAspectFit
0295 sourceSize.width: width
0296 anchors {
0297 left: layoutArea.left
0298 top: layoutArea.top
0299 leftMargin: layoutArea.width * 0.056
0300 topMargin: layoutArea.height * 0.056
0301 }
0302 z: 2
0303 property bool hasRun: false
0304 MouseArea {
0305 id: sun_area
0306 anchors.fill: sun
0307 onClicked: {
0308 if(cloud.opacity == 0)
0309 sun.state = "sunUp";
0310 }
0311 }
0312 state: "sunUp"
0313
0314 states: [
0315 State {
0316 name: "sunDown"
0317 PropertyChanges {
0318 target: sun
0319 anchors.topMargin: layoutArea.height * 0.256
0320 }
0321 },
0322 State {
0323 name: "sunUp"
0324 PropertyChanges {
0325 target: sun
0326 anchors.topMargin: layoutArea.height * 0.056
0327 }
0328 }
0329 ]
0330
0331 transitions: [
0332 Transition {
0333 from: "sunUp"; to: "sunDown";
0334 NumberAnimation { property: "anchors.topMargin"; easing.type: Easing.InOutQuad; duration: 5000 }
0335 },
0336 Transition {
0337 from: "sunDown"; to: "sunUp";
0338 ScriptAction { script: {
0339 items.audioEffects.play('qrc:/gcompris/src/core/resource/sounds/bleep.wav');
0340 info.setKey('sun');
0341 sun.hasRun = true;
0342 vapor.animLoop = true;
0343 vapor.state = "vaporUp";
0344 cloud.isUp = true;
0345 }
0346 }
0347 NumberAnimation { property: "anchors.topMargin"; easing.type: Easing.InOutQuad; duration: 5000 }
0348 }
0349 ]
0350 }
0351
0352 Image {
0353 id: vapor
0354 opacity: 0
0355 source: activity.url + "vapor.svg"
0356 width: layoutArea.width * 0.1
0357 fillMode: Image.PreserveAspectFit
0358 sourceSize.width: width
0359 property bool animLoop: false
0360 anchors {
0361 left: sun.left
0362 top: layoutArea.top
0363 topMargin: layoutArea.height * 0.28
0364 }
0365 z: 10
0366 state: "vaporDown"
0367
0368 states: [
0369 State {
0370 name: "vaporDown"
0371 PropertyChanges {
0372 target: vapor
0373 opacity: 0
0374 anchors.topMargin: layoutArea.height * 0.28
0375 }
0376 },
0377 State {
0378 name: "vaporUp"
0379 PropertyChanges {
0380 target: vapor
0381 opacity: 1
0382 anchors.topMargin: layoutArea.height * 0.1
0383 }
0384 },
0385 State {
0386 name: "vaporDownRestarted"
0387 PropertyChanges {
0388 target: vapor
0389 opacity: 0
0390 anchors.topMargin: layoutArea.height * 0.28
0391 }
0392 }
0393 ]
0394
0395 transitions: [
0396 Transition {
0397 from: "vaporDown, vaporDownRestarted"; to: "vaporUp";
0398 SequentialAnimation {
0399 NumberAnimation { property: "opacity"; duration: 200 }
0400 NumberAnimation { property: "anchors.topMargin"; duration: 5000 }
0401 ScriptAction { script: vapor.state = "vaporDown" }
0402 }
0403 },
0404 Transition {
0405 from: "vaporUp"; to: "vaporDown";
0406 SequentialAnimation {
0407 NumberAnimation { property: "opacity"; duration: 200 }
0408 PropertyAction { property: "anchors.topMargin" }
0409 ScriptAction { script: {
0410 if(vapor.animLoop === true) {
0411 vapor.animLoop = false;
0412 vapor.state = "vaporUp";
0413 } else {
0414 info.setKey("cloud");
0415 }
0416 }
0417 }
0418 }
0419 },
0420 Transition {
0421 from: "vaporUp, vaporDown"; to: "vaporDownRestarted";
0422 ScriptAction { script: vapor.animLoop = false }
0423 PropertyAction { properties: "anchors.topMargin, opacity" }
0424 }
0425 ]
0426 }
0427
0428 Image {
0429 id: cloud
0430 opacity: 0
0431 source: activity.url + "cloud.svg"
0432 sourceSize.width: layoutArea.width * 0.256
0433 fillMode: Image.PreserveAspectFit
0434 width: 0
0435 property bool isUp: false
0436 property double originMargin: layoutArea.width * 0.05
0437 property double upMargin: layoutArea.width * 0.38
0438 anchors {
0439 top: layoutArea.top
0440 topMargin: originMargin
0441 left: layoutArea.left
0442 leftMargin: originMargin
0443 }
0444 z: 11
0445
0446 states: [
0447 State {
0448 name: "cloudIsDown"
0449 when: !cloud.isUp
0450 PropertyChanges {
0451 target: cloud
0452 opacity: 0
0453 width: 0
0454 anchors.leftMargin: cloud.originMargin
0455 }
0456 },
0457 State {
0458 name: "cloudIsUp"
0459 when: cloud.isUp
0460 PropertyChanges {
0461 target: cloud
0462 opacity: 1
0463 width: cloud.sourceSize.width
0464 anchors.leftMargin: cloud.upMargin
0465 }
0466 }
0467 ]
0468
0469 transitions: [
0470 Transition {
0471 from: "cloudIsDown"; to: "cloudIsUp";
0472 NumberAnimation { property: "opacity"; easing.type: Easing.InOutQuad; duration: 5000 }
0473 NumberAnimation { properties: "width, anchors.leftMargin"; easing.type: Easing.InOutQuad; duration: 15000 }
0474 },
0475 Transition {
0476 from: "cloudIsUp"; to: "cloudIsDown";
0477 PropertyAction { properties: "opacity, width, anchors.leftMargin" }
0478 }
0479 ]
0480
0481 MouseArea {
0482 id: cloud_area
0483 anchors.fill: cloud
0484 enabled: info.newKey === 'cloud'
0485 onClicked: {
0486 sun.state = "sunDown";
0487 rain.up();
0488 }
0489 }
0490 }
0491
0492 Image {
0493 id: rain
0494 source: activity.url + "rain.svg"
0495 width: layoutArea.height * 0.146
0496 fillMode: Image.PreserveAspectFit
0497 sourceSize.width: width
0498 opacity: 0
0499 anchors {
0500 top: layoutArea.top
0501 topMargin: layoutArea.width * 0.123
0502 left: cloud.left
0503 leftMargin: cloud.width * 0.25
0504 }
0505 z: 12
0506 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 300 } }
0507 SequentialAnimation{
0508 id: rainAnim
0509 running: false
0510 loops: 10
0511 NumberAnimation {
0512 target: rain
0513 property: "scale"
0514 duration: 500
0515 to: 0.95
0516 }
0517 NumberAnimation {
0518 target: rain
0519 property: "scale"
0520 duration: 500
0521 to: 1
0522 }
0523 onRunningChanged: {
0524 if(!running) {
0525 rain.down();
0526 cloud.isUp = false;
0527 }
0528 }
0529 }
0530 function up() {
0531 items.audioEffects.play('qrc:/gcompris/src/core/resource/sounds/water.wav');
0532 info.setKey('rain');
0533 opacity = 1;
0534 rainAnim.start();
0535 }
0536 function down() {
0537 scale = 0;
0538 opacity = 0;
0539 }
0540 }
0541
0542 Image {
0543 id: river
0544 source: activity.url + "river.svg"
0545 width: layoutArea.width * 0.431
0546 sourceSize.width: width
0547 fillMode: Image.PreserveAspectFit
0548 opacity: level > 0 ? 1 : 0
0549 anchors {
0550 top: layoutArea.top
0551 left: layoutArea.left
0552 topMargin: layoutArea.height * 0.3309
0553 leftMargin: layoutArea.width * 0.292
0554 }
0555 z: 10
0556 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 5000 } }
0557 property double level: 0
0558 }
0559
0560 Image {
0561 id: reservoir1
0562 source: activity.url + "reservoir1.svg"
0563 width: layoutArea.width * 0.112
0564 fillMode: Image.PreserveAspectFit
0565 sourceSize.width: width
0566 anchors {
0567 top: layoutArea.top
0568 left: layoutArea.left
0569 topMargin: layoutArea.height * 0.3309
0570 leftMargin: layoutArea.width * 0.2948
0571 }
0572 opacity: river.level > 0.2 ? 1 : 0
0573 z: 10
0574 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 5000 } }
0575 }
0576
0577 Image {
0578 id: reservoir2
0579 source: activity.url + "reservoir2.svg"
0580 width: layoutArea.width * 0.1604
0581 fillMode: Image.PreserveAspectFit
0582 sourceSize.width: width
0583 anchors {
0584 top: layoutArea.top
0585 left: layoutArea.left
0586 topMargin: layoutArea.height * 0.3309
0587 leftMargin: layoutArea.width * 0.2691
0588 }
0589 opacity: river.level > 0.5 ? 1 : 0
0590 z: 10
0591 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 5000 } }
0592 }
0593
0594 Image {
0595 id: reservoir3
0596 source: activity.url + "reservoir3.svg"
0597 width: layoutArea.width * 0.1965
0598 fillMode: Image.PreserveAspectFit
0599 sourceSize.width: width
0600 anchors {
0601 top: layoutArea.top
0602 left: layoutArea.left
0603 topMargin: layoutArea.height * 0.3309
0604 leftMargin: layoutArea.width * 0.2532
0605 }
0606 opacity: river.level > 0.8 ? 1 : 0
0607 z: 10
0608 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 5000 } }
0609 }
0610
0611 Image {
0612 id: waterplant
0613 source: activity.url + "motor.svg"
0614 width: layoutArea.width * 0.083
0615 fillMode: Image.PreserveAspectFit
0616 sourceSize.width: width
0617 anchors {
0618 top: layoutArea.top
0619 left: layoutArea.left
0620 topMargin: layoutArea.height * 0.367
0621 leftMargin: layoutArea.width * 0.371
0622 }
0623 z: 20
0624 property bool running: false
0625 MouseArea {
0626 id: motor_area
0627 enabled: river.level > 0.2
0628 anchors.fill: parent
0629 onClicked: {
0630 items.audioEffects.play('qrc:/gcompris/src/activities/watercycle/resource/bubble.wav');
0631 info.setKey('tower');
0632 waterplant.running = true;
0633 }
0634 }
0635 }
0636
0637 Image {
0638 id: fillpipe
0639 width: layoutArea.width * 0.354
0640 sourceSize.width: width
0641 fillMode: Image.PreserveAspectFit
0642 source: activity.url + "fillwater.svg"
0643 opacity: waterplant.running ? 1 : 0.2
0644 anchors {
0645 top: layoutArea.top
0646 left: layoutArea.left
0647 topMargin: layoutArea.height * 0.405
0648 leftMargin: layoutArea.width * 0.422
0649 }
0650 z: 9
0651 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 300 } }
0652 }
0653
0654 Image {
0655 id: sewageplant
0656 source: activity.url + "waste.svg"
0657 height: layoutArea.height * 0.144
0658 sourceSize.height: height
0659 fillMode: Image.PreserveAspectFit
0660 anchors {
0661 top: layoutArea.top
0662 left: layoutArea.left
0663 topMargin: layoutArea.height * 0.778
0664 leftMargin: layoutArea.width * 0.682
0665 }
0666 z: 11
0667 property bool running: false
0668 MouseArea {
0669 id: waste_area
0670 enabled: river.opacity == 1
0671 anchors.fill: parent
0672 onClicked: {
0673 items.audioEffects.play('qrc:/gcompris/src/activities/watercycle/resource/bubble.wav');
0674 info.setKey('shower');
0675 sewageplant.running = true;
0676 }
0677 }
0678 }
0679
0680 Image {
0681 id: wastepipe
0682 width: layoutArea.width * 0.275
0683 sourceSize.width: width
0684 fillMode: Image.PreserveAspectFit
0685 source: activity.url + "wastewater.svg"
0686 opacity: sewageplant.running ? 1 : 0.2
0687 anchors {
0688 top: layoutArea.top
0689 left: layoutArea.left
0690 topMargin: layoutArea.height * 0.597
0691 leftMargin: layoutArea.width * 0.536
0692 }
0693 z: 10
0694 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 300 } }
0695 }
0696
0697 Image {
0698 id: tower
0699 source: activity.url + "watertower.svg"
0700 width: layoutArea.width * 0.135
0701 sourceSize.width: width
0702 fillMode: Image.PreserveAspectFit
0703 anchors {
0704 top: layoutArea.top
0705 left: layoutArea.left
0706 topMargin: layoutArea.height * 0.226
0707 leftMargin: layoutArea.width * 0.686
0708 }
0709 z: 10
0710 property double level: 0
0711
0712 Image {
0713 id: towerfill
0714 scale: tower.level
0715 source: activity.url + "watertowerfill.svg"
0716 width: tower.width * 0.5
0717 sourceSize.width: width
0718 fillMode: Image.PreserveAspectFit
0719 anchors {
0720 top: tower.top
0721 topMargin: tower.height * 0.085
0722 horizontalCenter: tower.horizontalCenter
0723 }
0724 Behavior on scale { PropertyAnimation { duration: timer.interval } }
0725 }
0726 }
0727
0728 Image {
0729 id: shower
0730 source: activity.url + "shower.svg"
0731 width: layoutArea.width * 0.184
0732 sourceSize.width: width
0733 fillMode: Image.PreserveAspectFit
0734 anchors {
0735 top: layoutArea.top
0736 left: layoutArea.left
0737 topMargin: layoutArea.height * 0.557
0738 leftMargin: layoutArea.width * 0.791
0739 }
0740 z: 10
0741 visible: false
0742 property bool on: false
0743
0744 MouseArea {
0745 id: shower_area
0746 anchors.fill: parent
0747 onClicked: {
0748 if(!shower.on &&
0749 wastepipe.opacity > 0.8 &&
0750 fillpipe.opacity > 0.8 && tower.level > 0.5)
0751 shower.start();
0752 else
0753 shower.stop();
0754 }
0755 }
0756
0757 function start() {
0758 shower.on = true;
0759 shower.visible = true;
0760 tuxbath.visible = true;
0761
0762 if(!items.cycleDone) {
0763 info.setKey('done');
0764 bonus.good('smiley');
0765 items.cycleDone = true;
0766 }
0767 items.audioEffects.play('qrc:/gcompris/src/activities/watercycle/resource/apert.wav');
0768 }
0769
0770 function stop() {
0771 shower.on = false;
0772 shower.visible = true;
0773 tuxbath.visible = false;
0774 }
0775 function hide() {
0776 shower.visible = false;
0777 shower.on = false;
0778 tuxbath.visible = false;
0779 }
0780 }
0781
0782 Image {
0783 id: tuxbath
0784 source: activity.url + "tuxbath.svg"
0785 width: shower.width
0786 sourceSize.width: width
0787 fillMode: Image.PreserveAspectFit
0788 anchors.centerIn: shower
0789 z: 10
0790 visible: false
0791 }
0792
0793 Image {
0794 id: city
0795 source: activity.url + "city.svg"
0796 width: layoutArea.width * 0.202
0797 sourceSize.width: width
0798 fillMode: Image.PreserveAspectFit
0799 anchors {
0800 top: layoutArea.top
0801 left: layoutArea.left
0802 topMargin: layoutArea.height * 0.465
0803 leftMargin: layoutArea.width * 0.44
0804 }
0805 z: 10
0806 }
0807
0808 Image {
0809 id: tuxHouse
0810 source: activity.url + "tuxHouse.svg"
0811 width: layoutArea.width * 0.036
0812 sourceSize.width: width
0813 fillMode: Image.PreserveAspectFit
0814 anchors {
0815 top: layoutArea.top
0816 left: layoutArea.left
0817 topMargin: layoutArea.height * 0.638
0818 leftMargin: layoutArea.width * 0.765
0819 }
0820 z: 10
0821 }
0822
0823 // Manage stuff that changes periodically
0824 Timer {
0825 id: timer
0826 interval: 100
0827 running: true
0828 repeat: true
0829 onTriggered: {
0830 if(rain.opacity > 0.9 && river.level < 1) {
0831 river.level += 0.01;
0832 }
0833 if(river.level > 0 && fillpipe.opacity > 0.9 && tower.level < 1 && !shower.on) {
0834 river.level -= 0.02;
0835 tower.level += 0.05;
0836 }
0837 if(tower.level > 0 && shower.on) {
0838 tower.level -= 0.02;
0839 }
0840 if(tower.level <= 0 && boatparked.opacity) {
0841 shower.stop();
0842 }
0843 }
0844 }
0845
0846 GCText {
0847 id: info
0848 visible: false
0849 fontSize: smallSize
0850 font.weight: Font.DemiBold
0851 horizontalAlignment: Text.AlignHCenter
0852 anchors {
0853 top: parent.top
0854 topMargin: 5 * ApplicationInfo.ratio
0855 right: parent.right
0856 rightMargin: 5 * ApplicationInfo.ratio
0857 left: parent.left
0858 }
0859 width: parent.width
0860 wrapMode: Text.WordWrap
0861 z: 100
0862 onTextChanged: textanim.start();
0863 property string newKey
0864
0865 states: [
0866 State {
0867 name: "verticalInfo"
0868 when: items.isVertical
0869 PropertyChanges {
0870 target: info
0871 anchors.leftMargin: 5 * ApplicationInfo.ratio
0872 }
0873 },
0874 State {
0875 name: "horizontalInfoSide"
0876 when: !items.isVertical && items.textOnSide
0877 PropertyChanges {
0878 target: info
0879 anchors.leftMargin: layoutArea.width + 15 * ApplicationInfo.ratio
0880 }
0881 },
0882 State {
0883 name: "horizontalInfoOver"
0884 when: !items.isVertical && !items.textOnSide
0885 PropertyChanges {
0886 target: info
0887 anchors.leftMargin: parent.width * 0.5
0888 }
0889 }
0890 ]
0891
0892 SequentialAnimation {
0893 id: textanim
0894 NumberAnimation {
0895 target: info
0896 property: "opacity"
0897 duration: 200
0898 from: 1
0899 to: 0
0900 }
0901 ScriptAction {
0902 script: if(items.cycleDone && info.newKey != "done") info.visible = false;
0903 }
0904 PropertyAction {
0905 target: info
0906 property: 'text'
0907 value: items.dataset[info.newKey]
0908 }
0909 NumberAnimation {
0910 target: info
0911 property: "opacity"
0912 duration: 200
0913 from: 0
0914 to: 1
0915 }
0916 }
0917
0918 function setKey(key) {
0919 if(newKey != key) {
0920 newKey = key;
0921 textanim.start();
0922 }
0923 }
0924 }
0925
0926 Rectangle {
0927 id: infoBg
0928 z: 99
0929 anchors.fill: info
0930 color: '#D2D2D2'
0931 radius: width * 0.01
0932 opacity: info.text ? 0.7 : 0
0933 visible: info.visible
0934 Behavior on opacity { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 200 } }
0935 }
0936
0937 DialogHelp {
0938 id: dialogHelp
0939 onClose: home();
0940 }
0941
0942 Bar {
0943 id: bar
0944 content: BarEnumContent { value: help | home | reload}
0945 onHelpClicked: {
0946 displayDialog(dialogHelp);
0947 }
0948 onHomeClicked: home()
0949 onReloadClicked: initLevel();
0950 }
0951
0952 Bonus {
0953 id:bonus
0954 }
0955
0956 }
0957 }