Source code for schrodinger.application.livedesign.ld_export_gui
from typing import List
from schrodinger import get_maestro
from schrodinger.models import mappers
from schrodinger.ui.qt import input_selector
from schrodinger.ui.qt.appframework2 import wizards
from . import entry_types as ets
from . import export_setup_ui
from . import ld_export
from . import login
from . import maestro_sync
maestro = get_maestro()
NAME_ENTRY_TYPE_MAP = {entry_type.name: entry_type for entry_type in
[ets.Ligands, ets.DockedPoses, ets.Complexes,
ets.CovalentDockingComplexes, ets.OrganometallicCompounds]
} # yapf: disable
PANEL_TITLE = 'Maestro to LiveDesign Export'
[docs]class ExportPanelWizard(wizards.MultiPanelWizard):
[docs] def __init__(self):
self.model = ld_export.ExportModel()
super().__init__()
self.finished.connect(self.onWizardFinish)
[docs] def setup(self):
setup_panel = ExportSetupPanel()
setup_panel.setModel(self.model)
self.addPanel(setup_panel)
main_panel = ExportMainPanel()
main_panel.setModel(self.model)
self.addPanel(main_panel)
[docs] def setDefaultCheckedItems(self, item_strs: List[str]):
"""
Specify which LD data items will be checked by default when the main
panel is opened.
:param item_strs: string representations of the desired checked data
item. In most cases, this is the structure property name.
"""
main_panel = [
panel for panel in self.panels
if isinstance(panel, ExportMainPanel)
][0]
main_panel.setDefaultCheckedItems(item_strs)
[docs] def run(self, *args, **kwargs):
self._setUpLDClient()
return super().run(*args, **kwargs)
def _setUpLDClient(self):
"""
Obtain and store necessary LD modules if necessary.
"""
model = self.model
if model.ld_client is None or model.ld_models is None:
msg, ld_client, ld_models = login.get_ld_client_and_models()
if msg:
raise RuntimeError(msg)
model.ld_client = ld_client
model.ld_models = ld_models
[docs] def onWizardFinish(self):
"""
Reset the wizard state on user exit.
"""
self.current_panel_index = 0
self.last_panel_state = None
self.quit()
[docs]class ExportSetupPanel(ld_export.LDExportPanelMixin, mappers.MapperMixin,
wizards.BaseWizardPanel):
model_class = ld_export.ExportModel
ui_module = export_setup_ui
TITLE_BASE = PANEL_TITLE
[docs] def initSetUp(self):
super().initSetUp()
self.input_selector = input_selector.InputSelector(
self, file=False, included_entries=True, tracking=True)
self.input_selector.setMinimumWidth(450)
self.input_selector.input_menu_label.hide()
self.input_selector.input_changed.connect(self._onInputChanged)
self.ui.entry_type_combo.addItems(NAME_ENTRY_TYPE_MAP)
[docs] def initLayOut(self):
super().initLayOut()
self.ui.input_selector_layout.addWidget(self.input_selector)
[docs] def initSetDefaults(self):
"""
Override `mappers.MapperMixin` to avoid resetting the entire model.
"""
self.input_selector.reset()
[docs] def show(self):
super().show()
self.adjustCombos()
# Collect structures to account for any new changes
self._onInputChanged()
[docs] def adjustCombos(self):
"""
Adjusts combo boxes to appear the same length
"""
entry_type_width = self.ui.entry_type_combo.width()
input_selector_width = self.input_selector.input_menu.width()
if entry_type_width > input_selector_width:
self.input_selector.input_menu.setFixedWidth(entry_type_width)
else:
self.ui.entry_type_combo.setFixedWidth(input_selector_width)
[docs] def defineMappings(self):
M = self.model_class
ui = self.ui
entry_type_target = mappers.TargetSpec(ui.entry_type_combo,
slot=self._onInputChanged)
return super().defineMappings() + [
(entry_type_target, M.entry_type),
(ui.description_lbl, M.entry_type_description),
(ui.summary_lbl, M.input_summary),
] # yapf: disable
[docs] def processNext(self):
"""
Evaluates whether to proceed to the next panel. Called when "Next" is
clicked.
See `wizards.BaseWizardPanel` for further documentation.
:return: whether to proceed to the next panel as requested
:rtype: bool or NoneType
"""
results = self.model.entry_data.runValidation(silent=True)
if not self.reportValidation(results):
return False
def _onInputChanged(self):
"""
When the user changes the input data, respond by updating the
description and summary label text.
"""
model = self.model
st_map = {
idx: st for idx, st in enumerate(self.input_selector.structures())
}
model.entry_data = model.entry_type(st_map)
model.entry_type_description = model.entry_data.description
model.input_summary = model.entry_data.getSummary()
model.entry_type_name = model.entry_data.name
[docs]class ExportMainPanel(ld_export.AbstractExportPanel):
TITLE_BASE = PANEL_TITLE
[docs] def initSetOptions(self):
super().initSetOptions()
self.help_topic = 'MAESTRO_LIVEDESIGN_EXPORT'
if maestro:
self.mae_sync = maestro_sync.EntrySelectionMaestroSync()
self.mae_sync.entrySelectionChanged.connect(
self._onEntrySelectionChanged)
def _onEntrySelectionChanged(self):
"""
If the project entry selection state changes, remind the user that this
will not affect the structures being exported to LiveDesign.
"""
msg = ('Project entry selection has changed. Note that this will not'
' change the structures selected for export. In order to do'
' this, you must return to the setup panel.')
self.warning(text=msg,
title=f'{PANEL_TITLE}: Entry Selection',
save_response_key='ld_export_entry_selection')
[docs] def showEvent(self, event):
if maestro:
self.mae_sync.updateSelectedEntries()
self.mae_sync.setCallbacksActive(True)
super().showEvent(event)
[docs] def closeEvent(self, event):
if maestro:
self.mae_sync.setCallbacksActive(False)
super().closeEvent(event)