Files
RFP_Infinity-Vis/app/ui/preset_browser.py

76 lines
2.7 KiB
Python

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