Warning, /education/gcompris/src/activities/land_safe/LandSafe.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - LandSafe.qml
0002 *
0003 * SPDX-FileCopyrightText: 2016 Holger Kaelberer <holger.k@elberer.de>
0004 *
0005 * Authors:
0006 * Matilda Bernard <serah4291@gmail.com> (GTK+ version)
0007 * Holger Kaelberer <holger.k@elberer.de> (Qt Quick port)
0008 *
0009 * SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 import QtQuick 2.12
0012 import Box2D 2.0
0013 import QtQuick.Particles 2.12
0014 import GCompris 1.0
0015
0016 import "../../core"
0017 import "land_safe.js" as Activity
0018
0019 ActivityBase {
0020 id: activity
0021
0022 property bool inForeground: false // to avoid unneeded reconfigurations
0023
0024 onStart: {
0025 inForeground = true;
0026 focus = true;
0027 }
0028 onStop: inForeground = false;
0029
0030 Keys.onPressed: Activity.processKeyPress(event);
0031 Keys.onReleased: Activity.processKeyRelease(event);
0032
0033 onWidthChanged: if (inForeground)
0034 Activity.initLevel();
0035
0036 onHeightChanged: if (inForeground)
0037 Activity.initLevel();
0038
0039 pageComponent: Image {
0040 id: background
0041
0042 source: Activity.baseUrl + "/background.svg";
0043 anchors.centerIn: parent
0044 anchors.fill: parent
0045 fillMode: Image.PreserveAspectCrop
0046 sourceSize.height: height
0047
0048 signal start
0049 signal stop
0050
0051 function changeZoom(newZoom)
0052 {
0053 var dZoom = newZoom / items.zoom;
0054 var curAltReal = Activity.getAltitudeReal();
0055 items.world.pixelsPerMeter *= dZoom;
0056 var altPx = curAltReal * items.world.pixelsPerMeter;
0057 var rdy;
0058 var rdx;
0059 var ldx;
0060 if (dZoom < 1) {
0061 rdy = items.rocket.height*dZoom;
0062 rdx = items.rocket.width*dZoom/2;
0063 ldx = items.landing.width*dZoom/2;
0064 } else {
0065 rdy = -items.rocket.height/dZoom*2;
0066 rdx = -items.rocket.width/dZoom;
0067 ldx = -items.landing.width/dZoom;
0068 }
0069 items.rocket.y = Activity.pxAltitudeToY(altPx) + rdy;
0070 items.rocket.x += rdx;
0071 items.landing.anchors.leftMargin += ldx;
0072 items.zoom = newZoom;
0073 if (dZoom < 1)
0074 Activity.zoomStack.unshift(curAltReal);
0075 else
0076 Activity.zoomStack.shift();
0077 }
0078
0079 Component.onCompleted: {
0080 dialogActivityConfig.initialize();
0081 activity.start.connect(start);
0082 activity.stop.connect(stop);
0083 }
0084
0085 // Needed to get keyboard focus on IntroMessage
0086 Keys.forwardTo: intro
0087
0088 // Add here the QML items you need to access in javascript
0089 QtObject {
0090 id: items
0091 property Item main: activity.main
0092 property alias background: background
0093 property alias bar: bar
0094 property int currentLevel: activity.currentLevel
0095 property alias bonus: bonus
0096 property alias rocket: rocket
0097 property alias leftEngine: leftEngine
0098 property alias rightEngine: rightEngine
0099 property alias bottomEngine: bottomEngine
0100 property alias explosion: explosion
0101 property alias world: physicsWorld
0102 property alias landing: landing
0103 property alias ground: ground
0104 property alias intro: intro
0105 property alias ok: ok
0106 property alias leftRightControl: leftRightControl
0107 property alias upDownControl: upDownControl
0108 property alias accelerometer: accelerometer
0109 property string accelerometerText: "<font color=\"#00FFFFFF\">-0</font>0.00"
0110 property var rocketCategory: Fixture.Category1
0111 property var groundCategory: Fixture.Category2
0112 property var landingCategory: Fixture.Category3
0113 readonly property var levels: activity.datasetLoader.data
0114 property string mode: "rotate" // "simple"
0115 property double velocity: 0.0
0116 property string velocityText: "<font color=\"#00FFFFFF\">-0</font>0.0"
0117 property double altitude: 0.0
0118 property string altitudeText: "<font color=\"#00FFFFFF\">00</font>0"
0119 property double fuel: 100
0120 property string fuelText: "100"
0121 property double lastVelocity: 0.0
0122 property double gravity: 0.0
0123 property double scale: background.height / 400
0124 property double zoom: 1.0
0125 property bool onScreenControls: /* items.world.running && */ ApplicationInfo.isMobile
0126 }
0127
0128 onStart: { Activity.start(items) }
0129 onStop: {
0130 timer0.stop()
0131 Activity.stop()
0132 }
0133 onVisibleChanged: visible ? physicsWorld.running = true : physicsWorld.running = false
0134
0135 World {
0136 id: physicsWorld
0137
0138 running: false;
0139 gravity: Qt.point(0, items.gravity)
0140 autoClearForces: false
0141 //timeStep: 1.0/60.0 // default: 60Hz
0142
0143 onStepped: {
0144 if(intro.visible) return;
0145 if (Math.abs(rocket.body.linearVelocity.y) > 0.01) // need to store velocity before it is aaaalmost 0 because of ground/landing contact
0146 items.lastVelocity = items.velocity;
0147 items.velocity = rocket.body.linearVelocity.y;
0148 items.velocityText = Activity.fixedSizeString(items.velocity, 10, 5, ".0");
0149
0150 if (rocket.body.linearVelocity.y > Activity.maxLandingVelocity)
0151 landing.overlayColor = "-r"; // redish
0152 else if (explosion.visible == true)
0153 landing.overlayColor = "-r";
0154 else if (rocket.body.linearVelocity.y > Activity.maxLandingVelocity - 2)
0155 landing.overlayColor = "-y"; // yellowish
0156 else
0157 landing.overlayColor = "-g"; // greenish
0158 items.altitude = Math.max(0, Math.round(Activity.getAltitudeReal()));
0159 items.altitudeText = Activity.minimum3Chars(items.altitude);
0160
0161 if (Activity.maxFuel != -1) {
0162 // update fuel:
0163 var dt = timeStep;
0164 var dFuel = -(dt * (items.rocket.accel + items.rocket.leftAccel
0165 + items.rocket.rightAccel));
0166 Activity.currentFuel = Math.max(0, Activity.currentFuel + dFuel);
0167 items.fuel = Math.round(Activity.currentFuel / Activity.maxFuel * 100);
0168 if (Activity.currentFuel === 0) // fuel consumed
0169 items.rocket.accel = items.rocket.leftAccel = items.rocket.rightAccel = 0;
0170 } else
0171 items.fuel = 100;
0172 items.fuelText = Activity.minimum3Chars(items.fuel);
0173 if (items.rocket.x > background.width)
0174 items.rocket.x = -items.rocket.width;
0175 if (items.rocket.x < -items.rocket.width)
0176 items.rocket.x = background.width;
0177
0178 if (items.rocket.y < 0)
0179 background.changeZoom(items.zoom / 2);
0180 else if (Activity.zoomStack.length > 0 && items.altitude < Activity.zoomStack[0]-1)
0181 background.changeZoom(items.zoom * 2);
0182 }
0183 }
0184
0185 MouseArea {
0186 id: mouse
0187 anchors.fill: parent
0188 onClicked: debugDraw.visible = !debugDraw.visible;
0189 enabled: Activity.debugDraw
0190 }
0191
0192 Item {
0193 id: rocket
0194 property double accel: 0.0
0195 property double leftAccel: 0.0
0196 property double rightAccel: 0.0
0197 property alias body: rocketBody
0198
0199 function show() {
0200 opacity = 100;
0201 }
0202 function hide() {
0203 opacity = 0;
0204 }
0205
0206 Behavior on opacity {
0207 NumberAnimation {
0208 duration: 500
0209 easing.type: Easing.OutExpo
0210 }
0211 }
0212
0213 //property float rotate
0214
0215 rotation: 0
0216 width: items.scale * 28 * items.zoom// * ApplicationInfo.ratio
0217 height: width / 232 * 385
0218 x: 300
0219 y: 50
0220 z: 4
0221
0222 // Component.onCompleted: rocket.body.applyForceToCenter(Qt.point(0, 5));
0223
0224 onAccelChanged: applyForces();
0225 onLeftAccelChanged: applyForces();
0226 onRightAccelChanged: applyForces();
0227 onRotationChanged: if (accel > 0) // should only happen in
0228 applyForces(); // "rotation" mode
0229
0230 // decompose a force/acceleration vector v using angle into x/y components
0231 function decomposeVector(v, angle) {
0232 return Qt.point(v * Math.sin(Activity.degToRad(angle)), // x-component
0233 v * Math.cos(Activity.degToRad(items.rocket.rotation))); // y-component
0234 }
0235
0236 // map acceleration to box2d forces applying appropriate factors:
0237 function applyForces()
0238 {
0239 var totForce = (accel / 0.5 * 5);
0240 var v;
0241
0242 if (items.mode === "simple")
0243 v = Qt.point((leftAccel-rightAccel)
0244 * 10 /* base of 10 m/s^2 */
0245 * 5, /* factor to make movement smooth */
0246 -totForce
0247 );
0248 else { // "rotation"
0249 v = decomposeVector(totForce, rotation);
0250 v.y = -v.y;
0251 }
0252 v.x *= items.rocket.body.getMass();
0253 v.y *= items.rocket.body.getMass();
0254
0255 physicsWorld.clearForces();
0256 items.rocket.body.applyForceToCenter(v);
0257 // console.log("XXX rocket.acc=" + rocket.accel + " acc.current=" + items.accelerometer.current + " bottomMargin=" + items.accelerometer.currentRect.bottomMargin);
0258 }
0259
0260 Image {
0261 id: rocketImage
0262
0263 sourceSize.width: 1024
0264 source: Activity.baseUrl + "/rocket.svg"
0265 anchors.centerIn: parent
0266 anchors.fill: parent
0267 z: 4
0268 mipmap: true
0269 }
0270
0271 Body {
0272 id: rocketBody
0273
0274 target: rocket
0275 bodyType: Body.Dynamic
0276 sleepingAllowed: false
0277 fixedRotation: true
0278 linearDamping: 0
0279 property double rotation: Activity.degToRad(rocket.rotation % 360)
0280
0281 fixtures: Box {
0282 id: rocketFixture
0283 categories: items.rocketCategory
0284 collidesWith: items.groundCategory | items.landingCategory
0285 density: 1
0286 friction: 0
0287 restitution: 0
0288 width: rocket.width
0289 height: rocket.height
0290 rotation: rocketBody.rotation
0291
0292 onBeginContact: {
0293 //console.log("XXX beginning contact with " + other.getBody().target.collisionName + " abs v=" + Math.abs(items.lastVelocity) + + " maxV=" + Activity.maxLandingVelocity);
0294 if (other.getBody().target === landing &&
0295 Math.abs(items.lastVelocity) <= Activity.maxLandingVelocity &&
0296 (items.mode === "simple" || rocket.rotation%360 === 0))
0297 Activity.finishLevel(true);
0298 else // ground
0299 Activity.finishLevel(false); // crash
0300 }
0301 // onEndContact: console.log("XXX ending contact with " + other.getBody().target.collisionName);
0302 }
0303 }
0304
0305 Image {
0306 id: softLeftEngine
0307 source: Activity.baseUrl + "/engine.svg"
0308 rotation: 90
0309 anchors.right: parent.left
0310 anchors.verticalCenter: parent.verticalCenter
0311 width: rocket.leftAccel > 0 ?
0312 rocket.width * 0.2 + rocket.width * rocket.leftAccel : 0
0313 height: width * 2 + width * rocket.leftAccel
0314 sourceSize.width: width
0315 sourceSize.height: height
0316 visible: ApplicationInfo.useOpenGL ? false : true
0317 }
0318
0319 ParticleSystem {
0320 id: leftEngine
0321
0322 anchors.left: parent.left
0323 anchors.leftMargin: 10
0324 anchors.verticalCenter: parent.verticalCenter
0325 height: 30
0326
0327 ImageParticle {
0328 groups: ["flameLeft"]
0329 source: "qrc:///particleresources/glowdot.png"
0330 color: "#11ff400f"
0331 colorVariation: 0.1
0332 }
0333 Emitter {
0334 anchors.centerIn: parent
0335 group: "flameLeft"
0336
0337 emitRate: (rocket.leftAccel > 0 ? 50 * items.scale / 1.9 : 0) * items.zoom // 50
0338 lifeSpan: (rocket.leftAccel > 0 ? 600 * items.scale / 1.9 : 0) * items.zoom // 600
0339 size: rocket.leftAccel > 0 ? leftEngine.height : 0
0340 endSize: 5
0341 sizeVariation: 3
0342 acceleration: PointDirection { x: -40 }
0343 velocity: PointDirection { x: -40 }
0344 }
0345 }
0346
0347 Image {
0348 id: softRightEngine
0349 source: Activity.baseUrl + "/engine.svg"
0350 rotation: -90
0351 anchors.left: parent.right
0352 anchors.verticalCenter: parent.verticalCenter
0353 width: rocket.rightAccel > 0 ?
0354 rocket.width * 0.2 + rocket.width * rocket.rightAccel : 0
0355 height: width * 2 + width * rocket.rightAccel
0356 sourceSize.width: width
0357 sourceSize.height: height
0358 visible: ApplicationInfo.useOpenGL ? false : true
0359 }
0360
0361 ParticleSystem {
0362 id: rightEngine
0363
0364 anchors.right: parent.right
0365 anchors.rightMargin: 10
0366 anchors.verticalCenter: parent.verticalCenter
0367 height: 30
0368
0369 ImageParticle {
0370 groups: ["flameRight"]
0371 source: "qrc:///particleresources/glowdot.png"
0372 color: "#11ff400f"
0373 colorVariation: 0.1
0374 }
0375 Emitter {
0376 anchors.centerIn: parent
0377 group: "flameRight"
0378
0379 emitRate: (rocket.rightAccel > 0 ? 50 * items.scale / 1.9 : 0) * items.zoom // 50
0380 lifeSpan: (rocket.rightAccel > 0 ? 600 * items.scale / 1.9 : 0) * items.zoom // 600
0381 size: rocket.rightAccel > 0 ? rightEngine.height : 0
0382 endSize: 5
0383 sizeVariation: 3
0384 acceleration: PointDirection { x: 40 }
0385 velocity: PointDirection { x: 40 }
0386 }
0387 }
0388
0389 Image {
0390 id: softBottomEngine
0391 source: Activity.baseUrl + "/engine.svg"
0392 anchors.top: parent.bottom
0393 anchors.topMargin: -5 * ApplicationInfo.ratio
0394 anchors.horizontalCenter: parent.horizontalCenter
0395 width: rocket.width * 0.5 + rocket.width * rocket.accel
0396 height: rocket.accel > 0 ? width * 2 : 0
0397 sourceSize.width: width
0398 sourceSize.height: height
0399 visible: ApplicationInfo.useOpenGL ? false : true
0400 }
0401
0402 ParticleSystem {
0403 id: bottomEngine
0404 anchors.top: parent.bottom
0405 anchors.topMargin: 5
0406 anchors.horizontalCenter: parent.horizontalCenter
0407 width: rocket.width
0408
0409 ImageParticle {
0410 groups: ["flame"]
0411 source: "qrc:///particleresources/glowdot.png"
0412 color: "#11ff400f"
0413 colorVariation: 0.1
0414 }
0415 Emitter {
0416 anchors.centerIn: parent
0417 group: "flame"
0418
0419 emitRate: (rocket.accel > 0 ? (80 + 60 * rocket.accel) : 0) * items.zoom // 75-150
0420 lifeSpan: ((700 + 450 * rocket.accel) * items.scale / 2.5) * items.zoom // 500 - 1000
0421 size: rocket.width/1.8 + rocket.width/2*rocket.accel // width*-0.5 - width
0422 endSize: size/1.85
0423 sizeVariation: 5
0424 acceleration: PointDirection { y: 80 }
0425 velocity: PointDirection { y: 80 }
0426 }
0427 }
0428
0429 }
0430
0431 ParticleSystem {
0432 id: explosion
0433 anchors.centerIn: rocket
0434 width: rocket.width
0435 z: 5
0436
0437 ImageParticle {
0438 groups: ["flame"]
0439 source: "qrc:///particleresources/glowdot.png"
0440 color: "#11ff400f"
0441 colorVariation: 0.1
0442 }
0443 Emitter {
0444 anchors.centerIn: parent
0445 group: "flame"
0446 emitRate: 75 // 75-150
0447 lifeSpan: 300 // 500 - 1000
0448 size: rocket.width * 3 // width*-0.5 - width
0449 endSize: 0
0450 sizeVariation: 5
0451 acceleration: PointDirection { x: 0 }
0452 velocity: PointDirection { x: 0 }
0453 }
0454
0455 Timer {
0456 id: timer0
0457 interval: 600; running: false; repeat: false
0458 onTriggered: explosion.opacity = 0
0459 }
0460
0461 function show() {
0462 visible = true;
0463 opacity = 100
0464 scale = 1;
0465 timer0.running = true
0466 }
0467 function hide() {
0468 visible = false;
0469 scale = 0;
0470 timer0.running = false
0471 }
0472
0473 Behavior on opacity {
0474 NumberAnimation {
0475 duration: 300
0476 easing.type: Easing.InExpo
0477 }
0478 }
0479
0480 }
0481
0482 Image {
0483 id: ground
0484
0485 z: 1
0486 width: parent.width
0487 height: parent.height/7
0488 sourceSize.width: width
0489 sourceSize.height: height
0490 source: Activity.baseUrl + "/ground.svg"
0491 anchors.left: parent.left
0492 anchors.right: parent.right
0493 anchors.bottom: parent.bottom
0494
0495 readonly property string collisionName: "ground"
0496 property int surfaceOffset: height/2
0497
0498 Body {
0499 id: groundBody
0500
0501 target: ground
0502 bodyType: Body.Static
0503 sleepingAllowed: true
0504 fixedRotation: true
0505 linearDamping: 0
0506
0507 fixtures: Box {
0508 id: groundFixture
0509
0510 categories: items.groundCategory
0511 collidesWith: items.rocketCategory
0512 density: 1
0513 friction: 0
0514 restitution: 0
0515 width: ground.width
0516 height: ground.height - ground.surfaceOffset
0517 x: 0
0518 y: ground.surfaceOffset
0519 }
0520 }
0521 }
0522
0523
0524 Image {
0525 id: landing
0526
0527 readonly property string collisionName: "landing"
0528 property int surfaceOffset: landing.height * 0.8
0529 property string overlayColor: "-g"
0530
0531 z: 2
0532 source: Activity.baseUrl + "/landing" + overlayColor + ".svg";
0533 anchors.left: ground.left
0534 anchors.leftMargin: 270
0535 anchors.top: ground.top
0536 anchors.topMargin: ground.surfaceOffset - height
0537 width: 66 * items.scale * items.zoom
0538 height: width / 7 * 2
0539
0540 Body {
0541 id: landingBody
0542
0543 target: landing
0544 bodyType: Body.Static
0545 sleepingAllowed: true
0546 fixedRotation: true
0547 linearDamping: 0
0548
0549 fixtures: Box {
0550 id: landingFixture
0551
0552 categories: items.landingCategory
0553 collidesWith: items.rocketCategory
0554 density: 1
0555 friction: 0
0556 restitution: 0
0557 width: landing.width
0558 height: landing.height - landing.surfaceOffset
0559 y: landing.surfaceOffset
0560 }
0561 }
0562 }
0563
0564 Item {
0565 id: osdWrapper
0566
0567 anchors.right: background.right
0568 anchors.rightMargin: 10 * ApplicationInfo.ratio
0569 anchors.bottom: bar.top
0570 anchors.bottomMargin: 20 * ApplicationInfo.ratio
0571 anchors.top: background.top
0572 width: 200
0573 height: background.height
0574 z: 2
0575 property int itemsMargin: 6 * ApplicationInfo.ratio
0576
0577 GCText {
0578 id: fuelText
0579 anchors.right: parent.right
0580 anchors.bottom: altitudeText.top
0581 anchors.bottomMargin: osdWrapper.itemsMargin
0582 color: "white"
0583 fontSize: tinySize
0584 horizontalAlignment: Text.AlignRight
0585 text: qsTr("Fuel: %1").arg(items.fuelText)
0586 }
0587 GCText {
0588 id: altitudeText
0589 anchors.right: parent.right
0590 anchors.bottom: velocityText.top
0591 anchors.bottomMargin: osdWrapper.itemsMargin
0592 color: "white"
0593 fontSize: tinySize
0594 horizontalAlignment: Text.AlignRight
0595 text: qsTr("Altitude: %1").arg(items.altitudeText)
0596 }
0597 GCText {
0598 id: velocityText
0599 anchors.right: parent.right
0600 anchors.bottom: accelText.top
0601 anchors.bottomMargin: osdWrapper.itemsMargin
0602 color: "white"
0603 fontSize: tinySize
0604 horizontalAlignment: Text.AlignRight
0605 text: qsTr("Velocity: %1").arg(items.velocityText)
0606 }
0607
0608 GCText {
0609 id: accelText
0610 anchors.bottom: accelerometer.top
0611 anchors.bottomMargin: osdWrapper.itemsMargin
0612 anchors.right: parent.right
0613 fontSize: tinySize
0614 color: "white"
0615 horizontalAlignment: Text.AlignRight
0616 text: qsTr("Acceleration: %1").arg(items.accelerometerText)
0617 }
0618
0619 Accelerometer {
0620 id: accelerometer
0621 current: rocket.decomposeVector(rocket.accel, rocket.rotation).y * 10 - items.gravity
0622 anchors.right: parent.right
0623 anchors.bottom: planetText.top
0624 anchors.bottomMargin: osdWrapper.itemsMargin
0625 width: 15 + 3 * items.scale * ApplicationInfo.ratio
0626 height: upDownControl.height
0627 z: 2 // on top of rocket and ground
0628 opacity: 1
0629 onCurrentChanged: {
0630 items.accelerometerText = Activity.fixedSizeString(accelerometer.current, 100, 6, ".00");
0631 }
0632 }
0633 GCText {
0634 id: planetText
0635 anchors.right: parent.right
0636 anchors.bottom: gravityText.top
0637 anchors.bottomMargin: osdWrapper.itemsMargin
0638 color: "white"
0639 fontSize: tinySize
0640 horizontalAlignment: Text.AlignRight
0641 text: (items.levels && items.levels[bar.level-1]) ? items.levels[bar.level-1].planet : ""
0642 }
0643 GCText {
0644 id: gravityText
0645 anchors.bottom: parent.bottom
0646 anchors.right: parent.right
0647 horizontalAlignment: Text.AlignRight
0648 fontSize: tinySize
0649 color: "white"
0650 text: qsTr("Gravity: %1").arg(Math.round(items.gravity * 100) / 100);
0651 }
0652 }
0653
0654 Column {
0655 id: upDownControl
0656 anchors.right: background.right
0657 anchors.rightMargin: accelerometer.width
0658 anchors.bottom: bar.top
0659 anchors.bottomMargin: 32 * ApplicationInfo.ratio + gravityText.height + planetText.height
0660 width: upButton.width + 20 * ApplicationInfo.ratio
0661 height: upButton.height + downButton.height + 20 * ApplicationInfo.ratio
0662 visible: items.onScreenControls
0663
0664 z: 19 // below intro, above the rest
0665 opacity: 0.4
0666 spacing: 20 * ApplicationInfo.ratio
0667
0668 ControlButton {
0669 id: upButton
0670 source: "qrc:/gcompris/src/core/resource/arrow_up.svg"
0671 onPressed: Activity.processKeyPress({key: Qt.Key_Up});
0672 exceed: upDownControl.spacing / 2
0673 }
0674
0675 ControlButton {
0676 id: downButton
0677 source: "qrc:/gcompris/src/core/resource/arrow_down.svg"
0678 onPressed: Activity.processKeyPress({key: Qt.Key_Down});
0679 exceed: upDownControl.spacing / 2
0680 }
0681 }
0682
0683 Row {
0684 id: leftRightControl
0685 anchors.left: parent.left
0686 anchors.leftMargin: 10 * ApplicationInfo.ratio
0687 anchors.bottom: upDownControl.bottom
0688 width: leftButton.width + rightButton.width + 20 * ApplicationInfo.ratio
0689 height: leftButton.height + 10 * ApplicationInfo.ratio
0690 visible: items.onScreenControls
0691
0692 z: 19 // below intro, on top of the rest
0693 opacity: 0.4
0694 spacing: 20 * ApplicationInfo.ratio
0695
0696 ControlButton {
0697 id: leftButton
0698 source: "qrc:/gcompris/src/core/resource/arrow_left.svg"
0699 onPressed: Activity.processKeyPress({key: Qt.Key_Left});
0700 onReleased: Activity.processKeyRelease({key: Qt.Key_Left});
0701 exceed: leftRightControl.spacing / 2
0702 }
0703
0704 ControlButton {
0705 id: rightButton
0706 source: "qrc:/gcompris/src/core/resource/arrow_right.svg"
0707 onPressed: Activity.processKeyPress({key: Qt.Key_Right});
0708 onReleased: Activity.processKeyRelease({key: Qt.Key_Right});
0709 exceed: leftRightControl.spacing / 2
0710 }
0711 }
0712
0713 DebugDraw {
0714 id: debugDraw
0715 world: physicsWorld
0716 visible: false
0717 z: 1
0718 }
0719
0720 DialogHelp {
0721 id: dialogHelp
0722 onClose: home();
0723 }
0724
0725 DialogChooseLevel {
0726 id: dialogActivityConfig
0727 currentActivity: activity.activityInfo
0728
0729 onSaveData: {
0730 levelFolder = dialogActivityConfig.chosenLevels;
0731 currentActivity.currentLevels = dialogActivityConfig.chosenLevels;
0732 ApplicationSettings.setCurrentLevels(currentActivity.name, dialogActivityConfig.chosenLevels);
0733 }
0734 onClose: {
0735 home();
0736 }
0737 onStartActivity: {
0738 background.stop();
0739 background.start();
0740 }
0741 }
0742
0743 Bar {
0744 id: bar
0745 level: items.currentLevel + 1
0746 z: 21
0747 content: BarEnumContent { value: help | home | level | reload | activityConfig }
0748 onHelpClicked: displayDialog(dialogHelp);
0749 onPreviousLevelClicked: Activity.previousLevel();
0750 onNextLevelClicked: Activity.nextLevel();
0751 onHomeClicked: home();
0752 onReloadClicked: Activity.initLevel();
0753 onActivityConfigClicked: {
0754 displayDialog(dialogActivityConfig);
0755 }
0756 }
0757
0758 Bonus {
0759 id: bonus
0760 Component.onCompleted: {
0761 loose.connect(Activity.initLevel);
0762 win.connect(Activity.nextLevel);
0763 }
0764 }
0765
0766 IntroMessage {
0767 id: intro
0768 onIntroDone: {
0769 items.world.running = true;
0770 }
0771 z: 20
0772 anchors {
0773 top: parent.top
0774 topMargin: 10
0775 right: parent.right
0776 rightMargin: 5
0777 left: parent.left
0778 leftMargin: 5
0779 }
0780 }
0781
0782 BarButton {
0783 id: ok
0784 source: "qrc:/gcompris/src/core/resource/bar_ok.svg";
0785 sourceSize.width: 75 * ApplicationInfo.ratio
0786 visible: false
0787 anchors.centerIn: background
0788 onClicked: {
0789 visible = false;
0790 items.world.running = true;
0791 }
0792 }
0793 }
0794
0795 }