Windows styles: Scale hardcoded-values according to DPI.

Factor out functions to return the fixed values and scale those.

Task-number: QTBUG-38993
Task-number: QTBUG-38858
Change-Id: I59c70a206eae76bf08bc2aeb5cda5a740cd3d6dc
Reviewed-by: Alessandro Portale <alessandro.portale@digia.com>
bb10
Friedemann Kleint 2014-08-29 17:41:50 +02:00
parent 176bd1edfa
commit 585cef5f90
6 changed files with 84 additions and 71 deletions

View File

@ -355,6 +355,57 @@ int QWindowsStylePrivate::pixelMetricFromSystemDp(QStyle::PixelMetric pm, const
return QWindowsStylePrivate::InvalidMetric;
}
int QWindowsStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm)
{
switch (pm) {
case QStyle::PM_ToolBarItemSpacing:
return 0;
case QStyle::PM_ButtonDefaultIndicator:
case QStyle::PM_ButtonShiftHorizontal:
case QStyle::PM_ButtonShiftVertical:
case QStyle::PM_MenuHMargin:
case QStyle::PM_MenuVMargin:
case QStyle::PM_ToolBarItemMargin:
return 1;
break;
case QStyle::PM_DockWidgetSeparatorExtent:
return 4;
#ifndef QT_NO_TABBAR
case QStyle::PM_TabBarTabShiftHorizontal:
return 0;
case QStyle::PM_TabBarTabShiftVertical:
return 2;
#endif
#ifndef QT_NO_SLIDER
case QStyle::PM_SliderLength:
return 11;
#endif // QT_NO_SLIDER
#ifndef QT_NO_MENU
case QStyle::PM_MenuBarHMargin:
case QStyle::PM_MenuBarVMargin:
case QStyle::PM_MenuBarPanelWidth:
return 0;
case QStyle::PM_SmallIconSize:
return 16;
case QStyle::PM_LargeIconSize:
return 32;
case QStyle::PM_DockWidgetTitleMargin:
return 2;
case QStyle::PM_DockWidgetTitleBarButtonMargin:
case QStyle::PM_DockWidgetFrameWidth:
return 4;
#endif // QT_NO_MENU
case QStyle::PM_ToolBarHandleExtent:
return 10;
default:
break;
}
return QWindowsStylePrivate::InvalidMetric;
}
/*!
\reimp
*/
@ -364,29 +415,13 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW
if (ret != QWindowsStylePrivate::InvalidMetric)
return ret / QWindowsStylePrivate::devicePixelRatio(widget);
ret = QWindowsStylePrivate::fixedPixelMetric(pm);
if (ret != QWindowsStylePrivate::InvalidMetric)
return int(QStyleHelper::dpiScaled(ret));
ret = 0;
switch (pm) {
case PM_ToolBarItemSpacing:
break;
case PM_ButtonDefaultIndicator:
case PM_ButtonShiftHorizontal:
case PM_ButtonShiftVertical:
case PM_MenuHMargin:
case PM_MenuVMargin:
case PM_ToolBarItemMargin:
ret = 1;
break;
case PM_DockWidgetSeparatorExtent:
ret = int(QStyleHelper::dpiScaled(4.));
break;
#ifndef QT_NO_TABBAR
case PM_TabBarTabShiftHorizontal:
break;
case PM_TabBarTabShiftVertical:
ret = 2;
break;
#endif
case PM_MaximumDragDistance:
ret = QCommonStyle::pixelMetric(PM_MaximumDragDistance);
if (ret == -1)
@ -394,10 +429,6 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW
break;
#ifndef QT_NO_SLIDER
case PM_SliderLength:
ret = int(QStyleHelper::dpiScaled(11.));
break;
// Returns the number of pixels to use for the business part of the
// slider (i.e., the non-tickmark portion). The remaining space is shared
// equally between the tickmark regions.
@ -427,43 +458,14 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt, const QW
break;
#endif // QT_NO_SLIDER
#ifndef QT_NO_MENU
case PM_MenuBarHMargin:
case PM_MenuBarVMargin:
case PM_MenuBarPanelWidth:
break;
case PM_SmallIconSize:
ret = int(QStyleHelper::dpiScaled(16.));
break;
case PM_LargeIconSize:
ret = int(QStyleHelper::dpiScaled(32.));
break;
case PM_IconViewIconSize:
ret = proxy()->pixelMetric(PM_LargeIconSize, opt, widget);
break;
case PM_DockWidgetTitleMargin:
ret = int(QStyleHelper::dpiScaled(2.));
break;
case PM_DockWidgetTitleBarButtonMargin:
ret = int(QStyleHelper::dpiScaled(4.));
break;
case PM_DockWidgetFrameWidth:
ret = 4;
break;
break;
#endif // QT_NO_MENU
case PM_SplitterWidth:
ret = qMax(4, QApplication::globalStrut().width());
ret = qMax(int(QStyleHelper::dpiScaled(4)), QApplication::globalStrut().width());
break;
case PM_ToolBarHandleExtent:
ret = int(QStyleHelper::dpiScaled(10.));
break;
default:
ret = QCommonStyle::pixelMetric(pm, opt, widget);
break;

View File

@ -72,6 +72,7 @@ public:
QWindowsStylePrivate();
static int pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option = 0, const QWidget *widget = 0);
static int fixedPixelMetric(QStyle::PixelMetric pm);
static int devicePixelRatio(const QWidget *widget = 0)
{ return widget ? widget->devicePixelRatio() : QWindowsStylePrivate::appDevicePixelRatio(); }

