From 9bdd7e2239a3ff66ffc469834a094c9b5a111ab9 Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Wed, 26 Sep 2012 17:27:05 +0200 Subject: [PATCH] More consistent dock widget painting on Windows Before we would draw dock widget handles on windows classic and no handles on XP, Vista and Windows 8. This would make it very hard to make a consistent look and feel across those styles. I also added a workaround to avoid the redundant toolbar borders when they are used outside of the toolbar areas. Change-Id: Ib703453677fcac8d51b2180abe45527297af0a80 Reviewed-by: Jens Bache-Wiig Reviewed-by: Gabriel de Dietrich --- src/widgets/styles/qwindowsstyle.cpp | 41 ++++++++----------------------- src/widgets/styles/qwindowsvistastyle.cpp | 3 ++- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp index dccf88a..355ecf8 100644 --- a/src/widgets/styles/qwindowsstyle.cpp +++ b/src/widgets/styles/qwindowsstyle.cpp @@ -377,6 +377,9 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW case PM_MenuVMargin: ret = 1; break; + case PM_DockWidgetSeparatorExtent: + ret = int(QStyleHelper::dpiScaled(4.)); + break; #ifndef QT_NO_TABBAR case PM_TabBarTabShiftHorizontal: ret = 0; @@ -1699,31 +1702,9 @@ void QWindowsStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, qDrawWinPanel(p, opt->rect, popupPal, opt->state & State_Sunken); break; } #ifndef QT_NO_DOCKWIDGET - case PE_IndicatorDockWidgetResizeHandle: { - QPen oldPen = p->pen(); - p->setPen(opt->palette.light().color()); - if (opt->state & State_Horizontal) { - p->drawLine(opt->rect.left(), opt->rect.top(), - opt->rect.right(), opt->rect.top()); - p->setPen(opt->palette.dark().color()); - p->drawLine(opt->rect.left(), opt->rect.bottom() - 1, - opt->rect.right(), opt->rect.bottom() - 1); - p->setPen(opt->palette.shadow().color()); - p->drawLine(opt->rect.left(), opt->rect.bottom(), - opt->rect.right(), opt->rect.bottom()); - } else { - p->drawLine(opt->rect.left(), opt->rect.top(), - opt->rect.left(), opt->rect.bottom()); - p->setPen(opt->palette.dark().color()); - p->drawLine(opt->rect.right() - 1, opt->rect.top(), - opt->rect.right() - 1, opt->rect.bottom()); - p->setPen(opt->palette.shadow().color()); - p->drawLine(opt->rect.right(), opt->rect.top(), - opt->rect.right(), opt->rect.bottom()); - } - p->setPen(oldPen); - break; } -case PE_FrameDockWidget: + case PE_IndicatorDockWidgetResizeHandle: + break; + case PE_FrameDockWidget: if (qstyleoption_cast(opt)) { proxy()->drawPrimitive(QStyle::PE_FrameWindow, opt, p, w); } @@ -2286,8 +2267,11 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai #ifndef QT_NO_TOOLBAR case CE_ToolBar: if (const QStyleOptionToolBar *toolbar = qstyleoption_cast(opt)) { - QRect rect = opt->rect; + // Reserve the beveled appearance only for mainwindow toolbars + if (!(widget && qobject_cast (widget->parentWidget()))) + break; + QRect rect = opt->rect; bool paintLeftBorder = true; bool paintRightBorder = true; bool paintBottomBorder = true; @@ -2513,11 +2497,6 @@ void QWindowsStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPai } p->fillRect(r.adjusted(0, 0, 0, -3), fillBrush); } - p->setPen(dwOpt->palette.color(QPalette::Light)); - if (!widget || !widget->isWindow()) { - p->drawLine(r.topLeft(), r.topRight()); - p->setPen(dwOpt->palette.color(QPalette::Dark)); - p->drawLine(r.bottomLeft(), r.bottomRight()); } } if (!dwOpt->title.isEmpty()) { QFont oldFont = p->font(); diff --git a/src/widgets/styles/qwindowsvistastyle.cpp b/src/widgets/styles/qwindowsvistastyle.cpp index cc94d67..cb34a20 100644 --- a/src/widgets/styles/qwindowsvistastyle.cpp +++ b/src/widgets/styles/qwindowsvistastyle.cpp @@ -1511,7 +1511,7 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption if (!dwOpt->title.isEmpty()) { QString titleText = painter->fontMetrics().elidedText(dwOpt->title, Qt::ElideRight, verticalTitleBar ? titleRect.height() : titleRect.width()); - const int indent = painter->fontMetrics().descent(); + const int indent = 4; drawItemText(painter, rect.adjusted(indent + 1, 1, -indent - 1, -1), Qt::AlignLeft | Qt::AlignVCenter, dwOpt->palette, dwOpt->state & State_Enabled, titleText, @@ -1524,6 +1524,7 @@ void QWindowsVistaStyle::drawControl(ControlElement element, const QStyleOption case CE_ItemViewItem: { const QStyleOptionViewItem *vopt; + const QAbstractItemView *view = qobject_cast(widget); bool newStyle = true; -- 2.7.4