from __future__ import annotations from app.qt_compat import QHBoxLayout, QInputDialog, QListWidget, QListWidgetItem, QMessageBox, QPushButton, Qt, QVBoxLayout, QWidget from app.ui.section_panel import SectionPanel class PresetBrowser(QWidget): def __init__(self, controller, parent: QWidget | None = None) -> None: super().__init__(parent) self.controller = controller layout = QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) group = SectionPanel("Presets") group_layout = QVBoxLayout(group.body) group_layout.setContentsMargins(12, 12, 12, 12) group_layout.setSpacing(8) self.list_widget = QListWidget() self.list_widget.itemDoubleClicked.connect(self._load_selected) group_layout.addWidget(self.list_widget, 1) button_row = QHBoxLayout() self.save_button = QPushButton("Save Current") self.load_button = QPushButton("Load") self.delete_button = QPushButton("Delete") button_row.addWidget(self.save_button) button_row.addWidget(self.load_button) button_row.addWidget(self.delete_button) group_layout.addLayout(button_row) layout.addWidget(group) self.save_button.clicked.connect(self._save_current) self.load_button.clicked.connect(self._load_selected) self.delete_button.clicked.connect(self._delete_selected) self.controller.presets_changed.connect(self.refresh) self.refresh() def refresh(self) -> None: self.list_widget.clear() for preset in self.controller.available_presets(): item = QListWidgetItem(preset.name) item.setToolTip(f"{preset.pattern_id}\nPalette: {preset.palette}") self.list_widget.addItem(item) def _selected_name(self) -> str | None: item = self.list_widget.currentItem() return item.text() if item else None def _save_current(self) -> None: name, ok = QInputDialog.getText(self, "Save Preset", "Preset name:") if ok and name.strip(): self.controller.save_current_preset(name.strip()) self.refresh() def _load_selected(self, *_args) -> None: name = self._selected_name() if name: self.controller.apply_preset(name) def _delete_selected(self) -> None: name = self._selected_name() if not name: return confirm = QMessageBox.question( self, "Delete Preset", f"Delete preset '{name}'?", QMessageBox.Yes | QMessageBox.No, ) if confirm == QMessageBox.Yes: self.controller.delete_preset(name) self.refresh()