Remove website, now in yukkurigames.com repository.
[enjoyable.git] / Classes / NJMappingsViewController.m
1 //
2 // NJMappingsViewController.m
3 // Enjoyable
4 //
5 // Created by Joe Wreschnig on 3/17/13.
6 //
7 //
8
9 #import "NJMappingsViewController.h"
10
11 #import "NJMapping.h"
12
13 #define PB_ROW @"com.yukkurigames.Enjoyable.MappingRow"
14
15
16 @implementation NJMappingsViewController
17
18 - (void)awakeFromNib {
19 [self.mappingList registerForDraggedTypes:@[PB_ROW, NSURLPboardType]];
20 [self.mappingList setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
21 }
22
23 - (IBAction)addClicked:(id)sender {
24 NJMapping *newMapping = [[NJMapping alloc] init];
25 [self.delegate mappingsViewController:self addMapping:newMapping];
26 }
27
28 - (IBAction)removeClicked:(id)sender {
29 [self.delegate mappingsViewController:self
30 removeMappingAtIndex:self.mappingList.selectedRow];
31 }
32
33 - (IBAction)moveUpClicked:(id)sender {
34 NSInteger fromIdx = self.mappingList.selectedRow;
35 NSInteger toIdx = fromIdx - 1;
36 [self.delegate mappingsViewController:self
37 moveMappingFromIndex:fromIdx
38 toIndex:toIdx];
39 [self.mappingList scrollRowToVisible:toIdx];
40 [self.mappingList selectRowIndexes:[[NSIndexSet alloc] initWithIndex:toIdx]
41 byExtendingSelection:NO];
42 }
43
44 - (IBAction)moveDownClicked:(id)sender {
45 NSInteger fromIdx = self.mappingList.selectedRow;
46 NSInteger toIdx = fromIdx + 1;
47 [self.delegate mappingsViewController:self
48 moveMappingFromIndex:fromIdx
49 toIndex:toIdx];
50 [self.mappingList scrollRowToVisible:toIdx];
51 [self.mappingList selectRowIndexes:[[NSIndexSet alloc] initWithIndex:toIdx]
52 byExtendingSelection:NO];
53 }
54
55 - (IBAction)mappingTriggerClicked:(id)sender {
56 [self.mappingListPopover showRelativeToRect:self.mappingListTrigger.bounds
57 ofView:self.mappingListTrigger
58 preferredEdge:NSMinXEdge];
59 self.mappingListTrigger.state = NSOnState;
60 }
61
62 - (void)popoverWillShow:(NSNotification *)notification {
63 self.mappingListTrigger.state = NSOnState;
64 }
65
66 - (void)popoverWillClose:(NSNotification *)notification {
67 self.mappingListTrigger.state = NSOffState;
68 }
69
70 - (void)beginUpdates {
71 [self.mappingList beginUpdates];
72 }
73
74 - (void)endUpdates {
75 [self.mappingList endUpdates];
76 [self changedActiveMappingToIndex:self.mappingList.selectedRow];
77 }
78
79 - (void)addedMappingAtIndex:(NSInteger)index startEditing:(BOOL)startEditing {
80 [self.mappingList abortEditing];
81 [self.mappingList insertRowsAtIndexes:[[NSIndexSet alloc] initWithIndex:index]
82 withAnimation:startEditing ? 0 : NSTableViewAnimationSlideLeft];
83 if (startEditing) {
84 [self.mappingListTrigger performClick:self];
85 [self.mappingList editColumn:0 row:index withEvent:nil select:YES];
86 [self.mappingList scrollRowToVisible:index];
87 }
88 }
89
90 - (void)removedMappingAtIndex:(NSInteger)index {
91 [self.mappingList abortEditing];
92 [self.mappingList removeRowsAtIndexes:[[NSIndexSet alloc] initWithIndex:index]
93 withAnimation:NSTableViewAnimationEffectFade];
94 }
95
96 - (void)changedActiveMappingToIndex:(NSInteger)index {
97 NJMapping *mapping = [self.delegate mappingsViewController:self
98 mappingForIndex:index];
99 self.removeMapping.enabled = [self.delegate mappingsViewController:self
100 canRemoveMappingAtIndex:index];
101 self.moveUp.enabled = [self.delegate mappingsViewController:self
102 canMoveMappingFromIndex:index toIndex:index - 1];
103 self.moveDown.enabled = [self.delegate mappingsViewController:self
104 canMoveMappingFromIndex:index toIndex:index + 1];
105 self.mappingListTrigger.title = mapping.name;
106 [self.mappingList selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO];
107 [self.mappingList scrollRowToVisible:index];
108 [NSUserDefaults.standardUserDefaults setInteger:index forKey:@"selected"];
109
110 }
111
112 - (void)tableViewSelectionDidChange:(NSNotification *)note {
113 [self.mappingList abortEditing];
114 NSTableView *tableView = note.object;
115 [self.delegate mappingsViewController:self
116 choseMappingAtIndex:tableView.selectedRow];
117 }
118
119 - (id)tableView:(NSTableView *)view objectValueForTableColumn:(NSTableColumn *)column row:(NSInteger)index {
120 return [self.delegate mappingsViewController:self
121 mappingForIndex:index].name;
122 }
123
124 - (void)tableView:(NSTableView *)view
125 setObjectValue:(NSString *)obj
126 forTableColumn:(NSTableColumn *)col
127 row:(NSInteger)index {
128 [self.delegate mappingsViewController:self
129 renameMappingAtIndex:index
130 toName:obj];
131 }
132
133 - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
134 return [self.delegate numberOfMappings:self];
135 }
136
137 - (BOOL)tableView:(NSTableView *)tableView
138 acceptDrop:(id <NSDraggingInfo>)info
139 row:(NSInteger)row
140 dropOperation:(NSTableViewDropOperation)dropOperation {
141 NSPasteboard *pboard = [info draggingPasteboard];
142 if ([pboard.types containsObject:PB_ROW]) {
143 NSString *value = [pboard stringForType:PB_ROW];
144 NSInteger srcRow = [value intValue];
145 row -= srcRow < row;
146 [self.delegate mappingsViewController:self
147 moveMappingFromIndex:srcRow
148 toIndex:row];
149 return YES;
150 } else if ([pboard.types containsObject:NSURLPboardType]) {
151 NSURL *url = [NSURL URLFromPasteboard:pboard];
152 NSError *error;
153 if (![self.delegate mappingsViewController:self
154 importMappingFromURL:url
155 atIndex:row
156 error:&error]) {
157 [tableView presentError:error];
158 return NO;
159 } else {
160 return YES;
161 }
162 } else {
163 return NO;
164 }
165 }
166
167 - (NSDragOperation)tableView:(NSTableView *)tableView
168 validateDrop:(id <NSDraggingInfo>)info
169 proposedRow:(NSInteger)row
170 proposedDropOperation:(NSTableViewDropOperation)dropOperation {
171 NSPasteboard *pboard = [info draggingPasteboard];
172 if ([pboard.types containsObject:PB_ROW]) {
173 [tableView setDropRow:MAX(1, row) dropOperation:NSTableViewDropAbove];
174 return NSDragOperationMove;
175 } else if ([pboard.types containsObject:NSURLPboardType]) {
176 NSURL *url = [NSURL URLFromPasteboard:pboard];
177 if ([url.pathExtension isEqualToString:@"enjoyable"]) {
178 [tableView setDropRow:MAX(1, row) dropOperation:NSTableViewDropAbove];
179 return NSDragOperationCopy;
180 } else {
181 return NSDragOperationNone;
182 }
183 } else {
184 return NSDragOperationNone;
185 }
186 }
187
188 - (NSArray *)tableView:(NSTableView *)tableView
189 namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination
190 forDraggedRowsWithIndexes:(NSIndexSet *)indexSet {
191 NJMapping *toSave = [self.delegate mappingsViewController:self
192 mappingForIndex:indexSet.firstIndex];
193 NSString *filename = [[toSave.name stringByFixingPathComponent]
194 stringByAppendingPathExtension:@"enjoyable"];
195 NSURL *dst = [dropDestination URLByAppendingPathComponent:filename];
196 dst = [NSFileManager.defaultManager generateUniqueURLWithBase:dst];
197 NSError *error;
198 if (![toSave writeToURL:dst error:&error]) {
199 [tableView presentError:error];
200 return @[];
201 } else {
202 return @[dst.lastPathComponent];
203 }
204 }
205
206 - (BOOL)tableView:(NSTableView *)tableView
207 writeRowsWithIndexes:(NSIndexSet *)rowIndexes
208 toPasteboard:(NSPasteboard *)pboard {
209 if (rowIndexes.count == 1 && rowIndexes.firstIndex != 0) {
210 [pboard declareTypes:@[PB_ROW, NSFilesPromisePboardType] owner:nil];
211 [pboard setString:@(rowIndexes.firstIndex).stringValue forType:PB_ROW];
212 [pboard setPropertyList:@[@"enjoyable"] forType:NSFilesPromisePboardType];
213 return YES;
214 } else if (rowIndexes.count == 1 && rowIndexes.firstIndex == 0) {
215 [pboard declareTypes:@[NSFilesPromisePboardType] owner:nil];
216 [pboard setPropertyList:@[@"enjoyable"] forType:NSFilesPromisePboardType];
217 return YES;
218 } else {
219 return NO;
220 }
221 }
222
223 - (void)reloadData {
224 [self.mappingList reloadData];
225 }
226
227 @end
228