64 lines
2.1 KiB
JavaScript
64 lines
2.1 KiB
JavaScript
|
|
// © 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();
|
||
|
|
},
|
||
|
|
};
|
||
|
|
}
|