Changeset 5481

Show
Ignore:
Timestamp:
05/01/08 23:08:21 (2 weeks ago)
Author:
morris
Message:

Load folder contents and movie metadata asynchronously

Animate fullscreen window show/hide

Various performance improvements

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Spiral/trunk/SPApplicationController.m

    r5472 r5481  
    214214 
    215215- (void)awakeFromNib { 
     216        [[[QTMovie alloc] init] release]; 
     217 
    216218        SPSharedApplicationController = self; 
    217219         
     
    620622- (IBAction)openFile:(id)sender { 
    621623        NSOpenPanel                             *openPanel; 
    622         NSArray                                 *types; 
    623624        NSString                                *path; 
    624625        SPPlaylistFile                  *file; 
    625626         
    626     types = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:  
    627                 @"CFBundleDocumentTypes.@distinctUnionOfArrays.CFBundleTypeExtensions"]; 
    628  
    629627        openPanel = [NSOpenPanel openPanel]; 
    630628        [openPanel setCanChooseFiles:YES]; 
     
    632630        [openPanel setAllowsMultipleSelection:NO]; 
    633631         
    634         if([openPanel runModalForTypes:types] == NSOKButton) { 
     632        if([openPanel runModalForTypes:[[SPMovieController movieFileTypes] allObjects]] == NSOKButton) { 
    635633                path = [openPanel filename]; 
    636634                file = [[SPPlaylistController playlistController] recentPlaylistFileForPath:path]; 
  • Spiral/trunk/SPDrillController.h

    r5121 r5481  
    2828 
    2929#import "SPDrillView.h" 
     30#import "SPPlaylistLoader.h" 
    3031 
    31 @class SPMovieController, SPQTMovieView
     32@class SPMovieController, SPQTMovieView, SPPlaylistLoader
    3233 
    33 @interface SPDrillController : WIWindowController <SPDrillViewDelegate> { 
     34@interface SPDrillController : WIWindowController <SPDrillViewDelegate, SPPlaylistLoaderDelegate> { 
    3435        IBOutlet SPMovieController                      *_movieController; 
    3536         
     
    4142        NSWindow                                                        *_overlayWindow; 
    4243        NSWindow                                                        *_hudWindow; 
     44         
     45        SPPlaylistLoader                                        *_loader; 
    4346} 
    4447 
  • Spiral/trunk/SPDrillController.m

    r5474 r5481  
    3333#import "SPPlaylistController.h" 
    3434#import "SPPlaylistItem.h" 
     35#import "SPPlaylistLoader.h" 
     36#import "SPPreferencesController.h" 
    3537#import "SPQTMovieView.h" 
     38#import "SPSettings.h" 
    3639 
    3740@interface SPDrillController(Private) 
     
    9093        self = [super initWithWindowNibName:@"Drill"]; 
    9194         
     95        _loader = [[SPPlaylistLoader alloc] init]; 
     96        [_loader setDelegate:self]; 
     97         
     98        [[NSNotificationCenter defaultCenter] 
     99                addObserver:self 
     100                   selector:@selector(preferencesDidChange:) 
     101                           name:SPPreferencesDidChangeNotification]; 
     102 
    92103        [self window]; 
    93104         
     
    100111        [_movieView release]; 
    101112        [_drillContentView release]; 
     113        [_loader release]; 
    102114         
    103115        [super dealloc]; 
     
    116128        [window setReleasedWhenClosed:NO]; 
    117129        [window setContentView:[[self window] contentView]]; 
     130        [window setAnimates:YES]; 
    118131        [self setWindow:window]; 
    119132         
     
    133146        [_movieView retain]; 
    134147        [_drillContentView retain]; 
     148         
     149        [_drillView setSimplifyFilenames:[SPSettings boolForKey:SPSimplifyFilenames]]; 
     150        [_drillView setPlaylist:[[SPPlaylistController playlistController] playlist]]; 
    135151 
    136152        [[NSNotificationCenter defaultCenter] 
     
    161177 
    162178 
    163 - (void)drillView:(SPDrillView *)drillView willOpenContainer:(SPPlaylistContainer *)container { 
    164         [[SPPlaylistController playlistController] reloadItem:container]; 
     179- (void)preferencesDidChange:(NSNotification *)notification { 
     180        [_drillView setSimplifyFilenames:[SPSettings boolForKey:SPSimplifyFilenames]]; 
     181
     182 
     183 
     184 
     185- (void)drillView:(SPDrillView *)drillView willOpenContainer:(id)container { 
     186        if([container isKindOfClass:[SPPlaylistFolder class]]) 
     187                [_loader loadContentsOfFolder:container synchronously:YES]; 
     188        else if([container isKindOfClass:[SPPlaylistSmartGroup class]]) 
     189                [_loader loadSmartGroup:container synchronously:YES]; 
    165190} 
    166191 
     
    232257 
    233258- (void)showWindow:(id)sender { 
    234         [_drillView setPlaylist:[[SPPlaylistController playlistController] playlist]]; 
    235  
    236259        [super showWindow:sender]; 
    237260         
     
    265288                [_movieController stopFullscreen]; 
    266289        else 
    267                 [self close]; 
     290                [[self window] performClose:self]; 
    268291} 
    269292 
     
    293316        [_movieController stopFullscreen]; 
    294317 
    295         [self close]; 
     318        [[self window] performClose:self]; 
    296319} 
    297320 
  • Spiral/trunk/SPDrillView.h

    r5466 r5481  
    3737 
    3838        SPPlaylistGroup                                         *_playlist; 
     39         
     40        BOOL                                                            _simplifyFilenames; 
    3941} 
    4042 
     
    4345- (void)setPlaylist:(SPPlaylistGroup *)playlist; 
    4446- (SPPlaylistGroup *)playlist; 
     47- (void)setSimplifyFilenames:(BOOL)simplifyFilenames; 
     48- (BOOL)simplifyFilenames; 
    4549 
    4650- (void)openSelection; 
     
    5458@protocol SPDrillViewDelegate <NSObject> 
    5559 
    56 - (void)drillView:(SPDrillView *)drillView willOpenContainer:(SPPlaylistContainer *)container; 
     60- (void)drillView:(SPDrillView *)drillView willOpenContainer:(id)container; 
    5761- (void)drillView:(SPDrillView *)drillView shouldOpenFile:(SPPlaylistFile *)file; 
    5862 
  • Spiral/trunk/SPDrillView.m

    r5476 r5481  
    6969                drillItem = [[SPDrillItem alloc] init]; 
    7070                [drillItem setPlaylistItem:playlistItem]; 
    71                 [drillItem setStringValue:[SPSettings boolForKey:SPSimplifyFilenames] ? [playlistItem cleanName] : [playlistItem name]]; 
     71                [drillItem setStringValue:_simplifyFilenames ? [playlistItem cleanName] : [playlistItem name]]; 
    7272                [drillItem setImage:[playlistItem iconWithSize:NSMakeSize(128.0, 128.0)]]; 
    7373                [drillItems addObject:drillItem]; 
     
    212212 
    213213 
     214- (void)setSimplifyFilenames:(BOOL)simplifyFilenames { 
     215        _simplifyFilenames = simplifyFilenames; 
     216} 
     217 
     218 
     219 
     220- (BOOL)simplifyFilenames { 
     221        return _simplifyFilenames; 
     222} 
     223 
     224 
     225 
    214226#pragma mark - 
    215227 
  • Spiral/trunk/SPFullscreenWindow.h

    r5459 r5481  
    3030        NSWindow                                *_hudWindow; 
    3131        NSTimer                                 *_timer; 
     32        BOOL                                    _animates; 
    3233} 
    3334 
     
    3839- (void)orderFrontHUDWindow; 
    3940 
     41- (void)setAnimates:(BOOL)animates; 
     42- (BOOL)animates; 
     43 
    4044@end 
  • Spiral/trunk/SPFullscreenWindow.m

    r5475 r5481  
    147147#pragma mark - 
    148148 
     149- (void)setAnimates:(BOOL)animates { 
     150        _animates = animates; 
     151} 
     152 
     153 
     154 
     155- (BOOL)animates { 
     156        return _animates; 
     157} 
     158 
     159 
     160 
     161#pragma mark - 
     162 
    149163- (void)close { 
    150164        [_timer invalidate]; 
    151165         
    152166        [super close]; 
     167} 
     168 
     169 
     170 
     171- (void)makeKeyAndOrderFront:(id)sender { 
     172        if(_animates) { 
     173                [self setAlphaValue:0.0]; 
     174                [super makeKeyAndOrderFront:sender]; 
     175                [[self animator] setAlphaValue:1.0]; 
     176        } else { 
     177                [super makeKeyAndOrderFront:sender]; 
     178        } 
     179} 
     180 
     181 
     182 
     183- (void)performClose:(id)sender { 
     184        if(_animates) { 
     185                [[self animator] setAlphaValue:0.0]; 
     186 
     187                [self performSelector:@selector(close) afterDelay:[[NSAnimationContext currentContext] duration]]; 
     188        } else { 
     189                [self close]; 
     190        } 
    153191} 
    154192 
     
    171209                        if([event character] == NSEscapeFunctionKey) { 
    172210                                if([[self delegate] windowShouldClose:self]) 
    173                                         [self close]; 
     211                                        [self performClose:self]; 
    174212                                 
    175213                                handled = YES; 
  • Spiral/trunk/SPMovieController.h

    r5458 r5481  
    117117+ (NSArray *)scalingNames; 
    118118+ (NSArray *)aspectRatioNames; 
     119+ (NSSet *)movieFileTypes; 
    119120 
    120121- (NSWindow *)overlayWindow; 
  • Spiral/trunk/SPMovieController.m

    r5477 r5481  
    447447                NSLS(@"4:3", @"Aspect ratio"), 
    448448                NULL]; 
     449} 
     450 
     451 
     452 
     453+ (NSSet *)movieFileTypes { 
     454        static NSMutableSet             *types; 
     455         
     456        if(!types) { 
     457                types = [[NSMutableSet alloc] initWithArray:[[[NSBundle mainBundle] infoDictionary] valueForKeyPath:  
     458                        @"CFBundleDocumentTypes.@distinctUnionOfArrays.CFBundleTypeExtensions"]]; 
     459                [types removeObject:@"srt"]; 
     460                [types removeObject:@"ass"]; 
     461                [types removeObject:@"ssa"]; 
     462        } 
     463         
     464        return types; 
    449465} 
    450466 
     
    11571173        _fullscreenDelegate = delegate; 
    11581174        _fullscreenSelector = selector; 
    1159          
    1160         [self _flashOverlayString:[_overlayTextField stringValue]]; 
    11611175} 
    11621176 
     
    11691183        _fullscreenDelegate = NULL; 
    11701184        _fullscreenSelector = NULL; 
     1185         
     1186        [self _hideOverlayWindow]; 
    11711187} 
    11721188 
     
    12591275                if(forwards) { 
    12601276                        if(audioTrack == count) 
    1261                                 audioTrack = 1
     1277                                audioTrack = 0
    12621278                        else 
    12631279                                audioTrack++; 
    12641280                } else { 
    1265                         if(audioTrack <= 1
     1281                        if(audioTrack <= 0
    12661282                                audioTrack = count; 
    12671283                        else 
  • Spiral/trunk/SPPlayerController.m

    r5480 r5481  
    391391- (IBAction)fullscreen:(id)sender { 
    392392        if(!_fullscreenWindow) { 
     393                [[self window] setAlphaValue:0.0]; 
     394                 
    393395                _fullscreenWindow = [[SPFullscreenWindow alloc] initWithScreen:[[self window] screen]]; 
    394396                [_fullscreenWindow setHUDWindow:_hudWindow], 
    395397                [_fullscreenWindow setReleasedWhenClosed:YES]; 
    396398                [_fullscreenWindow setDelegate:self]; 
     399                [_fullscreenWindow setAnimates:YES]; 
    397400                 
    398401                [[self window] removeChildWindow:_overlayWindow]; 
     
    411414                [_fullscreenWindow makeKeyAndOrderFront:self]; 
    412415        } else { 
    413                 [_fullscreenWindow close]; 
     416                [_fullscreenWindow performClose:self]; 
    414417        } 
    415418} 
     
    422425        [_hudWindow close]; 
    423426         
     427        frame.origin = [[self window] convertBaseToScreen:_movieViewFrame.origin]; 
     428        frame.size = _movieViewFrame.size; 
     429 
    424430        [window removeChildWindow:_overlayWindow]; 
    425         frame.origin = [[self window] convertBaseToScreen:[_movieView frame].origin]; 
    426         frame.size = [_movieView frame].size; 
    427431        [_overlayWindow setFrame:frame display:YES]; 
    428432        [[self window] addChildWindow:_overlayWindow ordered:NSWindowAbove]; 
     
    435439        [_movieView release]; 
    436440         
     441        [[self window] setAlphaValue:1.0]; 
     442 
    437443        _fullscreenWindow = NULL; 
    438444} 
  • Spiral/trunk/SPPlaylistController.h

    r5139 r5481  
    2727 */ 
    2828 
     29#import "SPPlaylistLoader.h" 
     30 
    2931enum _SPPlaylistRepeatMode { 
    3032        SPPlaylistRepeatOff                                     = 0, 
     
    3537 
    3638 
    37 @class SPFullscreenWindow, SPPlaylistGroup, SPPlaylistFile
     39@class SPFullscreenWindow, SPPlaylistGroup, SPPlaylistFile, SPPlaylistLoader
    3840 
    39 @interface SPPlaylistController : WIWindowController
     41@interface SPPlaylistController : WIWindowController <SPPlaylistLoaderDelegate>
    4042        IBOutlet WIOutlineView                          *_outlineView; 
    4143        IBOutlet NSTableColumn                          *_filesTableColumn; 
     
    6062        SPPlaylistGroup                                         *_playlist; 
    6163        SPPlaylistGroup                                         *_recentPlaylist; 
     64         
     65        SPPlaylistLoader                                        *_loader; 
    6266 
    6367        SPPlaylistRepeatMode                            _repeatMode; 
    6468        NSMutableDictionary                                     *_eventQueueItems; 
    6569        BOOL                                                            _shuffle; 
     70        BOOL                                                            _simplifyFilenames; 
    6671} 
    6772 
     
    7984- (void)moveSelectionDown; 
    8085- (void)moveSelectionUp; 
    81 - (void)reloadItem:(id)item; 
    8286 
    8387- (IBAction)open:(id)sender; 
  • Spiral/trunk/SPPlaylistController.m

    r5472 r5481  
    3434#import "SPPlaylistController.h" 
    3535#import "SPPlaylistItem.h" 
     36#import "SPPlaylistLoader.h" 
    3637#import "SPPreferencesController.h" 
    3738#import "SPSettings.h" 
     
    3940#define SPPlaylistMaximumNumberOfRecentItems    50 
    4041#define SPPlaylistItemPboardType                                @"SPPlaylistItemPboardType" 
     42 
    4143 
    4244@interface SPPlaylistController(Private) 
     
    4648- (void)_savePlaylist; 
    4749- (void)_saveRecentPlaylist; 
     50- (void)_reloadItem:(id)item; 
    4851- (void)_restoreExpansionStateForItems:(NSArray *)array; 
    4952- (NSArray *)_filteredItems:(NSArray *)array; 
    50  
    51 - (void)_addFilesFromQuery:(NSMetadataQuery *)query; 
    5253 
    5354- (void)_setRepeatMode:(SPPlaylistRepeatMode)repeatMode; 
     
    109110 
    110111 
     112- (void)_reloadItem:(id)item { 
     113        if([item isKindOfClass:[SPPlaylistFolder class]]) { 
     114                [_loader loadContentsOfFolder:item synchronously:NO]; 
     115                [_progressIndicator startAnimation:self]; 
     116        } 
     117        else if([item isKindOfClass:[SPPlaylistSmartGroup class]]) { 
     118                [_loader loadSmartGroup:item synchronously:YES]; 
     119                [_progressIndicator startAnimation:self]; 
     120        } 
     121} 
     122 
     123 
     124 
    111125- (void)_restoreExpansionStateForItems:(NSArray *)items { 
    112126        id              item; 
    113127         
    114          
    115128        for(item in items) { 
    116129                if([item isExpanded]) { 
    117                         [self reloadItem:item]; 
     130                        [self _reloadItem:item]; 
    118131                         
    119132                        [_outlineView expandItem:item]; 
     
    155168#pragma mark - 
    156169 
    157 - (NSPredicate *)_metadataQueryPredicateForPredicate:(id)predicate { 
    158         NSMutableArray                          *compatibleSubpredicates; 
    159         NSPredicate                                     *subpredicate, *compatibleSubpredicate; 
    160         NSString                                        *keyPath; 
    161         NSCompoundPredicateType         type; 
    162         id                                                      constantValue; 
    163          
    164         if([predicate isEqual:[NSPredicate predicateWithValue:YES]] || [predicate isEqual:[NSPredicate predicateWithValue:NO]]) 
    165                 return NULL; 
    166          
    167         if([predicate isKindOfClass:[NSCompoundPredicate class]]) { 
    168                 compatibleSubpredicates = [NSMutableArray array]; 
    169                  
    170                 for(subpredicate in [predicate subpredicates]) { 
    171                         compatibleSubpredicate = [self _metadataQueryPredicateForPredicate:subpredicate]; 
    172                          
    173                         if(compatibleSubpredicate) 
    174                                 [compatibleSubpredicates addObject:compatibleSubpredicate]; 
    175                 } 
    176                  
    177                 if([compatibleSubpredicates count] == 0) 
    178                         return NULL; 
    179                  
    180                 type = [(NSCompoundPredicate *) predicate compoundPredicateType]; 
    181                  
    182                 if([compatibleSubpredicates count] == 1 && type != NSNotPredicateType) 
    183                         return [compatibleSubpredicates objectAtIndex:0]; 
    184                 else 
    185                         return [[[NSCompoundPredicate alloc] initWithType:type subpredicates:compatibleSubpredicates] autorelease]; 
    186         } 
    187         else if([predicate isKindOfClass:[NSComparisonPredicate class]]) { 
    188                 if([[predicate leftExpression] expressionType] == NSKeyPathExpressionType || 
    189                    [[predicate leftExpression] expressionType] == NSConstantValueExpressionType) { 
    190                         keyPath = [[predicate leftExpression] keyPath]; 
    191                          
    192                         if([keyPath isEqualToString:@"kMDItemLastUsedDate"] || 
    193                            [keyPath isEqualToString:@"kMDItemContentModificationDate"] || 
    194                            [keyPath isEqualToString:@"kMDItemContentCreationDate"]) { 
    195                                 constantValue = [[predicate rightExpression] constantValue]; 
    196                                  
    197                                 if([constantValue isEqual:@"today"]) 
    198                                         constantValue = [NSCalendarDate dateAtStartOfCurrentDay]; 
    199                                 else if([constantValue isEqual:@"yesterday"]) 
    200                                         constantValue = [[NSCalendarDate dateAtStartOfCurrentDay] dateByAddingDays:-1]; 
    201                                 else if([constantValue isEqual:@"this week"]) 
    202                                         constantValue = [NSCalendarDate dateAtStartOfCurrentWeek]; 
    203                                 else if([constantValue isEqual:@"this month"]) 
    204                                         constantValue = [NSCalendarDate dateAtStartOfCurrentMonth]; 
    205                                 else if([constantValue isEqual:@"this year"]) 
    206                                         constantValue = [NSCalendarDate dateAtStartOfCurrentYear]; 
    207                                  
    208                                 if(![constantValue isEqual:[[predicate rightExpression] constantValue]]) { 
    209                                         return [NSComparisonPredicate predicateWithLeftExpression:[predicate leftExpression] 
    210                                                                                                                           rightExpression:[NSExpression expressionForConstantValue:constantValue] 
    211                                                                                                                                          modifier:[predicate comparisonPredicateModifier] 
    212                                                                                                                                                  type:[predicate predicateOperatorType] 
    213                                                                                                                                           options:[predicate options]]; 
    214                                 } 
    215                         } 
    216                 } 
    217         } 
    218          
    219         return predicate; 
    220 } 
    221  
    222  
    223  
    224 - (void)_reloadQueryForGroup:(SPPlaylistSmartGroup *)smartGroup { 
    225         NSPredicate                     *predicate; 
    226         NSMetadataQuery         *query; 
    227  
    228         predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: 
    229                 [NSPredicate predicateWithFormat:@"kMDItemContentTypeTree == 'public.movie'"], 
    230                 [self _metadataQueryPredicateForPredicate:[smartGroup predicate]], 
    231                 NULL]]; 
    232          
    233         query = [[NSMetadataQuery alloc] init]; 
    234         [query setPredicate:predicate]; 
    235         [query setDelegate:smartGroup]; 
    236         [smartGroup removeAllFiles]; 
    237         [smartGroup setQuery:query]; 
    238         [query startQuery]; 
    239         [query release]; 
    240          
    241         [_outlineView reloadData]; 
    242          
    243         [_progressIndicator startAnimation:self]; 
    244 } 
    245  
    246  
    247  
    248 - (void)_addFilesFromQuery:(NSMetadataQuery *)query { 
    249         [self reloadItem:[query delegate]]; 
    250  
    251         [_outlineView reloadData]; 
    252 } 
    253  
    254  
    255  
    256 #pragma mark - 
    257  
    258170- (void)_setRepeatMode:(SPPlaylistRepeatMode)repeatMode { 
    259171        NSString                *image; 
     
    311223        _eventQueueItems = [[NSMutableDictionary alloc] init]; 
    312224         
     225        _loader = [[SPPlaylistLoader alloc] init]; 
     226        [_loader setDelegate:self]; 
     227         
     228        _simplifyFilenames = [SPSettings boolForKey:SPSimplifyFilenames]; 
     229 
    313230        [[NSNotificationCenter defaultCenter] 
    314231                addObserver:self 
     
    316233                           name:NSApplicationWillTerminateNotification]; 
    317234 
    318         [[NSNotificationCenter defaultCenter] 
    319                 addObserver:self 
    320                    selector:@selector(metadataQueryGatheringProgress:) 
    321                            name:NSMetadataQueryGatheringProgressNotification]; 
    322          
    323         [[NSNotificationCenter defaultCenter] 
    324                 addObserver:self 
    325                    selector:@selector(metadataQueryDidUpdate:) 
    326                            name:NSMetadataQueryDidUpdateNotification]; 
    327          
    328         [[NSNotificationCenter defaultCenter] 
    329                 addObserver:self 
    330                    selector:@selector(metadataQueryDidFinishGathering:) 
    331                            name:NSMetadataQueryDidFinishGatheringNotification]; 
    332  
    333235        [[[NSWorkspace sharedWorkspace] notificationCenter] 
    334236                addObserver:self 
     
    353255 
    354256        [_eventQueueItems release]; 
     257         
     258        [_loader release]; 
    355259 
    356260        [super dealloc]; 
     
    459363 
    460364 
    461 - (void)metadataQueryGatheringProgress:(NSNotification *)notification { 
    462         [self _addFilesFromQuery:[notification object]]; 
    463 
    464  
    465  
    466  
    467 - (void)metadataQueryDidUpdate:(NSNotification *)notification { 
    468         [self _addFilesFromQuery:[notification object]]; 
    469 
    470  
    471  
    472  
    473 - (void)metadataQueryDidFinishGathering:(NSNotification *)notification { 
     365- (void)eventFileWrite:(NSNotification *)notification { 
     366        [self _reloadItem:[_eventQueueItems objectForKey:[notification object]]]; 
     367         
     368        [_outlineView reloadData]; 
     369
     370 
     371 
     372 
     373- (void)playlistLoader:(SPPlaylistLoader *)loader didLoadContentsOfFolder:(SPPlaylistFolder *)folder { 
     374        [_outlineView reloadData]; 
     375         
     376        [_loader loadMetadataOfItemsInContainer:folder synchronously:NO]; 
     377
     378 
     379 
     380 
     381- (void)playlistLoader:(SPPlaylistLoader *)loader didLoadMetadataOfFile:(SPPlaylistFile *)file { 
     382        [_outlineView setNeedsDisplay:YES]; 
     383
     384 
     385 
     386 
     387- (void)playlistLoader:(SPPlaylistLoader *)loader didLoadMetadataOfItemsInContainer:(SPPlaylistContainer *)container { 
    474388        [_progressIndicator stopAnimation:self]; 
    475389} 
     
    477391 
    478392 
    479 - (void)eventFileWrite:(NSNotification *)notification { 
    480         [self reloadItem:[_eventQueueItems objectForKey:[notification object]]]; 
    481          
     393- (void)playlistLoader:(SPPlaylistLoader *)loader didLoadSmartGroup:(SPPlaylistSmartGroup *)smartGroup { 
    482394        [_outlineView reloadData]; 
     395 
     396        [_loader loadMetadataOfItemsInContainer:smartGroup synchronously:NO]; 
    483397} 
    484398 
     
    486400 
    487401- (void)preferencesDidChange:(NSNotification *)notification { 
    488         [_playlist sortItemsUsingSelector:[SPSettings boolForKey:SPSimplifyFilenames] 
     402        _simplifyFilenames = [SPSettings boolForKey:SPSimplifyFilenames]; 
     403         
     404        [_playlist sortItemsUsingSelector:_simplifyFilenames 
    489405                ? @selector(compareCleanName:) 
    490406                : @selector(compareName:)]; 
     
    650566 
    651567 
    652 - (void)reloadItem:(id)item { 
    653         if([item respondsToSelector:@selector(reload)]) 
    654                 [item reload]; 
    655          
    656         [item sortUsingSelector:[SPSettings boolForKey:SPSimplifyFilenames] 
    657                 ? @selector(compareCleanName:) 
    658                 : @selector(compareName:)]; 
    659 } 
    660  
    661  
    662  
    663568#pragma mark - 
    664569 
     
    697602                 
    698603                if([_outlineView isItemExpanded:smartGroup]) 
    699                         [self _reloadQueryForGroup:smartGroup]; 
     604                        [self _reloadItem:smartGroup]; 
    700605        } 
    701606         
     
    1046951- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { 
    1047952        if(tableColumn == _filesTableColumn) { 
    1048                 return [SPSettings boolForKey:SPSimplifyFilenames] ? [item cleanName] : [item name]; 
     953                return _simplifyFilenames ? [item cleanName] : [item name]; 
    1049954        } 
    1050955        else if(tableColumn == _viewCountTableColumn) { 
     
    1075980        item = [_outlineView itemAtRow:row]; 
    1076981         
    1077         return [SPSettings boolForKey:SPSimplifyFilenames] ? [item cleanName] : [item name]; 
     982        return _simplifyFilenames ? [item cleanName] : [item name]; 
    1078983} 
    1079984 
     
    11191024                 
    11201025                if([[NSFileManager defaultManager] directoryExistsAtPath:path]) { 
    1121                         [self reloadItem:item]; 
    1122                          
    1123                         [_outlineView reloadData]; 
     1026                        [self _reloadItem:item]; 
    11241027 
    11251028                        [[WIEventQueue sharedQueue] addPath:path forMode:WIEventFileWrite]; 
     
    11291032        } 
    11301033        else if([item isKindOfClass:[SPPlaylistSmartGroup class]]) { 
    1131                 [self _reloadQueryForGroup:item]; 
     1034                [self _reloadItem:item]; 
    11321035        } 
    11331036} 
     
    11771080 
    11781081- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)childItem proposedChildIndex:(NSInteger)index { 
    1179         NSDocumentController    *controller; 
    1180         NSPasteboard                    *pasteboard; 
    1181         NSArray                                 *types; 
    1182         NSString                                *path; 
    1183         id                                              item, parentItem; 
     1082        NSPasteboard            *pasteboard; 
     1083        NSArray                         *types; 
     1084        NSString                        *path; 
     1085        id                                      item, parentItem; 
    11841086 
    11851087        if(childItem && ![childItem isKindOfClass:[SPPlaylistGroup class]]) 
     
    12001102        } 
    12011103        else if([types containsObject:NSFilenamesPboardType]) { 
    1202                 controller = [NSDocumentController sharedDocumentController]; 
    1203                  
    12041104                for(path in [pasteboard propertyListForType:NSFilenamesPboardType]) { 
    12051105                        if(![[NSFileManager defaultManager] directoryExistsAtPath:path]) { 
    1206                                 if(![controller typeFromFileExtension:[path pathExtension]]) 
     1106                                if(![[SPMovieController movieFileTypes] containsObject:[[path pathExtension] lowercaseString]]) 
    12071107                                        return NSDragOperationNone; 
    12081108                        } 
  • Spiral/trunk/SPPlaylistItem.h

    r5139 r5481  
    7979- (void)setSize:(unsigned long long)size; 
    8080- (unsigned long long)size; 
     81- (unsigned long long)sizeOnDisk; 
    8182- (void)setViewCount:(NSUInteger)count; 
    8283- (NSUInteger)viewCount; 
     
    100101        NSMutableDictionary             *_allItems; 
    101102        NSMutableArray                  *_shuffledItems; 
     103        BOOL                                    _loading; 
    102104} 
    103105 
     106- (id)itemForPath:(NSString *)path; 
     107- (void)setItems:(NSArray *)items; 
     108- (void)addItem:(id)item; 
    104109- (NSUInteger)numberOfItems; 
    105110- (NSArray *)items; 
     
    108113- (void)sortUsingSelector:(SEL)selector; 
    109114- (void)sortItemsUsingSelector:(SEL)selector; 
     115- (void)setLoading:(BOOL)loading; 
     116- (BOOL)isLoading; 
    110117 
    111118@end 
     
    116123+ (id)groupWithName:(NSString *)name; 
    117124 
    118 - (void)addItem:(id)item; 
    119125- (void)insertItem:(id)item atIndex:(NSUInteger)index; 
    120126- (void)removeItem:(id)item; 
     
    137143- (NSString *)resolvedPath; 
    138144 
    139 - (void)reload; 
    140  
    141145@end 
    142146 
     
    153157} 
    154158 
     159+ (NSPredicate *)metadataQueryPredicateForPredicate:(id)predicate; 
     160 
    155161+ (id)smartGroupWithName:(NSString *)name; 
    156162 
     
    159165- (void)setQuery:(NSMetadataQuery *)query; 
    160166- (NSMetadataQuery *)query; 
     167- (void)setQueryIndex:(NSUInteger)queryIndex; 
     168- (NSUInteger)queryIndex; 
    161169 
    162 - (void)reload; 
    163170- (void)removeAllFiles; 
    164171 
  • Spiral/trunk/SPPlaylistItem.m

    r5478 r5481  
    368368 
    369369- (id)initWithPath:(NSString *)path { 
    370         QTMovie                 *movie; 
    371         NSTimeInterval  duration; 
    372          
    373         self = [super initWithName:[path lastPathComponent]]; 
     370        self = [super initWithName:[[NSFileManager defaultManager] displayNameAtPath:path]]; 
    374371         
    375372        [self setPath:path]; 
    376         [self setSize:[[[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES] fileSize]]; 
    377          
    378         movie = [[QTMovie alloc] initWithFile:path error:NULL]; 
    379          
    380         if(movie) { 
    381                 if(QTGetTimeInterval([movie duration], &duration)) 
    382                         [self setDuration:duration]; 
    383                  
    384                 [self setDimensions:[[movie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue]]; 
    385  
    386                 [movie release]; 
    387         } 
    388373 
    389374        _alias = [[self class] _aliasForPath:[self path]]; 
    390375         
     376        [self setSize:[self sizeOnDisk]]; 
     377 
    391378        return self; 
    392379} 
     
    441428 
    442429#pragma mark - 
    443  
    444 - (NSString *)name { 
    445         return [[NSFileManager defaultManager] displayNameAtPath:[self path]]; 
    446 } 
    447  
    448  
    449430 
    450431- (NSString *)cleanName { 
     
    519500 
    520501 
     502- (unsigned long long)sizeOnDisk { 
     503        return [[[NSFileManager defaultManager] fileAttributesAtPath:[self resolvedPath] traverseLink:YES] fileSize]; 
     504} 
     505 
     506 
     507 
    521508- (void)setViewCount:(NSUInteger)count { 
    522509        _viewCount = count; 
     
    712699#pragma mark - 
    713700 
     701- (id)itemForPath:(NSString *)path { 
     702        return [_allItems objectForKey:path]; 
     703} 
     704 
     705 
     706 
     707- (void)setItems:(NSArray *)items { 
     708        id              item; 
     709         
     710        [_allItems removeAllObjects]; 
     711         
     712        for(item in items) { 
     713                ((SPPlaylistItem *) item)->_parentItem = self; 
     714 
     715                if([item isInFileSystem]) 
     716&nb