Warning, /education/kanagram/src/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /***************************************************************************
0002 * This file is part of the Kanagram project *
0003 * Copyright 2014 Debjit Mondal <debjitmondal05@gmail.com> *
0004 * *
0005 * This program is free software; you can redistribute it and/or modify *
0006 * it under the terms of the GNU General Public License as published by *
0007 * the Free Software Foundation; either version 2 of the License, or *
0008 * (at your option) any later version. *
0009 * *
0010 * This program is distributed in the hope that it will be useful, *
0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
0013 * GNU General Public License for more details. *
0014 * *
0015 * You should have received a copy of the GNU General Public License *
0016 * along with this program; if not, write to the *
0017 * Free Software Foundation, Inc., *
0018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
0019 ***************************************************************************/
0020
0021 import QtQuick
0022 import QtQuick.Controls
0023 import QtMultimedia
0024
0025 Rectangle {
0026 id: screen
0027 focus: true
0028 property int countDownTimerValue: 0
0029 property bool flagCorrectAnswer: true
0030
0031 function nextAnagram() {
0032 kanagramGame.nextAnagram()
0033 if (blackboard.activeTimer) {
0034 kanagramGame.answerSkipped();
0035 }
0036 if (kanagramGame.hintHideTime())
0037 blackboard.showHintTimeInterval = 1
0038 if (kanagramGame.useSounds)
0039 if (chalkSound.hasAudio)
0040 chalkSound.play();
0041 else
0042 console.log("unable to play chalk sound " + chalkSound.error);
0043 }
0044
0045 function checkSolved() {
0046 if (kanagramGame.anagram.length == 0) {
0047 if (kanagramGame.checkWord()) {
0048 countDownTimerValue = 1;
0049 flagCorrectAnswer = true;
0050 if (kanagramGame.useSounds)
0051 rightSound.play();
0052 if (blackboard.activeTimer) {
0053 kanagramGame.answerCorrect();
0054 }
0055 resetTimer.repeat = true
0056 resetTimer.start()
0057 } else {
0058 countDownTimerValue = 1;
0059 flagCorrectAnswer = false;
0060 if (kanagramGame.useSounds)
0061 wrongSound.play();
0062 if (blackboard.activeTimer) {
0063 kanagramGame.answerIncorrect();
0064 }
0065 resetTimer.repeat = true
0066 resetTimer.start()
0067 }
0068 }
0069 }
0070
0071 Image {
0072 id: background
0073 anchors.fill: parent
0074 source: "images/background.jpg"
0075 smooth: true
0076 fillMode: Image.PreserveAspectCrop
0077 }
0078
0079 Item {
0080 id: headerArea
0081 width: parent.width
0082 height: parent.height / 6
0083 anchors.top: screen.top
0084
0085 Rectangle {
0086 id: toolBarTop
0087 anchors.fill: parent
0088 opacity: .25
0089 color: "black"
0090 }
0091
0092 Image {
0093 id: header
0094 height: Math.round(parent.height * 0.8)
0095 width: headerArea.width - playericon.width - powerButton.width - 80
0096 anchors {
0097 verticalCenter: parent.verticalCenter
0098 horizontalCenter: parent.horizontalCenter
0099 }
0100 source: "images/header.png"
0101 smooth: true
0102 fillMode: Image.PreserveAspectFit
0103 }
0104
0105 Image {
0106 id: playericon
0107 width: 60
0108 height: 60
0109 anchors.left:parent.left
0110 anchors.leftMargin: 20
0111 anchors.verticalCenter: parent.verticalCenter
0112 source: kanagramGame.singlePlayer ? "icons/1player.png" : "icons/2player.png"
0113 smooth: true
0114 fillMode: Image.PreserveAspectCrop
0115 function togglePlayerMode() {
0116 kanagramGame.singlePlayer = !kanagramGame.singlePlayer;
0117 }
0118
0119 MouseArea {
0120 anchors.fill: parent
0121 hoverEnabled: true
0122 onEntered: playericon.state = "onEntered"
0123 onExited: playericon.state = "onExited"
0124 onClicked: playericon.togglePlayerMode()
0125 }
0126 states: State {
0127 name: "onEntered"
0128 PropertyChanges {
0129 target: playerModeText
0130 opacity: 1
0131 }
0132 PropertyChanges {
0133 target: playericon
0134 source: kanagramGame.singlePlayer ? "icons/2player.png" : "icons/1player.png"
0135 }
0136 }
0137 State {
0138 name: "onExited"
0139 }
0140 transitions: Transition {
0141 PropertyAnimation {
0142 properties: "x,y,opacity"
0143 easing.type: Easing.Linear
0144 easing.amplitude: 5.0
0145 easing.period: 1
0146 }
0147 }
0148 }
0149
0150 Image {
0151 id: powerButton
0152 smooth: true
0153 height: parent.height / 3
0154 anchors {
0155 verticalCenter: parent.verticalCenter
0156 right: parent.right
0157 rightMargin: parent.width / 24
0158 }
0159 source: "icons/on-off-light.svgz"
0160 fillMode: Image.PreserveAspectFit
0161
0162 MouseArea {
0163 anchors.fill: parent
0164 hoverEnabled: true
0165 onEntered: powerButton.state = "onEntered"
0166 onExited: powerButton.state = "onExited"
0167 onClicked: application.quit()
0168 }
0169
0170 states: State {
0171 name: "onEntered"
0172 PropertyChanges {
0173 target: quitText
0174 opacity: 1
0175 }
0176 }
0177 State {
0178 name: "onExited"
0179 }
0180
0181 transitions: Transition {
0182 //AnchorAnimation { duration: 200 }
0183 PropertyAnimation {
0184 properties: "x,y,opacity"
0185 easing.type: Easing.Linear
0186 easing.amplitude: 5.0
0187 easing.period: 1
0188 }
0189 }
0190 }
0191
0192 Text {
0193 id: quitText
0194 anchors {
0195 top: powerButton.bottom
0196 topMargin: 10
0197 horizontalCenter: powerButton.horizontalCenter
0198 }
0199 color: "white"
0200 text: i18n("Quit")
0201 opacity: 0
0202 font.pixelSize: parent.width / 91
0203 }
0204
0205 Text {
0206 id: playerModeText
0207 anchors {
0208 top: playericon.bottom
0209 topMargin: 2
0210 horizontalCenter: playericon.horizontalCenter
0211 }
0212 color: "white"
0213 text: i18n("Change mode")
0214 opacity: 0
0215 font.pixelSize: parent.width / 91
0216 }
0217 } // End of headerArea
0218
0219 Item {
0220 id: nextAnagram
0221 anchors {
0222 top: blackboard.top
0223 left: blackboard.right
0224 topMargin: blackboard.height / 7
0225 }
0226
0227 Action {
0228 id: nextAnagramAction
0229 onTriggered: screen.nextAnagram();
0230 shortcut: "Ctrl+N"
0231 }
0232
0233 Rectangle {
0234 id: nextAnagramButton
0235 width: blackboard.width / 9
0236 height: blackboard.height / 7
0237 radius: 8
0238 color: "black"
0239 opacity: 0.5
0240
0241 MouseArea {
0242 anchors.fill: parent
0243 hoverEnabled: true
0244 onEntered: nextAnagramButton.state = "onEntered"
0245 onExited: nextAnagramButton.state = "onExited"
0246 onClicked: screen.nextAnagram();
0247 }
0248
0249 states: State {
0250 name: "onEntered"
0251 PropertyChanges {
0252 target: nextAnagramButton
0253 width: blackboard.width / 2.5
0254 }
0255 PropertyChanges {
0256 target: nextAnagramText
0257 opacity: 1
0258 }
0259 AnchorChanges {
0260 target: nextAnagramIcon
0261 anchors.horizontalCenter: undefined
0262 anchors.right: nextAnagramButton.right
0263 }
0264 PropertyChanges {
0265 target: nextAnagramIcon
0266 anchors.rightMargin: blackboard.width / 50
0267 }
0268 }
0269 State {
0270 name: "onExited"
0271 }
0272
0273 transitions: Transition {
0274 AnchorAnimation {
0275 duration: 250
0276 }
0277 PropertyAnimation {
0278 properties: "x,y,width,opacity"
0279 easing.type: Easing.Linear
0280 easing.amplitude: 5.0
0281 easing.period: 1
0282 }
0283 }
0284 }
0285
0286 Text {
0287 id: nextAnagramText
0288 anchors {
0289 verticalCenter: nextAnagramButton.verticalCenter
0290 horizontalCenter: nextAnagramButton.horizontalCenter
0291 }
0292 color: "white"
0293 text: i18n("Next Anagram")
0294 opacity: 0
0295 font.pixelSize: parent.width / 68.5
0296 }
0297
0298 Image {
0299 id: nextAnagramIcon
0300 smooth: true
0301 height: nextAnagramButton.height / 2
0302 width: nextAnagramText.width / 4
0303 anchors {
0304 verticalCenter: nextAnagramButton.verticalCenter
0305 horizontalCenter: nextAnagramButton.horizontalCenter
0306 }
0307 source: "icons/arrow-light.svgz"
0308 fillMode: Image.PreserveAspectFit
0309 }
0310 } // End of nextAnagram
0311
0312 Item {
0313 id: playerBox
0314 anchors {
0315 top: blackboard.top
0316 right: blackboard.left
0317 rightMargin: 185
0318 topMargin: blackboard.height / 7
0319 }
0320
0321 visible: kanagramGame.singlePlayer ? false : true
0322
0323 Rectangle {
0324 id: playerButton
0325 width: blackboard.width / 3
0326 height: blackboard.height / 7
0327 radius: 8
0328 color: "black"
0329
0330 MouseArea {
0331 anchors.fill: parent
0332 }
0333
0334 Text {
0335 id: currentPlayerText
0336 anchors{
0337 verticalCenter: playerButton.verticalCenter
0338 horizontalCenter: playerButton.horizontalCenter
0339 }
0340 color : "white"
0341 text: kanagramGame.currentPlayer == 1 ? i18n("1st Player") : i18n("2nd Player")
0342 }
0343 }
0344 }
0345
0346 Item {
0347 id: configure
0348 anchors {
0349 left: blackboard.right
0350 verticalCenter: blackboard.verticalCenter
0351 }
0352
0353 Rectangle {
0354 id: configureButton
0355 width: blackboard.width / 9
0356 height: blackboard.height / 7
0357 anchors {
0358 left: parent.left
0359 verticalCenter: parent.verticalCenter
0360 }
0361 radius: 8
0362 color: "black"
0363 opacity: 0.5
0364
0365 MouseArea {
0366 anchors.fill: parent
0367 hoverEnabled: true
0368 onEntered: configureButton.state = "onEntered"
0369 onExited: configureButton.state = "onExited"
0370 onClicked: {
0371 mainwindow.showSettings()
0372 }
0373 }
0374
0375 states: State {
0376 name: "onEntered"
0377 PropertyChanges {
0378 target: configureButton
0379 width: blackboard.width / 2.5
0380 }
0381 PropertyChanges {
0382 target: configureText
0383 opacity: 1
0384 }
0385 AnchorChanges {
0386 target: configureIcon
0387 anchors.horizontalCenter: undefined
0388 anchors.right: configureButton.right
0389 }
0390 PropertyChanges {
0391 target: configureIcon
0392 anchors.rightMargin: blackboard.width / 50
0393 }
0394 }
0395 State {
0396 name: "onExited"
0397 }
0398
0399 transitions: Transition {
0400 AnchorAnimation {
0401 duration: 250
0402 }
0403 PropertyAnimation {
0404 properties: "x,y,width,opacity"
0405 easing.type: Easing.Linear
0406 easing.amplitude: 5.0
0407 easing.period: 1
0408 }
0409 }
0410 }
0411
0412 Text {
0413 id: configureText
0414 anchors {
0415 verticalCenter: configureButton.verticalCenter
0416 horizontalCenter: configureButton.horizontalCenter
0417 }
0418 color: "white"
0419 text: i18n("Configure")
0420 opacity: 0
0421 font.pixelSize: parent.width / 68.5
0422 }
0423
0424 Image {
0425 id: configureIcon
0426 smooth: true
0427 height: configureButton.height / 2
0428 width: configureText.width / 3
0429 anchors {
0430 verticalCenter: configureButton.verticalCenter
0431 horizontalCenter: configureButton.horizontalCenter
0432 }
0433 source: "icons/spanner-light.svgz"
0434 fillMode: Image.PreserveAspectFit
0435 }
0436 } // End of configure
0437
0438 Item {
0439 id: help
0440 width: blackboard.width / 9
0441 height: blackboard.height / 7
0442 anchors {
0443 bottom: blackboard.bottom
0444 bottomMargin: blackboard.height / 7
0445 left: blackboard.right
0446 }
0447
0448 Rectangle {
0449 id: helpButton
0450 width: blackboard.width / 9
0451 height: blackboard.height / 7
0452 radius: 8
0453 color: "black"
0454 opacity: 0.5
0455
0456 property bool flag: true
0457
0458 function toggleMoreOptions() {
0459 if (flag) {
0460 moreOptionsButton.opacity = 0.5
0461 moreOptionsButton.width = blackboard.width / 2.5
0462 kanagramHandbookIcon.visible = true
0463 aboutKdeIcon.visible = true
0464 aboutKanagramIcon.visible = true
0465 flag = false
0466 } else {
0467 moreOptionsButton.opacity = 0
0468 moreOptionsTextBar.opacity = 0
0469 moreOptionsText.opacity = 0
0470 kanagramHandbookIcon.visible = false
0471 aboutKdeIcon.visible = false
0472 aboutKanagramIcon.visible = false
0473 flag = true
0474 }
0475 }
0476
0477 MouseArea {
0478 anchors.fill: parent
0479 hoverEnabled: true
0480 onEntered: helpButton.state = "onEntered"
0481 onExited: helpButton.state = "onExited"
0482 onClicked: helpButton.toggleMoreOptions()
0483 }
0484
0485 states: State {
0486 name: "onEntered"
0487 PropertyChanges {
0488 target: helpButton
0489 width: blackboard.width / 2.5
0490 }
0491 PropertyChanges {
0492 target: helpText
0493 opacity: 1
0494 }
0495 AnchorChanges {
0496 target: helpIcon
0497 anchors.horizontalCenter: undefined
0498 anchors.right: helpButton.right
0499 }
0500 PropertyChanges {
0501 target: helpIcon
0502 anchors.rightMargin: blackboard.width / 50
0503 }
0504 }
0505 State {
0506 name: "onExited"
0507 }
0508
0509 transitions: Transition {
0510 AnchorAnimation {
0511 duration: 250
0512 }
0513 PropertyAnimation {
0514 properties: "x,y,width,opacity"
0515 easing.type: Easing.Linear
0516 easing.amplitude: 5.0
0517 easing.period: 1
0518 }
0519 }
0520 }
0521
0522 Rectangle {
0523 id: moreOptionsButton
0524 width: blackboard.width / 9
0525 height: blackboard.height / 7
0526 anchors {
0527 top: helpButton.bottom
0528 topMargin: blackboard.height / 50
0529 left: parent.left
0530 }
0531 radius: 8
0532 color: "black"
0533 opacity: 0
0534 }
0535
0536 Rectangle {
0537 id: moreOptionsTextBar
0538 width: blackboard.width / 4
0539 height: blackboard.height / 16
0540 anchors {
0541 top: moreOptionsButton.bottom
0542 horizontalCenter: moreOptionsButton.horizontalCenter
0543 }
0544 radius: 8
0545 color: "black"
0546 opacity: 0
0547 }
0548
0549 Text {
0550 id: moreOptionsText
0551 anchors {
0552 verticalCenter: moreOptionsTextBar.verticalCenter
0553 horizontalCenter: moreOptionsTextBar.horizontalCenter
0554 }
0555 color: "white"
0556 text: i18n(" ")
0557 opacity: 0
0558 font.pixelSize: parent.width / 91
0559 }
0560
0561 Text {
0562 id: helpText
0563 anchors {
0564 verticalCenter: helpButton.verticalCenter
0565 horizontalCenter: helpButton.horizontalCenter
0566 }
0567 color: "white"
0568 text: i18n("About")
0569 opacity: 0
0570 font.pixelSize: screen.width / 68.5
0571 }
0572
0573 Image {
0574 id: helpIcon
0575 smooth: true
0576 height: blackboard.height / 14
0577 anchors {
0578 verticalCenter: helpButton.verticalCenter
0579 horizontalCenter: helpButton.horizontalCenter
0580 }
0581 source: "icons/question-light.svgz"
0582 visible: true
0583 fillMode: Image.PreserveAspectFit
0584 }
0585
0586 Image {
0587 id: aboutKdeIcon
0588 smooth: true
0589 height: blackboard.height / 14
0590 anchors {
0591 verticalCenter: moreOptionsButton.verticalCenter
0592 right: moreOptionsButton.right
0593 rightMargin: moreOptionsButton.width / 8
0594 }
0595 source: "icons/about-kde.png"
0596 visible: false
0597 fillMode: Image.PreserveAspectFit
0598
0599 MouseArea {
0600 anchors.fill: parent
0601 hoverEnabled: true
0602 onEntered: aboutKdeIcon.state = "onEntered"
0603 onExited: aboutKdeIcon.state = "onExited"
0604 onClicked: mainwindow.showAboutKDE()
0605 preventStealing: true
0606 }
0607
0608 states: State {
0609 name: "onEntered"
0610 PropertyChanges {
0611 target: moreOptionsTextBar
0612 opacity: 0.5
0613 }
0614 PropertyChanges {
0615 target: moreOptionsText
0616 text: i18n("About KDE")
0617 opacity: 1
0618 }
0619 }
0620 State {
0621 name: "onExited"
0622 }
0623
0624 transitions: Transition {
0625 AnchorAnimation {
0626 duration: 250
0627 }
0628 PropertyAnimation {
0629 properties: "x,y,width,opacity"
0630 easing.type: Easing.Linear
0631 easing.amplitude: 5.0
0632 easing.period: 1
0633 }
0634 }
0635 }
0636
0637 Image {
0638 id: aboutKanagramIcon
0639 height: blackboard.height / 14
0640 anchors {
0641 verticalCenter: moreOptionsButton.verticalCenter
0642 horizontalCenter: moreOptionsButton.horizontalCenter
0643 }
0644 source: "icons/about-kanagram.png"
0645 smooth: true
0646 visible: false
0647 fillMode: Image.PreserveAspectFit
0648
0649 MouseArea {
0650 anchors.fill: parent
0651 hoverEnabled: true
0652 onEntered: aboutKanagramIcon.state = "onEntered"
0653 onExited: aboutKanagramIcon.state = "onExited"
0654 onClicked: mainwindow.showAboutKanagram()
0655 preventStealing: true
0656 }
0657
0658 states: State {
0659 name: "onEntered"
0660 PropertyChanges {
0661 target: moreOptionsTextBar
0662 opacity: 0.5
0663 }
0664 PropertyChanges {
0665 target: moreOptionsText
0666 text: i18n("About Kanagram")
0667 opacity: 1
0668 }
0669 }
0670 State {
0671 name: "onExited"
0672 }
0673
0674 transitions: Transition {
0675 AnchorAnimation {
0676 duration: 250
0677 }
0678 PropertyAnimation {
0679 properties: "x,y,width,opacity"
0680 easing.type: Easing.Linear
0681 easing.amplitude: 5.0
0682 easing.period: 1
0683 }
0684 }
0685 }
0686
0687 Image {
0688 id: kanagramHandbookIcon
0689 smooth: true
0690 height: blackboard.height / 14
0691 anchors {
0692 verticalCenter: moreOptionsButton.verticalCenter
0693 left: moreOptionsButton.left
0694 leftMargin: moreOptionsButton.width / 8
0695 }
0696 source: "icons/kanagram-handbook.png"
0697 visible: false
0698 fillMode: Image.PreserveAspectFit
0699
0700 MouseArea {
0701 anchors.fill: parent
0702 hoverEnabled: true
0703 onEntered: kanagramHandbookIcon.state = "onEntered"
0704 onExited: kanagramHandbookIcon.state = "onExited"
0705 onClicked: mainwindow.showHandbook()
0706 preventStealing: true
0707 }
0708
0709 states: State {
0710 name: "onEntered"
0711 PropertyChanges {
0712 target: moreOptionsTextBar
0713 opacity: 0.5
0714 }
0715 PropertyChanges {
0716 target: moreOptionsText
0717 text: i18n("Kanagram Handbook")
0718 opacity: 1
0719 }
0720 }
0721 State {
0722 name: "onExited"
0723 }
0724
0725 transitions: Transition {
0726 AnchorAnimation {
0727 duration: 250
0728 }
0729 PropertyAnimation {
0730 properties: "x,y,width,opacity"
0731 easing.type: Easing.Linear
0732 easing.amplitude: 5.0
0733 easing.period: 1
0734 }
0735 }
0736 }
0737 } // End help
0738
0739 Rectangle {
0740 id: inputField
0741 width: blackboard.width
0742 height: parent.height / 10
0743 anchors {
0744 horizontalCenter: blackboard.horizontalCenter
0745 bottom: parent.bottom
0746 bottomMargin: parent.height / 35
0747 }
0748 radius: 8
0749 border.color: "white"
0750 border.width: 0
0751 color: "black"
0752 opacity: 0.35
0753 }
0754
0755 Grid {
0756 id: answerGrid
0757 anchors {
0758 centerIn: inputField
0759 }
0760 spacing: 5
0761 columns: 13
0762 Repeater {
0763 model: kanagramGame.userAnswer
0764 LetterButton {
0765 text: modelData
0766 onClicked: {
0767 if (countDownTimerValue == 0)
0768 kanagramGame.moveLetterToAnagram( index )
0769 }
0770 }
0771 }
0772 }
0773
0774 Timer {
0775 id: resetTimer
0776 interval: 1000
0777 repeat: true
0778 running: false
0779 triggeredOnStart: false
0780
0781 onTriggered: {
0782 if (--countDownTimerValue == 0) {
0783 if (flagCorrectAnswer) {
0784 kanagramGame.nextAnagram();
0785 if (kanagramGame.hintHideTime())
0786 blackboard.showHintTimeInterval = 1
0787 } else {
0788 kanagramGame.resetAnagram();
0789 }
0790 stop()
0791 }
0792 }
0793 }
0794
0795 MediaPlayer {
0796 id: chalkSound
0797 source: "sounds/chalk.wav"
0798 }
0799
0800 MediaPlayer {
0801 id: rightSound
0802 source: "sounds/right.wav"
0803 }
0804
0805 MediaPlayer {
0806 id: wrongSound
0807 source: "sounds/wrong.wav"
0808 }
0809
0810 Blackboard {
0811 id: blackboard
0812 border {
0813 width: parent.width / 68.5
0814 color: "#613529"
0815 }
0816 width: parent.width / 2
0817 height: parent.height / 1.5
0818 anchors {
0819 horizontalCenter: parent.horizontalCenter
0820 top: headerArea.bottom
0821 }
0822 onNextAnagram: {
0823 screen.nextAnagram();
0824 }
0825 }
0826
0827 Keys.onPressed: {
0828 if (countDownTimerValue != 0)
0829 return;
0830
0831 if (event.text.length > 0) {
0832 kanagramGame.moveLetter(event.text);
0833 checkSolved();
0834 }
0835 if (event.key == Qt.Key_Backspace)
0836 {
0837 var length = kanagramGame.userAnswer.length;
0838 if (length > 0)
0839 kanagramGame.moveLetterToAnagram(length - 1);
0840 }
0841 }
0842 }