first go at using an outline view for files....what a pain parsing the file names

This commit is contained in:
Mitchell Livingston 2007-01-17 06:25:35 +00:00
parent 348f35f505
commit b7e3c9af5a
5 changed files with 98 additions and 40 deletions

View File

@ -37,7 +37,7 @@
fDownloadedValidField = NSTextField; fDownloadedValidField = NSTextField;
fDownloadingFromField = NSTextField; fDownloadingFromField = NSTextField;
fErrorMessageView = NSTextView; fErrorMessageView = NSTextView;
fFileTable = NSTableView; fFileOutline = NSOutlineView;
fFileTableStatusField = NSTextField; fFileTableStatusField = NSTextField;
fHashField = NSTextField; fHashField = NSTextField;
fImageView = NSImageView; fImageView = NSImageView;

View File

@ -53,7 +53,7 @@
IBOutlet NSTextView * fErrorMessageView; IBOutlet NSTextView * fErrorMessageView;
IBOutlet PiecesView * fPiecesView; IBOutlet PiecesView * fPiecesView;
IBOutlet NSTableView * fFileTable; IBOutlet NSOutlineView * fFileOutline;
IBOutlet NSTextField * fFileTableStatusField; IBOutlet NSTextField * fFileTableStatusField;
IBOutlet NSButton * fRatioCustomCheck, * fRatioStopCheck, IBOutlet NSButton * fRatioCustomCheck, * fRatioStopCheck,

View File

