diff options
Diffstat (limited to 'src/widgets/widgets/qdockwidget.cpp')
-rw-r--r-- | src/widgets/widgets/qdockwidget.cpp | 82 |
1 files changed, 61 insertions, 21 deletions
diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index 8d7d2a82d5..e17c2c1f4c 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -53,14 +53,10 @@ #include <qdebug.h> #include <private/qwidgetresizehandler_p.h> +#include <private/qstylesheetstyle_p.h> #include "qdockwidget_p.h" #include "qmainwindowlayout_p.h" -#if 0 // Used to be included in Qt4 for Q_WS_MAC -#include <private/qapplication_p.h> -#include <private/qt_mac_p.h> -#include <private/qmacstyle_mac_p.h> -#endif QT_BEGIN_NAMESPACE @@ -78,7 +74,7 @@ static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidge return qt_mainwindow_layout(window); p = p->parentWidget(); } - return Q_NULLPTR; + return nullptr; } static inline bool hasFeature(const QDockWidgetPrivate *priv, QDockWidget::DockWidgetFeature feature) @@ -125,15 +121,22 @@ class QDockWidgetTitleButton : public QAbstractButton public: QDockWidgetTitleButton(QDockWidget *dockWidget); - QSize sizeHint() const Q_DECL_OVERRIDE; - QSize minimumSizeHint() const Q_DECL_OVERRIDE + QSize sizeHint() const override; + QSize minimumSizeHint() const override { return sizeHint(); } - void enterEvent(QEvent *event) Q_DECL_OVERRIDE; - void leaveEvent(QEvent *event) Q_DECL_OVERRIDE; - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; -}; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; + void paintEvent(QPaintEvent *event) override; +protected: + bool event(QEvent *event) override; + +private: + QSize dockButtonIconSize() const; + + mutable int m_iconSize = -1; +}; QDockWidgetTitleButton::QDockWidgetTitleButton(QDockWidget *dockWidget) : QAbstractButton(dockWidget) @@ -141,14 +144,49 @@ QDockWidgetTitleButton::QDockWidgetTitleButton(QDockWidget *dockWidget) setFocusPolicy(Qt::NoFocus); } +bool QDockWidgetTitleButton::event(QEvent *event) +{ + switch (event->type()) { + case QEvent::StyleChange: + case QEvent::ScreenChangeInternal: + m_iconSize = -1; + break; + default: + break; + } + return QAbstractButton::event(event); +} + +static inline bool isWindowsStyle(const QStyle *style) +{ + // Note: QStyleSheetStyle inherits QWindowsStyle + const QStyle *effectiveStyle = style->inherits("QStyleSheetStyle") + ? static_cast<const QStyleSheetStyle *>(style)->baseStyle() + : style; + return effectiveStyle->inherits("QWindowsStyle"); +} + +QSize QDockWidgetTitleButton::dockButtonIconSize() const +{ + if (m_iconSize < 0) { + m_iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this); + // Dock Widget title buttons on Windows where historically limited to size 10 + // (from small icon size 16) since only a 10x10 XPM was provided. + // Adding larger pixmaps to the icons thus caused the icons to grow; limit + // this to qpiScaled(10) here. + if (isWindowsStyle(style())) + m_iconSize = qMin((10 * logicalDpiX()) / 96, m_iconSize); + } + return QSize(m_iconSize, m_iconSize); +} + QSize QDockWidgetTitleButton::sizeHint() const { ensurePolished(); int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this); if (!icon().isNull()) { - int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this); - QSize sz = icon().actualSize(QSize(iconSize, iconSize)); + const QSize sz = icon().actualSize(dockButtonIconSize()); size += qMax(sz.width(), sz.height()); } @@ -191,8 +229,7 @@ void QDockWidgetTitleButton::paintEvent(QPaintEvent *) opt.activeSubControls = 0; opt.features = QStyleOptionToolButton::None; opt.arrowType = Qt::NoArrow; - int size = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this); - opt.iconSize = QSize(size, size); + opt.iconSize = dockButtonIconSize(); style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this); } @@ -217,10 +254,9 @@ QDockWidgetLayout::~QDockWidgetLayout() bool QDockWidgetLayout::nativeWindowDeco() const { bool floating = parentWidget()->isWindow(); - if (!floating) { - if (auto groupWindow = qobject_cast<const QDockWidgetGroupWindow*>(parentWidget()->parentWidget())) - return groupWindow->hasNativeDecos(); - } + if (auto groupWindow = + qobject_cast<const QDockWidgetGroupWindow *>(parentWidget()->parentWidget())) + floating = floating || groupWindow->tabLayoutInfo(); return nativeWindowDeco(floating); } @@ -617,6 +653,8 @@ void QDockWidgetPrivate::init() QObject::connect(button, SIGNAL(clicked()), q, SLOT(close())); layout->setWidgetForRole(QDockWidgetLayout::CloseButton, button); + font = QApplication::font("QDockWidgetTitle"); + #ifndef QT_NO_ACTION toggleViewAction = new QAction(q); toggleViewAction->setCheckable(true); @@ -649,6 +687,7 @@ void QDockWidget::initStyleOption(QStyleOptionDockWidget *option) const // If we are in a floating tab, init from the parent because the attributes and the geometry // of the title bar should be taken from the floating window. option->initFrom(floatingTab && !isFloating() ? parentWidget() : this); + option->fontMetrics = QFontMetrics(d->font); option->rect = dwlayout->titleArea(); option->title = d->fixedWindowTitle; option->closable = hasFeature(this, QDockWidget::DockWidgetClosable); @@ -1442,9 +1481,10 @@ void QDockWidget::paintEvent(QPaintEvent *event) } // Title must be painted after the frame, since the areas overlap, and - // the title may wish to extend out to all sides (eg. XP style) + // the title may wish to extend out to all sides (eg. Vista style) QStyleOptionDockWidget titleOpt; initStyleOption(&titleOpt); + p.setFont(d_func()->font); p.drawControl(QStyle::CE_DockWidgetTitle, titleOpt); } } |