76 lines
2.7 KiB
Python
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()
|