Fusion style: Use QStyleHelper::dpiScaled() where applicable.

When running unscaled on a high resolution display, some items
are too small. This patch converts most values returned by
QFusionStyle::pixelMetric() via QStyleHelper::dpiScaled(). Some
adjustments have been done to RadioButton, CheckBox, Slider and
SpinBox.

On systems with 96dpi, FusionStyle should still look exactly as
before this patch.

Task-number: QTBUG-40277
Task-number: QTBUG-38858
Change-Id: I2683a8a4db615d01c08f4d6f559417b995c0eb1a
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
bb10
Friedemann Kleint 2014-07-20 14:22:24 +02:00 committed by Alessandro Portale
parent 40d3ab564b
commit 7daf920e97
1 changed files with 83 additions and 57 deletions

View File

@ -749,6 +749,7 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
painter->drawRect(rect);
QColor checkMarkColor = option->palette.text().color().darker(120);
const int checkMarkPadding = QStyleHelper::dpiScaled(3);
if (checkbox->state & State_NoChange) {
gradient = QLinearGradient(rect.topLeft(), rect.bottomLeft());
@ -759,10 +760,10 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
checkMarkColor.setAlpha(180);
painter->setPen(QPen(checkMarkColor, 1));
painter->setBrush(gradient);
painter->drawRect(rect.adjusted(3, 3, -3, -3));
painter->drawRect(rect.adjusted(checkMarkPadding, checkMarkPadding, -checkMarkPadding, -checkMarkPadding));
} else if (checkbox->state & (State_On)) {
QPen checkPen = QPen(checkMarkColor, 1.8);
QPen checkPen = QPen(checkMarkColor, QStyleHelper::dpiScaled(1.8));
checkMarkColor.setAlpha(210);
painter->translate(-1, 0.5);
painter->setPen(checkPen);
@ -771,9 +772,9 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
// Draw checkmark
QPainterPath path;
path.moveTo(5, rect.height() / 2.0);
path.lineTo(rect.width() / 2.0 - 0, rect.height() - 3);
path.lineTo(rect.width() - 2.5, 3);
path.moveTo(2 + checkMarkPadding, rect.height() / 2.0);
path.lineTo(rect.width() / 2.0, rect.height() - checkMarkPadding);
path.lineTo(rect.width() - checkMarkPadding - 0.5, checkMarkPadding);
painter->drawPath(path.translated(rect.topLeft()));
}
}
@ -786,7 +787,9 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
painter->setBrush((state & State_Sunken) ? pressedColor : option->palette.base().color());
painter->setRenderHint(QPainter::Antialiasing, true);
QPainterPath circle;
circle.addEllipse(rect.center() + QPoint(1.0, 1.0), 6.5, 6.5);
const QPointF circleCenter = rect.center() + QPoint(1, 1);
const qreal outlineRadius = (rect.width() + (rect.width() + 1) % 2) / 2.0 - 1;
circle.addEllipse(circleCenter, outlineRadius, outlineRadius);
painter->setPen(QPen(option->palette.background().color().darker(150)));
if (option->state & State_HasFocus && option->state & State_KeyboardFocusChange)
painter->setPen(QPen(highlightedOutline));
@ -794,7 +797,8 @@ void QFusionStyle::drawPrimitive(PrimitiveElement elem,
if (state & (State_On )) {
circle = QPainterPath();
circle.addEllipse(rect.center() + QPoint(1, 1), 2.8, 2.8);
const qreal checkmarkRadius = outlineRadius / 2.32;
circle.addEllipse(circleCenter, checkmarkRadius, checkmarkRadius);
QColor checkMarkColor = option->palette.text().color().darker(120);
checkMarkColor.setAlpha(200);
painter->setPen(checkMarkColor);
@ -3016,97 +3020,120 @@ void QFusionStyle::drawComplexControl(ComplexControl control, const QStyleOption
*/
int QFusionStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
{
int val = -1;
switch (metric) {
case PM_SliderTickmarkOffset:
return 4;
val = 4;
break;
case PM_HeaderMargin:
return 2;
case PM_ToolTipLabelFrameWidth:
return 2;
val = 2;
break;
case PM_ButtonDefaultIndicator:
return 0;
case PM_ButtonShiftHorizontal:
case PM_ButtonShiftVertical:
return 0;
val = 0;
break;
case PM_MessageBoxIconSize:
return 48;
val = 48;
break;
case PM_ListViewIconSize:
return 24;
val = 24;
break;
case PM_DialogButtonsSeparator:
case PM_ScrollBarSliderMin:
return 26;
val = 26;
break;
case PM_TitleBarHeight:
return 24;
val = 24;
break;
case PM_ScrollBarExtent:
return 14;
val = 14;
break;
case PM_SliderThickness:
return 15;
case PM_SliderLength:
return 15;
val = 15;
break;
case PM_DockWidgetTitleMargin:
return 1;
case PM_DefaultFrameWidth:
return 1;
val = 1;
break;
case PM_SpinBoxFrameWidth:
return 3;
val = 3;
break;
case PM_MenuVMargin:
case PM_MenuHMargin:
return 0;
case PM_MenuPanelWidth:
return 0;
val = 0;
break;
case PM_MenuBarItemSpacing:
return 6;
val = 6;
break;
case PM_MenuBarVMargin:
return 0;
case PM_MenuBarHMargin:
return 0;
case PM_MenuBarPanelWidth:
return 0;
val = 0;
break;
case PM_ToolBarHandleExtent:
return 9;
val = 9;
break;
case PM_ToolBarItemSpacing:
return 1;
val = 1;
break;
case PM_ToolBarFrameWidth:
return 2;
case PM_ToolBarItemMargin:
return 2;
val = 2;
break;
case PM_SmallIconSize:
return 16;
case PM_ButtonIconSize:
return 16;
val = 16;
break;
case PM_DockWidgetTitleBarButtonMargin:
return 2;
val = 2;
break;
case PM_MaximumDragDistance:
return -1;
val = -1;
break;
case PM_TabCloseIndicatorWidth:
case PM_TabCloseIndicatorHeight:
return 20;
val = 20;
break;
case PM_TabBarTabVSpace:
return 12;
val = 12;
break;
case PM_TabBarTabOverlap:
return 1;
val = 1;
break;
case PM_TabBarBaseOverlap:
return 2;
val = 2;
break;
case PM_SubMenuOverlap:
return -1;
val = -1;
break;
case PM_DockWidgetHandleExtent:
case PM_SplitterWidth:
return 4;
val = 4;
break;
case PM_IndicatorHeight:
case PM_IndicatorWidth:
case PM_ExclusiveIndicatorHeight:
case PM_ExclusiveIndicatorWidth:
return 14;
val = 14;
break;
case PM_ScrollView_ScrollBarSpacing:
return 0;
val = 0;
break;
case PM_ScrollView_ScrollBarOverlap:
if (proxy()->styleHint(SH_ScrollBar_Transient, option, widget))
return proxy()->pixelMetric(PM_ScrollBarExtent, option, widget);
return 0;
default:
val = 0;
break;
case PM_DefaultFrameWidth:
return 1; // Do not dpi-scale because the drawn frame is always exactly 1 pixel thick
break;
default:
return QCommonStyle::pixelMetric(metric, option, widget);
}
return QCommonStyle::pixelMetric(metric, option, widget);
return QStyleHelper::dpiScaled(val);
}
/*!
@ -3309,14 +3336,15 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom
break;
case SC_SliderGroove: {
QPoint grooveCenter = slider->rect.center();
const int grooveThickness = QStyleHelper::dpiScaled(7);
if (slider->orientation == Qt::Horizontal) {
rect.setHeight(7);
rect.setHeight(grooveThickness);
if (slider->tickPosition & QSlider::TicksAbove)
grooveCenter.ry() += tickSize;
if (slider->tickPosition & QSlider::TicksBelow)
grooveCenter.ry() -= tickSize;
} else {
rect.setWidth(7);
rect.setWidth(grooveThickness);
if (slider->tickPosition & QSlider::TicksAbove)
grooveCenter.rx() += tickSize;
if (slider->tickPosition & QSlider::TicksBelow)
@ -3332,27 +3360,25 @@ QRect QFusionStyle::subControlRect(ComplexControl control, const QStyleOptionCom
break;
case CC_SpinBox:
if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
QSize bs;
int center = spinbox->rect.height() / 2;
int fw = spinbox->frame ? proxy()->pixelMetric(PM_SpinBoxFrameWidth, spinbox, widget) : 0;
int fw = spinbox->frame ? 3 : 0; // Is drawn with 3 pixels width in drawComplexControl, independently from PM_SpinBoxFrameWidth
int y = fw;
bs.setHeight(qMax(8, spinbox->rect.height()/2 - y));
bs.setWidth(14);
const int buttonWidth = QStyleHelper::dpiScaled(14);
int x, lx, rx;
x = spinbox->rect.width() - y - bs.width() + 2;
x = spinbox->rect.width() - y - buttonWidth + 2;
lx = fw;
rx = x - fw;
switch (subControl) {
case SC_SpinBoxUp:
if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
return QRect();
rect = QRect(x, fw, bs.width(), center - fw);
rect = QRect(x, fw, buttonWidth, center - fw);
break;
case SC_SpinBoxDown:
if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
return QRect();
rect = QRect(x, center, bs.width(), spinbox->rect.bottom() - center - fw + 1);
rect = QRect(x, center, buttonWidth, spinbox->rect.bottom() - center - fw + 1);
break;
case SC_SpinBoxEditField:
if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons) {