#import "ConfigurationController.h" #import "PcsxrController.h" #import "PluginList.h" #import "PcsxrPlugin.h" #import "PcsxrMemCardController.h" #import "PcsxrMemCardHandler.h" #include "psxcommon.h" #include "plugins.h" NSString *const memChangeNotifier = @"PcsxrMemoryCardDidChangeNotifier"; NSString *const memCardChangeNumberKey = @"PcsxrMemoryCardThatChangedKey"; @interface ConfigurationController () @property (strong) NSMutableDictionary *checkBoxDefaults; - (NSString *)keyForSender:(id)sender; @end @implementation ConfigurationController @synthesize autoVTypeCell; @synthesize bwMdecCell; @synthesize checkBoxDefaults = _checkBoxDefaults; @synthesize consoleOutputCell; @synthesize enableNetPlayCell; @synthesize noCDAudioCell; @synthesize noFastBootCell; @synthesize noXaAudioCell; @synthesize rCountFixCell; @synthesize sioIrqAlwaysCell; @synthesize spuIrqAlwaysCell; @synthesize usesDynarecCell; @synthesize usesHleCell; @synthesize vSyncWAFixCell; @synthesize vTypePALCell; @synthesize widescreen; @synthesize cdromPlugin; @synthesize graphicsPlugin; @synthesize padPlugin; @synthesize soundPlugin; @synthesize netPlugin; @synthesize sio1Plugin; @synthesize memCardEdit; @synthesize hkController; @synthesize hkTab; @synthesize cpuOverclocking; @synthesize wipeoutMemHack; @synthesize cpuOverclockingValue; + (void)setMemoryCard:(NSInteger)theCard toURL:(NSURL *)theURL; { if (theCard == 1) { [[NSUserDefaults standardUserDefaults] setURL:theURL forKey:@"Mcd1"]; strlcpy(Config.Mcd1, [[theURL path] fileSystemRepresentation], MAXPATHLEN ); } else { [[NSUserDefaults standardUserDefaults] setURL:theURL forKey:@"Mcd2"]; strlcpy(Config.Mcd2, [[theURL path] fileSystemRepresentation], MAXPATHLEN ); } [[NSNotificationCenter defaultCenter] postNotificationName:memChangeNotifier object:nil userInfo: @{memCardChangeNumberKey: @(theCard)}]; } + (void)setMemoryCard:(NSInteger)theCard toPath:(NSString *)theFile { [self setMemoryCard:theCard toURL:[NSURL fileURLWithPath:theFile isDirectory:NO]]; } - (IBAction)setCheckbox:(id)sender { if ([sender isKindOfClass:[NSMatrix class]]) { sender = [sender selectedCell]; } NSString *key = [self keyForSender:sender]; if (key) { [[NSUserDefaults standardUserDefaults] setBool:[sender intValue] ? YES : NO forKey:key]; [PcsxrController setConfigFromDefaults]; } } - (IBAction)setCheckboxInverse:(id)sender { if ([sender isKindOfClass:[NSMatrix class]]) { sender = [sender selectedCell]; } NSString *key = [self keyForSender:sender]; if (key) { [[NSUserDefaults standardUserDefaults] setBool:[sender intValue] ? NO : YES forKey:key]; [PcsxrController setConfigFromDefaults]; } } - (IBAction)mcdChangeClicked:(id)sender { NSInteger tag = [sender tag]; char *mcd; NSOpenPanel *openDlg = [NSOpenPanel openPanel]; NSString *path; if (tag == 1) { mcd = Config.Mcd1; } else { mcd = Config.Mcd2; } path = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:mcd length:strlen(mcd)]; [openDlg setAllowedFileTypes:[PcsxrMemCardHandler supportedUTIs]]; [openDlg setDirectoryURL:[NSURL fileURLWithPath:[path stringByDeletingLastPathComponent] isDirectory:YES]]; [openDlg setNameFieldStringValue:[path lastPathComponent]]; [openDlg beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSURL *mcdURL = [openDlg URLs][0]; [ConfigurationController setMemoryCard:tag toURL:mcdURL]; } }]; } - (IBAction)mcdNewClicked:(id)sender { NSInteger tag = [sender tag]; char *mcd; NSSavePanel *openDlg = [NSSavePanel savePanel]; NSString *path; if (tag == 1) { mcd = Config.Mcd1; } else { mcd = Config.Mcd2; } path = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:mcd length:strlen(mcd)]; [openDlg setDirectoryURL:[NSURL fileURLWithPath:[path stringByDeletingLastPathComponent] isDirectory:YES]]; [openDlg setNameFieldStringValue:NSLocalizedString(@"New Memory Card.mcd", nil)]; [openDlg setAllowedFileTypes:[PcsxrMemCardHandler supportedUTIs]]; [openDlg beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSURL *mcdURL = [openDlg URL]; const char *fileSysRep; if ([mcdURL respondsToSelector:@selector(fileSystemRepresentation)]) { fileSysRep = [mcdURL fileSystemRepresentation]; } else { fileSysRep = [[mcdURL path] fileSystemRepresentation]; } //Workaround/kludge to make sure we create a memory card before posting a notification strlcpy(mcd, fileSysRep, MAXPATHLEN); CreateMcd(mcd); [ConfigurationController setMemoryCard:tag toURL:mcdURL]; } }]; } - (IBAction)setVideoType:(id)sender { NSInteger tag = [[sender selectedItem] tag]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (3 == tag) { [defaults setBool:YES forKey:@"AutoDetectVideoType"]; } else if (1 == tag || 2 == tag) { [defaults setBool:NO forKey:@"AutoDetectVideoType"]; [defaults setBool:tag==2 forKey:@"VideoTypePAL"]; } else { return; } [PcsxrController setConfigFromDefaults]; if ([sender pullsDown]) { NSArray *items = [sender itemArray]; for (id object in items) { [object setState:NSOffState]; } [[sender selectedItem] setState:NSOnState]; } } - (IBAction)setOverclockValue:(NSComboBox *)sender { float value = sender.floatValue; if (value < 0.5) value = 0.5; if (value > 5.0) value = 5.0; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setFloat:value forKey:@"CpuOverclockingValue"]; [PcsxrController setConfigFromDefaults]; [self setOverclockValueText]; } - (void)setOverclockValueText { NSString *value = [NSString stringWithFormat:@"%.2f", Config.PsxClock]; [cpuOverclockingValue setStringValue:value]; [cpuOverclockingValue selectItemWithObjectValue:value]; } - (void)awakeFromNib { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [[self window] center]; // setup checkboxes self.checkBoxDefaults = [[NSMutableDictionary alloc] init]; // check that the outlets are active before adding them if (noXaAudioCell) _checkBoxDefaults[@"NoXaAudio"] = noXaAudioCell; if (enableNetPlayCell) _checkBoxDefaults[@"NetPlay"] = enableNetPlayCell; if (sioIrqAlwaysCell) _checkBoxDefaults[@"SioIrqAlways"] = sioIrqAlwaysCell; if (bwMdecCell) _checkBoxDefaults[@"BlackAndWhiteMDECVideo"] = bwMdecCell; if (autoVTypeCell) _checkBoxDefaults[@"AutoDetectVideoType"] = autoVTypeCell; if (vTypePALCell) _checkBoxDefaults[@"VideoTypePAL"] = vTypePALCell; if (noCDAudioCell) _checkBoxDefaults[@"NoCDAudio"] = noCDAudioCell; if (usesHleCell) _checkBoxDefaults[@"UseHLE"] = usesHleCell; if (usesDynarecCell) _checkBoxDefaults[@"NoDynarec"] = usesDynarecCell; if (consoleOutputCell) _checkBoxDefaults[@"ConsoleOutput"] = consoleOutputCell; if (spuIrqAlwaysCell) _checkBoxDefaults[@"SpuIrqAlways"] = spuIrqAlwaysCell; if (rCountFixCell) _checkBoxDefaults[@"RootCounterFix"] = rCountFixCell; if (vSyncWAFixCell) _checkBoxDefaults[@"VideoSyncWAFix"] = vSyncWAFixCell; if (noFastBootCell) _checkBoxDefaults[@"NoFastBoot"] = noFastBootCell; if (widescreen) _checkBoxDefaults[@"Widescreen"] = widescreen; if (cpuOverclocking) _checkBoxDefaults[@"CpuOverclocking"] = cpuOverclocking; if (wipeoutMemHack) _checkBoxDefaults[@"WipeoutMemHack"] = wipeoutMemHack; // make the visuals match the defaults for (NSString* key in _checkBoxDefaults) { if ([defaults integerForKey:key]) { [_checkBoxDefaults[key] setNextState]; } } // special cases if (![PcsxrController biosAvailable]) { // no bios means always use HLE [usesHleCell setState:NSOnState]; [usesHleCell setEnabled:NO]; } [self setOverclockValueText]; // setup labels NSInteger tag = [defaults integerForKey:@"AutoDetectVideoType"]; if (tag) tag = 3; else { tag = [defaults integerForKey:@"VideoTypePAL"]+1; } [vTypePALCell setAutoenablesItems:NO]; if ([vTypePALCell pullsDown]) { [[vTypePALCell itemAtIndex:[vTypePALCell indexOfItemWithTag:tag]] setState:NSOnState]; } else { [vTypePALCell selectItemAtIndex:[vTypePALCell indexOfItemWithTag:tag]]; } // setup plugin lists PluginList *list = [PluginList list]; [list refreshPlugins]; [graphicsPlugin setPluginsTo:[list pluginsForType:PSE_LT_GPU] withType: PSE_LT_GPU]; [soundPlugin setPluginsTo:[list pluginsForType:PSE_LT_SPU] withType: PSE_LT_SPU]; [padPlugin setPluginsTo:[list pluginsForType:PSE_LT_PAD] withType: PSE_LT_PAD]; [cdromPlugin setPluginsTo:[list pluginsForType:PSE_LT_CDR] withType: PSE_LT_CDR]; [netPlugin setPluginsTo:[list pluginsForType:PSE_LT_NET] withType: PSE_LT_NET]; [sio1Plugin setPluginsTo:[list pluginsForType:PSE_LT_SIO1] withType:PSE_LT_SIO1]; // Setup hotkey view [hkController initialize]; } - (NSString *)keyForSender:(id)sender { for (NSString *key in [self.checkBoxDefaults keyEnumerator]) { id object = (self.checkBoxDefaults)[key]; if ([object isEqual:sender]) return key; } return nil; } - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem { NSWindow *window = [self window]; if(tabViewItem == hkTab) { [window makeFirstResponder:(NSView*)hkController]; } else if([window firstResponder] == (NSView*)hkController) { [hkController resignFirstResponder]; } } @end