// // TargetController.m // Enjoy // // Created by Sam McCall on 5/05/09. // #import "TargetController.h" #import "NJMappingsController.h" #import "NJMapping.h" #import "NJInput.h" #import "NJInputController.h" #import "NJKeyInputField.h" #import "TargetConfig.h" #import "TargetController.h" #import "TargetKeyboard.h" #import "TargetMouseBtn.h" #import "TargetMouseMove.h" #import "TargetMouseScroll.h" #import "TargetToggleMouseScope.h" @implementation TargetController - (void)cleanUpInterface { NSInteger row = radioButtons.selectedRow; if (row != 1) { keyInput.keyCode = -1; [keyInput resignIfFirstResponder]; } if (row != 2) { [mappingPopup selectItemAtIndex:-1]; [mappingPopup resignIfFirstResponder]; } else if (!mappingPopup.selectedItem) [mappingPopup selectItemAtIndex:0]; if (row != 3) { mouseDirSelect.selectedSegment = -1; [mouseDirSelect resignIfFirstResponder]; } else if (mouseDirSelect.selectedSegment == -1) mouseDirSelect.selectedSegment = 0; if (row != 4) { mouseBtnSelect.selectedSegment = -1; [mouseBtnSelect resignIfFirstResponder]; } else if (mouseBtnSelect.selectedSegment == -1) mouseBtnSelect.selectedSegment = 0; if (row != 5) { scrollDirSelect.selectedSegment = -1; [scrollDirSelect resignIfFirstResponder]; } else if (scrollDirSelect.selectedSegment == -1) scrollDirSelect.selectedSegment = 0; } - (IBAction)radioChanged:(NSView *)sender { [sender.window makeFirstResponder:sender]; if (radioButtons.selectedRow == 1) [keyInput.window makeFirstResponder:keyInput]; [self commit]; } - (void)keyInputField:(NJKeyInputField *)keyInput didChangeKey:(CGKeyCode)keyCode { [radioButtons selectCellAtRow:1 column:0]; [radioButtons.window makeFirstResponder:radioButtons]; [self commit]; } - (void)keyInputFieldDidClear:(NJKeyInputField *)keyInput { [radioButtons selectCellAtRow:0 column:0]; [self commit]; } - (void)mappingChosen:(id)sender { [radioButtons selectCellAtRow:2 column:0]; [mappingPopup.window makeFirstResponder:mappingPopup]; [self commit]; } - (void)mdirChanged:(NSView *)sender { [radioButtons selectCellAtRow:3 column:0]; [sender.window makeFirstResponder:sender]; [self commit]; } - (void)mbtnChanged:(NSView *)sender { [radioButtons selectCellAtRow:4 column:0]; [sender.window makeFirstResponder:sender]; [self commit]; } - (void)sdirChanged:(NSView *)sender { [radioButtons selectCellAtRow:5 column:0]; [sender.window makeFirstResponder:sender]; [self commit]; } - (Target *)currentTarget { return mappingsController.currentMapping[joystickController.selectedInput]; } - (Target *)makeTarget { switch (radioButtons.selectedRow) { case 0: return nil; case 1: if (keyInput.hasKeyCode) { TargetKeyboard *k = [[TargetKeyboard alloc] init]; k.vk = keyInput.keyCode; return k; } else { return nil; } break; case 2: { TargetConfig *c = [[TargetConfig alloc] init]; c.mapping = mappingsController.mappings[mappingPopup.indexOfSelectedItem]; return c; } case 3: { TargetMouseMove *mm = [[TargetMouseMove alloc] init]; mm.axis = mouseDirSelect.selectedSegment; return mm; } case 4: { TargetMouseBtn *mb = [[TargetMouseBtn alloc] init]; mb.button = mouseBtnSelect.selectedSegment == 0 ? kCGMouseButtonLeft : kCGMouseButtonRight; return mb; } case 5: { TargetMouseScroll *ms = [[TargetMouseScroll alloc] init]; ms.amount = scrollDirSelect.selectedSegment ? 1 : -1; return ms; } case 6: { TargetToggleMouseScope *tms = [[TargetToggleMouseScope alloc] init]; return tms; } default: return nil; } } - (void)commit { [self cleanUpInterface]; mappingsController.currentMapping[joystickController.selectedInput] = [self makeTarget]; [mappingsController save]; } - (BOOL)enabled { return [radioButtons isEnabled]; } - (void)setEnabled:(BOOL)enabled { [radioButtons setEnabled:enabled]; [keyInput setEnabled:enabled]; [mappingPopup setEnabled:enabled]; [mouseDirSelect setEnabled:enabled]; [mouseBtnSelect setEnabled:enabled]; [scrollDirSelect setEnabled:enabled]; } - (void)loadTarget:(Target *)target forInput:(NJInput *)input { if (!input) { self.enabled = NO; title.stringValue = @""; } else { self.enabled = YES; NSString *inpFullName = input.name; for (id cur = input.base; cur; cur = cur.base) { inpFullName = [[NSString alloc] initWithFormat:@"%@ > %@", cur.name, inpFullName]; } title.stringValue = [[NSString alloc] initWithFormat:@"%@ > %@", mappingsController.currentMapping.name, inpFullName]; } if ([target isKindOfClass:TargetKeyboard.class]) { [radioButtons selectCellAtRow:1 column:0]; keyInput.keyCode = [(TargetKeyboard*)target vk]; } else if ([target isKindOfClass:TargetConfig.class]) { [radioButtons selectCellAtRow:2 column:0]; NSUInteger idx = [mappingsController.mappings indexOfObject:[(TargetConfig *)target mapping]]; if (idx == NSNotFound) { [radioButtons selectCellAtRow:self.enabled ? 0 : -1 column:0]; [mappingPopup selectItemAtIndex:-1]; } else [mappingPopup selectItemAtIndex:idx]; } else if ([target isKindOfClass:TargetMouseMove.class]) { [radioButtons selectCellAtRow:3 column:0]; [mouseDirSelect setSelectedSegment:[(TargetMouseMove *)target axis]]; } else if ([target isKindOfClass:TargetMouseBtn.class]) { [radioButtons selectCellAtRow:4 column:0]; mouseBtnSelect.selectedSegment = [(TargetMouseBtn *)target button] == kCGMouseButtonLeft ? 0 : 1; } else if ([target isKindOfClass:TargetMouseScroll.class]) { [radioButtons selectCellAtRow:5 column:0]; scrollDirSelect.selectedSegment = [(TargetMouseScroll *)target amount] > 0; } else if ([target isKindOfClass:TargetToggleMouseScope.class]) { [radioButtons selectCellAtRow:6 column:0]; } else { [radioButtons selectCellAtRow:self.enabled ? 0 : -1 column:0]; } [self cleanUpInterface]; } - (void)loadCurrent { [self loadTarget:self.currentTarget forInput:joystickController.selectedInput]; } - (void)focusKey { if (radioButtons.selectedRow <= 1) [keyInput.window makeFirstResponder:keyInput]; else [keyInput resignIfFirstResponder]; } - (void)refreshMappings { NSInteger initialIndex = mappingPopup.indexOfSelectedItem; [mappingPopup.menu removeAllItems]; for (NJMapping *mapping in mappingsController.mappings) { NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:mapping.name action:@selector(mappingChosen:) keyEquivalent:@""]; item.target = self; [mappingPopup.menu addItem:item]; } [mappingPopup selectItemAtIndex:initialIndex]; } @end