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

Revision 601, 22.6 KB checked in by gbooker, 7 years ago (diff)

Only the frontmost browser needs delegate messages; otherwise it wastes CPU

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