Source code for PartSeg.common_gui.collapse_checkbox

from contextlib import suppress

import qtawesome as qta
from qtpy import QtGui
from qtpy.QtCore import QRect, Qt
from qtpy.QtGui import QFont, QFontMetrics, QPainter
from qtpy.QtWidgets import QCheckBox, QWidget


[docs] class CollapseCheckbox(QCheckBox): """ Check box for hide widgets. It is painted as: ▶, {info_text}, line If triangle is ▶ then widgets are hidden. If triangle is ▼ then widgets are shown. :param info_text: optional text to be show """ def __init__(self, info_text: str = "", parent: QWidget | None = None): """Check box for hide widgets. param info_text: text to be shown param parent: parent widget """ super().__init__(info_text or "-", parent) self.hide_list = [] self.stateChanged.connect(self.hide_element) metrics = QFontMetrics(QFont()) self.text_size = metrics.size(Qt.TextFlag.TextSingleLine, info_text) self.info_text = info_text
[docs] def add_hide_element(self, val: QWidget): """ Add widget which visibility should be controlled by CollapseCheckbox """ self.hide_list.append(val)
[docs] def remove_hide_element(self, val: QWidget): """ Stop controlling widget visibility by CollapseCheckbox """ with suppress(ValueError): self.hide_list.remove(val)
def hide_element(self, a0: int): for el in self.hide_list: el.setHidden(bool(a0)) def paintEvent(self, event: QtGui.QPaintEvent): painter = QPainter(self) color = painter.pen().color() painter.save() rect = self.rect() top = int(rect.height() - (self.text_size.height() / 2)) painter.drawText(rect.height() + 5, top, self.info_text) if self.isChecked(): icon = qta.icon("fa5s.caret-right", color=color) else: icon = qta.icon("fa5s.caret-down", color=color) icon.paint(painter, QRect(0, int(-self.height() / 4), self.height(), self.height())) painter.restore()