Source code for napari_locan.widgets.widget_load

"""
Load SMLM data files.

A QWidget plugin to load SMLM data files into the SMLM data model.
A new SMLM dataset will be created.
"""

import ast
import logging
from pathlib import Path

import locan as lc
from napari.utils import progress
from napari.viewer import Viewer
from qtpy.QtWidgets import (
    QComboBox,
    QFileDialog,
    QHBoxLayout,
    QLabel,
    QLineEdit,
    QPushButton,
    QVBoxLayout,
    QWidget,
)

from napari_locan import smlm_data
from napari_locan.data_model.smlm_data import SmlmData

logger = logging.getLogger(__name__)


[docs] class LoadQWidget(QWidget): # type: ignore def __init__(self, napari_viewer: Viewer, smlm_data: SmlmData = smlm_data): super().__init__() self.viewer = napari_viewer self.smlm_data = smlm_data self._add_file_type() self._add_file_path() self._add_kwargs_edit() self._add_buttons() self._set_layout() def _add_file_type(self) -> None: self._file_type_label = QLabel("File type:") self._file_type_combobox = QComboBox() file_types = [ type_.name for type_ in lc.FileType if type_.name != lc.FileType.UNKNOWN_FILE_TYPE.name ] self._file_type_combobox.addItems(file_types) self._file_type_combobox.setCurrentText(lc.FileType.RAPIDSTORM.name) self._file_type_layout = QHBoxLayout() self._file_type_layout.addWidget(self._file_type_label) self._file_type_layout.addWidget(self._file_type_combobox) def _add_file_path(self) -> None: self._file_path_label = QLabel("File path:") self._file_path_edit = QLineEdit() self._file_path_select_button = QPushButton("Select") self._file_path_select_button.setToolTip("Select a file path.") self._file_path_select_button.clicked.connect( self._file_path_select_button_on_click ) self._file_path_delete_button = QPushButton("Delete") self._file_path_delete_button.setToolTip("Clear the file path.") self._file_path_delete_button.clicked.connect( self._file_path_delete_button_on_click ) self._file_path_layout = QHBoxLayout() self._file_path_layout.addWidget(self._file_path_label) self._file_path_layout.addWidget(self._file_path_edit) self._file_path_layout.addWidget(self._file_path_select_button) self._file_path_layout.addWidget(self._file_path_delete_button) def _add_kwargs_edit(self) -> None: self._kwargs_edit_label = QLabel("**kwargs:") self._kwargs_edit = QLineEdit() self._kwargs_edit.setToolTip("Add kwargs for load function like 'nrows=10'.") self._kwargs_edit_layout = QHBoxLayout() self._kwargs_edit_layout.addWidget(self._kwargs_edit_label) self._kwargs_edit_layout.addWidget(self._kwargs_edit) def _add_buttons(self) -> None: self._load_button = QPushButton("Load File") self._load_button.setToolTip("Load the selected file as new SMLM dataset.") self._load_button.clicked.connect(self._load_button_on_click) def _set_layout(self) -> None: layout = QVBoxLayout() layout.addLayout(self._file_type_layout) layout.addLayout(self._file_path_layout) layout.addLayout(self._kwargs_edit_layout) layout.addWidget(self._load_button) self.setLayout(layout) def _file_path_select_button_on_click(self) -> None: fname_ = QFileDialog.getOpenFileName( None, "message", "", filter="", # kwargs: parent, message, directory, filter # but kw_names are different for different qt_bindings ) fname = fname_[0] if isinstance(fname_, tuple) else str(fname_) self._file_path_edit.setText(fname) def _file_path_delete_button_on_click(self) -> None: self._file_path_edit.clear() def _load_button_on_click(self) -> None: if not self._file_path_edit.text(): self._file_path_select_button_on_click() else: fname_ = QFileDialog.getOpenFileName( None, "message", self._file_path_edit.text(), filter="", # kwargs: parent, message, directory, filter # but kw_names are different for different qt_bindings ) fname = fname_[0] if isinstance(fname_, tuple) else str(fname_) self._file_path_edit.setText(fname) file_path = self._file_path_edit.text() file_type = self._file_type_combobox.currentText() text = self._kwargs_edit.text() expr = ast.parse(f"dict({text}\n)", mode="eval") kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.body.keywords} # type: ignore with progress() as progress_bar: progress_bar.set_description("Loading data") locdata = lc.load_locdata(path=file_path, file_type=file_type, **kwargs) locdata_name = locdata.meta.identifier + "-" + str(Path(file_path).name) self.smlm_data.append_item(locdata=locdata, locdata_name=locdata_name)