212 lines
5.1 KiB
Objective-C
212 lines
5.1 KiB
Objective-C
/**
|
|
* HotkeyController.m
|
|
* Pcsxr
|
|
*
|
|
* Created by Nicolas Pepin-Perreault on 12-12-10.
|
|
*
|
|
* Adapted from the Cocoa port of DeSMuMe
|
|
*/
|
|
|
|
#import "HotkeyController.h"
|
|
|
|
#define INPUT_HOLD_TIME 0.1
|
|
|
|
@interface HotkeyController ()
|
|
@property (strong) NSButton *lastConfigButton;
|
|
@property (strong) NSMutableDictionary *hotkeysList;
|
|
@property (strong) NSDictionary *keyNameTable;
|
|
@property (strong) NSMutableDictionary *hotkeyOutlets;
|
|
@end
|
|
|
|
@implementation HotkeyController
|
|
|
|
@synthesize FastForward;
|
|
@synthesize FrameLimit;
|
|
@synthesize LoadState;
|
|
@synthesize NextState;
|
|
@synthesize PrevState;
|
|
@synthesize SaveState;
|
|
|
|
- (void)initialize
|
|
{
|
|
self.lastConfigButton = nil;
|
|
self.configInput = 0;
|
|
self.hotkeysList = [[NSMutableDictionary alloc] initWithCapacity:16];
|
|
self.keyNameTable = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"KeyNames" ofType:@"plist"]];
|
|
self.hotkeyOutlets = [[NSMutableDictionary alloc] initWithCapacity:8];
|
|
|
|
[self mapOutletToIdentifier:FastForward forIdentifier:@"FastForward"];
|
|
[self mapOutletToIdentifier:SaveState forIdentifier:@"SaveState"];
|
|
[self mapOutletToIdentifier:LoadState forIdentifier:@"LoadState"];
|
|
[self mapOutletToIdentifier:NextState forIdentifier:@"NextState"];
|
|
[self mapOutletToIdentifier:PrevState forIdentifier:@"PrevState"];
|
|
[self mapOutletToIdentifier:FrameLimit forIdentifier:@"FrameLimit"];
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
}
|
|
|
|
- (void)mapOutletToIdentifier:(id)outlet forIdentifier:(NSString*)identifier1
|
|
{
|
|
(self.hotkeyOutlets)[identifier1] = outlet;
|
|
[self setHotkeyDisplay:identifier1];
|
|
}
|
|
|
|
- (void)setHotkeyDisplay:(NSString*)keyIdent
|
|
{
|
|
NSString *label = [self parseMappingDisplayString:keyIdent];
|
|
NSTextField *displayField = (self.hotkeyOutlets)[keyIdent];
|
|
|
|
if(displayField) {
|
|
[displayField setStringValue:label];
|
|
}
|
|
}
|
|
|
|
- (void)mouseDown:(NSEvent *)theEvent
|
|
{
|
|
BOOL isHandled = [self handleMouseDown:theEvent];
|
|
if (!isHandled)
|
|
{
|
|
[super mouseDown:theEvent];
|
|
}
|
|
}
|
|
|
|
- (void)mouseDragged:(NSEvent *)theEvent
|
|
{
|
|
[self mouseDown:theEvent];
|
|
}
|
|
|
|
- (void)rightMouseDown:(NSEvent *)theEvent
|
|
{
|
|
BOOL isHandled = [self handleMouseDown:theEvent];
|
|
if (!isHandled)
|
|
{
|
|
[super rightMouseDown:theEvent];
|
|
}
|
|
}
|
|
|
|
- (void)rightMouseDragged:(NSEvent *)theEvent
|
|
{
|
|
[self rightMouseDown:theEvent];
|
|
}
|
|
|
|
- (void)otherMouseDown:(NSEvent *)theEvent
|
|
{
|
|
BOOL isHandled = [self handleMouseDown:theEvent];
|
|
if (!isHandled)
|
|
{
|
|
[super otherMouseDown:theEvent];
|
|
}
|
|
}
|
|
|
|
- (void)otherMouseDragged:(NSEvent *)theEvent
|
|
{
|
|
[self otherMouseDown:theEvent];
|
|
}
|
|
|
|
- (BOOL) handleMouseDown:(NSEvent *)mouseEvent
|
|
{
|
|
if (self.configInput != 0)
|
|
{
|
|
[self hotkeyCancel];
|
|
}
|
|
|
|
return YES;
|
|
}
|
|
|
|
- (void)keyDown:(NSEvent *)theEvent
|
|
{
|
|
NSString *keyCode = [NSString stringWithFormat:@"%d", [theEvent keyCode]];
|
|
NSString *keyLabel = (NSString *) (self.keyNameTable)[keyCode];
|
|
|
|
if (self.configInput != 0)
|
|
{
|
|
// Save input
|
|
NSString *ident = [self.lastConfigButton identifier];
|
|
[self saveHotkey:ident device:@"NSEventKeyboard" deviceLabel:@"Keyboard" code:keyCode label:keyLabel];
|
|
[self setHotkeyDisplay:ident];
|
|
[self hotkeyCancel];
|
|
}
|
|
}
|
|
|
|
- (void)saveHotkey:(NSString*)keyIdent device:(NSString*)device deviceLabel:(NSString*)deviceLabel code:(NSString*)keyCode label:(NSString*)keyLabel
|
|
{
|
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults] ;
|
|
NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:[defaults dictionaryForKey:@"HotkeyBindings"]];
|
|
[tempUserMappings setValue:@{@"device": device,
|
|
@"deviceName": deviceLabel,
|
|
@"keyCode": keyCode,
|
|
@"keyLabel": keyLabel} forKey:keyIdent];
|
|
[defaults setValue:tempUserMappings forKey:@"HotkeyBindings"];
|
|
}
|
|
|
|
- (NSString *) parseMappingDisplayString:(NSString *)keyString
|
|
{
|
|
NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"HotkeyBindings"];
|
|
NSDictionary *binding = (NSDictionary *)[userMappings valueForKey:keyString];
|
|
|
|
NSString *displayString = @"";
|
|
if(binding) {
|
|
NSString *deviceLabel = (NSString *)[binding valueForKey:@"deviceName"];
|
|
NSString *keyLabel = (NSString *)[binding valueForKey:@"keyLabel"];
|
|
|
|
displayString = [NSString stringWithString:deviceLabel];
|
|
displayString = [displayString stringByAppendingString:@": "];
|
|
displayString = [displayString stringByAppendingString:keyLabel];
|
|
}
|
|
|
|
return displayString;
|
|
}
|
|
|
|
- (IBAction) hotkeySet:(id)sender
|
|
{
|
|
NSButton *theButton = (NSButton *)sender;
|
|
|
|
if (self.configInput && self.lastConfigButton != theButton)
|
|
{
|
|
[self.lastConfigButton setState:NSOffState];
|
|
}
|
|
|
|
if ([theButton state] == NSOnState)
|
|
{
|
|
self.lastConfigButton = theButton;
|
|
[self.hotkeysList removeAllObjects];
|
|
self.configInput = [theButton tag];
|
|
}
|
|
else
|
|
{
|
|
[self hotkeyCancel];
|
|
}
|
|
|
|
}
|
|
|
|
- (void) hotkeyCancel
|
|
{
|
|
if (self.lastConfigButton != nil)
|
|
{
|
|
[self.lastConfigButton setState:NSOffState];
|
|
self.lastConfigButton = nil;
|
|
}
|
|
|
|
self.configInput = 0;
|
|
}
|
|
|
|
- (BOOL)acceptsFirstResponder
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (BOOL)becomeFirstResponder
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (BOOL)resignFirstResponder
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
@end
|