66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from ..Qt import QtWidgets, QtCore
|
|
|
|
|
|
class ExpandableWidget(QtWidgets.QWidget):
|
|
expansionChanged = QtCore.pyqtSignal()
|
|
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent=parent)
|
|
|
|
self._init_ui()
|
|
|
|
self._widget = None
|
|
self._expanded = False
|
|
|
|
self.toolButton.clicked.connect(self.changeVisibility)
|
|
|
|
def _init_ui(self):
|
|
self.verticalLayout = QtWidgets.QVBoxLayout(self)
|
|
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
|
self.verticalLayout.setSpacing(0)
|
|
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
|
self.horizontalLayout.setSpacing(0)
|
|
|
|
self.toolButton = QtWidgets.QToolButton(self)
|
|
self.toolButton.setArrowType(QtCore.Qt.RightArrow)
|
|
self.toolButton.setStyleSheet('border: 0')
|
|
self.toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
|
|
self.horizontalLayout.addWidget(self.toolButton)
|
|
|
|
self.line = QtWidgets.QFrame(self)
|
|
self.line.setFrameShape(QtWidgets.QFrame.HLine)
|
|
self.horizontalLayout.addWidget(self.line)
|
|
|
|
self.verticalLayout.addLayout(self.horizontalLayout)
|
|
|
|
def addWidget(self, widget: QtWidgets.QWidget):
|
|
self._widget = widget
|
|
self._widget.setVisible(self._expanded)
|
|
self.layout().addWidget(widget)
|
|
|
|
def setText(self, text: str):
|
|
self.toolButton.setText(text)
|
|
|
|
def isExpanded(self):
|
|
return self._expanded
|
|
|
|
def changeVisibility(self):
|
|
if not self._widget:
|
|
return
|
|
|
|
self.setExpansion(not self._expanded)
|
|
|
|
self.expansionChanged.emit()
|
|
|
|
def setExpansion(self, state: bool):
|
|
self.blockSignals(True)
|
|
if state:
|
|
self.toolButton.setArrowType(QtCore.Qt.DownArrow)
|
|
else:
|
|
self.toolButton.setArrowType(QtCore.Qt.RightArrow)
|
|
|
|
self._expanded = state
|
|
self._widget.setVisible(state)
|
|
self.blockSignals(False)
|