diff --git a/Motus/Main.qml b/Motus/Main.qml index 030b30abaea1efc054cefb7bc25b0059a1140d5f..f355016a589efcae76967e2a8f2e219855296033 100644 --- a/Motus/Main.qml +++ b/Motus/Main.qml @@ -1,3 +1,4 @@ + import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 @@ -12,256 +13,403 @@ Window { visibility: Window.Maximized title: qsTr("Motus") - // Suppression de la déclaration initiale de caseArray car _case_1_1 etc. ne sont pas définis. + // Propriétés de gestion property int indice_case: 0 - property var caseArray: [] // sera rempli après création de la grille + property int current_essai: 0 + property var caseArray: [] // Rempli lors de la création de la grille property var case_focus: null - // L'élément Rectangle ci-dessous couvre toute la fenêtre et gère les touches + property int nb_lettres: 5 + property var arrayTry: [5,6,6,7,7,8,8,8,8] + property int nb_essais: arrayTry[nb_lettres - 4] + property string mot: "" + property var mot_split: [] + + // Rectangle principal qui couvre la fenêtre Rectangle { id: mainRect anchors.fill: parent color: "#323232" focus: true - // Gestion des touches (attachée à un Item, pas à Window) - Keys.onPressed: { - // Vérification que case_focus existe et possède la propriété _textText - if (case_focus && case_focus._textText !== undefined && /^[a-zA-Z]$/.test(event.text)) { - case_focus._textText = event.text; - indice_case++; - if (indice_case < caseArray.length) { - case_focus = caseArray[indice_case]; + // Gestion des touches du clavier physique (déclarée sous forme de fonction) + Keys.onPressed: function(event) { + if (case_focus != -1 && mot != ""){ + + if (case_focus && case_focus._textText !== undefined && /^[a-zA-Z]$/.test(event.text)) { + case_focus._textText = event.text.toUpperCase(); + indice_case++; + if (indice_case < nb_lettres-1){ + case_focus = caseArray[indice_case+nb_lettres*current_essai]; + } + else { + case_focus = -1 + } + + event.accepted = true; } - event.accepted = true; - } else if (event.key === Qt.Key_Backspace) { - if (indice_case > 0) { + + } + if (event.key === Qt.Key_Backspace) { + if (indice_case > 0 && indice_case != nb_lettres-1) { indice_case--; case_focus = caseArray[indice_case]; case_focus._textText = " "; } - event.accepted = true; + else if (indice_case === nb_lettres-1) { + case_focus = caseArray[indice_case+nb_lettres*current_essai];; + case_focus.textText = " "; + } } - } + else if (event.key === Qt.Key_Return && indice_case === nb_lettres-1) { + + if (current_essai === nb_essais-1){ // on entre dans la boucle de l'endgame + // il faut bloquer toute interaction autre que relancer une partie ; + // reset les paramètres de gestion du focus des cases ; + // déclencher une animation de fin qui indique la victoire ou la défaite + // update les stats + nb_essais = 0; + } + else { // verificastr de la propal + // lettre mal placée : f0d437 (jaune) ; lettre mauvaise : 323232 (fond window) ; lettre bien placée : 23ed1c + current_essai ++; + case_focus = caseArray[indice_case+nb_lettres*current_essai]; + - // Bouton "Générer un mot" - Choosebutton { - id: choosebutton - anchors.top: parent.top - anchors.left: parent.left - anchors.topMargin: parent.height * 0.2 - anchors.leftMargin: parent.width * 0.2 - _textText: "Générer un mot" - - Case { - id: case3 - _textText: "mot test" - } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - let mot = motusGame.getRandomWord(); - motusGame.startTimer(); - case3._textText = mot; } + + indice_case = 0; } + event.accepted = true; } + // Disposition globale en colonne - // Fenêtre pour les langages (en dessous du bouton générer) - Rectangle { - id: big_rectangle_langue - width: parent.width * 0.15 - height: parent.height * 0.35 - anchors.top: choosebutton.bottom - anchors.left: choosebutton.left - anchors.topMargin: parent.height * 0.3 - color: "#323232" - radius: 10 - border.color: "#ffffff" - border.width: 3 - - Column { - anchors.fill: parent - anchors.margins: 10 - spacing: 10 - // Ne pas utiliser d'anchors conflictuels sur les enfants du Column - - Text { - text: qsTr("Language/Langage") - font.pixelSize: 25 - color: "white" - horizontalAlignment: Text.AlignHCenter - } - LangageButton { - _textText: "Français" - // Utilisez par exemple Layout.alignment si nécessaire + Row { + id: main_row + width: 1800 + height: 900 + anchors.verticalCenter: parent.verticalCenter + spacing: 150 + anchors.horizontalCenter: parent.horizontalCenter + + Rectangle { + id: rectangle_buttons + width: 400 + height: 850 + color: "#323232" + border.width: 0 + + Column { + id: column_buttons + width: 400 + height: 850 + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + spacing: 20 - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - motusGame.dictionnaryChoosed = "Motus\\mots_francais.txt"; + Choosebutton { + id: choosebutton + anchors.horizontalCenter: parent.horizontalCenter + _textText: "Générer un mot" + // Exemple : affichage d'un mot généré dans un Case enfant + Case { + id: case3 + _textText: "mot test" + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { // début d'une game, il faut bloquer les boutons de régénération etc + mot = motusGame.getRandomWord(); + motusGame.startTimer(); + case3._textText = mot; + mot_split = mot.split(""); + console.log(mot_split) + } } } - } - LangageButton { - _textText: "English" + Rectangle { + id: big_rectangle_langue + width: 250 + height: 300 + color: "#323232" + radius: 10 + border.color: "#ffffff" + border.width: 3 + anchors.horizontalCenter: parent.horizontalCenter + + Column { + id: column + anchors.fill: parent + anchors.margins: 10 + spacing: 15 + + Text { + y: 100 + text: qsTr("Language/Langage") + font.pixelSize: 25 + color: "white" + horizontalAlignment: Text.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + } + + LangageButton { + id: langageButton + anchors.horizontalCenter: parent.horizontalCenter + _textText: "Français" + MouseArea { + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + cursorShape: Qt.PointingHandCursor + onClicked: { + motusGame.dictionnaryChoosed = "Motus\\mots_francais_bis.txt"; + } + } + } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - motusGame.dictionnaryChoosed = "Motus\\words_alpha.txt"; + LangageButton { + anchors.horizontalCenter: parent.horizontalCenter + _textText: "English" + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + motusGame.dictionnaryChoosed = "Motus\\words_alpha.txt"; + } + } + } } } - } - } - } - // Texte MOTUS - Text { - id: _text2 - text: qsTr("MOTUS") - font.pixelSize: 50 - color: "white" - font.family: "Tahoma" - font.bold: true - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: parent.top - anchors.topMargin: parent.height * 0.2 - } + Rectangle { + id: big_rectangle_nb_lettres + width: 250 + height: 300 + color: "#323232" + radius: 10 + border.color: "#ffffff" + border.width: 3 + anchors.horizontalCenter: parent.horizontalCenter - // Grille de jeu (les cases seront créées dynamiquement) - Grid { - id: grid - anchors.top: _text2.bottom - anchors.topMargin: parent.height * 0.02 - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width * 0.25 - height: parent.height * 0.3 - spacing: 5 - rows: 6 - columns: 5 - - Repeater { - id: caseRepeater - model: 30 - delegate: Case { - // Afin d'identifier chaque instance, on peut donner un objectName - objectName: "caseDelegate" - } - } - } + Column { + id: colonne_nb_lettres + anchors.fill: parent + spacing: 50 + + Text { + id: text_choix_nb_lettres + text: qsTr("Nombre de lettres / \n Number of letters") + font.pixelSize: 22 + anchors.horizontalCenter: parent.horizontalCenter + color: "white" + } - // Au chargement, remplir caseArray à partir des enfants de la grille - Component.onCompleted: { - caseArray = []; - for (var i = 0; i < grid.children.length; i++) { - // On ajoute uniquement les instances générées par le Repeater - if (grid.children[i].objectName === "caseDelegate") { - caseArray.push(grid.children[i]); + NumberLetterButton { + id: numberLetterBtn + width: parent.width + height: 60 + } + } + } } } - if (caseArray.length > 0) { - case_focus = caseArray[0]; - } - } - // Clavier en bas centré - Rectangle { - id: rectangle1 - width: parent.width * 0.4 - height: parent.height * 0.3 - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: parent.height * 0.2 - color: "#323232" - radius: 10 - border.color: "#ffffff" - border.width: 5 - - Column { - anchors.fill: parent - anchors.margins: 10 - spacing: parent.width * 0.04 - anchors.topMargin: 0 - anchors.rightMargin: 0 - anchors.leftMargin: 0 - anchors.bottomMargin: 0 - topPadding: rectangle1.height * 0.05 // ← espace en haut - bottomPadding: rectangle1.height * 0.05 // ← espace en bas - - - - Repeater { - anchors.fill: parent.parent - model: [ - ["A", "Z", "E", "R", "T", "Y", "U", "I", "O", "P"], - ["Q", "S", "D", "F", "G", "H", "J", "K", "L"], - ["↑", "W", "X", "C", "V", "B", "N", "M", "<"] - ] - delegate: Row { - spacing: parent.width * 0.005 + Rectangle { + id: rectangle_center + width: 700 + height: 900 + color: "#323232" + border.width: 0 + + Column { + id: center_column + width: 700 + height: 900 + anchors.verticalCenter: parent.verticalCenter + spacing: 30 + anchors.horizontalCenter: parent.horizontalCenter + + Rectangle { + id: rectangle_titre + width: 200 + height: 70 + color: "#323232" + border.width: 0 anchors.horizontalCenter: parent.horizontalCenter - Repeater { - model: modelData - delegate: Key { - width: modelData === "Entrée" || modelData === "<" ? 80 : 50 - height: 60 - labelText: modelData - scale: 0.8 + Text { + id: _text2 + text: qsTr("MOTUS") + anchors.verticalCenter: parent.verticalCenter + font.pixelSize: 50 + color: "white" + font.family: "Tahoma" + font.bold: true + horizontalAlignment: Text.AlignHCenter + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + } + } + + Rectangle { + id: rectangle_grid + width: 450 + height: 500 + color: "#323232" + border.width: 0 + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + + Grid { + id: grid + x: -553 + y: -430 + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.leftMargin: 39 + anchors.rightMargin: -39 + anchors.topMargin: -80 + anchors.bottomMargin: 80 + spacing: 5 + rows: 6 + columns: 5 + + Repeater { + id: caseRepeater + model: 30 + delegate: Case { + objectName: "caseDelegate" + } + } + } + } + + + Rectangle { + id: rectangle1 + width: 600 + height: 220 + anchors.horizontalCenter: parent.horizontalCenter + color: "#323232" + radius: 10 + border.color: "#ffffff" + border.width: 5 + anchors.bottom: parent.bottom + anchors.bottomMargin: 50 + + + Column { + anchors.fill: parent + anchors.margins: 10 + spacing: 6 + topPadding: rectangle1.height * 0.05 + bottomPadding: rectangle1.height * 0.05 + + Repeater { + model: [ + ["A", "Z", "E", "R", "T", "Y", "U", "I", "O", "P"], + ["Q", "S", "D", "F", "G", "H", "J", "K", "L"], + ["↑", "W", "X", "C", "V", "B", "N", "M", "<"] + ] + delegate: Row { + spacing: 5 + anchors.horizontalCenter: parent.horizontalCenter + + Repeater { + model: modelData + delegate: Rectangle { + width: (modelData === "Entrée" || modelData === "<") ? 80 : 50 + height: 60 + color: "lightgray" + radius: 5 + border.color: "gray" + Text { + anchors.centerIn: parent + text: modelData + font.pixelSize: 20 + color: "black" + } + MouseArea { + anchors.fill: parent + onClicked: { + if (modelData === "<") { + if (indice_case > 0) { + indice_case--; + caseArray[indice_case]._textText = ""; + case_focus = caseArray[indice_case]; + } + } else if (modelData === "↑") { + // Action pour la touche "↑" si nécessaire + } else { + if (indice_case < caseArray.length) { + caseArray[indice_case]._textText = modelData.toUpperCase(); + indice_case++; + if (indice_case < caseArray.length) + case_focus = caseArray[indice_case]; + } + } + } + } + } + } + } } } } + + } } - } - // Combobox pour le nombre de lettres - Rectangle { - id: rectangle_combobox - anchors.top: parent.top - anchors.right: parent.right - width: parent.width * 0.2 - height: parent.height * 0.2 - anchors.topMargin: parent.height * 0.13 - anchors.rightMargin: parent.width * 0.6 - color: "#323232" - radius: 10 - border.color: "#ffffff" - border.width: 3 - - Text { - text: qsTr("Nombre de lettres / \n Number of letters") - font.pixelSize: 22 - color: "white" - horizontalAlignment: Text.AlignHCenter - anchors.horizontalCenter: parent.horizontalCenter - } + Rectangle { + id: rectangle_right + width: 400 + height: 850 + color: "#323232" + border.width: 0 + + Row { + y: 50 + anchors.horizontalCenter: parent.horizontalCenter + spacing: 20 + // Combobox pour le nombre de lettres + Rectangle { + id: rectangle_combobox + width: 193 + height: 60 + color: "#323232" + radius: 10 + border.color: "#ffffff" + border.width: 3 + } - NumberLetterButton { - y: 49 - width: parent.width - height: parent.height * 0.5 - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom - anchors.bottomMargin: 16 + // Timer (positionné à droite) + MotusTimer { + id: motusTimer + width: 100 + height: 100 + } + } } + } + } - // Timer - MotusTimer { - id: motusTimer - anchors.top: parent.top - anchors.right: parent.right - anchors.topMargin: parent.height * 0.07 - anchors.rightMargin: parent.width * 0.25 + // Au chargement, remplir caseArray à partir des instances créées par le Repeater de la grille + Component.onCompleted: { + caseArray = []; + for (var i = 0; i < caseRepeater.count; i++) { + caseArray.push(caseRepeater.itemAt(i)); + } + if (caseArray.length > 0) { + case_focus = caseArray[0]; } } }