Source code for devctrl.gui.task.preset
"""Load/Save tasks as presets."""
from PyQt6.QtCore import pyqtSignal
from PyQt6.QtWidgets import QWidget, QListWidget, QTableWidget, QTableWidgetItem, QVBoxLayout
from ...task.preset import TaskPresetManager, TaskPreset, Task
from typing import TypeVar, Generic, Optional
T = TypeVar("T", bound=Task)
import logging
log = logging.getLogger(__name__)
[docs]
class TaskPresetListWidget(QWidget, Generic[T]):
"""Show task presets in a list and return the selected item.
The presets are loaded when the widget is initialized and not updated.
:param mgr: The task preset manager to get the presets from.
:param filter_type: Optional task type to use filter.
"""
selectionChanged = pyqtSignal()
[docs]
def __init__(self, mgr: TaskPresetManager, filter_type: Optional[type[T]]=None, parent=None):
super().__init__(parent)
self.mgr = mgr
self.filter_type = filter_type
self.l_main = QVBoxLayout()
self.setLayout(self.l_main)
self.w_list = QTableWidget()
self.w_list.setColumnCount(2)
self.w_list.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
self.w_list.setHorizontalHeaderLabels([self.tr("Name"), self.tr("Type")])
self.l_main.addWidget(self.w_list)
self.w_list.currentCellChanged.connect(self._on_cell_changed)
self.presets = mgr.get_presets(self.filter_type)
log.debug(f"Found {len(self.presets)} presets for filter '{self.filter_type}'.")
for i, p in enumerate(self.presets):
item_name = QTableWidgetItem(p.name)
item_type = QTableWidgetItem(p.task_type.__name__)
self.w_list.insertRow(i)
self.w_list.setItem(i, 0, item_name)
self.w_list.setItem(i, 1, item_type)
self.w_list.resizeColumnsToContents()
[docs]
def _on_cell_changed(self, old_row, old_col, new_row, new_col):
"""Emit selectionChanged when the row has changed."""
if old_row == new_row:
return
self.selectionChanged.emit()
[docs]
def get_seleced_preset(self) -> TaskPreset[T]|None:
"""Return the currently selected preset."""
row = self.w_list.currentRow()
if row < 0 or len(self.presets) <= row:
return None
return self.presets[row]