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

Last change on this file since 585 was 585, checked in by gbooker, 10 years ago

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

File size: 22.0 KB
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.