Big rename part 2: 'config' etc. to 'mapping.
[enjoyable.git] / TargetMouseScroll.m
index 79bc542..8f87c02 100644 (file)
@@ -3,33 +3,67 @@
 //  Enjoy
 //
 //  Created by Yifeng Huang on 7/28/12.
-//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
 //
 
 #import "TargetMouseScroll.h"
 
-@implementation TargetMouseScroll
+@implementation TargetMouseScroll {
+    int sign;
+}
 
-@synthesize howMuch;
++ (NSString *)serializationCode {
+    return @"mscroll";
+}
 
--(NSString*) stringify {
-       return [[NSString alloc] initWithFormat: @"mscroll~%d", howMuch];
+- (NSDictionary *)serialize {
+    return @{ @"type": @"mscroll", @"amount": @(_amount) };
 }
 
-+(TargetMouseScroll*) unstringifyImpl: (NSArray*) comps {
-       NSParameterAssert([comps count] == 2);
-       TargetMouseScrolltarget = [[TargetMouseScroll alloc] init];
-       [target setHowMuch: [comps[1] integerValue]];
++ (Target *)targetDeserialize:(NSDictionary *)serialization
+                  withMappings:(NSArray *)mappings {
+       TargetMouseScroll *target = [[TargetMouseScroll alloc] init];
+    target.amount = [serialization[@"amount"] intValue];
        return target;
 }
 
--(void) trigger {
+- (void)trigger {
+    if (!self.magnitude) {
+        CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
+                                                          kCGScrollEventUnitLine,
+                                                          1,
+                                                          _amount);
+        CGEventPost(kCGHIDEventTap, scroll);
+        CFRelease(scroll);
+    }
+}
+
+- (BOOL)update:(NJInputController *)jc {
+    if (fabsf(self.magnitude) < 0.01f) {
+        sign = 0;
+        return NO; // dead zone
+    }
+    
+    // If the input crossed over High/Low, this target is done.
+    if (!sign)
+        sign = self.magnitude < 0 ? -1 : 1;
+    else if (sign / self.magnitude < 0) {
+        sign = 0;
+        return NO;
+    }
+
+    int amount = (int)(16.f * fabsf(self.magnitude) * _amount);
     CGEventRef scroll = CGEventCreateScrollWheelEvent(NULL,
-                                                      kCGScrollEventUnitLine,
+                                                      kCGScrollEventUnitPixel,
                                                       1,
-                                                      [self howMuch]);
+                                                      amount);
     CGEventPost(kCGHIDEventTap, scroll);
     CFRelease(scroll);
+
+    return YES;
+}
+
+- (BOOL)isContinuous {
+    return YES;
 }
 
 @end