"""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)