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. } } } }