Source code for schrodinger.application.matsci.qualityslider

"""
A QSlider that allows the user to select Jaguar keywords based on
Coarse/Medium/Accurate settings.  The keywords are displayed to the user in a
QLineEdit that by default is editable by the user.  The main widget is a QFrame
object that has a .slider property that is the QSlider and a .line_edit property
that is the QLineEdit.

Alternatively, the Frame can contain radiobuttons instead of a QSlider

Copyright Schrodinger, LLC. All rights reserved.
"""

from schrodinger.application.matsci import jagwidgets
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.ui.qt import swidgets

Qt = QtCore.Qt


[docs]class QualitySlider(QtWidgets.QFrame): """ A widget that allows the user to see and edit the Jaguar keywords for three different accuracy levels. The QFrame contains either a QSlider or set of QRadioButtons and an SLabeldLineEdit. The QSlider/QRadioButtons can be used to switch between accuracy levels, and the keywords for that accuracy level are displayed in the SLabeledLineEdit """ COARSE = 0 MEDIUM = 1 ACCURATE = 2 LABELS = {COARSE: 'Coarse', MEDIUM: 'Medium', ACCURATE: 'Accurate'}
[docs] def __init__(self, parent=None, label='Calculation quality:', layout=None, coarse="", medium="", accurate="", radiobuttons=False): """ Create a QualitySlider instance :type parent: QWidget :param parent: The parent of this QFrame :type label: str :param label: The label shown in the frame :type layout: QBoxLayout :param layout: The layout to add this QFrame to :type coarse: str :param coarse: The keyword string for coarse calculations :type medium: str :param medium: The keyword string for medium calculations :type accurate: str :param accurate: The keyword string for accurate calculations :type radiobuttons: True if the QFrame should contain 3 radiobuttons rather than a QSlider to pick the accuracy level """ QtWidgets.QFrame.__init__(self, parent) self.layout = swidgets.SVBoxLayout() layout.addLayout(self.layout) if radiobuttons: # Set up Radiobuttons labels = [self.LABELS[x] for x in range(3)] blayout = swidgets.SHBoxLayout() self.layout.addLayout(blayout) self.label = swidgets.SLabel(label, layout=blayout) self.button_group = swidgets.SRadioButtonGroup( labels=labels, layout=blayout, nocall=True, command=self.buttonChanged) blayout.addStretch() self.slider = None self.label = None else: self.button_group = None # Set up the label label_layout = swidgets.SHBoxLayout() label_layout.addStretch() self.label = swidgets.SLabel(label, layout=label_layout) label_layout.addStretch() self.layout.addLayout(label_layout) # Set up the QSlider self.slider = QtWidgets.QSlider(Qt.Horizontal, self) self.slider.setRange(self.COARSE, self.ACCURATE) self.slider.setTracking(True) self.slider.setTickPosition(self.slider.NoTicks) self.layout.addWidget(self.slider) self.label_prefix = label # Set up the options dialog button_layout = swidgets.SHBoxLayout(indent=True, layout=self.layout) self.jaguar_options_dlg = jagwidgets.JaguarOptionsDialog( parent, show_spin_treatment=True, layout=button_layout, default_keywords=coarse # Needed to disable symmetry checkbox ) button_layout.addStretch() self.keywords = {} self.keywords[self.COARSE] = coarse self.keywords[self.MEDIUM] = medium self.keywords[self.ACCURATE] = accurate if self.slider: self.slider.valueChanged.connect(self.valueChanged) self.slider.setValue(self.MEDIUM) else: self.buttonChanged() if layout is not None: layout.addWidget(self)
[docs] def buttonChanged(self): """ Callback for radiobutton toggled signals - change the keywords displayed in the KeywordEdit """ if not self.button_group: raise RuntimeError('buttonChanged requires a QualitySlider created' ' with radiobuttons=True') selected = self.button_group.checkedId() self.updateKeywordEdit(selected)
[docs] def valueChanged(self, newvalue): """ Callback for when the QSlider changes value - change the keywords displayed in the KeywordEdit :type newvalue: int :param newvalue: The current value of the QSlider """ if not self.slider: raise RuntimeError('buttonChanged requires a QualitySlider created' ' with radiobuttons=False') self.updateKeywordEdit(newvalue) self.label.setText(self.label_prefix + self.LABELS[newvalue])
[docs] def updateKeywordEdit(self, setting): """ Change the keywords in the KeywordEdit to be those for the accuracy level of setting :type setting: int :param setting: One of the class constants COARSE, MEDIUM or ACCURATE """ self.jaguar_options_dlg.setKeywords(self.keywords[setting])
[docs] def setKeywords(self, setting, keywords, append=False): """ Set the keywords for a particular accuracy level :type setting: int :param setting: One of the class constants COARSE, MEDIUM or ACCURATE :type keywords: str :param keywords: The string to use for the new keywords :type append: bool :param append: True if the keywords string should be added to the current string, False (default) if it should replace the current string. """ if append: self.keywords[setting].append(keywords) else: self.keywords[setting] = keywords self.updateKeywordEdit(self.getCurrentSetting())
[docs] def getKeywordString(self): """ Return the current string in the KeywordEdit :rtype: str :return: The current string in the KeywordEdit """ return self.jaguar_options_dlg.getKeywordString()
[docs] def getKeywordDict(self): """ Return a dictionary whose keys are keywords and values are keyword values for the current KeywordEdit contents. :rtype: dict :return: Dictionary of keyword/value pairs :raise ValueError: if any tokens do not match the keyword=value format """ return self.jaguar_options_dlg.getKeywordDict()
[docs] def getCurrentSetting(self): """ Return the current setting of the QSlider/QRadioButtons :rtype: int :return: The current setting of the QSlider/QRadioButtons - one of the class constants COARSE, MEDIUM or ACCURATE """ if self.slider: return self.slider.value() else: return self.button_group.checkedId()
[docs] def reset(self): """ Reset the widget """ self.button_group.setTextChecked(self.LABELS[self.COARSE]) self.buttonChanged()