2015-06-01 08:41:32 +12:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#--!-- coding: utf8 --!--
|
|
|
|
|
2015-06-08 08:06:57 +12:00
|
|
|
|
|
|
|
|
2015-06-01 08:41:32 +12:00
|
|
|
|
2015-06-04 04:40:19 +12:00
|
|
|
from qt import *
|
2015-06-01 08:41:32 +12:00
|
|
|
|
|
|
|
class collapsibleGroupBox(QGroupBox):
|
|
|
|
|
|
|
|
def __init__(self, parent=None):
|
|
|
|
QGroupBox.__init__(self)
|
|
|
|
|
|
|
|
self.toggled.connect(self.setExpanded)
|
|
|
|
self.tempWidget = QWidget()
|
2015-06-07 00:21:48 +12:00
|
|
|
|
|
|
|
self.customStyle = False
|
2015-06-01 08:41:32 +12:00
|
|
|
|
|
|
|
def setExpanded(self, val):
|
|
|
|
self.setCollapsed(not val)
|
|
|
|
|
|
|
|
def setCollapsed(self, val):
|
|
|
|
if val:
|
|
|
|
# Save layout
|
|
|
|
self.tempWidget.setLayout(self.layout())
|
|
|
|
# Set empty layout
|
|
|
|
l = QVBoxLayout()
|
|
|
|
#print(l.contentsMargins().left(), l.contentsMargins().bottom(), l.contentsMargins().top(), )
|
|
|
|
l.setContentsMargins(0, 0, 0, 0)
|
|
|
|
self.setLayout(l)
|
2015-06-07 00:21:48 +12:00
|
|
|
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
|
2015-06-01 08:41:32 +12:00
|
|
|
else:
|
|
|
|
# Delete layout
|
|
|
|
QWidget().setLayout(self.layout())
|
|
|
|
# Set saved layout
|
|
|
|
self.setLayout(self.tempWidget.layout())
|
2015-06-07 00:21:48 +12:00
|
|
|
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
|
|
|
|
|
|
|
|
def paintEvent(self, event):
|
|
|
|
|
|
|
|
if not self.customStyle:
|
|
|
|
return QGroupBox.paintEvent(self, event)
|
|
|
|
|
|
|
|
p = QStylePainter(self)
|
|
|
|
opt = QStyleOptionGroupBox()
|
|
|
|
self.initStyleOption(opt)
|
|
|
|
|
|
|
|
style = qApp.style()
|
|
|
|
groupBox = opt
|
|
|
|
|
|
|
|
#// Draw frame
|
|
|
|
textRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxLabel)
|
|
|
|
checkBoxRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxCheckBox)
|
|
|
|
|
|
|
|
p.save()
|
|
|
|
titleRect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxFrame)
|
|
|
|
#r.setBottom(style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxContents).top())
|
|
|
|
titleRect.setHeight(textRect.height())
|
|
|
|
titleRect.moveTop(textRect.top())
|
|
|
|
|
|
|
|
p.setBrush(QBrush(QColor(Qt.blue).lighter(190)))
|
|
|
|
p.setPen(Qt.NoPen)
|
|
|
|
p.drawRoundedRect(titleRect, 10, 10)
|
|
|
|
p.restore()
|
|
|
|
|
|
|
|
if groupBox.subControls & QStyle.SC_GroupBoxFrame:
|
|
|
|
frame = QStyleOptionFrame()
|
|
|
|
#frame.operator=(groupBox)
|
|
|
|
frame.state = groupBox.state
|
|
|
|
frame.features = groupBox.features
|
|
|
|
frame.lineWidth = groupBox.lineWidth
|
|
|
|
frame.midLineWidth = groupBox.midLineWidth
|
|
|
|
frame.rect = style.subControlRect(style.CC_GroupBox, opt, style.SC_GroupBoxFrame)
|
|
|
|
p.save()
|
|
|
|
region = QRegion(groupBox.rect)
|
|
|
|
if groupBox.text:
|
|
|
|
ltr = groupBox.direction == Qt.LeftToRight
|
|
|
|
finalRect = QRect()
|
|
|
|
if groupBox.subControls & QStyle.SC_GroupBoxCheckBox:
|
|
|
|
finalRect = checkBoxRect.united(textRect)
|
|
|
|
finalRect.adjust(-4 if ltr else 0, 0, 0 if ltr else 4, 0)
|
|
|
|
else:
|
|
|
|
finalRect = textRect
|
|
|
|
|
|
|
|
region -= QRegion(finalRect)
|
|
|
|
|
|
|
|
p.setClipRegion(region)
|
|
|
|
style.drawPrimitive(style.PE_FrameGroupBox, frame, p)
|
|
|
|
p.restore()
|
|
|
|
|
|
|
|
##// Draw title
|
|
|
|
if groupBox.subControls & QStyle.SC_GroupBoxLabel and groupBox.text:
|
|
|
|
#textColor = QColor(groupBox.textColor)
|
|
|
|
#if textColor.isValid():
|
|
|
|
#p.setPen(textColor)
|
|
|
|
#alignment = int(groupBox.textAlignment)
|
|
|
|
#if not style.styleHint(QStyle.SH_UnderlineShortcut, opt):
|
|
|
|
#alignment |= Qt.TextHideMnemonic
|
|
|
|
|
|
|
|
#style.drawItemText(p, textRect, Qt.TextShowMnemonic | Qt.AlignHCenter | alignment,
|
|
|
|
#groupBox.palette, groupBox.state & style.State_Enabled, groupBox.text,
|
|
|
|
#QPalette.NoRole if textColor.isValid() else QPalette.WindowText)
|
|
|
|
|
|
|
|
p.save()
|
|
|
|
topt = QTextOption(Qt.AlignHCenter | Qt.AlignVCenter)
|
|
|
|
f = QFont()
|
|
|
|
f.setBold(True)
|
|
|
|
p.setFont(f)
|
|
|
|
p.setPen(Qt.darkBlue)
|
|
|
|
p.drawText(QRectF(titleRect), groupBox.text.replace("&", ""), topt)
|
|
|
|
p.restore()
|
|
|
|
|
|
|
|
if groupBox.state & style.State_HasFocus:
|
|
|
|
fropt = QStyleOptionFocusRect()
|
|
|
|
#fropt.operator=(groupBox)
|
|
|
|
fropt.state = groupBox.state
|
|
|
|
fropt.rect = textRect
|
|
|
|
style.drawPrimitive(style.PE_FrameFocusRect, fropt, p)
|
|
|
|
|
|
|
|
#// Draw checkbox
|
|
|
|
#if groupBox.subControls & style.SC_GroupBoxCheckBox:
|
|
|
|
#box = QStyleOptionButton()
|
|
|
|
##box.operator=(groupBox)
|
|
|
|
#box.state = groupBox.state
|
|
|
|
#box.rect = checkBoxRect
|
|
|
|
#style.drawPrimitive(style.PE_IndicatorCheckBox, box, p)
|