source: branches/CoreData/SapphireFrappliance/SapphireBrowser.m @ 540

Revision 540, 21.8 KB checked in by gbooker, 6 years ago (diff)

A big massive commit of the initial stuff for core data backend (doesn't compile quite yet)

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