Warning, /education/gcompris/src/activities/hanoi_real/HanoiReal.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - hanoi_real.qml 0002 * 0003 * SPDX-FileCopyrightText: 2015 Amit Tomar <a.tomar@outlook.com> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Amit Tomar <a.tomar@outlook.com> (Qt Quick port) 0008 * Timothée Giet <animtim@gmail.com> (Graphics refactoring) 0009 * 0010 * SPDX-License-Identifier: GPL-3.0-or-later 0011 */ 0012 import QtQuick 2.12 0013 import GCompris 1.0 0014 0015 import "../../core" 0016 import "hanoi_real.js" as Activity 0017 0018 0019 ActivityBase { 0020 id: activity 0021 0022 onStart: focus = true 0023 onStop: {} 0024 0025 property string activityMode: "real" 0026 0027 pageComponent: Image { 0028 id: background 0029 source: Activity.url + "background.svg" 0030 sourceSize.width: width 0031 sourceSize.height: height 0032 fillMode: Image.PreserveAspectCrop 0033 signal start 0034 signal stop 0035 0036 Component.onCompleted: { 0037 activity.start.connect(start) 0038 activity.stop.connect(stop) 0039 } 0040 0041 // Add here the QML items you need to access in javascript 0042 QtObject { 0043 id: items 0044 property Item main: activity.main 0045 property alias background: background 0046 property int currentLevel: activity.currentLevel 0047 property alias bonus: bonus 0048 property alias discRepeater: discRepeater 0049 property alias towerModel: towerModel 0050 property bool hasWon: false 0051 property int numberOfDisc 0052 } 0053 0054 onStart: { Activity.start(items, activityMode) } 0055 onStop: { Activity.stop() } 0056 0057 onWidthChanged: Activity.sceneSizeChanged() 0058 onHeightChanged: Activity.sceneSizeChanged() 0059 0060 Rectangle { 0061 id: instruction 0062 width: parent.width 0063 height: description.height + 5 * ApplicationInfo.ratio 0064 color: "#FFF" 0065 opacity: 0.8 0066 anchors { 0067 bottom: bar.top 0068 bottomMargin: 15 * ApplicationInfo.ratio 0069 } 0070 visible: bar.level == 1 0071 } 0072 0073 GCText { 0074 id: description 0075 text: activityMode == "real" ? qsTr("Move the entire stack to the right peg, one disc at a time.") : 0076 qsTr("Build the same tower in the empty area as the one you see on the right-hand side") 0077 width: instruction.width 0078 fontSize: mediumSize 0079 color: "#373737" 0080 wrapMode: Text.WordWrap 0081 anchors.centerIn: instruction 0082 verticalAlignment: Text.AlignVCenter 0083 horizontalAlignment: Text.AlignHCenter 0084 visible: bar.level == 1 0085 } 0086 0087 Repeater { 0088 id: discRepeater 0089 0090 Rectangle { 0091 id: disc 0092 z: 4 0093 width: Activity.getDiscWidth(index) 0094 height: activityMode == "real"? towerModel.itemAt(0).height * 0.15: towerModel.itemAt(0).height / (Activity.nbMaxItemsByTower+1) 0095 0096 opacity: index < items.numberOfDisc ? 1 : 0 0097 onHeightChanged: Activity.sceneSizeChanged() 0098 property string baseColor: "#808080" 0099 radius: height * 0.5 0100 property bool mouseEnabled: true 0101 property alias discMouseArea: discMouseArea 0102 property Item towerImage 0103 property int position // The position index on the tower 0104 0105 property alias text: textSimplified.text 0106 0107 color: Qt.darker(baseColor, 1.2) 0108 anchors.horizontalCenter: parent.horizontalCenter 0109 0110 Behavior on y { 0111 NumberAnimation { 0112 id: bouncebehavior 0113 easing { 0114 type: Easing.OutElastic 0115 amplitude: 1.0 0116 period: 0.75 0117 } 0118 } 0119 } 0120 0121 Rectangle { 0122 id: inDisc 0123 width: parent.width - 10 * ApplicationInfo.ratio 0124 height: parent.height - 6 * ApplicationInfo.ratio 0125 radius: width * 0.5 0126 color: Qt.lighter(disc.baseColor, 1.2) 0127 anchors.centerIn: parent 0128 0129 GCText { 0130 id: textSimplified 0131 visible: activityMode == "simplified" 0132 color: "#373737" 0133 anchors.verticalCenter: parent.verticalCenter 0134 anchors.rightMargin: 10 * ApplicationInfo.ratio 0135 anchors.right: parent.right 0136 } 0137 0138 } 0139 0140 0141 MouseArea { 0142 id: discMouseArea 0143 enabled: disc.mouseEnabled && !items.hasWon 0144 anchors.centerIn: parent 0145 width: Activity.getDiscWidth(0) 0146 height: background.height 0147 drag.target: parent 0148 drag.axis: Drag.XandYAxis 0149 hoverEnabled: true 0150 0151 onPressed: { 0152 disc.anchors.horizontalCenter = undefined 0153 // Need to higher the z tower for the disc to be above all other towers and disc 0154 disc.towerImage.z ++ 0155 disc.z ++ 0156 } 0157 0158 onReleased: { 0159 // Restore previous z before releasing the disc 0160 disc.towerImage.z -- 0161 disc.z -- 0162 Activity.discReleased(index) 0163 disc.anchors.horizontalCenter = disc.parent.horizontalCenter 0164 } 0165 } 0166 } 0167 } 0168 0169 Grid { 0170 // do columns if mobile? 0171 rows: 1 0172 columnSpacing: (background.width - towerModel.model * towerModel.itemAt(0).width) / (items.towerModel.model+1) 0173 0174 anchors { 0175 bottom: instruction.top 0176 horizontalCenter: parent.horizontalCenter 0177 bottomMargin: 10 * ApplicationInfo.ratio 0178 } 0179 Repeater { 0180 id: towerModel 0181 model: 1 // will be dynamically set in js 0182 delegate: Item { 0183 id: towerImage 0184 width: image.width 0185 height: image.height 0186 onHeightChanged: Activity.sceneSizeChanged() 0187 Image { 0188 id: image 0189 source: 0190 if(activityMode == "simplified" && (modelData == towerModel.model-2)) 0191 //in simplified mode, the target tower 0192 Activity.url + "disc_support-green.svg" 0193 else if(activityMode == "simplified" && (modelData == towerModel.model-1)) 0194 // in simplified mode, the reference tower 0195 Activity.url + "disc_support-red.svg" 0196 else if(activityMode == "real" && (modelData == towerModel.model-1)) 0197 // in real mode, the target tower 0198 Activity.url + "disc_support-green.svg" 0199 else 0200 Activity.url + "disc_support.svg" 0201 width: background.width / (towerModel.model + 2.5) 0202 fillMode: Image.Stretch 0203 height: background.height - instruction.height - 2 * bar.height 0204 sourceSize.width: width 0205 sourceSize.height: height 0206 } 0207 z: 3 0208 } 0209 } 0210 } 0211 0212 DialogHelp { 0213 id: dialogHelpLeftRight 0214 onClose: home() 0215 } 0216 0217 Bar { 0218 id: bar 0219 level: items.currentLevel + 1 0220 content: BarEnumContent { value: help | home | level | reload } 0221 onHelpClicked: { 0222 displayDialog(dialogHelpLeftRight) 0223 } 0224 onPreviousLevelClicked: Activity.previousLevel() 0225 onNextLevelClicked: Activity.nextLevel() 0226 onHomeClicked: home() 0227 onReloadClicked: Activity.initLevel() 0228 } 0229 0230 Bonus { 0231 id: bonus 0232 Component.onCompleted: win.connect(Activity.nextLevel) 0233 } 0234 } 0235 }