"""Gestionnaire de workspaces : creer, enregistrer, ouvrir, renommer, supprimer.""" from __future__ import annotations from PySide6.QtCore import Qt from PySide6.QtWidgets import ( QCheckBox, QDialog, QHBoxLayout, QInputDialog, QLabel, QListWidget, QListWidgetItem, QMessageBox, QPushButton, QVBoxLayout, ) from app.app_settings import get_setting, set_setting from app.controllers.workspace_manager import SETTING_RESTORE_ON_STARTUP, WorkspaceManager class WorkspaceDialog(QDialog): def __init__(self, manager: WorkspaceManager, parent=None): super().__init__(parent) self.manager = manager self.setWindowTitle("Workspaces") self.setMinimumSize(480, 360) layout = QVBoxLayout(self) info = QLabel( "Un workspace enregistre les onglets ouverts (sessions, terminaux locaux, " "splits) pour les retrouver plus tard. Aucun mot de passe n'y est stocke : " "il sera redemande a l'ouverture si necessaire." ) info.setWordWrap(True) layout.addWidget(info) self.list = QListWidget() layout.addWidget(self.list) btn_row = QHBoxLayout() self.new_btn = QPushButton("Nouveau (etat actuel)...") self.save_btn = QPushButton("Enregistrer (ecraser)") self.open_btn = QPushButton("Ouvrir") self.rename_btn = QPushButton("Renommer...") self.delete_btn = QPushButton("Supprimer") for b in (self.new_btn, self.save_btn, self.open_btn, self.rename_btn, self.delete_btn): btn_row.addWidget(b) layout.addLayout(btn_row) self.restore_check = QCheckBox("Restaurer automatiquement le dernier workspace ouvert au demarrage") self.restore_check.setChecked(bool(get_setting(SETTING_RESTORE_ON_STARTUP, False))) self.restore_check.toggled.connect(lambda checked: set_setting(SETTING_RESTORE_ON_STARTUP, checked)) layout.addWidget(self.restore_check) close_row = QHBoxLayout() close_row.addStretch() close_btn = QPushButton("Fermer") close_btn.clicked.connect(self.accept) close_row.addWidget(close_btn) layout.addLayout(close_row) self.new_btn.clicked.connect(self.create_new) self.save_btn.clicked.connect(self.save_over_selected) self.open_btn.clicked.connect(self.open_selected) self.rename_btn.clicked.connect(self.rename_selected) self.delete_btn.clicked.connect(self.delete_selected) self.list.itemDoubleClicked.connect(lambda _item: self.open_selected()) self.list.currentItemChanged.connect(self._update_buttons) manager.workspaces_changed.connect(self.refresh) self.refresh() def refresh(self) -> None: self.list.clear() for workspace in self.manager.store.workspaces: item = QListWidgetItem(f"{workspace.name or '(sans nom)'} — {len(workspace.tabs)} onglet(s)") item.setData(Qt.UserRole, workspace.id) self.list.addItem(item) self._update_buttons() def _current_id(self) -> str | None: item = self.list.currentItem() return item.data(Qt.UserRole) if item else None def _update_buttons(self) -> None: has_selection = self._current_id() is not None for b in (self.save_btn, self.open_btn, self.rename_btn, self.delete_btn): b.setEnabled(has_selection) def create_new(self) -> None: name, ok = QInputDialog.getText(self, "Nouveau workspace", "Nom du workspace :") if not ok or not name.strip(): return self.manager.save_as_new(name.strip()) def save_over_selected(self) -> None: workspace_id = self._current_id() if not workspace_id: return workspace = self.manager.store.get(workspace_id) name = workspace.name if workspace else "" if QMessageBox.question( self, "Enregistrer", f"Remplacer le contenu du workspace « {name} » par les onglets actuellement ouverts ?", ) != QMessageBox.Yes: return self.manager.save_over(workspace_id) def open_selected(self) -> None: workspace_id = self._current_id() if not workspace_id: return workspace = self.manager.store.get(workspace_id) if not workspace: return skipped = self.manager.restore(workspace) if skipped: QMessageBox.information( self, "Restauration partielle", f"{skipped} element(s) n'ont pas pu etre restaures (session supprimee depuis).", ) def rename_selected(self) -> None: workspace_id = self._current_id() if not workspace_id: return workspace = self.manager.store.get(workspace_id) name, ok = QInputDialog.getText( self, "Renommer", "Nouveau nom :", text=workspace.name if workspace else "", ) if ok and name.strip(): self.manager.rename(workspace_id, name.strip()) def delete_selected(self) -> None: workspace_id = self._current_id() if not workspace_id: return workspace = self.manager.store.get(workspace_id) name = workspace.name if workspace else "" if QMessageBox.question(self, "Supprimer", f"Supprimer le workspace « {name} » ?") == QMessageBox.Yes: self.manager.delete(workspace_id)