source: branches/CoreData/SapphireFrappliance/Settings/SapphireSettings.m @ 795

Revision 795, 19.2 KB checked in by gbooker, 6 years ago (diff)

Added autoselection ability.
Fixes #73

Line 
1/*
2 * SapphireSettings.m
3 * Sapphire
4 *
5 * Created by pnmerrill on Jun. 23, 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
22#import <BackRow/BackRow.h>
23#import "SapphireApplianceController.h"
24#import "SapphireSettings.h"
25#import "SapphireTheme.h"
26#import "SapphireMediaPreview.h"
27#import "SapphireAllFileDataImporter.h"
28#import "SapphireTVShowImporter.h"
29#import "SapphireMovieImporter.h"
30#import "SapphirePosterChooser.h"
31#import "SapphireCollectionSettings.h"
32#import "SapphireFileMetaData.h"
33#import "SapphireCollectionDirectory.h"
34#import "SapphireDirectoryMetaData.h"
35#import "SapphireMetaDataSupport.h"
36#import <SapphireCompatClasses/SapphireFrontRowCompat.h>
37#import "NSString-Extensions.h"
38#import "NSFileManager-Extensions.h"
39
40static SapphireSettings *sharedInstance = nil;
41
42@interface SapphireSettings(private)
43- (void)processFiles:(NSArray *)files;
44- (void)filesProcessed:(NSDictionary *)files;
45@end
46
47@implementation SapphireSettings
48
49#define HIDE_FAVORITE_KEY                       @"HideFavorites"
50#define HIDE_TOP_SHOWS_KEY                      @"HideTopShows"
51#define HIDE_UNWATCHED_KEY                      @"HideUnwatched"
52#define HIDE_SPOILERS_KEY                       @"HideSpoilers"
53#define HIDE_AUDIO_KEY                          @"HideAudio"
54#define HIDE_VIDEO_KEY                          @"HideVideo"
55#define HIDE_POSTER_CHOOSER_KEY         @"PosterChooserOptOut"
56#define HIDE_UI_QUIT_KEY                        @"HideUIQuit"
57#define ENABLE_FAST_SWITCHING_KEY       @"EnableFastSwitching"
58#define USE_AC3_PASSTHROUGH                     @"EnableAC3Passthrough"
59#define ENABLE_DIR_LOOKUP                       @"EnableDirLookup"
60#define ENABLE_AUTO_SELECTION           @"EnableAutoSelection"
61#define DISABLE_ANON_KEY                        @"DisableAnonymousReporting"
62#define LAST_PREDICATE                          @"LastPredicate"
63
64typedef enum {
65        COMMAND_OTHER,
66        COMMAND_DELETE_COLLECTION,
67} SettingsCommand;
68
69+ (SapphireSettings *)sharedSettings
70{
71        return sharedInstance;
72}
73
74+ (void)relinquishSettings
75{
76        [sharedInstance release];
77        sharedInstance = nil;
78}
79
80- (id) initWithScene: (BRRenderScene *) scene settingsPath:(NSString *)dictionaryPath context:(NSManagedObjectContext *)context;
81{
82        if(sharedInstance != nil)
83                return sharedInstance;
84       
85        self = [super initWithScene:scene];
86       
87        lastCommand = COMMAND_OTHER;
88        /*Setup display*/
89        moc = [context retain];
90        names = [[NSArray alloc] initWithObjects:       BRLocalizedString(@"  Populate File Data", @"Populate File Data menu item"),
91                                                                                                BRLocalizedString(@"  Fetch TV Show Data", @"Fetch TV Show Data menu item"),
92                                                                                                BRLocalizedString(@"  Fetch Movie Data", @"Fetch Movie Data menu item"),
93/*                                                                                              BRLocalizedString(@"  Choose Movie Posters", @"Start Poster Chooser menu item"),*/
94                                                                                                BRLocalizedString(@"  Hide Collections", @"Hide Collections menu item"),
95                                                                                                BRLocalizedString(@"  Don't Import Collections", @"Don't Import Collections menu item"),
96                                                                                                BRLocalizedString(@"  Delete Collections", @"Delete Collections menu item"),
97                                                                                                BRLocalizedString(@"  Skip \"Favorite Shows\" filter", @"Skip Favorite shows menu item"),
98/*                                                                                              BRLocalizedString(@"  Skip \"Top Shows\" filter", @"Skip Top shows menu item"),*/
99                                                                                                BRLocalizedString(@"  Skip \"Unwatched Shows\" filter", @"Skip Unwatched shows menu item"),
100                                                                                                BRLocalizedString(@"  Hide Show Spoilers", @"Hide show summarys menu item"),
101                                                                                                BRLocalizedString(@"  Hide Audio Info", @"Hide perian audio info menu item"),
102                                                                                                BRLocalizedString(@"  Hide Video Info", @"Hide perian video info menu item"),
103                                                                                                BRLocalizedString(@"  Hide Poster Chooser", @"Hide poster chooser menu item"),
104                                                                                                BRLocalizedString(@"  Hide UI Quit", @"Hide the ui quitter menu item"),
105                                                                                                BRLocalizedString(@"  Fast Directory Switching", @"Don't rescan directories upon entry and used cached data"),
106                                                                                                BRLocalizedString(@"  Enable AC3 Passthrough", @"Enable AC3 Passthrough menu item"),
107                                                                                                BRLocalizedString(@"  Use Directory Lookup", @"Use directory names instead of filename for movie lookup"),
108                                                                                                BRLocalizedString(@"  Auto-Select Movies/Shows", @"Hide movie/show chooser menu item"),
109                                                                                                BRLocalizedString(@"  Disable Anonymous Reporting", @"Disable the anonymous reporting for aid in future features"), nil];
110       
111        settingDescriptions=[[NSArray alloc] initWithObjects:
112                                                                                                BRLocalizedString(@"Tells Sapphire to examine all files, and remember the file size, length and other information that can be gathered from the file itself.", @"Populate File Data description"),
113                                                                                                BRLocalizedString(@"Tells Sapphire that for every TV episode, gather more information about this episode from the internet.", @"Fetch TV Show Data description"),
114                                                                                                BRLocalizedString(@"Tells Sapphire that for every Movie, gather more information from the internet.", @"Fetch Movie Data description"),
115/*                                                                                              BRLocalizedString(@"Choose Movie Posters", @"Start Poster Chooser description"),*/
116                                                                                                BRLocalizedString(@"Allows the user to specify which collections should be hidden from Sapphire's main menu.", @"Hide Collections description"),
117                                                                                                BRLocalizedString(@"Allows the user to specify which collections should be skipped when importing meta data.", @"Don't Import Collections description"),
118                                                                                                BRLocalizedString(@"Allows the user to specify which collections should be delete along with its data.  Use this for collections which will never be used again.", @"Delete Collections description"),
119                                                                                                BRLocalizedString(@"Tells Sapphire that when changing filter settings, skip over the favorite shows filter.", @"Skip Favorite shows description"),
120/*                                                                                              BRLocalizedString(@"Skip \"Top Shows\" filter", @"Skip Top shows description"),*/
121                                                                                                BRLocalizedString(@"Tells Sapphire that when changing filter settings, skip over the unwatched shows filter.", @"Skip Unwatched shows description"),
122                                                                                                BRLocalizedString(@"Tells Sapphire to disable the display of the show's synopsis.", @"Hide show summarys description"),
123                                                                                                BRLocalizedString(@"Tells Sapphire to disable the display of audio codec and sample rate information.", @"Hide perian audio info description"),
124                                                                                                BRLocalizedString(@"Tells Sapphire to disable the display of video codec, resolution, and color depth information.", @"Hide perian video info description"),
125                                                                                                BRLocalizedString(@"Tells Sapphire to automatically choose posters for movies instead of asking the user to choose one.", @"Hide poster chooser description"),
126                                                                                                BRLocalizedString(@"Tells Sapphire to hide the main menu element forcing frontrow to quit.", @"Hide the ui quitter description"),
127                                                                                                BRLocalizedString(@"Tells Sapphire that when using a filter, use the cached data to setup directories rather than scanning the directories themselves for new files.", @"Fast Directory Switching description"),
128                                                                                                BRLocalizedString(@"Tells Sapphire that you have an AC3 decoder and to enable passthrough of the full audio information to the decoder. This is how you get 5.1 output.", @"Enable AC3 Passthrough description"),
129                                                                                                BRLocalizedString(@"Tells Sapphire that you want to use directory names instead of file names for identifying movies.", @"Enable Directory lookup description"),
130                                                                                                BRLocalizedString(@"Tells Sapphire to automatically choose movie and tv show selection.", @"Enable movie/show chooser description"),
131                                                                                                BRLocalizedString(@"Tells Sapphire to not report any anonymous information on how you use Sapphire. Anonymous reporting enables us to improve the plugin for future use.", @"Disable the anonymous reporting description"), nil];
132               
133        keys = [[NSArray alloc] initWithObjects:                @"",
134                                                                                                        @"",
135                                                                                                        @"",
136                                                                                                /*      @"",*/
137                                                                                                        @"",
138                                                                                                        @"",
139                                                                                                        @"",
140                                                                                                        HIDE_FAVORITE_KEY,
141                                                                                                        /*HIDE_TOP_SHOWS_KEY, */
142                                                                                                        HIDE_UNWATCHED_KEY, 
143                                                                                                        HIDE_SPOILERS_KEY,
144                                                                                                        HIDE_AUDIO_KEY,
145                                                                                                        HIDE_VIDEO_KEY,
146                                                                                                        HIDE_POSTER_CHOOSER_KEY,
147                                                                                                        HIDE_UI_QUIT_KEY,
148                                                                                                        ENABLE_FAST_SWITCHING_KEY,
149                                                                                                        USE_AC3_PASSTHROUGH,
150                                                                                                        ENABLE_DIR_LOOKUP,
151                                                                                                        ENABLE_AUTO_SELECTION,
152                                                                                                        DISABLE_ANON_KEY, nil];
153        SapphireTheme *theme = [SapphireTheme sharedTheme];
154        gems = [[NSArray alloc] initWithObjects:        [theme gem:IMPORT_GEM_KEY],
155                                                                                                [theme gem:TVR_GEM_KEY],
156                                                                                                [theme gem:IMDB_GEM_KEY],
157                                                                                                /*[theme gem:GREEN_GEM_KEY],*/
158                                                                                                [theme gem:FILE_GEM_KEY],
159                                                                                                [theme gem:FILE_GEM_KEY],
160                                                                                                [theme gem:FILE_GEM_KEY],
161                                                                                                [theme gem:YELLOW_GEM_KEY],
162                                                                                                /*[theme gem:GREEN_GEM_KEY],*/
163                                                                                                [theme gem:BLUE_GEM_KEY],
164                                                                                                [theme gem:NOTE_GEM_KEY],
165                                                                                                [theme gem:AUDIO_GEM_KEY],
166                                                                                                [theme gem:VIDEO_GEM_KEY],
167                                                                                                [theme gem:IMPORT_GEM_KEY],
168                                                                                                [theme gem:FRONTROW_GEM_KEY],
169                                                                                                [theme gem:FAST_GEM_KEY],
170                                                                                                [theme gem:AC3_GEM_KEY],
171                                                                                                [theme gem:IMDB_GEM_KEY],
172                                                                                                [theme gem:IMPORT_GEM_KEY],
173                                                                                                [theme gem:REPORT_GEM_KEY], nil];               
174       
175        path = [dictionaryPath retain];
176        options = [[NSDictionary dictionaryWithContentsOfFile:dictionaryPath] mutableCopy];
177        /*Set deaults*/
178        defaults = [[NSDictionary alloc] initWithObjectsAndKeys:
179                [NSNumber numberWithBool:NO], HIDE_FAVORITE_KEY,
180                [NSNumber numberWithBool:YES], HIDE_TOP_SHOWS_KEY,
181                [NSNumber numberWithBool:NO], HIDE_UNWATCHED_KEY,
182                [NSNumber numberWithBool:NO], HIDE_SPOILERS_KEY,
183                [NSNumber numberWithBool:NO], HIDE_AUDIO_KEY,
184                [NSNumber numberWithBool:NO], HIDE_VIDEO_KEY,
185                [NSNumber numberWithBool:NO], HIDE_POSTER_CHOOSER_KEY,
186                [NSNumber numberWithBool:YES], HIDE_UI_QUIT_KEY,
187                [NSNumber numberWithBool:YES], ENABLE_FAST_SWITCHING_KEY,
188                [NSNumber numberWithBool:NO], USE_AC3_PASSTHROUGH,
189                [NSNumber numberWithBool:NO], ENABLE_DIR_LOOKUP,
190                [NSNumber numberWithBool:NO], ENABLE_AUTO_SELECTION,
191                [NSNumber numberWithBool:NO], DISABLE_ANON_KEY,
192                [NSNumber numberWithInt:NSNotFound], LAST_PREDICATE,
193                nil];
194        if(options == nil)
195                options = [[NSMutableDictionary alloc] init];
196
197        /*display*/
198        BRListControl *list = [self list];
199        [list setDatasource:self];
200        [SapphireFrontRowCompat addDividerAtIndex:6 toList:list];
201        /*Save our instance*/
202        sharedInstance = [self retain];
203
204        return self;
205}
206
207/*!
208 * @brief Writes settings to disk
209 */
210- (void)writeSettings
211{
212        [options writeToFile:path atomically:YES];
213}
214
215- (void)dealloc
216{
217        [names release];
218        [options release];
219        [gems release];
220        [path release];
221        [defaults release];
222        [moc release];
223        [super dealloc];
224}
225
226/*!
227 * @brief Get a setting
228 *
229 * @param key The setting to retrieve
230 * @return The setting in an NSNumber
231 */
232- (NSNumber *)numberForKey:(NSString *)key
233{
234        /*Check the user's setting*/
235        NSNumber *num = [options objectForKey:key];
236        if(!num)
237                /*User hasn't set yet, use default then*/
238                num = [defaults objectForKey:key];
239        return num;
240}
241
242/*!
243 * @brief Get a setting
244 *
245 * @param key The setting to retrieve
246 * @return YES if set, NO otherwise
247 */
248- (BOOL)boolForKey:(NSString *)key
249{
250        /*Check the user's setting*/
251        NSNumber *num = [options objectForKey:key];
252        if(!num)
253                /*User hasn't set yet, use default then*/
254                num = [defaults objectForKey:key];
255        return [num boolValue];
256}
257
258- (BOOL)displayUnwatched
259{
260        return ![self boolForKey:HIDE_UNWATCHED_KEY];
261}
262
263- (BOOL)displayFavorites
264{
265        return ![self boolForKey:HIDE_FAVORITE_KEY];
266}
267
268- (BOOL)displayTopShows
269{
270        return ![self boolForKey:HIDE_TOP_SHOWS_KEY];
271}
272
273- (BOOL)displaySpoilers
274{
275        return ![self boolForKey:HIDE_SPOILERS_KEY];
276}
277
278- (BOOL)displayAudio
279{
280        return ![self boolForKey:HIDE_AUDIO_KEY];
281}
282
283- (BOOL)displayVideo
284{
285        return ![self boolForKey:HIDE_VIDEO_KEY];
286}
287
288- (BOOL)displayPosterChooser
289{
290        return ![self boolForKey:HIDE_POSTER_CHOOSER_KEY];
291}
292
293- (BOOL)disableUIQuit
294{
295        return [self boolForKey:HIDE_UI_QUIT_KEY];
296}
297
298- (BOOL)disableAnonymousReporting;
299{
300        return [self boolForKey:DISABLE_ANON_KEY];
301}
302
303- (BOOL)useAC3Passthrough
304{
305        return [self boolForKey:USE_AC3_PASSTHROUGH];
306}
307
308- (BOOL)fastSwitching
309{
310        return [self boolForKey:ENABLE_FAST_SWITCHING_KEY];
311
312}
313
314- (BOOL)dirLookup
315{
316        return [self boolForKey:ENABLE_DIR_LOOKUP];
317}
318
319- (BOOL)autoSelection
320{
321        return [self boolForKey:ENABLE_AUTO_SELECTION];
322}
323
324- (int)indexOfLastPredicate
325{
326        return [[self numberForKey:LAST_PREDICATE] intValue];
327}
328
329- (void)setIndexOfLastPredicate:(int)index
330{
331        [options setObject:[NSNumber numberWithInt:index] forKey:LAST_PREDICATE];
332        /*Save our settings*/
333        [self writeSettings];
334}
335
336- (void)wasExhumed
337{
338    // handle being revealed when the user presses Menu
339       
340        if(lastCommand == COMMAND_DELETE_COLLECTION)
341        {
342                NSArray *collections = [SapphireCollectionDirectory allCollectionsInContext:moc];
343                NSEnumerator *colEnum = [collections objectEnumerator];
344                SapphireCollectionDirectory *collection;
345                BOOL change = NO;
346                while((collection = [colEnum nextObject]) != nil)
347                {
348                        if([collection deleteValue])
349                        {
350                                change = YES;
351                                SapphireDirectoryMetaData *dir = [collection directory];
352                                [moc deleteObject:dir];
353                        }
354                }
355                if(change)
356                        [SapphireMetaDataSupport save:moc];
357        }
358   
359    // always call super
360    [super wasExhumed];
361}
362
363- (long) itemCount
364{
365    // return the number of items in your menu list here
366        return ( [ names count]);
367}
368
369- (id<BRMenuItemLayer>) itemForRow: (long) row
370{
371/*
372    // build a BRTextMenuItemLayer or a BRAdornedMenuItemLayer, etc. here
373    // return that object, it will be used to display the list item.
374    return ( nil );
375*/
376        if( row >= [names count] ) return ( nil ) ;
377       
378        BRAdornedMenuItemLayer * result = nil ;
379        NSString *name = [names objectAtIndex:row];
380        result = [SapphireFrontRowCompat textMenuItemForScene:[self scene] folder:NO];
381
382        if( row > 4 && [self boolForKey:[keys objectAtIndex:row]])
383        {
384                [SapphireFrontRowCompat setLeftIcon:[SapphireFrontRowCompat selectedSettingImageForScene:[self scene]] forMenu:result];
385        }
386        [SapphireFrontRowCompat setRightIcon:[gems objectAtIndex:row] forMenu:result];
387
388        // add text
389        [SapphireFrontRowCompat setTitle:name forMenu:result];
390                               
391        return ( result ) ;
392}
393
394- (NSString *) titleForRow: (long) row
395{
396
397        if ( row >= [ names count] ) return ( nil );
398       
399        NSString *result = [ names objectAtIndex: row] ;
400        return ( result ) ;
401/*
402    // return the title for the list item at the given index here
403    return ( @"Sapphire" );
404*/
405}
406
407- (long) rowForTitle: (NSString *) title
408{
409    long result = -1;
410    long i, count = [self itemCount];
411    for ( i = 0; i < count; i++ )
412    {
413        if ( [title isEqualToString: [self titleForRow: i]] )
414        {
415            result = i;
416            break;
417        }
418    }
419   
420    return ( result );
421}
422
423- (void) itemSelected: (long) row
424{
425    // This is called when the user changed a setting
426
427        lastCommand = COMMAND_OTHER;
428        /*Check for populate show data*/
429        if(row==0)
430        {
431                SapphireAllFileDataImporter *importer = [[SapphireAllFileDataImporter alloc] init];
432                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] context:moc importer:importer];
433                [[self stack] pushController:menu];
434                [menu release];
435                [importer release];
436        }
437        /*Check for import of TV data*/
438        else if(row == 1)
439        {
440                SapphireTVShowImporter *importer = [[SapphireTVShowImporter alloc] initWithContext:moc];
441                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] context:moc importer:importer];
442                [[self stack] pushController:menu];
443                [menu release];
444                [importer release];
445        }
446        /*Start Importing Movie Data*/
447        else if(row == 2)
448        {
449                SapphireMovieImporter *importer = [[SapphireMovieImporter alloc] initWithContext:moc];
450                SapphireImporterDataMenu *menu = [[SapphireImporterDataMenu alloc] initWithScene:[self scene] context:moc importer:importer];
451                [[self stack] pushController:menu];
452                [menu release];
453                [importer release];
454        }
455        /*
456         Start Movie Poster Chooser
457        else if(row == 3)
458        {
459        //      SapphirePosterBrowse *chooser = [[SapphirePosterChooser alloc] initWithScene:[self scene] metaDataPath:[[path stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"movieData.plist"]];
460        //      [[self stack] pushController:chooser];
461        //      [chooser release];
462        }
463        */
464        else if(row == 3)
465        {
466                SapphireCollectionSettings *colSettings = [[SapphireCollectionSettings alloc] initWithScene:[self scene] context:moc];
467                [colSettings setGettingSelector:@selector(hiddenValue)];
468                [colSettings setSettingSelector:@selector(setHiddenValue:)];
469                [colSettings setListTitle:BRLocalizedString(@"Hide Collections", @"Hide Collections Menu Title")] ;
470                [[self stack] pushController:colSettings];
471                [colSettings release];
472        }
473        else if(row == 4)
474        {
475                SapphireCollectionSettings *colSettings = [[SapphireCollectionSettings alloc] initWithScene:[self scene] context:moc];
476                [colSettings setGettingSelector:@selector(skipValue)];
477                [colSettings setSettingSelector:@selector(setSkipValue:)];
478                [colSettings setListTitle:BRLocalizedString(@"Skip Collections", @"Skip Collections Menu Title")] ;
479                [[self stack] pushController:colSettings];
480                [colSettings release];
481        }
482        else if(row == 5)
483        {
484                SapphireCollectionSettings *colSettings = [[SapphireCollectionSettings alloc] initWithScene:[self scene] context:moc];
485                [colSettings setGettingSelector:@selector(deleteValue)];
486                [colSettings setSettingSelector:@selector(setDeleteValue:)];
487                [colSettings setListTitle:BRLocalizedString(@"Delete Collections", @"Delete Collections Menu Title")];
488                lastCommand = COMMAND_DELETE_COLLECTION;
489                [[self stack] pushController:colSettings];
490                [colSettings release];
491        }
492        /*Change setting*/
493        else
494        {
495                NSString *key = [keys objectAtIndex:row];
496                BOOL setting = [self boolForKey:key];
497                [options setObject:[NSNumber numberWithBool:!setting] forKey:key];
498        }
499
500        /*Save our settings*/
501        [self writeSettings];
502
503        /*Redraw*/
504        [[self list] reload] ;
505        [SapphireFrontRowCompat renderScene:[self scene]];
506
507}
508
509- (id<BRMediaPreviewController>) previewControlForItem: (long) row
510{
511        return [self previewControllerForItem:row];
512}
513
514- (id<BRMediaPreviewController>) previewControllerForItem: (long) item
515{
516    // If subclassing BRMediaMenuController, this function is called when the selection cursor
517    // passes over an item.
518        if(item >= [names count])
519                return nil;
520        else
521        {
522                /* Get setting name & kill the gem cushion  */
523                NSString *settingName = [[names objectAtIndex:item]substringFromIndex:2];
524                NSString *settingDescription=[settingDescriptions objectAtIndex:item];
525                /* Construct a gerneric metadata asset for display */
526                NSMutableDictionary *settingMeta=[[NSMutableDictionary alloc] init];
527                [settingMeta setObject:settingName forKey:META_TITLE_KEY];
528                [settingMeta setObject:[NSNumber numberWithInt:FILE_CLASS_UTILITY] forKey:FILE_CLASS_KEY];
529                [settingMeta setObject:settingDescription forKey:META_DESCRIPTION_KEY];
530                SapphireMediaPreview *preview = [[SapphireMediaPreview alloc] initWithScene:[self scene]];
531                [preview setUtilityData:settingMeta];
532                [settingMeta release];
533                [preview setShowsMetadataImmediately:YES];
534                /*And go*/
535                return [preview autorelease];
536        }
537    return ( nil );
538}
539
540@end
541
Note: See TracBrowser for help on using the repository browser.