manuskript/manuskript/ui/collapsibleDockWidgets.py
2016-02-06 08:38:33 +01:00

96 lines
3 KiB
Python

#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
class collapsibleDockWidgets(QToolBar):
"""
QMainWindow "mixin" which provides auto-hiding support for dock widgets
(not toolbars).
"""
TRANSPOSED_AREA = {
Qt.LeftDockWidgetArea: Qt.LeftToolBarArea,
Qt.RightDockWidgetArea: Qt.RightToolBarArea,
Qt.TopDockWidgetArea: Qt.TopToolBarArea,
Qt.BottomDockWidgetArea: Qt.BottomToolBarArea,
}
def __init__(self, area, parent, name=""):
QToolBar.__init__(self, parent)
self._area = area
if not name:
name = self.tr("Dock Widgets Toolbar")
self.setObjectName(name)
self.setWindowTitle(name)
self.setFloatable(False)
self.setMovable(False)
#self.setAllowedAreas(self.TRANSPOSED_AREA[self._area])
self.parent().addToolBar(self.TRANSPOSED_AREA[self._area], self)
# Dock widgets
for d in self._dockWidgets():
b = verticalButton(self)
b.setDefaultAction(d.toggleViewAction())
self.addWidget(b)
self.addSeparator()
# Other widgets
self.otherWidgets = []
self.currentGroup = None
def _dockWidgets(self):
mw = self.parent()
for w in mw.findChildren(QDockWidget, None):
yield w
def addCustomWidget(self, text, widget, group=None):
a = QAction(text, self)
a.setCheckable(True)
a.setChecked(widget.isVisible())
a.toggled.connect(widget.setVisible)
#widget.installEventFilter(self)
b = verticalButton(self)
b.setDefaultAction(a)
a2 = self.addWidget(b)
self.otherWidgets.append((b, a2, widget, group))
#def eventFilter(self, widget, event):
#if event.type() in [QEvent.Show, QEvent.Hide]:
#for btn, action, w, grp in self.otherWidgets:
#if w == widget:
#btn.defaultAction().setChecked(event.type() == QEvent.Show)
#return False
def setCurrentGroup(self, group):
self.currentGroup = group
for btn, action, widget, grp in self.otherWidgets:
if not grp == group or grp == None:
action.setVisible(False)
else:
action.setVisible(True)
class verticalButton(QToolButton):
def __init__(self, parent):
QToolButton.__init__(self, parent)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum)
def sizeHint(self):
return QToolButton.sizeHint(self).transposed()
def paintEvent(self, event):
p = QStylePainter(self)
p.rotate(90)
p.translate(0, - self.width())
opt = QStyleOptionButton()
opt.initFrom(self)
opt.text = self.text()
if self.isChecked():
opt.state |= QStyle.State_On
s = opt.rect.size().transposed()
opt.rect.setSize(s)
p.drawControl(QStyle.CE_PushButton, opt)