| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | import pathlib |
| | from typing import Optional, List, Type, Iterable |
| | from PySide.QtWidgets import QFileDialog, QMessageBox |
| | from ...assets import AssetSerializer |
| | from ...assets.ui.util import ( |
| | make_import_filters, |
| | get_serializer_from_extension, |
| | ) |
| | from ..models.base import ToolBit |
| | from ..serializers import all_serializers |
| |
|
| |
|
| | class ToolBitOpenDialog(QFileDialog): |
| | def __init__( |
| | self, |
| | serializers: Iterable[Type[AssetSerializer]] | None, |
| | parent=None, |
| | ): |
| | super().__init__(parent) |
| | self.serializers = list(serializers) if serializers else all_serializers |
| | self.setWindowTitle("Open ToolBit(s)") |
| | self.setFileMode(QFileDialog.ExistingFiles) |
| | filters = make_import_filters(self.serializers) |
| | self.setNameFilters(filters) |
| | if filters: |
| | self.selectNameFilter(filters[0]) |
| |
|
| | def _deserialize_selected_file(self, file_path: pathlib.Path) -> Optional[ToolBit]: |
| | """Deserialize the selected file using the appropriate serializer.""" |
| | file_extension = file_path.suffix.lower() |
| | serializer_class = get_serializer_from_extension( |
| | self.serializers, file_extension, for_import=True |
| | ) |
| | if not serializer_class: |
| | QMessageBox.critical( |
| | self, |
| | "Error", |
| | f"No supported serializer found for file extension '{file_extension}'", |
| | ) |
| | return None |
| | try: |
| | raw_data = file_path.read_bytes() |
| | toolbit = serializer_class.deep_deserialize(raw_data) |
| | if not isinstance(toolbit, ToolBit): |
| | raise TypeError("Deserialized asset is not of type ToolBit") |
| | return toolbit |
| | except Exception as e: |
| | QMessageBox.critical(self, "Error", f"Failed to import toolbit: {e}") |
| | return None |
| |
|
| | def exec(self) -> List[ToolBit]: |
| | toolbits = [] |
| | if super().exec_(): |
| | filenames = self.selectedFiles() |
| | for filename in filenames: |
| | file_path = pathlib.Path(filename) |
| | toolbit = self._deserialize_selected_file(file_path) |
| | if toolbit: |
| | toolbits.append(toolbit) |
| | return toolbits |
| |
|