Source code for silx.gui.widgets.CollapsibleWidget
from silx.gui import qt
[docs]
class CollapsibleWidget(qt.QWidget):
"""A widget with an inner layout that can be collapsed/expanded by clicking on a button
:param title: Title of the widget. Will be used as the button label.
"""
def __init__(self, title: str = "", parent: qt.QWidget | None = None) -> None:
super().__init__(parent=parent)
layout = qt.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
self._toolButton = qt.QToolButton()
self._toolButton.setSizePolicy(
qt.QSizePolicy.Policy.Expanding, qt.QSizePolicy.Policy.Fixed
)
self._toolButton.setText(title)
self._toolButton.setToolButtonStyle(
qt.Qt.ToolButtonStyle.ToolButtonTextBesideIcon
)
self._toolButton.setCheckable(True)
self._toolButton.toggled.connect(self._toggleIcon)
self._toolButton.setChecked(True)
layout.addWidget(self._toolButton)
self._contentsFrame = qt.QGroupBox()
layout.addWidget(self._contentsFrame)
self._toolButton.toggled.connect(self._contentsFrame.setVisible)
[docs]
def setContentsLayout(self, layout: qt.QLayout | None) -> None:
"""Sets the inner collapsible layout"""
self._contentsFrame.setLayout(layout)
def _toggleIcon(self, toggled: bool) -> None:
self._toolButton.setArrowType(
qt.Qt.ArrowType.DownArrow if toggled else qt.Qt.ArrowType.RightArrow
)
[docs]
def isCollapsed(self) -> bool:
"""True if the inner layout is collapsed. False if it is visible."""
return not self._toolButton.isChecked()
[docs]
def setCollapsed(self, collapsed: bool):
"""Collapse/expand the inner layout."""
self._toolButton.setChecked(not collapsed)