Source code for schrodinger.trajectory.trajectory_gui_dir.snapshot_custom_display_settings
import copy
import schrodinger
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.structutils import analyze
from schrodinger.trajectory.trajectory_gui_dir import display_settings_data
from schrodinger.trajectory.trajectory_gui_dir import display_settings_manager
from schrodinger.trajectory.trajectory_gui_dir.display_settings_data import \
MAX_RADIUS
from schrodinger.trajectory.trajectory_gui_dir.display_settings_data import \
MIN_RADIUS
from schrodinger.trajectory.trajectory_gui_dir.display_settings_data import \
DisplayOnly
from schrodinger.ui import maestro_ui
from schrodinger.ui.qt import atomselector
from schrodinger.ui.qt import utils
from . import snapshot_custom_display_settings_ui
from . import stylesheet
maestro = schrodinger.get_maestro()
[docs]class CustomDisplaySettings(QtWidgets.QDialog):
"""
Custom display settings class for trajectory snapshots panel.
:cvar settingsChanged(): A signal emitted when settings are changed.
:vartype settingsChanged: `QtCore.pyqtSignal`
"""
settingsChanged = QtCore.pyqtSignal()
[docs] def __init__(self, parent: QtWidgets.QWidget):
"""
:param parent: The Qt parent
"""
super(QtWidgets.QDialog, self).__init__(parent)
self.data = display_settings_data.DisplaySettingsData()
self.display_settings_manager = display_settings_manager.DisplaySettingsManager(
self.data)
self.ui = snapshot_custom_display_settings_ui.Ui_Dialog()
self.ui.setupUi(self)
self.setStyleSheet(stylesheet.SNAPSHOT_CUSTOM_SETTINGS_STYLESHEET)
self.ui.cancel_pushbutton.clicked.connect(self.close)
self.ui.ok_pushbutton.clicked.connect(self.okClicked)
self.ui.help_button.clicked.connect(self.help)
self.ui.beyond_binding_site.toggled.connect(self.updateHideAtoms)
self.ui.nonpolar_hydrogens.toggled.connect(self.updateHideAtoms)
self.ui.beyond_binding_site.toggled.connect(
self.updateBindingSiteTooltip)
self.ui.nonpolar_hydrogens.toggled.connect(
self.updateNonpolarHydrogensTooltip)
self.ui.solvents_only.toggled.connect(self.updateSolventsTooltip)
self.ui.protein_only.toggled.connect(self.updateProteinTooltip)
self.atom_selector = atomselector.AtomSelector(self,
show_pick=False,
show_selection=False,
show_plus=True)
self.atom_selector.main_layout.setContentsMargins(2, 2, 2, 2)
layout = self.ui.atomselector_widget.layout()
layout.insertWidget(0, self.atom_selector)
self.atom_selector.atomSelectionDialogDismissed.connect(self.show)
self.atom_selector.atomSelectionDialogAboutToBeShown.connect(self.hide)
self.ui.display_only_checkbox.toggled.connect(
self.ui.display_only_frame.setEnabled)
self.ui.display_only_checkbox.toggled.connect(self.updateHideAtoms)
self.ui.current_radiobutton.toggled.connect(self.updateHideAtoms)
self.ui.display_only_checkbox.toggled.connect(
self.updateAtomSelectorWidget)
self.ui.matching_radiobutton.toggled.connect(
self.updateAtomSelectorWidget)
# Set range for radius
self.ui.radius_spinbox.setRange(MIN_RADIUS, MAX_RADIUS)
self.ui.radius_spinbox.valueChanged.connect(self.enableOK)
abstractbuttons = ('display_only_checkbox', 'current_radiobutton',
'matching_radiobutton', 'load_sel_pushbutton',
'protein_only', 'solvents_only',
'beyond_binding_site', 'nonpolar_hydrogens')
for abstractbutton in abstractbuttons:
attr = getattr(self.ui, abstractbutton)
attr.clicked.connect(self.enableOK)
self.atom_selector.aslTextModified.connect(self.enableOK)
self.ui.load_sel_pushbutton.clicked.connect(
self.atom_selector.loadWorkspaceSelection)
self.adjustSize()
self.updateDlg()
[docs] def isValidASL(self, asl):
"""
Return True if asl is valid.
"""
return analyze.validate_asl(asl)
[docs] def showDlg(self):
"""
Update the dialog and show it.
"""
self.updateDlg()
self.ui.ok_pushbutton.setEnabled(False)
self.show()
[docs] def enableOK(self):
"""
Enable 'OK' button
"""
asl_enable_ok = True
matching_asl_selected = (self.ui.display_only_checkbox.isChecked() and
self.ui.matching_radiobutton.isChecked())
matching_asl = self.atom_selector.getAsl()
# Do not enable okay button if 'Display Only:' is toggled on, and
# 'Atoms matching ASL definition:' is checked and asl in
# atom selector empty
asl_enable_ok = not (matching_asl_selected and (not matching_asl))
self.ui.ok_pushbutton.setEnabled(asl_enable_ok)
[docs] def updateHideAtoms(self):
"""
Enable/disable hide atoms option.
"""
if (self.ui.display_only_checkbox.isChecked() and
self.ui.current_radiobutton.isChecked()):
for widget in (self.ui.beyond_binding_site,
self.ui.nonpolar_hydrogens, self.ui.solvents_only,
self.ui.protein_only, self.ui.radius_spinbox,
self.ui.define_label, self.ui.unit_label):
widget.setEnabled(False)
else:
self.ui.beyond_binding_site.setEnabled(True)
self.ui.nonpolar_hydrogens.setEnabled(True)
enable = self.ui.beyond_binding_site.isChecked()
for widget in (self.ui.solvents_only, self.ui.radius_spinbox,
self.ui.define_label, self.ui.unit_label):
widget.setEnabled(enable)
self.ui.protein_only.setEnabled(
self.ui.nonpolar_hydrogens.isChecked())
[docs] def updateDlg(self):
"""
Update dialog according to data
"""
self.ui.beyond_binding_site.setChecked(self.data.ha_beyond_binding_site)
self.ui.solvents_only.setChecked(self.data.ha_solvents_only)
self.ui.nonpolar_hydrogens.setChecked(self.data.ha_nonpolar_hydrogens)
self.ui.protein_only.setChecked(self.data.ha_protein_only)
self.ui.radius_spinbox.setValue(self.data.binding_site_radius)
self.ui.display_only_checkbox.setChecked(self.data.display_only)
if self.data.display_only_option == DisplayOnly.CURRENT:
self.ui.current_radiobutton.setChecked(True)
else:
self.ui.matching_radiobutton.setChecked(True)
self.atom_selector.setAsl(self.data.matching_asl)
self.updateAtomSelectorWidget()
self.ui.display_only_frame.setEnabled(self.data.display_only)
ws_hub = maestro_ui.WorkspaceHub.instance()
self.ui.load_sel_pushbutton.setEnabled(
ws_hub.getSelectedAtomCount() > 0)
self.updateToolTips()
[docs] def okClicked(self):
"""
Update data according to dialog
"""
matching_asl_selected = (self.ui.display_only_checkbox.isChecked() and
self.ui.matching_radiobutton.isChecked())
matching_asl = self.atom_selector.getAsl()
if (matching_asl_selected and (not self.isValidASL(matching_asl))):
maestro.warning(f"Invalid ASL {matching_asl}")
return
self.close()
# To determine if settings are really changed, take a copy of existing
# data object and later compare if there is a real change.
old_data = copy.deepcopy(self.data)
self.data.ha_beyond_binding_site = self.ui.beyond_binding_site.isChecked(
)
self.data.ha_solvents_only = self.ui.solvents_only.isChecked()
self.data.binding_site_radius = self.ui.radius_spinbox.value()
self.data.ha_nonpolar_hydrogens = self.ui.nonpolar_hydrogens.isChecked()
self.data.ha_protein_only = self.ui.protein_only.isChecked()
self.data.display_only = self.ui.display_only_checkbox.isChecked()
display_only_option = DisplayOnly.CURRENT
if self.ui.matching_radiobutton.isChecked():
display_only_option = DisplayOnly.MATCHING
self.data.display_only_option = display_only_option
self.data.matching_asl = self.atom_selector.getAsl()
if old_data != self.data:
self.settingsChanged.emit()
[docs] def help(self):
"""
Shows 'Trajectory Snapshot Custom Display Settings' dialog help
"""
utils.help_dialog("TRAJECTORY_SNAPSHOT_CUSTOM_DISPLAY_SETTINGS",
parent=self)