feat: ajouter les Snippets de commandes
Bibliotheque de commandes organisee par categories (Linux/Docker/Proxmox fournis en exemples au premier lancement, librement modifiables), avec recherche. - app/snippets.py : Snippet/SnippetStore, meme pattern que les autres stores (JSON atomique, schema_version). - SnippetManagerDialog : creer/modifier/supprimer/rechercher, regroupe par categorie. - Integration terminal : le dernier commit du depot a delibrement fait du clic droit un raccourci de collage (style terminal Unix), sans menu contextuel. Plutot que d'ecraser ce choix recent, les snippets passent par un bouton dedie "📋 Snippets" dans la barre de l'onglet (SessionTabWidget et LocalTerminalTabWidget), avec un menu Categorie -> Snippet -> Action (Inserer dans le terminal / Executer / Executer avec Multi-Send). "Inserer" n'envoie jamais Entree (le texte est ecrit, a l'utilisateur de valider) ; seul "Executer" l'ajoute. - BroadcastManager.broadcast_now() : diffusion explicite et ponctuelle vers tous les terminaux, independante de l'etat du bouton Multi (utilisee par "Executer avec Multi-Send", qui est une action volontaire et pas une frappe clavier a relayer). - La construction du menu (_build_snippets_menu) est separee de son affichage (_show_snippets_menu) : testable sans declencher l'appel bloquant menu.exec(). tests/test_snippets.py : stockage (CRUD, recherche, categories, persistance) et integration terminal (inserer/executer/multi-send, construction et declenchement du menu), avec LocalTerminalConnection.start() neutralisee. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -30,12 +30,14 @@ class ConnectionController(QObject):
|
||||
session_store: SessionStore,
|
||||
key_manager: KeyManager,
|
||||
broadcast: BroadcastManager,
|
||||
snippet_store=None,
|
||||
parent_widget: QWidget | None = None,
|
||||
):
|
||||
super().__init__(parent_widget)
|
||||
self.session_store = session_store
|
||||
self.key_manager = key_manager
|
||||
self.broadcast = broadcast
|
||||
self.snippet_store = snippet_store
|
||||
self._parent_widget = parent_widget
|
||||
|
||||
self.tabs = QTabWidget(parent_widget)
|
||||
@@ -85,7 +87,10 @@ class ConnectionController(QObject):
|
||||
ok, secret = self._ask_session_password(session)
|
||||
if not ok:
|
||||
return None
|
||||
return SessionTabWidget(session, secret, bastion_target=bastion_target, bastion_password=bastion_password)
|
||||
return SessionTabWidget(
|
||||
session, secret, bastion_target=bastion_target, bastion_password=bastion_password,
|
||||
snippet_store=self.snippet_store, broadcast=self.broadcast,
|
||||
)
|
||||
|
||||
def build_sftp_tab(self, session: Session) -> SFTPTabWidget | None:
|
||||
ok, bastion_target, bastion_password = self._resolve_bastion(session)
|
||||
@@ -126,7 +131,7 @@ class ConnectionController(QObject):
|
||||
def new_local_terminal(self, shell: str = DEFAULT_SHELL) -> LocalTerminalTabWidget:
|
||||
"""Cree un terminal local cable (multi-send, SFTP detecte), sans l'ajouter
|
||||
au QTabWidget : reutilise pour un onglet normal comme pour un panneau."""
|
||||
tab = LocalTerminalTabWidget(shell)
|
||||
tab = LocalTerminalTabWidget(shell, snippet_store=self.snippet_store, broadcast=self.broadcast)
|
||||
tab.sftp_requested.connect(self.quick_sftp)
|
||||
self.broadcast.register(tab)
|
||||
return tab
|
||||
|
||||
Reference in New Issue
Block a user