Source code for nukescripts.widgetgroup

from PySide6.QtCore import Qt
from PySide6.QtGui import QPalette, QPainter, QPainterPath
from PySide6.QtWidgets import (QStyleOptionButton,
                               QStyle,
                               QVBoxLayout,
                               QWidget,
                               QCheckBox,
                               QSizePolicy)

[docs]class GroupWidget(QWidget): def __init__(self, text=""): super().__init__() # Master layout self.layout = QVBoxLayout() self.setLayout(self.layout) # Checkbox button, add it to master layout self.button = GroupWidgetButton() self.button.setText(text) self.button.clicked.connect(self.toggleGroup) self.layout.addWidget(self.button) # Group contents container widget self.groupContentWidget = QWidget() # Group contents sub layout self.groupContentLayout = QVBoxLayout() self.groupContentWidget.setLayout(self.groupContentLayout) # Add the group content to the master layout self.layout.addWidget(self.groupContentWidget) self.hide() def addSubWidget(self, widget): self.groupContentLayout.addWidget(widget)
[docs] def show(self): self.groupContentWidget.setVisible(True) self.button.setChecked(True)
[docs] def hide(self): self.groupContentWidget.setVisible(False) self.button.setChecked(False)
def setText(self, text): self.button.setText(text) def toggleGroup(self): if self.button.isChecked(): self.show() else: self.hide()
[docs]class GroupWidgetButton(QCheckBox): def __init__(self): super().__init__() self.groupWidgets = [] self.setSizePolicy( QSizePolicy( QSizePolicy.Fixed, QSizePolicy.Fixed ) )
[docs] def paintEvent( self, event ): style = self.style() painter = QPainter(self) opt = QStyleOptionButton() self.initStyleOption(opt) painter.setRenderHint(QPainter.Antialiasing) palette = self.palette() subopt = QStyleOptionButton(opt) subopt.rect = style.subElementRect( QStyle.SE_CheckBoxIndicator, opt, self ) painter.setBrush( palette.color(QPalette.Text) if self.isEnabled() else palette.color( QPalette.Disabled, QPalette.Light ) ) painter.setPen( Qt.NoPen ) path = QPainterPath() if self.isChecked(): path.moveTo( 4, 3 ) path.lineTo( 13, 3 ) path.lineTo( 8, 11 ) else: path.moveTo( 4, 3 ) path.lineTo( 12, 7 ) path.lineTo( 4, 12 ) painter.drawPath( path ) subopt.rect = style.subElementRect( QStyle.SE_CheckBoxContents, opt, self ) style.drawControl( QStyle.CE_PushButtonLabel, subopt, painter, self )