Source code for schrodinger.ui.qt.basewidgets
import sys
import schrodinger
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.ui.qt import widgetmixins
from schrodinger.models import mappers
from schrodinger.ui.qt.widgetmixins import panelmixins
from schrodinger.ui.qt.appframework2.appmethods import custom as bottom_button
from schrodinger.ui import maestro_ui
maestro = schrodinger.get_maestro()
class BaseWidget(widgetmixins.BaseMixinCollection, QtWidgets.QWidget):
"""
`QWidget` with several mixins. See `QWidget` and
`widgetmixins.BaseMixinCollection` for full documentation.
"""
class BaseDialog(widgetmixins.BaseMixinCollection, QtWidgets.QDialog):
"""
`QDialog` with several mixins. See `QDialog` and
`widgetmixins.BaseMixinCollection` for full documentation.
"""
class Panel(widgetmixins.PanelMixin, BaseWidget):
"""
A `BaseWidget` with MapperMixin, is a window by default, and has the `panel`
method to run the singleton panel.
"""
class TaskPanel(widgetmixins.TaskPanelMixin, BaseWidget):
pass
class BaseOptionsDialog(panelmixins.CleanStateMixin, mappers.MapperMixin,
BaseDialog):
"""
Base class for options dialogs. Includes:
- An "OK" button that closes the dialog (hotkeyed to "Enter")
- A cancel button that resets the model to the state it was in when
the dialog was run (hotkeyed to "Esc")
- A reset button that resets the dialog to default state specified in
`initSetDefaults`
Subclasses can define `self.help_topic = 'HELP_TOPIC_KEY'` to define
a help button.
Subclasses must have models that are deepcopyable. Subclasses can define custom
actions for the standard buttons after `initSetOptions` of base class gets called.
"""
def initSetOptions(self):
self.std_btn_specs = {
self.StdBtn.Ok: self.accept,
self.StdBtn.Cancel: self._onCancelClicked,
self.StdBtn.Reset: None
}
super().initSetOptions()
def _onCancelClicked(self):
self.discardChanges()
def reject(self):
self._onCancelClicked()
return super().reject()
class _DockablePanel(widgetmixins.DockableMixinCollection,
maestro_ui.MM_QDockWidget):
"""
This is a base class for panels that dock into Maestro. There is a small
amount of boilerplate that this base class provides, that is necessary for
getting docking to work properly in Maestro.
"""
def __init__(self, object_name=None, dockarea=None):
if object_name is None:
object_name = str(self)
if dockarea is None:
dockarea = QtCore.Qt.RightDockWidgetArea
super().__init__(object_name, dockarea, True, True)
self.setObjectName(object_name)
self.setAllowedAreas(dockarea)
if maestro:
self.setupDockWidget.emit()
self.hide()
def closeEvent(self, event):
"""
Do not close the floating python panel and instead emit a
SIGNAL to Maestro which redocks the panel back into main window.
This is a temporary workaround for Qt5 redock issues
"""
if sys.platform.startswith("darwin") and self.isFloating() and maestro:
# If the panel is currently undocked, re-dock it instead of
# closing it:
event.ignore()
self.pythonPanelAboutToBeClosed.emit(self)
else:
return super().closeEvent(event)
class MaestroDockPanel(widgetmixins.PanelMixin, _DockablePanel):
pass
class MaestroDockTaskPanel(widgetmixins.TaskPanelMixin, _DockablePanel):
pass