X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=Classes%2FNJMappingsController.m;h=44a9c43e1eb2819e20f050350d9b8de4434907ad;hp=2b08a52a3db05228e687b96a89d1e4e504b02d47;hb=6a7c78afa7b8a34901f59a79afe41d18855734bc;hpb=30f40c368cf11684956e992cb13a8f70b5c5e0ce diff --git a/Classes/NJMappingsController.m b/Classes/NJMappingsController.m index 2b08a52..44a9c43 100644 --- a/Classes/NJMappingsController.m +++ b/Classes/NJMappingsController.m @@ -8,12 +8,9 @@ #import "NJMappingsController.h" #import "NJMapping.h" -#import "NJMappingsController.h" #import "NJOutput.h" #import "NJEvents.h" -#define PB_ROW @"com.yukkurigames.Enjoyable.MappingRow" - @implementation NJMappingsController { NSMutableArray *_mappings; NJMapping *_manualMapping; @@ -48,7 +45,6 @@ object:self userInfo:@{ NJMappingListKey: _mappings, NJMappingKey: _currentMapping }]; - [self.mvc changedActiveMappingToIndex:[_mappings indexOfObjectIdenticalTo:_currentMapping]]; } - (void)mappingsChanged { @@ -89,19 +85,24 @@ _manualMapping = oldMapping; } +- (void)activateMappingForcibly:(NJMapping *)mapping { + NSLog(@"Switching to mapping %@.", mapping.name); + _currentMapping = mapping; + NSUInteger idx = [self indexOfMapping:_currentMapping]; + [NSNotificationCenter.defaultCenter + postNotificationName:NJEventMappingChanged + object:self + userInfo:@{ NJMappingKey : _currentMapping, + NJMappingIndexKey: @(idx) }]; +} + - (void)activateMapping:(NJMapping *)mapping { if (!mapping) mapping = _manualMapping; if (mapping == _currentMapping) return; - NSLog(@"Switching to mapping %@.", mapping.name); _manualMapping = mapping; - _currentMapping = mapping; - [self.mvc changedActiveMappingToIndex:[_mappings indexOfObjectIdenticalTo:_currentMapping]]; - [NSNotificationCenter.defaultCenter - postNotificationName:NJEventMappingChanged - object:self - userInfo:@{ NJMappingKey : _currentMapping }]; + [self activateMappingForcibly:mapping]; } - (void)save { @@ -122,17 +123,14 @@ NSArray *storedMappings = [NSUserDefaults.standardUserDefaults arrayForKey:@"mappings"]; NSMutableArray* newMappings = [[NSMutableArray alloc] initWithCapacity:storedMappings.count]; - for (unsigned i = 0; i < storedMappings.count; ++i) { - NJMapping *mapping = [[NJMapping alloc] initWithSerialization:storedMappings[i]]; - [newMappings addObject:mapping]; - } - + for (NSDictionary *serialization in storedMappings) + [newMappings addObject: + [[NJMapping alloc] initWithSerialization:serialization]]; if (newMappings.count) { _mappings = newMappings; if (selected >= newMappings.count) selected = 0; - [self.mvc reloadData]; [self activateMapping:_mappings[selected]]; [self mappingsSet]; } @@ -145,13 +143,15 @@ - (void)mergeMapping:(NJMapping *)mapping intoMapping:(NJMapping *)existing { [existing mergeEntriesFrom:mapping]; [self mappingsChanged]; - if (existing == _currentMapping) { - // FIXME: Hack to trigger updates when renaming. - _currentMapping = nil; - NJMapping *manual = _manualMapping; - [self activateMapping:existing]; - _manualMapping = manual; - } + if (existing == _currentMapping) + [self activateMappingForcibly:mapping]; +} + +- (void)renameMapping:(NJMapping *)mapping to:(NSString *)name { + mapping.name = name; + [self mappingsChanged]; + if (mapping == _currentMapping) + [self activateMappingForcibly:mapping]; } - (void)addMapping:(NJMapping *)mapping { @@ -179,118 +179,4 @@ return _mappings.count; } -- (void)mappingConflictDidResolve:(NSAlert *)alert - returnCode:(NSInteger)returnCode - contextInfo:(void *)contextInfo { - NSDictionary *userInfo = CFBridgingRelease(contextInfo); - NJMapping *oldMapping = userInfo[@"old mapping"]; - NJMapping *newMapping = userInfo[@"new mapping"]; - [alert.window orderOut:nil]; - switch (returnCode) { - case NSAlertFirstButtonReturn: // Merge - [self mergeMapping:newMapping intoMapping:oldMapping]; - [self activateMapping:oldMapping]; - break; - case NSAlertThirdButtonReturn: // New Mapping - [self.mvc.mappingList beginUpdates]; - [self addMapping:newMapping]; - [self.mvc addedMappingAtIndex:_mappings.count - 1 startEditing:YES]; - [self.mvc.mappingList endUpdates]; - [self activateMapping:newMapping]; - break; - default: // Cancel, other. - break; - } -} - -- (void)promptForMapping:(NJMapping *)mapping atIndex:(NSInteger)idx { - NSWindow *window = NSApplication.sharedApplication.keyWindow; - NJMapping *mergeInto = self[mapping.name]; - NSAlert *conflictAlert = [[NSAlert alloc] init]; - conflictAlert.messageText = NSLocalizedString(@"import conflict prompt", @"Title of import conflict alert"); - conflictAlert.informativeText = - [NSString stringWithFormat:NSLocalizedString(@"import conflict in %@", @"Explanation of import conflict"), - mapping.name]; - [conflictAlert addButtonWithTitle:NSLocalizedString(@"import and merge", @"button to merge imported mappings")]; - [conflictAlert addButtonWithTitle:NSLocalizedString(@"cancel import", @"button to cancel import")]; - [conflictAlert addButtonWithTitle:NSLocalizedString(@"import new mapping", @"button to import as new mapping")]; - [conflictAlert beginSheetModalForWindow:window - modalDelegate:self - didEndSelector:@selector(mappingConflictDidResolve:returnCode:contextInfo:) - contextInfo:(void *)CFBridgingRetain(@{ @"old mapping": mergeInto, - @"new mapping": mapping })]; -} - -- (NSInteger)numberOfMappings:(NJMappingsViewController *)mvc { - return self.count; -} - -- (NJMapping *)mappingsViewController:(NJMappingsViewController *)mvc - mappingForIndex:(NSUInteger)idx { - return self[idx]; -} - -- (void)mappingsViewController:(NJMappingsViewController *)mvc - editedMappingAtIndex:(NSInteger)index { - [self mappingsChanged]; -} - -- (BOOL)mappingsViewController:(NJMappingsViewController *)mvc - canMoveMappingFromIndex:(NSInteger)fromIdx - toIndex:(NSInteger)toIdx { - return fromIdx != toIdx && fromIdx != 0 && toIdx != 0; -} - -- (void)mappingsViewController:(NJMappingsViewController *)mvc - moveMappingFromIndex:(NSInteger)fromIdx - toIndex:(NSInteger)toIdx { - [mvc.mappingList beginUpdates]; - [mvc.mappingList moveRowAtIndex:fromIdx toIndex:toIdx]; - [self moveMoveMappingFromIndex:fromIdx toIndex:toIdx]; - [mvc.mappingList endUpdates]; -} - -- (BOOL)mappingsViewController:(NJMappingsViewController *)mvc - canRemoveMappingAtIndex:(NSInteger)idx { - return idx != 0; -} - -- (void)mappingsViewController:(NJMappingsViewController *)mvc - removeMappingAtIndex:(NSInteger)idx { - [mvc.mappingList beginUpdates]; - [mvc removedMappingAtIndex:idx]; - [self removeMappingAtIndex:idx]; - [mvc.mappingList endUpdates]; -} - -- (BOOL)mappingsViewController:(NJMappingsViewController *)mvc - importMappingFromURL:(NSURL *)url - atIndex:(NSInteger)index - error:(NSError **)error { - NJMapping *mapping = [NJMapping mappingWithContentsOfURL:url - error:error]; - if ([self[mapping.name] hasConflictWith:mapping]) { - [self promptForMapping:mapping atIndex:index]; - } else if (self[mapping.name]) { - [self[mapping.name] mergeEntriesFrom:mapping]; - } else if (mapping) { - [self insertMapping:mapping atIndex:index]; - } - return !!mapping; -} - -- (void)mappingsViewController:(NJMappingsViewController *)mvc - addMapping:(NJMapping *)mapping { - [mvc.mappingList beginUpdates]; - [mvc addedMappingAtIndex:_mappings.count startEditing:YES]; - [self addMapping:mapping]; - [mvc.mappingList endUpdates]; - [self activateMapping:mapping]; -} - -- (void)mappingsViewController:(NJMappingsViewController *)mvc - choseMappingAtIndex:(NSInteger)idx { - [self activateMapping:self[idx]]; -} - @end