macOS: Update slider metrics by explicitly asking it to layout
Pick-to: 5.15 Pick-to: 5.12 Change-Id: I283771624b513f4e8844c6130898ddf2531df0f1 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>bb10
parent
57d6f842ea
commit
5930a0ebc0
|
|
@ -489,40 +489,13 @@ static bool setupSlider(NSSlider *slider, const QStyleOptionSlider *sl)
|
|||
slider.numberOfTickMarks = 0;
|
||||
}
|
||||
|
||||
// Ensure the values set above are reflected when asking
|
||||
// the cell for its metrics and to draw itself.
|
||||
[slider layoutSubtreeIfNeeded];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void fixStaleGeometry(NSSlider *slider)
|
||||
{
|
||||
// If it's later fixed in AppKit, this function is not needed.
|
||||
// On macOS Mojave we suddenly have NSSliderCell with a cached
|
||||
// (and stale) geometry, thus its -drawKnob, -drawBarInside:flipped:,
|
||||
// -drawTickMarks fail to render the slider properly. Setting the number
|
||||
// of tickmarks triggers an update in geometry.
|
||||
|
||||
Q_ASSERT(slider);
|
||||
|
||||
if (QOperatingSystemVersion::current() < QOperatingSystemVersion::MacOSMojave)
|
||||
return;
|
||||
|
||||
NSSliderCell *cell = slider.cell;
|
||||
const NSRect barRect = [cell barRectFlipped:slider.isFlipped];
|
||||
const NSSize sliderSize = slider.frame.size;
|
||||
CGFloat difference = 0.;
|
||||
if (slider.vertical)
|
||||
difference = std::abs(sliderSize.height - barRect.size.height);
|
||||
else
|
||||
difference = std::abs(sliderSize.width - barRect.size.width);
|
||||
|
||||
if (difference > 6.) {
|
||||
// Stale ...
|
||||
const auto nOfTicks = slider.numberOfTickMarks;
|
||||
// Non-zero, different from nOfTicks to force update
|
||||
slider.numberOfTickMarks = nOfTicks + 10;
|
||||
slider.numberOfTickMarks = nOfTicks;
|
||||
}
|
||||
}
|
||||
|
||||
static bool isInMacUnifiedToolbarArea(QWindow *window, int windowY)
|
||||
{
|
||||
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
|
||||
|
|
@ -5377,8 +5350,6 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
if (!hasDoubleTicks)
|
||||
fixStaleGeometry(slider);
|
||||
NSSliderCell *cell = slider.cell;
|
||||
|
||||
const int numberOfTickMarks = slider.numberOfTickMarks;
|
||||
|
|
|
|||
Loading…
Reference in New Issue