Publish activated/deactivated as notifications.
[enjoyable.git] / JoystickController.m
index cd513de..2efd68f 100644 (file)
@@ -13,6 +13,7 @@
 #import "JSAction.h"
 #import "Target.h"
 #import "TargetController.h"
+#import "NJEvents.h"
 
 @implementation JoystickController {
     IOHIDManagerRef hidManager;
     CFRelease(hidManager);
 }
 
-- (void)expandRecursive:(id)handler {
-    if ([handler base])
-        [self expandRecursive:[handler base]];
-    [outlineView expandItem:handler];
+- (void)expandRecursive:(id <NJActionPathElement>)pathElement {
+    if (pathElement) {
+        [self expandRecursive:pathElement.base];
+        [outlineView expandItem:pathElement];
+    }
 }
 
 - (void)addRunningTarget:(Target *)target {
@@ -84,7 +86,7 @@ static void input_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDVa
     JoystickController *controller = (__bridge JoystickController *)ctx;
     IOHIDDeviceRef device = IOHIDQueueGetDevice(inSender);
     
-    if (controller.sendingRealEvents) {
+    if (controller.translatingEvents) {
         [controller runTargetForDevice:device value:value];
     } else if ([NSApplication sharedApplication].mainWindow.isVisible) {
         [controller showTargetForDevice:device value:value];
@@ -177,7 +179,10 @@ static void remove_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDD
              informativeTextWithFormat:@"Error 0x%08x occured trying to access your devices. "
                                        @"Input may not be correctly detected or mapped.",
                                        ret]
-         runModal];
+         beginSheetModalForWindow:outlineView.window
+                    modalDelegate:nil
+                   didEndSelector:nil
+                      contextInfo:nil];
     }
     
     IOHIDManagerRegisterDeviceMatchingCallback(hidManager, add_callback, (__bridge void *)self);
@@ -185,30 +190,46 @@ static void remove_callback(void *ctx, IOReturn inResult, void *inSender, IOHIDD
 }
 
 - (JSAction *)selectedAction {
-    id item = [outlineView itemAtRow:outlineView.selectedRow];
-    return [item children] ? nil : item;
+    id <NJActionPathElement> item = [outlineView itemAtRow:outlineView.selectedRow];
+    return (!item.children && item.base) ? item : nil;
 }
 
-- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
-    return item ? [[item children] count] : _joysticks.count;
+- (NSInteger)outlineView:(NSOutlineView *)outlineView
+  numberOfChildrenOfItem:(id <NJActionPathElement>)item {
+    return item ? item.children.count : _joysticks.count;
 }
 
-- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
+- (BOOL)outlineView:(NSOutlineView *)outlineView
+   isItemExpandable:(id <NJActionPathElement>)item {
     return item ? [[item children] count] > 0: YES;
 }
 
-- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item {
-    return item ? [item children][index] : _joysticks[index];
+- (id)outlineView:(NSOutlineView *)outlineView
+            child:(NSInteger)index
+           ofItem:(id <NJActionPathElement>)item {
+    return item ? item.children[index] : _joysticks[index];
 }
 
-- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item  {
-    if(item == nil)
-        return @"root";
-    return [item name];
+- (id)outlineView:(NSOutlineView *)outlineView
+objectValueForTableColumn:(NSTableColumn *)tableColumn
+           byItem:(id <NJActionPathElement>)item  {
+    return item ? item.name : @"root";
 }
 
 - (void)outlineViewSelectionDidChange:(NSNotification *)notification {
+    
     [targetController loadCurrent];
 }
 
+- (void)setTranslatingEvents:(BOOL)translatingEvents {
+    if (translatingEvents != _translatingEvents) {
+        _translatingEvents = translatingEvents;
+        NSString *name = translatingEvents
+            ? NJEventTranslationActivated
+            : NJEventTranslationDeactivated;
+        [NSNotificationCenter.defaultCenter postNotificationName:name
+                                                          object:self];
+    }
+}
+
 @end