diff --git a/jlauncher/ui/main_window.py b/jlauncher/ui/main_window.py index d5bff34..20832de 100644 --- a/jlauncher/ui/main_window.py +++ b/jlauncher/ui/main_window.py @@ -31,7 +31,7 @@ WINDOW_TITLE = f"© 2026 {APP_NAME} — JailDesigner" CONSOLE_HEIGHT = 220 # alçada de la consola desplegada (px) CONSOLE_ANIM_MS = 220 # durada de l'animació de desplegar/replegar -CONSOLE_IDLE_MS = 1800 # marge sense activitat abans de replegar en mode auto +CONSOLE_IDLE_MS = 4000 # marge sense activitat abans de replegar en mode auto CONSOLE_SHOW = "show" CONSOLE_AUTO = "auto" @@ -133,9 +133,13 @@ class MainWindow(QMainWindow): def _setup_console(self) -> None: """Prepara la animació d'alçada i l'estat inicial segons console_mode.""" self._console_open = False + self._console_anim_start = 0 # alçada de consola en arrencar l'animació + self._console_win_start = 0 # alçada de finestra en arrencar l'animació + self._console_grow_window = True self._console_anim = QPropertyAnimation(self.log_view, b"maximumHeight", self) self._console_anim.setDuration(CONSOLE_ANIM_MS) self._console_anim.setEasingCurve(QEasingCurve.InOutCubic) + self._console_anim.valueChanged.connect(self._on_console_anim_value) self._console_anim.finished.connect(self._on_console_anim_done) # Timer que replega la consola en mode auto després d'un marge sense activitat. @@ -151,22 +155,43 @@ class MainWindow(QMainWindow): self._set_console_open(True, animated=False) def _set_console_open(self, open_: bool, animated: bool = True) -> None: + """Desplega/replega la consola fent créixer o encongir la finestra (perquè la + consola guanyi espai en comptes de menjar-ne a la llista).""" if open_ == self._console_open: return self._console_open = open_ + start = self.log_view.maximumHeight() target = CONSOLE_HEIGHT if open_ else 0 + # Si la finestra està maximitzada/pantalla completa no la podem fer créixer: + # caiem al comportament d'encongir la llista. + grow = not (self.isMaximized() or self.isFullScreen()) if open_: self.log_view.show() # visible abans d'animar l'obertura self._console_anim.stop() if not animated: + if grow: + self.resize(self.width(), self.height() + (target - start)) + self.log_view.setMinimumHeight(target) self.log_view.setMaximumHeight(target) if not open_: self.log_view.hide() return - self._console_anim.setStartValue(self.log_view.maximumHeight()) + self._console_grow_window = grow + self._console_anim_start = start + self._console_win_start = self.height() + self._console_anim.setStartValue(start) self._console_anim.setEndValue(target) self._console_anim.start() + def _on_console_anim_value(self, value: int) -> None: + """A cada pas: fixem l'alçada de la consola a `value` (min=max, perquè agafi + exactament aquest espai i no el cedeixi a la llista) i fem créixer/encongir la + finestra el mateix, així la llista (finestra − consola) es manté constant.""" + self.log_view.setMinimumHeight(value) + if self._console_grow_window: + delta = value - self._console_anim_start + self.resize(self.width(), self._console_win_start + delta) + def _on_console_anim_done(self) -> None: if not self._console_open: self.log_view.hide() # replegada del tot: treure-la del layout