//======================================================================================================================================================================== // CONFIG_CIRCUIT_CONDITION_COMMANDE_AUTO.QML // Ce fichier traite la configuration d'une condition d'une commande Auto d'un circuit. La page permet notamment de : // - Modifier la config de cette condition (ou de la créer la première fois), // La page est appelée depuis la page config_circuit_commande_auto //======================================================================================================================================================================== import QtQuick 2.12 import QtQml.Models import qt.koriolan.shipheart 1.0 import"fonctions.js" as Fonctions Shipheart_page { id: page_config_capteur_calcule_booleen_condition // Mis en forme : readonly property double pourcentage_largeur_colonne_gauche: 0.75 readonly property double espace_colonnes_principales: 20 readonly property double pourcentage_hauteur_ligne_haut: 1 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 int hauteur_ligne_formulaire: 60 readonly property double pourcentage_largeur_labels_formulaire: 0.4 readonly property double pourcentage_largeur_unites_formulaire: 0.1 readonly property int hauteur_bouton_droit: 80 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 // Données : property bool flag_init: true // Permet de bloquer certains affichage tant que l'init n'est pas terminée property string nom_capteur: "" property bool flag_new; property int type_source: 0 property int id_source: 0 property int id_variable: 0 property int test: 0 property double seuil: 0 property string seuil_unite: "" property bool flag_test_binaire: false // Indique si l'évènement porte sur une condition binaire ou non (exemple: Capteur>Entrée AUX) // Modèles : // Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes //------------------------------------------------- // Signaux : //------------------------------------------------- signal enregistrer_config_capteur_calcule_booleen_condition(bool flag_new, int type_source, int id_source, int id_variable, int test, double seuil) // Valeurs à lire lorsque le "OnEnregistrer' est activé //=========================================================== // 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(); } else { } } } // Titre de la page : Shipheart_titre_1 {titre: qsTr("Création d'une condition du capteur [%1]").arg(nom_capteur); 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" ListView { id: grille_principale width: parent.width height: parent.height 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 footer: Rectangle { // Permet de dégager la place suffisante en fin de GridView pour accéder même au dernier élément lorsque que clavier est déplié height: shipheart_hauteur_clavier color: "transparent" } ObjectModel { id: modele_grille_principale //------------------------------------------------------------------------------- // Ligne de formulaire : Type_source Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 // Permet que la ligne n'occupe aucune place quand elle n'est pas visible color: "transparent" visible: (!flag_init) Shipheart_formulaire_label { text: qsTr("Type") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Type_source.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Type_source model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); if (type_source !== champ_formulaire_Type_source.model.get(champ_formulaire_Type_source.currentIndex).valeur) { type_source = champ_formulaire_Type_source.model.get(champ_formulaire_Type_source.currentIndex).valeur; id_source = 0; id_variable = 0; test = 0; mise_a_jour_source(); } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Source Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 // Permet que la ligne n'occupe aucune place quand elle n'est pas visible color: "transparent" visible: (!flag_init) && (type_source > 0) Shipheart_formulaire_label { text: qsTr("Source") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Source.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Source model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); if (id_source !== champ_formulaire_Source.model.get(champ_formulaire_Source.currentIndex).valeur) { id_source = champ_formulaire_Source.model.get(champ_formulaire_Source.currentIndex).valeur; id_variable = 0; test = 0; mise_a_jour_variable(); } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Variable Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 // Permet que la ligne n'occupe aucune place quand elle n'est pas visible color: "transparent" visible: (!flag_init) && (type_source > 0) && (id_source > 0) && (champ_formulaire_Variable.model.count > 2) // Comme on a toujours "Non défini", si Count<=2, c'est qu'on n'a qu'un seul choix qu'il n'est pas nécessaire d'afficher... Shipheart_formulaire_label { text: qsTr("Variable") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Variable.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Variable model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); if (id_variable !== champ_formulaire_Variable.model.get(champ_formulaire_Variable.currentIndex).valeur) { id_variable = champ_formulaire_Variable.model.get(champ_formulaire_Variable.currentIndex).valeur; seuil_unite = champ_formulaire_Variable.model.get(champ_formulaire_Variable.currentIndex).unite; mise_a_jour_test(); } } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Test Rectangle { width: parent.width height: visible ? hauteur_ligne_formulaire : 0 // Permet que la ligne n'occupe aucune place quand elle n'est pas visible color: "transparent" visible: (!flag_init) && (type_source > 0) && (id_source > 0) && (id_variable > 0) Shipheart_formulaire_label { text: qsTr("Test") width: parent.width * pourcentage_largeur_labels_formulaire couleur: (champ_formulaire_Test.currentIndex !== 0) ? shipheart_formulaire_couleur_texte_par_defaut : shipheart_formulaire_couleur_texte_en_erreur } Shipheart_formulaire_combobox { id: champ_formulaire_Test model: ListModel { } width: parent.width * (1 - pourcentage_largeur_labels_formulaire) onActivated: { shipheart_clic(); test = champ_formulaire_Test.model.get(champ_formulaire_Test.currentIndex).valeur; } } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } //------------------------------------------------------------------------------- // Ligne de formulaire : Seuil Rectangle { width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2) height: visible ? hauteur_ligne_formulaire : 0 // Permet que la ligne n'occupe aucune place quand elle n'est pas visible color: "transparent" visible: (!flag_init) && (type_source > 0) && (id_source > 0) && (id_variable > 0) && (!flag_test_binaire) // Si on est sur un test binaire, il est inutile d'afficher le seuil... Shipheart_formulaire_label { text: qsTr("Seuil") width: parent.width * pourcentage_largeur_labels_formulaire } Shipheart_formulaire_textfield { id: champ_formulaire_Seuil width: parent.width * (1 - pourcentage_largeur_labels_formulaire - pourcentage_largeur_unites_formulaire) x: parent.width * pourcentage_largeur_labels_formulaire flag_num_only: true } Shipheart_formulaire_unite { // Unités : text: seuil_unite width: parent.width * pourcentage_largeur_unites_formulaire } Shipheart_formulaire_ligne_separation { haut_bas_hautbas: shipheart_formulaire_ligne_separation_basse } } } // Fin de modele grille principale (ObjectModel ) } } //------------------------------------------------------- // 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 * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2); color: "transparent" Column { anchors.fill: parent spacing: 10 //....................................................... // Bouton Enregistrer/créer : //....................................................... Rectangle { width: parent.width height: hauteur_bouton_droit color: shipheart_couleur_fond_bouton radius: shipheart_rayon_bouton visible: // (!clavier.active) && // SDIR #255 (type_source > 0) && (id_source > 0) && (id_variable > 0) && (test > 0) Text { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } font.pixelSize: 20 text: flag_new ? qsTr("Créer la condition") : qsTr("Enregistrer") color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); seuil = champ_formulaire_Seuil.text; // Renvoi des nouvelles valeurs vers la page d'appel (qu'on soit en Création ou Modification) : page_config_capteur_calcule_booleen_condition.enregistrer_config_capteur_calcule_booleen_condition(flag_new, type_source, id_source, id_variable, test, seuil); // Fermeture de la page dès que les données ont été remontées : stackView.pop(); } } } //------------------------------------------------------- // Timer de reconfiguration : //------------------------------------------------------- Timer { id: timer_tempo_reconfiguration interval: 250 // Cette tempo n'est utilisée que pour le premier cycle triggeredOnStart: false running: false repeat: true onTriggered: { if (bdd.check_fin_configuration()) { timer_tempo_reconfiguration.stop(); stackView.pop(); } else timer_tempo_reconfiguration.interval = 100 // Tempo plus courte pour les lectures suivantes") } } } } //------------------------------------------------------- // 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 //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: (parent.width * pourcentage_bandeau_bas_largeur_zone_retour) - (2 * parent.padding) 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() } } } } //=========================================================== // Busy Indicator : //=========================================================== Shipheart_busy_indicator { id: busy_indicator running: timer_tempo_reconfiguration.running } // 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() { var i; // Détection d'une création vs une modification : if ((type_source > 0) && (id_source> 0) && (id_variable> 0)) flag_new = false; else flag_new = true; // Mise à jour des champs texte : champ_formulaire_Seuil.text = seuil; // Mise à jour du modèle de Type de source : champ_formulaire_Type_source.model.clear(); champ_formulaire_Type_source.model.append( { "valeur": 0, "texte": qsTr("Non défini") }); champ_formulaire_Type_source.model.append( { "valeur": shipheart_source_mesure_circuit, "texte": qsTr("Circuit") }); champ_formulaire_Type_source.model.append( { "valeur": shipheart_source_mesure_capteur, "texte": qsTr("Capteur") }); champ_formulaire_Type_source.model.append( { "valeur": shipheart_source_mesure_reservoir, "texte": qsTr("Réservoir") }); champ_formulaire_Type_source.model.append( { "valeur": shipheart_source_mesure_batterie, "texte": qsTr("Batterie") }); // Type source : positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(type_source, champ_formulaire_Type_source.model, "Type_source"); if (i === -1) champ_formulaire_Type_source.currentIndex = recherche_index_valeur_modele(-1, champ_formulaire_Type_source.model, "Type_source"); else champ_formulaire_Type_source.currentIndex = i; // Mise à jour en cascade : if (type_source > 0) mise_a_jour_source(); flag_init = false; // Indique que l'init est terminée } //============================================================================================================= // Mise à jour du modèle de source //============================================================================================================= function mise_a_jour_source() { var req, res; var nb; var i; var flag_familles; champ_formulaire_Source.model.clear(); champ_formulaire_Source.model.append({"valeur": 0, "texte": qsTr("Non défini") , "groupe": false }); // Choix de le requete en fonction du type : switch(type_source) { case shipheart_source_mesure_circuit: req = 'SELECT Cle_primaire, Nom, Nom_famille, Priorite_affichage_accueil FROM TB_Circuits, ' req += ' (SELECT Cle_primaire AS Cle_famille, Nom AS Nom_famille, Priorite_affichage AS Priorite_famille FROM TB_Familles WHERE Type_source=' + shipheart_type_source_circuits + ') AS TB_Familles ' req += ' WHERE ID_Famille=Cle_famille ' req += ' ORDER BY Priorite_famille, ABS(Priorite_affichage_accueil) '; flag_familles = true; break; case shipheart_source_mesure_capteur: req = 'SELECT Cle_primaire, Nom, Nom_famille, Priorite_affichage_accueil, Type_entrees FROM TB_Capteurs, ' req += ' (SELECT Cle_primaire AS Cle_famille, Nom AS Nom_famille, Priorite_affichage AS Priorite_famille FROM TB_Familles WHERE Type_source=' + shipheart_type_source_capteurs + ') AS TB_Familles '; req += ' WHERE ID_Famille=Cle_famille '; req += ' ORDER BY Priorite_famille, ABS(Priorite_affichage_accueil) '; flag_familles = true; break; case shipheart_source_mesure_reservoir: req = 'SELECT Cle_primaire, Nom, Nom_famille, Priorite_affichage_accueil FROM TB_Reservoirs, ' req += ' (SELECT Cle_primaire AS Cle_famille, Nom AS Nom_famille, Priorite_affichage AS Priorite_famille FROM TB_Familles WHERE Type_source=' + shipheart_type_source_reservoirs + ') AS TB_Familles ' req += ' WHERE ID_Famille=Cle_famille ' req += ' ORDER BY Priorite_famille, ABS(Priorite_affichage_accueil) '; flag_familles = true; break; case shipheart_source_mesure_batterie: req = 'SELECT Cle_primaire, Nom FROM TB_Batteries ' req += 'WHERE 1 ' req += 'ORDER BY Priorite_affichage_accueil, Nom'; flag_familles = false; break; } //console.log("req = [ " + req + "; ]"); nb = bdd.requete(req); var prec_famille = ""; var flag_aine_famille; var flag_capteur_calcule; for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { // Ajout d'une ligne par famille (si le type l'autorise) : if (flag_familles) { if (prec_famille !== res[2]) { champ_formulaire_Source.model.append({"valeur": Number(res[0]), "texte": res[2], "groupe": true, "actif": true, "capteur_calcule": false }); prec_famille = res[2]; } } // Détection d'un capteur calculé : flag_capteur_calcule = false; if (type_source === shipheart_source_mesure_capteur) { if (Number(res[4]) >= shipheart_capteur_type_entrees_calculee_booleen) flag_capteur_calcule = true; } // Ajout de la ligne "normale" dans le modèle : champ_formulaire_Source.model.append({"valeur": Number(res[0]), "texte": res[1], "groupe": false, "actif": true, "capteur_calcule": flag_capteur_calcule }); } else break; // Ne devrait pas arriver.... } //------------------------------------------------------------------------------- // Dévalidation des entrées du modèle qui créeraient des références circulaires : if (type_source === shipheart_source_mesure_capteur) // Cas d'une condition sur capteur uniquement { // Parcours de tout le modèle : for (i = 0; i < champ_formulaire_Source.model.count; i ++) { if (champ_formulaire_Source.model.get(i).capteur_calcule) // On ne traite que les capteurs calculés (les autres ne présentent pas de risque de réf circulaires) { var cle_capteur = champ_formulaire_Source.model.get(i).valeur; // Dévalidation de tous les capteurs calculés dans le doute : champ_formulaire_Source.model.set(i, {"actif": false }); /* // Dévalidation du capteur auquel appartient la condition : if (cle_capteur === id_capteur) champ_formulaire_Source.model.set(i, {"actif": false }); else { // A TRAITER !!!!! } */ } } } //------------------------------------------------------------------------------------------------------------------------ // Source : positionnement de l'index sur la valeur en cours : i = recherche_index_valeur_modele(id_source, champ_formulaire_Source.model, "Source"); if (i === -1) champ_formulaire_Source.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Source.model, "Source"); else champ_formulaire_Source.currentIndex = i; //------------------------------------------------------------------------------------------------------------------------ // Mise à jour en cascade : if (id_source > 0) mise_a_jour_variable(); } //============================================================================================================= // Mise à jour du modèle de variable //============================================================================================================= function mise_a_jour_variable() { var req, res; var nb; var i; var libelle; // Effacement du modèle et premier enregistrement avec 'Non défini' :: champ_formulaire_Variable.model.clear(); champ_formulaire_Variable.model.append( { "valeur": 0, "texte": qsTr("Non défini"), "unite": "", "actif": true }); switch(type_source) { //---------------------------------------- case shipheart_source_mesure_circuit: // Recherche du type de circuit : req = 'SELECT Type FROM TB_Modules_config WHERE Adresse_k_bus IN (SELECT Adresse_module FROM TB_Circuits WHERE Cle_primaire=' + id_source + ')'; //console.log("Requête = [ " + req + "; ]"); res = bdd.requete_unique(req); var type_circuit = Number(res[0]); // Recherche des entrées de TB_Variables applicables à la source sélectionnée : req = "SELECT Cle_primaire, Unite, Code FROM TB_Variables WHERE Type=" + type_source + "; "; //console.log("Requête = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { switch(res[2]) { //--------------------- case "Circ_tension": if (type_circuit === shipheart_type_module_shippower4AC) continue; break; //--------------------- case "Circ_frequence": if (type_circuit !== shipheart_type_module_shippower4AC) continue; break; //--------------------- case "Circ_tension_secteur": if (type_circuit !== shipheart_type_module_shippower4AC) continue; break; } libelle = Fonctions.nom_variable(res[2]); champ_formulaire_Variable.model.append( { "valeur": Number(res[0]), "texte": libelle, "unite": res[1], "actif": true }); } } // Mise à jour du flag de test binaire : flag_test_binaire = false; break; //---------------------------------------- case shipheart_source_mesure_capteur: // Recherche de la variable du capteur : req = "SELECT ID_Variable, Type_entrees FROM TB_Capteurs WHERE Cle_primaire=" + id_source + "; "; //console.log("Requête = [ " + req + "; ]"); res = bdd.requete_unique(req); var type = Number(res[1]); if (type < shipheart_capteur_type_entrees_calculee_booleen) // Si le capteur est calculé, on ne peut pas chercher (et trouver d'ID_Variable) { // Recherche des informations de la variable du capteur dans TB_Variables : req = "SELECT Cle_primaire, Nom, Unite FROM TB_Variables WHERE Cle_primaire=" + Number(res[0]) + "; "; //console.log("Requête = [ " + req + "; ]"); res = bdd.requete_unique(req); champ_formulaire_Variable.model.append( { "valeur": Number(res[0]), "texte": res[1], "unite": res[2], "actif": true }); // Mise à jour de la variable car on n'a pas le choix : id_variable = Number(res[0]); } // Mise à jour du flag de test binaire : if ((type == shipheart_capteur_type_entrees_aux) || (type == shipheart_capteur_type_entrees_calculee_booleen) ) flag_test_binaire = true; else flag_test_binaire = false; break; //---------------------------------------- case shipheart_source_mesure_reservoir: // Recherche des entrées de TB_Variables applicables à la source sélectionnée : req = "SELECT Cle_primaire, Nom, Unite FROM TB_Variables WHERE Code='Res_niveau'; "; //console.log("Requête = [ " + req + "; ]"); res = bdd.requete_unique(req); champ_formulaire_Variable.model.append( { "valeur": Number(res[0]), "texte": res[1], "unite": res[2], "actif": true }); // Mise à jour de la variable car on n'a pas le choix : id_variable = Number(res[0]); // Mise à jour du flag de test binaire : flag_test_binaire = false; break; //---------------------------------------- case shipheart_source_mesure_batterie: // Recherche du type de capteur de batterie : req = "SELECT Type_entrees FROM TB_Batteries WHERE Cle_primaire=" + id_source + "; "; //console.log("Requête = [ " + req + "; ]"); res = bdd.requete_unique(req); var type_entrees = Number(res[0]); // Recherche des entrées de TB_Variables applicables à la source sélectionnée : req = "SELECT Cle_primaire, Unite, Code FROM TB_Variables WHERE Type=" + type_source + "; "; //console.log("Requête = [ " + req + "; ]"); nb = bdd.requete(req); for (i = 0; i < nb; i ++) { res = bdd.lecture_ligne(); if (!res.isEmpty) { switch(res[2]) { //--------------------- case "Batt_temperature": if (type_entrees !== shipheart_capteur_type_entrees_ibs) continue; break; //--------------------- case "Batt_courant_differentiel": if (type_entrees !== shipheart_capteur_type_entrees_ibs) continue; break; //--------------------- case "Batt_courant_charge": if (type_entrees !== shipheart_capteur_type_entrees_ibs) continue; break; //--------------------- case "Batt_soh": if (type_entrees !== shipheart_capteur_type_entrees_ibs) continue; break; //--------------------- /* case "Batt_autonomie": if (type_entrees !== shipheart_capteur_type_entrees_ibs) continue; break; */ } libelle = Fonctions.nom_variable(res[2]); champ_formulaire_Variable.model.append( { "valeur": Number(res[0]), "texte": libelle, "unite": res[1], "actif": true }); } } // Mise à jour du flag de test binaire : flag_test_binaire = false; break; //---------------------------------------- default: break; } // Mise à jour de l'index courant du modèle : i = recherche_index_valeur_modele(id_variable, champ_formulaire_Variable.model, "id_variable"); if (i === -1) champ_formulaire_Variable.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Variable.model, "id_variable"); else champ_formulaire_Variable.currentIndex = i; // Mise à jour de l'unité correspondant à la variable en cours : seuil_unite = champ_formulaire_Variable.model.get(champ_formulaire_Variable.currentIndex).unite; // Mise à jour en cascade : if (id_variable > 0) mise_a_jour_test(); } //============================================================================================================= // Mise à jour du modèle //============================================================================================================= function mise_a_jour_test() { var i; champ_formulaire_Test.model.clear(); champ_formulaire_Test.model.append( { "valeur": shipheart_test_non_defini, "texte": qsTr("Non défini"), "actif": true }); if (flag_test_binaire) { champ_formulaire_Test.model.append( { "valeur": shipheart_test_strictement_superieur, "texte": qsTr("Actif"), "actif": true }); champ_formulaire_Test.model.append( { "valeur": shipheart_test_strictement_inferieur, "texte": qsTr("Inactif"), "actif": true }); } else { champ_formulaire_Test.model.append( { "valeur": shipheart_test_strictement_inferieur, "texte": qsTr("< au seuil"), "actif": true }); champ_formulaire_Test.model.append( { "valeur": shipheart_test_inferieur_ou_egal, "texte": qsTr("≤ au seuil"), "actif": true }); champ_formulaire_Test.model.append( { "valeur": shipheart_test_egal, "texte": qsTr("= au seuil"), "actif": true }); champ_formulaire_Test.model.append( { "valeur": shipheart_test_superieur_ou_egal, "texte": qsTr("≥ au seuil"), "actif": true }); champ_formulaire_Test.model.append( { "valeur": shipheart_test_strictement_superieur, "texte": qsTr("> au seuil"), "actif": true }); } // Mise à jour de l'index courant du modèle : i = recherche_index_valeur_modele(test, champ_formulaire_Test.model, "Test"); if (i === -1) champ_formulaire_Test.currentIndex = recherche_index_valeur_modele(0, champ_formulaire_Test.model, "Test"); else champ_formulaire_Test.currentIndex = i; } //============================================================================================================= // Recherche de l'index d'une certaine valeur dans un modele //============================================================================================================= function recherche_index_valeur_modele(cible, modele, nom_modele) { var i; for (i=0; i