X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=NJMappingsController.m;h=cb5baf11a3a6d726d5950183e1ae5de01b8939cf;hp=567f2337930b242b38d8a080ec53f28501d9fb4d;hb=a2cc76128896f61d5f5cc4039c0dcbb1b6cdff23;hpb=bf62b06504aeb5d111735f4a0f40b1b3f9e9e350 diff --git a/NJMappingsController.m b/NJMappingsController.m index 567f233..cb5baf1 100644 --- a/NJMappingsController.m +++ b/NJMappingsController.m @@ -13,6 +13,8 @@ #import "NJOutputController.h" #import "NJEvents.h" +#define PB_ROW @"com.yukkurigames.Enjoyable.MappingRow" + @implementation NJMappingsController { NSMutableArray *_mappings; NJMapping *manualMapping; @@ -28,6 +30,10 @@ return self; } +- (void)awakeFromNib { + [tableView registerForDraggedTypes:@[PB_ROW]]; +} + - (NJMapping *)objectForKeyedSubscript:(NSString *)name { for (NJMapping *mapping in _mappings) if ([name isEqualToString:mapping.name]) @@ -43,6 +49,7 @@ [self save]; [tableView reloadData]; popoverActivate.title = _currentMapping.name; + [self updateInterfaceForCurrentMapping]; [NSNotificationCenter.defaultCenter postNotificationName:NJEventMappingListChanged object:_mappings]; @@ -71,6 +78,16 @@ } } +- (void)updateInterfaceForCurrentMapping { + NSUInteger selected = [_mappings indexOfObject:_currentMapping]; + [removeButton setEnabled:selected != 0]; + [moveDown setEnabled:selected && selected != _mappings.count - 1]; + [moveUp setEnabled:selected > 1]; + popoverActivate.title = _currentMapping.name; + [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:selected] byExtendingSelection:NO]; + [NSUserDefaults.standardUserDefaults setInteger:selected forKey:@"selected"]; +} + - (void)activateMapping:(NJMapping *)mapping { if (!mapping) mapping = manualMapping; @@ -79,12 +96,8 @@ NSLog(@"Switching to mapping %@.", mapping.name); manualMapping = mapping; _currentMapping = mapping; - [removeButton setEnabled:_mappings[0] != mapping]; + [self updateInterfaceForCurrentMapping]; [outputController loadCurrent]; - popoverActivate.title = _currentMapping.name; - NSUInteger selected = [_mappings indexOfObject:mapping]; - [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:selected] byExtendingSelection:NO]; - [NSUserDefaults.standardUserDefaults setInteger:selected forKey:@"selected"]; [NSNotificationCenter.defaultCenter postNotificationName:NJEventMappingChanged object:_currentMapping]; } @@ -92,8 +105,8 @@ - (IBAction)addPressed:(id)sender { NJMapping *newMapping = [[NJMapping alloc] initWithName:@"Untitled"]; [_mappings addObject:newMapping]; - [self mappingsChanged]; [self activateMapping:newMapping]; + [self mappingsChanged]; [tableView editColumn:0 row:_mappings.count - 1 withEvent:nil select:YES]; } @@ -102,8 +115,8 @@ return; [_mappings removeObjectAtIndex:tableView.selectedRow]; - [self mappingsChanged]; [self activateMapping:_mappings[0]]; + [self mappingsChanged]; } -(void)tableViewSelectionDidChange:(NSNotification *)notify { @@ -168,8 +181,8 @@ _mappings = newMappings; if (selected >= newMappings.count) selected = 0; - [self mappingsChanged]; [self activateMapping:_mappings[selected]]; + [self mappingsChanged]; } } @@ -253,9 +266,8 @@ [_mappings addObject:mapping]; } - [self mappingsChanged]; [self activateMapping:mapping]; - [outputController loadCurrent]; + [self mappingsChanged]; if (conflict && !mergeInto) { [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:_mappings.count - 1] byExtendingSelection:NO]; @@ -317,4 +329,62 @@ popoverActivate.state = NSOffState; } +- (IBAction)moveUpPressed:(id)sender { + NSUInteger idx = [_mappings indexOfObject:_currentMapping]; + if (idx > 1 && idx != NSNotFound) { + [_mappings exchangeObjectAtIndex:idx withObjectAtIndex:idx - 1]; + [self mappingsChanged]; + } +} + +- (IBAction)moveDownPressed:(id)sender { + NSUInteger idx = [_mappings indexOfObject:_currentMapping]; + if (idx < _mappings.count - 1) { + [_mappings exchangeObjectAtIndex:idx withObjectAtIndex:idx + 1]; + [self mappingsChanged]; + } +} + +- (BOOL)tableView:(NSTableView *)tableView + acceptDrop:(id )info + row:(NSInteger)row + dropOperation:(NSTableViewDropOperation)dropOperation { + NSPasteboard *pboard = [info draggingPasteboard]; + if ([pboard.types containsObject:PB_ROW]) { + NSString *value = [pboard stringForType:PB_ROW]; + NSUInteger srcRow = [value intValue]; + [_mappings moveObjectAtIndex:srcRow toIndex:row]; + [self mappingsChanged]; + return YES; + } else { + return NO; + } +} + +- (NSDragOperation)tableView:(NSTableView *)tableView_ + validateDrop:(id )info + proposedRow:(NSInteger)row + proposedDropOperation:(NSTableViewDropOperation)dropOperation { + NSPasteboard *pboard = [info draggingPasteboard]; + if ([pboard.types containsObject:PB_ROW]) { + [tableView_ setDropRow:MAX(1, row) dropOperation:NSTableViewDropAbove]; + return NSDragOperationGeneric; + } else { + return NSDragOperationNone; + } +} + +- (BOOL)tableView:(NSTableView *)tableView +writeRowsWithIndexes:(NSIndexSet *)rowIndexes + toPasteboard:(NSPasteboard *)pboard { + if (rowIndexes.count == 1 && rowIndexes.firstIndex != 0) { + [pboard declareTypes:@[PB_ROW] owner:nil]; + [pboard setString:@(rowIndexes.firstIndex).stringValue forType:PB_ROW]; + return YES; + } else { + return NO; + } + +} + @end