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 updateToolTips(self): """ Update tooltip of ui components which has dynamic tooltip. """ self.updateBindingSiteTooltip(self.ui.beyond_binding_site.isChecked()) self.updateSolventsTooltip(self.ui.solvents_only.isChecked()) self.updateNonpolarHydrogensTooltip( self.ui.nonpolar_hydrogens.isChecked()) self.updateProteinTooltip(self.ui.protein_only.isChecked())
[docs] def updateBindingSiteTooltip(self, checked): """ Updates 'Beyond Binding Site' tooltip """ self.ui.beyond_binding_site.setToolTip( self.display_settings_manager.getBindingSiteTooltip(checked))
[docs] def updateSolventsTooltip(self, checked): """ Updates 'Solvents Only' tooltip """ self.ui.solvents_only.setToolTip( self.display_settings_manager.getSolventsTooltip(checked))
[docs] def updateNonpolarHydrogensTooltip(self, checked): """ Updates 'Nonpolar Hydrogens' tooltip """ self.ui.nonpolar_hydrogens.setToolTip( self.display_settings_manager.getNonpolarHydrogensTooltip(checked))
[docs] def updateProteinTooltip(self, checked): """ Updates 'Protein Only' tooltip """ self.ui.protein_only.setToolTip( self.display_settings_manager.getProteinTooltip(checked))
[docs] def updateAtomSelectorWidget(self): """ Set enable state of atom selector widget """ self.ui.atomselector_widget.setEnabled( (self.ui.display_only_checkbox.isChecked()) and (self.ui.matching_radiobutton.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)