Source code for schrodinger.application.jaguar.gui.filedialog
"""
Custom file dialogs for the Jaguar GUIs
"""
from collections import OrderedDict
from schrodinger.Qt import QtWidgets
from schrodinger.Qt.QtCore import Qt
from schrodinger.ui.qt import filedialog
JAG_IN_FILTER = "Jaguar Input (*.in)"
JAG_IN_SUFFIX = "in"
[docs]class FileDialogWithExtraCombo(filedialog.FileDialog):
"""
A Qt file dialog with an extra combo box about the filename text edit
"""
_JAG_IN_FILTER = JAG_IN_FILTER
_JAG_IN_SUFFIX = JAG_IN_SUFFIX
[docs] def __init__(self, parent, caption, lbl_text, combo_items):
"""
Create a new file dialog with the specified label text and combo box
items.
:param parent: The Qt parent widget
:type parent: `PyQt5.QtWidgets.QWidget`
:param caption: The title of the dialog
:type caption: str
:param lbl_text: The label text to display next to the extra combo box
:type lbl_text: str
:param combo_items: A list of strings to add to the combo box
:type combo_items: tuple
"""
filters = self._JAG_IN_FILTER
super(FileDialogWithExtraCombo, self).__init__(parent,
caption=caption,
filter=filters)
# Needed for customization to work, on Qt5:
self.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
self.setDefaultSuffix(self._JAG_IN_SUFFIX)
lbl = QtWidgets.QLabel(lbl_text, self)
combo = QtWidgets.QComboBox(self)
combo.addItems(combo_items)
self._combo = combo
self._insertWidgets(lbl, combo)
def _insertWidgets(self, lbl, combo):
"""
Insert the given widgets above the filename text edit
:param lbl: The label to insert
:type lbl: `PyQt5.QtWidgets.QLabel`
:param combo: The combo box to insert
:type combo: `PyQt5.QtWidgets.QComboBox`
:note: QFileDialog does not have an API to add widgets, so the Qt FAQ
recommends directly adding widgets to the dialog's layout: http://qt-
project.org/faq/answer/how_can_i_add_widgets_to_my_qfiledialog_instance.
This function will break if the QFileDialog layout ever changes.
"""
glayout = self.layout()
for row in (3, 2):
for col in range(3):
if col == 2:
if row == 3:
# There's nothing in (3, 2) because (2, 2) contains a
# button box that takes up two rows
continue
elif row == 2:
# (2, 2) contains a button box that spans two rows
row_span = 2
else:
row_span = 1
widget = glayout.itemAtPosition(row, col).widget()
glayout.addWidget(widget, row + 1, col, row_span, 1)
glayout.addWidget(lbl, 2, 0)
glayout.addWidget(combo, 2, 1, Qt.AlignLeft)
[docs] def selectedOption(self):
"""
Return the currently selected index for the extra combo box
:return: The currently selected index for the extra combo box
:rtype: int
"""
return self._combo.currentIndex()
[docs]class ReadFileDialog(FileDialogWithExtraCombo):
"""
An Open dialog both with an extra combo box to specify what should be read
from the specified file.
:cvar GEOM_AND_SETTINGS: The index of the "Geometry and settings" option, as
returned by selectedOption().
:vartype GEOM_AND_SETTINGS: int
:cvar GEOM_ONLY: The index of the "Geometry only" option, as returned by
selectedOption().
:vartype GEOM_ONLY: int
:cvar SETTINGS_ONLY: The index of the "Settings only" option, as returned by
selectedOption().
:vartype SETTINGS_ONLY: int
"""
# This class does't implement the "Custom File Filter..." option from the
# C++ GUI
GEOM_AND_SETTINGS = 0
GEOM_ONLY = 1
SETTINGS_ONLY = 2
OPTION_TEXT = OrderedDict([(GEOM_AND_SETTINGS, 'Geometry and settings'),
(GEOM_ONLY, 'Geometry only'),
(SETTINGS_ONLY, 'Settings only')])
[docs] def __init__(self, parent, allowed_options=None):
caption = "Jaguar Read"
lbl_text = "Read as:"
if allowed_options:
allowed_items = [
self.OPTION_TEXT[x]
for x in allowed_options
if x in self.OPTION_TEXT
]
else:
allowed_items = list(self.OPTION_TEXT.values())
super(ReadFileDialog, self).__init__(parent, caption, lbl_text,
allowed_items)
self.setAcceptMode(self.AcceptOpen)
self.setFileMode(QtWidgets.QFileDialog.ExistingFile)