Add a collapsible QGroubBox widget

This commit is contained in:
Luke Campagnola 2017-09-03 16:48:08 -07:00
parent dd672c41b6
commit 8398e578b9
2 changed files with 92 additions and 0 deletions

View File

@ -262,6 +262,7 @@ from .widgets.GraphicsView import *
from .widgets.LayoutWidget import *
from .widgets.TableWidget import *
from .widgets.ProgressDialog import *
from .widgets.GroupBox import GroupBox
from .imageview import *
from .WidgetGroup import *

View File

@ -0,0 +1,91 @@
from ..Qt import QtGui, QtCore
from .PathButton import PathButton
class GroupBox(QtGui.QGroupBox):
"""Subclass of QGroupBox that implements collapse handle.
"""
sigCollapseChanged = QtCore.Signal(object)
def __init__(self, *args):
QtGui.QGroupBox.__init__(self, *args)
self._collapsed = False
# We modify the size policy when the group box is collapsed, so
# keep track of the last requested policy:
self._lastSizePlocy = self.sizePolicy()
self.closePath = QtGui.QPainterPath()
self.closePath.moveTo(0, -1)
self.closePath.lineTo(0, 1)
self.closePath.lineTo(1, 0)
self.closePath.lineTo(0, -1)
self.openPath = QtGui.QPainterPath()
self.openPath.moveTo(-1, 0)
self.openPath.lineTo(1, 0)
self.openPath.lineTo(0, 1)
self.openPath.lineTo(-1, 0)
self.collapseBtn = PathButton(path=self.openPath, size=(12, 12), margin=0)
self.collapseBtn.setStyleSheet("""
border: none;
""")
self.collapseBtn.setPen('k')
self.collapseBtn.setBrush('w')
self.collapseBtn.setParent(self)
self.collapseBtn.move(3, 3)
self.collapseBtn.setFlat(True)
self.collapseBtn.clicked.connect(self.toggleCollapsed)
if len(args) > 0 and isinstance(args[0], basestring):
self.setTitle(args[0])
def toggleCollapsed(self):
self.setCollapsed(not self._collapsed)
def collapsed(self):
return self._collapsed
def setCollapsed(self, c):
if c == self._collapsed:
return
if c is True:
self.collapseBtn.setPath(self.closePath)
self.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred, closing=True)
elif c is False:
self.collapseBtn.setPath(self.openPath)
self.setSizePolicy(self._lastSizePolicy)
else:
raise TypeError("Invalid argument %r; must be bool." % c)
for ch in self.children():
if isinstance(ch, QtGui.QWidget) and ch is not self.collapseBtn:
ch.setVisible(not c)
self._collapsed = c
self.sigCollapseChanged.emit(c)
def setSizePolicy(self, *args, **kwds):
QtGui.QGroupBox.setSizePolicy(self, *args)
if kwds.pop('closing', False) is True:
self._lastSizePolicy = self.sizePolicy()
def setHorizontalPolicy(self, *args):
QtGui.QGroupBox.setHorizontalPolicy(self, *args)
self._lastSizePolicy = self.sizePolicy()
def setVerticalPolicy(self, *args):
QtGui.QGroupBox.setVerticalPolicy(self, *args)
self._lastSizePolicy = self.sizePolicy()
def setTitle(self, title):
# Leave room for button
QtGui.QGroupBox.setTitle(self, " " + title)
def widgetGroupInterface(self):
return (self.sigCollapseChanged,
GroupBox.collapsed,
GroupBox.setCollapsed,
True)