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

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

Moved the saving and restoring of the selection to the reload, since the reload can now be called without the user's intervetion (background importer)

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