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)