Beispiel #1
0
class DockWidgetTitleBar(QWidget):
    def __init__(self, dockWidget, hasCheckState=False, hasReport=False):
        super(DockWidgetTitleBar, self).__init__(dockWidget)
        q = dockWidget
        self.floatButton = DockWidgetTitleBarButton(self)
        self.floatButton.setIcon(q.style().standardIcon(
            QStyle.SP_TitleBarNormalButton, None, q))
        self.floatButton.clicked.connect(self.toggleFloating)
        self.floatButton.setVisible(True)
        self.floatButton.setToolTip(self.tr("Undock"))
        self.closeButton = DockWidgetTitleBarButton(self)
        self.closeButton.setIcon(q.style().standardIcon(
            QStyle.SP_TitleBarCloseButton, None, q))
        self.closeButton.clicked.connect(dockWidget.close)
        self.closeButton.setVisible(True)
        self.closeButton.setToolTip(self.tr("Close"))

        if hasCheckState:
            self.checkStateButton = QCheckBox(self)
            self.checkStateButton.setCheckState(2)
            self.checkStateButton.setToolTip(self.tr("Disable this window"))
            self.connect(self.checkStateButton, SIGNAL("stateChanged(int)"),
                         self.toggleCheckState)
        else:
            self.checkStateButton = False
        dockWidget.featuresChanged.connect(self.featuresChanged)
        self.featuresChanged(0)
        self.reportIcon = QIcon(":report")
        if hasReport:
            self.reportButton = DockWidgetTitleBarButton(self)
            self.reportButton.setIcon(self.reportIcon)
            self.reportButton.clicked.connect(self.toggleReport)
            self.reportButton.setVisible(True)
            self.reportButton.setToolTip(self.tr("Add content to report"))
        else:
            self.reportButton = None

    def hasFeature(self, dockwidget, feature):
        return dockwidget.features() & feature == feature

    def minimumSizeHint(self):
        return self.sizeHint()

    def sizeHint(self):
        q = self.parentWidget()
        mw = q.style().pixelMetric(QStyle.PM_DockWidgetTitleMargin, None, q)
        fw = q.style().pixelMetric(QStyle.PM_DockWidgetFrameWidth, None, q)
        closeSize = QSize(0, 0)
        if self.closeButton:
            closeSize = self.closeButton.sizeHint()

        floatSize = QSize(0, 0)
        if self.floatButton:
            floatSize = self.floatButton.sizeHint()
        hideSize = self.hideSizeHint()

        buttonHeight = max(max(closeSize.height(), floatSize.height()),
                           hideSize.height()) + 2
        buttonWidth = closeSize.width() + floatSize.width() + hideSize.width()
        titleFontMetrics = q.fontMetrics()
        fontHeight = titleFontMetrics.lineSpacing() + 2 * mw
        height = max(buttonHeight, fontHeight)
        return QSize(buttonWidth + height + 4 * mw + 2 * fw, height)

    def hideSizeHint(self):
        if self.reportButton and self.checkStateButton:
            return self.reportButton.sizeHint(
            ) + self.checkStateButton.sizeHint()
        elif self.reportButton:
            return self.reportButton.sizeHint()
        elif self.checkStateButton:
            return self.checkStateButton.sizeHint()
        else:
            return QSize(0, 0)

    def paintEvent(self, _event):
        p = QStylePainter(self)
        q = self.parentWidget()
        fw = q.isFloating() and q.style().pixelMetric(
            QStyle.PM_DockWidgetFrameWidth, None, q) or 0
        mw = q.style().pixelMetric(QStyle.PM_DockWidgetTitleMargin, None, q)
        titleOpt = QStyleOptionDockWidgetV2()
        titleOpt.initFrom(q)
        titleOpt.rect = self.titleOptionRect(fw, mw)
        titleOpt.title = q.windowTitle()
        titleOpt.closable = self.hasFeature(q, QDockWidget.DockWidgetClosable)
        titleOpt.floatable = self.hasFeature(q,
                                             QDockWidget.DockWidgetFloatable)
        p.drawControl(QStyle.CE_DockWidgetTitle, titleOpt)

    def titleOptionRect(self, fw, mw):
        if self.reportButton and self.checkStateButton:
            return QRect(
                QPoint(
                    fw + mw + self.reportButton.size().width() +
                    self.checkStateButton.size().width(), fw),
                QSize(
                    self.geometry().width() - (fw * 2) - mw -
                    self.reportButton.size().width() -
                    self.checkStateButton.size().width(),
                    self.geometry().height() - (fw * 2)))
        elif self.reportButton:
            return QRect(
                QPoint(fw + mw + self.reportButton.size().width(), fw),
                QSize(
                    self.geometry().width() - (fw * 2) - mw -
                    self.reportButton.size().width(),
                    self.geometry().height() - (fw * 2)))
        elif self.checkStateButton:
            return QRect(
                QPoint(fw + mw + self.checkStateButton.size().width(), fw),
                QSize(
                    self.geometry().width() - (fw * 2) - mw -
                    self.checkStateButton.size().width(),
                    self.geometry().height() - (fw * 2)))
        else:
            return QRect(
                QPoint(fw + mw, fw),
                QSize(self.geometry().width() - (fw * 2) - mw,
                      self.geometry().height() - (fw * 2)))

    def resizeEvent(self, _event):
        q = self.parentWidget()
        fw = q.isFloating() and q.style().pixelMetric(
            QStyle.PM_DockWidgetFrameWidth, None, q) or 0
        opt = QStyleOptionDockWidgetV2()
        opt.initFrom(q)
        opt.rect = QRect(
            QPoint(fw, fw),
            QSize(self.geometry().width() - (fw * 2),
                  self.geometry().height() - (fw * 2)))
        opt.title = q.windowTitle()
        opt.closable = self.hasFeature(q, QDockWidget.DockWidgetClosable)
        opt.floatable = self.hasFeature(q, QDockWidget.DockWidgetFloatable)
        floatRect = q.style().subElementRect(QStyle.SE_DockWidgetFloatButton,
                                             opt, q)
        if not floatRect.isNull():
            self.floatButton.setGeometry(floatRect)
        closeRect = q.style().subElementRect(QStyle.SE_DockWidgetCloseButton,
                                             opt, q)
        if not closeRect.isNull():
            self.closeButton.setGeometry(closeRect)
        top = fw
        if not floatRect.isNull():
            top = floatRect.y()
        elif not closeRect.isNull():
            top = closeRect.y()
        if self.checkStateButton:
            size = self.checkStateButton.size()
            if not closeRect.isNull():
                size = self.closeButton.size()
            elif not floatRect.isNull():
                size = self.floatButton.size()
            checkStateRect = QRect(QPoint(fw, top), size)
            self.checkStateButton.setGeometry(checkStateRect)
        if self.reportButton:
            size = self.reportButton.size()
            if not closeRect.isNull():
                size = self.closeButton.size()
            elif not floatRect.isNull():
                size = self.floatButton.size()
            reportRect = QRect(QPoint(fw, top), size)
            self.reportButton.setGeometry(reportRect)

    def toggleFloating(self):
        parent = self.parentWidget()
        parent.setFloating(not parent.isFloating())

    def toggleCheckState(self, state):
        parent = self.parentWidget()
        if parent:
            if state != 0:
                parent.updateCheckState(True)
            else:
                parent.updateCheckState(False)

    def toggleReport(self):
        parent = self.parentWidget()
        if parent:
            parent.report()

    def featuresChanged(self, _features):
        parent = self.parentWidget()
        self.closeButton.setVisible(
            self.hasFeature(parent, QDockWidget.DockWidgetClosable))
        self.floatButton.setVisible(
            self.hasFeature(parent, QDockWidget.DockWidgetFloatable))
