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]
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