Correction de la fiabilité de l'appui long (bascule circuit) : suspension du rafraîchissement périodique pendant l'interaction, reprise immédiate dès la bascule reconnue plutôt qu'au relâchement

This commit is contained in:
2026-08-27 16:57:00 +02:00
parent 2810a53c90
commit 336229c499
+33 -2
View File
@@ -1,4 +1,4 @@
import QtQuick 2.12 import QtQuick 2.15
import QtQuick.Controls 2.12 import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12 import QtQuick.Layouts 1.12
@@ -25,6 +25,13 @@ import "responsive.js" as Responsive
Shipheart_page { Shipheart_page {
id: page_accueil 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: ["circuits", "batteries", "capteurs", "reservoirs"]
readonly property var domaines_libelles: [qsTr("Circuits"), qsTr("Batteries"), qsTr("Capteurs"), qsTr("Réservoirs")] readonly property var domaines_libelles: [qsTr("Circuits"), qsTr("Batteries"), qsTr("Capteurs"), qsTr("Réservoirs")]
property int domaine_actif_index: 0 property int domaine_actif_index: 0
@@ -186,7 +193,7 @@ Shipheart_page {
repeat: true repeat: true
onTriggered: { onTriggered: {
dataProvider.get_familles(domaine_actif); 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 model: modele_elements_actuel
clip: true clip: true
opacity: dataProvider.connecte ? 1.0 : 0.45 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 { delegate: Rectangle {
id: bouton_element id: bouton_element
@@ -398,6 +411,21 @@ Shipheart_page {
MouseArea { MouseArea {
anchors.fill: parent 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: { onClicked: {
// Clic court : navigation vers la page de détail, // Clic court : navigation vers la page de détail,
// une par domaine (toutes construites maintenant). // une par domaine (toutes construites maintenant).
@@ -416,12 +444,15 @@ Shipheart_page {
break; break;
} }
} }
onPressAndHold: { onPressAndHold: {
// Appui long : bascule marche/arrêt (circuits uniquement). // Appui long : bascule marche/arrêt (circuits uniquement).
if (domaine_actif === "circuits" && dataProvider.connecte) { if (domaine_actif === "circuits" && dataProvider.connecte) {
var nouvelle_consigne = (model.consigne > 0) ? 0 : 100; var nouvelle_consigne = (model.consigne > 0) ? 0 : 100;
dataProvider.set_circuit(model.id, nouvelle_consigne); dataProvider.set_circuit(model.id, nouvelle_consigne);
} }
interactionEnCours = false;
if (id_groupe > 0) dataProvider.get_elements(domaine_actif, id_groupe);
} }
} }
} }