source: trunk/SapphireApplianceController.m @ 292

Revision 292, 11.6 KB checked in by gbooker, 7 years ago (diff)

Added ability to join together multiple files into one. Great for movies which were segmented.

Line 
1//
2//  SapphireApplianceController.m
3//  Sapphire
4//
5//  Created by pnmerrill on 6/20/07.
6//  Copyright 2007 www.nanopi.net. All rights reserved.
7//
8
9#import "SapphireApplianceController.h"
10#import <BackRow/BackRow.h>
11#import "SapphireBrowser.h"
12#import "SapphireMetaData.h"
13#import "SapphirePredicates.h"
14#import "SapphireSettings.h"
15#import "SapphireTheme.h"
16#import "SapphireTVDirectory.h"
17#import "SapphireMovieDirectory.h"
18
19#import "SapphireImporterDataMenu.h"
20#import "SapphireFileDataImporter.h"
21#import "SapphireTVShowImporter.h"
22#import "SapphireMovieImporter.h"
23#import "SapphireAllImporter.h"
24#import "SapphireFrontRowCompat.h"
25
26#define BROWSER_MENU_ITEM               BRLocalizedString(@"   Browse", @"Browser Menu Item")
27#define ALL_IMPORT_MENU_ITEM    BRLocalizedString(@"   Import All Data", @"All Importer Menu Item")
28#define SETTINGS_MENU_ITEM              BRLocalizedString(@"   Settings", @"Settings Menu Item")
29#define RESET_MENU_ITEM                 BRLocalizedString(@"   Reset the thing already", @"UI Quit")
30
31@interface SapphireApplianceController (private)
32- (void)setMenuFromSettings;
33- (void)recreateMenu;
34@end
35
36@implementation SapphireApplianceController
37
38static NSArray *predicates = nil;
39
40+ (void)initialize
41{
42        predicates = [[NSArray alloc] initWithObjects:[[SapphireUnwatchedPredicate alloc] init], [[SapphireFavoritePredicate alloc] init], [[SapphireTopShowPredicate alloc] init], nil];
43        [predicates makeObjectsPerformSelector:@selector(release)];
44        if([SapphireFrontRowCompat usingFrontRow])
45        {
46                NSString *compatPath = [[[NSBundle bundleForClass:[self class]] bundlePath] stringByAppendingString:@"/Contents/Frameworks/CompatClasses.framework"];
47                NSBundle *compat = [NSBundle bundleWithPath:compatPath];
48                [compat load];
49        }
50}
51
52+ (SapphirePredicate *)predicate
53{
54        SapphireSettings *settings = [SapphireSettings sharedSettings];
55        int index = [settings indexOfLastPredicate];
56        if(index == NSNotFound)
57                return nil;
58        return [predicates objectAtIndex:index];
59}
60
61+ (SapphirePredicate *)nextPredicate
62{
63        SapphireSettings *settings = [SapphireSettings sharedSettings];
64        int index = [settings indexOfLastPredicate];
65        int newIndex;
66        switch(index)
67        {
68                case NSNotFound:
69                        newIndex = 0;
70                        if([settings displayUnwatched])
71                                break;
72                case 0:
73                        newIndex = 1;
74                        if([settings displayFavorites])
75                                break;
76                case 1:
77                        newIndex = 2;
78                        if([settings displayTopShows])
79                                break;
80                default:
81                        newIndex = NSNotFound;
82        }
83        [settings setIndexOfLastPredicate:newIndex];
84        if(newIndex == NSNotFound)
85                return nil;
86        return [predicates objectAtIndex:newIndex];
87}
88
89+ (BRTexture *)gemForPredicate:(SapphirePredicate *)predicate
90{
91        SapphireTheme *theme = [SapphireTheme sharedTheme];
92        if(predicate == nil)
93                return [theme gem:RED_GEM_KEY];
94        if([predicate isKindOfClass:[SapphireUnwatchedPredicate class]])
95                return [theme gem:BLUE_GEM_KEY];
96        if([predicate isKindOfClass:[SapphireFavoritePredicate class]])
97                return [theme gem:YELLOW_GEM_KEY];
98        if([predicate isKindOfClass:[SapphireTopShowPredicate class]])
99                return [theme gem:GREEN_GEM_KEY];
100        return nil;
101}
102                                                               
103+ (NSString *) rootMenuLabel
104{
105        return (@"net.pmerrill.Sapphire" );
106}
107
108- (SapphireImporterDataMenu *)allImporterForCollection:(SapphireMetaDataCollection *)collection
109{
110        SapphireFileDataImporter *fileImp = [[SapphireFileDataImporter alloc] init];
111        SapphireTVShowImporter *tvImp = [[SapphireTVShowImporter alloc] initWithSavedSetting:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/tvdata.plist"]];
112//      SapphireMovieImporter *movImp = [[SapphireMovieImporter alloc] initWithSavedSetting:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/movieData.plist"]];
113        SapphireAllImporter *allImp = [[SapphireAllImporter alloc] initWithImporters:[NSArray arrayWithObjects:fileImp, tvImp,nil]];
114        [fileImp release];
115        [tvImp release];
116//      [movImp release];
117        SapphireImporterDataMenu *ret = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] metaDataCollection:collection importer:allImp];
118        [allImp release];
119        return [ret autorelease];
120}
121
122- (id) initWithScene: (BRRenderScene *) scene
123{
124        self = [super initWithScene:scene];
125       
126        //Setup the theme's scene
127        SapphireTheme *theme = [SapphireTheme sharedTheme];
128        [theme setScene:[self scene]];
129       
130        metaCollection = [[SapphireMetaDataCollection alloc] initWithFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/metaData.plist"]];
131       
132        settings                                                                = [[SapphireSettings alloc] initWithScene:[self scene] settingsPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/settings.plist"] metaDataCollection:metaCollection] ;
133        [self setListTitle:                                             BRLocalizedString(@"Main Menu", @"")];
134        [settings setListTitle:                                 BRLocalizedString(@"Settings", @"Settings Menu Item")] ;
135        [settings setListIcon:                                  [theme gem:GEAR_GEM_KEY]];
136        [[self list] setDatasource:self];
137       
138        return self;
139}
140
141- (void)dealloc
142{
143        [names release];
144        [controllers release];
145        [masterNames release];
146        [masterControllers release];
147        [metaCollection release];
148        [SapphireSettings relinquishSettings];
149        [settings release];
150        [super dealloc];
151}
152
153- (void)recreateMenu
154{
155        SapphireImporterDataMenu *allImporter   = [self allImporterForCollection:metaCollection];
156        NSMutableArray *mutableMasterNames = [[NSMutableArray alloc] init];
157        NSMutableArray *mutableMasterControllers = [[NSMutableArray alloc] init];
158        BRTexture *predicateGem = [SapphireApplianceController gemForPredicate:[SapphireApplianceController predicate]];
159       
160        SapphireTVDirectory *tvDir = [[SapphireTVDirectory alloc] initWithCollection:metaCollection];
161        SapphireBrowser *tvBrowser = [[SapphireBrowser alloc] initWithScene:[self scene] metaData:tvDir];
162        [tvBrowser setListTitle:BRLocalizedString(@"TV Shows", nil)];
163        [tvBrowser setListIcon:predicateGem];
164        [mutableMasterNames addObject:BRLocalizedString(@"   TV Shows", nil)];
165        [mutableMasterControllers addObject:tvBrowser];
166        [tvBrowser release];
167       
168        SapphireMovieDirectory *movieDir = [[SapphireMovieDirectory alloc] initWithCollection:metaCollection];
169        SapphireBrowser *movieBrowser = [[SapphireBrowser alloc] initWithScene:[self scene] metaData:movieDir];
170        [movieBrowser setListTitle:BRLocalizedString(@"Movies", nil)];
171        [movieBrowser setListIcon:predicateGem];
172        [mutableMasterNames addObject:BRLocalizedString(@"   Movies", nil)];
173        [mutableMasterControllers addObject:movieBrowser];
174        [movieBrowser release];
175       
176        NSEnumerator *browserPointsEnum = [[metaCollection collectionDirectories] objectEnumerator];
177        NSString *browserPoint = nil;
178        while((browserPoint = [browserPointsEnum nextObject]) != nil)
179        {
180                if(![metaCollection skipCollection:browserPoint])
181                        [[metaCollection directoryForPath:browserPoint] loadMetaData];
182                if([metaCollection hideCollection:browserPoint])
183                        continue;
184                SapphireBrowser *browser = [[SapphireBrowser alloc] initWithScene:[self scene] metaData:[metaCollection directoryForPath:browserPoint]];
185                [browser setListTitle:[browserPoint lastPathComponent]];
186                [browser setListIcon:predicateGem];
187                [mutableMasterNames addObject:[NSString stringWithFormat:@"   %@", browserPoint]];
188                [mutableMasterControllers addObject:browser];
189                [browser release];
190        }
191        [mutableMasterNames addObjectsFromArray:[NSArray arrayWithObjects:
192                ALL_IMPORT_MENU_ITEM,
193                SETTINGS_MENU_ITEM,
194                RESET_MENU_ITEM,
195                nil]];
196        [mutableMasterControllers addObjectsFromArray:[NSArray arrayWithObjects:
197                allImporter,
198                settings,
199                nil]];
200        masterNames = [[NSArray alloc] initWithArray:mutableMasterNames];
201        masterControllers = [[NSArray alloc] initWithArray:mutableMasterControllers];
202        [mutableMasterNames release];
203        [mutableMasterControllers release];
204       
205        names = [[NSMutableArray alloc] init];
206        controllers = [[NSMutableArray alloc] init];
207        [self setMenuFromSettings];
208}
209
210- (void)setMenuFromSettings
211{
212        [names removeAllObjects];
213        [controllers removeAllObjects];
214        [names addObjectsFromArray:masterNames];
215        [controllers addObjectsFromArray:masterControllers];
216        if([settings disableUIQuit])
217                [names removeLastObject];
218}
219
220- (void) willBePushed
221{
222    // We're about to be placed on screen, but we're not yet there
223    [self recreateMenu];
224        [[self list] reload];
225    // always call super
226    [super willBePushed];
227}
228
229- (void) wasPushed
230{
231    // We've just been put on screen, the user can see this controller's content now
232   
233    // always call super
234    [super wasPushed];
235}
236
237- (void) willBePopped
238{
239    // The user pressed Menu, but we've not been removed from the screen yet
240   
241    // always call super
242    [super willBePopped];
243}
244
245- (void) wasPopped
246{
247    // The user pressed Menu, removing us from the screen
248   
249    // always call super
250    [super wasPopped];
251}
252
253- (void) willBeBuried
254{
255    // The user just chose an option, and we will be taken off the screen
256   
257    // always call super
258    [super willBeBuried];
259}
260
261- (void) wasBuriedByPushingController: (BRLayerController *) controller
262{
263    // The user chose an option and this controller os no longer on screen
264   
265    // always call super
266    [super wasBuriedByPushingController: controller];
267}
268
269- (void) willBeExhumed
270{
271    // the user pressed Menu, but we've not been revealed yet
272   
273    // always call super
274    [super willBeExhumed];
275        [self setMenuFromSettings];
276        [[self list] reload];
277        [SapphireFrontRowCompat renderScene:[self scene]];
278}
279
280- (void) wasExhumedByPoppingController: (BRLayerController *) controller
281{
282    // handle being revealed when the user presses Menu
283   
284    // always call super
285    [super wasExhumedByPoppingController: controller];
286}
287
288- (long) itemCount
289{
290    // return the number of items in your menu list here
291        return ( [ names count]);
292}
293
294- (id<BRMenuItemLayer>) itemForRow: (long) row
295{
296/*
297    // build a BRTextMenuItemLayer or a BRAdornedMenuItemLayer, etc. here
298    // return that object, it will be used to display the list item.
299*/
300        if( row > [names count] ) return ( nil ) ;
301       
302        BRAdornedMenuItemLayer * result = nil ;
303        NSString *name = [names objectAtIndex:row];
304        result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:YES];
305       
306        SapphireTheme *theme = [SapphireTheme sharedTheme];
307        if([name isEqual: ALL_IMPORT_MENU_ITEM]) [SapphireFrontRowCompat setLeftIcon:[theme gem:GEAR_GEM_KEY] forMenu:result];
308        //      else if([name isEqual: AGENT_IMPORT_MENU_ITEM]) [SapphireFrontRowCompat setLeftIcon:[theme gem:GEAR_GEM_KEY] forMenu:result];
309        else if([name isEqual: SETTINGS_MENU_ITEM]) [SapphireFrontRowCompat setLeftIcon:[theme gem:GEAR_GEM_KEY] forMenu:result];
310        else if([name isEqual: RESET_MENU_ITEM]) [SapphireFrontRowCompat setLeftIcon:[theme gem:CONE_GEM_KEY] forMenu:result];
311        else [SapphireFrontRowCompat setLeftIcon:[SapphireApplianceController gemForPredicate:[SapphireApplianceController predicate]] forMenu:result];
312       
313        // add text
314        [SapphireFrontRowCompat setTitle:name forMenu:result];
315                               
316        return ( result ) ;
317}
318
319- (NSString *) titleForRow: (long) row
320{
321
322        if ( row > [ names count] ) return ( nil );
323       
324        NSString *result = [ names objectAtIndex: row] ;
325        return ( result ) ;
326/*
327    // return the title for the list item at the given index here
328    return ( @"Sapphire" );
329*/
330}
331
332- (long) rowForTitle: (NSString *) title
333{
334    long result = -1;
335    long i, count = [self itemCount];
336    for ( i = 0; i < count; i++ )
337    {
338        if ( [title isEqualToString: [self titleForRow: i]] )
339        {
340            result = i;
341            break;
342        }
343    }
344   
345    return ( result );
346}
347
348- (void) itemSelected: (long) row
349{
350    // This is called when the user presses play/pause on a list item
351       
352        if(row == [controllers count])
353                [[NSApplication sharedApplication] terminate:self];
354        id controller = [controllers objectAtIndex:row];
355        [[self stack] pushController:controller];
356}
357
358- (id<BRMediaPreviewController>) previewControllerForItem: (long) item
359{
360    // If subclassing BRMediaMenuController, this function is called when the selection cursor
361    // passes over an item.
362    return ( nil );
363}
364
365@end
Note: See TracBrowser for help on using the repository browser.