23324d3c76a854db9a8a33b167fd0fe3b97e1639
[enjoyable.git] / EnjoyableApplicationDelegate.m
1 //
2 // EnjoyableApplicationDelegate.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 4/05/09.
6 //
7
8 #import "EnjoyableApplicationDelegate.h"
9
10 #import "NJMapping.h"
11 #import "NJMappingsController.h"
12 #import "NJDeviceController.h"
13 #import "NJOutputController.h"
14 #import "NJEvents.h"
15
16 @implementation EnjoyableApplicationDelegate {
17 NSInteger mappingsMenuIndex;
18 }
19
20 - (void)didSwitchApplication:(NSNotification *)notification {
21 NSRunningApplication *currentApp = notification.userInfo[NSWorkspaceApplicationKey];
22 [self.mappingsController activateMappingForProcess:currentApp.localizedName];
23 }
24
25 - (void)applicationDidFinishLaunching:(NSNotification *)notification {
26 [NSNotificationCenter.defaultCenter
27 addObserver:self
28 selector:@selector(mappingDidChange:)
29 name:NJEventMappingChanged
30 object:nil];
31 [NSNotificationCenter.defaultCenter
32 addObserver:self
33 selector:@selector(eventTranslationActivated:)
34 name:NJEventTranslationActivated
35 object:nil];
36 [NSNotificationCenter.defaultCenter
37 addObserver:self
38 selector:@selector(eventTranslationDeactivated:)
39 name:NJEventTranslationDeactivated
40 object:nil];
41
42 mappingsMenuIndex = dockMenuBase.numberOfItems;
43 while (![dockMenuBase itemAtIndex:mappingsMenuIndex - 1].isSeparatorItem)
44 --mappingsMenuIndex;
45
46 [drawer open];
47 self.outputController.enabled = NO;
48 [self.inputController setup];
49 [self.mappingsController load];
50 }
51
52 - (void)applicationWillTerminate:(NSNotification *)aNotification {
53 [NSUserDefaults.standardUserDefaults synchronize];
54 }
55
56 - (void)eventTranslationActivated:(NSNotification *)note {
57 activeButton.image = [NSImage imageNamed:@"NSStopProgressFreestandingTemplate"];
58 activeMenuItem.state = [note.object translatingEvents];
59 [NSWorkspace.sharedWorkspace.notificationCenter
60 addObserver:self
61 selector:@selector(didSwitchApplication:)
62 name:NSWorkspaceDidActivateApplicationNotification
63 object:nil];
64 NSLog(@"Listening for application changes.");
65 }
66
67 - (void)eventTranslationDeactivated:(NSNotification *)note {
68 activeButton.image = [NSImage imageNamed:@"NSGoRightTemplate"];
69 activeMenuItem.state = [note.object translatingEvents];
70 [NSWorkspace.sharedWorkspace.notificationCenter
71 removeObserver:self
72 name:NSWorkspaceDidActivateApplicationNotification
73 object:nil];
74 NSLog(@"Ignoring application changes.");
75 }
76
77 - (IBAction)toggleActivity:(id)sender {
78 self.inputController.translatingEvents = !self.inputController.translatingEvents;
79 }
80
81 - (void)mappingsChanged {
82 NSInteger removeFrom = mappingsMenuIndex;
83 while (dockMenuBase.numberOfItems > removeFrom)
84 [dockMenuBase removeItemAtIndex:dockMenuBase.numberOfItems - 1];
85 int added = 0;
86 for (NJMapping *mapping in self.mappingsController.mappings) {
87 NSString *keyEquiv = ++added < 10 ? @(added).stringValue : @"";
88 [dockMenuBase addItemWithTitle:mapping.name
89 action:@selector(chooseMapping:)
90 keyEquivalent:keyEquiv];
91
92 }
93 [_outputController refreshMappings];
94 }
95
96 - (void)mappingDidChange:(NSNotification *)note {
97 NJMapping *current = note.object;
98 NSArray *mappings = self.mappingsController.mappings;
99 for (NSUInteger i = 0; i < mappings.count; ++i)
100 [dockMenuBase itemAtIndex:i + mappingsMenuIndex].state = mappings[i] == current;
101 }
102
103 - (void)chooseMapping:(id)sender {
104 NSInteger idx = [dockMenuBase indexOfItem:sender] - mappingsMenuIndex;
105 NJMapping *chosen = self.mappingsController.mappings[idx];
106 [_mappingsController activateMapping:chosen];
107 }
108
109 @end