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
Tor Arne Vestbø 2020-09-22 19:39:42 +02:00
parent 57d6f842ea
commit 5930a0ebc0
1 changed files with 4 additions and 33 deletions

View File

@ -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;