@ -70,8 +70,6 @@
- (void) awakeFromNib - (void) awakeFromNib
{ {
[fFileTable setDoubleAction: @selector(revealFile:)];
//window location and size //window location and size
NSPanel * window = (NSPanel *)[self window]; NSPanel * window = (NSPanel *)[self window];
@ -93,6 +91,12 @@
[fPeerTable setSortDescriptors: [NSArray arrayWithObject: [[fPeerTable tableColumnWithIdentifier: @"IP"] [fPeerTable setSortDescriptors: [NSArray arrayWithObject: [[fPeerTable tableColumnWithIdentifier: @"IP"]
sortDescriptorPrototype]]]; sortDescriptorPrototype]]];
//set file table
NSBrowserCell * browserCell = [[[NSBrowserCell alloc] init] autorelease];
[browserCell setLeaf: YES];
[[fFileOutline tableColumnWithIdentifier: @"Name"] setDataCell: browserCell];
[fFileOutline setDoubleAction: @selector(revealFile:)];
[self updateInfoForTorrents: [NSArray array]]; [self updateInfoForTorrents: [NSArray array]];
} }
@ -254,11 +258,12 @@
[fPiecesView setTorrent: torrent]; [fPiecesView setTorrent: torrent];
//set file table //set file table
[fFileTable deselectAll: nil]; [fFileOutline deselectAll: nil];
if (fFiles) if (fFiles)
[fFiles release]; [fFiles release];
fFiles = [[torrent fileList] retain]; fFiles = [[torrent fileList] retain];
#warning change!
if ([fFiles count] > 1) if ([fFiles count] > 1)
[fFileTableStatusField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%d files", [fFileTableStatusField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%d files",
"Inspector -> Files tab -> bottom text (number of files)"), [fFiles count]]]; "Inspector -> Files tab -> bottom text (number of files)"), [fFiles count]]];
@ -272,7 +277,7 @@
[self updateInfoSettings]; [self updateInfoSettings];
[fPeerTable reloadData]; [fPeerTable reloadData];
[fFileTable reloadData]; [fFileOutline reloadData];
} }
- (void) updateInfoStats - (void) updateInfoStats
@ -505,7 +510,7 @@
SEL action = [menuItem action]; SEL action = [menuItem action];
if (action == @selector(revealFile:)) if (action == @selector(revealFile:))
return [fFileTable numberOfSelectedRows] > 0 && return [fFileOutline numberOfSelectedRows] > 0 &&
[[[fTabView selectedTabViewItem] identifier] isEqualToString: TAB_FILES_IDENT]; [[[fTabView selectedTabViewItem] identifier] isEqualToString: TAB_FILES_IDENT];
return YES; return YES;
@ -585,15 +590,14 @@
{ {
if (tableView == fPeerTable) if (tableView == fPeerTable)
return fPeers ? [fPeers count] : 0; return fPeers ? [fPeers count] : 0;
else return 0;
return fFiles ? [fFiles count] : 0;
} }
- (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) column row: (int) row - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) column row: (int) row
{ {
NSString * ident = [column identifier];
if (tableView == fPeerTable) if (tableView == fPeerTable)
{ {
NSString * ident = [column identifier];
NSDictionary * peer = [fPeers objectAtIndex: row]; NSDictionary * peer = [fPeers objectAtIndex: row];
if ([ident isEqualToString: @"Connected"]) if ([ident isEqualToString: @"Connected"])
@ -611,16 +615,7 @@
else else
return [peer objectForKey: @"IP"]; return [peer objectForKey: @"IP"];
} }
else return nil;
{
NSDictionary * file = [fFiles objectAtIndex: row];
if ([ident isEqualToString: @"Icon"])
return [[NSWorkspace sharedWorkspace] iconForFileType: [[file objectForKey: @"Name"] pathExtension]];
else if ([ident isEqualToString: @"Size"])
return [NSString stringForFileSize: [[file objectForKey: @"Size"] unsignedLongLongValue]];
else
return [file objectForKey: @"Name"];
}
} }
- (void) tableView: (NSTableView *) tableView didClickTableColumn: (NSTableColumn *) tableColumn - (void) tableView: (NSTableView *) tableView didClickTableColumn: (NSTableColumn *) tableColumn
@ -646,16 +641,8 @@
rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column rect: (NSRectPointer) rect tableColumn: (NSTableColumn *) column
row: (int) row mouseLocation: (NSPoint) mouseLocation row: (int) row mouseLocation: (NSPoint) mouseLocation
{ {
if (tableView == fFileTable) #warning tooltip for file table?
{ if (tableView == fPeerTable)
NSDictionary * file = [fFiles objectAtIndex: row];
if ([[column identifier] isEqualToString: @"Size"])
return [[[file objectForKey: @"Size"] stringValue] stringByAppendingString: NSLocalizedString(@" bytes",
"Inspector -> Files tab -> table row tooltip")];
else
return [file objectForKey: @"Name"];
}
else if (tableView == fPeerTable)
{ {
NSDictionary * peerDic = [fPeers objectAtIndex: row]; NSDictionary * peerDic = [fPeers objectAtIndex: row];
return [NSString stringWithFormat: NSLocalizedString(@"Progress: %.1f%%" return [NSString stringWithFormat: NSLocalizedString(@"Progress: %.1f%%"
@ -667,8 +654,41 @@
? NSLocalizedString(@"incoming", "Inspector -> Peers tab -> table row tooltip") ? NSLocalizedString(@"incoming", "Inspector -> Peers tab -> table row tooltip")
: NSLocalizedString(@"outgoing", "Inspector -> Peers tab -> table row tooltip")]; : NSLocalizedString(@"outgoing", "Inspector -> Peers tab -> table row tooltip")];
} }
else return nil;
return nil; }
- (int) outlineView: (NSOutlineView *) outlineView numberOfChildrenOfItem: (id) item
{
if (!item)
return [fFiles count];
return [[item objectForKey: @"IsFolder"] boolValue] ? [[item objectForKey: @"Children"] count] : 0;
}
- (BOOL) outlineView: (NSOutlineView *) outlineView isItemExpandable: (id) item
{
return [[item objectForKey: @"IsFolder"] boolValue];
}
- (id) outlineView: (NSOutlineView *) outlineView child: (int) index ofItem: (id) item
{
return [(item ? [item objectForKey: @"Children"] : fFiles) objectAtIndex: index];
}
- (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) tableColumn
byItem: (id) item
{
NSString * ident = [tableColumn identifier];
return [item objectForKey: @"Name"];
}
- (void) outlineView: (NSOutlineView *) outlineView willDisplayCell: (id) cell
forTableColumn: (NSTableColumn *) tableColumn item:(id) item
{
NSImage * icon = [[NSWorkspace sharedWorkspace] iconForFileType: ![[item objectForKey: @"IsFolder"] boolValue]
? [[item objectForKey: @"Name"] pathExtension] : NSFileTypeForHFSTypeCode('fldr')];
[icon setScalesWhenResized: YES];
[icon setSize: NSMakeSize(16.0, 16.0)];
[cell setImage: icon];
} }
- (NSArray *) peerSortDescriptors - (NSArray *) peerSortDescriptors
@ -698,12 +718,16 @@
- (void) revealFile: (id) sender - (void) revealFile: (id) sender
{ {
Torrent * torrent = [fTorrents objectAtIndex: 0]; if (!fFiles)
NSEnumerator * enumerator = [[fFiles objectsAtIndexes: [fFileTable selectedRowIndexes]] objectEnumerator]; return;
#warning get working
/*Torrent * torrent = [fTorrents objectAtIndex: 0];
NSEnumerator * enumerator = [[fFiles objectsAtIndexes: [fFileOutline selectedRowIndexes]] objectEnumerator];
NSDictionary * file; NSDictionary * file;
while ((file = [enumerator nextObject])) while ((file = [enumerator nextObject]))
[[NSWorkspace sharedWorkspace] selectFile: [[torrent downloadFolder] [[NSWorkspace sharedWorkspace] selectFile: [[torrent downloadFolder]
stringByAppendingPathComponent: [file objectForKey: @"Name"]] inFileViewerRootedAtPath: nil]; stringByAppendingPathComponent: [file objectForKey: @"Name"]] inFileViewerRootedAtPath: nil];*/
} }
- (void) setLimitCustom: (id) sender - (void) setLimitCustom: (id) sender

View File

@ -43,8 +43,8 @@
checkDownload: (NSNumber *) checkDownload downloadLimit: (NSNumber *) downloadLimit checkDownload: (NSNumber *) checkDownload downloadLimit: (NSNumber *) downloadLimit
waitToStart: (NSNumber *) waitToStart orderValue: (NSNumber *) orderValue; waitToStart: (NSNumber *) waitToStart orderValue: (NSNumber *) orderValue;
- (void) insertPath: (NSMutableArray *) components withParent: (NSMutableArray *) parent;
- (NSImage *) advancedBar; - (NSImage *) advancedBar;
- (void) trashFile: (NSString *) path; - (void) trashFile: (NSString *) path;
@end @end
@ -1068,16 +1068,17 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
{ {
int count = fInfo->fileCount, i; int count = fInfo->fileCount, i;
tr_file_t file; tr_file_t file;
NSMutableArray * files = [NSMutableArray arrayWithCapacity: count]; NSMutableArray * files = [NSMutableArray array];
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
file = fInfo->files[i]; file = fInfo->files[i];
[files addObject: [NSDictionary dictionaryWithObjectsAndKeys:
[self insertPath: [[[NSString stringWithUTF8String: file.name] pathComponents] mutableCopy] withParent: files];
/*[files addObject: [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithUTF8String: file.name], @"Name", [NSString stringWithUTF8String: file.name], @"Name",
[NSNumber numberWithUnsignedLongLong: file.length], @"Size", nil]]; [NSNumber numberWithUnsignedLongLong: file.length], @"Size", nil]];*/
} }
return files; return files;
} }
@ -1204,6 +1205,39 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80
return self; return self;
} }
- (void) insertPath: (NSMutableArray *) components withParent: (NSMutableArray *) parent
{
NSString * name = [components objectAtIndex: 0];
BOOL isFolder = [components count] > 1;
NSMutableDictionary * dict = nil;
if (isFolder)
{
NSEnumerator * enumerator = [parent objectEnumerator];
while ((dict = [enumerator nextObject]))
if ([[dict objectForKey: @"Name"] isEqualToString: name] && [[dict objectForKey: @"IsFolder"] boolValue])
break;
}
//create new folder or item if it doesn't already exist
if (!dict)
{
#warning put size and full path here for item later
dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: name, @"Name",
[NSNumber numberWithBool: isFolder], @"IsFolder", nil];
if (isFolder)
[dict setObject: [NSMutableArray array] forKey: @"Children"];
[parent addObject: dict];
}
if (isFolder)
{
[components removeObjectAtIndex: 0];
[self insertPath: components withParent: [dict objectForKey: @"Children"]];
}
}
- (NSImage *) advancedBar - (NSImage *) advancedBar
{ {
int h, w; int h, w;