No more visible ivars.
[enjoyable.git] / Classes / NJOutputViewController.m
1 //
2 // NJOutputController.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 #import "NJOutputViewController.h"
9
10 #import "NJMapping.h"
11 #import "NJInput.h"
12 #import "NJEvents.h"
13 #import "NJInputController.h"
14 #import "NJKeyInputField.h"
15 #import "NJOutputMapping.h"
16 #import "NJOutputViewController.h"
17 #import "NJOutputKeyPress.h"
18 #import "NJOutputMouseButton.h"
19 #import "NJOutputMouseMove.h"
20 #import "NJOutputMouseScroll.h"
21
22 @implementation NJOutputViewController {
23 NJInput *_input;
24 }
25
26 - (id)init {
27 if ((self = [super init])) {
28 [NSNotificationCenter.defaultCenter
29 addObserver:self
30 selector:@selector(mappingListDidChange:)
31 name:NJEventMappingListChanged
32 object:nil];
33 }
34 return self;
35 }
36
37 - (void)dealloc {
38 [NSNotificationCenter.defaultCenter removeObserver:self];
39 }
40
41 - (void)cleanUpInterface {
42 NSInteger row = self.radioButtons.selectedRow;
43
44 if (row != 1) {
45 self.keyInput.keyCode = NJKeyInputFieldEmpty;
46 [self.keyInput resignIfFirstResponder];
47 }
48
49 if (row != 2) {
50 [self.mappingPopup selectItemAtIndex:-1];
51 [self.mappingPopup resignIfFirstResponder];
52 self.unknownMapping.hidden = YES;
53 }
54
55 if (row != 3) {
56 self.mouseDirSelect.selectedSegment = -1;
57 self.mouseSpeedSlider.floatValue = self.mouseSpeedSlider.minValue;
58 [self.mouseDirSelect resignIfFirstResponder];
59 } else {
60 if (self.mouseDirSelect.selectedSegment == -1)
61 self.mouseDirSelect.selectedSegment = 0;
62 if (!self.mouseSpeedSlider.floatValue)
63 self.mouseSpeedSlider.floatValue = 10;
64 }
65
66 if (row != 4) {
67 self.mouseBtnSelect.selectedSegment = -1;
68 [self.mouseBtnSelect resignIfFirstResponder];
69 } else if (self.mouseBtnSelect.selectedSegment == -1)
70 self.mouseBtnSelect.selectedSegment = 0;
71
72 if (row != 5) {
73 self.scrollDirSelect.selectedSegment = -1;
74 self.scrollSpeedSlider.floatValue = self.scrollSpeedSlider.minValue;
75 self.smoothCheck.state = NSOffState;
76 [self.scrollDirSelect resignIfFirstResponder];
77 [self.scrollSpeedSlider resignIfFirstResponder];
78 [self.smoothCheck resignIfFirstResponder];
79 } else {
80 if (self.scrollDirSelect.selectedSegment == -1)
81 self.scrollDirSelect.selectedSegment = 0;
82 }
83
84 }
85
86 - (IBAction)radioChanged:(NSView *)sender {
87 [sender.window makeFirstResponder:sender];
88 if (self.radioButtons.selectedRow == 1)
89 [self.keyInput.window makeFirstResponder:self.keyInput];
90 [self commit];
91 }
92
93 - (void)keyInputField:(NJKeyInputField *)keyInput didChangeKey:(CGKeyCode)keyCode {
94 [self.radioButtons selectCellAtRow:1 column:0];
95 [self.radioButtons.window makeFirstResponder:self.radioButtons];
96 [self commit];
97 }
98
99 - (void)keyInputFieldDidClear:(NJKeyInputField *)keyInput {
100 [self.radioButtons selectCellAtRow:0 column:0];
101 [self commit];
102 }
103
104 - (void)mappingChosen:(id)sender {
105 [self.radioButtons selectCellAtRow:2 column:0];
106 [self.mappingPopup.window makeFirstResponder:self.mappingPopup];
107 self.unknownMapping.hidden = YES;
108 [self commit];
109 }
110
111 - (void)mdirChanged:(NSView *)sender {
112 [self.radioButtons selectCellAtRow:3 column:0];
113 [sender.window makeFirstResponder:sender];
114 [self commit];
115 }
116
117 - (void)mouseSpeedChanged:(NSSlider *)sender {
118 [self.radioButtons selectCellAtRow:3 column:0];
119 [sender.window makeFirstResponder:sender];
120 [self commit];
121 }
122
123 - (void)mbtnChanged:(NSView *)sender {
124 [self.radioButtons selectCellAtRow:4 column:0];
125 [sender.window makeFirstResponder:sender];
126 [self commit];
127 }
128
129 - (void)sdirChanged:(NSView *)sender {
130 [self.radioButtons selectCellAtRow:5 column:0];
131 [sender.window makeFirstResponder:sender];
132 [self commit];
133 }
134
135 - (void)scrollSpeedChanged:(NSSlider *)sender {
136 [self.radioButtons selectCellAtRow:5 column:0];
137 [sender.window makeFirstResponder:sender];
138 [self commit];
139 }
140
141 - (IBAction)scrollTypeChanged:(NSButton *)sender {
142 [self.radioButtons selectCellAtRow:5 column:0];
143 [sender.window makeFirstResponder:sender];
144 if (sender.state == NSOnState) {
145 self.scrollSpeedSlider.floatValue =
146 self.scrollSpeedSlider.minValue
147 + (self.scrollSpeedSlider.maxValue - self.scrollSpeedSlider.minValue) / 2;
148 self.scrollSpeedSlider.enabled = YES;
149 } else {
150 self.scrollSpeedSlider.floatValue = self.scrollSpeedSlider.minValue;
151 self.scrollSpeedSlider.enabled = NO;
152 }
153 [self commit];
154 }
155
156 - (NJOutput *)makeOutput {
157 switch (self.radioButtons.selectedRow) {
158 case 0:
159 return nil;
160 case 1:
161 if (self.keyInput.hasKeyCode) {
162 NJOutputKeyPress *k = [[NJOutputKeyPress alloc] init];
163 k.keyCode = self.keyInput.keyCode;
164 return k;
165 } else {
166 return nil;
167 }
168 break;
169 case 2: {
170 NJOutputMapping *c = [[NJOutputMapping alloc] init];
171 c.mapping = [self.delegate outputViewController:self
172 mappingForIndex:self.mappingPopup.indexOfSelectedItem];
173 return c;
174 }
175 case 3: {
176 NJOutputMouseMove *mm = [[NJOutputMouseMove alloc] init];
177 mm.axis = self.mouseDirSelect.selectedSegment;
178 mm.speed = self.mouseSpeedSlider.floatValue;
179 return mm;
180 }
181 case 4: {
182 NJOutputMouseButton *mb = [[NJOutputMouseButton alloc] init];
183 mb.button = [self.mouseBtnSelect.cell tagForSegment:self.mouseBtnSelect.selectedSegment];
184 return mb;
185 }
186 case 5: {
187 NJOutputMouseScroll *ms = [[NJOutputMouseScroll alloc] init];
188 ms.direction = [self.scrollDirSelect.cell tagForSegment:self.scrollDirSelect.selectedSegment];
189 ms.speed = self.scrollSpeedSlider.floatValue;
190 ms.smooth = self.smoothCheck.state == NSOnState;
191 return ms;
192 }
193 default:
194 return nil;
195 }
196 }
197
198 - (void)commit {
199 [self cleanUpInterface];
200 [self.delegate outputViewController:self
201 setOutput:[self makeOutput]
202 forInput:_input];
203 }
204
205 - (BOOL)enabled {
206 return self.radioButtons.isEnabled;
207 }
208
209 - (void)setEnabled:(BOOL)enabled {
210 self.radioButtons.enabled = enabled;
211 self.keyInput.enabled = enabled;
212 self.mappingPopup.enabled = enabled;
213 self.mouseDirSelect.enabled = enabled;
214 self.mouseSpeedSlider.enabled = enabled;
215 self.mouseBtnSelect.enabled = enabled;
216 self.scrollDirSelect.enabled = enabled;
217 self.smoothCheck.enabled = enabled;
218 self.scrollSpeedSlider.enabled = enabled && self.smoothCheck.state;
219 if (!enabled)
220 self.unknownMapping.hidden = YES;
221 }
222
223 - (void)loadOutput:(NJOutput *)output forInput:(NJInput *)input {
224 _input = input;
225 if (!input) {
226 [self setEnabled:NO];
227 self.title.stringValue = @"";
228 } else {
229 [self setEnabled:YES];
230 NSString *inpFullName = input.name;
231 for (NJInputPathElement *cur = input.parent; cur; cur = cur.parent) {
232 inpFullName = [[NSString alloc] initWithFormat:@"%@ ▸ %@", cur.name, inpFullName];
233 }
234 self.title.stringValue = inpFullName;
235 }
236
237 if ([output isKindOfClass:NJOutputKeyPress.class]) {
238 [self.radioButtons selectCellAtRow:1 column:0];
239 self.keyInput.keyCode = [(NJOutputKeyPress*)output keyCode];
240 } else if ([output isKindOfClass:NJOutputMapping.class]) {
241 [self.radioButtons selectCellAtRow:2 column:0];
242 NSMenuItem *item = [self.mappingPopup itemWithIdenticalRepresentedObject:
243 [(NJOutputMapping *)output mapping]];
244 [self.mappingPopup selectItem:item];
245 self.unknownMapping.hidden = !!item;
246 self.unknownMapping.title = [(NJOutputMapping *)output mappingName];
247 }
248 else if ([output isKindOfClass:NJOutputMouseMove.class]) {
249 [self.radioButtons selectCellAtRow:3 column:0];
250 self.mouseDirSelect.selectedSegment = [(NJOutputMouseMove *)output axis];
251 self.mouseSpeedSlider.floatValue = [(NJOutputMouseMove *)output speed];
252 }
253 else if ([output isKindOfClass:NJOutputMouseButton.class]) {
254 [self.radioButtons selectCellAtRow:4 column:0];
255 [self.mouseBtnSelect selectSegmentWithTag:[(NJOutputMouseButton *)output button]];
256 }
257 else if ([output isKindOfClass:NJOutputMouseScroll.class]) {
258 [self.radioButtons selectCellAtRow:5 column:0];
259 int direction = [(NJOutputMouseScroll *)output direction];
260 float speed = [(NJOutputMouseScroll *)output speed];
261 BOOL smooth = [(NJOutputMouseScroll *)output smooth];
262 [self.scrollDirSelect selectSegmentWithTag:direction];
263 self.scrollSpeedSlider.floatValue = speed;
264 self.smoothCheck.state = smooth ? NSOnState : NSOffState;
265 self.scrollSpeedSlider.enabled = smooth;
266 } else {
267 [self.radioButtons selectCellAtRow:self.enabled ? 0 : -1 column:0];
268 }
269 [self cleanUpInterface];
270 }
271
272 - (void)focusKey {
273 if (self.radioButtons.selectedRow <= 1)
274 [self.keyInput.window makeFirstResponder:self.keyInput];
275 else
276 [self.keyInput resignIfFirstResponder];
277 }
278
279 - (void)mappingListDidChange:(NSNotification *)note {
280 NSArray *mappings = note.userInfo[NJMappingListKey];
281 NJMapping *current = self.mappingPopup.selectedItem.representedObject;
282 [self.mappingPopup.menu removeAllItems];
283 for (NJMapping *mapping in mappings) {
284 NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:mapping.name
285 action:@selector(mappingChosen:)
286 keyEquivalent:@""];
287 item.target = self;
288 item.representedObject = mapping;
289 [self.mappingPopup.menu addItem:item];
290 }
291 [self.mappingPopup selectItemWithIdenticalRepresentedObject:current];
292 }
293
294 @end