Files

1303 lines
60 KiB
QML

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];
}
}