gestion_table_tournante_libre/src/interface/primitives/geste.js

64 lines
2.1 KiB
JavaScript
Raw Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Le geste qu'une primitive tient ouvert sur la séance (§ 8.4) : une saisie
// non validée, une fenêtre à confirmer ouverte. Un geste compté par la
// séance suspend son compte d'inactivité, qui ne la ramène pas en lecture
// sous l'opérateur.
//
// Le geste ne se compte qu'en écriture, seul mode où le compte d'inactivité
// court. Le retour en lecture, explicite ou à la fermeture de l'événement,
// remet le compte de la séance à zéro et l'annonce par surAnnulation : le
// geste n'est plus compté, et finirGeste n'est pas appelé pour lui — il
// retirerait le geste d'une autre primitive. Le retour automatique n'a lieu
// que sans geste compté. Le passage en écriture suivant, que subscribe
// publie, recompte le geste que la primitive tient encore.
/**
* Le geste d'une primitive sur une séance.
*
* @param {{subscribe: Function, surAnnulation: Function, debuterGeste: Function, finirGeste: Function}} seance
* @returns {{tenir: (voulu: boolean) => void, liberer: () => void}}
* tenir(voulu) dit si la primitive tient le geste ouvert ; liberer, au
* démontage, finit le geste compté et désabonne.
*/
export function creerGeste(seance) {
// voulu : la primitive tient le geste ; compte : la séance le compte ;
// ecriture : le mode publié en dernier, ou annoncé quitté.
let voulu = false;
let compte = false;
let ecriture = false;
function ajuster() {
if (voulu && ecriture && !compte) {
compte = true;
seance.debuterGeste();
} else if (!voulu && compte) {
compte = false;
seance.finirGeste();
}
}
const desabonnerEtat = seance.subscribe((etat) => {
ecriture = etat.mode === 'ecriture';
ajuster();
});
const desabonnerAnnulation = seance.surAnnulation(() => {
ecriture = false;
compte = false;
});
return {
tenir(nouveau) {
voulu = nouveau;
ajuster();
},
liberer() {
voulu = false;
ajuster();
desabonnerEtat();
desabonnerAnnulation();
},
};
}