Changeset 13130


Ignore:
Timestamp:
Jan 4, 2012, 5:16:07 AM (9 years ago)
Author:
livings124
Message:

#4696 (Lion) animate sorting the main table

Location:
trunk/macosx
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/Controller.h

    r13127 r13130  
    190190- (void) applyFilter;
    191191
    192 - (void) sortTorrents;
    193 - (void) sortTorrentsIgnoreSelected: (BOOL *) changed;
     192- (void) sortTorrents: (BOOL) includeQueueOrder;
     193- (void) sortTorrentsIgnoreSelected: (NSMutableArray *) moves includeQueueOrder: (BOOL) includeQueueOrder;
     194- (NSArray *) rearrangeTorrentArray: (NSMutableArray *) rearrangeArray to: (NSArray *) endingArray forParent: parent;
    194195- (void) setSort: (id) sender;
    195196- (void) setSortByGroup: (id) sender;
  • trunk/macosx/Controller.m

    r13127 r13130  
    5252#import "DragOverlayWindow.h"
    5353#import "NSApplicationAdditions.h"
     54#import "NSMutableArrayAdditions.h"
    5455#import "NSStringAdditions.h"
    5556#import "ExpandedPathToPathTransformer.h"
     
    16331634        if ([fWindow isVisible])
    16341635        {
    1635             [self sortTorrents];
     1636            [self sortTorrents: NO];
    16361637           
    16371638            [fStatusBar updateWithDownload: dlRate upload: ulRate];
     
    18041805   
    18051806    [fDefaults setObject: sortType forKey: @"Sort"];
    1806     [self applyFilter]; //better than calling sortTorrents because it will even apply to queue order
     1807   
     1808    [self sortTorrents: YES];
    18071809}
    18081810
     
    18251827    {
    18261828        [fDefaults setBool: setReverse forKey: @"SortReverse"];
    1827         [self sortTorrents];
    1828     }
    1829 }
    1830 
    1831 - (void) sortTorrents
    1832 {
    1833     NSArray * selectedValues = [fTableView selectedValues];
    1834    
    1835     BOOL changed;
    1836     [self sortTorrentsIgnoreSelected: &changed]; //actually sort
    1837    
    1838     if (changed)
    1839     {
    1840         [fTableView reloadData];
    1841         [fTableView selectValues: selectedValues];
    1842     }
     1829        [self sortTorrents: NO];
     1830    }
     1831}
     1832
     1833- (void) sortTorrents: (BOOL) includeQueueOrder
     1834{
     1835    NSArray * selectedValues;
     1836    if ([NSApp isOnLionOrBetter])
     1837        [fTableView beginUpdates];
    18431838    else
    1844         [fTableView setNeedsDisplay: YES];
    1845 }
    1846 
    1847 - (void) sortTorrentsIgnoreSelected: (BOOL *) changed
    1848 {
    1849     if (changed)
    1850         *changed = NO;
     1839        selectedValues = [fTableView selectedValues];
     1840   
     1841    NSMutableArray * moves = [NSMutableArray array];
     1842    [self sortTorrentsIgnoreSelected: moves includeQueueOrder: includeQueueOrder]; //actually sort
     1843   
     1844    if ([NSApp isOnLionOrBetter])
     1845    {
     1846        for (NSDictionary * move in moves)
     1847        {
     1848            id parent = [move objectForKey: @"Parent"];
     1849            [fTableView moveItemAtIndex: [(NSNumber *)[move objectForKey: @"From"] unsignedIntegerValue] inParent: parent toIndex: [(NSNumber *)[move objectForKey: @"To"] unsignedIntegerValue] inParent: parent];
     1850        }
     1851       
     1852        [fTableView setNeedsDisplay: YES]; //need to make sure all have new info
     1853    }
     1854    else
     1855    {
     1856        if ([moves count] > 0)
     1857        {
     1858            [fTableView reloadData];
     1859            [fTableView selectValues: selectedValues];
     1860        }
     1861        else
     1862            [fTableView setNeedsDisplay: YES];
     1863    }
     1864   
     1865    if ([NSApp isOnLionOrBetter])
     1866        [fTableView endUpdates];
     1867}
     1868
     1869#warning rename
     1870- (void) sortTorrentsIgnoreSelected: (NSMutableArray *) moves includeQueueOrder: (BOOL) includeQueueOrder
     1871{
     1872    [moves removeAllObjects];
     1873   
     1874    //don't do anything else if we don't have to
     1875    const BOOL sortByGroup = [fDefaults boolForKey: @"SortByGroup"];
     1876    const NSUInteger count = [fDisplayedTorrents count];
     1877    if (count == 0 || (!sortByGroup && count == 1))
     1878        return;
    18511879   
    18521880    NSString * sortType = [fDefaults stringForKey: @"Sort"];
    18531881   
    1854     if (![sortType isEqualToString: SORT_ORDER])
    1855     {
    1856         const BOOL asc = ![fDefaults boolForKey: @"SortReverse"];
    1857        
    1858         NSArray * descriptors;
    1859         NSSortDescriptor * nameDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: asc selector: @selector(localizedStandardCompare:)];
    1860        
    1861         if ([sortType isEqualToString: SORT_STATE])
    1862         {
    1863             NSSortDescriptor * stateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"stateSortKey" ascending: !asc],
    1864                             * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: !asc],
    1865                             * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: !asc];
    1866            
    1867             descriptors = [[NSArray alloc] initWithObjects: stateDescriptor, progressDescriptor, ratioDescriptor, nameDescriptor, nil];
    1868         }
    1869         else if ([sortType isEqualToString: SORT_PROGRESS])
    1870         {
    1871             NSSortDescriptor * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: asc],
    1872                             * ratioProgressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progressStopRatio" ascending: asc],
    1873                             * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: asc];
    1874            
    1875             descriptors = [[NSArray alloc] initWithObjects: progressDescriptor, ratioProgressDescriptor, ratioDescriptor, nameDescriptor, nil];
    1876         }
    1877         else if ([sortType isEqualToString: SORT_TRACKER])
    1878         {
    1879             NSSortDescriptor * trackerDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"trackerSortKey" ascending: asc selector: @selector(localizedCaseInsensitiveCompare:)];
    1880            
    1881             descriptors = [[NSArray alloc] initWithObjects: trackerDescriptor, nameDescriptor, nil];
    1882         }
    1883         else if ([sortType isEqualToString: SORT_ACTIVITY])
    1884         {
    1885             NSSortDescriptor * rateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"totalRate" ascending: !asc];
    1886             NSSortDescriptor * activityDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateActivityOrAdd" ascending: !asc];
    1887            
    1888             descriptors = [[NSArray alloc] initWithObjects: rateDescriptor, activityDescriptor, nameDescriptor, nil];
    1889         }
    1890         else if ([sortType isEqualToString: SORT_DATE])
    1891         {
    1892             NSSortDescriptor * dateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateAdded" ascending: asc];
    1893            
    1894             descriptors = [[NSArray alloc] initWithObjects: dateDescriptor, nameDescriptor, nil];
    1895         }
    1896         else if ([sortType isEqualToString: SORT_SIZE])
    1897         {
    1898             NSSortDescriptor * sizeDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"size" ascending: asc];
    1899            
    1900             descriptors = [[NSArray alloc] initWithObjects: sizeDescriptor, nameDescriptor, nil];
    1901         }
    1902         else
    1903             descriptors = [[NSArray alloc] initWithObjects: nameDescriptor, nil];
    1904        
    1905         //actually sort
    1906         if ([fDefaults boolForKey: @"SortByGroup"])
    1907         {
    1908             for (TorrentGroup * group in fDisplayedTorrents)
     1882    if (!includeQueueOrder && [sortType isEqualToString: SORT_ORDER])
     1883        return;
     1884   
     1885    const BOOL asc = ![fDefaults boolForKey: @"SortReverse"];
     1886   
     1887    NSArray * descriptors;
     1888    NSSortDescriptor * nameDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: asc selector: @selector(localizedStandardCompare:)];
     1889   
     1890    if ([sortType isEqualToString: SORT_STATE])
     1891    {
     1892        NSSortDescriptor * stateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"stateSortKey" ascending: !asc],
     1893                        * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: !asc],
     1894                        * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: !asc];
     1895       
     1896        descriptors = [[NSArray alloc] initWithObjects: stateDescriptor, progressDescriptor, ratioDescriptor, nameDescriptor, nil];
     1897    }
     1898    else if ([sortType isEqualToString: SORT_PROGRESS])
     1899    {
     1900        NSSortDescriptor * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: asc],
     1901                        * ratioProgressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progressStopRatio" ascending: asc],
     1902                        * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: asc];
     1903       
     1904        descriptors = [[NSArray alloc] initWithObjects: progressDescriptor, ratioProgressDescriptor, ratioDescriptor, nameDescriptor, nil];
     1905    }
     1906    else if ([sortType isEqualToString: SORT_TRACKER])
     1907    {
     1908        NSSortDescriptor * trackerDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"trackerSortKey" ascending: asc selector: @selector(localizedCaseInsensitiveCompare:)];
     1909       
     1910        descriptors = [[NSArray alloc] initWithObjects: trackerDescriptor, nameDescriptor, nil];
     1911    }
     1912    else if ([sortType isEqualToString: SORT_ACTIVITY])
     1913    {
     1914        NSSortDescriptor * rateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"totalRate" ascending: !asc];
     1915        NSSortDescriptor * activityDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateActivityOrAdd" ascending: !asc];
     1916       
     1917        descriptors = [[NSArray alloc] initWithObjects: rateDescriptor, activityDescriptor, nameDescriptor, nil];
     1918    }
     1919    else if ([sortType isEqualToString: SORT_DATE])
     1920    {
     1921        NSSortDescriptor * dateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateAdded" ascending: asc];
     1922       
     1923        descriptors = [[NSArray alloc] initWithObjects: dateDescriptor, nameDescriptor, nil];
     1924    }
     1925    else if ([sortType isEqualToString: SORT_SIZE])
     1926    {
     1927        NSSortDescriptor * sizeDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"size" ascending: asc];
     1928       
     1929        descriptors = [[NSArray alloc] initWithObjects: sizeDescriptor, nameDescriptor, nil];
     1930    }
     1931    else if ([sortType isEqualToString: SORT_NAME])
     1932    {
     1933        descriptors = [[NSArray alloc] initWithObjects: nameDescriptor, nil];
     1934    }
     1935    else
     1936    {
     1937        NSAssert1([sortType isEqualToString: SORT_ORDER], @"Unknown sort type received: %@", sortType);
     1938        NSAssert(includeQueueOrder, @"Sorting by queue order when we shouldn't");
     1939       
     1940        NSSortDescriptor * orderDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"queuePosition" ascending: asc];
     1941       
     1942        descriptors = [[NSArray alloc] initWithObjects: orderDescriptor, nil];
     1943    }
     1944   
     1945    //actually sort
     1946    if (sortByGroup)
     1947    {
     1948        for (TorrentGroup * group in fDisplayedTorrents)
     1949        {
     1950            if ([[group torrents] count] > 1)
    19091951            {
    1910                 if (changed)
     1952                if (moves)
    19111953                {
    19121954                    NSArray * sorted = [[group torrents] sortedArrayUsingDescriptors: descriptors];
    1913                     if (![[group torrents] isEqualToArray: sorted])
    1914                     {
    1915                         [[group torrents] setArray: sorted];
    1916                         *changed = YES;
    1917                     }
     1955                    [moves addObjectsFromArray: [self rearrangeTorrentArray: [group torrents] to: sorted forParent: group]];
    19181956                }
    19191957                else
     
    19211959            }
    19221960        }
     1961    }
     1962    else
     1963    {
     1964        if (moves)
     1965        {
     1966            NSArray * sorted = [fDisplayedTorrents sortedArrayUsingDescriptors: descriptors];
     1967            [moves setArray: [self rearrangeTorrentArray: fDisplayedTorrents to: sorted forParent: nil]];
     1968        }
    19231969        else
    1924         {
    1925             if (changed)
    1926             {
    1927                 NSArray * sorted = [fDisplayedTorrents sortedArrayUsingDescriptors: descriptors];
    1928                 if ((*changed = ![fDisplayedTorrents isEqualToArray: sorted]))
    1929                     [fDisplayedTorrents setArray: sorted];
    1930             }
    1931             else
    1932                 [fDisplayedTorrents sortUsingDescriptors: descriptors];
    1933         }
    1934        
    1935         [descriptors release];
    1936     }
     1970            [fDisplayedTorrents sortUsingDescriptors: descriptors];
     1971    }
     1972   
     1973    [descriptors release];
     1974}
     1975
     1976- (NSArray *) rearrangeTorrentArray: (NSMutableArray *) rearrangeArray to: (NSArray *) endingArray forParent: parent
     1977{
     1978    NSAssert2([rearrangeArray count] == [endingArray count], @"Torrent arrays aren't equal size: %d and %d", [rearrangeArray count], [endingArray count]);
     1979   
     1980    NSMutableArray * moves = [NSMutableArray array];
     1981    for (NSUInteger currentIndex = 0; currentIndex < [rearrangeArray count]; ++currentIndex)
     1982    {
     1983        Torrent * torrent = [endingArray objectAtIndex: currentIndex];
     1984        const NSUInteger previousIndex = [rearrangeArray indexOfObject: torrent inRange: NSMakeRange(currentIndex, [rearrangeArray count]-currentIndex)];
     1985       
     1986        if (previousIndex != currentIndex)
     1987        {
     1988            NSAssert3(previousIndex != NSNotFound, @"Expected torrent %@ not found! %@ %@", torrent, rearrangeArray, endingArray);
     1989           
     1990            [rearrangeArray moveObjectAtIndex: previousIndex toIndex: currentIndex];
     1991           
     1992            NSMutableDictionary * move = [NSMutableDictionary dictionaryWithCapacity: parent ? 3 : 2];
     1993            [move setObject: [NSNumber numberWithUnsignedInteger: previousIndex] forKey: @"From"];
     1994            [move setObject: [NSNumber numberWithUnsignedInteger: currentIndex] forKey: @"To"];
     1995            if (parent)
     1996                [move setObject: parent forKey: @"Parent"];
     1997           
     1998            [moves addObject: move];
     1999        }
     2000    }
     2001   
     2002    NSAssert2([rearrangeArray isEqualToArray: endingArray], @"Torrent rearranging didn't work! %@ %@", rearrangeArray, endingArray);
     2003   
     2004    return moves;
    19372005}
    19382006
     
    21202188   
    21212189    //actually sort
    2122     [self sortTorrentsIgnoreSelected: NULL];
     2190    [self sortTorrentsIgnoreSelected: NULL includeQueueOrder: NO];
    21232191    [fTableView reloadData];
    21242192   
     
    28022870}
    28032871
     2872#warning elliminate when 10.7-only
    28042873- (void) toggleStatusString: (id) sender
    28052874{
     
    35353604    }
    35363605   
    3537     #warning remove when menu is removed
     3606    #warning remove when menu is removed (10.7-only)
    35383607    if (action == @selector(toggleStatusString:))
    35393608    {
Note: See TracChangeset for help on using the changeset viewer.