only update the dock badging when there's a change
This commit is contained in:
parent
0fde32ead5
commit
12b3df53ef
|
@ -26,14 +26,22 @@
|
|||
#define BADGER_H
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <transmission.h>
|
||||
|
||||
@interface Badger : NSObject {
|
||||
@interface Badger : NSObject
|
||||
{
|
||||
tr_handle_t * fLib;
|
||||
|
||||
NSImage * fDockIcon, * fBadge, * fUploadBadge, * fDownloadBadge;
|
||||
NSDictionary * fAttributes;
|
||||
int fCompleted;
|
||||
BOOL fSpeedBadge;
|
||||
|
||||
NSLock * fLock;
|
||||
}
|
||||
|
||||
- (void) updateBadgeWithCompleted: (int) completed uploadRate: (float) uploadRate downloadRate: (float) downloadRate;
|
||||
- (id) initWithLib: (tr_handle_t *) lib;
|
||||
- (void) updateBadgeWithCompleted: (int) completed;
|
||||
- (void) clearBadge;
|
||||
|
||||
@end
|
||||
|
|
106
macosx/Badger.m
106
macosx/Badger.m
|
@ -33,11 +33,13 @@
|
|||
|
||||
@implementation Badger
|
||||
|
||||
- (id) init
|
||||
- (id) initWithLib: (tr_handle_t *) lib
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
fDockIcon = [NSImage imageNamed: @"NSApplicationIcon"];
|
||||
fLib = lib;
|
||||
|
||||
fDockIcon = [[NSImage imageNamed: @"NSApplicationIcon"] copy];
|
||||
fBadge = [NSImage imageNamed: @"Badge"];
|
||||
fUploadBadge = [NSImage imageNamed: @"UploadBadge"];
|
||||
fDownloadBadge = [NSImage imageNamed: @"DownloadBadge"];
|
||||
|
@ -54,6 +56,11 @@
|
|||
boldFont, NSFontAttributeName, stringShadow, NSShadowAttributeName, nil];
|
||||
|
||||
[stringShadow release];
|
||||
|
||||
fCompleted = 0;
|
||||
fSpeedBadge = NO;
|
||||
|
||||
fLock = [[NSLock alloc] init];
|
||||
}
|
||||
|
||||
return self;
|
||||
|
@ -61,51 +68,66 @@
|
|||
|
||||
- (void) dealloc
|
||||
{
|
||||
[fDockIcon release];
|
||||
[fAttributes release];
|
||||
[fLock release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void) updateBadgeWithCompleted: (int) completed uploadRate: (float) uploadRate downloadRate: (float) downloadRate
|
||||
- (void) updateBadgeWithCompleted: (int) completed
|
||||
{
|
||||
NSImage * dockIcon = nil;
|
||||
|
||||
//set completed badge to top right
|
||||
if (completed > 0)
|
||||
{
|
||||
dockIcon = [fDockIcon copy];
|
||||
[fLock lock];
|
||||
|
||||
NSRect badgeRect;
|
||||
NSSize iconSize = [dockIcon size];
|
||||
badgeRect.size = [fBadge size];
|
||||
badgeRect.origin.x = iconSize.width - badgeRect.size.width;
|
||||
badgeRect.origin.y = iconSize.height - badgeRect.size.height;
|
||||
|
||||
[dockIcon lockFocus];
|
||||
//set completed badge to top right
|
||||
BOOL baseChange;
|
||||
if (baseChange = (fCompleted != completed))
|
||||
{
|
||||
fCompleted = completed;
|
||||
|
||||
//place badge
|
||||
[fBadge compositeToPoint: badgeRect.origin operation: NSCompositeSourceOver];
|
||||
[fDockIcon release];
|
||||
fDockIcon = [[NSImage imageNamed: @"NSApplicationIcon"] copy];
|
||||
|
||||
//ignore shadow of badge when placing string
|
||||
float badgeBottomExtra = 5.0;
|
||||
badgeRect.size.height -= badgeBottomExtra;
|
||||
badgeRect.origin.y += badgeBottomExtra;
|
||||
|
||||
//place badge text
|
||||
[self badgeString: [NSString stringWithInt: completed] forRect: badgeRect];
|
||||
|
||||
[dockIcon unlockFocus];
|
||||
if (completed > 0)
|
||||
{
|
||||
NSRect badgeRect;
|
||||
NSSize iconSize = [fDockIcon size];
|
||||
badgeRect.size = [fBadge size];
|
||||
badgeRect.origin.x = iconSize.width - badgeRect.size.width;
|
||||
badgeRect.origin.y = iconSize.height - badgeRect.size.height;
|
||||
|
||||
[fDockIcon lockFocus];
|
||||
|
||||
//place badge
|
||||
[fBadge compositeToPoint: badgeRect.origin operation: NSCompositeSourceOver];
|
||||
|
||||
//ignore shadow of badge when placing string
|
||||
float badgeBottomExtra = 5.0;
|
||||
badgeRect.size.height -= badgeBottomExtra;
|
||||
badgeRect.origin.y += badgeBottomExtra;
|
||||
|
||||
//place badge text
|
||||
[self badgeString: [NSString stringWithInt: completed] forRect: badgeRect];
|
||||
|
||||
[fDockIcon unlockFocus];
|
||||
}
|
||||
}
|
||||
|
||||
//set upload and download rate badges
|
||||
NSString * uploadRateString = uploadRate >= 0.1 && [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey: @"BadgeUploadRate"] ? [NSString stringForSpeedAbbrev: uploadRate] : nil,
|
||||
* downloadRateString = downloadRate >= 0.1 && [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey: @"BadgeDownloadRate"] ? [NSString stringForSpeedAbbrev: downloadRate] : nil;
|
||||
BOOL checkUpload = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeUploadRate"],
|
||||
checkDownload = [[NSUserDefaults standardUserDefaults] boolForKey: @"BadgeDownloadRate"];
|
||||
float downloadRate, uploadRate;
|
||||
|
||||
if (uploadRateString || downloadRateString)
|
||||
if (checkUpload || checkDownload)
|
||||
tr_torrentRates(fLib, & downloadRate, & uploadRate);
|
||||
|
||||
NSString * downloadRateString = checkDownload && downloadRate >= 0.1 ? [NSString stringForSpeedAbbrev: downloadRate] : nil,
|
||||
* uploadRateString = checkUpload && uploadRate >= 0.1 ? [NSString stringForSpeedAbbrev: uploadRate] : nil;
|
||||
|
||||
NSImage * dockIcon = nil;
|
||||
BOOL speedBadge;
|
||||
if (speedBadge = (uploadRateString || downloadRateString))
|
||||
{
|
||||
if (!dockIcon)
|
||||
dockIcon = [fDockIcon copy];
|
||||
dockIcon = [fDockIcon copy];
|
||||
|
||||
NSRect badgeRect;
|
||||
badgeRect.size = [fUploadBadge size];
|
||||
|
@ -149,16 +171,22 @@
|
|||
}
|
||||
|
||||
//update dock badge
|
||||
if (!dockIcon)
|
||||
dockIcon = [fDockIcon retain];
|
||||
if (baseChange || fSpeedBadge || speedBadge)
|
||||
{
|
||||
if (!dockIcon)
|
||||
dockIcon = [fDockIcon retain];
|
||||
[NSApp setApplicationIconImage: dockIcon];
|
||||
[dockIcon release];
|
||||
}
|
||||
fSpeedBadge = speedBadge;
|
||||
|
||||
[NSApp setApplicationIconImage: dockIcon];
|
||||
[dockIcon release];
|
||||
[fLock unlock];
|
||||
}
|
||||
|
||||
- (void) clearBadge
|
||||
{
|
||||
[NSApp setApplicationIconImage: fDockIcon];
|
||||
[NSApp setApplicationIconImage: [NSImage imageNamed: @"NSApplicationIcon"]];
|
||||
fCompleted = 0;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -166,7 +166,7 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy
|
|||
fInfoController = [[InfoWindowController alloc] initWithWindowNibName: @"InfoWindow"];
|
||||
fPrefsController = [[PrefsController alloc] initWithWindowNibName: @"PrefsWindow" handle: fLib];
|
||||
|
||||
fBadger = [[Badger alloc] init];
|
||||
fBadger = [[Badger alloc] initWithLib: fLib];
|
||||
|
||||
[GrowlApplicationBridge setGrowlDelegate: self];
|
||||
|
||||
|
@ -1321,7 +1321,7 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy
|
|||
[fInfoController updateInfoStats];
|
||||
|
||||
//badge dock
|
||||
[fBadger updateBadgeWithCompleted: fCompleted uploadRate: uploadRate downloadRate: downloadRate];
|
||||
[fBadger updateBadgeWithCompleted: fCompleted];
|
||||
}
|
||||
|
||||
- (void) updateTorrentsInQueue
|
||||
|
@ -2839,10 +2839,7 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy
|
|||
|
||||
- (void) resetDockBadge: (NSNotification *) notification
|
||||
{
|
||||
float downloadRate, uploadRate;
|
||||
tr_torrentRates(fLib, & downloadRate, & uploadRate);
|
||||
|
||||
[fBadger updateBadgeWithCompleted: fCompleted uploadRate: uploadRate downloadRate: downloadRate];
|
||||
[fBadger updateBadgeWithCompleted: fCompleted];
|
||||
}
|
||||
|
||||
- (NSRect) windowWillUseStandardFrame: (NSWindow *) window defaultFrame: (NSRect) defaultFrame
|
||||
|
|
Loading…
Reference in New Issue