Beispiel #2
0
class DockWidgetTitleBar(QWidget):
    def __init__(self, dockWidget, hasCheckState = False):
        super(DockWidgetTitleBar, self).__init__(dockWidget)
        q = dockWidget
        self.floatButton = DockWidgetTitleBarButton(self)
        self.floatButton.setIcon(q.style().standardIcon(QStyle.SP_TitleBarNormalButton, None, q))
        self.floatButton.clicked.connect(self.toggleFloating)
        self.floatButton.setVisible(True)
        self.floatButton.setToolTip(self.tr("Undock"))
        self.closeButton = DockWidgetTitleBarButton(self)
        self.closeButton.setIcon(q.style().standardIcon(QStyle.SP_TitleBarCloseButton, None, q))
        self.closeButton.clicked.connect(dockWidget.close)
        self.closeButton.setVisible(True)
        self.closeButton.setToolTip(self.tr("Close"))

	if hasCheckState:
          self.checkStateButton = QCheckBox(self)
	  self.checkStateButton.setCheckState(2)
	  self.checkStateButton.setToolTip(self.tr("Disable this window"))
	  self.connect(self.checkStateButton, SIGNAL("stateChanged(int)"), self.toggleCheckState)
        else:
	  self.checkStateButton = False 
        dockWidget.featuresChanged.connect(self.featuresChanged)
        self.featuresChanged(0)
  
    def hasFeature(self, dockwidget, feature):
      return dockwidget.features() & feature == feature
 
    def minimumSizeHint(self):
        return self.sizeHint()
    
    def sizeHint(self):
        q = self.parentWidget()
        mw = q.style().pixelMetric(QStyle.PM_DockWidgetTitleMargin, None, q)
        fw = q.style().pixelMetric(QStyle.PM_DockWidgetFrameWidth, None, q)
        closeSize = QSize(0, 0)
        if self.closeButton:
            closeSize = self.closeButton.sizeHint()

        floatSize = QSize(0, 0)
        if self.floatButton:
            floatSize = self.floatButton.sizeHint()
        hideSize = self.hideSizeHint()

        buttonHeight = max(max(closeSize.height(), floatSize.height()), hideSize.height()) + 2
        buttonWidth = closeSize.width() + floatSize.width() + hideSize.width()
        titleFontMetrics = q.fontMetrics()
        fontHeight = titleFontMetrics.lineSpacing() + 2 * mw
        height = max(buttonHeight, fontHeight)
        return QSize(buttonWidth + height + 4 * mw + 2 * fw, height)
 
    def hideSizeHint(self):
       if self.checkStateButton:
	 return self.checkStateButton.sizeHint()
       else:
         return QSize(0, 0)
 
    def paintEvent(self, _event):
        p = QStylePainter(self)
        q = self.parentWidget()
        fw = q.isFloating() and q.style().pixelMetric(QStyle.PM_DockWidgetFrameWidth, None, q) or 0
        mw = q.style().pixelMetric( QStyle.PM_DockWidgetTitleMargin, None, q)
        titleOpt = QStyleOptionDockWidgetV2()
        titleOpt.initFrom(q)
        titleOpt.rect = self.titleOptionRect(fw, mw)
        titleOpt.title = q.windowTitle()
        titleOpt.closable = self.hasFeature(q, QDockWidget.DockWidgetClosable)
        titleOpt.floatable = self.hasFeature(q, QDockWidget.DockWidgetFloatable)
        p.drawControl(QStyle.CE_DockWidgetTitle, titleOpt)
 
    def titleOptionRect(self, fw, mw):
 	if self.checkStateButton:
	  return  QRect(QPoint(fw + mw + self.checkStateButton.size().width(), fw), QSize(self.geometry().width() - ( fw * 2 ) - mw - self.checkStateButton.size().width(), self.geometry().height() - ( fw * 2 )))
        else:
          return QRect(QPoint(fw + mw, fw), QSize(self.geometry().width() - ( fw * 2 ) - mw, self.geometry().height() - ( fw * 2 )))
 
    def resizeEvent(self, _event):
        q = self.parentWidget()
        fw = q.isFloating() and q.style().pixelMetric(QStyle.PM_DockWidgetFrameWidth, None, q) or 0
        opt = QStyleOptionDockWidgetV2()
        opt.initFrom(q)
        opt.rect = QRect(QPoint(fw, fw), QSize(self.geometry().width() - (fw * 2), self.geometry().height() - (fw * 2)))
        opt.title = q.windowTitle()
        opt.closable = self.hasFeature(q, QDockWidget.DockWidgetClosable)
        opt.floatable = self.hasFeature(q, QDockWidget.DockWidgetFloatable)
        floatRect = q.style().subElementRect(QStyle.SE_DockWidgetFloatButton, opt, q)
        if not floatRect.isNull():
            self.floatButton.setGeometry(floatRect)
        closeRect = q.style().subElementRect(QStyle.SE_DockWidgetCloseButton, opt, q)
        if not closeRect.isNull():
            self.closeButton.setGeometry(closeRect)
        top = fw
        if not floatRect.isNull():
            top = floatRect.y()
        elif not closeRect.isNull():
            top = closeRect.y()
        if self.checkStateButton:
          size = self.checkStateButton.size()
          if not closeRect.isNull():
            size = self.closeButton.size()
          elif not floatRect.isNull():
            size = self.floatButton.size()
          checkStateRect = QRect(QPoint(fw, top), size)
          self.checkStateButton.setGeometry(checkStateRect)
  
    def toggleFloating( self ):
        parent = self.parentWidget()
        parent.setFloating(not parent.isFloating())
 
    def toggleCheckState(self, state):
       parent = self.parentWidget()
       if parent:
         if state != 0:
           parent.updateCheckState(True)
         else:
	   parent.updateCheckState(False)
 
    def featuresChanged(self, _features):
        parent = self.parentWidget()
        self.closeButton.setVisible(self.hasFeature(parent, QDockWidget.DockWidgetClosable))
        self.floatButton.setVisible(self.hasFeature(parent, QDockWidget.DockWidgetFloatable))