diff options
author | Jari Tenhunen <jari.tenhunen@iki.fi> | 2014-08-18 18:08:02 (GMT) |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@digia.com> | 2014-08-20 08:53:09 (GMT) |
commit | ca12a739c9ee419c6def4ef3a9d267e74b386651 (patch) | |
tree | 7933e00a02e71d8e646d8cec6e9367d0cc804a49 | |
parent | 1344f0d1b97689ea31b41c944f4ed3fcb9a72006 (diff) | |
download | Qt-ca12a739c9ee419c6def4ef3a9d267e74b386651.zip Qt-ca12a739c9ee419c6def4ef3a9d267e74b386651.tar.gz Qt-ca12a739c9ee419c6def4ef3a9d267e74b386651.tar.bz2 |
QMacStyle: Fix focus frame rendering in Yosemite
Using the HITheme API would result in the frame's right edge
to be missing.
Instead, we use the recommended technique to draw the focus
ring around a custom NSCell. (See
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ControlCell/Articles/ManipulateCellControl.html)
Backport of 769af6689337285927a2637b184149f688332542 from Qt5/qtbase
Change-Id: I8f3992edc065e14632ec4e473732b30bcf4c1937
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
-rw-r--r-- | src/gui/styles/qmacstyle_mac.mm | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/gui/styles/qmacstyle_mac.mm b/src/gui/styles/qmacstyle_mac.mm index 65f3ba9..78d0d19 100644 --- a/src/gui/styles/qmacstyle_mac.mm +++ b/src/gui/styles/qmacstyle_mac.mm @@ -3809,11 +3809,20 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter } break; case CE_FocusFrame: { - int xOff = proxy()->pixelMetric(PM_FocusFrameHMargin, opt, w) + 1; - int yOff = proxy()->pixelMetric(PM_FocusFrameVMargin, opt, w) + 1; - HIRect hirect = CGRectMake(xOff+opt->rect.x(), yOff+opt->rect.y(), opt->rect.width() - 2 * xOff, - opt->rect.height() - 2 * yOff); - HIThemeDrawFocusRect(&hirect, true, QMacCGContext(p), kHIThemeOrientationNormal); + int xOff = proxy()->pixelMetric(PM_FocusFrameHMargin, opt, w); + int yOff = proxy()->pixelMetric(PM_FocusFrameVMargin, opt, w); + NSRect rect = NSMakeRect(xOff+opt->rect.x(), yOff+opt->rect.y(), opt->rect.width() - 2 * xOff, + opt->rect.height() - 2 * yOff); + CGContextSaveGState(cg); + [NSGraphicsContext setCurrentContext:[NSGraphicsContext + graphicsContextWithGraphicsPort:(CGContextRef)cg flipped:NO]]; + [NSGraphicsContext saveGraphicsState]; + NSSetFocusRingStyle(NSFocusRingOnly); + NSBezierPath *focusFramePath = [NSBezierPath bezierPathWithRect:rect]; + [focusFramePath setClip]; // Clear clip path to avoid artifacts when rendering the cursor at zero pos + [focusFramePath fill]; + [NSGraphicsContext restoreGraphicsState]; + CGContextRestoreGState(cg); break; } case CE_MenuItem: case CE_MenuEmptyArea: |