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)