From 3a4e62f9b1efee7b1fd0b5e34fca6687be64abfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Arve=20S=C3=A6ther?= Date: Mon, 19 Oct 2020 11:08:57 +0200 Subject: Nativestyle: Slider on Windows Change-Id: Iab1f01a2cccad21e178aaf13ea21469a5ce98fea Reviewed-by: Richard Moe Gustavsen --- .../nativestyle/items/qquickstyleitemslider.cpp | 20 +++++++------ .../qstyle/windows/qquickwindowsstyle.cpp | 34 ++++++++++------------ .../qstyle/windows/qquickwindowsxpstyle.cpp | 26 ++++++++++++++++- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/src/imports/nativestyle/items/qquickstyleitemslider.cpp b/src/imports/nativestyle/items/qquickstyleitemslider.cpp index faaf0057..4f64b3ba 100644 --- a/src/imports/nativestyle/items/qquickstyleitemslider.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemslider.cpp @@ -85,19 +85,17 @@ void QQuickStyleItemSlider::initStyleOption(QStyleOptionSlider &styleOption) styleOption.subControls = m_subControl == Groove ? QStyle::SC_SliderGroove : QStyle::SC_SliderHandle; styleOption.activeSubControls = QStyle::SC_None; styleOption.orientation = slider->orientation(); - styleOption.tickInterval = slider->stepSize(); + styleOption.tickInterval = int(slider->stepSize()); if (slider->isPressed()) styleOption.state |= QStyle::State_Sunken; - if (slider->stepSize() == 0) { - styleOption.minimum = 0; - styleOption.maximum = 10000; - styleOption.sliderPosition = slider->position() * styleOption.maximum; - } else { - styleOption.minimum = slider->from(); - styleOption.maximum = slider->to(); - styleOption.sliderPosition = slider->value(); + + qreal min = 0; + qreal max = 10000; + if (!qFuzzyIsNull(slider->stepSize())) { + min = slider->from(); + max = slider->to(); // TODO: add proper API for tickmarks const int index = slider->metaObject()->indexOfProperty("qqc2_style_tickPosition"); @@ -108,4 +106,8 @@ void QQuickStyleItemSlider::initStyleOption(QStyleOptionSlider &styleOption) styleOption.subControls |= QStyle::SC_SliderTickmarks; } } + styleOption.minimum = int(min); + styleOption.maximum = int(max); + styleOption.sliderValue = int(slider->value()); + styleOption.sliderPosition = int(slider->position() * (max - min)); } diff --git a/src/imports/nativestyle/qstyle/windows/qquickwindowsstyle.cpp b/src/imports/nativestyle/qstyle/windows/qquickwindowsstyle.cpp index b7ec6f32..7a16216d 100644 --- a/src/imports/nativestyle/qstyle/windows/qquickwindowsstyle.cpp +++ b/src/imports/nativestyle/qstyle/windows/qquickwindowsstyle.cpp @@ -348,10 +348,8 @@ int QWindowsStylePrivate::fixedPixelMetric(QStyle::PixelMetric pm) return 2; #endif -#if 0 && QT_CONFIG(slider) case QStyle::PM_SliderLength: return 11; -#endif // QT_CONFIG(slider) #if 0 && QT_CONFIG(menu) case QStyle::PM_MenuBarHMargin: @@ -434,7 +432,6 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt) const ret = 60; break; -#if 0 && QT_CONFIG(slider) // 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. @@ -443,9 +440,9 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt) const int space = (sl->orientation == Qt::Horizontal) ? sl->rect.height() : sl->rect.width(); int ticks = sl->tickPosition; int n = 0; - if (ticks & QSlider::TicksAbove) + if (ticks & QStyleOptionSlider::TicksAbove) ++n; - if (ticks & QSlider::TicksBelow) + if (ticks & QStyleOptionSlider::TicksBelow) ++n; if (!n) { ret = space; @@ -453,8 +450,8 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt) const } int thick = 6; // Magic constant to get 5 + 16 + 5 - if (ticks != QSlider::TicksBothSides && ticks != QSlider::NoTicks) - thick += proxy()->pixelMetric(PM_SliderLength, sl, widget) / 4; + if (ticks != QStyleOptionSlider::TicksBothSides && ticks != QStyleOptionSlider::NoTicks) + thick += proxy()->pixelMetric(PM_SliderLength, sl) / 4; space -= thick; if (space > 0) @@ -462,7 +459,6 @@ int QWindowsStyle::pixelMetric(PixelMetric pm, const QStyleOption *opt) const ret = thick; } break; -#endif // QT_CONFIG(slider) case PM_IconViewIconSize: ret = proxy()->pixelMetric(PM_LargeIconSize, opt); @@ -1893,18 +1889,18 @@ void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComp #if 0 && QT_CONFIG(slider) case CC_Slider: if (const QStyleOptionSlider *slider = qstyleoption_cast(opt)) { - int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider, widget); - int len = proxy()->pixelMetric(PM_SliderLength, slider, widget); + int thickness = proxy()->pixelMetric(PM_SliderControlThickness, slider); + int len = proxy()->pixelMetric(PM_SliderLength, slider); int ticks = slider->tickPosition; - QRect groove = proxy()->subControlRect(CC_Slider, slider, SC_SliderGroove, widget); - QRect handle = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle, widget); + QRect groove = proxy()->subControlRect(CC_Slider, slider, SC_SliderGroove); + QRect handle = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle); if ((slider->subControls & SC_SliderGroove) && groove.isValid()) { int mid = thickness / 2; - if (ticks & QSlider::TicksAbove) + if (ticks & QStyleOptionSlider::TicksAbove) mid += len / 8; - if (ticks & QSlider::TicksBelow) + if (ticks & QStyleOptionSlider::TicksBelow) mid -= len / 8; p->setPen(slider->palette.shadow().color()); @@ -1924,7 +1920,7 @@ void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComp if (slider->subControls & SC_SliderTickmarks) { QStyleOptionSlider tmpSlider = *slider; tmpSlider.subControls = SC_SliderTickmarks; - QCommonStyle::drawComplexControl(cc, &tmpSlider, p, widget); + QCommonStyle::drawComplexControl(cc, &tmpSlider, p); } if (slider->subControls & SC_SliderHandle) { @@ -1961,14 +1957,14 @@ void QWindowsStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComp int y2 = y+he-1; Qt::Orientation orient = slider->orientation; - bool tickAbove = slider->tickPosition == QSlider::TicksAbove; - bool tickBelow = slider->tickPosition == QSlider::TicksBelow; + bool tickAbove = slider->tickPosition == QStyleOptionSlider::TicksAbove; + bool tickBelow = slider->tickPosition == QStyleOptionSlider::TicksBelow; if (slider->state & State_HasFocus) { QStyleOptionFocusRect fropt; fropt.QStyleOption::operator=(*slider); - fropt.rect = subElementRect(SE_SliderFocusRect, slider, widget); - proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p, widget); + fropt.rect = subElementRect(SE_SliderFocusRect, slider); + proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p); } if ((tickAbove && tickBelow) || (!tickAbove && !tickBelow)) { diff --git a/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp b/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp index 69180c62..e40cedb0 100644 --- a/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp +++ b/src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp @@ -2722,7 +2722,7 @@ void QWindowsXPStyle::drawComplexControl(ComplexControl cc, const QStyleOptionCo theme.stateId = stateId; d->drawBackground(theme); } - if (slider->state & State_HasFocus) { + if (sub & SC_SliderGroove && slider->state & State_HasFocus) { QStyleOptionFocusRect fropt; fropt.QStyleOption::operator=(*slider); fropt.rect = subElementRect(SE_SliderFocusRect, slider); @@ -3446,6 +3446,30 @@ QSize QWindowsXPStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt } break; + case CT_Slider: + if (const QStyleOptionSlider *slider = qstyleoption_cast(option)) { + QStyle::SubControls sub = slider->subControls; + const int TickSpace = 5; + int thick = proxy()->pixelMetric(QStyle::PM_SliderThickness, slider); + + if (slider->tickPosition & QStyleOptionSlider::TicksAbove) + thick += TickSpace; + if (slider->tickPosition & QStyleOptionSlider::TicksBelow) + thick += TickSpace; + sz.setWidth(thick); + + if (sub & SC_SliderGroove) { + const int SliderLength = 84; + sz.setHeight(SliderLength); + } + if (slider->orientation == Qt::Horizontal) + sz.transpose(); + if (sub & SC_SliderHandle) { + const QSize s = proxy()->subControlRect(CC_Slider, slider, SC_SliderHandle).size(); + sz = sz.expandedTo(s); + } + } + break; default: sz = QWindowsStyle::sizeFromContents(ct, option, sz); break; -- cgit v1.2.3