mirror of
https://github.com/transmission/transmission
synced 2024-12-25 09:13:06 +00:00
Advanced bar should work again.
This commit is contained in:
parent
e4ca779e68
commit
25dddde5b7
2 changed files with 122 additions and 107 deletions
110
macosx/Torrent.m
110
macosx/Torrent.m
|
@ -25,6 +25,8 @@
|
|||
#import "Torrent.h"
|
||||
#import "StringAdditions.h"
|
||||
|
||||
#define BAR_HEIGHT 12.0
|
||||
|
||||
@interface Torrent (Private)
|
||||
|
||||
- (id) initWithHash: (NSString *) hashString path: (NSString *) path lib: (tr_handle_t *) lib
|
||||
|
@ -33,12 +35,31 @@
|
|||
ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart
|
||||
orderValue: (NSNumber *) orderValue;
|
||||
|
||||
- (NSImage *) advancedBar;
|
||||
|
||||
- (void) trashFile: (NSString *) path;
|
||||
|
||||
@end
|
||||
|
||||
@implementation Torrent
|
||||
|
||||
// Used to optimize drawing. They contain packed RGBA pixels for every color needed.
|
||||
#define BE OSSwapBigToHostConstInt32
|
||||
static uint32_t kBorder[] =
|
||||
{ BE(0x00000005), BE(0x00000010), BE(0x00000015), BE(0x00000015),
|
||||
BE(0x00000015), BE(0x00000015), BE(0x00000015), BE(0x00000015),
|
||||
BE(0x00000015), BE(0x00000015), BE(0x00000010), BE(0x00000005) };
|
||||
|
||||
static uint32_t kBack[] = { BE(0xB4B4B4FF), BE(0xE3E3E3FF) };
|
||||
|
||||
static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
||||
kBlue1 = BE(0xA0DCFFFF), //160, 220, 255
|
||||
kBlue2 = BE(0x78BEFFFF), //120, 190, 255
|
||||
kBlue3 = BE(0x50A0FFFF), //80, 160, 255
|
||||
kBlue4 = BE(0x1E46B4FF), //30, 70, 180
|
||||
kGray = BE(0x828282FF), //130, 130, 130
|
||||
kGreen = BE(0x00FF00FF); //0, 255, 0
|
||||
|
||||
- (id) initWithPath: (NSString *) path lib: (tr_handle_t *) lib
|
||||
{
|
||||
self = [self initWithHash: nil path: path lib: lib privateTorrent: nil publicTorrent: nil
|
||||
|
@ -293,9 +314,98 @@
|
|||
[info setObject: [self shortStatusString] forKey: @"ShortStatusString"];
|
||||
}
|
||||
|
||||
if ([fDefaults boolForKey: @"UseAdvancedBar"])
|
||||
[info setObject: [self advancedBar] forKey: @"AdvancedBar"];
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
- (NSImage *) advancedBar
|
||||
{
|
||||
int width = 100; //integers for bars
|
||||
|
||||
NSBitmapImageRep * bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: nil
|
||||
pixelsWide: width pixelsHigh: BAR_HEIGHT bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES
|
||||
isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0];
|
||||
|
||||
int h, w;
|
||||
uint32_t * p;
|
||||
uint8_t * bitmapData = [bitmap bitmapData];
|
||||
int bytesPerRow = [bitmap bytesPerRow];
|
||||
|
||||
//left and right borders
|
||||
p = (uint32_t *) bitmapData;
|
||||
for(h = 0; h < BAR_HEIGHT; h++)
|
||||
{
|
||||
p[0] = kBorder[h];
|
||||
p[width - 1] = kBorder[h];
|
||||
p += bytesPerRow / 4;
|
||||
}
|
||||
|
||||
int8_t * pieces = malloc(width);
|
||||
[self getAvailability: pieces size: width];
|
||||
int avail = 0;
|
||||
for (w = 0; w < width; w++)
|
||||
if (pieces[w] != 0)
|
||||
avail++;
|
||||
|
||||
//first two lines: dark blue to show progression, green to show available
|
||||
int end = lrintf(floor([self progress] * (width - 2)));
|
||||
p = (uint32_t *) (bitmapData) + 1;
|
||||
|
||||
for (w = 0; w < end; w++)
|
||||
{
|
||||
p[w] = kBlue4;
|
||||
p[w + bytesPerRow / 4] = kBlue4;
|
||||
}
|
||||
for (; w < avail; w++)
|
||||
{
|
||||
p[w] = kGreen;
|
||||
p[w + bytesPerRow / 4] = kGreen;
|
||||
}
|
||||
for (; w < width - 2; w++)
|
||||
{
|
||||
p[w] = kBack[0];
|
||||
p[w + bytesPerRow / 4] = kBack[1];
|
||||
}
|
||||
|
||||
//lines 2 to 14: blue or grey depending on whether we have the piece or not
|
||||
uint32_t color;
|
||||
for( w = 0; w < width - 2; w++ )
|
||||
{
|
||||
//point to pixel ( 2 + w, 2 ). We will then draw "vertically"
|
||||
p = (uint32_t *) ( bitmapData + 2 * bytesPerRow ) + 1 + w;
|
||||
|
||||
if (pieces[w] < 0)
|
||||
color = kGray;
|
||||
else if (pieces[w] == 0)
|
||||
color = kRed;
|
||||
else if (pieces[w] == 1)
|
||||
color = kBlue1;
|
||||
else if (pieces[w] == 2)
|
||||
color = kBlue2;
|
||||
else
|
||||
color = kBlue3;
|
||||
|
||||
for( h = 2; h < BAR_HEIGHT; h++ )
|
||||
{
|
||||
p[0] = color;
|
||||
p = (uint32_t *) ( (uint8_t *) p + bytesPerRow );
|
||||
}
|
||||
}
|
||||
|
||||
free(pieces);
|
||||
|
||||
//actually draw image
|
||||
NSImage * bar = [[NSImage alloc] initWithSize: [bitmap size]];
|
||||
[bar addRepresentation: bitmap];
|
||||
[bitmap release];
|
||||
|
||||
[bar setScalesWhenResized: YES];
|
||||
|
||||
return [bar autorelease];
|
||||
}
|
||||
|
||||
- (void) startTransfer
|
||||
{
|
||||
if (![self isActive])
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#import "TorrentTableView.h"
|
||||
#import "StringAdditions.h"
|
||||
|
||||
//also defined in Torrent.m
|
||||
#define BAR_HEIGHT 12.0
|
||||
|
||||
@interface TorrentCell (Private)
|
||||
|
@ -38,23 +39,6 @@
|
|||
|
||||
@implementation TorrentCell
|
||||
|
||||
// Used to optimize drawing. They contain packed RGBA pixels for every color needed.
|
||||
#define BE OSSwapBigToHostConstInt32
|
||||
static uint32_t kBorder[] =
|
||||
{ BE(0x00000005), BE(0x00000010), BE(0x00000015), BE(0x00000015),
|
||||
BE(0x00000015), BE(0x00000015), BE(0x00000015), BE(0x00000015),
|
||||
BE(0x00000015), BE(0x00000015), BE(0x00000010), BE(0x00000005) };
|
||||
|
||||
static uint32_t kBack[] = { BE(0xB4B4B4FF), BE(0xE3E3E3FF) };
|
||||
|
||||
static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
||||
kBlue1 = BE(0xA0DCFFFF), //160, 220, 255
|
||||
kBlue2 = BE(0x78BEFFFF), //120, 190, 255
|
||||
kBlue3 = BE(0x50A0FFFF), //80, 160, 255
|
||||
kBlue4 = BE(0x1E46B4FF), //30, 70, 180
|
||||
kGray = BE(0x828282FF), //130, 130, 130
|
||||
kGreen = BE(0x00FF00FF); //0, 255, 0
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
|
@ -163,100 +147,21 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
|||
}
|
||||
}
|
||||
|
||||
/*- (void) buildAdvancedBar: (float) widthFloat point: (NSPoint) point
|
||||
- (void) buildAdvancedBar: (float) widthFloat point: (NSPoint) point
|
||||
{
|
||||
NSDictionary * info = [self objectValue];
|
||||
|
||||
//if seeding, there's no need for the advanced bar
|
||||
if ([fTorrent isSeeding])
|
||||
if ([[info objectForKey: @"Seeding"] boolValue])
|
||||
{
|
||||
[self buildSimpleBar: widthFloat point: point];
|
||||
return;
|
||||
}
|
||||
|
||||
int width = widthFloat; //integers for bars
|
||||
|
||||
NSBitmapImageRep * bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: nil
|
||||
pixelsWide: width pixelsHigh: BAR_HEIGHT bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES
|
||||
isPlanar: NO colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0];
|
||||
|
||||
int h, w;
|
||||
uint32_t * p;
|
||||
uint8_t * bitmapData = [bitmap bitmapData];
|
||||
int bytesPerRow = [bitmap bytesPerRow];
|
||||
|
||||
//left and right borders
|
||||
p = (uint32_t *) bitmapData;
|
||||
for(h = 0; h < BAR_HEIGHT; h++)
|
||||
{
|
||||
p[0] = kBorder[h];
|
||||
p[width - 1] = kBorder[h];
|
||||
p += bytesPerRow / 4;
|
||||
}
|
||||
|
||||
int8_t * pieces = malloc(width);
|
||||
[fTorrent getAvailability: pieces size: width];
|
||||
int avail = 0;
|
||||
for (w = 0; w < width; w++)
|
||||
if (pieces[w] != 0)
|
||||
avail++;
|
||||
|
||||
//first two lines: dark blue to show progression, green to show available
|
||||
int end = lrintf(floor([fTorrent progress] * (width - 2)));
|
||||
p = (uint32_t *) (bitmapData) + 1;
|
||||
|
||||
for (w = 0; w < end; w++)
|
||||
{
|
||||
p[w] = kBlue4;
|
||||
p[w + bytesPerRow / 4] = kBlue4;
|
||||
}
|
||||
for (; w < avail; w++)
|
||||
{
|
||||
p[w] = kGreen;
|
||||
p[w + bytesPerRow / 4] = kGreen;
|
||||
}
|
||||
for (; w < width - 2; w++)
|
||||
{
|
||||
p[w] = kBack[0];
|
||||
p[w + bytesPerRow / 4] = kBack[1];
|
||||
}
|
||||
|
||||
//lines 2 to 14: blue or grey depending on whether we have the piece or not
|
||||
uint32_t color;
|
||||
for( w = 0; w < width - 2; w++ )
|
||||
{
|
||||
//point to pixel ( 2 + w, 2 ). We will then draw "vertically"
|
||||
p = (uint32_t *) ( bitmapData + 2 * bytesPerRow ) + 1 + w;
|
||||
|
||||
if (pieces[w] < 0)
|
||||
color = kGray;
|
||||
else if (pieces[w] == 0)
|
||||
color = kRed;
|
||||
else if (pieces[w] == 1)
|
||||
color = kBlue1;
|
||||
else if (pieces[w] == 2)
|
||||
color = kBlue2;
|
||||
else
|
||||
color = kBlue3;
|
||||
|
||||
for( h = 2; h < BAR_HEIGHT; h++ )
|
||||
{
|
||||
p[0] = color;
|
||||
p = (uint32_t *) ( (uint8_t *) p + bytesPerRow );
|
||||
}
|
||||
}
|
||||
|
||||
free( pieces );
|
||||
|
||||
//actually draw image
|
||||
NSImage * img = [[NSImage alloc] initWithSize: [bitmap size]];
|
||||
[img addRepresentation: bitmap];
|
||||
|
||||
//bar size with float, not double, to match standard bar
|
||||
[img setScalesWhenResized: YES];
|
||||
NSImage * img = [info objectForKey: @"AdvancedBar"];
|
||||
[img setSize: NSMakeSize(widthFloat, BAR_HEIGHT)];
|
||||
|
||||
|
||||
[img compositeToPoint: point operation: NSCompositeSourceOver];
|
||||
[img release];
|
||||
[bitmap release];
|
||||
|
||||
//draw overlay over advanced bar
|
||||
[fProgressEndAdvanced compositeToPoint: point operation: NSCompositeSourceOver];
|
||||
|
@ -267,7 +172,7 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
|||
|
||||
point.x += widthFloat;
|
||||
[fProgressEndAdvanced compositeToPoint: point operation: NSCompositeSourceOver];
|
||||
}*/
|
||||
}
|
||||
|
||||
- (void) toggleMinimalStatus
|
||||
{
|
||||
|
@ -335,9 +240,9 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
|||
|
||||
float barWidth = mainWidth + EXTRA_NAME_SHIFT - BUTTONS_TOTAL_WIDTH + PADDING;
|
||||
|
||||
/*if ([fDefaults boolForKey: @"UseAdvancedBar"])
|
||||
if ([fDefaults boolForKey: @"UseAdvancedBar"])
|
||||
[self buildAdvancedBar: barWidth point: pen];
|
||||
else*/
|
||||
else
|
||||
[self buildSimpleBar: barWidth point: pen];
|
||||
|
||||
//status string
|
||||
|
@ -389,9 +294,9 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
|
|||
|
||||
float barWidth = mainWidth + EXTRA_NAME_SHIFT - BUTTONS_TOTAL_WIDTH + PADDING;
|
||||
|
||||
/*if ([fDefaults boolForKey: @"UseAdvancedBar"])
|
||||
if ([fDefaults boolForKey: @"UseAdvancedBar"])
|
||||
[self buildAdvancedBar: barWidth point: pen];
|
||||
else*/
|
||||
else
|
||||
[self buildSimpleBar: barWidth point: pen];
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue