Reduire la taille du formulaire de session (connexion rapide SFTP/SSH)
Some checks failed
CI / lint (push) Has been cancelled
CI / tests (push) Has been cancelled
CI / typecheck (push) Has been cancelled
CI / build (push) Has been cancelled

Signale par l'utilisateur : le dialogue de "SFTP sur cette connexion" ne
tenait pas sur l'ecran. Deux causes distinctes, verifiees par capture d'ecran
avant de conclure (rendu hors-ecran + grab()) :

1. Bug reel, dans les deux dialogues qui ont une section Bastion (SessionDialog
   et GroupSettingsDialog) : leur QStackedWidget reservait par defaut la
   hauteur de sa PLUS GRANDE page (Configuration manuelle, 5 champs) meme
   quand la page vide "Aucun" etait affichee - environ 200px de vide pur,
   visible sur la premiere capture. Nouveau app/ui/auto_height_stack.py
   (AutoHeightStackedWidget) : le sizeHint suit la page COURANTE, pas la plus
   grande de toutes: -186px des l'ouverture, a bastion desactive.

2. Choix d'ergonomie : une connexion rapide sert a aller vite (souvent un
   serveur de test en DHCP, cf. le README) - Bastion/Keepalive/Reconnexion y
   sont maintenant repliees par defaut derriere un bouton "Options
   avancees...", toujours accessibles mais qui n'allongent plus le dialogue
   pour le cas courant. Se deplient automatiquement si "Heriter du groupe"
   ramene un bastion herite, pour ne pas cacher un changement silencieux.
   Le dialogue complet ("Nouvelle session" depuis le panneau lateral) est
   inchange : tout reste visible d'emblee, c'est une operation reflechie, pas
   une connexion a la volee.

Resultat mesure : dialogue de connexion rapide 1026px -> 492px replie (-52%),
876px si depliees (au lieu de 1026, meme contenu, sans le vide). Le dialogue
"Nouvelle session" complet passe de meme a 816px grace au seul correctif (1).

tests/test_session_dialog_compact.py (5 verifications) : sizeHint de
AutoHeightStackedWidget sur la page courante, repli par defaut en connexion
rapide, redimensionnement au depli, absence de repli hors connexion rapide,
depli automatique sur heritage de groupe. Suite complete revalidee (35/35),
ruff propre.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Florian
2026-09-05 08:54:31 +02:00
parent a65b86e25b
commit ef059647fa
4 changed files with 195 additions and 7 deletions

View File

@@ -16,7 +16,6 @@ from PySide6.QtWidgets import (
QMessageBox,
QPushButton,
QSpinBox,
QStackedWidget,
QTextEdit,
QVBoxLayout,
QWidget,
@@ -41,6 +40,7 @@ from app.session_manager import (
Session,
SessionStore,
)
from app.ui.auto_height_stack import AutoHeightStackedWidget
class SessionDialog(QDialog):
@@ -147,9 +147,28 @@ class SessionDialog(QDialog):
self.form = form
layout.addLayout(form)
layout.addWidget(self._build_bastion_group())
layout.addWidget(self._build_keepalive_group())
layout.addWidget(self._build_reconnect_group())
advanced_container = QWidget()
advanced_layout = QVBoxLayout(advanced_container)
advanced_layout.setContentsMargins(0, 0, 0, 0)
advanced_layout.addWidget(self._build_bastion_group())
advanced_layout.addWidget(self._build_keepalive_group())
advanced_layout.addWidget(self._build_reconnect_group())
if self.quick_mode:
# Repliees par defaut : une connexion rapide sert avant tout a
# aller vite (souvent un serveur de test en DHCP) - bastion,
# keepalive et reconnexion restent accessibles sans allonger le
# dialogue pour le cas courant, ou ils ne servent pas.
self.advanced_toggle = QPushButton("▸ Options avancees (bastion, keepalive, reconnexion)")
self.advanced_toggle.setCheckable(True)
self.advanced_toggle.setFlat(True)
self.advanced_toggle.toggled.connect(self._on_advanced_toggled)
layout.addWidget(self.advanced_toggle)
advanced_container.setVisible(False)
layout.addWidget(advanced_container)
self.advanced_container = advanced_container
self.save_check = QCheckBox("Enregistrer dans mes sessions (optionnel)")
if self.quick_mode:
@@ -177,6 +196,14 @@ class SessionDialog(QDialog):
self.key_combo.addItem(self.session.key_path, self.session.key_path)
self.key_combo.setCurrentIndex(self.key_combo.count() - 1)
def _on_advanced_toggled(self, checked: bool) -> None:
self.advanced_container.setVisible(checked)
self.advanced_toggle.setText(
"▾ Options avancees (bastion, keepalive, reconnexion)" if checked
else "▸ Options avancees (bastion, keepalive, reconnexion)"
)
self.adjustSize()
def _reload_keys(self) -> None:
self.key_combo.clear()
for entry in self.key_manager.keys:
@@ -243,6 +270,11 @@ class SessionDialog(QDialog):
self.keepalive_interval_spin.setValue(settings.keepalive_interval or 30)
self.keepalive_count_spin.setValue(settings.keepalive_count_max or 3)
# les reglages avances viennent d'etre modifies : les montrer, sans quoi
# ils resteraient caches derriere le repli "Options avancees"
if self.quick_mode and not self.advanced_toggle.isChecked():
self.advanced_toggle.setChecked(True)
# ---------- Bastion / Jump Host ----------
def _build_bastion_group(self) -> QGroupBox:
"""Un seul saut pour l'instant (voir BastionConfig) : Aucun / une session
@@ -258,7 +290,7 @@ class SessionDialog(QDialog):
self.bastion_mode_combo.addItem("Configuration manuelle", BASTION_MANUAL)
v.addWidget(self.bastion_mode_combo)
self.bastion_stack = QStackedWidget()
self.bastion_stack = AutoHeightStackedWidget()
v.addWidget(self.bastion_stack)
self.bastion_stack.addWidget(QWidget()) # BASTION_NONE : rien a afficher