summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--macosx/HBToolbarBadgedItem.m175
1 files changed, 86 insertions, 89 deletions
diff --git a/macosx/HBToolbarBadgedItem.m b/macosx/HBToolbarBadgedItem.m
index 86069b9b9..e412d0b62 100644
--- a/macosx/HBToolbarBadgedItem.m
+++ b/macosx/HBToolbarBadgedItem.m
@@ -41,93 +41,7 @@
- (void)setImage:(NSImage *)image
{
- __weak HBToolbarBadgedItem *weakSelf = self;
_primary = image;
- _badged = [NSImage imageWithSize:image.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
- HBToolbarBadgedItem *strongSelf = weakSelf;
- if (strongSelf == nil)
- {
- return NO;
- }
-
- CGContextRef context = NSGraphicsContext.currentContext.CGContext;
- CGContextSaveGState(context);
-
- CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, dstRect);
- NSSize size = dstRect.size;
-
- NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height);
- CGImageRef ref = [image CGImageForProposedRect:&imageRect context:[NSGraphicsContext currentContext] hints:nil];
- CGContextDrawImage(context, imageRect, ref);
-
- // Work out the area
- CGFloat scaleFactor = deviceRect.size.width / image.size.width;
- CGFloat typeSize = 10;
- if (scaleFactor > 1)
- {
- typeSize = 8;
- }
- CGFloat pointSize = typeSize;
-
- NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
- NSFont *font = [NSFont boldSystemFontOfSize:pointSize];
- NSDictionary *attr = @{NSParagraphStyleAttributeName : paragraphStyle,
- NSFontAttributeName : font,
- NSForegroundColorAttributeName : strongSelf->_badgeTextColor };
-
- NSRect textBounds = [strongSelf->_badgeValue boundingRectWithSize:NSZeroSize
- options:0
- attributes:attr];
-
- NSPoint indent = NSMakePoint(typeSize, 2);
- CGFloat radius = (textBounds.size.height + indent.y) * 0.5f;
-
- CGFloat offset_x = 0;
- CGFloat offset_y = 0;
- NSRect badgeRect = NSMakeRect(size.width - textBounds.size.width - indent.x - offset_x, offset_y,
- textBounds.size.width + indent.x, textBounds.size.height + indent.y);
- badgeRect = NSIntegralRect(badgeRect);
-
- // Draw the ellipse
- CGFloat minx = CGRectGetMinX(badgeRect);
- CGFloat midx = CGRectGetMidX(badgeRect);
- CGFloat maxx = CGRectGetMaxX(badgeRect);
- CGFloat miny = CGRectGetMinY(badgeRect);
- CGFloat midy = CGRectGetMidY(badgeRect);
- CGFloat maxy = CGRectGetMaxY(badgeRect);
-
- // Fill the ellipse
- CGContextBeginPath(context);
- CGContextMoveToPoint(context, minx, midy);
- CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
- CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
- CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
- CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
- CGContextClosePath(context);
- CGColorRef fillColor = strongSelf->_badgeFillColor.CGColor;
- CGContextSetFillColorWithColor(context,fillColor);
- CGContextDrawPath(context, kCGPathFill);
-
- // Draw the text
- badgeRect.origin.x = CGRectGetMidX(badgeRect);
- badgeRect.origin.x -= textBounds.origin.x / 2;
- badgeRect.origin.x -= ((textBounds.size.width - textBounds.origin.x) * 0.5f);
- badgeRect.origin.y = CGRectGetMidY(badgeRect);
- badgeRect.origin.y -= textBounds.origin.y / 2;
- badgeRect.origin.y -= ((textBounds.size.height - textBounds.origin.y) * 0.5f);
-
- badgeRect.origin.x = floor(badgeRect.origin.x);
- badgeRect.origin.y = floor(badgeRect.origin.y);
- badgeRect.size.width = textBounds.size.width;
- badgeRect.size.height = textBounds.size.height;
-
- [strongSelf->_badgeValue drawInRect:badgeRect withAttributes:attr];
-
- CGContextRestoreGState(context);
-
- return YES;
- }];
-
[self HB_refreshBadge];
}
@@ -143,14 +57,12 @@
- (void)setBadgeTextColor:(NSColor *)badgeTextColor
{
_badgeTextColor = [badgeTextColor copy];
-
[self HB_refreshBadge];
}
- (void)setBadgeFillColor:(NSColor *)badgeFillColor
{
_badgeFillColor = [badgeFillColor copy];
-
[self HB_refreshBadge];
}
@@ -158,8 +70,93 @@
- (void)HB_refreshBadge
{
- if (_badgeValue.length)
+ if (_badgeValue.length && _primary)
{
+ __weak HBToolbarBadgedItem *weakSelf = self;
+ _badged = [NSImage imageWithSize:_primary.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) {
+ HBToolbarBadgedItem *strongSelf = weakSelf;
+ if (strongSelf == nil)
+ {
+ return NO;
+ }
+
+ CGContextRef context = NSGraphicsContext.currentContext.CGContext;
+ CGContextSaveGState(context);
+
+ CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, dstRect);
+ NSSize size = dstRect.size;
+
+ NSRect imageRect = NSMakeRect(0, 0, strongSelf->_primary.size.width, strongSelf->_primary.size.height);
+ CGImageRef ref = [strongSelf->_primary CGImageForProposedRect:&imageRect context:NSGraphicsContext.currentContext hints:nil];
+ CGContextDrawImage(context, imageRect, ref);
+
+ // Work out the area
+ CGFloat scaleFactor = deviceRect.size.width / strongSelf->_primary.size.width;
+ CGFloat typeSize = 10;
+ if (scaleFactor > 1)
+ {
+ typeSize = 8;
+ }
+ CGFloat pointSize = typeSize;
+
+ NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
+ NSFont *font = [NSFont boldSystemFontOfSize:pointSize];
+ NSDictionary *attr = @{NSParagraphStyleAttributeName : paragraphStyle,
+ NSFontAttributeName : font,
+ NSForegroundColorAttributeName : strongSelf->_badgeTextColor };
+
+ NSRect textBounds = [strongSelf->_badgeValue boundingRectWithSize:NSZeroSize
+ options:0
+ attributes:attr];
+
+ NSPoint indent = NSMakePoint(typeSize, 2);
+ CGFloat radius = (textBounds.size.height + indent.y) * 0.5f;
+
+ CGFloat offset_x = 0;
+ CGFloat offset_y = 0;
+ NSRect badgeRect = NSMakeRect(size.width - textBounds.size.width - indent.x - offset_x, offset_y,
+ textBounds.size.width + indent.x, textBounds.size.height + indent.y);
+ badgeRect = NSIntegralRect(badgeRect);
+
+ // Draw the ellipse
+ CGFloat minx = CGRectGetMinX(badgeRect);
+ CGFloat midx = CGRectGetMidX(badgeRect);
+ CGFloat maxx = CGRectGetMaxX(badgeRect);
+ CGFloat miny = CGRectGetMinY(badgeRect);
+ CGFloat midy = CGRectGetMidY(badgeRect);
+ CGFloat maxy = CGRectGetMaxY(badgeRect);
+
+ // Fill the ellipse
+ CGContextBeginPath(context);
+ CGContextMoveToPoint(context, minx, midy);
+ CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
+ CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
+ CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
+ CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
+ CGContextClosePath(context);
+ CGColorRef fillColor = strongSelf->_badgeFillColor.CGColor;
+ CGContextSetFillColorWithColor(context,fillColor);
+ CGContextDrawPath(context, kCGPathFill);
+
+ // Draw the text
+ badgeRect.origin.x = CGRectGetMidX(badgeRect);
+ badgeRect.origin.x -= textBounds.origin.x / 2;
+ badgeRect.origin.x -= ((textBounds.size.width - textBounds.origin.x) * 0.5f);
+ badgeRect.origin.y = CGRectGetMidY(badgeRect);
+ badgeRect.origin.y -= textBounds.origin.y / 2;
+ badgeRect.origin.y -= ((textBounds.size.height - textBounds.origin.y) * 0.5f);
+
+ badgeRect.origin.x = floor(badgeRect.origin.x);
+ badgeRect.origin.y = floor(badgeRect.origin.y);
+ badgeRect.size.width = textBounds.size.width;
+ badgeRect.size.height = textBounds.size.height;
+
+ [strongSelf->_badgeValue drawInRect:badgeRect withAttributes:attr];
+
+ CGContextRestoreGState(context);
+
+ return YES;
+ }];
[super setImage:_badged];
}
else