Source code for cgl.ui.widgets.base

try:
    from PySide6 import QtCore, QtWidgets
except ImportError:
    from PySide6 import QtCore, QtWidgets

from cgl.core.utils.general import app_name
from cgl.ui.util import UISettings, widget_name


[docs] class StateSavers(QtCore.QObject): SAVERS = None def __init__(self): if StateSavers.SAVERS is None: StateSavers.SAVERS = set()
[docs] @classmethod def remember_me(cls, obj): cls().SAVERS.add(obj)
[docs] @classmethod def notify_savers(cls): for x in cls().SAVERS: x.on_closing()
[docs] def restore_size(widget, default_size=None): if default_size is None: default_size = QtCore.QSize(800, 800) settings = UISettings.settings() geo = settings.value(widget_name(widget)) if geo: widget.setGeometry(geo) else: widget.resize(default_size)
[docs] class LJMainWindow(QtWidgets.QMainWindow): def __init__(self, default_size=None): QtWidgets.QMainWindow.__init__(self) title = app_name(human=True) self.setWindowTitle(title.title()) restore_size(self, default_size)
[docs] def closeEvent(self, event): geo = self.geometry() settings = UISettings.settings() settings.setValue(widget_name(self), geo) super(LJMainWindow, self).closeEvent(event)
[docs] class LJDialog(QtWidgets.QDialog): def __init__(self, parent=None, force_top_level=True, dockable=False): if force_top_level: super().__init__(parent, QtCore.Qt.WindowStaysOnTopHint) self.setWindowModality(QtCore.Qt.NonModal) self.setFocusPolicy(QtCore.Qt.StrongFocus) flags = QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint self.setWindowFlags(flags) else: super().__init__(parent) self._dockable = dockable self._snap_margin = 24 # distance in pixels to snap self._dragging = False
[docs] def mousePressEvent(self, event): if self._dockable and event.button() == QtCore.Qt.LeftButton: self._dragging = True self._drag_offset = ( event.globalPosition().toPoint() - self.frameGeometry().topLeft() )
[docs] def mouseMoveEvent(self, event): if self._dockable and self._dragging: new_pos = event.globalPosition().toPoint() - self._drag_offset self.move(new_pos) self._maybe_snap()
[docs] def mouseReleaseEvent(self, event): if self._dockable and event.button() == QtCore.Qt.LeftButton: self._dragging = False
def _maybe_snap(self): """Snap to nearest edge of screen if within margin""" screen = QtGui.QGuiApplication.primaryScreen().availableGeometry() x, y = self.x(), self.y() w, h = self.width(), self.height() # Left edge if abs(x - screen.left()) < self._snap_margin: self.move(screen.left(), y) # Right edge if abs((x + w) - screen.right()) < self._snap_margin: self.move(screen.right() - w, y) # Top edge if abs(y - screen.top()) < self._snap_margin: self.move(x, screen.top()) # Bottom edge if abs((y + h) - screen.bottom()) < self._snap_margin: self.move(x, screen.bottom() - h)
[docs] class LJWindow(QtWidgets.QWidget): def __init__(self, parent, default_size=None): QtWidgets.QWidget.__init__(self, parent) restore_size(self, default_size)
[docs] def closeEvent(self, event): wn = widget_name(self) if wn != "LJWindow:": geo = self.geometry() settings = UISettings.settings() settings.setValue(widget_name(self), geo) super(LJWindow, self).closeEvent(event) StateSavers.notify_savers()
[docs] class LJWidgetWrapper(LJDialog): def __init__(self, parent=None, title="", widget=None): LJDialog.__init__(self, parent=parent) widget.parent_ = self self.layout = QtWidgets.QVBoxLayout(self) self.layout.addWidget(widget) self.setWindowTitle(title) self.setLayout(self.layout)
[docs] def clear_layout(to_clear, layout=None): if not layout: layout = to_clear.panel while layout.count(): child = layout.takeAt(0) if child.widget() is not None: child.widget().deleteLater() try: if child.hlayout() is not None: to_clear.clear_layout(child.hlayout()) except AttributeError: pass