View File

@ -2192,7 +2192,7 @@ QRect QWindowsVistaStyle::subControlRect(ComplexControl control, const QStyleOpt
const int height = tb->rect.height();
const int width = tb->rect.width();
int buttonWidth = GetSystemMetrics(SM_CXSIZE) / QWindowsStylePrivate::devicePixelRatio(widget)
- 4;
- int(QStyleHelper::dpiScaled(4));
const int frameWidth = proxy()->pixelMetric(PM_MdiSubWindowFrameWidth, option, widget);
const bool sysmenuHint = (tb->titleBarFlags & Qt::WindowSystemMenuHint) != 0;
@ -2265,28 +2265,36 @@ QStyle::SubControl QWindowsVistaStyle::hitTestComplexControl(ComplexControl cont
return QWindowsXPStyle::hitTestComplexControl(control, option, pos, widget);
}
int QWindowsVistaStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm)
{
switch (pm) {
case QStyle::PM_DockWidgetTitleBarButtonMargin:
return 5;
case QStyle::PM_ScrollBarSliderMin:
return 18;
case QStyle::PM_MenuHMargin:
case QStyle::PM_MenuVMargin:
return 0;
case QStyle::PM_MenuPanelWidth:
return 3;
default:
break;
}
return QWindowsVistaStylePrivate::InvalidMetric;
}
/*!
\internal
*/
int QWindowsVistaStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
{
if (!QWindowsVistaStylePrivate::useVista()) {
if (!QWindowsVistaStylePrivate::useVista())
return QWindowsStyle::pixelMetric(metric, option, widget);
}
switch (metric) {
case PM_DockWidgetTitleBarButtonMargin:
return int(QStyleHelper::dpiScaled(5.));
case PM_ScrollBarSliderMin:
return int(QStyleHelper::dpiScaled(18.));
case PM_MenuHMargin:
case PM_MenuVMargin:
return 0;
case PM_MenuPanelWidth:
return 3;
default:
break;
}
int ret = QWindowsStylePrivate::fixedPixelMetric(metric);
if (ret != QWindowsStylePrivate::InvalidMetric)
return int(QStyleHelper::dpiScaled(ret));
return QWindowsXPStyle::pixelMetric(metric, option, widget);
}

View File

@ -171,6 +171,7 @@ class QWindowsVistaStylePrivate : public QWindowsXPStylePrivate
public:
QWindowsVistaStylePrivate();
~QWindowsVistaStylePrivate();
static int fixedPixelMetric(QStyle::PixelMetric pm);
static inline bool useVista();
bool transitionsEnabled() const;

View File

@ -3507,7 +3507,7 @@ QRect QWindowsXPStyle::subControlRect(ComplexControl cc, const QStyleOptionCompl
const bool isToolTitle = false;
const int height = tb->rect.height();
const int width = tb->rect.width();
const int buttonMargin = 4;
const int buttonMargin = int(QStyleHelper::dpiScaled(4));
int buttonHeight = GetSystemMetrics(SM_CYSIZE) / QWindowsStylePrivate::devicePixelRatio(widget)
- buttonMargin;
int buttonWidth = GetSystemMetrics(SM_CXSIZE) / QWindowsStylePrivate::devicePixelRatio(widget)

View File

@ -385,6 +385,7 @@ public:
{ cleanup(); }
static int pixelMetricFromSystemDp(QStyle::PixelMetric pm, const QStyleOption *option = 0, const QWidget *widget = 0);
static int fixedPixelMetric(QStyle::PixelMetric pm, const QStyleOption *option = 0, const QWidget *widget = 0);
static HWND winId(const QWidget *widget);