diff --git a/src/activities/railroad/Railroad.qml b/src/activities/railroad/Railroad.qml index c54bc86ea..8431a4753 100644 --- a/src/activities/railroad/Railroad.qml +++ b/src/activities/railroad/Railroad.qml @@ -1,399 +1,402 @@ /* GCompris - railroad.qml * * Copyright (C) 2016 Utkarsh Tiwari * * Authors: * Pascal Georges (GTK+ version) * Utkarsh Tiwari (Qt Quick port) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.1 import QtQuick.Controls 2.0 import GCompris 1.0 import "../../core" import "railroad.js" as Activity ActivityBase { id: activity onStart: focus = true onStop: {} property variant barAtStart pageComponent: Image { id: background source: Activity.resourceURL + "railroad-bg.svg" height: activity.height / 2 width: activity.width anchors.fill: parent signal start signal stop Component.onCompleted: { activity.start.connect(start) activity.stop.connect(stop) } // Add here the QML items you need to access in javascript QtObject { id: items property Item main: activity.main property alias background: background property alias bar: bar property alias bonus: bonus property alias score: score property alias timer: timer property alias sampleList: sampleList property alias listModel: listModel property alias displayList: displayList property alias animateFlow: animateFlow property alias displayRow: displayRow property alias railCollection: railCollection property alias introMessage: introMessage + property bool mouseEnabled: true } onStart: { Activity.start(items) } onStop: { Activity.stop() } // Swipe message GCText { id: swipe anchors { top: parent.top horizontalCenter: parent.horizontalCenter } text: "<<== Swipe here ==>>" fontSize: smallSize font.weight: Font.DemiBold color: "black" } // Countdown timer Countdown { id: timer anchors { left: background.left top: background.top } onTriggert: items.animateFlow.start(); } // Intro message IntroMessage { id: introMessage y: (background.height / 4.7) anchors { right: parent.right rightMargin: 5 left: parent.left leftMargin: 5 } z: 100 onIntroDone: { timer.start() } intro: [ qsTr("Swap left-right to view all the carriages outside display area. Memorize them before the timer ends!") ] } // Top Display Area Rectangle { width: background.width height: background.height / 5 color: 'transparent' x: 2 y : 0 z: 1 Flickable { id: flickTop width: parent.width height: parent.height contentWidth: displayRow.width * 1.2 contentHeight: displayRow.height flickableDirection: Flickable.HorizontalFlick anchors.fill: parent interactive: !animateFlow.running Row { id: displayRow x: parent.x y: background.height / 12.7 width: childrenRect.width height: childrenRect.height spacing: background.width * 0.0025 Repeater { id: displayList model: listModel delegate : Image { id: wagon source: Activity.resourceURL + "loco1.svg" height: background.height / 8.0 width: ((background.width > background.height) ? background.width : background.height) / 5.66 visible: true function checkDrop(dragItem) { // Checks the drop location of this wagon - var globalCoordinates = dragItem.mapToItem(background, 0, 0) + var globalCoordinates = dragItem.mapToItem(displayList, 0, 0) if(globalCoordinates.y <= ((background.height / 12.5) + (background.height / 8))) { var dropIndex = Activity.getDropIndex(globalCoordinates.x) if (dropIndex > (listModel.count - 1)) { // Handles index overflow dropIndex = listModel.count - 1 } listModel.move(listModel.count - 1, dropIndex, 1) opacity = 1 } if (globalCoordinates.y > ((background.height / 12.5) + (background.height / 8))){ // Remove it if dropped in the lower section listModel.remove(listModel.count - 1) } } function createNewItem() { var component = Qt.createComponent("Loco.qml"); if (component.status === Component.Ready) { var newItem = component.createObject(parent, {"x":x, "y":y, "z": 10 ,"imageIndex": listModel.get(index).id}); } return newItem } MouseArea { id: displayWagonMouseArea hoverEnabled: true - enabled: introMessage.visible ? false : true + enabled: (introMessage.visible ? false : true) && items.mouseEnabled anchors.fill: parent onPressed: { if (Activity.memoryMode == true) { drag.target = parent.createNewItem(); parent.opacity = 0 listModel.move(index, listModel.count - 1, 1) } } onReleased: { if (Activity.memoryMode == true) { var dragItem = drag.target parent.checkDrop(dragItem) dragItem.destroy(); parent.Drag.cancel() Activity.isAnswer() } } onClicked: { if (Activity.memoryMode == false) { timer.stop() animateFlow.stop(); displayRow.x = 2; listModel.clear(); Activity.memoryMode = true; Activity.items.railCollection.visible = true } } } states: State { name: "waganHover" when: displayWagonMouseArea.containsMouse && (Activity.memoryMode === true) PropertyChanges { target: wagon scale: 1.1 } } } } onXChanged: { if (displayRow.x >= background.width) { timer.stop() animateFlow.stop(); displayRow.x = 2; listModel.clear(); Activity.memoryMode = true; items.railCollection.visible = true; } } PropertyAnimation { id: animateFlow target: displayRow properties: "x" from: 2 to: background.width duration: 4000 easing.type: Easing.InExpo loops: 1 } } } ListModel { id: listModel } } // Lower Sample Wagon Display Area Rectangle { id: railCollection color: "transparent" visible: false Repeater { id: sampleList model: 4 Flickable { x: 2 y: (background.height / 4.7) + (index * (background.height / 6.5)) height: background.height / 7.5 + z: 1 width: background.width contentWidth: railCarriages.childrenRect.width contentHeight: height flickableDirection: Flickable.HorizontalFlick Row { id: railCarriages property real rowNo: index anchors.margins: 1 anchors.bottomMargin: 10 spacing: background.width * 0.0025 y: 0 height: background.height / 7.5 width: childrenRect.width Repeater { id: eachRow model: Activity.noOfCarriages[parent.rowNo] Image { id: loco readonly property int uniqueID: Activity.sum(parent.rowNo) + index property real originX property real originY source: Activity.resourceURL + "loco" + (uniqueID + 1) + ".svg" height: background.height / 7.5 width: ((background.width > background.height) ? background.width : background.height) / 5.66 visible: true function initDrag() { originX = x originY = y } function replace() { x = originX y = originY } function checkDrop() { // Checks the drop location of this wagon - var globalCoordinates = loco.mapToItem(background, 0, 0) + var globalCoordinates = loco.mapToItem(displayList, 0, 0) if(globalCoordinates.y <= ((background.height / 8.0) + (background.height / 12.5))) { if(listModel.count == 0) { Activity.addWagon(uniqueID + 1, 0); } else { var dropIndex = Activity.getDropIndex(globalCoordinates.x) Activity.addWagon(uniqueID + 1, dropIndex); } } Activity.isAnswer() } MouseArea { id: mouseArea hoverEnabled: true anchors.fill: parent drag.target: parent drag.axis: (parent.y >= 0 && parent.y <= background.height / 7.5) ? Drag.YAxis : Drag.XAndYAxis - enabled: true + enabled: items.mouseEnabled onPressed: { parent.initDrag() } onReleased: { parent.Drag.cancel() parent.checkDrop() parent.replace() } } Component.onCompleted: initDrag(); states: State { name: "carHover" when: mouseArea.containsMouse PropertyChanges { target: loco scale: 1.1 } } } } } } } } // Lower level wagons shelves Repeater { id: railSupporter model: 4 Rectangle { x: 0 y: (background.height / 2.9) + (index * (background.height / 6.5)) width: background.width height: 5 border.color: "#808180" color: "transparent" border.width: 5 } } DialogHelp { id: dialogHelp onClose: home() } Score { id: score anchors.top: parent.top anchors.topMargin: 10 * ApplicationInfo.ratio anchors.right: parent.right anchors.leftMargin: 10 * ApplicationInfo.ratio anchors.bottom: undefined anchors.left: undefined + visible: true } Bar { id: bar content: BarEnumContent { value: help | home | level | reload} onHelpClicked: { displayDialog(dialogHelp) } onPreviousLevelClicked: Activity.previousLevel() onNextLevelClicked: Activity.nextLevel() onHomeClicked: activity.home() onReloadClicked: { Activity.reset() } } Bonus { id: bonus Component.onCompleted: win.connect(Activity.advanceSubLevel) } } } diff --git a/src/activities/railroad/railroad.js b/src/activities/railroad/railroad.js index b4570ae80..d150f3594 100644 --- a/src/activities/railroad/railroad.js +++ b/src/activities/railroad/railroad.js @@ -1,166 +1,168 @@ /* GCompris - railroad.js * * Copyright (C) 2016 Utkarsh Tiwari * * Authors: * (GTK+ version) * "Utkarsh Tiwari" (Qt Quick port) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ .pragma library .import QtQuick 2.0 as Quick .import GCompris 1.0 as GCompris var currentLevel = 0 var numberOfLevel = 4 var noOfCarriages = [5, 6, 5, 6] var rowWidth = [0.95, 0.1, 0.1, 0.1] var memoryMode = false var solutionArray = [] var isReset = false var resourceURL = "qrc:/gcompris/src/activities/railroad/resource/" var maxSubLevel = 3 var items function start(items_) { items = items_ currentLevel = 0 items.score.numberOfSubLevels = maxSubLevel; items.score.currentSubLevel = 1; initLevel() } function stop() { } function initLevel() { var index = 0; + items.mouseEnabled = true; memoryMode = false; items.railCollection.visible = false; items.timer.stop(); items.animateFlow.stop(); // Stops any previous animations items.listModel.clear(); items.displayList.model = items.listModel; if (isReset == false) { // Initiates a new level solutionArray = []; for (var i = 0; i < currentLevel + 2; i++) { if (i == (currentLevel + 1)) { // Selects the last carriage do { index = Math.floor(Math.random() * 9) + 1; } while (solutionArray.indexOf(index) != -1) // Ensures non-repeative wagons setup } else { // Selects the follow up wagons do { index = Math.floor(Math.random() * 12) + 10; } while (solutionArray.indexOf(index) != -1) } solutionArray.push(index); items.listModel.append({"id" : index}); (items.displayList.itemAt(items.listModel.count - 1)).source = resourceURL + "loco" + (index) + ".svg"; } } else { // Re-setup the same level for ( var i = 0; i < solutionArray.length; i++) { items.listModel.append({"id" : solutionArray[i]}); (items.displayList.itemAt(items.listModel.count - 1)).source = resourceURL + "loco" + (solutionArray[i]) + ".svg"; } isReset = false; } if (items.introMessage.visible === false) { items.timer.start() } items.bar.level = currentLevel + 1; } function nextLevel() { if(numberOfLevel <= ++currentLevel ) { currentLevel = 0 } items.score.currentSubLevel = 1; initLevel(); } function previousLevel() { if(--currentLevel < 0) { currentLevel = numberOfLevel - 1 } items.score.currentSubLevel = 1; initLevel(); } function reset() { isReset = true; initLevel(); } function advanceSubLevel() { /* Sets up the next sublevel */ items.score.currentSubLevel++; if (items.score.currentSubLevel > maxSubLevel) { nextLevel(); items.score.currentSubLevel = 1; } else { initLevel(); } } function isAnswer() { /* Checks if the top level setup equals the solutions */ if (items.listModel.count === solutionArray.length) { var flag = true; for (var index = 0; index < items.listModel.count; index++) { if (items.listModel.get(index).id != solutionArray[index]) { flag = false; break; } } if (flag == true) { + items.mouseEnabled = false; // Disables the touch items.bonus.good("flower"); } } } function sum(index) { /* Returns the sum up till the specified index */ var total = 0 for (var i = 0; i