Source code for schrodinger.ui.qt.directory_selector
"""
Module containing DirectorySelector. The widget's directory selection can be obtained by
mapping the widget to a param or alternatively by connecting a slot to the
directoryChanged signal.
To use without mapping, hook up the directoryChanged signal to a
slot that calls `DirectorySelector.getDirPath()`.
"""
from typing import Optional
from schrodinger.models import mappers
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.ui.qt import basewidgets
from schrodinger.ui.qt import filedialog
[docs]class DirectorySelector(mappers.TargetMixin, basewidgets.BaseWidget):
"""
Widget for showing an entry field and a browse button to let the user
specify a single directory.
:cvar directoryChanged: Signal emitted when the directory selection changes.
:vartype directoryChanged: QtCore.pyqtSignal
"""
directoryChanged = QtCore.pyqtSignal()
[docs] def __init__(self,
parent: Optional[QtWidgets.QWidget] = None,
initial_dir: Optional[str] = None):
"""
:param parent: Parent widget.
:param initial_dir: Initial directory. Default is CWD.
"""
self._initial_dir = initial_dir
super().__init__(parent)
self.setLabelText('Directory location:')
[docs] def initSetUp(self):
super().initSetUp()
self.dir_lbl = QtWidgets.QLabel()
self.dir_le = QtWidgets.QLineEdit()
self.dir_le.editingFinished.connect(self._dirPathEdited)
self.dir_browse_btn = QtWidgets.QPushButton("Browse...")
self.dir_browse_btn.clicked.connect(self._browseDir)
[docs] def initLayOut(self):
super().initLayOut()
self.dir_layout = QtWidgets.QHBoxLayout()
self.dir_layout.addWidget(self.dir_lbl)
self.dir_layout.addWidget(self.dir_le)
self.dir_layout.addWidget(self.dir_browse_btn)
self.widget_layout.addLayout(self.dir_layout)
# ==========================================================================
# Main API
# ==========================================================================
[docs] def setLabelText(self, text: str):
"""
Set the label text to the left of the line edit.
"""
self.dir_lbl.setText(text)
[docs] def getDirectoryPath(self) -> str:
"""
Return the currently selected directory path. Allows access to target
"""
return self.targetGetValue()
# ==========================================================================
# Internal Implementation Methods
# ==========================================================================
[docs] def targetGetValue(self) -> str:
"""
Return the line edit text.
"""
return self.dir_le.text()
[docs] def targetSetValue(self, value: str):
"""
Set the line edit text based for a valid `value` and emit two signals:
targetValueChanged for when this widget mapped to a
param, and directoryChanged for when it is not.
:param value: The directory path to set to the line edit.
"""
self.dir_le.setText(value)
self.directoryChanged.emit()
self.targetValueChanged.emit()
def _browseDir(self):
"""
Open a browse directory dialog and set the line edit text if the
directory is valid.
"""
new_dir = filedialog.get_existing_directory(
parent=self,
caption='Select Input Directory',
dir=self._initial_dir)
if new_dir:
self.targetSetValue(new_dir)
def _dirPathEdited(self):
"""
Update the model when user manually edits the directory path.
"""
self.targetSetValue(self.dir_le.text())