Source code for schrodinger.ui.qt.basewidgets

import sys

import schrodinger
from schrodinger.models import mappers
from schrodinger.Qt import QtCore
from schrodinger.Qt import QtWidgets
from schrodinger.ui import maestro_ui
from schrodinger.ui.qt import widgetmixins
from schrodinger.ui.qt.appframework2.appmethods import custom as bottom_button  # noqa: F401
from schrodinger.ui.qt.widgetmixins import panelmixins

maestro = schrodinger.get_maestro()


[docs]class BaseWidget(widgetmixins.BaseMixinCollection, QtWidgets.QWidget): """ `QWidget` with several mixins. See `QWidget` and `widgetmixins.BaseMixinCollection` for full documentation. """
[docs]class BaseDialog(widgetmixins.BaseMixinCollection, QtWidgets.QDialog): """ `QDialog` with several mixins. See `QDialog` and `widgetmixins.BaseMixinCollection` for full documentation. """
[docs]class Panel(widgetmixins.PanelMixin, BaseWidget): """ A `BaseWidget` with MapperMixin, is a window by default, and has the `panel` method to run the singleton panel. """
[docs]class TaskPanel(widgetmixins.TaskPanelMixin, BaseWidget): pass
[docs]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. """
[docs] 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()
[docs] 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)
[docs]class MaestroDockPanel(widgetmixins.PanelMixin, _DockablePanel): pass
[docs]class MaestroDockTaskPanel(widgetmixins.TaskPanelMixin, _DockablePanel): pass