source: branches/CoreData/SapphireFrappliance/Browser/SapphireBrowser.m @ 585

Revision 585, 22.0 KB checked in by gbooker, 7 years ago (diff)

Predicates now only opperate on file metadata. This allows for certain optimizations, and much more powerful predicates in the future.

Line 
1/*
2 * SapphireBrowser.m
3 * Sapphire
4 *
5 * Created by pnmerrill on Jun. 20, 2007.
6 * Copyright 2007 Sapphire Development Team and/or www.nanopi.net
7 * All rights reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10 * General Public License as published by the Free Software Foundation; either version 3 of the License,
11 * or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
14 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15 * Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with this program; if not,
18 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 */
20
21#import "SapphireBrowser.h"
22#import <BackRow/BackRow.h>
23#import "SapphireDirectoryMetaData.h"
24#import "SapphireFileMetaData.h"
25#import "SapphireEpisode.h"
26#import "SapphireSeason.h"
27#import "SapphireTVShow.h"
28#import "SapphireMovie.h"
29#import "SapphireMarkMenu.h"
30#import "SapphireMedia.h"
31#import "SapphireVideoPlayer.h"
32#import "SapphireMediaPreview.h"
33#import "SapphireTheme.h"
34#import "SapphireSettings.h"
35#import "NSString-Extensions.h"
36#import "SapphireAudioPlayer.h"
37#import "SapphireAudioMedia.h"
38#import "SapphireApplianceController.h"
39#import "SapphireVideoPlayerController.h"
40#import "SapphireMetaDataSupport.h"
41#import <SapphireCompatClasses/SapphireFrontRowCompat.h>
42#import <SapphireCompatClasses/SapphireDVDLoadingController.h>
43
44#import <objc/objc-class.h>
45
46#import "NSFileManager-Extensions.h"
47
48@interface SapphireBrowser (private)
49- (void)reloadDirectoryContents;
50- (void)setNewPredicate:(NSPredicate *)newPredicate;
51@end
52
53@interface BRMusicNowPlayingController (bypassAccess)
54- (void)setPlayer:(BRMusicPlayer *)player;
55- (BRMusicPlayer *)player;
56@end
57
58@implementation BRMusicNowPlayingController (bypassAccess)
59- (void)setPlayer:(BRMusicPlayer *)player
60{
61        Class myClass = [self class];
62        Ivar ret = class_getInstanceVariable(myClass, "_player");
63        BRMusicPlayer * *thePlayer = (BRMusicPlayer * *)(((char *)self)+ret->ivar_offset);     
64       
65        [*thePlayer release];
66        *thePlayer = [player retain];
67}
68
69- (BRMusicPlayer *)player
70{
71        Class myClass = [self class];
72        Ivar ret = class_getInstanceVariable(myClass, "_player");
73        return *(BRMusicPlayer * *)(((char *)self)+ret->ivar_offset);   
74}
75
76@end
77
78static BOOL is10Version = NO;
79
80@implementation SapphireBrowser
81
82- (id) initWithScene: (BRRenderScene *) scene metaData:(id <SapphireDirectory>)meta
83{
84        if([super initWithScene:scene] == nil)
85                return nil;
86               
87        _names = [NSMutableArray new];
88        items = [NSMutableDictionary new];
89        metaData = [meta retain];
90        predicate = [[SapphireApplianceController predicate] retain];
91        [metaData setFilterPredicate:predicate];
92
93        // set the datasource *after* you've setup your array
94        [[self list] setDatasource: self] ;
95               
96        return ( self );
97}
98
99- (void) dealloc
100{
101    // always remember to deallocate your resources
102        [_names release];
103        [items release];
104        if([metaData delegate] == self)
105                [metaData setDelegate:nil];
106        [metaData release];
107        [predicate release];
108    [super dealloc];
109}
110
111- (void)reloadDirectoryContents
112{
113        /*Tell the metadata to get new data*/
114        [metaData reloadDirectoryContents];
115}
116
117- (void)directoryContentsChanged
118{
119        NSString *oldName=nil;
120        int row = [self getSelection];
121       
122        if(row < [_names count])
123                oldName = [[_names objectAtIndex:row] retain];
124
125        /*Flush our cache*/
126        [_names removeAllObjects];
127        [items removeAllObjects];
128        /*Set up the dirs and files into names and the counts*/
129        NSArray *dirs = [metaData directories];
130        [_names addObjectsFromArray:dirs];
131        NSArray *files = [metaData files];
132        [_names addObjectsFromArray:files];
133        dirCount = [dirs count];
134        fileCount = [files count];
135        if(predicate != NULL)
136        {
137                /*Put in the menu for rescan if fast switching enabled*/
138                if([[SapphireSettings sharedSettings] fastSwitching])
139                        [_names addObject:BRLocalizedString(@"     < Scan for new files >", @"Conduct a scan of the directory for new files")];
140        }               
141        /*Remove the dividers*/
142        BRListControl *list = [self list];
143        if([list respondsToSelector:@selector(removeDividers)])
144                [list removeDividers];
145        else
146                [list setDividerIndex:0];
147        [list removeDividerAtIndex:0];
148        /*Do a reload*/
149        [list reload];
150        /*Add dividers*/
151        int indexOffset = 0;
152        if(dirCount && fileCount)
153        {
154                [SapphireFrontRowCompat addDividerAtIndex:dirCount toList:list];
155                if(!is10Version)
156                        indexOffset++;
157        }
158        if(predicate != NULL && [[SapphireSettings sharedSettings] fastSwitching])
159                [SapphireFrontRowCompat addDividerAtIndex:dirCount + fileCount + indexOffset toList:list];
160        if([[self stack] peekController] == self)
161                [metaData resumeImport];
162       
163        /*Attempt to preserve the user's current highlighted selection*/
164        if(oldName)
165        {
166                row = [_names indexOfObject:oldName];
167                if(row != NSNotFound)
168                        [(BRListControl *)[self list] setSelection:row];
169                else
170                        [(BRListControl *)[self list] setSelection:0];
171                [oldName release];
172        }
173        /*Draw*/
174        justReloaded = YES;
175        [self updatePreviewController];
176        [SapphireFrontRowCompat renderScene:[self scene]];
177}
178
179- (id <SapphireDirectory>)metaData
180{
181        return metaData;
182}
183
184- (void) willBePushed
185{
186    // We're about to be placed on screen, but we're not yet there
187   
188    // always call super
189    [super willBePushed];
190        /*Reload upon display*/
191        @try {
192                [metaData setDelegate:self];
193                [self setNewPredicate:[SapphireApplianceController predicate]];
194        }
195        @catch (NSException * e) {
196                [SapphireApplianceController logException:e];
197        }
198}
199
200- (void) wasPushed
201{
202    // We've just been put on screen, the user can see this controller's content now
203   
204    // always call super
205    [super wasPushed];
206        /*Get metadata when we can*/
207        [metaData resumeImport];
208}
209
210- (void) willBePopped
211{
212    // The user pressed Menu, but we've not been removed from the screen yet
213   
214    // always call super
215    [super willBePopped];
216        /*Cancel everything we were doing*/
217        [metaData cancelImport];
218        cancelScan = YES;
219        [metaData setDelegate:nil];
220}
221
222- (void) wasPopped
223{
224    // The user pressed Menu, removing us from the screen
225    // always call super
226    [super wasPopped];
227}
228
229- (void) willBeBuried
230{
231    // The user just chose an option, and we will be taken off the screen
232   
233        /*Cancel everything we were doing*/
234        [metaData cancelImport];
235        cancelScan = YES;
236        // always call super
237    [super willBeBuried];
238}
239
240- (void) wasBuriedByPushingController: (BRLayerController *) controller
241{
242    // The user chose an option and this controller is no longer on screen
243   
244    // always call super
245    [super wasBuriedByPushingController: controller];
246}
247
248- (void) willBeExhumed
249{
250    // the user pressed Menu, but we've not been revealed yet
251   
252        /*Reload our display*/
253        [self setNewPredicate:[SapphireApplianceController predicate]];
254    // always call super
255    [super willBeExhumed];
256}
257
258- (void) wasExhumedByPoppingController: (BRLayerController *) controller
259{
260    // handle being revealed when the user presses Menu
261   
262    // always call super
263    [super wasExhumedByPoppingController: controller];
264        /*Check to see if dir is empty*/
265        if(fileCount + dirCount == 0)
266                [[self stack] popController];
267        else
268                /*Resume importing now that we are up again*/
269                [metaData resumeImport];
270}
271
272- (long) itemCount
273{
274    // return the number of items in your menu list here
275        if([_names count])
276                return ( [ _names count]);
277        // Put up an empty item
278        return 1;
279}
280
281- (id<BRMenuItemLayer>) itemForRow: (long) row
282{
283        NSString * displayName=nil ;
284        /*Check for no items*/
285        int nameCount = [_names count];
286        FileClass fileCls=0;
287        if( nameCount == 0)
288        {
289                BRAdornedMenuItemLayer *result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO];
290                [SapphireFrontRowCompat setTitle:BRLocalizedString(@"< EMPTY >", @"Empty directory") forMenu:result];
291                return result;
292        }
293        if( row >= nameCount ) return ( nil ) ;
294       
295        /*Check our cache*/
296        NSString *name = [_names objectAtIndex:row];
297        id cached = [items objectForKey:name];
298        if(cached != nil)
299                return cached;
300        // Pad filename to correcrtly display gem icons
301        BRAdornedMenuItemLayer * result = nil;
302        BOOL watched = NO;
303        BOOL favorite = NO;
304        BOOL utility = NO;
305        BRRenderScene *scene = [self scene];
306        SapphireTheme *theme = [SapphireTheme sharedTheme];
307        /*Is this a dir*/
308        if(row < dirCount)
309        {
310                result = [SapphireFrontRowCompat textMenuItemForScene:scene folder:YES];
311                id <SapphireDirectory> meta = [metaData metaDataForDirectory:name];
312                watched = [meta watchedValue];
313                favorite = [meta favoriteValue];
314        }
315        /*Check for a file next*/
316        else if(row < dirCount + fileCount)
317        {
318                result = [SapphireFrontRowCompat textMenuItemForScene:scene folder:NO];
319                SapphireFileMetaData *meta = [metaData metaDataForFile:name];
320                if(meta != nil)
321                {
322                        fileCls=[meta fileClassValue];
323                        BOOL rightTextSet;
324                        if(fileCls==FILE_CLASS_TV_SHOW)
325                        {
326                                SapphireEpisode *ep = [meta tvEpisode];
327                                /*Display episode number if availble*/
328                                int eps= [ep episodeNumberValue];
329                                int ep2= [ep lastEpisodeNumberValue];
330                                displayName=[ep episodeTitle] ;
331                                if(eps>0)
332                                {
333                                        NSArray *comp = [[metaData path] pathComponents];
334                                        NSString *prefix = @"";
335                                        if([comp count] == 2 && [[comp objectAtIndex:0] isEqual:@"@TV"])
336                                                /*Eps listed outside of seasons*/
337                                                prefix = [NSString stringWithFormat:@"%02d/", [[ep season] seasonNumberValue]];
338                                        if(ep2>0 && ep2 != eps)
339                                                [SapphireFrontRowCompat setRightJustifiedText:[NSString stringWithFormat:@" %@%02d-%02d", prefix, eps, ep2] forMenu:result];
340                                        else
341                                                [SapphireFrontRowCompat setRightJustifiedText:[NSString stringWithFormat:@" %@%02d", prefix, eps] forMenu:result];
342                                        rightTextSet = YES;
343                                }
344                        }
345                        if(fileCls==FILE_CLASS_MOVIE)
346                        {
347                                SapphireMovie *movie = [meta movie];
348                                displayName=[movie title];
349                                /* Find out if we are displaying a virtual directoy we need to filter for */
350                                NSString *dirFilter=[[[metaData path] pathComponents] objectAtIndex:1];
351                                /*Add icons & stats (RIGHT)*/
352                                int top250 = [movie imdbTop250RankingValue];
353                                if([dirFilter isEqualToString:VIRTUAL_DIR_TOP250_KEY] && top250 > 0)
354                                {
355                                        NSString *movieStatsTop250 = [NSString stringWithFormat:@"#%d ", top250];
356                                        /* This list is already filtered so all displayed movies will have a top250 stat */
357                                        [SapphireFrontRowCompat setRightJustifiedText:movieStatsTop250 forMenu:result];
358                                        [SapphireFrontRowCompat setRightIcon:[theme gem:IMDB_GEM_KEY] forMenu:result];
359                                        rightTextSet = YES;
360                                }
361                                else if([movie oscarsWonValue] > 0)
362                                {
363                                        NSString *movieStatsOscar = [NSString stringWithFormat:@"%dx", [movie oscarsWonValue]];
364                                        [SapphireFrontRowCompat setRightJustifiedText:movieStatsOscar forMenu:result];
365                                        [SapphireFrontRowCompat setRightIcon:[theme gem:OSCAR_GEM_KEY] forMenu:result];
366                                        rightTextSet = YES;
367                                }
368                                else if(top250 > 0)
369                                {
370                                        NSString *movieStatsTop250 = [NSString stringWithFormat:@"#%d ", top250];
371                                        [SapphireFrontRowCompat setRightJustifiedText:movieStatsTop250 forMenu:result];
372                                        [SapphireFrontRowCompat setRightIcon:[theme gem:IMDB_GEM_KEY] forMenu:result];
373                                        rightTextSet = YES;
374                                }
375                        }
376                        watched = [meta watchedValue];
377                        favorite = [meta favoriteValue];
378                        NSString *sizeString = [meta sizeString];
379                        if(!rightTextSet && [sizeString length] > 1)
380                                /*Fallback to size*/
381                                [SapphireFrontRowCompat setRightJustifiedText:sizeString forMenu:result];
382
383                }
384        }
385        /*Utility*/
386        else
387        {
388                result = [SapphireFrontRowCompat textMenuItemForScene:scene folder:NO];
389                utility = YES;
390        }
391        /*Add icons (LEFT)*/
392        if(utility) [SapphireFrontRowCompat setLeftIcon:[theme gem:FAST_GEM_KEY] forMenu:result];
393        else if(!watched) [SapphireFrontRowCompat setLeftIcon:[theme gem:BLUE_GEM_KEY] forMenu:result];
394        else if(favorite) [SapphireFrontRowCompat setLeftIcon:[theme gem:YELLOW_GEM_KEY] forMenu:result];
395        else if(fileCls==FILE_CLASS_AUDIO)[SapphireFrontRowCompat setLeftIcon:[theme gem:GREEN_GEM_KEY] forMenu:result];
396        else [SapphireFrontRowCompat setLeftIcon:[theme gem:RED_GEM_KEY] forMenu:result];
397                       
398        // add text
399        if(displayName)name= displayName ;
400        name=[@"  " stringByAppendingString: name] ;
401        [SapphireFrontRowCompat setTitle:name forMenu:result];
402        [items setObject:result forKey:name];
403                               
404        return ( result ) ;
405}
406
407- (NSString *) titleForRow: (long) row
408{
409
410        if ( row >= [ _names count] ) return ( nil );
411       
412        NSString *result = [ _names objectAtIndex: row] ;
413       
414        return ([@"  ????? " stringByAppendingString: result] ) ;
415}
416
417- (long) rowForTitle: (NSString *) title
418{
419    long result = -1;
420    long i, count = [self itemCount];
421    for ( i = 0; i < count; i++ )
422    {
423        if ( [title isEqualToString: [self titleForRow: i]] )
424        {
425            result = i;
426            break;
427        }
428    }
429   
430    return ( result );
431}
432
433- (void)setNewPredicate:(NSPredicate *)newPredicate
434{
435        [newPredicate retain];
436        [predicate release];
437        predicate = newPredicate;
438        if([metaData filterPredicate] != predicate)
439                [metaData setFilterPredicate:predicate];
440        [self setListIcon:[SapphireApplianceController gemForPredicate:predicate]];
441        [self reloadDirectoryContents];
442}
443
444- (void) itemSelected: (long) row
445{
446    // This is called when the user presses play/pause on a list item
447       
448        if([_names count] == 0)
449        {
450                /*No items, so leave the empty dir*/
451                [[self stack] popController];
452                return;
453        }
454       
455        NSString *name = [_names objectAtIndex:row];
456       
457        /*Check for dir*/
458        if(row < dirCount)
459        {
460                /*Browse the subdir*/
461                id controller = [[SapphireBrowser alloc] initWithScene:[self scene] metaData:[metaData metaDataForDirectory:name]];
462                [controller setListTitle:[NSString stringWithFormat:@" %@",name]];
463                [controller setListIcon:[self listIcon]];
464                [[self stack] pushController:controller];
465                [controller release];
466        }
467        else if(row < dirCount + fileCount)
468        {
469                /*Play the file*/
470                SapphireFileMetaData *currentPlayFile = [[metaData metaDataForFile:name] retain];
471                if([currentPlayFile updateMetaData])
472                        [SapphireMetaDataSupport save:[currentPlayFile managedObjectContext]];
473               
474                NSString *path = [currentPlayFile path];
475               
476                /*Anonymous reporting*/
477                SapphireSettings *settings = [SapphireSettings sharedSettings];
478                if(![settings disableAnonymousReporting])
479                {
480                        NSMutableString *reqData = [NSMutableString string];
481                        NSMutableArray *reqComp = [NSMutableArray array];
482                        NSMutableURLRequest *request=nil;
483                        NSString *ext=nil;
484                        int fileClass=-1;
485                       
486                        if(path != 0)
487                        {
488                                [reqComp addObject:[NSString stringWithFormat:@"path=%@", [[path lastPathComponent]lowercaseString]]];
489                                ext=[[path pathExtension]lowercaseString] ;
490                        }
491                       
492                        if([currentPlayFile fileClassValue] == FILE_CLASS_TV_SHOW)
493                        {
494                                SapphireEpisode *episode = [currentPlayFile tvEpisode];
495                                fileClass=1;
496                                request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://appletv.nanopi.net/show.php"]];
497                                int ep = [episode episodeNumberValue];
498                                int season = [[episode season] seasonNumberValue];
499                                SapphireTVShow *show = [episode tvShow];
500                                NSString *showID = [show showPath];
501                                NSString *showName= [show name];
502                                 
503                                if(season != 0)
504                                        [reqComp addObject:[NSString stringWithFormat:@"season=%d", season]];
505                                if(ep != 0)
506                                        [reqComp addObject:[NSString stringWithFormat:@"ep=%d", ep]];
507                                if(showName != 0)
508                                        [reqComp addObject:[NSString stringWithFormat:@"showname=%@", showName]];
509                                if(showID != 0)
510                                        [reqComp addObject:[NSString stringWithFormat:@"showid=%@", showID]];
511                        }
512                        else if([currentPlayFile fileClassValue] == FILE_CLASS_MOVIE)
513                        {
514                                fileClass=2;
515                                request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://appletv.nanopi.net/movie.php"]];
516                                SapphireMovie *movie = [currentPlayFile movie];
517                                NSString *movieTitle=[movie title];
518                                int movieID=[movie imdbNumberValue];
519                                NSDate * releaseDate=[movie releaseDate];
520                                if(movieTitle != 0)
521                                        [reqComp addObject:[NSString stringWithFormat:@"title=%@", movieTitle]];
522                                if(releaseDate != 0)
523                                        [reqComp addObject:[NSString stringWithFormat:@"year=%@", [releaseDate descriptionWithCalendarFormat:@"%Y" timeZone:nil locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]]]];
524                                if(movieID != 0)
525                                        [reqComp addObject:[NSString stringWithFormat:@"movieid=%d", movieID]];
526                        }
527                        else
528                        {
529                                request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://appletv.nanopi.net/ext.php"]];
530                                if([currentPlayFile fileClassValue] == FILE_CLASS_UNKNOWN)
531                                         fileClass=0;
532                                if([currentPlayFile fileClassValue] == FILE_CLASS_AUDIO)
533                                         fileClass=3;
534                                if([currentPlayFile fileClassValue] == FILE_CLASS_OTHER)
535                                        fileClass=5;
536                                else
537                                        fileClass=99;
538                        }
539                       
540                        if(ext!=0)
541                        {
542                                [reqComp addObject:[NSString stringWithFormat:@"filetype=%d",fileClass]];
543                                [reqComp addObject:[NSString stringWithFormat:@"extension=%@", ext]];
544                                if([SapphireFrontRowCompat usingFrontRow])
545                                        [reqComp addObject:[NSString stringWithFormat:@"ckey=FRONTROW-%@-%d",ext,fileClass]];
546                                else
547                                        [reqComp addObject:[NSString stringWithFormat:@"ckey=ATV-%@-%d",ext,fileClass]];
548                        }
549                       
550                        int count = [reqComp count];
551                        int i;
552                        for(i=0; i<count-1; i++)
553                        {
554                                [reqData appendFormat:@"%@&", [reqComp objectAtIndex:i]];
555                        }
556                        if(count)
557                                [reqData appendFormat:@"%@", [reqComp objectAtIndex:i]];
558                       
559                        NSData *postData = [reqData dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
560                       
561                        [request setHTTPMethod:@"POST"];
562                        [request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
563                        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
564                        [request setHTTPBody:postData];
565                        [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
566                        /*Trigger the req*/
567                        NSURLDownload *download = [[NSURLDownload alloc] initWithRequest:request delegate:nil];
568                        [download autorelease];
569                }
570               
571                if ([currentPlayFile fileContainerTypeValue] == FILE_CONTAINER_TYPE_VIDEO_TS)
572                {
573                        BRDVDMediaAsset *asset = [[BRDVDMediaAsset alloc] initWithPath:path];
574                        SapphireDVDLoadingController *controller = [[SapphireDVDLoadingController alloc] initWithScene:[self scene] forAsset:asset];
575                        [asset release];
576                        [[self stack] pushController:controller];
577                        [controller release];
578                }
579                else if([[NSFileManager defaultManager] acceptFilePath:path] && [currentPlayFile hasVideoValue])
580                {
581                        /*Video*/
582                        /*Set the asset resume time*/
583                        NSURL *url = [NSURL fileURLWithPath:path];
584                        SapphireMedia *asset  =[[SapphireMedia alloc] initWithMediaURL:url];
585                        [asset setResumeTime:[currentPlayFile resumeTimeValue]];
586                       
587                        /*Get the player*/
588                        SapphireVideoPlayer *player = [[SapphireVideoPlayer alloc] init];
589                        NSError *error = nil;
590                        [player setMedia:asset error:&error];
591                       
592                        /*and go*/
593                        SapphireVideoPlayerController *controller = [[SapphireVideoPlayerController alloc] initWithScene:[self scene]];
594                        [controller setPlayFile:currentPlayFile];
595                        [controller setAllowsResume:YES];
596                        [controller setVideoPlayer:player];
597                        [[self stack] pushController:controller];
598
599                        [asset release];
600                        [player release];
601                        [controller release];
602                }
603                else
604                {
605                        /*Audio*/
606                        /*Set the asset*/
607                        NSURL *url = [NSURL fileURLWithPath:path];
608                        SapphireAudioMedia *asset  =[[SapphireAudioMedia alloc] initWithMediaURL:url];
609                        [asset setResumeTime:[currentPlayFile resumeTimeValue]];
610                       
611                        SapphireAudioPlayer *player = [[SapphireAudioPlayer alloc] init];
612                        NSError *error = nil;
613                        [player setMedia:asset inTracklist:[NSArray arrayWithObject:asset] error:&error];
614                       
615                        /*and go*/
616                        BRMusicNowPlayingController *controller = [BRMusicNowPlayingController alloc];
617                        if([controller respondsToSelector:@selector(initWithScene:)])
618                                controller = [controller initWithScene:[self scene]];
619                        else
620                                controller = [controller init];
621                        [controller setPlayer:player];
622                        [player setElapsedPlaybackTime:[currentPlayFile resumeTimeValue]];
623                        [player play];
624                        [[self stack] pushController:controller];
625                       
626                        [asset release];
627                        [player release];
628                        [controller release];
629                }
630        }
631        else
632        {
633                /*Do a scan*/
634                cancelScan = NO;
635                [metaData scanForNewFilesWithDelegate:self skipDirectories:[NSMutableSet set]];
636        }
637}
638
639- (void)gotSubFiles:(NSArray *)subs
640{
641        [self reloadDirectoryContents];
642}
643
644- (void)scanningDir:(NSString *)dir
645{
646}
647
648- (BOOL)getSubFilesCanceled
649{
650        return cancelScan;
651}
652
653- (id<BRMediaPreviewController>) previewControlForItem: (long) row
654{
655        return [self previewControllerForItem:row];
656}
657
658- (id<BRMediaPreviewController>) previewControllerForItem: (long) row
659{
660    // If subclassing BRMediaMenuController, this function is called when the selection cursor
661    // passes over an item.
662        if(row >= [_names count])
663                return nil;
664        /*Check to see if it is a dir or file*/
665        NSString *name = [_names objectAtIndex:row];
666        if(row < dirCount + fileCount)
667        {
668                SapphireMediaPreview *preview = [[SapphireMediaPreview alloc] initWithScene:[self scene]];
669                /*Check for dir*/
670                if(row < dirCount)
671                        [preview setMetaData:[metaData metaDataForDirectory:name] inMetaData:metaData];
672                else
673                        [preview setMetaData:[metaData metaDataForFile:name] inMetaData:metaData];
674                [preview setShowsMetadataImmediately:justReloaded];
675                justReloaded = NO;
676                /*And go*/
677                return [preview autorelease];
678        }
679    return ( nil );
680}
681
682- (BOOL)brEventAction:(BREvent *)event
683{
684        BREventPageUsageHash hashVal = [event pageUsageHash];
685        if ([(BRControllerStack *)[self stack] peekController] != self)
686                hashVal = 0;
687               
688        int row = [self getSelection];
689       
690        switch (hashVal)
691        {
692                case kBREventTapRight:
693                {
694                        id meta = nil;
695                        if(row >= [_names count])
696                                break;
697                       
698                        NSString *name = [_names objectAtIndex:row];
699                       
700                        /*Get metadata*/
701                        if(row < dirCount)
702                                meta = [metaData metaDataForDirectory:name];
703                        else if (row < dirCount + fileCount)
704                                meta = [metaData metaDataForFile:name];
705                        else
706                                break;
707                        /*Do mark menu*/
708                        id controller = [[SapphireMarkMenu alloc] initWithScene:[self scene] metaData:meta];
709                        [(SapphireMarkMenu *)controller setListTitle:name];
710                        [[self stack] pushController:controller];
711                        [controller release];
712                        return YES;
713                }
714                case kBREventTapLeft:
715                {
716                        [self setNewPredicate:[SapphireApplianceController nextPredicate]];
717                        return YES;
718                }
719        }
720        return [super brEventAction:event];
721}
722
723- (void)updateCompleteForFile:(NSString *)file
724{
725        /*Get the file*/
726        [items removeObjectForKey:file];
727        /*Relead the list and render*/
728        BRListControl *list = [self list];
729        [list reload];
730        [SapphireFrontRowCompat renderScene:[self scene]];
731}
732
733@end
Note: See TracBrowser for help on using the repository browser.