OSDN Git Service

編成支援に速力、射程、艦載機搭載数を追加
[kcd/KCD.git] / KCD / HMShipViewController.m
1 //
2 //  HMShipViewController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/03/04.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMShipViewController.h"
10
11 #import "HMAppDelegate.h"
12 #import "HMUserDefaults.h"
13 #import "HMServerDataStore.h"
14
15
16 typedef NS_ENUM(NSInteger, ViewType) {
17         kExpView = 0,
18         kPowerView = 1,
19         kPower2View = 2,
20         kPower3View = 3,
21 };
22
23 @interface HMShipViewController ()
24 @property (weak) NSView *currentTableView;
25 @property (weak, nonatomic) IBOutlet NSTextField *standardDeviationField;
26
27 @property (readonly) NSManagedObjectContext *managedObjectContext;
28
29 @property (readonly) NSNumber *standardDeviation;
30
31
32 @property (nonatomic, strong) IBOutlet NSArrayController *shipController;
33 @property (nonatomic, strong) IBOutlet NSScrollView *expTableView;
34 @property (nonatomic, strong) IBOutlet NSScrollView *powerTableView;
35 @property (nonatomic, strong) IBOutlet NSScrollView *power2TableView;
36 @property (nonatomic, strong) IBOutlet NSScrollView *power3TableView;
37
38
39 - (IBAction)changeCategory:(id)sender;
40
41 - (IBAction)changeView:(id)sender;
42 @end
43
44 @implementation HMShipViewController
45
46 - (id)init
47 {
48         self = [super initWithNibName:NSStringFromClass([self class]) bundle:nil];
49         return self;
50 }
51
52 - (void)awakeFromNib
53 {
54         self.currentTableView = self.expTableView;
55         
56         [self.shipController fetchWithRequest:nil merge:YES error:NULL];
57         [self.shipController setSortDescriptors:HMStandardDefaults.shipviewSortDescriptors];
58         [self.shipController addObserver:self
59                                                   forKeyPath:NSSortDescriptorsBinding
60                                                          options:0
61                                                          context:NULL];
62         [self.shipController addObserver:self
63                                                   forKeyPath:@"arrangedObjects"
64                                                          options:0
65                                                          context:NULL];
66         
67         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
68         [nc addObserver:self
69                    selector:@selector(scrollViewDidEndLiveScrollNotification:)
70                            name:NSScrollViewDidEndLiveScrollNotification
71                          object:self.expTableView];
72         [nc addObserver:self
73                    selector:@selector(scrollViewDidEndLiveScrollNotification:)
74                            name:NSScrollViewDidEndLiveScrollNotification
75                          object:self.powerTableView];
76         [nc addObserver:self
77                    selector:@selector(scrollViewDidEndLiveScrollNotification:)
78                            name:NSScrollViewDidEndLiveScrollNotification
79                          object:self.power2TableView];
80         [nc addObserver:self
81                    selector:@selector(scrollViewDidEndLiveScrollNotification:)
82                            name:NSScrollViewDidEndLiveScrollNotification
83                          object:self.power3TableView];
84 #ifdef DEBUG
85         self.standardDeviationField.hidden = NO;
86 #endif
87 }
88 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
89 {
90         if([keyPath isEqualToString:NSSortDescriptorsBinding]) {
91                 HMStandardDefaults.shipviewSortDescriptors = [self.shipController sortDescriptors];
92                 return;
93         }
94         if([keyPath isEqualToString:@"arrangedObjects"]) {
95                 [self willChangeValueForKey:@"standardDeviation"];
96                 [self didChangeValueForKey:@"standardDeviation"];
97                 return;
98         }
99         
100         [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
101 }
102 - (NSManagedObjectContext *)managedObjectContext
103 {
104         return [HMServerDataStore defaultManager].managedObjectContext;
105 }
106
107 - (NSNumber *)standardDeviation
108 {
109         NSArray *arrengedObjects = self.shipController.arrangedObjects;
110         double total = 0.0;
111         
112         if(arrengedObjects.count == 0) return @(0);
113         
114         NSNumber *avgValue = [self.shipController valueForKeyPath:@"arrangedObjects.@avg.lv"];
115         double avg = avgValue.doubleValue;
116         for(id ship in arrengedObjects) {
117                 NSInteger lv = [[ship valueForKey:@"lv"] integerValue];
118                 double delta = lv - avg;
119                 total += delta * delta;
120         }
121         double variance = total / arrengedObjects.count;
122         
123         return @(sqrt(variance));
124 }
125
126 - (void)showViewWithNumber:(ViewType)number
127 {
128         NSView *newSelection = nil;
129         switch (number) {
130                 case kExpView:
131                         newSelection = self.expTableView;
132                         break;
133                 case kPowerView:
134                         newSelection = self.powerTableView;
135                         break;
136                 case kPower2View:
137                         newSelection = self.power2TableView;
138                         break;
139                 case kPower3View:
140                         newSelection = self.power3TableView;
141                         break;
142         }
143         
144         if(!newSelection) return;
145         if([self.currentTableView isEqual:newSelection]) return;
146         
147         
148 //      NSRect visibleRect = [self.currentTableView.enclosingScrollView documentVisibleRect];
149         
150         [newSelection setFrame:[self.currentTableView frame]];
151         [newSelection setAutoresizingMask:[self.currentTableView autoresizingMask]];
152         [self.view replaceSubview:self.currentTableView with:newSelection];
153         self.currentTableView = newSelection;
154         
155 //      [self.currentTableView scrollRectToVisible:visibleRect];
156         [self.view.window makeFirstResponder:self.currentTableView];
157 }
158
159
160 - (IBAction)changeCategory:(id)sender
161 {
162         NSUInteger tag = [sender selectedSegment];
163         HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
164         NSPredicate *predicate = [appDelegate predicateForShipType:tag];
165         [self.shipController setFilterPredicate:predicate];
166         [self.shipController rearrangeObjects];
167 }
168
169 - (IBAction)changeView:(id)sender
170 {
171         NSInteger tag = -1;
172         if([sender respondsToSelector:@selector(selectedSegment)]) {
173                 NSSegmentedCell *cell = [sender cell];
174                 NSUInteger index = [sender selectedSegment];
175                 tag = [cell tagForSegment:index];
176         } else {
177                 tag = [sender tag];
178         }
179         [self showViewWithNumber:tag];
180 }
181
182 #pragma mark - NSTableViewDelegate & NSTableViewDataSource
183
184 - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
185 {
186         NSView *itemView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
187         return itemView;
188 }
189
190 #pragma mark - NSScrollViewDidEndLiveScrollNotification
191 - (void)scrollViewDidEndLiveScrollNotification:(NSNotification *)notification
192 {
193         id object = [notification object];
194         
195         NSRect visibleRect = [object documentVisibleRect];
196         
197         for(id item in @[self.expTableView, self.powerTableView, self.power2TableView, self.power3TableView]) {
198                 if(![object isEqual:item]) {
199                         NSView *view = [item documentView];
200                         [view scrollRectToVisible:visibleRect];
201                 }
202         }
203 }
204 @end