//======================================================================================================================================================================== // CONFIG_BATTERIES.QML // Ce fichier traite la configuration des batteries. La page permet notamment de : // - Afficher, pour toutes les batteries déjà configurées (et donc d'accéder à la configuration détaillée de l'une d'elle ; ou sa création) // - Accéder au menu de changement de l'ordre d'affichage sur la page d'accueil // La page est appelée depuis la page PARAMETRES_AVANCES, en cliquant sur "Batteries" //======================================================================================================================================================================== import QtQuick 2.12 import QtQuick.Controls 2.12 import qt.koriolan.shipheart 1.0 Shipheart_page { id: page_config_batteries // Mis en forme : readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas readonly property int hauteur_bouton_droit: 80 readonly property double pourcentage_largeur_colonne_gauche: 0.75 readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 1.0 readonly property int espace_colonnes_principales: 20 readonly property int nombre_batteries_affiches_sur_une_colonne: 8 readonly property int periode_init_raffraichissement_parametres: 1 // En ms readonly property int periode_raffraichissement_parametres: 100 // En ms // Affichage : property int niveau_page: 0 property bool bouton_bandeau_bas_zone_retour_actif: false // 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(); } if (stackView.depth === (niveau_page + 1)) // Désactive le raffraichissement quand la page n'est pas activée dans la pile { if (!bouton_bandeau_bas_zone_retour_actif) { } } } } //=========================================================== // Lorsque la page est sur le point d'être affichée dans la pile : //=========================================================== StackView.onActivating: { mise_a_jour_donnees(); // Permet que lors du retour sur la page, l'état des différentes variables soit mise à jour avant l'affichage proprement dit. } // Titre de la page : Shipheart_titre_1 {titre:qsTr("Configuration des batteries"); hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran de gauche (liste des batteries) : //------------------------------------------------------- Rectangle { id: zone_affichage_gauche x: 0 y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: affichage_hauteur_utile color: "transparent" //------------------------------------------------------------------- // Grille pour afficher les batteries : GridView { id: grille_principale width: parent.width height: parent.height cellWidth: parent.width; cellHeight: height / nombre_batteries_affiches_sur_une_colonne snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView model: modele_grille_principale delegate: Rectangle { width: grille_principale.cellWidth height: grille_principale.cellHeight color: "transparent" Rectangle { // c'est le bouton proprement dit... height: parent.height - 10 width:parent.width - 10 color: shipheart_couleur_fond_bouton border.color: couleur_rouge border.width: (model.etat_systeme === 0) ? 0 : 3 radius: shipheart_rayon_bouton anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Text { anchors.fill: parent horizontalAlignment: Qt.AlignLeft verticalAlignment: Qt.AlignVCenter leftPadding: 20 text: model.nom color: couleur_blanc_casse font.pixelSize: 18 wrapMode: Label.Wrap } MouseArea{ anchors.fill : parent enabled : !grille_principale.moving // Permet de bloquer le Mousearea pendant le déplacement de la grille onReleased: { // Permet déclencher à la fin d'un clic (court) sans mouvement shipheart_clic(); stackView.push("config_batterie.qml", {"id_batterie": model.id}) } } } } ListModel { id: modele_grille_principale } Label { anchors.fill: parent horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter visible: parent.count === 0 text: qsTr("Aucune batterie n'est encore configurée...") color: couleur_rouge_transparent font.pixelSize: 15 font.bold: true wrapMode: Label.Wrap } } } //------------------------------------------------------- // Ecran Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_droite x: zone_affichage_gauche.width + espace_colonnes_principales y: shipheart_hauteur_bandeau_haut + 5; // Le +5 permet d'aligner le haut du premier bouton de droite avec le haut du premier bouton de la liste de gauche ( width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2) height: affichage_hauteur_utile color: "transparent" Column { anchors.fill: parent spacing: 10 //---------------------- // Bouton + : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: !clavier.active Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 40 text: qsTr("+") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); stackView.push("config_batterie.qml"); } } } //---------------------- // Bouton tri : Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: !clavier.active // && (modele_grille_principale.count > 1) // SDIR #258 Image { id: image_parametres source: "/images/tri.png" sourceSize.height: 25 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); stackView.push("config_ordre_elements.qml", {"table": "TB_Batteries"}) } } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; padding: 5 spacing: 5 //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - parent.leftPadding - (parent.spacing / 2) height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding; radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Image { source: "/images/icone_retour.png" sourceSize.height: 30 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille. id: mouse_area_bandeau_bas_zone_retour anchors.fill: parent onClicked: { shipheart_clic(); stackView.pop() } } } } // Note : il est inutile de prévoir un Mousearea pour sortir de l'économiseur sur cette page puisqu'il // est systématiquement bloqué pour toutes les pages lancées depuis 'Paramètres Avancés'. //============================================================================================================= // Init de la page //============================================================================================================= function init_page() { niveau_page = stackView.depth - 1; // Permet de stocker le niveau de la page dans la Stackview mise_a_jour_donnees(); } //============================================================================================================= // Mise à jour des données //============================================================================================================= function mise_a_jour_donnees() { var req, res; var i; var nb_batteries; modele_grille_principale.clear(); // RAZ des valeurs existantes req = 'SELECT Cle_primaire, '; req += ' Etat_systeme, '; req += ' Nom '; req += ' FROM TB_Batteries ORDER BY Priorite_affichage_accueil'; //console.log("req = [ " + req + '; ]'); nb_batteries = bdd.requete(req); for (i = 0; i < nb_batteries; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { modele_grille_principale.append({"id": Number(res[0]), "etat_systeme": Number(res[1]), "nom": res[2] }); } else break; // Ne devrait pas arriver.... } } }