Source code for darfix.gui.utils.fileselection
from __future__ import annotations
from silx.gui import qt
[docs]class FileSelector(qt.QWidget):
"""Widget to select a file"""
sigFileChanged = qt.Signal()
def __init__(
self,
parent: qt.QWidget | None = None,
label: str = "file:",
filters=None,
) -> None:
super().__init__(parent)
self._dialogFileMode = qt.QFileDialog.AnyFile
self._dialogNameFilters = None # ["HDF5 file *.h5 *.hdf5 *.nx *.nexus", "nxs"]
self.setLayout(qt.QHBoxLayout())
# label
self._label = qt.QLabel(text=label)
self.layout().addWidget(self._label)
# file path QLE and completer
self._filePath = qt.QLineEdit("")
self.layout().addWidget(self._filePath)
self.completer = qt.QCompleter()
model = qt.QDirModel(self.completer)
if filters is not None:
model.setFilter(filters)
self.completer.setModel(model)
self._filePath.setCompleter(self.completer)
# select button
self._select = qt.QPushButton("select")
self.layout().addWidget(self._select)
# connect signal / slot
self._select.released.connect(self._selectFile)
self._filePath.editingFinished.connect(self.sigFileChanged)
[docs] def setDialogFileMode(self, mode: qt.Qt.FileDialog):
self._dialogFileMode = mode
[docs] def setDialogNameFilters(self, name_filters: tuple | None):
self._dialogNameFilters = name_filters
def _selectFile(self):
dialog = qt.QFileDialog(self)
dialog.setFileMode(self._dialogFileMode)
if self._dialogNameFilters is not None:
dialog.setNameFilters(self._dialogNameFilters)
if not dialog.exec_():
return
if len(dialog.selectedFiles()) > 0:
self.setFilePath(dialog.selectedFiles()[0])
[docs] def getFilePath(self) -> None | str:
file_path = self._filePath.text()
if file_path.replace(" ", "") != "":
return file_path
else:
return None
[docs] def setFilePath(self, file_path: None | str) -> None:
if file_path is None:
self._filePath.clear()
else:
self._filePath.setText(file_path)
self.sigFileChanged.emit()