Changeset 2833


Ignore:
Timestamp:
Aug 18, 2007, 5:46:20 AM (15 years ago)
Author:
livings124
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/TorrentTableView.m

    r2828 r2833  
    3939#define ACTION_MENU_LIMIT_TAG 103
    4040
    41 #define ACTION_MENU_FILE_TAG 201
    42 
    4341@interface TorrentTableView (Private)
    4442
     
    5351- (BOOL) pointInRevealRect: (NSPoint) point;
    5452- (BOOL) pointInActionRect: (NSPoint) point;
     53
     54- (void) updateFileMenu: (NSMenu *) menu forFiles: (NSArray *) files;
     55
     56- (void) moveItemsFromMenu: (NSMenu *) oldMenu inRange: (NSRange) range toMenu: (NSMenu *) newMenu;
    5557
    5658@end
     
    311313        return;
    312314   
    313     //get file menu
     315    //get and update file menu
    314316    fMenuTorrent = [[fTorrents objectAtIndex: row] retain];
    315317    NSMenu * fileMenu = [fMenuTorrent fileMenu];
    316     [fileMenu setDelegate: self];
    317    
    318     //remove old file menu
    319     NSMenuItem * oldFileMenuItem;
    320     if ((oldFileMenuItem = [fActionMenu itemWithTag: ACTION_MENU_FILE_TAG]))
    321         [fActionMenu removeItem: oldFileMenuItem];
    322    
    323     //set file menu
    324     NSMenuItem * fileMenuItem = [[NSMenuItem alloc] initWithTitle: NSLocalizedString(@"Files",
    325                                     "torrent action context menu -> files menu") action: NULL keyEquivalent: @""];
    326     [fileMenuItem setTag: ACTION_MENU_FILE_TAG];
    327     [fileMenuItem setSubmenu: fileMenu];
    328     [fActionMenu addItem: fileMenuItem];
    329    
    330     [fileMenuItem release];
    331    
     318    [self updateFileMenu: fileMenu forFiles: [fMenuTorrent fileList]];
     319   
     320    //add file menu items to action menu
     321    NSRange range = NSMakeRange(0, [fileMenu numberOfItems]);
     322    [self moveItemsFromMenu: fileMenu inRange: range toMenu: fActionMenu];
     323   
     324    //place menu below button
    332325    NSRect rect = [self actionRectForRow: row];
    333326    NSPoint location = rect.origin;
     
    341334    [NSMenu popUpContextMenu: fActionMenu withEvent: newEvent forView: self];
    342335   
     336    //move file menu items back to the torrent's file menu
     337    range.location = [fActionMenu numberOfItems] - range.length;
     338    [self moveItemsFromMenu: fActionMenu inRange: range toMenu: fileMenu];
     339   
    343340    [fMenuTorrent release];
    344341    fMenuTorrent = nil;
     
    382379        [item setState: mode == NSMixedState ? NSOnState : NSOffState];
    383380    }
     381    #warning better way?
    384382    else if ([menu supermenu]) //assume the menu is part of the file list
    385383    {
    386         BOOL create = [menu numberOfItems] <= 0, folder;
    387        
    388384        NSMenu * supermenu = [menu supermenu];
    389         NSArray * items;
    390         NSDictionary * folderDict;
    391         if ((folderDict = [[supermenu itemAtIndex: [supermenu indexOfItemWithSubmenu: menu]] representedObject]))
    392             items = [folderDict objectForKey: @"Children"];
    393         else
    394             items = [fMenuTorrent fileList];
    395        
    396         NSEnumerator * enumerator = [items objectEnumerator];
    397         NSDictionary * dict;
    398         NSMenuItem * item;
    399         while ((dict = [enumerator nextObject]))
    400         {
    401             NSString * name = [dict objectForKey: @"Name"];
    402            
    403             folder = [[dict objectForKey: @"IsFolder"] boolValue];
    404            
    405             if (create)
    406             {
    407                 item = [[NSMenuItem alloc] initWithTitle: name action: NULL keyEquivalent: @""];
    408                
    409                 NSImage * icon;
    410                 if (!folder)
    411                 {
    412                     icon = [[dict objectForKey: @"Icon"] copy];
    413                     [icon setFlipped: NO];
    414                 }
    415                 else
    416                 {
    417                     NSMenu * itemMenu = [[NSMenu alloc] initWithTitle: name];
    418                     [itemMenu setAutoenablesItems: NO];
    419                     [item setSubmenu: itemMenu];
    420                     [itemMenu setDelegate: self];
    421                     [itemMenu release];
    422                    
    423                     icon = [[[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')] copy];
    424                 }
    425                
    426                 [item setRepresentedObject: dict];
    427                
    428                 [icon setScalesWhenResized: YES];
    429                 [icon setSize: NSMakeSize(16.0, 16.0)];
    430                 [item setImage: icon];
    431                 [icon release];
    432                
    433                 [item setAction: @selector(checkFile:)];
    434                
    435                 [menu addItem: item];
    436                 [item release];
    437             }
    438             else
    439                 item = [menu itemWithTitle: name];
    440            
    441             NSIndexSet * indexSet = [dict objectForKey: @"Indexes"];
    442             [item setState: [fMenuTorrent checkForFiles: indexSet]];
    443             [item setEnabled: [fMenuTorrent canChangeDownloadCheckForFiles: indexSet]];
    444         }
     385        [self updateFileMenu: menu forFiles: [[[supermenu itemAtIndex: [supermenu indexOfItemWithSubmenu: menu]]
     386                                                    representedObject] objectForKey: @"Children"]];
    445387    }
    446388    else;
     
    648590}
    649591
     592- (void) updateFileMenu: (NSMenu *) menu forFiles: (NSArray *) files
     593{
     594    BOOL create = [menu numberOfItems] <= 0;
     595   
     596    NSEnumerator * enumerator = [files objectEnumerator];
     597    NSDictionary * dict;
     598    NSMenuItem * item;
     599    while ((dict = [enumerator nextObject]))
     600    {
     601        NSString * name = [dict objectForKey: @"Name"];
     602       
     603        if (create)
     604        {
     605            item = [[NSMenuItem alloc] initWithTitle: name action: NULL keyEquivalent: @""];
     606           
     607            NSImage * icon;
     608            if (![[dict objectForKey: @"IsFolder"] boolValue])
     609            {
     610                icon = [[dict objectForKey: @"Icon"] copy];
     611                [icon setFlipped: NO];
     612            }
     613            else
     614            {
     615                NSMenu * itemMenu = [[NSMenu alloc] initWithTitle: name];
     616                [itemMenu setAutoenablesItems: NO];
     617                [item setSubmenu: itemMenu];
     618                [itemMenu setDelegate: self];
     619                [itemMenu release];
     620               
     621                icon = [[[NSWorkspace sharedWorkspace] iconForFileType: NSFileTypeForHFSTypeCode('fldr')] copy];
     622            }
     623           
     624            [item setRepresentedObject: dict];
     625           
     626            [icon setScalesWhenResized: YES];
     627            [icon setSize: NSMakeSize(16.0, 16.0)];
     628            [item setImage: icon];
     629            [icon release];
     630           
     631            [item setAction: @selector(checkFile:)];
     632           
     633            [menu addItem: item];
     634            [item release];
     635        }
     636        else
     637            item = [menu itemWithTitle: name];
     638       
     639        NSIndexSet * indexSet = [dict objectForKey: @"Indexes"];
     640        [item setState: [fMenuTorrent checkForFiles: indexSet]];
     641        [item setEnabled: [fMenuTorrent canChangeDownloadCheckForFiles: indexSet]];
     642    }
     643}
     644
     645#warning move to additions
     646- (void) moveItemsFromMenu: (NSMenu *) oldMenu inRange: (NSRange) range toMenu: (NSMenu *) newMenu
     647{
     648    NSMenuItem * item;
     649    int i;
     650    for (i=0; i<range.length; i++)
     651    {
     652        item = [[oldMenu itemAtIndex: range.location] retain];
     653        [oldMenu removeItem: item];
     654        [newMenu addItem: item];
     655        [item release];
     656    }
     657}
     658
    650659@end
Note: See TracChangeset for help on using the changeset viewer.