Changeset 4230


Ignore:
Timestamp:
Dec 20, 2007, 1:00:03 AM (14 years ago)
Author:
livings124
Message:

streamline the filtering code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/Controller.m

    r4228 r4230  
    18191819    NSArray * selectedTorrents = [fTableView numberOfSelectedRows] > 0
    18201820                ? [fDisplayedTorrents objectsAtIndexes: [fTableView selectedRowIndexes]] : nil;
    1821 
    1822     NSMutableArray * tempTorrents = [NSMutableArray arrayWithCapacity: [fTorrents count]];
    1823    
     1821   
     1822    int downloading = 0, seeding = 0, paused = 0;
    18241823    NSString * filterType = [fDefaults stringForKey: @"Filter"];
    1825    
    1826     int downloading = 0, seeding = 0, paused = 0;
    1827     BOOL isDownload = [filterType isEqualToString: FILTER_DOWNLOAD],
    1828             isSeed = [filterType isEqualToString: FILTER_SEED],
    1829             isPause = [filterType isEqualToString: FILTER_PAUSE];
    1830     BOOL filtering = isDownload || isSeed || isPause;
     1824    BOOL filterDownload = [filterType isEqualToString: FILTER_DOWNLOAD],
     1825        filterSeed = [filterType isEqualToString: FILTER_SEED],
     1826        filterPause = [filterType isEqualToString: FILTER_PAUSE];
     1827   
     1828    int groupFilter = [fDefaults integerForKey: @"FilterGroup"];
     1829    NSString * searchString = [fSearchFilterField stringValue];
     1830   
     1831    BOOL filterStatus = filterDownload || filterSeed || filterPause,
     1832        filterGroup = groupFilter != GROUP_FILTER_ALL_TAG,
     1833        filterText = [searchString length] > 0;
     1834   
     1835    BOOL filterTracker = filterText && [[fDefaults stringForKey: @"FilterSearchType"] isEqualToString: FILTER_TYPE_TRACKER];
     1836   
     1837    NSMutableIndexSet * indexes = [NSMutableIndexSet indexSet];
    18311838   
    18321839    //get count of each type
    18331840    NSEnumerator * enumerator = [fTorrents objectEnumerator];
    18341841    Torrent * torrent;
     1842    int i = -1;
    18351843    while ((torrent = [enumerator nextObject]))
    18361844    {
     1845        i++;
     1846       
     1847        //check status
    18371848        if ([torrent isActive])
    18381849        {
     
    18401851            {
    18411852                seeding++;
    1842                 if (isSeed)
    1843                     [tempTorrents addObject: torrent];
     1853                if (filterStatus && !filterSeed)
     1854                    continue;
    18441855            }
    18451856            else
    18461857            {
    18471858                downloading++;
    1848                 if (isDownload)
    1849                     [tempTorrents addObject: torrent];
     1859                if (filterStatus && !filterDownload)
     1860                    continue;
    18501861            }
    18511862        }
     
    18531864        {
    18541865            paused++;
    1855             if (isPause)
    1856                 [tempTorrents addObject: torrent];
     1866            if (filterStatus && !filterPause)
     1867                continue;
    18571868        }
    1858     }
    1859    
    1860     if (!filtering)
    1861         [tempTorrents setArray: fTorrents];
     1869       
     1870        //checkGroup
     1871        if (filterGroup)
     1872            if ([torrent groupValue] != groupFilter)
     1873                continue;
     1874       
     1875        //check text field
     1876        if (filterText)
     1877        {
     1878            BOOL removeTextField = YES;
     1879            if (filterTracker)
     1880            {
     1881                NSEnumerator * trackerEnumerator = [[torrent allTrackers] objectEnumerator], * subTrackerEnumerator;
     1882                NSArray * subTrackers;
     1883                NSString * tracker;
     1884                while (removeTextField && (subTrackers = [trackerEnumerator nextObject]))
     1885                {
     1886                    subTrackerEnumerator = [subTrackers objectEnumerator];
     1887                    while ((tracker = [subTrackerEnumerator nextObject]))
     1888                        if ([tracker rangeOfString: searchString options: NSCaseInsensitiveSearch].location != NSNotFound)
     1889                        {
     1890                            removeTextField = NO;
     1891                            break;
     1892                        }
     1893                }
     1894               
     1895                if (removeTextField)
     1896                    continue;
     1897            }
     1898            else
     1899            {
     1900                if ([[torrent name] rangeOfString: searchString options: NSCaseInsensitiveSearch].location == NSNotFound)
     1901                    continue;
     1902            }
     1903        }
     1904       
     1905        [indexes addIndex: i];
     1906    }
     1907   
     1908    [fDisplayedTorrents setArray: [fTorrents objectsAtIndexes: indexes]];
    18621909   
    18631910    //set button tooltips
     
    18671914    [fPauseFilterButton setCount: paused];
    18681915   
    1869     //remove for groups
    1870     int groupFilter = [fDefaults integerForKey: @"FilterGroup"];
    1871     if (groupFilter != GROUP_FILTER_ALL_TAG)
    1872     {
    1873         filtering = YES;
    1874        
    1875         int i;
    1876         for (i = [tempTorrents count]-1; i >= 0; i--)
    1877             if ([[tempTorrents objectAtIndex: i] groupValue] != groupFilter)
    1878                 [tempTorrents removeObjectAtIndex: i];
    1879     }
    1880    
    1881     //remove from text field
    1882     NSString * searchString = [fSearchFilterField stringValue];
    1883     if ([tempTorrents count] > 0 && [searchString length] > 0)
    1884     {
    1885         filtering = YES;
    1886        
    1887         Torrent * torrent;
    1888         BOOL filterTracker = [[fDefaults stringForKey: @"FilterSearchType"] isEqualToString: FILTER_TYPE_TRACKER], remove;
    1889        
    1890         int i;
    1891         for (i = [tempTorrents count]-1; i >= 0; i--)
    1892         {
    1893             torrent = [tempTorrents objectAtIndex: i];
    1894             remove = YES;
    1895            
    1896             if (filterTracker)
    1897             {
    1898                 NSEnumerator * trackerEnumerator = [[torrent allTrackers] objectEnumerator], * subTrackerEnumerator;
    1899                 NSArray * subTrackers;
    1900                 NSString * tracker;
    1901                 while (remove && (subTrackers = [trackerEnumerator nextObject]))
    1902                 {
    1903                     subTrackerEnumerator = [subTrackers objectEnumerator];
    1904                     while ((tracker = [subTrackerEnumerator nextObject]))
    1905                     {
    1906                         if ([tracker rangeOfString: searchString options: NSCaseInsensitiveSearch].location != NSNotFound)
    1907                         {
    1908                             remove = NO;
    1909                             break;
    1910                         }
    1911                     }
    1912                 }
    1913             }
    1914             else
    1915                 remove = [[torrent name] rangeOfString: searchString options: NSCaseInsensitiveSearch].location == NSNotFound;
    1916            
    1917             if (remove)
    1918                 [tempTorrents removeObjectAtIndex: i];
    1919         }
    1920     }
    1921    
    1922     [fDisplayedTorrents setArray: tempTorrents];
    1923    
    19241916    [self sortTorrentsIgnoreSelected];
    19251917   
     
    19291921        Torrent * torrent;
    19301922        NSEnumerator * enumerator = [selectedTorrents objectEnumerator];
    1931         NSMutableIndexSet * indexSet = [[NSMutableIndexSet alloc] init];
     1923        NSMutableIndexSet * selectedIndexes = [NSMutableIndexSet indexSet];
    19321924        unsigned index;
    19331925        while ((torrent = [enumerator nextObject]))
    19341926            if ((index = [fDisplayedTorrents indexOfObject: torrent]) != NSNotFound)
    1935                 [indexSet addIndex: index];
    1936        
    1937         [fTableView selectRowIndexes: indexSet byExtendingSelection: NO];
    1938         [indexSet release];
     1927                [selectedIndexes addIndex: index];
     1928       
     1929        [fTableView selectRowIndexes: selectedIndexes byExtendingSelection: NO];
    19391930    }
    19401931   
     
    19471938        totalTorrentsString = NSLocalizedString(@"1 transfer", "Status bar transfer count");
    19481939   
    1949     if (filtering)
     1940    if (filterStatus || filterGroup || filterText)
    19501941        totalTorrentsString = [NSString stringWithFormat: @"%d of %@", [fDisplayedTorrents count], totalTorrentsString];
    19511942   
Note: See TracChangeset for help on using the changeset viewer.