//======================================================================================================================================================================== // HOME_SUNCY.QML // Ce fichier est la page d'accueil pour le client Suncy. Il propose un clavier et un petit message d'accueil. // La page est appelée depuis la page main.qml lorsque le paramètre 'shipheart_specifique_client[0]' est égal à 1 //======================================================================================================================================================================== import QtQuick 2.12 import qt.koriolan.shipheart 1.0 Shipheart_page { id: page_home_suncy // Mis en forme : readonly property double pourcentage_largeur_colonne_gauche: 0.5 readonly property double espace_colonnes_principales: 20 readonly property double pourcentage_hauteur_ligne_haut: 0.15 readonly property double espace_lignes_principales: 20 readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1 readonly property int periode_init_raffraichissement_parametres: 1 // En ms readonly property int periode_raffraichissement_parametres: 1000 // En ms // Affichage : property bool bouton_bandeau_bas_zone_retour_actif: false property int protection_mode: 0 // Données : property string code_saisi: "" property string code_saisi_pattern: "" // Contient une suite de '*' dont le nombre correspond à la taille du code entré (avec un maxi) property int max_taille_code_pattern: 10 // Modèles : // Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes //=========================================================== // Timer periode raffraichissement parametres : //=========================================================== Timer { id: timer_raffraichissement_parametres interval: periode_init_raffraichissement_parametres triggeredOnStart: false running: true repeat: true onTriggered: { if (interval == periode_init_raffraichissement_parametres) { // Premier passage, 1ms après le premier chargement interval = periode_raffraichissement_parametres; init_page(); timer_raffraichissement_parametres.stop(); // Arret du timer une fois l'init faite car il n'y a rien à faire. } } } // Titre de la page : Shipheart_titre_1 {titre:""; hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran Haut - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_haut_gauche x: 0 y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" border.width: 1 border.color: couleur_gris_moyen radius: shipheart_rayon_bouton Text { anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: 12 // Les '*' sont naturellement décalées vers le haut de la ligne... horizontalCenter: parent.horizontalCenter } font.pixelSize: 80 font.letterSpacing: 10 text: code_saisi_pattern; color: couleur_blanc_casse } } //------------------------------------------------------- // Ecran Bas - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_bas_gauche x: 0 y: shipheart_hauteur_bandeau_haut + zone_affichage_haut_gauche.height + espace_lignes_principales; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: (affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut)) - (espace_lignes_principales / 2); color: "transparent" Grid { id: grille_clavier width: parent.width * 0.6 height: parent.height * 0.8 columns: 3 rows: 4 spacing: 10 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } Repeater { model: modele_clavier Rectangle { width: (grille_clavier.width - ((grille_clavier.columns - 1) * grille_clavier.spacing)) / grille_clavier.columns height: (grille_clavier.height - ((grille_clavier.rows - 1) * grille_clavier.spacing)) / grille_clavier.rows color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 50 text: libelle; color: couleur_blanc_casse visible: (libelle === "") ? false : true } Image { source: icone sourceSize.height: 30 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } visible: (libelle === "") ? true : false } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); switch(action) { case "backspace": code_saisi = code_saisi.slice(0, code_saisi.length - 1); break; case "clear": code_saisi = ""; break; default: code_saisi += libelle; break; } if (check_code() === 0) deverrouillage(); mise_a_jour_pattern(); } } } } ListModel { id: modele_clavier ListElement { libelle: "7"; action: ""; icone: "" } ListElement { libelle: "8"; action: ""; icone: "" } ListElement { libelle: "9"; action: ""; icone: "" } ListElement { libelle: "4"; action: ""; icone: "" } ListElement { libelle: "5"; action: ""; icone: "" } ListElement { libelle: "6"; action: ""; icone: "" } ListElement { libelle: "1"; action: ""; icone: "" } ListElement { libelle: "2"; action: ""; icone: "" } ListElement { libelle: "3"; action: ""; icone: "" } ListElement { libelle: ""; action: "backspace"; icone: "/images/backspace.png" } ListElement { libelle: "0"; action: ""; icone: "" } ListElement { libelle: ""; action: "clear"; icone: "/images/double_fleche_gauche.png" } } } } //------------------------------------------------------- // Ecran Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: zone_affichage_haut_gauche.width + espace_colonnes_principales y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2) height: affichage_hauteur_utile; color: "transparent" Image { source: "/images/logo_suncy_concept.png" sourceSize.height: parent.height * 0.2; // sourceSize.width: bandeau_bas_largeur_zone_status_connexions anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter } Text { id: texte_home_suncy_fr width: parent.width anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } horizontalAlignment: Text.AlignHCenter wrapMode: Text.Wrap padding: 20 font.pixelSize: 20 text: qsTr("L'accès au bateau est protégé.\nMerci d'entrer votre code de déverrouillage pour y accéder...") color: couleur_blanc_casse visible: true } Text { id: texte_home_suncy_en width: parent.width anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter verticalCenterOffset: 100 } horizontalAlignment: Text.AlignHCenter wrapMode: Text.Wrap padding: 20 font.pixelSize: 20 font.italic: true text: "Ship access is restricted.\nPlease enter your unlocking code to proceed..."; color: couleur_blanc_casse visible: true } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; spacing: 5 padding: 5 } //=========================================================== // Economiseur : Doit être placé en fin de page pour fonctionner //=========================================================== MouseArea { anchors.fill: parent preventStealing: true // Permet que cela fonctionne même si un élément flickable (notamment) soit derrière et "vole" le click enabled: flag_economiseur_actif onClicked: { mise_en_veille(0); } } //============================================================================================================= // Init de la page //============================================================================================================= function init_page() { var req, res mise_en_veille(0); activation_moteur(0); // Dans le doute, on coupe l'activation du moteur dès le démarrage //console.log("Mode actuel : " + protection_mode); // Coupure de tous les circuits par défaut : req = 'UPDATE TB_Circuits SET New_consigne="0" ' bdd.requete_unique(req); req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Code_client" '; res = bdd.requete_unique(req); shipheart_code_client = res[0]; req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Max_taille_code" '; res = bdd.requete_unique(req); if (Number(res[0]) >= max_taille_code_pattern) max_taille_code_pattern = Number(res[0]) + 2; } //============================================================================================================= // Déverrouillage //============================================================================================================= function deverrouillage() { var i; //console.log("Le code est valide. La page est déverrouillée....") if ((activation_moteur(100)) === -1) console.log("/!\ Aucune sortie valide d'activation du moteur a été trouvée") code_saisi = ""; stackView.push("home.qml"); } //============================================================================================================= // Vérification du code_saisi vs le code //============================================================================================================= function check_code() { var code_saisi_encrypte; code_saisi_encrypte = bdd.sha256(code_saisi); //console.debug("Le code saisi est [" + code_saisi + "] et le code saisi encrypté est [" + code_saisi_encrypte + "]"); //console.debug("Le hash du code Client est [" + shipheart_code_client + "]"); if (shipheart_code_client.localeCompare(code_saisi_encrypte) === 0) return(0); else return(-1); } //============================================================================================================= // Mise à jour du pattern //============================================================================================================= function mise_a_jour_pattern() { var longueur; var i; longueur = code_saisi.length; if (longueur > max_taille_code_pattern) longueur = max_taille_code_pattern; code_saisi_pattern = ""; for (i=0; i 100) consigne = 100; // Acivation du moteur si un numéro de circuit valide pour le faire existe : for (i = 1; i < shipheart_specifique_client.length; i ++) // Parcourt de tous les paramètres spécifiques au client (sauf le 1er qui est le n° de client et qui est déjà connu et testé) { var parametre = shipheart_specifique_client[i].split('='); // Séparation du nom du champ et de sa valeur if (parametre[0] === 'id_circuit_activation_moteur') // Si le paramètre en cours est bien celui concernant l'ID du circuit d'activation du moteur { bdd.requete_unique("UPDATE TB_Circuits SET New_consigne=" + consigne + " WHERE Cle_primaire='" + Number(parametre[1]) + "'") } } return (-1); // Cas où on n'a trouvé aucune sortie valide. } }