QMacStyle: workaround NSSliderCell's cached/stale geometry
It's a bit cheesy solution, but works as I've noticed first on QSlider's with a ticks direction 'both'. Works because we were already using numberOfTickMarks property to trigger a special behavior for HIG non-compliant widgets. Works for our case too - we trigger a geometry update. Fixes: QTBUG-76811 Change-Id: I2cbf00d42d98e78519b281d138a2f74227ef5449 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
parent
65cdd0f366
commit
0ce3f7d62b
@ -137,6 +137,8 @@
|
|||||||
#include <qpa/qplatformtheme.h>
|
#include <qpa/qplatformtheme.h>
|
||||||
#include <QtGui/private/qcoregraphics_p.h>
|
#include <QtGui/private/qcoregraphics_p.h>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
QT_USE_NAMESPACE
|
QT_USE_NAMESPACE
|
||||||
|
|
||||||
static QWindow *qt_getWindow(const QWidget *widget)
|
static QWindow *qt_getWindow(const QWidget *widget)
|
||||||
@ -514,6 +516,37 @@ static bool setupSlider(NSSlider *slider, const QStyleOptionSlider *sl)
|
|||||||
return true;
|
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:NO];
|
||||||
|
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)
|
static bool isInMacUnifiedToolbarArea(QWindow *window, int windowY)
|
||||||
{
|
{
|
||||||
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
|
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
|
||||||
@ -5318,6 +5351,8 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
[slider calcSize];
|
[slider calcSize];
|
||||||
|
if (!hasDoubleTicks)
|
||||||
|
fixStaleGeometry(slider);
|
||||||
NSSliderCell *cell = slider.cell;
|
NSSliderCell *cell = slider.cell;
|
||||||
|
|
||||||
const int numberOfTickMarks = slider.numberOfTickMarks;
|
const int numberOfTickMarks = slider.numberOfTickMarks;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user