From 596525d89aab3554483ca2fc259b4945c8abf60a Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sat, 18 Aug 2007 05:46:20 +0000 Subject: [PATCH] dynamically show the files for file selection in the top-level action menu --- macosx/TorrentTableView.m | 159 ++++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 75 deletions(-) diff --git a/macosx/TorrentTableView.m b/macosx/TorrentTableView.m index 866935155..1ff82d016 100644 --- a/macosx/TorrentTableView.m +++ b/macosx/TorrentTableView.m @@ -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