dynamically show the files for file selection in the top-level action menu

This commit is contained in:
Mitchell Livingston 2007-08-18 05:46:20 +00:00
parent 10fb72281b
commit 596525d89a
1 changed files with 84 additions and 75 deletions

View File

@ -38,8 +38,6 @@
#define ACTION_MENU_UNLIMITED_TAG 102
#define ACTION_MENU_LIMIT_TAG 103
#define ACTION_MENU_FILE_TAG 201
@interface TorrentTableView (Private)
- (NSRect) pauseRectForRow: (int) row;
@ -53,6 +51,10 @@
- (BOOL) pointInRevealRect: (NSPoint) point;
- (BOOL) pointInActionRect: (NSPoint) point;
- (void) updateFileMenu: (NSMenu *) menu forFiles: (NSArray *) files;
- (void) moveItemsFromMenu: (NSMenu *) oldMenu inRange: (NSRange) range toMenu: (NSMenu *) newMenu;
@end
@implementation TorrentTableView
@ -310,25 +312,16 @@
if (row < 0)
return;
//get file menu
//get and update file menu
fMenuTorrent = [[fTorrents objectAtIndex: row] retain];
NSMenu * fileMenu = [fMenuTorrent fileMenu];
[fileMenu setDelegate: self];
[self updateFileMenu: fileMenu forFiles: [fMenuTorrent fileList]];
//remove old file menu
NSMenuItem * oldFileMenuItem;
if ((oldFileMenuItem = [fActionMenu itemWithTag: ACTION_MENU_FILE_TAG]))
[fActionMenu removeItem: oldFileMenuItem];
//set file menu
NSMenuItem * fileMenuItem = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Files",
"torrent action context menu -> files menu") action: NULL keyEquivalent: @""];
[fileMenuItem setTag: ACTION_MENU_FILE_TAG];
[fileMenuItem setSubmenu: fileMenu];
[fActionMenu addItem: fileMenuItem];
[fileMenuItem release];
//add file menu items to action menu
NSRange range = NSMakeRange(0, [fileMenu numberOfItems]);
[self moveItemsFromMenu: fileMenu inRange: range toMenu: fActionMenu];
//place menu below button
NSRect rect = [self actionRectForRow: row];
NSPoint location = rect.origin;
location.y += rect.size.height + 5.0;
@ -340,6 +333,10 @@
[NSMenu popUpContextMenu: fActionMenu withEvent: newEvent forView: self];
//move file menu items back to the torrent's file menu
range.location = [fActionMenu numberOfItems] - range.length;
[self moveItemsFromMenu: fActionMenu inRange: range toMenu: fileMenu];
[fMenuTorrent release];
fMenuTorrent = nil;
}
@ -381,67 +378,12 @@
item = [menu itemWithTag: ACTION_MENU_GLOBAL_TAG];
[item setState: mode == NSMixedState ? NSOnState : NSOffState];
}
#warning better way?
else if ([menu supermenu]) //assume the menu is part of the file list
{
BOOL create = [menu numberOfItems] <= 0, folder;
NSMenu * supermenu = [menu supermenu];
NSArray * items;
NSDictionary * folderDict;
if ((folderDict = [[supermenu itemAtIndex: [supermenu indexOfItemWithSubmenu: menu]] representedObject]))
items = [folderDict objectForKey: @"Children"];
else
items = [fMenuTorrent fileList];
NSEnumerator * enumerator = [items objectEnumerator];
NSDictionary * dict;
NSMenuItem * item;
while ((dict = [enumerator nextObject]))
{
NSString * name = [dict objectForKey: @"Name"];
folder = [[dict objectForKey: @"IsFolder"] boolValue];
if (create)
{
item = [[NSMenuItem alloc] initWithTitle: name action: NULL keyEquivalent: @""];
NSImage * icon;
if (!folder)
{
icon = [[dict objectForKey: @"Icon"] copy];
[icon setFlipped: NO];
}
else
{
NSMenu * itemMenu = [[NSMenu alloc] initWithTitle: name];
[itemMenu setAutoenablesItems: NO];
[item setSubmenu: itemMenu];
[itemMenu setDelegate: self];
[itemMenu release];
icon = [[[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')] copy];
}
[item setRepresentedObject: dict];
[icon setScalesWhenResized: YES];
[icon setSize: NSMakeSize(16.0, 16.0)];
[item setImage: icon];
[icon release];
[item setAction: @selector(checkFile:)];
[menu addItem: item];
[item release];
}
else
item = [menu itemWithTitle: name];
NSIndexSet * indexSet = [dict objectForKey: @"Indexes"];
[item setState: [fMenuTorrent checkForFiles: indexSet]];
[item setEnabled: [fMenuTorrent canChangeDownloadCheckForFiles: indexSet]];
}
[self updateFileMenu: menu forFiles: [[[supermenu itemAtIndex: [supermenu indexOfItemWithSubmenu: menu]]
representedObject] objectForKey: @"Children"]];
}
else;
}
@ -647,4 +589,71 @@
return NSPointInRect(point, [self actionRectForRow: row]);
}
- (void) updateFileMenu: (NSMenu *) menu forFiles: (NSArray *) files
{
BOOL create = [menu numberOfItems] <= 0;
NSEnumerator * enumerator = [files objectEnumerator];
NSDictionary * dict;
NSMenuItem * item;
while ((dict = [enumerator nextObject]))
{
NSString * name = [dict objectForKey: @"Name"];
if (create)
{
item = [[NSMenuItem alloc] initWithTitle: name action: NULL keyEquivalent: @""];
NSImage * icon;
if (![[dict objectForKey: @"IsFolder"] boolValue])
{
icon = [[dict objectForKey: @"Icon"] copy];
[icon setFlipped: NO];
}
else
{
NSMenu * itemMenu = [[NSMenu alloc] initWithTitle: name];
[itemMenu setAutoenablesItems: NO];
[item setSubmenu: itemMenu];
[itemMenu setDelegate: self];
[itemMenu release];
icon = [[[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')] copy];
}
[item setRepresentedObject: dict];
[icon setScalesWhenResized: YES];
[icon setSize: NSMakeSize(16.0, 16.0)];
[item setImage: icon];
[icon release];
[item setAction: @selector(checkFile:)];
[menu addItem: item];
[item release];
}
else
item = [menu itemWithTitle: name];
NSIndexSet * indexSet = [dict objectForKey: @"Indexes"];
[item setState: [fMenuTorrent checkForFiles: indexSet]];
[item setEnabled: [fMenuTorrent canChangeDownloadCheckForFiles: indexSet]];
}
}
#warning move to additions
- (void) moveItemsFromMenu: (NSMenu *) oldMenu inRange: (NSRange) range toMenu: (NSMenu *) newMenu
{
NSMenuItem * item;
int i;
for (i=0; i<range.length; i++)
{
item = [[oldMenu itemAtIndex: range.location] retain];
[oldMenu removeItem: item];
[newMenu addItem: item];
[item release];
}
}
@end