diff --git a/qml/home.qml b/qml/home.qml index 1b460fb..b4656ce 100644 --- a/qml/home.qml +++ b/qml/home.qml @@ -1,4 +1,4 @@ -import QtQuick 2.12 +import QtQuick 2.15 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.12 @@ -25,6 +25,13 @@ import "responsive.js" as Responsive Shipheart_page { id: page_accueil + // Vrai pendant qu'un doigt/curseur est posé sur un élément - le minuteur + // de rafraîchissement s'appuie dessus pour suspendre la mise à jour du + // modèle pendant ce court instant, cause confirmée empiriquement de + // l'appui long parfois annulé (mécanisme interne exact non élucidé avec + // certitude, mais l'effet est net et reproductible) : + property bool interactionEnCours: false + readonly property var domaines: ["circuits", "batteries", "capteurs", "reservoirs"] readonly property var domaines_libelles: [qsTr("Circuits"), qsTr("Batteries"), qsTr("Capteurs"), qsTr("Réservoirs")] property int domaine_actif_index: 0 @@ -186,7 +193,7 @@ Shipheart_page { repeat: true onTriggered: { dataProvider.get_familles(domaine_actif); - if (id_groupe > 0) dataProvider.get_elements(domaine_actif, id_groupe); + if ((id_groupe > 0) && !interactionEnCours) dataProvider.get_elements(domaine_actif, id_groupe); } } @@ -322,6 +329,12 @@ Shipheart_page { model: modele_elements_actuel clip: true opacity: dataProvider.connecte ? 1.0 : 0.45 + // Réutilise les délégués existants au lieu de les détruire/recréer + // à chaque rafraîchissement du modèle (toutes les 1s) - sans ça, + // un appui long en cours pouvait être annulé si la case sous le + // doigt/curseur disparaissait en pleine tempo (cause confirmée de + // la détection erratique de l'appui long, cf synthèse) : + reuseItems: true delegate: Rectangle { id: bouton_element @@ -398,6 +411,21 @@ Shipheart_page { MouseArea { anchors.fill: parent + + onPressed: { + interactionEnCours = true; + } + onReleased: { + interactionEnCours = false; + // Rafraîchissement immédiat, sans attendre le + // prochain cycle du minuteur (suspendu pendant + // l'interaction qui vient de se terminer) : + // if (id_groupe > 0) dataProvider.get_elements(domaine_actif, id_groupe); + } + onCanceled: { + interactionEnCours = false; + } + onClicked: { // Clic court : navigation vers la page de détail, // une par domaine (toutes construites maintenant). @@ -416,12 +444,15 @@ Shipheart_page { break; } } + onPressAndHold: { // Appui long : bascule marche/arrêt (circuits uniquement). if (domaine_actif === "circuits" && dataProvider.connecte) { var nouvelle_consigne = (model.consigne > 0) ? 0 : 100; dataProvider.set_circuit(model.id, nouvelle_consigne); } + interactionEnCours = false; + if (id_groupe > 0) dataProvider.get_elements(domaine_actif, id_groupe); } } }