aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Arve Sæther <jan-arve.saether@qt.io>2020-10-19 11:08:57 +0200
committerJan Arve Sæther <jan-arve.saether@qt.io>2020-10-19 13:23:12 +0200
commit3a4e62f9b1efee7b1fd0b5e34fca6687be64abfa (patch)
treed9a294565c3ce579ce2c4eef8ddf8f2638923a4a /src
parent917f7ceb9fda6f5e54658d2588358635d5dfbb85 (diff)
Nativestyle: Slider on Windows
Change-Id: Iab1f01a2cccad21e178aaf13ea21469a5ce98fea Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/imports/nativestyle/items/qquickstyleitemslider.cpp20
-rw-r--r--src/imports/nativestyle/qstyle/windows/qquickwindowsstyle.cpp34
-rw-r--r--src/imports/nativestyle/qstyle/windows/qquickwindowsxpstyle.cpp26
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<const QStyleOptionSlider *>(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<const QStyleOptionSlider *>(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;