diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-07-20 05:09:43 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-07-20 05:09:43 +0000 |
| commit | d6942932d64a02aa92b1e04e91f6126f33fdb05e (patch) | |
| tree | 7cad698308e39abc2b0e1c71674c610ec3ce74dd /macosx/Source/CheatController.m | |
| parent | b8d0d24d56dbc0ee64f4ec9a72ab917604d8109d (diff) | |
| download | pcsxr-d6942932d64a02aa92b1e04e91f6126f33fdb05e.tar.gz | |
OS X: Move source files to their own folder.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@90999 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/Source/CheatController.m')
| -rw-r--r-- | macosx/Source/CheatController.m | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/macosx/Source/CheatController.m b/macosx/Source/CheatController.m new file mode 100644 index 00000000..ebe73137 --- /dev/null +++ b/macosx/Source/CheatController.m @@ -0,0 +1,324 @@ +// +// CheatController.m +// Pcsxr +// + +#import <Cocoa/Cocoa.h> +#import "CheatController.h" +#import "PcsxrCheatHandler.h" +#import "PcsxrHexadecimalFormatter.h" + +#define kTempCheatCodesName @"tempCheatCodes" +#define kCheatsName @"cheats" + +@implementation PcsxrCheatTempObject +@synthesize cheatAddress, cheatValue; + +- (instancetype)init +{ + return [self initWithAddress:0x10000000 value:0]; +} + +- (instancetype)initWithAddress:(uint32_t)add value:(uint16_t)val +{ + if (self = [super init]) { + self.cheatAddress = add; + self.cheatValue = val; + } + return self; +} + +- (instancetype)initWithCheatCode:(CheatCode *)theCheat +{ + return [self initWithAddress:theCheat->Addr value:theCheat->Val]; +} + +- (NSString*)description +{ + return [NSString stringWithFormat:@"%08x %04x", cheatAddress, cheatValue]; +} + +- (BOOL)isEqual:(id)object +{ + if ([object isKindOfClass:[PcsxrCheatTempObject class]]) { + if (cheatAddress != [object cheatAddress]) { + return NO; + } else if (cheatValue != [object cheatValue]) { + return NO; + } else + return YES; + } else + return NO; +} + +- (NSUInteger)hash +{ + return cheatAddress ^ cheatValue; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [[[self class] allocWithZone:zone] initWithAddress:cheatAddress value:cheatValue]; +} + +@end + +@implementation PcsxrCheatTemp +@synthesize cheatName; +@synthesize cheatValues; +@synthesize enabled; + +- (instancetype)initWithCheat:(Cheat *)theCheat +{ + if (self = [super init]) { + self.cheatName = @(theCheat->Descr); + self.enabled = theCheat->Enabled ? YES : NO; + self.cheatValues = [NSMutableArray arrayWithCapacity:theCheat->n]; + for (int i = 0; i < theCheat->n; i++) { + [cheatValues addObject:[[PcsxrCheatTempObject alloc] initWithCheatCode:&CheatCodes[i+theCheat->First]]]; + } + } + return self; +} + +- (NSUInteger)hash +{ + return [cheatName hash] ^ [cheatValues hash]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"[%@%@]\n%@", enabled ? @"*" : @"", cheatName, [cheatValues componentsJoinedByString:@"\n"]]; +} + +@end + +@implementation CheatController +@synthesize addressFormatter; +@synthesize cheatView; +@synthesize editCheatView; +@synthesize editCheatWindow; +@synthesize valueFormatter; + +- (NSString *)windowNibName +{ + return @"CheatWindow"; +} + +- (instancetype)init +{ + return self = [self initWithWindowNibName:@"CheatWindow"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super initWithCoder:aDecoder]) { + self.tempCheatCodes = [NSMutableArray array]; + } + return self; +} + +- (instancetype)initWithWindow:(NSWindow *)window +{ + if (self = [super initWithWindow:window]) { + self.tempCheatCodes = [NSMutableArray array]; + } + return self; +} + +- (void)refreshNSCheatArray +{ + NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:NumCheats]; + for (int i = 0; i < NumCheats; i++) { + PcsxrCheatTemp *tmpObj = [[PcsxrCheatTemp alloc] initWithCheat:&Cheats[i]]; + [tmpArray addObject:tmpObj]; + } + self.cheats = tmpArray; + [self setDocumentEdited:NO]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + if ([keyPath isEqualToString:kCheatsName]) { + [self setDocumentEdited:YES]; + } +} + +- (void)refresh +{ + [cheatView reloadData]; + [self refreshNSCheatArray]; +} + +- (void)awakeFromNib +{ + [valueFormatter setHexPadding:4]; + [addressFormatter setHexPadding:8]; + [self refreshNSCheatArray]; + [self addObserver:self forKeyPath:kCheatsName options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; +} + +- (IBAction)loadCheats:(id)sender +{ + NSOpenPanel *openDlg = [NSOpenPanel openPanel]; + [openDlg setAllowsMultipleSelection:NO]; + [openDlg setAllowedFileTypes:[PcsxrCheatHandler supportedUTIs]]; + + if ([openDlg runModal] == NSFileHandlingPanelOKButton) { + NSURL *file = [openDlg URL]; + LoadCheats([[file path] fileSystemRepresentation]); + [self refresh]; + } +} + +- (IBAction)saveCheats:(id)sender +{ + NSSavePanel *saveDlg = [NSSavePanel savePanel]; + [saveDlg setAllowedFileTypes:[PcsxrCheatHandler supportedUTIs]]; + [saveDlg setCanSelectHiddenExtension:YES]; + [saveDlg setCanCreateDirectories:YES]; + [saveDlg setPrompt:NSLocalizedString(@"Save Cheats", nil)]; + if ([saveDlg runModal] == NSFileHandlingPanelOKButton) { + NSURL *url = [saveDlg URL]; + NSString *saveString = [self.cheats componentsJoinedByString:@"\n"]; + [saveString writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:NULL]; + } +} + +- (IBAction)clear:(id)sender +{ + self.cheats = [[NSMutableArray alloc] init]; +} + +- (IBAction)closeCheatEdit:(id)sender +{ + [NSApp endSheet:editCheatWindow returnCode:[sender tag] == 1 ? NSCancelButton : NSOKButton]; +} + +- (IBAction)changeCheat:(id)sender +{ + [self setDocumentEdited:YES]; +} + +- (IBAction)removeCheatValue:(id)sender +{ + if ([editCheatView selectedRow] < 0) { + NSBeep(); + return; + } + + NSIndexSet *toRemoveIndex = [editCheatView selectedRowIndexes]; + [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:toRemoveIndex forKey:kTempCheatCodesName]; + [self.tempCheatCodes removeObjectsAtIndexes:toRemoveIndex]; + [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:toRemoveIndex forKey:kTempCheatCodesName]; +} + +- (IBAction)addCheatValue:(id)sender +{ + NSIndexSet *newSet = [NSIndexSet indexSetWithIndex:[self.tempCheatCodes count]]; + [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:newSet forKey:kTempCheatCodesName]; + [self.tempCheatCodes addObject:[[PcsxrCheatTempObject alloc] init]]; + [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:newSet forKey:kTempCheatCodesName]; +} + +- (void)reloadCheats +{ + NSFileManager *manager = [NSFileManager defaultManager]; + NSURL *tmpURL = [[manager URLForDirectory:NSItemReplacementDirectory inDomain:NSUserDomainMask appropriateForURL:[[NSBundle mainBundle] bundleURL] create:YES error:nil] URLByAppendingPathComponent:@"temp.cht" isDirectory:NO]; + NSString *tmpStr = [self.cheats componentsJoinedByString:@"\n"]; + [tmpStr writeToURL:tmpURL atomically:NO encoding:NSUTF8StringEncoding error:NULL]; + LoadCheats([[tmpURL path] fileSystemRepresentation]); + [manager removeItemAtURL:tmpURL error:NULL]; +} + +- (IBAction)editCheat:(id)sender +{ + if ([cheatView selectedRow] < 0) { + NSBeep(); + return; + } + NSMutableArray *tmpArray = [(self.cheats)[[cheatView selectedRow]] cheatValues]; + NSMutableArray *newCheats = [[NSMutableArray alloc] initWithArray:tmpArray copyItems:YES]; + self.tempCheatCodes = newCheats; + [[self window] beginSheet:editCheatWindow completionHandler:^(NSModalResponse returnCode) { + if (returnCode == NSOKButton) { + PcsxrCheatTemp *tmpCheat = (self.cheats)[[cheatView selectedRow]]; + if (![tmpCheat.cheatValues isEqualToArray:self.tempCheatCodes]) { + tmpCheat.cheatValues = self.tempCheatCodes; + [self setDocumentEdited:YES]; + } + } + + [editCheatWindow orderOut:nil]; + }]; +} + +- (IBAction)addCheat:(id)sender +{ + NSIndexSet *newSet = [NSIndexSet indexSetWithIndex:[self.cheats count]]; + [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:newSet forKey:kCheatsName]; + PcsxrCheatTemp *tmpCheat = [[PcsxrCheatTemp alloc] init]; + tmpCheat.cheatName = NSLocalizedString(@"New Cheat", @"New Cheat Name" ); + PcsxrCheatTempObject *tmpObj = [[PcsxrCheatTempObject alloc] initWithAddress:0x10000000 value:0]; + NSMutableArray *tmpArray = [NSMutableArray arrayWithObject:tmpObj]; + tmpCheat.cheatValues = tmpArray; + [self.cheats addObject:tmpCheat]; + [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:newSet forKey:kCheatsName]; + [self setDocumentEdited:YES]; +} + +- (IBAction)applyCheats:(id)sender +{ + [self reloadCheats]; + [self setDocumentEdited:NO]; +} + +- (void)sheetDidDismiss:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + switch (returnCode) { + case NSAlertDefaultReturn: + [self reloadCheats]; + [self close]; + break; + + default: + [self refreshNSCheatArray]; + [self close]; + break; + + case NSAlertOtherReturn: + break; + } +} + +- (BOOL)windowShouldClose:(id)sender +{ + if (![sender isDocumentEdited] || ![[self window] isEqual:sender]) { + return YES; + } else { + NSBeginAlertSheet(NSLocalizedString(@"Unsaved Changes", @"Unsaved changes"), + NSLocalizedString(@"Save", @"Save"), + NSLocalizedString(@"Don't Save",@"Don't Save"), + NSLocalizedString(@"Cancel", @"Cancel"), [self window], self, + NULL, @selector(sheetDidDismiss:returnCode:contextInfo:), NULL, + NSLocalizedString(@"The cheat codes have not been applied. Unapplied cheats will not run nor be saved. Do you wish to save?", nil)); + + return NO; + } +} + +- (IBAction)removeCheats:(id)sender +{ + if ([cheatView selectedRow] < 0) { + NSBeep(); + return; + } + + NSIndexSet *toRemoveIndex = [cheatView selectedRowIndexes]; + [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:toRemoveIndex forKey:kCheatsName]; + [self.cheats removeObjectsAtIndexes:toRemoveIndex]; + [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:toRemoveIndex forKey:kCheatsName]; + [self setDocumentEdited:YES]; +} + +@end |
