Source code for magicclass.widgets.separator

from __future__ import annotations
from psygnal import Signal
from qtpy import QtWidgets as QtW, QtCore
from qtpy.QtCore import Qt
from .utils import FreeWidget


[docs]class Separator(FreeWidget): """ A Separator widget that can be used in both widgets and menus. This widget is not actually added to menus or toolbars. """ btn_clicked = Signal(bool) def __init__( self, orientation: str = "horizontal", title: str = "", name: str = "", button: bool = False, ): super().__init__(name=name) self._qtitlebar = _QTitleBar(title, parent=self.native) self.set_widget(self._qtitlebar) if button: self._qtitlebar.closeSignal.connect( lambda: self.btn_clicked.emit(self._qtitlebar.button().isDown()) ) else: self._qtitlebar.button().hide() self._title = title @property def btn_text(self): """The button text.""" return self._qtitlebar.button().text() @btn_text.setter def btn_text(self, value: str): """Set the button text.""" return self._qtitlebar.button().setText(value) @property def title(self) -> str: """The title string.""" return self._qtitlebar.title() @title.setter def title(self, text: str): """Set the title string""" return self._qtitlebar.setTitle(text)
class _QTitleBar(QtW.QWidget): """A custom title bar""" closeSignal = Signal() def __init__(self, title: str = "", parent: QtW.QWidget | None = None) -> None: super().__init__(parent) _layout = QtW.QHBoxLayout() _layout.setContentsMargins(1, 0, 1, 0) _layout.setSpacing(0) self._title_label = QtW.QLabel() self._title_label.setContentsMargins(0, 0, 0, 0) _frame = QtW.QFrame() _frame.setFrameShape(QtW.QFrame.Shape.HLine) _frame.setFrameShadow(QtW.QFrame.Shadow.Sunken) _frame.setSizePolicy( QtW.QSizePolicy.Policy.Expanding, QtW.QSizePolicy.Policy.Fixed ) self._close_button = QtW.QToolButton() self._close_button.setText("✕") self._close_button.setToolTip("Close the widget.") self._close_button.setFixedSize(QtCore.QSize(28, 28)) self._close_button.setCursor(Qt.CursorShape.ArrowCursor) _layout.addWidget(self._title_label) _layout.addWidget(_frame) _layout.addWidget(self._close_button) _layout.setAlignment(self._close_button, Qt.AlignmentFlag.AlignRight) self.setLayout(_layout) self._close_button.clicked.connect(lambda: self.closeSignal.emit) self.setTitle(title) def button(self) -> QtW.QToolButton: return self._close_button def title(self) -> str: """The title text.""" return self._title_label.text() def setTitle(self, text: str): """Set the title text.""" if text == "": self._title_label.setVisible(False) else: self._title_label.setVisible(True) self._title_label.setText(f"{text} ")