source: trunk/SapphireSettings.m @ 318

Revision 318, 14.7 KB checked in by pmerrill, 6 years ago (diff)
  • Added the ability to hide Audio info in the Media Preview.
  • Added the ability to hide Video info in the Media Preview.
Line 
1//
2//  SapphireSettings.m
3//  Sapphire
4//
5//  Created by pnmerrill on 6/23/07.
6//  Copyright 2007 www.nanopi.net. All rights reserved.
7//
8
9
10#import <BackRow/BackRow.h>
11#import "SapphireApplianceController.h"
12#import "SapphireSettings.h"
13#import "SapphireTheme.h"
14#import "SapphireFileDataImporter.h"
15#import "SapphireTVShowImporter.h"
16#import "SapphireMovieImporter.h"
17#import "SapphirePosterChooser.h"
18#import "SapphireCollectionSettings.h"
19#import "SapphireFrontRowCompat.h"
20
21static SapphireSettings *sharedInstance = nil;
22
23@interface SapphireSettings(private)
24- (void)processFiles:(NSArray *)files;
25- (void)filesProcessed:(NSDictionary *)files;
26@end
27
28@implementation SapphireSettings
29
30#define HIDE_FAVORITE_KEY                       @"HideFavorites"
31#define HIDE_TOP_SHOWS_KEY                      @"HideTopShows"
32#define HIDE_UNWATCHED_KEY                      @"HideUnwatched"
33#define HIDE_SPOILERS_KEY                       @"HideSpoilers"
34#define HIDE_AUDIO_KEY                          @"HideAudio"
35#define HIDE_VIDEO_KEY                          @"HideVideo"
36#define HIDE_UI_QUIT_KEY                        @"HideUIQuit"
37#define ENABLE_FAST_SWITCHING_KEY       @"EnableFastSwitching"
38#define USE_AC3_PASSTHROUGH                     @"EnableAC3Passthrough"
39#define DISABLE_ANON_KEY                        @"DisableAnonymousReporting"
40#define LAST_PREDICATE                          @"LastPredicate"
41
42/*!
43 * @brief Get the shared settings object
44 *
45 * @return The settings object
46 */
47+ (SapphireSettings *)sharedSettings
48{
49        return sharedInstance;
50}
51
52/*!
53 * @brief Allow the shared settings object to be freed
54 */
55+ (void)relinquishSettings
56{
57        [sharedInstance release];
58        sharedInstance = nil;
59}
60
61/*!
62 * @brief Create a settings object
63 *
64 * @param scene The scene
65 * @param dictionaryPath The path of the saved setting
66 * @param meta The top level meta data
67 * @return The settings object
68 */
69- (id) initWithScene: (BRRenderScene *) scene settingsPath:(NSString *)dictionaryPath metaDataCollection:(SapphireMetaDataCollection *)collection
70{
71        if(sharedInstance != nil)
72                return sharedInstance;
73       
74        self = [super initWithScene:scene];
75       
76        /*Setup display*/
77        metaCollection = [collection retain];
78        names = [[NSArray alloc] initWithObjects:       BRLocalizedString(@"  Populate File Data", @"Populate File Data menu item"),
79                                                                                                BRLocalizedString(@"  Fetch TV Show Data", @"Fetch TV Show Data menu item"),
80                                                                                                BRLocalizedString(@"  Fetch Movie Data", @"Fetch Movie Data menu item"),
81/*                                                                                              BRLocalizedString(@"  Choose Movie Posters", @"Start Poster Chooser menu item"),*/
82                                                                                                BRLocalizedString(@"  Hide Collections", @"Hide Collections menu item"),
83                                                                                                BRLocalizedString(@"  Don't Import Collections", @"Don't Import Collections menu item"),
84                                                                                                BRLocalizedString(@"  Skip \"Favorite Shows\" filter", @"Skip Favorite shows menu item"),
85/*                                                                                              BRLocalizedString(@"  Skip \"Top Shows\" filter", @"Skip Top shows menu item"),*/
86                                                                                                BRLocalizedString(@"  Skip \"Unwatched Shows\" filter", @"Skip Unwatched shows menu item"),
87                                                                                                BRLocalizedString(@"  Hide Show Spoilers", @"Hide show summarys menu item"),
88                                                                                                BRLocalizedString(@"  Hide Audio Info", @"Hide perian audio info menu item"),
89                                                                                                BRLocalizedString(@"  Hide Video Info", @"Hide perian video info menu item"),
90                                                                                                BRLocalizedString(@"  Hide UI Quit", @"Hide the ui quitter menu item"),
91                                                                                                BRLocalizedString(@"  Fast Directory Switching", @"Don't rescan directories upon entry and used cached data"),
92                                                                                                BRLocalizedString(@"  Enable AC3 Passthrough", @"Enable AC3 Passthrough menu item"),
93                                                                                                BRLocalizedString(@"  Disable Anonymous Reporting", @"Disable the anonymous reporting for aid in future features"), nil];
94       
95        keys = [[NSArray alloc] initWithObjects:                @"",
96                                                                                                        @"",
97                                                                                                        @"",
98                                                                                                /*      @"",*/
99                                                                                                        @"",
100                                                                                                        @"",
101                                                                                                        HIDE_FAVORITE_KEY,
102                                                                                                        /*HIDE_TOP_SHOWS_KEY, */
103                                                                                                        HIDE_UNWATCHED_KEY, 
104                                                                                                        HIDE_SPOILERS_KEY,
105                                                                                                        HIDE_AUDIO_KEY,
106                                                                                                        HIDE_VIDEO_KEY,
107                                                                                                        HIDE_UI_QUIT_KEY,
108                                                                                                        ENABLE_FAST_SWITCHING_KEY,
109                                                                                                        USE_AC3_PASSTHROUGH,
110                                                                                                        DISABLE_ANON_KEY, nil];
111        SapphireTheme *theme = [SapphireTheme sharedTheme];
112        gems = [[NSArray alloc] initWithObjects:        [theme gem:IMPORT_GEM_KEY],
113                                                                                                [theme gem:TVR_GEM_KEY],
114                                                                                                [theme gem:IMDB_GEM_KEY],
115                                                                                                /*[theme gem:GREEN_GEM_KEY],*/
116                                                                                                [theme gem:FILE_GEM_KEY],
117                                                                                                [theme gem:FILE_GEM_KEY],
118                                                                                                [theme gem:YELLOW_GEM_KEY],
119                                                                                                /*[theme gem:GREEN_GEM_KEY],*/
120                                                                                                [theme gem:BLUE_GEM_KEY],
121                                                                                                [theme gem:NOTE_GEM_KEY],
122                                                                                                [theme gem:AUDIO_GEM_KEY],
123                                                                                                [theme gem:VIDEO_GEM_KEY],
124                                                                                                [theme gem:FRONTROW_GEM_KEY],
125                                                                                                [theme gem:FAST_GEM_KEY],
126                                                                                                [theme gem:AC3_GEM_KEY],
127                                                                                                [theme gem:REPORT_GEM_KEY], nil];               
128       
129        path = [dictionaryPath retain];
130        options = [[NSDictionary dictionaryWithContentsOfFile:dictionaryPath] mutableCopy];
131        /*Set deaults*/
132        defaults = [[NSDictionary alloc] initWithObjectsAndKeys:
133                [NSNumber numberWithBool:NO], HIDE_FAVORITE_KEY,
134                [NSNumber numberWithBool:YES], HIDE_TOP_SHOWS_KEY,
135                [NSNumber numberWithBool:NO], HIDE_UNWATCHED_KEY,
136                [NSNumber numberWithBool:NO], HIDE_SPOILERS_KEY,
137                [NSNumber numberWithBool:NO], HIDE_AUDIO_KEY,
138                [NSNumber numberWithBool:NO], HIDE_VIDEO_KEY,
139                [NSNumber numberWithBool:YES], HIDE_UI_QUIT_KEY,
140                [NSNumber numberWithBool:YES], ENABLE_FAST_SWITCHING_KEY,
141                [NSNumber numberWithBool:NO], USE_AC3_PASSTHROUGH,
142                [NSNumber numberWithBool:NO], DISABLE_ANON_KEY,
143                [NSNumber numberWithInt:NSNotFound], LAST_PREDICATE,
144                nil];
145        if(options == nil)
146                options = [[NSMutableDictionary alloc] init];
147
148        /*display*/
149        BRListControl *list = [self list];
150        [list setDatasource:self];
151        [SapphireFrontRowCompat addDividerAtIndex:5 toList:list];
152        /*Save our instance*/
153        sharedInstance = [self retain];
154
155        return self;
156}
157
158/*!
159 * @brief Writes settings to disk
160 */
161- (void)writeSettings
162{
163        [options writeToFile:path atomically:YES];
164}
165
166- (void)dealloc
167{
168        [names release];
169        [options release];
170        [gems release];
171        [path release];
172        [defaults release];
173        [metaCollection release];
174        [super dealloc];
175}
176
177/*!
178 * @brief Get a setting
179 *
180 * @param key The setting to retrieve
181 * @return The setting in an NSNumber
182 */
183- (NSNumber *)numberForKey:(NSString *)key
184{
185        /*Check the user's setting*/
186        NSNumber *num = [options objectForKey:key];
187        if(!num)
188                /*User hasn't set yet, use default then*/
189                num = [defaults objectForKey:key];
190        return num;
191}
192
193/*!
194 * @brief Get a setting
195 *
196 * @param key The setting to retrieve
197 * @return YES if set, NO otherwise
198 */
199- (BOOL)boolForKey:(NSString *)key
200{
201        /*Check the user's setting*/
202        NSNumber *num = [options objectForKey:key];
203        if(!num)
204                /*User hasn't set yet, use default then*/
205                num = [defaults objectForKey:key];
206        return [num boolValue];
207}
208
209/*!
210 * @brief Returns whether to display unwatched
211 *
212 * @return YES if set, NO otherwise
213 */
214- (BOOL)displayUnwatched
215{
216        return ![self boolForKey:HIDE_UNWATCHED_KEY];
217}
218
219/*!
220 * @brief Returns whether to display favorites
221 *
222 * @return YES if set, NO otherwise
223 */
224- (BOOL)displayFavorites;
225{
226        return ![self boolForKey:HIDE_FAVORITE_KEY];
227}
228
229/*!
230 * @brief Returns whether to display top shows
231 *
232 * @return YES if set, NO otherwise
233 */
234- (BOOL)displayTopShows;
235{
236        return ![self boolForKey:HIDE_TOP_SHOWS_KEY];
237}
238
239/*!
240 * @brief Returns whether to display spoilers
241 *
242 * @return YES if set, NO otherwise
243 */
244- (BOOL)displaySpoilers;
245{
246        return ![self boolForKey:HIDE_SPOILERS_KEY];
247}
248
249/*!
250 * @brief Returns whether to display audio info
251 *
252 * @return YES if set, NO otherwise
253 */
254- (BOOL)displayAudio;
255{
256        return ![self boolForKey:HIDE_AUDIO_KEY];
257}
258
259/*!
260 * @brief Returns whether to display video info
261 *
262 * @return YES if set, NO otherwise
263 */
264- (BOOL)displayVideo;
265{
266        return ![self boolForKey:HIDE_VIDEO_KEY];
267}
268
269/*!
270 * @brief Returns whether to disable UI quit
271 *
272 * @return YES if set, NO otherwise
273 */
274- (BOOL)disableUIQuit
275{
276        return [self boolForKey:HIDE_UI_QUIT_KEY];
277}
278
279/*!
280 * @brief Returns whether to disable anonymous reporting
281 *
282 * @return YES if set, NO otherwise
283 */
284- (BOOL)disableAnonymousReporting;
285{
286        return [self boolForKey:DISABLE_ANON_KEY];
287}
288
289/*!
290 * @brief Returns whether to use AC3 passthrough
291 *
292 * @return YES if set, NO otherwise
293 */
294- (BOOL)useAC3Passthrough
295{
296        return [self boolForKey:USE_AC3_PASSTHROUGH];
297}
298
299/*!
300 * @brief Returns whether to use fast directory switching
301 *
302 * @return YES if set, NO otherwise
303 */
304- (BOOL)fastSwitching
305{
306        return [self boolForKey:ENABLE_FAST_SWITCHING_KEY];
307
308}
309
310/*!
311 * @brief Returns the index of the last predicate used
312 *
313 * @return The index of the last predicate used
314 */
315- (int)indexOfLastPredicate
316{
317        return [[self numberForKey:LAST_PREDICATE] intValue];
318}
319
320/*!
321 * @brief Sets the index of the last predicate
322 *
323 * @param index The index of the last predicate used
324 */
325- (void)setIndexOfLastPredicate:(int)index
326{
327        [options setObject:[NSNumber numberWithInt:index] forKey:LAST_PREDICATE];
328        /*Save our settings*/
329        [self writeSettings];
330}
331
332- (void) willBePushed
333{
334    // We're about to be placed on screen, but we're not yet there
335   
336    // always call super
337    [super willBePushed];
338}
339
340- (void) wasPushed
341{
342    // We've just been put on screen, the user can see this controller's content now
343   
344    // always call super
345    [super wasPushed];
346}
347
348- (void) willBePopped
349{
350    // The user pressed Menu, but we've not been removed from the screen yet
351   
352    // always call super
353    [super willBePopped];
354}
355
356- (void) wasPopped
357{
358    // The user pressed Menu, removing us from the screen
359   
360    // always call super
361    [super wasPopped];
362}
363
364- (void) willBeBuried
365{
366    // The user just chose an option, and we will be taken off the screen
367   
368    // always call super
369    [super willBeBuried];
370}
371
372- (void) wasBuriedByPushingController: (BRLayerController *) controller
373{
374    // The user chose an option and this controller is no longer on screen
375   
376    // always call super
377    [super wasBuriedByPushingController: controller];
378}
379
380- (void) willBeExhumed
381{
382    // the user pressed Menu, but we've not been revealed yet
383   
384    // always call super
385    [super willBeExhumed];
386}
387
388- (void) wasExhumedByPoppingController: (BRLayerController *) controller
389{
390    // handle being revealed when the user presses Menu
391   
392    // always call super
393    [super wasExhumedByPoppingController: controller];
394}
395
396- (long) itemCount
397{
398    // return the number of items in your menu list here
399        return ( [ names count]);
400}
401
402- (id<BRMenuItemLayer>) itemForRow: (long) row
403{
404/*
405    // build a BRTextMenuItemLayer or a BRAdornedMenuItemLayer, etc. here
406    // return that object, it will be used to display the list item.
407    return ( nil );
408*/
409        if( row >= [names count] ) return ( nil ) ;
410       
411        BRAdornedMenuItemLayer * result = nil ;
412        NSString *name = [names objectAtIndex:row];
413        result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO];
414
415        if( row > 4 && [self boolForKey:[keys objectAtIndex:row]])
416        {
417                [SapphireFrontRowCompat setLeftIcon:[SapphireFrontRowCompat selectedSettingImageForScene:[self scene]] forMenu:result];
418        }
419        [SapphireFrontRowCompat setRightIcon:[gems objectAtIndex:row] forMenu:result];
420
421        // add text
422        [SapphireFrontRowCompat setTitle:name forMenu:result];
423                               
424        return ( result ) ;
425}
426
427- (NSString *) titleForRow: (long) row
428{
429
430        if ( row >= [ names count] ) return ( nil );
431       
432        NSString *result = [ names objectAtIndex: row] ;
433        return ( result ) ;
434/*
435    // return the title for the list item at the given index here
436    return ( @"Sapphire" );
437*/
438}
439
440- (long) rowForTitle: (NSString *) title
441{
442    long result = -1;
443    long i, count = [self itemCount];
444    for ( i = 0; i < count; i++ )
445    {
446        if ( [title isEqualToString: [self titleForRow: i]] )
447        {
448            result = i;
449            break;
450        }
451    }
452   
453    return ( result );
454}
455
456- (void) itemSelected: (long) row
457{
458    // This is called when the user changed a setting
459
460        /*Check for populate show data*/
461        if(row==0)
462        {
463                SapphireFileDataImporter *importer = [[SapphireFileDataImporter alloc] init];
464                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] metaDataCollection:metaCollection importer:importer];
465                [[self stack] pushController:menu];
466                [menu release];
467                [importer release];
468        }
469        /*Check for import of TV data*/
470        else if(row == 1)
471        {
472                SapphireTVShowImporter *importer = [[SapphireTVShowImporter alloc] initWithSavedSetting:[[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"tvdata.plist"]];
473                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] metaDataCollection:metaCollection importer:importer];
474                [[self stack] pushController:menu];
475                [menu release];
476                [importer release];
477        }
478        /*Start Importing Movie Data*/
479        else if(row == 2)
480        {
481                SapphireMovieImporter *importer = [[SapphireMovieImporter alloc] initWithSavedSetting:[[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"movieData.plist"]];
482                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] metaDataCollection:metaCollection importer:importer];
483                [[self stack] pushController:menu];
484                [menu release];
485                [importer release];
486        }
487        /*
488         Start Movie Poster Chooser
489        else if(row == 3)
490        {
491        //      SapphirePosterBrowse *chooser = [[SapphirePosterChooser alloc] initWithScene:[self scene] metaDataPath:[[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"movieData.plist"]];
492        //      [[self stack] pushController:chooser];
493        //      [chooser release];
494        }
495        */
496        else if(row == 3)
497        {
498                SapphireCollectionSettings *colSettings = [[SapphireCollectionSettings alloc] initWithScene:[self scene] collection:metaCollection];
499                [colSettings setGettingSelector:@selector(hideCollection:)];
500                [colSettings setSettingSelector:@selector(setHide:forCollection:)];
501                [colSettings setListTitle:BRLocalizedString(@"Hide Collections", @"Hide Collections Menu Title")] ;
502                [[self stack] pushController:colSettings];
503                [colSettings release];
504        }
505        else if(row == 4)
506        {
507                SapphireCollectionSettings *colSettings = [[SapphireCollectionSettings alloc] initWithScene:[self scene] collection:metaCollection];
508                [colSettings setGettingSelector:@selector(skipCollection:)];
509                [colSettings setSettingSelector:@selector(setSkip:forCollection:)];
510                [colSettings setListTitle:BRLocalizedString(@"Skip Collections", @"Skip Collections Menu Title")] ;
511                [[self stack] pushController:colSettings];
512                [colSettings release];
513        }
514        /*Change setting*/
515        else
516        {
517                NSString *key = [keys objectAtIndex:row];
518                BOOL setting = [self boolForKey:key];
519                [options setObject:[NSNumber numberWithBool:!setting] forKey:key];
520        }
521
522        /*Save our settings*/
523        [self writeSettings];
524
525        /*Redraw*/
526        [[self list] reload] ;
527        [SapphireFrontRowCompat renderScene:[self scene]];
528
529}
530
531- (id<BRMediaPreviewController>) previewControllerForItem: (long) item
532{
533    // If subclassing BRMediaMenuController, this function is called when the selection cursor
534    // passes over an item.
535    return ( nil );
536}
537
538@end
539
Note: See TracBrowser for help on using the repository browser.