fix(ui): mesurer la fenêtre après remise à plat des layouts (v0.8.3)

Le bouton « Saisir le code d'accès » était créé et placé, mais sous le bord
inférieur : rendre un widget visible ne met pas les layouts à jour dans la
foulée — Qt poste un LayoutRequest traité au tour de boucle suivant. La
fenêtre, de hauteur fixe recalculée à chaque changement de contenu, se
mesurait avant ce traitement et obtenait une hauteur en retard d'un cycle.

Le symptôme était déjà visible dans les tests de la v0.8.2 : la hauteur
montait bien de 258 à 298 px à l'apparition du bouton, mais ne redescendait
jamais à sa disparition. J'avais mis cette asymétrie sur le compte du
backend graphique de test au lieu d'y voir le retard lui-même.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-06 13:55:55 +02:00
co-authored by Claude Opus 5
parent 996bbe240d
commit 1e015b5a1f
6 changed files with 29 additions and 9 deletions
+7
View File
@@ -6,6 +6,13 @@ Ce projet suit le [Versionnage Sémantique](https://semver.org/lang/fr/).
--- ---
## [0.8.3] — 2026-09-06
### Corrigé
- **Le bouton « Saisir le code d'accès » n'apparaissait pas**, alors même que la ligne *Accès distant* indiquait la quarantaine. Il était bien créé et placé dans le layout, mais sous le bord inférieur d'une fenêtre restée à sa hauteur précédente. Rendre un widget visible ne met pas les layouts à jour immédiatement : Qt poste un `LayoutRequest` traité au tour de boucle suivant, et la fenêtre — de hauteur fixe, recalculée à chaque changement de contenu — se mesurait avant ce traitement, obtenant une hauteur en retard d'un cycle. Les layouts sont désormais remis à plat explicitement avant toute mesure. Corrige du même coup le repli du détail, qui souffrait du même retard sans que cela se voie.
---
## [0.8.2] — 2026-09-06 ## [0.8.2] — 2026-09-06
### Corrigé ### Corrigé
+1 -1
View File
@@ -4,7 +4,7 @@
## ────────────────────────────────────────────── ## ──────────────────────────────────────────────
APP := wgsecure APP := wgsecure
VERSION := 0.8.2 VERSION := 0.8.3
VENV := .venv VENV := .venv
PYTHON := $(VENV)/bin/python3 PYTHON := $(VENV)/bin/python3
PIP := $(VENV)/bin/pip PIP := $(VENV)/bin/pip
+1 -1
View File
@@ -1,6 +1,6 @@
# 🛡️ WGSecure (WGS) # 🛡️ WGSecure (WGS)
🚀 v0.8.2 · 🐍 · 🪟🐧 · 🔐 Accès validé par le serveur · 🛡️ WireGuard 🚀 v0.8.3 · 🐍 · 🪟🐧 · 🔐 Accès validé par le serveur · 🛡️ WireGuard
**WGSecure** est une interface graphique multiplateforme (Windows & Linux) pour gérer une connexion WireGuard dont l'accès aux ressources distantes est ouvert par un code à 6 chiffres validé **par le serveur**. **WGSecure** est une interface graphique multiplateforme (Windows & Linux) pour gérer une connexion WireGuard dont l'accès aux ressources distantes est ouvert par un code à 6 chiffres validé **par le serveur**.
+1 -1
View File
@@ -1,3 +1,3 @@
__version__ = "0.8.2" __version__ = "0.8.3"
APP_NAME = "WGSecure" APP_NAME = "WGSecure"
APP_SHORT = "WGS" APP_SHORT = "WGS"
+18 -5
View File
@@ -1,11 +1,12 @@
from __future__ import annotations from __future__ import annotations
from PyQt6.QtWidgets import ( from PyQt6.QtWidgets import (
QApplication,
QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QPushButton, QFrame, QMessageBox, QInputDialog, QLabel, QPushButton, QFrame, QMessageBox, QInputDialog,
QLineEdit, QListWidget, QListWidgetItem, QLineEdit, QListWidget, QListWidgetItem,
QComboBox, QComboBox,
) )
from PyQt6.QtCore import Qt, QTimer, QDateTime from PyQt6.QtCore import Qt, QTimer, QDateTime, QEvent
from PyQt6.QtGui import QFont, QCloseEvent, QColor from PyQt6.QtGui import QFont, QCloseEvent, QColor
from app.core.config import Config from app.core.config import Config
@@ -373,13 +374,25 @@ class MainWindow(QMainWindow):
"""Réajuste la hauteur fixe de la fenêtre à son contenu visible. """Réajuste la hauteur fixe de la fenêtre à son contenu visible.
La fenêtre reste de taille fixe (pas de redimensionnement manuel), La fenêtre reste de taille fixe (pas de redimensionnement manuel),
mais cette taille change avec le repli/dépli du détail — il faut mais cette taille change avec le repli/dépli du détail et avec
donc lever la contrainte précédente avant de laisser le layout l'apparition du bouton de code d'accès — il faut donc lever la
recalculer sa hauteur naturelle, puis la reverrouiller. contrainte précédente avant de laisser le layout recalculer sa
hauteur naturelle, puis la reverrouiller.
Le rendre visible ne suffit pas à mettre les layouts à jour : Qt
poste un `LayoutRequest` traité au tour de boucle suivant, et
mesurer avant ce traitement rend une hauteur en retard d'un cycle.
La fenêtre gardait alors sa taille précédente et rognait le widget
qui venait d'apparaître — le bouton « Saisir le code d'accès »
existait, mais sous le bord inférieur. D'où la remise à plat
explicite des layouts avant toute mesure.
""" """
self.setMinimumHeight(0) self.setMinimumHeight(0)
self.setMaximumHeight(16777215) self.setMaximumHeight(16777215)
self.centralWidget().adjustSize() central = self.centralWidget()
QApplication.sendPostedEvents(None, QEvent.Type.LayoutRequest)
central.layout().activate()
central.adjustSize()
self.adjustSize() self.adjustSize()
self.setFixedHeight(self.sizeHint().height()) self.setFixedHeight(self.sizeHint().height())
+1 -1
View File
@@ -5,7 +5,7 @@
; ────────────────────────────────────────────── ; ──────────────────────────────────────────────
#define MyAppName "WGSecure" #define MyAppName "WGSecure"
#define MyAppVersion "0.8.2" #define MyAppVersion "0.8.3"
#define MyAppPublisher "WGSecure" #define MyAppPublisher "WGSecure"
#define MyAppExeName "wgsecure.exe" #define MyAppExeName "wgsecure.exe"