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]