Warning, /education/gcompris/src/activities/bargame/Bargame.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - bargame.qml
0002 *
0003 * SPDX-FileCopyrightText: 2016 UTKARSH TIWARI <iamutkarshtiwari@kde.org>
0004 *
0005 * Authors:
0006 * Yves Combe (GTK+ version)
0007 * UTKARSH TIWARI <iamutkarshtiwari@kde.org> (Qt Quick port)
0008 *
0009 * SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 import QtQuick 2.12
0012 import GCompris 1.0
0013
0014 import "../../core"
0015 import "bargame.js" as Activity
0016
0017 ActivityBase {
0018 id: activity
0019 property int gameMode: 1
0020
0021 onStart: focus = true
0022 onStop: {}
0023
0024 pageComponent: Image {
0025 id: rootWindow
0026 source: Activity.url + "background.svg"
0027 sourceSize.width: width
0028 sourceSize.height: height
0029 fillMode: Image.PreserveAspectCrop
0030 signal start
0031 signal stop
0032 property bool horizontalLayout: background.width >= background.height
0033
0034 Component.onCompleted: {
0035 dialogActivityConfig.initialize()
0036 activity.start.connect(start)
0037 activity.stop.connect(stop)
0038 }
0039
0040 // Add here the QML items you need to access in javascript
0041 QtObject {
0042 id: items
0043 property Item main: activity.main
0044 property int numberOfBalls: 1
0045 property alias answerBallsPlacement: answerBallsPlacement
0046 property int currentLevel: activity.currentLevel
0047 property alias bonus: bonus
0048 property alias okArea: okArea
0049
0050 property alias trigTuxMove: trigTuxMove
0051
0052 property alias player1score: player1score
0053 property alias player2score: player2score
0054
0055 property int mode: 1
0056 property int gridSize: (horizontalLayout ? rootWindow.width : (rootWindow.height - bar.height * 1.2)) / Activity.levelsProperties[items.mode - 1].boardSize
0057 property bool isPlayer1Beginning: true
0058 property bool isPlayer1Turn: true
0059 }
0060
0061 onStart: {
0062 Activity.start(items, gameMode);
0063 Activity.calculateWinPlaces();
0064 }
0065 onStop: { Activity.stop() }
0066
0067 // Tux move delay
0068 Timer {
0069 id: trigTuxMove
0070 repeat: false
0071 interval: 1500
0072 onTriggered: Activity.machinePlay()
0073 }
0074
0075 // Tux image
0076 Image {
0077 id: tux
0078 visible: gameMode == 1
0079 source: "qrc:/gcompris/src/activities/ballcatch/resource/tux.svg"
0080 height: rootWindow.height * 0.2
0081 width: tux.height
0082 y: rootWindow.height * 0.4
0083 anchors {
0084 right: rootWindow.right
0085 rightMargin: 23 * ApplicationInfo.ratio
0086
0087 }
0088 MouseArea {
0089 id: tuxArea
0090 hoverEnabled: enabled
0091 enabled: gameMode == 1 && !answerBallsPlacement.children[0].visible
0092 anchors.fill: parent
0093 onClicked: {
0094 items.isPlayer1Turn = false;
0095 Activity.machinePlay();
0096 }
0097 }
0098 states: State {
0099 name: "tuxHover"
0100 when: tuxArea.containsMouse
0101 PropertyChanges {
0102 target: tux
0103 scale: 1.1
0104 }
0105 }
0106 }
0107
0108 // Box row
0109 Item {
0110 id: boxModel
0111
0112 states: [
0113 State {
0114 name: "horizontalBar"
0115 when: horizontalLayout
0116 PropertyChanges { target: boxModel; x: 0; y: rootWindow.height - bar.height * 2}
0117 },
0118 State {
0119 name: "verticalBar"
0120 when: !horizontalLayout
0121 PropertyChanges { target: boxModel; x: rootWindow.width * 0.5; y: 0}
0122 }
0123 ]
0124
0125 transform: Rotation {
0126 origin.x: 0;
0127 origin.y: 0;
0128 angle: horizontalLayout ? 0 : 90
0129 }
0130
0131 // The empty boxes grid
0132 Grid {
0133 id: boxes
0134 rows: 1
0135 columns: Activity.levelsProperties[items.mode - 1].boardSize
0136 anchors.centerIn: boxModel.Center
0137 Repeater {
0138 id: startCase
0139 model: boxes.columns
0140 Image {
0141 id: greenCase
0142 source: Activity.url + ((index == boxes.columns - 1) ? "case_last.svg" : "case.svg")
0143 sourceSize.width: items.gridSize
0144 width: sourceSize.width
0145 height: sourceSize.width
0146 visible: true
0147 }
0148 }
0149 }
0150
0151 // Hidden Answer Balls
0152 Grid {
0153 // All green balls placement
0154 id: answerBallsPlacement
0155 anchors.centerIn: boxModel.Center
0156 columns: Activity.levelsProperties[items.mode - 1].boardSize
0157 rows: 1
0158 Repeater {
0159 model: answerBallsPlacement.columns
0160 Image {
0161 source: Activity.url + "ball_1.svg"
0162 sourceSize.width: items.gridSize
0163 width: sourceSize.width
0164 height: sourceSize.width
0165 visible: false
0166 }
0167 }
0168 }
0169
0170 // Masks
0171 Grid {
0172 id: masks
0173 anchors.centerIn: boxModel.Center
0174 rows: 1
0175 columns: Activity.levelsProperties[items.mode - 1].boardSize
0176 Repeater {
0177 id: startMask
0178 model: masks.columns
0179 Image {
0180 id: greenMask
0181 source: Activity.url + ((index == boxes.columns - 1) ? "mask_last.svg" : "mask.svg")
0182 sourceSize.width: items.gridSize
0183 width: sourceSize.width
0184 height: sourceSize.width
0185 // Numbering label
0186 Rectangle {
0187 id: bgNbTxt
0188 visible: ((index + 1) % 5 == 0 && index > 0) ? true : false
0189 color: "#42FFFFFF"
0190 height: numberText.height * 1.2
0191 width: height
0192 radius: height / 2
0193 anchors {
0194 horizontalCenter: parent.horizontalCenter
0195 bottom: parent.top
0196 bottomMargin: (horizontalLayout ? 4 * ApplicationInfo.ratio : -16 * ApplicationInfo.ratio)
0197 }
0198 GCText {
0199 id: numberText
0200 text: index + 1
0201 color: "#373737"
0202 fontSize: smallSize
0203 font.bold: true
0204 visible: ((index + 1) % 5 == 0 && index > 0) ? true : false
0205 anchors {
0206 horizontalCenter: bgNbTxt.horizontalCenter
0207 verticalCenter: bgNbTxt.verticalCenter
0208 }
0209 }
0210 transform: Rotation {
0211 angle: horizontalLayout ? 0 : -90
0212 }
0213 }
0214 }
0215 }
0216 }
0217 }
0218
0219 // ok button
0220 Image {
0221 id: playLabel
0222 width: ballNumberPlate.height
0223 height: width
0224 sourceSize.width: width
0225 sourceSize.height: width
0226 source: Activity.url + "bar_ok.svg"
0227 anchors {
0228 left: ballNumberPlate.right
0229 verticalCenter: ballNumberPlate.verticalCenter
0230 leftMargin: width / 4
0231 }
0232
0233 MouseArea {
0234 id: okArea
0235 anchors.fill: parent
0236 hoverEnabled: enabled
0237 enabled: true
0238 onClicked: {
0239 var value = items.numberOfBalls
0240 if (gameMode == 1 || items.isPlayer1Turn) {
0241 Activity.play(1, value);
0242 } else {
0243 Activity.play(2, value);
0244 }
0245 // reset next action
0246 items.numberOfBalls = Activity.levelsProperties[items.mode - 1].minNumberOfBalls
0247 }
0248 }
0249 states: State {
0250 name: "mouseHover"
0251 when: okArea.containsMouse
0252 PropertyChanges {
0253 target: playLabel
0254 scale: 1.2
0255 }
0256 }
0257 }
0258
0259 // Number of balls to be placed
0260 Image {
0261 id: ballNumberPlate
0262 y: rootWindow.height * 0.32
0263 source: items.isPlayer1Turn ? Activity.url + "score_1.svg" :
0264 Activity.url + "score_2.svg"
0265 width: bar.height
0266 height: bar.height * 0.7
0267 sourceSize.width: width
0268 sourceSize.height: height
0269
0270 anchors {
0271 left: rootWindow.left
0272 leftMargin: 16 * ApplicationInfo.ratio
0273 }
0274
0275 MouseArea {
0276 id: numberPlateArea
0277 anchors.fill: parent
0278 hoverEnabled: enabled
0279 enabled: (gameMode == 1 && items.isPlayer1Turn == false) ? false : true
0280 onClicked: {
0281 items.numberOfBalls ++;
0282 var max = Activity.levelsProperties[items.mode - 1].maxNumberOfBalls
0283 if (items.numberOfBalls > max) {
0284 items.numberOfBalls = Activity.levelsProperties[items.mode - 1].minNumberOfBalls;
0285 }
0286 }
0287 }
0288 states: State {
0289 name: "numberHover"
0290 when: numberPlateArea.containsMouse
0291 PropertyChanges {
0292 target: ballNumberPlate
0293 scale: 1.1
0294 }
0295 }
0296
0297 // Ball Icon
0298 Image {
0299 id: ballIcon
0300 source: items.isPlayer1Turn ? Activity.url + "ball_1b.svg" :
0301 Activity.url + "ball_2b.svg"
0302 sourceSize.width: parent.height * 0.8
0303 width: sourceSize.width
0304 height: sourceSize.width
0305 anchors {
0306 verticalCenter: ballNumberPlate.verticalCenter
0307 left: ballNumberPlate.left
0308 leftMargin: 10
0309 }
0310 }
0311 // Number label
0312 GCText {
0313 id: numberLabel
0314 text: items.numberOfBalls
0315 color: "#C04040"
0316 font.bold: true
0317 fontSize: smallSize
0318 anchors {
0319 right: ballNumberPlate.right
0320 rightMargin: 10
0321 verticalCenter: ballNumberPlate.verticalCenter
0322 }
0323 }
0324 }
0325
0326 ScoreItem {
0327 id: player1score
0328 player: 1
0329 height: Math.min(rootWindow.height/7, Math.min(rootWindow.width/7, bar.height * 1.05))
0330 width: height*11/8
0331 anchors {
0332 top: rootWindow.top
0333 topMargin: 5
0334 left: rootWindow.left
0335 leftMargin: 5
0336 }
0337 playerImageSource: "qrc:/gcompris/src/core/resource/player_1.svg"
0338 backgroundImageSource: Activity.url + "score_1.svg"
0339 playerItem.source: Activity.url + "ball_1b.svg"
0340 playerItem.height: playerItem.parent.height * 0.3
0341 playerItem.anchors.leftMargin: playerItem.parent.height * 0.05
0342 playerItem.anchors.bottomMargin: playerItem.parent.height * 0.05
0343 }
0344
0345 ScoreItem {
0346 id: player2score
0347 player: 2
0348 height: Math.min(rootWindow.height/7, Math.min(rootWindow.width/7, bar.height * 1.05))
0349 width: height*11/8
0350 anchors {
0351 top: rootWindow.top
0352 topMargin: 5
0353 right: rootWindow.right
0354 rightMargin: 5
0355 }
0356 playerImageSource: "qrc:/gcompris/src/core/resource/player_2.svg"
0357 backgroundImageSource: Activity.url + "score_2.svg"
0358 playerScaleOriginX: player2score.width
0359 playerItem.source: Activity.url + "ball_2b.svg"
0360 playerItem.height: playerItem.parent.height * 0.3
0361 playerItem.anchors.leftMargin: playerItem.parent.height * 0.05
0362 playerItem.anchors.bottomMargin: playerItem.parent.height * 0.10
0363 }
0364
0365 DialogHelp {
0366 id: dialogHelp
0367 onClose: home()
0368 }
0369
0370 DialogChooseLevel {
0371 id: dialogActivityConfig
0372 currentActivity: activity.activityInfo
0373
0374 onClose: home()
0375
0376 onLoadData: {
0377 if(activityData && activityData["mode"]) {
0378 items.mode = activityData["mode"];
0379 }
0380 }
0381 onStartActivity: {
0382 rootWindow.stop()
0383 rootWindow.start()
0384 }
0385 }
0386
0387 Bar {
0388 id: bar
0389 level: items.currentLevel + 1
0390 content: BarEnumContent { value: help | home | level | reload | activityConfig }
0391 onHelpClicked: {
0392 displayDialog(dialogHelp)
0393 }
0394 onPreviousLevelClicked: Activity.previousLevel()
0395 onNextLevelClicked: Activity.nextLevel()
0396 onHomeClicked: activity.home()
0397 onActivityConfigClicked: {
0398 displayDialog(dialogActivityConfig)
0399 }
0400 onReloadClicked: Activity.restartLevel()
0401 }
0402
0403 Bonus {
0404 id: bonus
0405 }
0406 }
0407 }