transmission/macosx/Badger.m

191 lines
4.7 KiB
Mathematica
Raw Normal View History

2006-01-20 01:51:07 +00:00
//
// Badger.m
// Transmission
//
// Created by Mitchell Livingston on 12/21/05.
//
#import "Badger.h"
@interface Badger (Private)
- (NSImage *) badgeWithNum: (int) num;
@end
@implementation Badger
- (id) init
{
if ((self = [super init]))
{
fBadge = [NSImage imageNamed: @"Badge"];
fDockIcon = [[NSApp applicationIconImage] copy];
fBadgedDockIcon = [fDockIcon copy];
fBadgeAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
[NSFont fontWithName: @"Helvetica-Bold" size: 24], NSFontAttributeName,
nil] retain];
fStringAttributes = [[NSDictionary dictionaryWithObjectsAndKeys:
[NSColor whiteColor], NSForegroundColorAttributeName,
[NSFont fontWithName: @"Helvetica-Bold" size: 20], NSFontAttributeName,
nil] retain];
fUploadingColor = [[[NSColor greenColor] colorWithAlphaComponent: 0.65] retain];
fDownloadingColor = [[[NSColor blueColor] colorWithAlphaComponent: 0.65] retain];
fCompleted = 0;
}
return self;
}
- (void) dealloc
{
[fDockIcon release];
[fBadgedDockIcon release];
[fBadgeAttributes release];
[fStringAttributes release];
[fUploadingColor release];
[fDownloadingColor release];
[super dealloc];
}
- (void) updateBadgeWithCompleted: (int) completed
uploadRate: (NSString *) uploadRate
downloadRate: (NSString *) downloadRate
{
NSImage * dockIcon;
NSSize iconSize = [fDockIcon size];
//set seeding and downloading badges if there was a change
if (completed != fCompleted)
{
fCompleted = completed;
dockIcon = [fDockIcon copy];
[dockIcon lockFocus];
//set completed badge to top right
if (completed > 0)
{
NSSize badgeSize = [fBadge size];
[[self badgeWithNum: completed]
compositeToPoint: NSMakePoint(iconSize.width - badgeSize.width,
iconSize.height - badgeSize.height)
operation: NSCompositeSourceOver];
}
[dockIcon unlockFocus];
[fBadgedDockIcon release];
fBadgedDockIcon = [dockIcon copy];
}
else
dockIcon = [fBadgedDockIcon copy];
if (uploadRate || downloadRate)
{
//upload rate at bottom
float mainY = 5,
mainHeight = 25;
NSRect shapeRect = NSMakeRect(12.5, mainY, iconSize.width - 25, mainHeight);
NSRect leftRect, rightRect;
leftRect.origin.x = 0;
leftRect.origin.y = mainY;
leftRect.size.width = shapeRect.origin.x * 2.0;
leftRect.size.height = mainHeight;
rightRect = leftRect;
rightRect.origin.x = iconSize.width - rightRect.size.width;
NSRect textRect;
textRect.origin.y = mainY;
textRect.size.height = mainHeight;
[dockIcon lockFocus];
if (uploadRate)
{
float width = [uploadRate sizeWithAttributes: fStringAttributes].width;
textRect.origin.x = (iconSize.width - width) * 0.5;
textRect.size.width = width;
NSBezierPath * uploadOval = [NSBezierPath bezierPathWithRect: shapeRect];
[uploadOval appendBezierPathWithOvalInRect: leftRect];
[uploadOval appendBezierPathWithOvalInRect: rightRect];
[fUploadingColor set];
[uploadOval fill];
[uploadRate drawInRect: textRect withAttributes: fStringAttributes];
//shift up for download rate if there is an upload rate
float heightDiff = 27;
shapeRect.origin.y += heightDiff;
leftRect.origin.y += heightDiff;
rightRect.origin.y += heightDiff;
textRect.origin.y += heightDiff;
}
//download rate above upload rate
if (downloadRate)
{
float width = [downloadRate sizeWithAttributes: fStringAttributes].width;
textRect.origin.x = (iconSize.width - width) * 0.5;
textRect.size.width = width;
NSBezierPath * downloadOval = [NSBezierPath bezierPathWithRect: shapeRect];
[downloadOval appendBezierPathWithOvalInRect: leftRect];
[downloadOval appendBezierPathWithOvalInRect: rightRect];
[fDownloadingColor set];
[downloadOval fill];
[downloadRate drawInRect: textRect withAttributes: fStringAttributes];
}
[dockIcon unlockFocus];
}
[NSApp setApplicationIconImage: dockIcon];
[dockIcon release];
}
- (void) clearBadge
{
[fBadgedDockIcon release];
fBadgedDockIcon = [fDockIcon copy];
[NSApp setApplicationIconImage: fDockIcon];
}
@end
@implementation Badger (Private)
- (NSImage *) badgeWithNum: (int) num
{
NSImage * badge = [[fBadge copy] autorelease];
NSString * numString = [NSString stringWithFormat: @"%d", num];
//number is in center of image
NSRect badgeRect;
NSSize numSize = [numString sizeWithAttributes: fBadgeAttributes];
badgeRect.size = [badge size];
badgeRect.origin.x = (badgeRect.size.width - numSize.width) * 0.5;
badgeRect.origin.y = badgeRect.size.height * 0.5 - numSize.height * 1.2;
[badge lockFocus];
[numString drawInRect: badgeRect withAttributes: fBadgeAttributes];
[badge unlockFocus];
return badge;
}
@end