refactor: decouper main_window.py en controllers/services/ui
main_window.py concentrait la fenetre principale, l'arbre des sessions, les 4 classes d'onglets, la detection de commandes ssh et le multi-send : 983 lignes et une seule classe qui pilotait toute l'application. - app/services/ssh_target.py : detection d'une cible ssh dans un terminal (pur, sans dependance Qt) - app/ui/tabs.py : BaseTerminalTab / SessionTabWidget / SFTPTabWidget / LocalTerminalTabWidget (deplaces tels quels) - app/controllers/session_controller.py : panneau lateral (arbre sessions + terminaux locaux) et CRUD des sessions - app/controllers/connection_controller.py : cycle de vie des onglets (ouverture, connexion rapide, renommage, fermeture) - app/controllers/broadcast_manager.py : bouton et logique du mode Multi-Send main_window.py ne fait plus que construire ces composants et les relier par signaux (983 -> ~200 lignes). Comportement inchange ; MainWindow.tabs et detect_ssh_target restent importables depuis app.main_window pour la compatibilite avec les tests existants. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
47
app/controllers/broadcast_manager.py
Normal file
47
app/controllers/broadcast_manager.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""Envoi simultane (« Multi-Send ") : une frappe faite dans un onglet terminal part
|
||||
aussi vers tous les autres onglets terminal ouverts, quand le mode est actif."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Callable, Iterable
|
||||
|
||||
from PySide6.QtCore import QObject
|
||||
from PySide6.QtWidgets import QToolButton, QWidget
|
||||
|
||||
|
||||
class BroadcastManager(QObject):
|
||||
"""Ne connait pas le QTabWidget : `tabs_provider` lui fournit les onglets courants,
|
||||
ce qui la garde independante de ConnectionController."""
|
||||
|
||||
def __init__(self, tabs_provider: Callable[[], Iterable[QWidget]], parent=None):
|
||||
super().__init__(parent)
|
||||
self._tabs_provider = tabs_provider
|
||||
|
||||
self.button = QToolButton()
|
||||
self.button.setText("⇉ Multi")
|
||||
self.button.setCheckable(True)
|
||||
self.button.setToolTip(
|
||||
"Envoi simultane : ce que vous tapez part vers tous les onglets terminal ouverts"
|
||||
)
|
||||
|
||||
@property
|
||||
def enabled(self) -> bool:
|
||||
return self.button.isChecked()
|
||||
|
||||
def register(self, tab) -> None:
|
||||
"""A appeler pour chaque nouvel onglet terminal (SSH ou local) susceptible
|
||||
d'emettre et de recevoir des donnees diffusees."""
|
||||
tab.terminal.data_to_send.connect(lambda data, source=tab: self._broadcast(data, source))
|
||||
|
||||
def _broadcast(self, data: bytes, source) -> None:
|
||||
if not self.enabled:
|
||||
return
|
||||
# import tardif : evite un cycle (app.ui.tabs importe des dialogues, pas ce module)
|
||||
from app.ui.tabs import BaseTerminalTab
|
||||
|
||||
for tab in self._tabs_provider():
|
||||
if tab is source or not isinstance(tab, BaseTerminalTab):
|
||||
continue
|
||||
if tab.connection:
|
||||
# on ecrit directement dans la connexion : passer par le terminal
|
||||
# relancerait la diffusion et boucherait a l'infini
|
||||
tab.connection.send(data)
|
||||
Reference in New Issue
Block a user