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

Revision 562, 22.0 KB checked in by gbooker, 6 years ago (diff)

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)

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.