3d20e65be58d75d98300be46e8ed3083925d6b8a
[enjoyable.git] / Classes / NJDeviceViewController.m
1 //
2 // NJDeviceViewController.m
3 // Enjoyable
4 //
5 // Created by Joe Wreschnig on 3/16/13.
6 //
7 //
8
9 #import "NJDeviceViewController.h"
10
11 #import "NJInputPathElement.h"
12
13 @implementation NJDeviceViewController {
14 NSMutableArray *_devices;
15 NSMutableArray *_expanded;
16 }
17
18 - (id)init {
19 if ((self = [super init])) {
20 NSArray *expanded = [NSUserDefaults.standardUserDefaults objectForKey:@"expanded rows"];
21 if (![expanded isKindOfClass:NSArray.class])
22 expanded = @[];
23 _expanded = [[NSMutableArray alloc] initWithCapacity:MAX(16, _expanded.count)];
24 [_expanded addObjectsFromArray:expanded];
25 _devices = [[NSMutableArray alloc] initWithCapacity:16];
26 }
27 return self;
28 }
29
30 - (void)expandRecursive:(NJInputPathElement *)pathElement {
31 if (pathElement) {
32 [self expandRecursive:pathElement.parent];
33 [self.inputsTree expandItem:pathElement];
34 }
35 }
36
37 - (id)elementForUID:(NSString *)uid {
38 for (NJInputPathElement *dev in _devices) {
39 id item = [dev elementForUID:uid];
40 if (item)
41 return item;
42 }
43 return nil;
44 }
45
46 - (void)expandRecursiveByUID:(NSString *)uid {
47 [self expandRecursive:[self elementForUID:uid]];
48 }
49
50 - (void)reexpandAll {
51 for (NSString *uid in [_expanded copy])
52 [self expandRecursiveByUID:uid];
53 if (self.inputsTree.selectedRow == -1) {
54 NSString *selectedUid = [NSUserDefaults.standardUserDefaults objectForKey:@"selected input"];
55 id item = [self elementForUID:selectedUid];
56 [self.inputsTree selectItem:item];
57 }
58 }
59
60 - (void)setDevices:(NSArray *)devices {
61 _devices = [devices mutableCopy];
62 id item = self.inputsTree.selectedItem;
63 [self.inputsTree selectItem:nil];
64 [self.inputsTree reloadData];
65 [self reexpandAll];
66 [self.inputsTree selectItem:item];
67 self.noDevicesNotice.hidden = self.devices.count || !self.hidStoppedNotice.isHidden;
68 }
69
70 - (void)addedDevice:(NJDevice *)device atIndex:(NSUInteger)idx {
71 [_devices insertObject:device atIndex:idx];
72 [self.inputsTree beginUpdates];
73 [self.inputsTree insertItemsAtIndexes:[[NSIndexSet alloc] initWithIndex:idx]
74 inParent:nil
75 withAnimation:NSTableViewAnimationSlideLeft];
76 [self reexpandAll];
77 [self.inputsTree endUpdates];
78 self.noDevicesNotice.hidden = YES;
79 }
80
81 - (void)removedDevice:(NJDevice *)device atIndex:(NSUInteger)idx {
82 [_devices removeObjectAtIndex:idx];
83 [self.inputsTree beginUpdates];
84 [self.inputsTree removeItemsAtIndexes:[[NSIndexSet alloc] initWithIndex:idx]
85 inParent:nil
86 withAnimation:NSTableViewAnimationSlideLeft];
87 [self.inputsTree endUpdates];
88 self.noDevicesNotice.hidden = self.devices.count || !self.hidStoppedNotice.isHidden;
89 }
90
91 - (void)hidStarted {
92 self.noDevicesNotice.hidden = !!self.devices.count;
93 self.hidStoppedNotice.hidden = YES;
94 }
95
96 - (void)hidStopped {
97 self.hidStoppedNotice.hidden = NO;
98 self.devices = @[];
99 }
100
101 - (void)expandAndSelectItem:(NJInputPathElement *)item {
102 [self expandRecursive:item];
103 NSInteger row = [self.inputsTree rowForItem:item];
104 if (row >= 0) {
105 [self.inputsTree selectRowIndexes:[[NSIndexSet alloc] initWithIndex:row]
106 byExtendingSelection:NO];
107 [self.inputsTree scrollRowToVisible:row];
108 }
109 }
110
111 - (NSInteger)outlineView:(NSOutlineView *)outlineView
112 numberOfChildrenOfItem:(NJInputPathElement *)item {
113 return item ? item.children.count : _devices.count;
114 }
115
116 - (BOOL)outlineView:(NSOutlineView *)outlineView
117 isItemExpandable:(NJInputPathElement *)item {
118 return item ? [[item children] count] > 0: YES;
119 }
120
121 - (id)outlineView:(NSOutlineView *)outlineView
122 child:(NSInteger)index
123 ofItem:(NJInputPathElement *)item {
124 return item ? item.children[index] : _devices[index];
125 }
126
127 - (id)outlineView:(NSOutlineView *)outlineView
128 objectValueForTableColumn:(NSTableColumn *)tableColumn
129 byItem:(NJInputPathElement *)item {
130 return item ? item.name : @"root";
131 }
132
133 - (void)outlineViewSelectionDidChange:(NSNotification *)notification {
134 NSOutlineView *outlineView = notification.object;
135 NJInputPathElement *item = outlineView.selectedItem;
136 if (item) {
137 [NSUserDefaults.standardUserDefaults setObject:item.uid
138 forKey:@"selected input"];
139 if (!item.children)
140 [self.delegate deviceViewController:self
141 didSelectHandler:item];
142 else if (!item.parent)
143 [self.delegate deviceViewController:self
144 didSelectDevice:item];
145 else
146 [self.delegate deviceViewController:self
147 didSelectBranch:item];
148 } else {
149 [self.delegate deviceViewControllerDidSelectNothing:self];
150 }
151 }
152
153 - (void)outlineViewItemDidExpand:(NSNotification *)notification {
154 NSString *uid = [notification.userInfo[@"NSObject"] uid];
155 if (![_expanded containsObject:uid])
156 [_expanded addObject:uid];
157
158 }
159
160 - (void)outlineViewItemDidCollapse:(NSNotification *)notification {
161 [_expanded removeObject:[notification.userInfo[@"NSObject"] uid]];
162 }
163
164 - (BOOL)outlineView:(NSOutlineView *)outlineView
165 isGroupItem:(NJInputPathElement *)item {
166 return !item.parent;
167 }
168
169 - (BOOL)outlineView:(NSOutlineView *)outlineView
170 shouldSelectItem:(NJInputPathElement *)item {
171 return ![self outlineView:outlineView isGroupItem:item];
172 }
173
174 - (NJInputPathElement *)selectedHandler {
175 NJInputPathElement *element = self.inputsTree.selectedItem;
176 return element.children ? nil : element;
177 }
178
179
180
181 @end