Changeset 12571


Ignore:
Timestamp:
Jul 21, 2011, 2:36:12 AM (10 years ago)
Author:
livings124
Message:

#4374 Lion: animate filtering files table

Location:
trunk/macosx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/FileOutlineController.h

    r11617 r12571  
    3131{
    3232    Torrent * fTorrent;
    33     NSArray * fFileList;
     33    NSMutableArray * fFileList;
    3434   
    3535    IBOutlet FileOutlineView * fOutline;
    3636   
    3737    NSString * fFilterText;
     38   
     39    NSLock * fLock;
    3840}
    3941
  • trunk/macosx/FileOutlineController.m

    r12483 r12571  
    2929#import "FileListNode.h"
    3030#import "NSApplicationAdditions.h"
     31#import "NSMutableArrayAdditions.h"
    3132#import <Quartz/Quartz.h>
    3233
     
    5051- (NSMenu *) menu;
    5152
     53- (NSUInteger) findFileNode: (FileListNode *) node inList: (NSArray *) list inRange: (NSRange) range currentParent: (FileListNode *) currentParent finalParent: (FileListNode **) parent;
     54
    5255@end
    5356
     
    5659- (void) awakeFromNib
    5760{
     61    fFileList = [[NSMutableArray alloc] init];
     62   
    5863    [fOutline setDoubleAction: @selector(revealFile:)];
    5964    [fOutline setTarget: self];
    6065   
    6166    //set table header tool tips
    62     [[fOutline tableColumnWithIdentifier: @"Check"] setHeaderToolTip: NSLocalizedString(@"Download",
    63                                                                         "file table -> header tool tip")];
    64     [[fOutline tableColumnWithIdentifier: @"Priority"] setHeaderToolTip: NSLocalizedString(@"Priority",
    65                                                                         "file table -> header tool tip")];
     67    [[fOutline tableColumnWithIdentifier: @"Check"] setHeaderToolTip: NSLocalizedString(@"Download", "file table -> header tool tip")];
     68    [[fOutline tableColumnWithIdentifier: @"Priority"] setHeaderToolTip: NSLocalizedString(@"Priority", "file table -> header tool tip")];
    6669   
    6770    [fOutline setMenu: [self menu]];
     71   
     72    #warning needed?
     73    fLock = [[NSLock alloc] init];
    6874   
    6975    [self setTorrent: nil];
     
    7480    [fFileList release];
    7581    [fFilterText release];
     82   
     83    [fLock release];
     84   
    7685    [super dealloc];
    7786}
     
    8695    fTorrent = torrent;
    8796   
    88     [fFileList release];
    89     fFileList = [[fTorrent fileList] retain];
     97    [fFileList setArray: [fTorrent fileList]];
    9098   
    9199    [fFilterText release];
    92100    fFilterText = nil;
    93101   
     102    [fLock lock];
     103   
    94104    [fOutline deselectAll: nil];
    95105    [fOutline reloadData];
     106   
     107    [fLock unlock];
    96108}
    97109
    98110- (void) setFilterText: (NSString *) text
    99111{
     112    [fLock lock];
     113   
    100114    if ([text isEqualToString: @""])
    101115        text = nil;
    102116   
    103117    if ((!text && !fFilterText) || (text && fFilterText && [text isEqualToString: fFilterText]))
     118    {
     119        [fLock unlock];
    104120        return;
     121    }
     122   
     123    const BOOL onLion = [NSApp isOnLionOrBetter];
     124   
     125    if (onLion)
     126        [fOutline beginUpdates];
     127   
     128    NSUInteger currentIndex = 0, totalCount = 0;
     129    NSMutableArray * itemsToAdd = [NSMutableArray array];
     130    NSMutableIndexSet * itemsToAddIndexes = [NSMutableIndexSet indexSet];
     131   
     132    NSMutableDictionary * removedIndexesForParents = nil; //ugly, but we can't modify the actual file nodes
     133   
     134    NSArray * tempList = !text ? [fTorrent fileList] : [fTorrent flatFileList];
     135    for (FileListNode * item in tempList)
     136    {
     137        if (!text || [[item name] rangeOfString: text options: (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)].location != NSNotFound)
     138        {
     139            FileListNode * parent = nil;
     140            NSUInteger previousIndex = ![item isFolder] ? [self findFileNode: item inList: fFileList inRange: NSMakeRange(currentIndex, [fFileList count]-currentIndex) currentParent: nil finalParent: &parent] : NSNotFound;
     141           
     142            if (previousIndex == NSNotFound)
     143            {
     144                [itemsToAdd addObject: item];
     145                [itemsToAddIndexes addIndex: totalCount];
     146            }
     147            else
     148            {
     149                BOOL move = YES;
     150                if (!parent)
     151                {
     152                    if (previousIndex != currentIndex)
     153                        [fFileList moveObjectAtIndex: previousIndex toIndex: currentIndex];
     154                    else
     155                        move = NO;
     156                }
     157                else
     158                {
     159                    [fFileList insertObject: item atIndex: currentIndex];
     160                   
     161                    //figure out the index within the semi-edited table - UGLY
     162                    if (!removedIndexesForParents)
     163                        removedIndexesForParents = [NSMutableDictionary dictionary];
     164                   
     165                    NSMutableIndexSet * removedIndexes = [removedIndexesForParents objectForKey: parent];
     166                    if (!removedIndexes)
     167                    {
     168                        removedIndexes = [NSMutableIndexSet indexSetWithIndex: previousIndex];
     169                        [removedIndexesForParents setObject: removedIndexes forKey: parent];
     170                    }
     171                    else
     172                    {
     173                        [removedIndexes addIndex: previousIndex];
     174                        previousIndex -= [removedIndexes countOfIndexesInRange: NSMakeRange(0, previousIndex)];
     175                    }
     176                }
     177               
     178                if (move && onLion)
     179                    [fOutline moveItemAtIndex: previousIndex inParent: parent toIndex: currentIndex inParent: nil];
     180               
     181                ++currentIndex;
     182            }
     183           
     184            ++totalCount;
     185        }
     186    }
     187   
     188    //remove trailing items - those are the unused
     189    if (currentIndex  < [fFileList count])
     190    {
     191        const NSRange removeRange = NSMakeRange(currentIndex, [fFileList count]-currentIndex);
     192        [fFileList removeObjectsInRange: removeRange];
     193        if (onLion)
     194            [fOutline removeItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: removeRange] inParent: nil withAnimation: NSTableViewAnimationSlideDown];
     195    }
     196   
     197    //add new items
     198    [fFileList insertObjects: itemsToAdd atIndexes: itemsToAddIndexes];
     199    if (onLion)
     200        [fOutline insertItemsAtIndexes: itemsToAddIndexes inParent: nil withAnimation: NSTableViewAnimationSlideUp];
     201   
     202    if (onLion)
     203        [fOutline endUpdates];
     204    else
     205        [fOutline reloadData];
    105206   
    106207    [fFilterText release];
    107208    fFilterText = [text retain];
    108209   
    109     [fFileList release];
    110     if (!fFilterText)
    111         fFileList = [[fTorrent fileList] retain];
    112     else
    113     {
    114         NSMutableArray * list = [NSMutableArray arrayWithCapacity: [fTorrent fileCount]];
    115        
    116         for (FileListNode * node in [fTorrent flatFileList])
    117             if ([[node name] rangeOfString: fFilterText options: (NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch)].location != NSNotFound)
    118                 [list addObject: node];
    119        
    120         fFileList = [[NSArray alloc] initWithArray: list];
    121     }
     210    [fLock unlock];
     211}
     212
     213- (void) reloadData
     214{
     215    [fTorrent updateFileStat];
     216   
     217    [fLock lock];
    122218   
    123219    [fOutline reloadData];
    124 }
    125 
    126 - (void) reloadData
    127 {
    128     [fTorrent updateFileStat];
    129     [fOutline reloadData];
     220   
     221    [fLock unlock];
    130222}
    131223
     
    266358- (void) setCheck: (id) sender
    267359{
     360    [fLock lock];
     361   
    268362    NSInteger state = [sender tag] == FILE_UNCHECK_TAG ? NSOffState : NSOnState;
    269363   
     
    275369    [fTorrent setFileCheckState: state forIndexes: itemIndexes];
    276370    [fOutline reloadData];
     371   
     372    [fLock unlock];
    277373}
    278374
    279375- (void) setOnlySelectedCheck: (id) sender
    280376{
     377    [fLock lock];
     378   
    281379    NSIndexSet * indexSet = [fOutline selectedRowIndexes];
    282380    NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
     
    291389   
    292390    [fOutline reloadData];
     391   
     392    [fLock unlock];
    293393}
    294394
     
    308408    }
    309409   
     410    [fLock lock];
     411   
    310412    NSIndexSet * indexSet = [fOutline selectedRowIndexes];
    311413    NSMutableIndexSet * itemIndexes = [NSMutableIndexSet indexSet];
     
    315417    [fTorrent setFilePriority: priority forIndexes: itemIndexes];
    316418    [fOutline reloadData];
     419   
     420    [fLock unlock];
    317421}
    318422
    319423- (void) revealFile: (id) sender
    320424{
     425    [fLock lock];
     426   
    321427    NSIndexSet * indexes = [fOutline selectedRowIndexes];
    322428    if ([NSApp isOnSnowLeopardOrBetter])
     
    342448        }
    343449    }
     450   
     451    [fLock unlock];
    344452}
    345453
     
    511619}
    512620
     621- (NSUInteger) findFileNode: (FileListNode *) node inList: (NSArray *) list inRange: (NSRange) range currentParent: (FileListNode *) currentParent finalParent: (FileListNode **) parent
     622{
     623    NSAssert(![node isFolder], @"Looking up folder node!");
     624   
     625    const NSUInteger nodeIndex = [[node indexes] firstIndex];
     626    for (NSUInteger index = range.location; index < NSMaxRange(range); ++index)
     627    {
     628        FileListNode * checkNode = [list objectAtIndex: index];
     629        if ([checkNode isEqualTo: node])
     630        {
     631            *parent = currentParent;
     632            return index;
     633        }
     634        else if ([checkNode isFolder] && [[checkNode indexes] containsIndex: nodeIndex])
     635        {
     636            const NSUInteger subIndex = [self findFileNode: node inList: [checkNode children] inRange: NSMakeRange(0, [[checkNode children] count]) currentParent: checkNode finalParent: parent];
     637            NSAssert(subIndex != NSNotFound, @"We didn't find an expected file node.");
     638            return subIndex;
     639        }
     640    }
     641   
     642    return NSNotFound;
     643}
     644
    513645@end
Note: See TracChangeset for help on using the changeset viewer.