use a custom class instead of a dictionary for holding a torrent's file structure

This commit is contained in:
Mitchell Livingston
2008-05-22 18:39:49 +00:00
parent dd6fc41ef3
commit b89071685f
11 changed files with 332 additions and 97 deletions

View File

@@ -26,6 +26,7 @@
#import "Torrent.h"
#import "FileOutlineView.h"
#import "FilePriorityCell.h"
#import "FileListNode.h"
#import "QuickLookController.h"
#import "NSApplicationAdditions.h"
@@ -101,23 +102,26 @@ typedef enum
if (!item)
return fTorrent ? [[fTorrent fileList] count] : 0;
else
return [[item objectForKey: @"IsFolder"] boolValue] ? [[item objectForKey: @"Children"] count] : 0;
{
FileListNode * node = (FileListNode *)item;
return [node isFolder] ? [[node children] count] : 0;
}
}
- (BOOL) outlineView: (NSOutlineView *) outlineView isItemExpandable: (id) item
{
return [[item objectForKey: @"IsFolder"] boolValue];
return [(FileListNode *)item isFolder];
}
- (id) outlineView: (NSOutlineView *) outlineView child: (int) index ofItem: (id) item
{
return [(item ? [item objectForKey: @"Children"] : [fTorrent fileList]) objectAtIndex: index];
return [(item ? [(FileListNode *)item children] : [fTorrent fileList]) objectAtIndex: index];
}
- (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) tableColumn byItem: (id) item
{
if ([[tableColumn identifier] isEqualToString: @"Check"])
return [NSNumber numberWithInt: [fTorrent checkForFiles: [item objectForKey: @"Indexes"]]];
return [NSNumber numberWithInt: [fTorrent checkForFiles: [(FileListNode *)item indexes]]];
else
return item;
}
@@ -127,7 +131,7 @@ typedef enum
{
NSString * identifier = [tableColumn identifier];
if ([identifier isEqualToString: @"Check"])
[cell setEnabled: [fTorrent canChangeDownloadCheckForFiles: [item objectForKey: @"Indexes"]]];
[cell setEnabled: [fTorrent canChangeDownloadCheckForFiles: [(FileListNode *)item indexes]]];
else if ([identifier isEqualToString: @"Priority"])
{
[cell setRepresentedObject: item];
@@ -148,7 +152,7 @@ typedef enum
if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask)
indexSet = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTorrent fileCount])];
else
indexSet = [item objectForKey: @"Indexes"];
indexSet = [(FileListNode *)item indexes];
[fTorrent setFileCheckState: [object intValue] != NSOffState ? NSOnState : NSOffState forIndexes: indexSet];
[fOutline reloadData];
@@ -159,7 +163,7 @@ typedef enum
- (NSString *) outlineView: (NSOutlineView *) outlineView typeSelectStringForTableColumn: (NSTableColumn *) tableColumn item: (id) item
{
return [item objectForKey: @"Name"];
return [(FileListNode *)item name];
}
- (NSString *) outlineView: (NSOutlineView *) outlineView toolTipForCell: (NSCell *) cell rect: (NSRectPointer) rect
@@ -167,7 +171,7 @@ typedef enum
{
NSString * ident = [tableColumn identifier];
if ([ident isEqualToString: @"Name"])
return [[fTorrent downloadFolder] stringByAppendingPathComponent: [item objectForKey: @"Path"]];
return [[fTorrent downloadFolder] stringByAppendingPathComponent: [(FileListNode *)item fullPath]];
else if ([ident isEqualToString: @"Check"])
{
switch ([cell state])
@@ -182,7 +186,7 @@ typedef enum
}
else if ([ident isEqualToString: @"Priority"])
{
NSSet * priorities = [fTorrent filePrioritiesForIndexes: [item objectForKey: @"Indexes"]];
NSSet * priorities = [fTorrent filePrioritiesForIndexes: [(FileListNode *)item indexes]];
switch ([priorities count])
{
case 0:
@@ -209,7 +213,7 @@ typedef enum
- (float) outlineView: (NSOutlineView *) outlineView heightOfRowByItem: (id) item
{
if ([[item objectForKey: @"IsFolder"] boolValue])
if ([(FileListNode *)item isFolder])
return ROW_SMALL_HEIGHT;
else
return [outlineView rowHeight];
@@ -223,7 +227,7 @@ typedef enum
NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
int i;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
[itemIndexes addIndexes: [[fOutline itemAtRow: i] objectForKey: @"Indexes"]];
[itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]];
[fTorrent setFileCheckState: state forIndexes: itemIndexes];
[fOutline reloadData];
@@ -235,7 +239,7 @@ typedef enum
NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
int i;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
[itemIndexes addIndexes: [[fOutline itemAtRow: i] objectForKey: @"Indexes"]];
[itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]];
[fTorrent setFileCheckState: NSOnState forIndexes: itemIndexes];
@@ -265,7 +269,7 @@ typedef enum
NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
int i;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
[itemIndexes addIndexes: [[fOutline itemAtRow: i] objectForKey: @"Indexes"]];
[itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]];
[fTorrent setFilePriority: priority forIndexes: itemIndexes];
[fOutline reloadData];
@@ -278,7 +282,7 @@ typedef enum
int i;
for (i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i])
[[NSWorkspace sharedWorkspace] selectFile: [folder stringByAppendingPathComponent:
[[fOutline itemAtRow: i] objectForKey: @"Path"]] inFileViewerRootedAtPath: nil];
[[fOutline itemAtRow: i] fullPath]] inFileViewerRootedAtPath: nil];
}
#warning make real view controller (Leopard-only) so that Command-R will work
@@ -296,7 +300,7 @@ typedef enum
int i;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
if ([[NSFileManager defaultManager] fileExistsAtPath:
[downloadFolder stringByAppendingPathComponent: [[[fTorrent fileList] objectAtIndex: i] objectForKey: @"Path"]]])
[downloadFolder stringByAppendingPathComponent: [[[fTorrent fileList] objectAtIndex: i] fullPath]]])
return YES;
return NO;
}
@@ -310,7 +314,7 @@ typedef enum
NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
int i, state = ([menuItem tag] == FILE_CHECK_TAG) ? NSOnState : NSOffState;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
[itemIndexes addIndexes: [[fOutline itemAtRow: i] objectForKey: @"Indexes"]];
[itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]];
return [fTorrent checkForFiles: itemIndexes] != state && [fTorrent canChangeDownloadCheckForFiles: itemIndexes];
}
@@ -324,7 +328,7 @@ typedef enum
NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
int i;
for (i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex: i])
[itemIndexes addIndexes: [[fOutline itemAtRow: i] objectForKey: @"Indexes"]];
[itemIndexes addIndexes: [[fOutline itemAtRow: i] indexes]];
return [fTorrent canChangeDownloadCheckForFiles: itemIndexes];
}
@@ -357,7 +361,7 @@ typedef enum
NSIndexSet * fileIndexSet;
for (i = [indexSet firstIndex]; i != NSNotFound && (!current || !other); i = [indexSet indexGreaterThanIndex: i])
{
fileIndexSet = [[fOutline itemAtRow: i] objectForKey: @"Indexes"];
fileIndexSet = [[fOutline itemAtRow: i] indexes];
if (![fTorrent canChangeDownloadCheckForFiles: fileIndexSet])
continue;
else if ([fTorrent hasFilePriority: priority forIndexes: fileIndexSet])