774 lines
38 KiB
QML
774 lines
38 KiB
QML
//========================================================================================================================================================================
|
|
// CONFIG_VERSION.QML
|
|
// Ce fichier traite les informations de versions de ShipHeart
|
|
// La page est appelée depuis la page parametres_avances.qml, en cliquant sur "Version"
|
|
//========================================================================================================================================================================
|
|
import QtQuick 2.12
|
|
import QtQuick.Controls 2.12
|
|
|
|
import qt.koriolan.shipheart 1.0
|
|
|
|
|
|
|
|
Shipheart_page {
|
|
id: page_config_version
|
|
|
|
|
|
// Mis en forme :
|
|
readonly property double pourcentage_largeur_colonne_gauche: 0.50
|
|
readonly property double espace_colonnes_principales: 20
|
|
readonly property double pourcentage_hauteur_ligne_haut: 0.7
|
|
readonly property double espace_lignes_principales: 20
|
|
readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas
|
|
|
|
readonly property int hauteur_ligne_formulaire: 60
|
|
readonly property double pourcentage_largeur_labels_formulaire: 0.4
|
|
|
|
readonly property double proportion_hauteur_texte_droite: 0.4
|
|
readonly property int hauteur_bouton_droit: 80
|
|
readonly property int largeur_bouton_droit: 200
|
|
|
|
readonly property double pourcentage_bandeau_bas_largeur_zone_retour: 0.86
|
|
|
|
readonly property int periode_init_raffraichissement_parametres: 1 // En ms
|
|
readonly property int periode_raffraichissement_parametres: 1000 // En ms
|
|
readonly property int step_timer_appui_long: 30 // en ms
|
|
|
|
|
|
|
|
// Affichage :
|
|
property int protection_mode: 0
|
|
|
|
|
|
// Données :
|
|
property int valeur_timer_appui_long: 0
|
|
property string version_actuelle: ""
|
|
property string date_version_actuelle: ""
|
|
property string version_nouvelle: ""
|
|
property int type_version_nouvelle: 0 // 0: aucune, 1= à valider, 2= à charger
|
|
property int demande_maj_soft_en_cours: shipheart_demande_maj_soft_aucune
|
|
property bool flag_demande_factory_reset_en_cours: false
|
|
property bool flag_demande_factory_reset: false
|
|
|
|
// Modèles :
|
|
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
|
|
|
|
|
|
//===========================================================
|
|
// Timer periode raffraichissement parametres :
|
|
//===========================================================
|
|
Timer {
|
|
id: timer_raffraichissement_parametres
|
|
interval: periode_init_raffraichissement_parametres
|
|
triggeredOnStart: false
|
|
running: true
|
|
repeat: true
|
|
onTriggered: {
|
|
if (interval == periode_init_raffraichissement_parametres) { // Premier passage, 1ms après le premier chargement
|
|
interval = periode_raffraichissement_parametres;
|
|
|
|
init_page();
|
|
}
|
|
else
|
|
{
|
|
// Si on est en cours de Factory Reset et qu'un fichier '.enc' est dispo, c'est que ça doit être le fichier
|
|
// de Factory Reset généré par sauvegarde.php qui est prêt :
|
|
if ((flag_demande_factory_reset) &&
|
|
(shipheart_nb_fichiers_a_charger > 0)) // On ne peut pas utiliser (shipheart_fichier_a_charger != "") car on ne prend pas en compte les fichiers de type 'new' (ni 'restore).
|
|
{
|
|
busy_indicator.running = false;
|
|
rebooter();
|
|
}
|
|
|
|
mise_a_jour();
|
|
}
|
|
}
|
|
}
|
|
|
|
//===========================================================
|
|
// Timer pour gérer les appuis longs :
|
|
//===========================================================
|
|
Timer {
|
|
id: timer_appui_long
|
|
interval: step_timer_appui_long
|
|
triggeredOnStart: false
|
|
repeat: true
|
|
onTriggered: {
|
|
if (valeur_timer_appui_long < shipheart_mouse_press_and_hold_interval_tres_long) valeur_timer_appui_long+= step_timer_appui_long;
|
|
else // Le fait de ne pas utilise le OnPressandHold permet d'être sût que la sortie se fait au même moment que la fin du comptage (sinon, on peut avoir de petits décalages)
|
|
{
|
|
timer_appui_long.running = false;
|
|
valeur_timer_appui_long = 0;
|
|
shipheart_clic();
|
|
|
|
if (mousearea_installer_now.pressed)
|
|
{
|
|
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("<b>Mise à jour immédiate</b><br /><br />Si vous confirmez, cette mise à jour peut nécessiter <u>quelques minutes</u> pendant lesquelles <b>votre système ShipHeart ne sera pas accessible</b>.<br /><br />Vous ne devez confirmer l'installation que si vous êtes en situation sûre (au port, au mouillage, ...) et que la perte de contrôle de vos systèmes de bord pendant ce laps de temps est sans aucun danger !<br /><br />Cliquez sur Annuler pour revenir en arrière et effectuer cette installation ultérieurement.")
|
|
boite_validation_securisee.alignementMessage = Text.AlignHCenter
|
|
boite_validation_securisee.affichageAscenseur = true;
|
|
boite_validation_securisee.open();
|
|
}
|
|
else if (mousearea_installer_next_start.pressed)
|
|
{
|
|
boite_validation_securisee.niveau = 1;
|
|
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("Si vous confirmez, cette mise à jour sera marquée pour être chargée au prochain démarrage de ShipHeart.<br />Cliquez sur Annuler pour revenir en arrière et la conserver.")
|
|
boite_validation_securisee.alignementMessage = Text.AlignHCenter
|
|
boite_validation_securisee.affichageAscenseur = true;
|
|
boite_validation_securisee.open();
|
|
}
|
|
else if (mousearea_installer_never.pressed)
|
|
{
|
|
boite_validation_securisee.niveau = 1;
|
|
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("<b>Suppression de version</b><br /><br />Si vous confirmez, cette mise à jour sera définitivement supprimée.<br />Cliquez sur Annuler pour revenir en arrière et la conserver.")
|
|
boite_validation_securisee.alignementMessage = Text.AlignHCenter
|
|
boite_validation_securisee.affichageAscenseur = true;
|
|
boite_validation_securisee.open();
|
|
}
|
|
else if (mousearea_factory_reset.pressed)
|
|
{
|
|
flag_demande_factory_reset_en_cours = true;
|
|
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("Réinitialiser");
|
|
boite_validation_securisee.imageTitreSource = "/images/attention.png";
|
|
boite_validation_securisee.message = qsTr("<b>Réinitialisation Usine</b><br /><br />Si vous confirmez, tous les paramètres de ShipHeart seront complètement et définitivement effacés !<br /><br />Aucune sauvegarde ne sera conservée et tout retour en arrière sera impossible... <br /><br />Cliquez sur Annuler pour revenir en arrière si vous n'êtes pas certain de votre décision.<br /><br />Note : En cas de doute, vous pouvez effectuer une Sauvegarde et <u>la stocker sur une clé externe</u> avant d'effectuer cette réinitialisation usine.")
|
|
boite_validation_securisee.alignementMessage = Text.AlignHCenter
|
|
boite_validation_securisee.affichageAscenseur = true;
|
|
boite_validation_securisee.open();
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// Titre de la page :
|
|
Shipheart_titre_1 {titre:qsTr("Version"); hauteur: shipheart_hauteur_bandeau_haut}
|
|
|
|
//-------------------------------------------------------
|
|
// Ecran Haut - Gauche :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
id: zone_affichage_haut_gauche
|
|
x: 0
|
|
y: shipheart_hauteur_bandeau_haut;
|
|
width: (shipheart_largeur_page * pourcentage_largeur_colonne_gauche) - (espace_colonnes_principales / 2)
|
|
height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2);
|
|
color: "transparent"
|
|
|
|
//-------------------------------------------------------------------
|
|
// Grille pour afficher les paramètres :
|
|
GridView {
|
|
id: grille_informations
|
|
|
|
width: parent.width
|
|
height: parent.height
|
|
cellWidth: parent.width;
|
|
cellHeight: hauteur_ligne_formulaire
|
|
snapMode: GridView.SnapToRow // L'arret de l'affichage se fera sur une rangée entière
|
|
clip: true // Nécessaire pour que les Delegates s'arretent à l'intérieur de la GridView
|
|
model: modele_grille_informations
|
|
delegate: Rectangle {
|
|
width: grille_informations.cellWidth - 10
|
|
height: grille_informations.cellHeight - 5
|
|
color: "transparent"
|
|
Rectangle { // c'est le bouton proprement dit...
|
|
height: parent.height
|
|
width:parent.width
|
|
color: "transparent"
|
|
radius: shipheart_rayon_bouton
|
|
anchors.bottom: parent.bottom
|
|
Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignLeft
|
|
verticalAlignment: Qt.AlignVCenter
|
|
leftPadding: 20
|
|
text: model.nom_champ + " : " + model.valeur_champ
|
|
color: couleur_blanc_casse
|
|
font.pixelSize: 18
|
|
font.bold: false
|
|
wrapMode: Label.Wrap
|
|
}
|
|
}
|
|
}
|
|
|
|
ListModel {
|
|
id: modele_grille_informations
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// Ecran Droite :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
id: zone_affichage_droite
|
|
x: zone_affichage_haut_gauche.width + espace_colonnes_principales
|
|
y: shipheart_hauteur_bandeau_haut;
|
|
width: (shipheart_largeur_page * (1 - pourcentage_largeur_colonne_gauche)) - (espace_colonnes_principales / 2)
|
|
height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales / 2);
|
|
color: "transparent"
|
|
border.color: couleur_blanc_casse_transparent
|
|
border.width: 2
|
|
visible: (type_version_nouvelle > 0)
|
|
|
|
Column {
|
|
|
|
anchors.fill: parent
|
|
spacing: 20
|
|
|
|
//=========================================================================
|
|
// Texte d'introduction
|
|
//=========================================================================
|
|
Text {
|
|
// height: parent.height * proportion_hauteur_texte_droite
|
|
width: parent.width;
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
topPadding: 20 // Cette valeur permet d'être aligné avec la version courante...
|
|
bottomPadding: 50
|
|
font.pixelSize: 18
|
|
text: {
|
|
let message;
|
|
switch (type_version_nouvelle)
|
|
{
|
|
//-----------------------------
|
|
// Fichier dans A_VALIDER :
|
|
case shipheart_demande_maj_soft_validation:
|
|
message = qsTr("La version <b>%1</b> est disponible.<br /><br />Souhaitez-vous : ").arg(version_nouvelle);
|
|
break;
|
|
|
|
//-----------------------------
|
|
// Fichier dans A_CHARGER :
|
|
case shipheart_demande_maj_soft_chargement:
|
|
message = qsTr("La version <b>%1</b> est disponible.<br /><br />Elle sera automatiquement installée lors du prochain démarrage de ShipHeart.<br />A moins que vous ne choisissiez l'une des options ci-dessous :").arg(version_nouvelle)
|
|
break;
|
|
|
|
//-----------------------------
|
|
// Aucun fichier ni dans A_CHARGER, ni dans A_VALIDER :
|
|
case shipheart_demande_maj_soft_aucune:
|
|
default:
|
|
message = "";
|
|
}
|
|
return message;
|
|
}
|
|
color: couleur_blanc_casse
|
|
wrapMode: Text.Wrap
|
|
}
|
|
|
|
//=========================================================================
|
|
// Boutons :
|
|
//=========================================================================
|
|
Row {
|
|
height: hauteur_bouton_droit
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
spacing: 20
|
|
|
|
//---------------------------------------------------------------
|
|
Rectangle {
|
|
id: bouton_installer_now
|
|
height: hauteur_bouton_droit
|
|
width:largeur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: (type_version_nouvelle > 0)
|
|
|
|
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
|
|
width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
|
|
height: parent.height
|
|
color: couleur_rouge_transparent
|
|
radius: shipheart_rayon_bouton
|
|
visible: mousearea_installer_now.pressed
|
|
}
|
|
Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
verticalAlignment: Qt.AlignVCenter
|
|
text: qsTr("L'installer\nmaintenant")
|
|
color: couleur_blanc_casse
|
|
font.pixelSize: 16
|
|
wrapMode: Label.Wrap
|
|
padding: 10
|
|
}
|
|
MouseArea {
|
|
id: mousearea_installer_now
|
|
anchors.fill: parent
|
|
|
|
onPressed: { // Déclenché lors de l'appui inital
|
|
timer_appui_long.running = true;
|
|
valeur_timer_appui_long = 0;
|
|
demande_maj_soft_en_cours = shipheart_demande_maj_soft_chargement;
|
|
}
|
|
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
|
|
timer_appui_long.running = false;
|
|
valeur_timer_appui_long = 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_appui_long.running = false;
|
|
valeur_timer_appui_long = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
Rectangle {
|
|
id: bouton_installer_next_start
|
|
height: hauteur_bouton_droit
|
|
width:largeur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: (type_version_nouvelle === 1)
|
|
|
|
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
|
|
width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
|
|
height: parent.height
|
|
color: couleur_rouge_transparent
|
|
radius: shipheart_rayon_bouton
|
|
visible: mousearea_installer_next_start.pressed
|
|
}
|
|
Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
verticalAlignment: Qt.AlignVCenter
|
|
text: qsTr("L'installer au prochain démarrage de ShipHeart")
|
|
color: couleur_blanc_casse
|
|
font.pixelSize: 16
|
|
wrapMode: Label.Wrap
|
|
padding: 10
|
|
}
|
|
MouseArea {
|
|
id: mousearea_installer_next_start
|
|
anchors.fill: parent
|
|
onPressed: { // Déclenché lors de l'appui inital
|
|
timer_appui_long.running = true;
|
|
valeur_timer_appui_long = 0;
|
|
demande_maj_soft_en_cours = shipheart_demande_maj_soft_validation;
|
|
}
|
|
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
|
|
timer_appui_long.running = false;
|
|
valeur_timer_appui_long = 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_appui_long.running = false;
|
|
valeur_timer_appui_long = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------
|
|
Rectangle {
|
|
id: bouton_installer_never
|
|
height: hauteur_bouton_droit
|
|
width:largeur_bouton_droit
|
|
color: shipheart_couleur_fond_bouton
|
|
radius: shipheart_rayon_bouton
|
|
visible: (type_version_nouvelle > 0)
|
|
|
|
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
|
|
width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
|
|
height: parent.height
|
|
color: couleur_rouge_transparent
|
|
radius: shipheart_rayon_bouton
|
|
visible: mousearea_installer_never.pressed
|
|
}
|
|
Text {
|
|
anchors.fill: parent
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
verticalAlignment: Qt.AlignVCenter
|
|
text: qsTr("Ne jamais l'installer")
|
|
color: couleur_blanc_casse
|
|
font.pixelSize: 16
|
|
wrapMode: Label.Wrap
|
|
padding: 10
|
|
}
|
|
MouseArea {
|
|
id: mousearea_installer_never
|
|
anchors.fill: parent
|
|
onPressed: { // Déclenché lors de l'appui inital
|
|
timer_appui_long.running = true;
|
|
valeur_timer_appui_long = 0;
|
|
demande_maj_soft_en_cours = shipheart_demande_maj_soft_annulation;
|
|
}
|
|
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
|
|
timer_appui_long.running = false;
|
|
valeur_timer_appui_long = 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_appui_long.running = false;
|
|
valeur_timer_appui_long = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// Ecran Bas :
|
|
//-------------------------------------------------------
|
|
Rectangle {
|
|
id: zone_affichage_bas
|
|
x: 0
|
|
y: shipheart_hauteur_bandeau_haut + zone_affichage_haut_gauche.height + espace_lignes_principales;
|
|
width: shipheart_largeur_page
|
|
height: (affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut)) - espace_lignes_principales;
|
|
color: "transparent"
|
|
|
|
Text {
|
|
width: parent.width;
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
horizontalAlignment: Text.AlignJustify
|
|
padding: 20 // Cette valeur permet d'être aligné avec la version courante...
|
|
font.pixelSize: 16
|
|
text: qsTr("Le présent produit est conçu et fabriqué par la société Koriolan qui dispose de toutes les licences et droits d'exploitation sur les images, \
|
|
logiciels et brevets utilisés tant pour sa conception que pour son fonctionnement. \
|
|
ShipHeart™, Ship2net™ et Koriolan™ sont des marques déposées par la société Koriolan. \
|
|
Pour toute question relative à ce produit, merci de vous rendre sur le site 'koriolan.tech' ou de nous contacter à l'adresse 'contact@koriolan.tech'.");
|
|
color: couleur_blanc_casse
|
|
wrapMode: Text.Wrap
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------
|
|
// 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_factory_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 Factory Reset :
|
|
//.................................................
|
|
Rectangle {
|
|
id: bandeau_bas_zone_bouton_factory_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_type_installation === shipheart_type_installation_shipbase)
|
|
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
|
|
width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
|
|
height: parent.height
|
|
color: couleur_rouge_transparent
|
|
radius: shipheart_rayon_bouton
|
|
visible: mousearea_factory_reset.pressed
|
|
}
|
|
Image {
|
|
source: mousearea_factory_reset.pressed ? "/images/factory_reset_actif.png" : "/images/factory_reset_sombre.png"
|
|
sourceSize.height: 40
|
|
anchors {
|
|
verticalCenter: parent.verticalCenter
|
|
horizontalCenter: parent.horizontalCenter
|
|
}
|
|
}
|
|
MouseArea {
|
|
id: mousearea_factory_reset
|
|
anchors.fill: parent
|
|
onPressed: { // Déclenché lors de l'appui inital
|
|
valeur_timer_appui_long = 0;
|
|
timer_appui_long.running = true;
|
|
}
|
|
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
|
|
valeur_timer_appui_long = 0;
|
|
timer_appui_long.running = false;
|
|
}
|
|
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 !!)
|
|
valeur_timer_appui_long = 0;
|
|
timer_appui_long.running = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//---------------------------
|
|
// Busy Indicator :
|
|
Shipheart_busy_indicator {
|
|
id: busy_indicator
|
|
}
|
|
|
|
//-------------------------------------------------------
|
|
// 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 :
|
|
if (demande_maj_soft_en_cours !== shipheart_demande_maj_soft_aucune)
|
|
{
|
|
demande_maj(demande_maj_soft_en_cours);
|
|
demande_maj_soft_en_cours = shipheart_demande_maj_soft_aucune;
|
|
}
|
|
else if (flag_demande_factory_reset_en_cours)
|
|
{
|
|
demande_factory_reset();
|
|
}
|
|
break;
|
|
|
|
case shipheart_boite_dialogue_bouton_2: // Annuler : on revient sur la page pour que l'on puisse enregistrer.
|
|
demande_maj_soft_en_cours = shipheart_demande_maj_soft_aucune;
|
|
flag_demande_factory_reset_en_cours = false;
|
|
break;
|
|
|
|
default:
|
|
}
|
|
boite_validation_securisee.close();
|
|
}
|
|
}
|
|
|
|
// Note : il est inutile de prévoir un Mousearea pour sortir de l'économiseur sur cette page puisqu'il
|
|
// est systématiquement bloqué pour toutes les pages lancées depuis 'Paramètres Avancés'.
|
|
|
|
//=============================================================================================================
|
|
// Init de la page
|
|
//=============================================================================================================
|
|
function init_page()
|
|
{
|
|
var req, res;
|
|
var nb;
|
|
var i;
|
|
var nom_champ, valeur_champ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Mise à jour des informations sur les différentes versions sous-jacentes :
|
|
modele_grille_informations.clear();
|
|
|
|
req = 'SELECT Nom, Valeur FROM TB_Systeme ORDER BY Cle_primaire';
|
|
//console.log("req =" + req);
|
|
nb = bdd.requete(req);
|
|
|
|
for (i = 0; i < nb; i ++)
|
|
{
|
|
res = bdd.lecture_ligne();
|
|
if (!res.isEmpty)
|
|
{
|
|
switch(res[0])
|
|
{
|
|
// case "Version_soft_package": nom_champ = qsTr("Version du package logiciel"); valeur_champ = res[1]; break;
|
|
case "Version_soft_no_package":
|
|
version_actuelle = res[1];
|
|
nom_champ = qsTr("Version du package logiciel");
|
|
valeur_champ = res[1];
|
|
break;
|
|
case "Version_soft_application_cm3p":
|
|
nom_champ = qsTr("Version de l'application");
|
|
valeur_champ = res[1];
|
|
break;
|
|
case "Version_soft_application_qt":
|
|
nom_champ = qsTr("Version de l'interface graphique");
|
|
valeur_champ = res[1];
|
|
break;
|
|
case "Version_soft_modem":
|
|
if (shipheart_generation_shipbase >= shipheart_generation_shipbase_v2) continue;
|
|
nom_champ = qsTr("Version du firmware du modem");
|
|
valeur_champ = res[1].replace("Revision:", "");
|
|
break;
|
|
case "No_imei":
|
|
if (shipheart_generation_shipbase >= shipheart_generation_shipbase_v2) continue;
|
|
nom_champ = qsTr("Numéro d'IMEI");
|
|
valeur_champ = res[1];
|
|
break;
|
|
case "No_iccid":
|
|
if (shipheart_generation_shipbase >= shipheart_generation_shipbase_v2) continue;
|
|
nom_champ = qsTr("Numéro d'ICCID");
|
|
valeur_champ = res[1].replace("f", "");
|
|
break;
|
|
case "No_imsi":
|
|
if (shipheart_generation_shipbase >= shipheart_generation_shipbase_v2) continue;
|
|
nom_champ = qsTr("Numéro d'IMSI");
|
|
valeur_champ = res[1];
|
|
break;
|
|
|
|
default: continue;
|
|
}
|
|
modele_grille_informations.append({"nom_champ": nom_champ, "valeur_champ": valeur_champ});
|
|
}
|
|
else break; // Ne devrait pas arriver....
|
|
}
|
|
|
|
|
|
mise_a_jour();
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// Mise à jour de l'état des fichiers disponibles :
|
|
//=============================================================================================================
|
|
function mise_a_jour()
|
|
{
|
|
var i;
|
|
var fragments_new_version;
|
|
|
|
version_nouvelle = "";
|
|
|
|
if (shipheart_fichier_a_charger !== "") // Si un fichier a chargé existe, on ne considère que celui-ci :
|
|
{
|
|
let c = shipheart_fichier_a_charger.split('.'); // Extraction de la partie avant le premier '.'
|
|
fragments_new_version = c[0].split('_'); // Extractions des fragments de version
|
|
type_version_nouvelle = shipheart_demande_maj_soft_chargement;
|
|
|
|
}
|
|
else if(shipheart_fichier_a_valider !== "") // ... sinon, on regarde si un fichier à valider existe et on le traite :
|
|
{
|
|
let c = shipheart_fichier_a_valider.split('.'); // Extraction de la partie avant le premier '.'
|
|
fragments_new_version = c[0].split('_'); // Extractions des fragments de version
|
|
type_version_nouvelle = shipheart_demande_maj_soft_validation;
|
|
}
|
|
else type_version_nouvelle = shipheart_demande_maj_soft_aucune;
|
|
|
|
if (type_version_nouvelle > shipheart_demande_maj_soft_aucune) version_nouvelle = fragments_new_version[2] + "." + fragments_new_version[3] + "." + fragments_new_version[4];
|
|
else version_nouvelle = "";
|
|
//console.log("Version nouvelle = " + version_nouvelle)
|
|
}
|
|
|
|
|
|
//=============================================================================================================
|
|
// Mise à jour de la valeur de Demande_maj_soft dans TB_Systeme
|
|
//=============================================================================================================
|
|
function demande_maj(demande_maj_soft)
|
|
{
|
|
var commande;
|
|
|
|
switch (demande_maj_soft)
|
|
{
|
|
//-----------------------------
|
|
// Fichier dans A_VALIDER :
|
|
// Note : l'utilisation de 'sudo sh -c "commande" ' permet de lancer un shell en sudo qui, ensuite exécute la commande (en sudo donc)
|
|
// Sans passer par cette astuce, l'appel se fait depuis le shell qui a lancé Qt (non-sudo donc) et le fait d'ajouter 'sudo' DANS la commande
|
|
// n'est pas prise en compte. La commandes est alors exécutée en non-sudo en, selon, les droits nécessaires, peut échouer.
|
|
case shipheart_demande_maj_soft_validation:
|
|
commande = 'sudo sh -c "mv ' + shipheart_repertoire_versions_a_valider + '/' + shipheart_fichier_a_valider + ' ' + shipheart_repertoire_versions_a_charger + '/' + shipheart_fichier_a_valider + '" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell_non_bloquante(commande);
|
|
|
|
break;
|
|
|
|
//-----------------------------
|
|
// Fichier dans A_CHARGER :
|
|
case shipheart_demande_maj_soft_chargement:
|
|
rebooter();
|
|
break;
|
|
|
|
//------------------------------------------------------------
|
|
// Demande d'annulation :
|
|
case shipheart_demande_maj_soft_annulation:
|
|
|
|
// Vidage du répertoire A_VALIDER :
|
|
commande = 'sudo sh -c "rm -f ' + shipheart_repertoire_versions_a_valider + '/*" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell(commande, "");
|
|
|
|
// Vidage du répertoire A_CHARGER :
|
|
commande = 'sudo sh -c "rm -f ' + shipheart_repertoire_versions_a_charger + '/*" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell(commande, "");
|
|
|
|
break;
|
|
|
|
//-----------------------------
|
|
// Aucun fichier ni dans A_CHARGER, ni dans A_VALIDER :
|
|
case shipheart_demande_maj_soft_aucune:
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// Dermande de synchro rapide de l'appli :
|
|
synchro_bdd(shipheart_type_synchro_data);
|
|
|
|
}
|
|
|
|
//=============================================================================================================
|
|
// Traitement de la demande de Factory Reset :
|
|
//=============================================================================================================
|
|
function demande_factory_reset()
|
|
{
|
|
var commande;
|
|
|
|
flag_demande_factory_reset_en_cours = false;
|
|
|
|
// Vidage du répertoire A_CHARGER :
|
|
commande = 'sudo sh -c "rm -f ' + shipheart_repertoire_versions_a_charger + '/*" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell(commande, "");
|
|
|
|
// Vidage du répertoire A_VALIDER :
|
|
// Peut être utile pour le fonctionnement après le Factory Reset.
|
|
commande = 'sudo sh -c "rm -f ' + shipheart_repertoire_versions_a_valider + '/*" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell(commande, "");
|
|
|
|
// Commande d'exécution du script :
|
|
commande = 'sudo sh -c "php ' + shipheart_repertoire_utils + '/' + shipheart_nom_fichier_sauvegarde + ' Factory_reset" ';
|
|
//console.log("Exécution de la commande [ " + commande + " ]");
|
|
systeme.commande_shell_non_bloquante(commande); // On doit sortir sans attendre la fin de l'exécution pour que le sablier fonctionne.
|
|
|
|
flag_demande_factory_reset = true; // Permet de valider la recherche d'un fichier 'enc' de fin de sauvegarde
|
|
busy_indicator.running = true; // Lance le sablier.
|
|
}
|
|
}
|
|
|