fix(ui): plus d'abort à l'arrêt, et temps restant de l'accès (v0.8.7)

prepare_quit() attend les threads en cours avant toute destruction, mais sa
liste en oubliait deux : le sondage d'état ajouté en 0.8.6 — ma régression —
et le thread de validation de la fenêtre de saisie, parenté à cette fenêtre
depuis la v0.8.2 et jamais attendu. Fermer la fenêtre de code pendant qu'une
requête est en vol suffisait à avorter le process, ce qui arrive dès que le
serveur tarde. Reproduit avec un serveur qui accepte sans jamais répondre,
puis vérifié corrigé sur les deux chemins.

Le sondage est ramené à 4 s : l'arrêt l'attend désormais, et dix secondes y
seraient une interface figée. Son échec ne coûte rien, contrairement à une
validation ratée qui gâche un code déjà saisi.

Ajoute le temps restant sur la ligne Accès distant, et un repli pour les
serveurs sans GET /api/session : sur un 404, le client observe si le trafic
atteint le réseau distant plutôt que de réclamer un code déjà validé. Un 403
reste une réponse qui fait autorité.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 22:33:41 +02:00
co-authored by Claude Opus 5
parent 306e512aab
commit a056ad260a
8 changed files with 116 additions and 7 deletions
+16
View File
@@ -234,6 +234,22 @@ class AccessCodeDialog(QDialog):
self._btn_ok.setText("Vérification…" if busy else "Valider")
self._code_input.setEnabled(not busy)
def wait_for_worker(self, msecs: int) -> None:
"""Attend la fin de la requête en cours, s'il y en a une.
Le worker est parenté à cette fenêtre : la détruire pendant qu'il
tourne encore avorte le process (« QThread: Destroyed while thread is
still running »). La fenêtre survit à sa propre fermeture — elle est
parentée à la fenêtre principale — donc le moment critique est l'arrêt
de l'application, qui appelle ceci avant que quoi que ce soit ne soit
détruit.
"""
try:
if self._worker is not None and self._worker.isRunning():
self._worker.wait(msecs)
except RuntimeError:
pass # objet Qt déjà détruit
def message(self) -> str:
return self._message