import QtQuick 2.12
import QtQuick.Controls 2.12
import qt.koriolan.shipheart 1.0
Shipheart_page {
id: page_parametres_avances
// Mis en forme :
readonly property int menu_nombre_colonnes: 4
readonly property int menu_espace_colonnes: 20
readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 0.86
readonly property int nombre_menus_affiches_sur_une_colonne: 8
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
readonly property int periode_raffraichissement_parametres: 1000 // En ms
readonly property int step_timer_reset: 10 // en ms
// Affichage :
property int niveau_page: 0
property bool bouton_bandeau_bas_zone_retour_actif: false
property bool flag_nouvelle_version: false // Permet de mémoriser et donc détecter un changement
// Données :
property int valeur_timer_reset: 0
// 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();
}
}
}
//===========================================================
// Timer pour gérer l'appui long du reboot :
//===========================================================
Timer {
id: timer_reset
interval: step_timer_reset
triggeredOnStart: false
repeat: true
onTriggered: {
if (valeur_timer_reset < shipheart_mouse_press_and_hold_interval_tres_long) valeur_timer_reset+= step_timer_reset;
else // Le fait de ne pas utilise le OnPressandHold permet d'être sûr que le reset se fait au même moment que la fin du comptage (sinon, on peut avoir de petits décalages)
{
timer_reset.running = false;
valeur_timer_reset = 0;
shipheart_clic();
boite_validation_securisee.niveau = 2;
boite_validation_securisee.boutonOk = false
boite_validation_securisee.boutonAnnuler = true
boite_validation_securisee.boutonSecurise = true
boite_validation_securisee.boutonSecuriseTexte = qsTr("Confirmer");
boite_validation_securisee.imageTitreSource = "/images/attention.png";
boite_validation_securisee.message = qsTr("Redémarrage
Si vous confirmez, ShipHeart va redémarrer.
Pendant ce redémarrage (environ une minute), votre système ShipHeart ne sera pas accessible ! ")
boite_validation_securisee.alignementMessage = Text.AlignHCenter
boite_validation_securisee.affichageAscenseur = true;
boite_validation_securisee.open();
}
}
}
//===========================================================
// Actions avant l'affichage proprement dit :
//===========================================================
StackView.onActivating: { // Permet que lors du retour sur la page, un traitement soit fait avant l'affichage proprement dit
init_page();
}
//===========================================================
// Titre de la page :
//===========================================================
Shipheart_titre_1 {titre:qsTr("Paramètres avancés"); hauteur: shipheart_hauteur_bandeau_haut}
//-------------------------------------------------------
// Ecran Principal Gauche :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_gauche
x: (0 * shipheart_largeur_page / menu_nombre_colonnes) + (menu_espace_colonnes / 2)
y: shipheart_hauteur_bandeau_haut
width: (shipheart_largeur_page / menu_nombre_colonnes) - menu_espace_colonnes
height: affichage_hauteur_utile
color: "transparent"
Shipheart_titre_2 {titre:qsTr("Votre installation"); hauteur: shipheart_hauteur_bandeau_haut}
ListView {
id: liste_menu_gauche
y : shipheart_hauteur_bandeau_haut
width: parent.width
height: parent.height - shipheart_hauteur_bandeau_haut
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: ListModel {}
delegate: Rectangle {
width: liste_menu_gauche.width
height: (shipheart_niveau_acces_en_cours >= niveau_mini) ? (liste_menu_gauche.height / nombre_menus_affiches_sur_une_colonne) : 0
color: "transparent"
visible: (shipheart_niveau_acces_en_cours >= niveau_mini) ? true : false
Rectangle {
width: parent.width
height: parent.height -10
color: (libelle !== "") ? shipheart_couleur_fond_bouton : "transparent"
radius: shipheart_rayon_bouton
//--------------------------------------------------------------------
// Icone du bouton :
Rectangle { // Le passage par un rectangle avant l'image permet de centrer l'image sur le rectangle et pas juste caler les images à gaiche (elles n'ont pas la même largeur donc elles n'étaient pas centrées les unes par rapport aux autres)
width: 35
height: parent.height
x: 10
color: "transparent"
Image {
source: "/images/" + model.icone
sourceSize.height: parent.height * 0.6
sourceSize.width: parent.width
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
visible: (model.icone !== "")
}
}
//--------------------------------------------------------------------
// Libellé du bouton :
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: libelle;
color: couleur_blanc_casse
visible: (libelle !== "") ? true : false
}
//--------------------------------------------------------------------
// Triangle rouge en bas à droite :
Image {
source: alarme
sourceSize.height: 20
anchors {
bottom: parent.bottom
right: parent.right
}
visible: alarme !== ""
}
//--------------------------------------------------------------------
// Zone de clic du bouton :
MouseArea {
anchors.fill: parent
visible: (libelle !== "") ? true : false
onClicked: {
shipheart_clic();
if (page_cible !== "")
{
stackView.push(page_cible, param_cible);
}
else boite_information_en_travaux.open();
}
}
}
}
ScrollBar.vertical: ScrollBar {}
}
}
//-------------------------------------------------------
// Ecran Principal Milieu Gauche :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_milieu_gauche
x: (1 * shipheart_largeur_page / menu_nombre_colonnes) + (menu_espace_colonnes / 2)
y: shipheart_hauteur_bandeau_haut
width: (shipheart_largeur_page / menu_nombre_colonnes) - menu_espace_colonnes
height: affichage_hauteur_utile
color: "transparent"
Shipheart_titre_2 {titre:qsTr("Vos paramètres"); hauteur: shipheart_hauteur_bandeau_haut}
ListView {
id: liste_menu_milieu_gauche
y : shipheart_hauteur_bandeau_haut
width: parent.width
height: parent.height - shipheart_hauteur_bandeau_haut
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: ListModel {}
delegate: Rectangle {
width: liste_menu_milieu_gauche.width
height: (shipheart_niveau_acces_en_cours >= niveau_mini) ? (liste_menu_milieu_gauche.height / nombre_menus_affiches_sur_une_colonne) : 0
color: "transparent"
visible: (shipheart_niveau_acces_en_cours >= niveau_mini) ? true : false
Rectangle {
width: parent.width
height: parent.height -10
color: (libelle !== "") ? shipheart_couleur_fond_bouton : "transparent"
radius: shipheart_rayon_bouton
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: libelle;
color: couleur_blanc_casse
visible: (libelle !== "") ? true : false
}
MouseArea {
anchors.fill: parent
visible: (libelle !== "") ? true : false
onClicked: {
shipheart_clic();
if (page_cible !== "")
{
stackView.push(page_cible, param_cible);
}
else boite_information_en_travaux.open();
}
}
Image {
source: alarme
sourceSize.height: 20
anchors {
bottom: parent.bottom
right: parent.right
}
visible: alarme !== ""
}
}
}
ScrollBar.vertical: ScrollBar {}
}
}
//-------------------------------------------------------
// Ecran Principal Milieu Droite :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_milieu_droite
x: (2 * shipheart_largeur_page / menu_nombre_colonnes) + (menu_espace_colonnes / 2)
y: shipheart_hauteur_bandeau_haut
width: (shipheart_largeur_page / menu_nombre_colonnes) - menu_espace_colonnes
height: affichage_hauteur_utile
color: "transparent"
Shipheart_titre_2 {titre:qsTr("Réseaux"); hauteur: shipheart_hauteur_bandeau_haut}
ListView {
id: liste_menu_milieu_droite
y : shipheart_hauteur_bandeau_haut
width: parent.width
height: parent.height - shipheart_hauteur_bandeau_haut
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: ListModel {}
delegate: Rectangle {
width: liste_menu_milieu_droite.width
height: (shipheart_niveau_acces_en_cours >= niveau_mini) ? (liste_menu_milieu_droite.height / nombre_menus_affiches_sur_une_colonne) : 0
color: "transparent"
visible: (shipheart_niveau_acces_en_cours >= niveau_mini) ? true : false
Rectangle {
width: parent.width
height: parent.height -10
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: libelle;
color: couleur_blanc_casse
visible: (libelle !== "") ? true : false
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
if (page_cible !== "")
{
stackView.push(page_cible, param_cible);
}
else boite_information_en_travaux.open();
}
}
Image {
source: alarme
sourceSize.height: 20
anchors {
bottom: parent.bottom
right: parent.right
}
visible: alarme !== ""
}
}
}
ScrollBar.vertical: ScrollBar {}
}
}
//-------------------------------------------------------
// Ecran Principal Droite :
//-------------------------------------------------------
Rectangle {
id: zone_affichage_droite
x: (3 * shipheart_largeur_page / menu_nombre_colonnes) + (menu_espace_colonnes / 2)
y: shipheart_hauteur_bandeau_haut
width: (shipheart_largeur_page / menu_nombre_colonnes) - menu_espace_colonnes
height: affichage_hauteur_utile
color: "transparent"
Shipheart_titre_2 {titre:qsTr("Système"); hauteur: shipheart_hauteur_bandeau_haut}
ListView {
id: liste_menu_droite
y : shipheart_hauteur_bandeau_haut
width: parent.width
height: parent.height - shipheart_hauteur_bandeau_haut
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: ListModel {}
delegate: Rectangle {
width: liste_menu_droite.width
height: (shipheart_niveau_acces_en_cours >= niveau_mini) ? (liste_menu_droite.height / nombre_menus_affiches_sur_une_colonne) : 0
color: "transparent"
visible: (shipheart_niveau_acces_en_cours >= niveau_mini) ? true : false
Rectangle {
width: parent.width
height: parent.height -10
color: shipheart_couleur_fond_bouton
radius: shipheart_rayon_bouton
Text {
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
text: libelle;
color: couleur_blanc_casse
visible: (libelle !== "") ? true : false
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
if (page_cible !== "")
{
stackView.push(page_cible, param_cible);
}
else boite_information_en_travaux.open();
}
}
Image {
source: alarme
sourceSize.height: 20
anchors {
bottom: parent.bottom
right: parent.right
}
visible: alarme !== ""
}
}
}
ScrollBar.vertical: ScrollBar {}
}
}
//-------------------------------------------------------
// 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: (bandeau_bas_zone_bouton_reset.visible) ?
(parent.width * pourcentage_bandeau_bas_largeur_zone_retour - (parent.spacing / 2)) :
(parent.width - (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 {
id: mouse_area_bandeau_bas_zone_retour
anchors.fill: parent
onClicked: {
shipheart_clic();
shipheart_compteur_time_out_niveau_acces = shipheart_time_out_niveau_acces; // Rechargement au moment de la sortie (SDIR #187)
shipheart_flag_blocage_compteurs_pendant_config = false; // Déblocage du comptage (SDIR #187)
stackView.pop(stackView.get(shipheart_niveau_home)); // Retour direct à la Home Page quand on quitte les Paramètres Avancés...
}
}
}
//.................................................
// Bouton Reset :
//.................................................
Rectangle {
id: bandeau_bas_zone_bouton_reset
width: (parent.width * (1 - 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
visible: (shipheart_generation_shipbase >= shipheart_generation_shipbase_v2) &&
(shipheart_type_installation === shipheart_type_installation_shipbase)
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
width: (valeur_timer_reset / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
height: parent.height
color: couleur_rouge_transparent
radius: shipheart_rayon_bouton
visible: mousearea_reset.pressed
}
Image {
source: mousearea_reset.pressed ? "/images/reset_actif.png" : "/images/reset_sombre.png"
sourceSize.height: 30
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
}
MouseArea {
id: mousearea_reset
anchors.fill: parent
onPressed: { // Déclenché lors de l'appui inital
valeur_timer_reset = 0;
timer_reset.running = true;
}
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
timer_reset.running = false;
valeur_timer_reset = 0;
}
onExited: { // Déclenché si le doigt sort de la zone du bouton (sinon, on continue à compter alors qu'on est sorti de la zone et même relaché le doigt !!)
timer_reset.running = false;
valeur_timer_reset = 0;
}
}
}
}
//-------------------------------------------------------
// Boite en travaux :
//-------------------------------------------------------
Shipheart_boite_dialogue {
id: boite_information_en_travaux
niveau: 0
imageTitreSource: "/images/cone_chantier.png";
message: qsTr("Cette page est actuellement en travaux.
Elle sera rendue disponible très rapidement à travers une mise à jour.
Merci de votre patience...
L'équipe ShipHeart")
}
//-------------------------------------------------------
// Boite d'information :
//-------------------------------------------------------
Shipheart_boite_dialogue_validation_securisee {
id: boite_validation_securisee
onClicked: {
switch(bouton)
{
case shipheart_boite_dialogue_bouton_4: // Confirmation sécurisée :
rebooter();
break;
case shipheart_boite_dialogue_bouton_2: // Annuler : on revient sur la page pour que l'on puisse enregistrer.
break;
default:
}
boite_validation_securisee.close();
}
}
//===========================================================
// 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()
{
mise_en_veille(0);
niveau_page = stackView.depth - 1; // Permet de stocker le niveau de la page dans la Stackview
shipheart_flag_blocage_compteurs_pendant_config = true; // Blocage du comptage pendant tout le temps où on est en config (SDIR #187)
//-----------------------------------------
// Nouvelle version :
if ((shipheart_fichier_a_charger !== "") || (shipheart_fichier_a_valider !== "")) flag_nouvelle_version = true;
else flag_nouvelle_version = false;
//-------------------------------------
// Menu de gauche :
//-------------------------------------
liste_menu_gauche.model.clear();
liste_menu_gauche.model.append({ libelle: qsTr("Circuits"), page_cible: "config_circuits.qml", param_cible: {}, icone: "icone_consommation_electrique.png", niveau_mini: 0, alarme: "" });
liste_menu_gauche.model.append({ libelle: qsTr("Réservoirs"), page_cible: "config_reservoirs.qml", param_cible: {}, icone: "reservoir_eau.png", niveau_mini: 0, alarme: "" });
liste_menu_gauche.model.append({ libelle: qsTr("Batteries"), page_cible: "config_batteries.qml", param_cible: {}, icone: "batterie_moyen.png", niveau_mini: 0, alarme: "" });
liste_menu_gauche.model.append({ libelle: qsTr("Capteurs"), page_cible: "config_capteurs.qml", param_cible: {}, icone: "icone_auxiliaires.png", niveau_mini: 0, alarme: "" });
liste_menu_gauche.model.append({ libelle: qsTr("Evènements"), page_cible: "config_events.qml", param_cible: {}, icone: "event.png", niveau_mini: 0, alarme: "" });
//liste_menu_gauche.model.append({ libelle: qsTr("TEST"), page_cible: "test_batterie.qml", param_cible: {}, niveau_mini: 0 });
//liste_menu_gauche.model.append({ libelle: qsTr("TEST"), page_cible: "test_tri_liste.qml", param_cible: {}, niveau_mini: 0 });
//-------------------------------------
// Menu de milieu gauche :
//-------------------------------------
liste_menu_milieu_gauche.model.clear();
liste_menu_milieu_gauche.model.append({ libelle: qsTr("Affichage"), page_cible: "config_affichage.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_gauche.model.append({ libelle: qsTr("Image d'accueil"), page_cible: "config_fichiers.qml", param_cible: {"mode_config_fichiers": shipheart_mode_config_fichiers_image_accueil}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_gauche.model.append({ libelle: qsTr("Pages personnalisées"), page_cible: "config_pages.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_gauche.model.append({ libelle: qsTr("Audio"), page_cible: "config_audio.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
// liste_menu_milieu_gauche.model.append({ libelle: qsTr("Evènements"), page_cible: "config_events.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
//-------------------------------------
// Menu du milieu droite :
//-------------------------------------
liste_menu_milieu_droite.model.clear();
liste_menu_milieu_droite.model.append({ libelle: qsTr("ShipHeart"), page_cible: "config_reseau_k_bus.qml", param_cible: {}, niveau_mini: 0, alarme: (shipheart_defaut_config_k_bus !== 0) ? "/images/coin_bas_droite_rouge.png" : ""});
liste_menu_milieu_droite.model.append({ libelle: qsTr("Ethernet & Wifi"), page_cible: "config_reseau_ethernet_wifi.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
// liste_menu_milieu.model.append({ libelle: qsTr("Wifi"), page_cible: "config_reseau_wifi.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_droite.model.append({ libelle: qsTr("One Wire"), page_cible: "config_reseau_one_wire.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_droite.model.append({ libelle: qsTr("NMEA 2000"), page_cible: "config_reseau_nmea.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_droite.model.append({ libelle: qsTr("J1939"), page_cible: "", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_milieu_droite.model.append({ libelle: qsTr("DMX"), page_cible: "", param_cible: {}, niveau_mini: 0, alarme: "" });
//-------------------------------------
// Menu de droite :
//-------------------------------------
liste_menu_droite.model.clear();
liste_menu_droite.model.append({ libelle: qsTr("Accès au paramètres"), page_cible: "config_acces_parametres.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_droite.model.append({ libelle: qsTr("Ship2net"), page_cible: "config_ship2net.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
liste_menu_droite.model.append({ libelle: qsTr("Journal de bord"), page_cible: "journal_de_bord.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
// liste_menu_droite.model.append({ libelle: qsTr("Protection"), page_cible: "", param_cible: {}, niveau_mini: 0, alarme: "" });
if (shipheart_type_installation !== shipheart_type_installation_shipbase)
{
liste_menu_droite.model.append({ libelle: qsTr("Configuration ShipRS"), page_cible: "config_shiprs.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
}
liste_menu_droite.model.append({ libelle: qsTr("Installation"), page_cible: "config_fichiers.qml", param_cible: {"mode_config_fichiers": shipheart_mode_config_fichiers_rapports}, niveau_mini: 0, alarme: "" });
liste_menu_droite.model.append({ libelle: qsTr("Sauvegardes"), page_cible: "config_fichiers.qml", param_cible: {"mode_config_fichiers": shipheart_mode_config_fichiers_sauvegardes}, niveau_mini: 0, alarme: "" });
liste_menu_droite.model.append({ libelle: qsTr("Version"), page_cible: "config_version.qml", param_cible: {}, niveau_mini: 0, alarme: flag_nouvelle_version ? "/images/coin_bas_droite_bleu_koriolan.png" : "" });
switch(Number(shipheart_specifique_client[0]))
{
case shipheart_specifique_client_suncy: // Suncy Concept
liste_menu_droite.model.append({libelle: qsTr("Spécifique Suncy"), page_cible: "config_specifique_client_suncy.qml", param_cible: {}, niveau_mini: 0, alarme: "" });
break;
default: break;
}
liste_menu_droite.model.append({ libelle: qsTr("Accès réservé Koriolan"), page_cible: "config_koriolan.qml", param_cible: {}, niveau_mini: 10, alarme: "" });
}
//=============================================================================================================
// 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);
if (shipheart_defaut_config_k_bus !== Number(res[0]))
{
shipheart_defaut_config_k_bus = Number(res[0]);
init_page(); // Permet de mettre à jour le champ 'alarme' de tous les boutons... Un peu brut mais efficace.
}
//-----------------------------------------
// Nouvelle version :
if ((shipheart_fichier_a_charger !== "") || (shipheart_fichier_a_valider !== "")) // Nouvelle version présente :
{
if (!flag_nouvelle_version) // Etat précédent = pas de nouvelle version
{
flag_nouvelle_version = true;
init_page(); // Permet de mettre à jour le champ 'alarme' de tous les boutons... Un peu brut mais efficace.
}
}
else // Nouvelle version absente :
{
if (flag_nouvelle_version) // Etat précédent = nouvelle version présente
{
flag_nouvelle_version = false;
init_page(); // Permet de mettre à jour le champ 'alarme' de tous les boutons... Un peu brut mais efficace.
}
}
}
}