import QtQuick 2.12 import QtQuick.Controls 2.12 import qt.koriolan.shipheart 1.0 import"fonctions_localisation.js" as Fonctions_localisation Shipheart_page { id: page_parametres // Mis en forme : readonly property double pourcentage_largeur_colonne_1: 0.25 readonly property double pourcentage_largeur_colonne_2: 0.25 readonly property double pourcentage_largeur_colonne_3: 0.25 readonly property double pourcentage_largeur_colonne_4: (1 - pourcentage_largeur_colonne_1 - pourcentage_largeur_colonne_2 - pourcentage_largeur_colonne_3) readonly property int espace_colonnes_principales: 10 readonly property double pourcentage_hauteur_ligne_haut: 0.4 readonly property double pourcentage_hauteur_ligne_milieu: 0.4 readonly property int espace_lignes_principales: 10 readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas - (3 * espace_lignes_principales) readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 0.93 readonly property double pourcentage_bandeau_bas_largeur_zone_parametres_avances: (1 - pourcentage_bandeau_bas_largeur_zone_retour) readonly property int langues_nombre_colonnes_affichage: 1 readonly property int langues_nombre_lignes_affichage: 7 readonly property int temperatures_nombre_colonnes_affichage: 1 readonly property int temperatures_nombre_lignes_affichage: 3 readonly property int volumes_nombre_colonnes_affichage: 1 readonly property int volumes_nombre_lignes_affichage: 3 readonly property int affichage_nombre_colonnes_affichage: 1 readonly property int affichage_nombre_lignes_affichage: 3 readonly property int date_heure_nombre_colonnes_affichage: 1 readonly property int date_heure_nombre_lignes_affichage: 3 readonly property int periode_init_raffraichissement_parametres: 1 // En ms readonly property int periode_raffraichissement_parametres: 1000 // En ms // Affichage : property int niveau_page: 0 property bool bouton_bandeau_bas_zone_retour_actif: false property bool bouton_bandeau_bas_zone_parametres_actif: false // Données : property var table_backlight: [0, 13.75, 26.30, 37.85, 48.54, 58.50, 67.81, 76.55, 84.80, 92.60, 100.00] // Les valeurs correspondent à 0, 10%, 20%,... 90%, 100% property var table_volume: [0, 30, 48, 60, 70, 79, 86, 91, 95, 98, 100] // Les valeurs correspondent à 0, 10%, 20%,... 90%, 100% // 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 { mise_a_jour_periodique(); } } } // Titre de la page : Shipheart_titre_1 {titre:qsTr("Paramètres"); hauteur: shipheart_hauteur_bandeau_haut} //------------------------------------------------------- // Ecran Colonne 1 : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_1 x: 0 y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_1) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * (pourcentage_hauteur_ligne_haut + pourcentage_hauteur_ligne_milieu) + espace_lignes_principales; color: "transparent" // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Langue"); hauteur: shipheart_hauteur_titre_2} GridView { id: grid_langues x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / langues_nombre_colonnes_affichage; cellHeight: height / langues_nombre_lignes_affichage; 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_langues delegate: Item { Rectangle { x: 5 width:grid_langues.cellWidth - 10 height:grid_langues.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: nom anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); mise_a_jour_langue(index); } } } } ListModel { id: modele_langues } } } //------------------------------------------------------- // Ecran Colonne 2 - Haut : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_2_haut x: (shipheart_largeur_page * pourcentage_largeur_colonne_1) + (espace_colonnes_principales / 2); y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_2) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * pourcentage_hauteur_ligne_haut; color: "transparent" // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Températures")} GridView { id: grid_temperatures x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / temperatures_nombre_colonnes_affichage; cellHeight: height / temperatures_nombre_lignes_affichage; 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_temperatures delegate: Item { Rectangle { x: 5 width:grid_temperatures.cellWidth - 10 height:grid_temperatures.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: nom anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); mise_a_jour_temperatures(index); } } } } ListModel { id: modele_temperatures } } } //------------------------------------------------------- // Ecran Colonne 2 - Bas : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_2_bas x: (shipheart_largeur_page * pourcentage_largeur_colonne_1) + (espace_colonnes_principales / 2); y: shipheart_hauteur_bandeau_haut + zone_affichage_colonne_2_haut.height + espace_lignes_principales; width: (shipheart_largeur_page * pourcentage_largeur_colonne_2) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * pourcentage_hauteur_ligne_milieu; color: "transparent" // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Volumes")} GridView { id: grid_volumes x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / volumes_nombre_colonnes_affichage; cellHeight: height / volumes_nombre_lignes_affichage; 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_volumes delegate: Item { Rectangle { x: 5 width:grid_volumes.cellWidth - 10 height:grid_volumes.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: nom anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); mise_a_jour_volumes(index); } } } } ListModel { id: modele_volumes } } } //------------------------------------------------------- // Ecran Colonne 3 - Haut : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_3_haut x: (shipheart_largeur_page * (pourcentage_largeur_colonne_1 + pourcentage_largeur_colonne_2)) + (espace_colonnes_principales / 2); y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_3) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * pourcentage_hauteur_ligne_haut; color: "transparent" visible: (shipheart_type_installation === shipheart_type_installation_shipbase) // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Affichage"); hauteur: shipheart_hauteur_titre_2} GridView { id: grid_affichage x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / affichage_nombre_colonnes_affichage; cellHeight: height / affichage_nombre_lignes_affichage; 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_affichage delegate: Item { Rectangle { x: 5 width:grid_affichage.cellWidth - 10 height:grid_affichage.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: actif ? texte_actif : texte_inactif anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); mise_a_jour_affichage(model.index); } } } } ListModel { id: modele_affichage } } } //------------------------------------------------------- // Ecran Colonne 3 - Bas : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_3_bas x: (shipheart_largeur_page * (pourcentage_largeur_colonne_1 + pourcentage_largeur_colonne_2)) + (espace_colonnes_principales / 2); y: shipheart_hauteur_bandeau_haut + zone_affichage_colonne_3_haut.height + espace_lignes_principales; width: (shipheart_largeur_page * pourcentage_largeur_colonne_3) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * pourcentage_hauteur_ligne_milieu; color: "transparent" // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Date et heure")} GridView { id: grid_date_heure x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / date_heure_nombre_colonnes_affichage; cellHeight: height / date_heure_nombre_lignes_affichage; 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_date_heure delegate: Item { Rectangle { x: 5 width:grid_date_heure.cellWidth - 10 height:grid_date_heure.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: actif ? texte_actif : texte_inactif anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); mise_a_jour_date_heure(model.index); } } } } ListModel { id: modele_date_heure } } } //------------------------------------------------------- // Ecran Colonne 4 : //------------------------------------------------------- Rectangle { id: zone_affichage_colonne_4 x: (shipheart_largeur_page * (pourcentage_largeur_colonne_1 + pourcentage_largeur_colonne_2 + pourcentage_largeur_colonne_3)) + (espace_colonnes_principales / 2); y: shipheart_hauteur_bandeau_haut; width: (shipheart_largeur_page * pourcentage_largeur_colonne_4) - (espace_colonnes_principales / 2); height: affichage_hauteur_utile * (pourcentage_hauteur_ligne_haut + pourcentage_hauteur_ligne_milieu) + espace_lignes_principales; color: "transparent" // Titre du paragrapahe : Shipheart_titre_2 {titre:qsTr("Protection"); hauteur: shipheart_hauteur_titre_2; visible: (modele_parametres_4.count > 0) ? true : false} GridView { id: grid_parametres_4 x: 0 y: shipheart_hauteur_titre_2 width: parent.width height: parent.height - shipheart_hauteur_titre_2; cellWidth: parent.width / langues_nombre_colonnes_affichage; cellHeight: height / langues_nombre_lignes_affichage; 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_parametres_4 delegate: Item { Rectangle { x: 5 width:grid_affichage.cellWidth - 10 height:grid_affichage.cellHeight - 10 color: actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton opacity: 0.5 radius: shipheart_rayon_bouton Text { text: actif ? texte_actif : texte_inactif anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft leftPadding: 10 font.pixelSize: 15 font.weight: actif ? Font.Bold : Font.Normal color: couleur_blanc_casse } MouseArea { anchors.fill: parent onClicked: { shipheart_clic(); //A supprimer probablement changer_validation_economiseur(); mise_a_jour_parametre_4(nom); } } } } ListModel { id: modele_parametres_4 } } } //------------------------------------------------------- // Ecran bas - Gauche : //------------------------------------------------------- Rectangle { id: zone_affichage_bas_gauche x: 0; y: shipheart_hauteur_bandeau_haut + zone_affichage_colonne_1.height + espace_lignes_principales; width: (shipheart_largeur_page * (pourcentage_largeur_colonne_1 + pourcentage_largeur_colonne_2)) - (espace_colonnes_principales / 2) height: affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut - pourcentage_hauteur_ligne_milieu) + 5; // +5 pour compenser margin-top du bandeau bas color: "transparent" visible: (shipheart_type_installation === shipheart_type_installation_shipbase) // Titre du paragraphe : Shipheart_titre_2 {titre:qsTr("Son")} Slider { id: slider_volume y: shipheart_hauteur_titre_2 width: parent.width * 0.9 height: (parent.height - shipheart_hauteur_titre_2) * 0.8 padding: 0 anchors { horizontalCenter: parent.horizontalCenter } from: 0 value: 25 to: 100 stepSize:1 // Permet de n'avoir que des valeurs en %, sans décimales (il est probable que cela accélère le traitement mais pas vérifié...) background: Rectangle { x: parent.leftPadding y: 0 width: parent.width height: parent.height radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Rectangle { width: slider_volume.visualPosition * parent.width height: parent.height color: shipheart_couleur_fond_bouton_actif radius: shipheart_rayon_bouton Behavior on width { NumberAnimation { properties:"width" duration: 350 easing.type: Easing.OutQuad } } Text { // Affichage de la valeur dans la barre lorsque le circuit est ON : text: slider_volume.value.toFixed(0) + "%" anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 18 font.weight: Font.Bold color: shipheart_couleur_texte_slider visible: (slider_volume.value === 0) ? false : true } } } handle: Rectangle { x: parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width)) y: (parent.availableHeight / 2) - (height / 2) implicitWidth: 80 // Le bouton n'étant pas visible implicitHeight: parent.height color: couleur_rouge_transparent visible: (slider_volume.value === 0) ? true : false Text { // Affichage de la valeur dans le bouton lorsque le circuit est OFF : text: "Off" anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 18 font.weight: Font.Bold color: couleur_rouge visible: (slider_volume.value === 0) ? true : false } } onMoved: { // shipheart_clic(); // SDIR #145 reload_economiseur(); // SDIR #145 Permet de réarmer l'économiseur mais par démettre de bip qui viendrait perturber les bips de réglage de niveau sonore. if (!timer_time_out_volume.running) { timer_time_out_volume.running = true var req req = 'UPDATE TB_Configuration SET Valeur="' + consigne_volume(slider_volume.value) + '" WHERE Nom="Consigne_volume" ' bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_data); //console.log("ON MOVED : Nouvelle valeur de Volume = " + slider_volume.value + "% et la requête est : " + req) } } Timer { // Timer qui permet de brider les envoi de mise à jour dans la BDD id: timer_time_out_volume interval: 400 triggeredOnStart: false running: false repeat: false onTriggered: { // Permet d'être sûr que la dernière position est bien enregistrée dans la BDD, même si l'arrêt s'est produit pendant que le timer tournait var req req = 'UPDATE TB_Configuration SET Valeur="' + consigne_volume(slider_volume.value) + '" WHERE Nom="Consigne_volume" ' bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_data); //console.log("TIMER : Nouvelle valeur de Volume = " + slider_volume.value + "% et la requête est : " + req) } } } } //------------------------------------------------------- // Ecran bas - Droite : //------------------------------------------------------- Rectangle { id: zone_affichage_bas_droite x: zone_affichage_bas_gauche.width + (espace_colonnes_principales / 2) y: shipheart_hauteur_bandeau_haut + zone_affichage_colonne_1.height + espace_lignes_principales; width: (shipheart_largeur_page * (pourcentage_largeur_colonne_3 + pourcentage_largeur_colonne_4)) - (espace_colonnes_principales / 2) height: affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut - pourcentage_hauteur_ligne_milieu) + 5; // +5 pour compenser margin-top du bandeau bas color: "transparent" visible: (shipheart_type_installation === shipheart_type_installation_shipbase) // Titre du paragraphe : Shipheart_titre_2 {titre:qsTr("Luminosité")} Slider { id: slider_backlight y: shipheart_hauteur_titre_2 width: parent.width * 0.9 height: (parent.height - shipheart_hauteur_titre_2) * 0.8 padding: 0 anchors { horizontalCenter: parent.horizontalCenter } from: 20 value: 25 to: 100 stepSize:1 // Permet de n'avoir que des valeurs en %, sans décimales (il est probable que cela accélère le traitement mais pas vérifié...) background: Rectangle { x: parent.leftPadding y: 0 width: parent.width height: parent.height radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Rectangle { width: slider_backlight.visualPosition * parent.width height: parent.height color: shipheart_couleur_fond_bouton_actif radius: shipheart_rayon_bouton Behavior on width { NumberAnimation { properties:"width" duration: 350 easing.type: Easing.OutQuad } } Text { // Affichage de la valeur dans la barre text: slider_backlight.value.toFixed(0) + "%" anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 18 font.weight: Font.Bold color: shipheart_couleur_texte_slider } } } handle: Rectangle { x: parent.leftPadding + (parent.visualPosition * (parent.availableWidth - width)) y: (parent.availableHeight / 2) - (height / 2) implicitWidth: 80 // Le bouton n'étant pas visible implicitHeight: parent.height color: "transparent" visible: false } onMoved: { shipheart_clic(); if (!timer_time_out_backlight.running) { timer_time_out_backlight.running = true var req req = 'UPDATE TB_Configuration SET Valeur="' + consigne_backlight(slider_backlight.value) + '" WHERE Nom="Consigne_backlight" ' bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_data); console.log("ON MOVED : Nouvelle valeur de backlight = " + value + " et la requête est : " + req) } } Timer { // Timer qui permet de brider les envoi de mise à jour dans la BDD id: timer_time_out_backlight interval: 400 triggeredOnStart: false running: false repeat: false onTriggered: { // Permet d'être sûr que la dernière position est bien enregistrée dans la BDD, même si l'arrêt s'est produit pendant que le timer tournait var req req = 'UPDATE TB_Configuration SET Valeur="' + consigne_backlight(slider_backlight.value) + '" WHERE Nom="Consigne_backlight" ' bdd.requete_unique(req); req = 'UPDATE TB_Configuration SET Valeur="' + consigne_backlight(slider_backlight.value) + '" WHERE Nom="Consigne_leds" ' bdd.requete_unique(req); synchro_bdd(shipheart_type_synchro_data); //console.log("TIMER : Nouvelle valeur de backlight = " + slider_backlight.value + " et la requête est : " + req) } } } } //------------------------------------------------------- // Bandeau bas : //------------------------------------------------------- Row { x: 0 y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas; width: shipheart_largeur_page; height: shipheart_hauteur_bandeau_bas; spacing: bandeau_bas_spacing * shipheart_largeur_page; topPadding: 5 bottomPadding:5 //................................................. // Bouton retour //................................................. Rectangle { id: bandeau_bas_zone_retour width: parent.width * pourcentage_bandeau_bas_largeur_zone_retour - (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() } } } //................................................. // Paramètres avancés //................................................. Rectangle { id: bandeau_bas_zone_parametres_avances width: parent.width * pourcentage_bandeau_bas_largeur_zone_parametres_avances - (parent.spacing / 2) height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding; //- (bandeau_bas_marge_verticale * 2); radius: shipheart_rayon_bouton color: shipheart_couleur_fond_bouton Rectangle { // Barre diminuant selon l'évolution du compteur de time-out d'accès width: (shipheart_compteur_time_out_niveau_acces / shipheart_time_out_niveau_acces) * parent.width height: parent.height color: couleur_green_yellow_transparent opacity: 0.5 radius: shipheart_rayon_bouton visible: (shipheart_time_out_niveau_acces > 0) && (shipheart_compteur_time_out_niveau_acces > 0) } /* ChartView { anchors { horizontalCenter: parent.horizontalCenter verticalCenter: parent.verticalCenter } width: parent.width * 1.1 height: parent.height * 1.1 legend.visible: false antialiasing: true backgroundColor: "transparent" margins.bottom: 0 margins.top: 0 margins.left: 0 margins.right: 0 visible: (shipheart_time_out_niveau_acces > 0) && (shipheart_compteur_time_out_niveau_acces > 0) PieSeries { size: 1.0 holeSize: 0.9 startAngle: 0 endAngle: visible ? (shipheart_compteur_time_out_niveau_acces * 360) / shipheart_time_out_niveau_acces : 0 PieSlice { value: 2 color: couleur_green_yellow } } } */ Image { id: image_parametres source: (shipheart_compteur_time_out_niveau_acces === 0) && (shipheart_time_out_niveau_acces !== -1) ? "/images/icone_parametres.png" : "/images/icone_parametres_acces_autorise.png" sourceSize.height: 25 anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } } Image { id: image_alarme_paramètres // Affichage du coin inférieur-droit en rouge si une erreur de paramètres est détectée source: "/images/coin_bas_droite_rouge.png" sourceSize.height: 20 anchors { bottom: parent.bottom right: parent.right } visible: shipheart_defaut_config_k_bus } Image { id: image_info_paramètres // Affichage du coin inférieur-droit en bleu si une nouvelle version est dispo source: "/images/coin_bas_droite_bleu_koriolan.png" sourceSize.height: 20 anchors { bottom: parent.bottom right: parent.right } visible: !image_alarme_paramètres.visible && ((shipheart_fichier_a_charger !== "") || (shipheart_fichier_a_valider !== "")) } /* Text { // Affichage de la valeur dans la barre text: (shipheart_compteur_time_out_niveau_acces > 59) ? (Math.trunc(shipheart_compteur_time_out_niveau_acces / 60) + " min " + (shipheart_compteur_time_out_niveau_acces % 60) + " s") : (shipheart_compteur_time_out_niveau_acces + " s") anchors.fill: parent // Permet que le texte occupe tout l'espace du parent (et que le centrage vertical qui suit fonctionne...) // bottomPadding: 5 verticalAlignment: Text.AlignBottom horizontalAlignment: Text.AlignHCenter font.pixelSize: 10 color: couleur_gris_tres_pale visible: (shipheart_compteur_time_out_niveau_acces === 0) || (shipheart_time_out_niveau_acces === -1) ? false : true } */ 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_parametres anchors.fill: parent pressAndHoldInterval: shipheart_mouse_press_and_hold_interval_long onClicked: { shipheart_clic(); console.log("shipheart_compteur_time_out_niveau_acces = " + shipheart_compteur_time_out_niveau_acces + ", shipheart_time_out_niveau_acces = " + shipheart_time_out_niveau_acces + " et shipheart_niveau_acces_en_cours = " + shipheart_niveau_acces_en_cours) if (shipheart_time_out_niveau_acces === -1) // Cas où il n'y a aucune protection : { console.log("L'accès est validé sans entrer de code car 'time_out_access' = -1"); shipheart_compteur_time_out_niveau_acces = 0; // ... le compteur est laissé à 0 car inutile, shipheart_niveau_acces_en_cours = shipheart_niveau_acces_user; // ... et on donne un accès USER (si on veut accéder en Admin ou Koriolan, il faut d'abord revalider un contrôle d'accès) } if(shipheart_niveau_acces_en_cours > shipheart_niveau_acces_aucun) stackView.push("parametres_avances.qml") else stackView.push("protection.qml", {"protection_mode": protection_mode_access_parametres_avances}) } onPressAndHold: { shipheart_compteur_time_out_niveau_acces = 0; // Dans le cas d'un appui long, on dévalide l'autorisation d'accès en cours... shipheart_niveau_acces_en_cours = shipheart_niveau_acces_aucun; } } } } //------------------------------------------------------- // Nettoyage de l'écran : //------------------------------------------------------- Shipheart_boite_dialogue_nettoyage_ecran { id: boite_dialogue_nettoyage_ecran onOpened: { shipheart_flag_nettoyage_ecran_en_cours = true; } onClosed: { shipheart_flag_nettoyage_ecran_en_cours = false; } } //=========================================================== // 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; var i; mise_en_veille(0); niveau_page = stackView.depth - 1; // Permet de stocker le niveau de la page dans la Stackview //--------------------------------------------- // Init des différentes modèles : //--------------------------------------------- init_modeles(); //--------------------------------------------- // Init des paramètres d'accès : //--------------------------------------------- req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Time_out_acces" '; res = bdd.requete_unique(req); shipheart_time_out_niveau_acces = Number(res[0]); } //============================================================================================================= // Init des modèles //============================================================================================================= function init_modeles() { var req, res; var i; //--------------------------------------------- // Init des langues : // NB : la valeur de 'shipheart_langue' a été initialisée dans 'home.qml' avec la valeur actuelle de TB_Configuration.Langue //--------------------------------------------- modele_langues.clear(); // RAZ des valeurs existantes for (i = 0; i < Fonctions_localisation.nb_langues(); i ++) { modele_langues.append({"nom": Fonctions_localisation.nom_langue(i), "code_langue": Fonctions_localisation.code_langue(i), "actif": (shipheart_langue === i)}); } //--------------------------------------------- // Init des températures : // NB : la valeur de 'shipheart_unite_temperature' a été initialisée dans 'home.qml' avec la valeur actuelle de TB_Configuration.Unite_temperature //--------------------------------------------- modele_temperatures.clear(); // RAZ des valeurs existantes for (i = 0; i < Fonctions_localisation.nb_unites_temperature(); i ++) { modele_temperatures.append({"nom": Fonctions_localisation.nom_unite_temperature(i), "symbole": Fonctions_localisation.symbole_unite_temperature(i), "actif": (shipheart_unite_temperature === i)}); } //--------------------------------------------- // Init des volumes : // NB : la valeur de 'shipheart_unite_volume' a été initialisée dans 'home.qml' avec la valeur actuelle de TB_Configuration.Unite_volume //--------------------------------------------- modele_volumes.clear(); // RAZ des valeurs existantes for (i = 0; i < Fonctions_localisation.nb_unites_volume(); i ++) { modele_volumes.append({"nom": Fonctions_localisation.nom_unite_volume(i), "symbole": Fonctions_localisation.symbole_unite_volume(i), "actif": (shipheart_unite_volume === i)}); } //--------------------------------------------------- // Init des paramètres des la 3ième colonne - haut : //--------------------------------------------------- modele_affichage.clear(); modele_affichage.append({"nom": "Validation_economiseur", "texte_actif": qsTr("Economiseur d'écran : désactivé"), "texte_inactif": qsTr("Economiseur d'écran : normal"), "actif": !get_validation_economiseur()}); modele_affichage.append({"nom": "Validation_leds", "texte_actif": qsTr("Flash LEDs : désactivé"), "texte_inactif": qsTr("Flash LEDs : normal"), "actif": !get_validation_leds()}); modele_affichage.append({"nom": "Nettoyage_ecran", "texte_actif": qsTr("Nettoyage de l'écran"), "texte_inactif": qsTr("Nettoyage de l'écran"), "actif": false}); //------------------------------------------------- // Init des paramètres des la 3ième colonne - bas : //------------------------------------------------- modele_date_heure.clear(); modele_date_heure.append({"nom": "Heure_ete", "texte_actif": qsTr("Heure d'été"), "texte_inactif": qsTr("Heure d'hiver"), "actif": (shipheart_heure_ete === 0 ? false : true)}); //--------------------------------------------- // Init des paramètres des la 4ième colonne : //--------------------------------------------- modele_parametres_4.clear(); if (Number(shipheart_specifique_client[0]) === shipheart_specifique_client_suncy) modele_parametres_4.append({"nom": "retour_home_suncy", "texte_actif": qsTr("Verrouiller le bateau"), "texte_inactif": qsTr("Verrouiller le bateau"), "actif": false}); mise_a_jour_slider_backlight(); mise_a_jour_slider_volume(); } //============================================================================================================= // Mise à jour périodique //============================================================================================================= function mise_a_jour_periodique() { var req, res; //----------------------------------------- // Etat config K-bus : req = 'SELECT Valeur FROM TB_Systeme WHERE Nom="Defaut_config_k_bus" '; res = bdd.requete_unique(req); shipheart_defaut_config_k_bus = Number(res[0]); } //============================================================================================================= // Mise à jour de la langue //============================================================================================================= function mise_a_jour_langue(rang) { var i; var req; // Recherche dans le modèle de l'entrée correspondant à l'entrée sélectionnée : for (i = 0; i < modele_langues.count; i ++) { if (i === rang) modele_langues.setProperty(i, "actif", true); // Passage de l'entrée en actif (pour visu) else modele_langues.setProperty(i, "actif", false); // Passage de toutes les autres entrées à inactif (pour visu) } // Mise à jour de la langue en cours dans TB_Configuration : req = 'UPDATE TB_Configuration SET Valeur="' + rang + '" WHERE Nom="Langue" ' bdd.requete_unique(req); shipheart_langue = rang; shipheart_code_pays = Fonctions_localisation.code_pays(shipheart_langue); shipheart_code_langue = Fonctions_localisation.code_langue(shipheart_langue); console.log("==================> AVANT") backend.change_langue(shipheart_code_langue); console.log("==================> APRES") init_modeles(); // Permet que les modèles d'affichage de la page soient mis à jour avec la nouvelle langue... } //============================================================================================================= // Mise à jour de l'unité de température //============================================================================================================= function mise_a_jour_temperatures(rang) { var i; var req; // Recherche dans le modèle de l'entrée correspondant à l'entrée sélectionnée : for (i = 0; i < modele_temperatures.count; i ++) { if (i === rang) modele_temperatures.setProperty(i, "actif", true); // Passage de l'entrée en actif (pour visu) else modele_temperatures.setProperty(i, "actif", false); // Passage de toutes les autres entrées à inactif (pour visu) } shipheart_unite_temperature = rang; shipheart_unite_temperature_symbole = modele_temperatures.get(rang).symbole; // Mise à jour de l'unité de température en cours dans TB_Configuration : req = 'UPDATE TB_Configuration SET Valeur="' + rang + '" WHERE Nom="Unite_temperature" ' //console.log("Requête = [" + req + "]"); bdd.requete_unique(req); } //============================================================================================================= // Mise à jour de l'unité de volumes //============================================================================================================= function mise_a_jour_volumes(rang) { var i; var req; // Recherche dans le modèle de l'entrée correspondant à l'entrée sélectionnée : for (i = 0; i < modele_volumes.count; i ++) { if (i === rang) modele_volumes.setProperty(i, "actif", true); // Passage de l'entrée en actif (pour visu) else modele_volumes.setProperty(i, "actif", false); // Passage de toutes les autres entrées à inactif (pour visu) } shipheart_unite_volume = rang; shipheart_unite_volume_symbole = modele_volumes.get(rang).symbole; // Mise à jour de l'unité de volumes en cours dans TB_Configuration : req = 'UPDATE TB_Configuration SET Valeur="' + rang + '" WHERE Nom="Unite_volume" ' bdd.requete_unique(req); } //============================================================================================================= // Mise à jour des paramètrs de la 3ième colonne - haut //============================================================================================================= function mise_a_jour_affichage(index) { var i; var nb; // Mise à jour du paramètre ayant été touché dans la BDD : if (modele_affichage.get(index).nom === "Validation_economiseur") changer_validation_economiseur(); else if (modele_affichage.get(index).nom === "Validation_leds") changer_validation_leds(); else if (modele_affichage.get(index).nom === "Nettoyage_ecran") boite_dialogue_nettoyage_ecran.open(); // Mise à jour de l'état de chaque paramètres : nb = modele_affichage.count; for (i = 0; i < nb; i ++) { if (modele_affichage.get(i).nom === "Validation_economiseur") modele_affichage.setProperty(i, "actif", !get_validation_economiseur()); else if (modele_affichage.get(i).nom === "Validation_leds") modele_affichage.setProperty(i, "actif", !get_validation_leds()); } } //============================================================================================================= // Mise à jour des paramètrs de la 3ième colonne - bas //============================================================================================================= function mise_a_jour_date_heure(index) { var i; var nb; // Mise à jour du paramètre ayant été touché dans la BDD : if (modele_date_heure.get(index).nom === "Heure_ete") { if (shipheart_heure_ete === 0) mise_a_jour_heure_ete(1); else mise_a_jour_heure_ete(0); } // Mise à jour de l'état de chaque paramètres : nb = modele_date_heure.count; for (i = 0; i < nb; i ++) { if (modele_date_heure.get(i).nom === "Heure_ete") modele_date_heure.setProperty(i, "actif", (shipheart_heure_ete === 0 ? false : true)); } } //============================================================================================================= // Mise à jour des paramètres de la 4ième colonne //============================================================================================================= function mise_a_jour_parametre_4(nom) { var res; var nb; var i; nb = modele_parametres_4.count; for (i = 0; i < nb; i ++) { switch (modele_parametres_4.get(i).nom) { //-------------------------------------- case "retour_home_suncy": // Désactivation 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=0 WHERE Cle_primaire='" + Number(parametre[1]) + "' ") break; // Inutile d'aller plus loin... } } // Coupure de tous les circuits par défaut : // bdd.requete_unique('UPDATE TB_Circuits SET New_consigne=0 '); stackView.pop(null); // retour directement à la page "home_attente.qml" qui va se charger de trouver la Home Page à utiliser et va la charger. break; default: break; } } } //============================================================================================================= // Mise à jour du slider du backlight //============================================================================================================= function mise_a_jour_slider_backlight() { var res; //var i; //for (i = 0; i < 11; i ++) //{ // console.log("Table Backlight " + Number(i) + " = " + Number(table_backlight[i])); //} // Récupération de la valeur actuelle du backlight : var consigne; var rang; res = bdd.requete_unique('SELECT Valeur FROM TB_Configuration WHERE Nom="Consigne_backlight" '); consigne = Number(res[0]); if (consigne < 0) rang = -1; else if (consigne < table_backlight[1]) rang = 0; else if (consigne < table_backlight[2]) rang = 1; else if (consigne < table_backlight[3]) rang = 2; else if (consigne < table_backlight[4]) rang = 3; else if (consigne < table_backlight[5]) rang = 4; else if (consigne < table_backlight[6]) rang = 5; else if (consigne < table_backlight[7]) rang = 6; else if (consigne < table_backlight[8]) rang = 7; else if (consigne < table_backlight[9]) rang = 8; else if (consigne < table_backlight[10]) rang = 9; else if (consigne < table_backlight[11]) rang = 10; else rang = 11; if (rang < 0) slider_backlight.value = 0; else if (rang > 10) slider_backlight.value = 100; else slider_backlight.value = (10 * (rang + 1)) - (10 * (table_backlight[rang + 1] - consigne) / (table_backlight[rang + 1] - table_backlight[rang])); } //============================================================================================================= // Calcul de la consigne du backlight en fonction de la position du slider //============================================================================================================= function consigne_backlight(pc) { var i; var a, b; var val; if (pc <= 0) return (0); if (pc >= 100) return (100); i = Math.trunc(pc / 10); //console.log("Conversion Backlight : PC=" + Number(pc) + " i=" + Number(i) + " et valeur de retour =" + (((table_backlight[i+1] - table_backlight[i]) * (pc % 10) / 10) + table_backlight[i])); return ((table_backlight[i+1] - table_backlight[i]) * (pc % 10) / 10) + table_backlight[i]; } //================================================================================================= // Fonction : Retourne l'état actuel de la consigne des LEDs //================================================================================================= function get_validation_leds() { var req, res; req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Validation_leds" '; res = bdd.requete_unique(req); return(Number(res[0])); } //================================================================================================= // Fonction : Change l'état de la validation des LEDs //================================================================================================= function changer_validation_leds() { var req, res; var new_val; req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Validation_leds" '; res = bdd.requete_unique(req); if (Number(res[0]) === 0) new_val = '1'; else new_val = '0'; bdd.requete_unique('UPDATE TB_Configuration SET Valeur=' + new_val + ' WHERE Nom="Validation_leds" '); } //================================================================================================= // Fonction : Mise à jour de la valeur d'heure d'été dans TB_Configuration //================================================================================================= function mise_a_jour_heure_ete(heure_ete) { var req, res; var new_val; if ((heure_ete === 0) || (heure_ete === 1)) shipheart_heure_ete = heure_ete; else shipheat_heure_ete = 0; req = 'UPDATE TB_Configuration '; req += ' SET Valeur="' + shipheart_heure_ete + '" '; req += ' WHERE Nom="Heure_ete" '; //console.log("Requête = " + req) bdd.requete_unique(req); } //============================================================================================================= // Mise à jour du slider du volume //============================================================================================================= function mise_a_jour_slider_volume() { var res; //var i; //for (i = 0; i < 11; i ++) //{ // console.log("Table Volume " + Number(i) + " = " + Number(table_volume[i])); //} // Récupération de la valeur actuelle du Volume : var consigne; var rang; res = bdd.requete_unique('SELECT Valeur FROM TB_Configuration WHERE Nom="Consigne_volume" '); consigne = Number(res[0]); if (consigne < 0) rang = -1; else if (consigne < table_volume[1]) rang = 0; else if (consigne < table_volume[2]) rang = 1; else if (consigne < table_volume[3]) rang = 2; else if (consigne < table_volume[4]) rang = 3; else if (consigne < table_volume[5]) rang = 4; else if (consigne < table_volume[6]) rang = 5; else if (consigne < table_volume[7]) rang = 6; else if (consigne < table_volume[8]) rang = 7; else if (consigne < table_volume[9]) rang = 8; else if (consigne < table_volume[10]) rang = 9; else if (consigne < table_volume[11]) rang = 10; else rang = 11; if (rang < 0) slider_volume.value = 0; else if (rang > 10) slider_volume.value = 100; else slider_volume.value = (10 * (rang + 1)) - (10 * (table_volume[rang + 1] - consigne) / (table_volume[rang + 1] - table_volume[rang])); } //============================================================================================================= // Calcul de la consigne du Volume en fonction de la position du slider //============================================================================================================= function consigne_volume(pc) { var i; var a, b; var val; if (pc <= 0) return (0); if (pc >= 100) return (100); i = Math.trunc(pc / 10); //console.log("Conversion Volume : PC=" + Number(pc) + " i=" + Number(i) + " et valeur de retour =" + (((table_volume[i+1] - table_volume[i]) * (pc % 10) / 10) + table_volume[i])); return ((table_volume[i+1] - table_volume[i]) * (pc % 10) / 10) + table_volume[i]; } }