From 5930a0ebc0b177b3359d461548a200531fe4774e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 22 Sep 2020 19:39:42 +0200 Subject: [PATCH] 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 --- src/plugins/styles/mac/qmacstyle_mac.mm | 37 +++---------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm index 4f51f63665..904f94fc95 100644 --- a/src/plugins/styles/mac/qmacstyle_mac.mm +++ b/src/plugins/styles/mac/qmacstyle_mac.mm @@ -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;