Source code for schrodinger.ui.qt.forcefield.ffglobalpreferencewidget
import os
from schrodinger.infra import mm
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.ui import maestro_ui
from . import ffglobalpreferencewidget_ui
from . import pathselectorwidget
from . import stylesheet
maestro_hub = maestro_ui.MaestroHub.instance()
[docs]class FFGlobalPreferenceWidget(QtWidgets.QWidget):
    """
     Singleton class for Force Field Global Preference UI.
    :cvar _instance: Holds instance of this class.
    :vartype _instance: 'FFGlobalPreferenceWidget'
    :cvar customOPLSPathChanged: Signal emitted when forcefield opls path
        is changed.
    :vartype customOPLSPathChanged: pyqtSignal
    :cvar useCustomForceFieldToggled: Signal emitted with new state when
        'use custom forcefield' is toggled.
    :vartype useCustomForceFieldToggled: pyqtSignal
    """
    _instance = None
    customOPLSPathChanged = QtCore.pyqtSignal()
    useCustomForceFieldToggled = QtCore.pyqtSignal(bool)
[docs]    def __init__(self):
        super().__init__()
        self.ui = ffglobalpreferencewidget_ui.Ui_FFGlobalPreferencesWidget()
        self.ui.setupUi(self)
        self.setStyleSheet(stylesheet.FF_GLOBAL_PREFERENCE_WIDGET_STYLESHEET)
        self.setLayout(self.ui.ffpreferencewidget_layout)
        self._setupPathSelectorWidget()
        self._setupComponents()
[docs]    @staticmethod
    def getInstance():
        """
        To support singleton pattern for the class
        :return: instance of this FFGlobalPreferenceWidget.
        :rtype: 'FFGlobalPreferenceWidget'
        """
        if not FFGlobalPreferenceWidget._instance:
            FFGlobalPreferenceWidget._instance = FFGlobalPreferenceWidget()
        return FFGlobalPreferenceWidget._instance
    def _setupComponents(self):
        """
        Setups UI components and required connections
        """
        self.ui.use_custom_parameters_cb.setChecked(
            mm.get_preference_use_custom_opls())
        self.ui.use_custom_parameters_cb.toggled.connect(
            self._onUseCustomFFCBToggled)
        self.ui.ff_preferences_reset_btn.setEnabled(
            self.path_selector_widget.currentText() !=
            mm.PREFERENCE_DEFAULT_OPLS_PATH)
        self.ui.ff_preferences_reset_btn.clicked.connect(
            lambda: self.updateCustomOplsDir(mm.PREFERENCE_DEFAULT_OPLS_PATH))
        self.ui.project_settings_lbl.linkActivated.connect(
            self._showFFProjectSettingDlg)
    def _setupPathSelectorWidget(self):
        """
        Setups path selector widget with recently used location added and
        global opls directory selected as current item.
        """
        self.path_selector_widget = pathselectorwidget.PathSelectorWidget(
            parent=self, suggestion_limit=5)
        valid_recent_locations = [
            path for path in mm.get_preference_most_recent_custom_opls_paths()
            if os.path.isdir(path)
        ]
        self.path_selector_widget.model().setStringList(valid_recent_locations)
        self.path_selector_widget.addSuggestion(mm.PREFERENCE_DEFAULT_OPLS_PATH)
        self.path_selector_widget.addAndSelectLocationItem(
            mm.get_preference_custom_opls_path())
        self.ui.path_selector_layout.addWidget(self.path_selector_widget)
        self.path_selector_widget.currentTextChanged.connect(
            self._onforceFieldLocationChanged)
    def _onforceFieldLocationChanged(self, location):
        """
        Called when location item is changed from path selector widget.
        :param location: new global opls forcefield path.
        """
        if not location or location == self.path_selector_widget.model().BROWSE:
            return
        self.ui.ff_preferences_reset_btn.setEnabled(
            location != mm.PREFERENCE_DEFAULT_OPLS_PATH)
        mm.set_preference_custom_opls_path(location)
        mm.set_preference_most_recent_custom_opls_paths(
            self.path_selector_widget.getLocationItems())
        self.customOPLSPathChanged.emit()
    def _onUseCustomFFCBToggled(self, use_custom_cb_state):
        """
        Function called on use custom force field checkbox state is toggled.
        Sets new state in MMPREF object as well as notified maestro about it.
        :param use_custom_cb_state: is new state of 'Use custom force field'
        """
        mm.set_preference_use_custom_opls(use_custom_cb_state)
        self.useCustomForceFieldToggled.emit(use_custom_cb_state)
[docs]    def updateCustomOplsDir(self, path):
        """
        Updates custom opls directory preference with new path.
        :param path: new custom opls dir
        :vartype path: str
        """
        self.path_selector_widget.addAndSelectLocationItem(path)
    def _showFFProjectSettingDlg(self):
        """
        Displays project setting dialog.
        """
        from . import ffprojectsettingsdlg
        ffprojectsettingsdlg.show_ff_project_settings_dlg(self)
[docs]def request_ff_preference_widget():
    """
    This function is called from Maestro. Creates an instance of the
    'FFGlobalPreferenceWidget' widget and passes on the QWidget to Maestro
    via MaestroHub::setForceFieldPreferenceWidget SIGNAL.
    """
    maestro_ff_global_preference_widget = FFGlobalPreferenceWidget.getInstance()
    maestro_hub.setForceFieldPreferenceWidget.emit(
        maestro_ff_global_preference_widget)