Changeset 906

Show
Ignore:
Timestamp:
12/03/04 15:57:25 (4 years ago)
Author:
morris
Message:

load all images in a directory in a background thread, construct thumbnail images

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Footagehead/trunk/FHController.m

    r902 r906  
    1 /* $Id: FHController.m,v 1.18 2004/12/03 12:35:51 morris Exp $ */ 
     1/* $Id: FHController.m,v 1.19 2004/12/03 14:57:25 morris Exp $ */ 
    22 
    33/* 
     
    8787        // --- set up table view 
    8888        [_tableView setDoubleAction:@selector(openFile:)]; 
    89         [_tableView setForwardAction:@selector(nextImage:)]; 
    90         [_tableView setBackAction:@selector(previousImage:)]; 
     89        [_tableView setForwardAction:@selector(openFile:)]; 
     90        [_tableView setBackAction:@selector(openParent:)]; 
    9191        [_tableView setDeleteAction:@selector(openParent:)]; 
    9292         
     
    637637 
    638638- (void)loadURL:(NSURL *)url withHint:(FHHandlerHint)hint selectRow:(unsigned int)row { 
    639         BOOL            select; 
    640          
    641639        [self startSpinning]; 
    642640 
     
    651649        [self updateButtons]; 
    652650        [self reloadPathMenu]; 
    653          
    654         select = ((int) row != [_tableView selectedRow]); 
    655651        [_tableView reloadData]; 
    656          
    657         if(select) 
    658                 [_tableView selectRow:row byExtendingSelection:NO]; 
    659         else 
    660                 [self updateImage]; 
    661          
     652        [_tableView selectRow:row byExtendingSelection:NO]; 
    662653        [_tableView scrollRowToVisible:row]; 
    663654 
     655        // --- start loading images 
     656        [NSThread detachNewThreadSelector:@selector(loadFileThread:) toTarget:self withObject:[_handler images]]; 
     657         
    664658        [self stopSpinning]; 
    665659} 
     
    668662 
    669663- (void)loadFile:(FHFile *)file { 
    670         NSImage         *image; 
    671          
    672         [self startSpinning]; 
    673  
    674         image = [[FHCache cache] imageForURL:[file URL]]; 
    675          
    676         if(image) 
    677                 [self performSelector:@selector(file:didLoadImage:) withObject:file withObject:[image retain]]; 
    678         else 
    679                 [NSThread detachNewThreadSelector:@selector(loadFileThread:) toTarget:self withObject:file]; 
     664        if([file image]) { 
     665                [self performSelector:@selector(fileDidLoadImage:) withObject:file]; 
     666        } else { 
     667                [_imageView setImage:NULL]; 
     668                [self updateRightStatus]; 
     669        } 
    680670} 
    681671 
     
    684674- (void)loadFileThread:(id)arg { 
    685675        NSAutoreleasePool   *pool; 
     676        NSArray                         *images; 
    686677        NSImage                         *image; 
    687678        FHFile                          *file; 
     679        int                                     i, count; 
    688680         
    689681        pool = [[NSAutoreleasePool alloc] init]; 
    690         file = arg; 
    691          
    692         // --- load image, put in cache, notify main thread 
    693         image = [[NSImage alloc] initWithContentsOfURL:[file URL]]; 
    694         [[FHCache cache] setImage:image forURL:[file URL]]; 
    695         [self performSelectorOnMainThread:@selector(file:didLoadImage:) withObject:file withObject:image]; 
     682        images = arg; 
     683        count = [images count]; 
     684         
     685        for(i = 0; i < count; i++) { 
     686                file = [images objectAtIndex:i]; 
     687                image = [[NSImage alloc] initWithContentsOfURL:[file URL]]; 
     688                [file setImage:image]; 
     689                [image release]; 
     690                 
     691                [self performSelectorOnMainThread:@selector(fileDidLoadImage:) withObject:file]; 
     692                 
     693                if(i % 10 == 0) { 
     694                        [pool release]; 
     695                        pool = [[NSAutoreleasePool alloc] init]; 
     696                } 
     697        } 
    696698         
    697699        [pool release]; 
     
    725727 
    726728 
    727 - (void)file:(FHFile *)file didLoadImage:(NSImage *)image { 
    728         NSArray                 *images; 
    729         unsigned int    index; 
    730         BOOL                    next = NO; 
    731          
    732         if(image && [image size].width > 0.0) { 
    733                 [NSCursor setHiddenUntilMouseMoves:YES]; 
    734                  
    735                 if([file isEqual:[self selectedFile]]) { 
    736                         if([[self window] isKeyWindow]) { 
    737                                 // --- display image 
     729- (void)fileDidLoadImage:(FHFile *)file { 
     730        NSImage         *image; 
     731        NSRect          frame; 
     732        BOOL            success; 
     733         
     734        image = [file image]; 
     735        success = (image && [image size].width > 0.0); 
     736         
     737        if([file isEqual:[self selectedFile]]) { 
     738                if([[self window] isKeyWindow]) { 
     739                        if(success) { 
     740                                // --- display image in window mode 
     741                                [NSCursor setHiddenUntilMouseMoves:YES]; 
    738742                                [_imageView setImage:image]; 
    739743                                [self updateRightStatus]; 
    740                                  
    741                                 next = YES; 
     744                        } else { 
     745                                // --- display error in window mode 
     746                                [_imageView setImage:[NSImage imageNamed:@"Error"]]; 
     747                                [_rightStatusTextField setStringValue:[NSSWF:NSLS(@"error opening image", @"")]]; 
    742748                        } 
    743                         else if([_fullscreenWindow isKeyWindow]) { 
    744                                 // --- display image 
     749 
     750                } 
     751                else if([_fullscreenWindow isKeyWindow]) { 
     752                        if(success) { 
     753                                // --- display image in fullscreen 
    745754                                [_fullscreenImageView setImage:image]; 
    746755                                [self updateFullscreenStatus]; 
    747756                                [_timer setFireDate:[NSDate dateWithTimeIntervalSinceNow: 
    748757                                        [FHSettings intForKey:FHAutoSwitchTime]]]; 
    749  
    750                                 next = YES; 
     758                        } else { 
     759                                // --- display error in fullscreen 
     760                                [_fullscreenImageView setImage:[NSImage imageNamed:@"Error"]]; 
     761                                [self updateFullscreenStatus]; 
    751762                        } 
    752763                } 
    753  
    754                 // --- load next image? 
    755                 if(next) { 
    756                         images = [_handler images]; 
    757                         index = [images indexOfObject:file]; 
    758                          
    759                         if(index != NSNotFound) { 
    760                                 index++; 
    761                                  
    762                                 if(index < [images count]) 
    763                                         [self loadFile:[images objectAtIndex:index]]; 
    764                         } 
    765                 } 
    766         } else { 
    767                 // --- couldn't open image, clear image view 
    768                 if([[self window] isKeyWindow]) { 
    769                         [_imageView setImage:[NSImage imageNamed:@"Error"]]; 
    770                         [_rightStatusTextField setStringValue:[NSSWF:NSLS(@"error opening image", @"")]]; 
    771                 } 
    772                 else if([_fullscreenWindow isKeyWindow]) { 
    773                         [_fullscreenImageView setImage:[NSImage imageNamed:@"Error"]]; 
    774                 } 
    775         } 
    776  
    777         [image release]; 
    778         [self stopSpinning]; 
     764        } 
     765 
     766        // --- display thumbnail 
     767        frame = [_tableView frameOfCellAtColumn:0 row:[file index]]; 
     768        [_tableView setNeedsDisplayInRect:frame]; 
    779769} 
    780770 
     
    935925 
    936926- (void)updateImage { 
    937         FHFile          *file; 
    938          
    939         file = [self selectedFile]; 
    940          
    941         if(!file || [file isDirectory]) { 
    942                 [_imageView setImage:NULL]; 
    943                 [self updateRightStatus]; 
    944         } else { 
    945                 [self loadFile:file]; 
    946         } 
     927        [self loadFile:[self selectedFile]]; 
    947928} 
    948929 
     
    10261007                [file name], 
    10271008                0x2014, 
    1028                 [[_handler images] indexOfObject:file] + 1, 
     1009                [file index] + 1, 
    10291010                [_handler numberOfImages]]]; 
    10301011}