Source code for schrodinger.application.livedesign.pose_name_panel
from schrodinger.models import mappers
from schrodinger.ui.qt import basewidgets
from schrodinger.ui.qt import propertyselector
from . import export_models
from . import pose_name_panel_ui
[docs]class PoseNameEditPanel(mappers.MapperMixin, basewidgets.BaseWidget):
    """
    Small panel for setting custom pose names.
    """
    SHOW_AS_WINDOW = True
    model_class = export_models.PoseNameEditModel
    ui_module = pose_name_panel_ui
[docs]    def initSetOptions(self):
        super().initSetOptions()
        self.setWindowTitle('Pose Name Specification')
        self.std_btn_specs = {
            self.StdBtn.Ok: self._onOKClicked,
            self.StdBtn.Cancel: None
        } 
[docs]    def initSetUp(self):
        super().initSetUp()
        self.ui.property_btn.clicked.connect(self._selectProperty) 
[docs]    def initFinalize(self):
        super().initFinalize()
        self.ok_btn.setDefault(True) 
[docs]    def setModel(self, model):
        super().setModel(model)
        self._onIncludePropertyChanged() 
[docs]    def defineMappings(self):
        M = self.model_class
        ui = self.ui
        return super().defineMappings() + [
            (ui.custom_text_le, M.custom_text),
            (ui.property_user_name_lbl, M.property_user_name),
            (ui.example_value_lbl, M.example_name),
            (ui.property_cb, M.include_property)
        ] # yapf: disable 
[docs]    def getSignalsAndSlots(self, model):
        return super().getSignalsAndSlots(model) + [
            (model.include_propertyChanged, self._onIncludePropertyChanged),
            (model.custom_textChanged, self._updateExampleName),
            (model.property_nameChanged, self._onPropertyChanged),
        ] # yapf: disable 
    def _selectProperty(self):
        """
        Launch a dialog prompting the user to select a structure property to
        use as part of the pose name.
        """
        prop_sel_dialog = propertyselector.PropertySelectorDialog(
            parent=self,
            title='Select Property',
            accept_text='OK',
            show_alpha_toggle=True,
            show_filter_field=True)
        properties = prop_sel_dialog.chooseFromList(self._getProperties())
        if properties:
            selected_prop = properties[0]
            self.model.property_name = selected_prop
    def _onIncludePropertyChanged(self):
        """
        Respond when the "include property" checkbox changes.
        """
        include = self.model.include_property
        if not include:
            self.model.property_name = None
        self.ui.property_btn.setEnabled(include)
        self.ui.property_user_name_lbl.setEnabled(include)
    def _onPropertyChanged(self):
        """
        Respond when the pose name structure property changes.
        """
        # Update the example pose name label
        propname = self.model.property_name
        if propname is None:
            self.model.reset(self.model_class.property_user_name)
        else:
            self.model.property_user_name = propname.userName()
        prop_value = None
        data_name = propname.dataName() if propname else None
        if data_name and self.model.entry_data:
            for st in self.model.entry_data.getRLMap().ligands:
                prop_value = st.property.get(data_name)
                if prop_value is not None:
                    break
        if prop_value is None:
            self.model.example_prop_string = None
        else:
            self.model.example_prop_string = str(prop_value)
        self._updateExampleName()
    def _updateExampleName(self):
        """
        Update the "example pose name" text based on user input.
        """
        example_name = self.model.custom_text
        if self.model.example_prop_string is not None:
            example_name += self.model.example_prop_string
        self.model.example_name = example_name
    def _getProperties(self):
        """
        :return: a set of structure property names for all ligands/complexes in
            the current system
        :rtype: set[str]
        """
        data_names = set()
        if self.model.entry_data:
            for ligand in self.model.entry_data.getRLMap().ligands:
                data_names = data_names.union(set(ligand.property.keys()))
        return data_names
    def _onOKClicked(self):
        """
        If the user accepts the panel, update the "permanent" parameters used
        by the main panel.
        """
        model = self.model
        model.custom_text_final = model.custom_text
        model.property_name_final = model.property_name
[docs]    def showEvent(self, event):
        """
        Update the "view" parameters using the "permanent" parameters when the
        panel is shown.
        """
        super().showEvent(event)
        model = self.model
        model.custom_text = model.custom_text_final
        model.property_name = model.property_name_final
        model.include_property = bool(model.property_name_final)