2 // HMShipViewController.m
5 // Created by Hori,Masaki on 2014/03/04.
6 // Copyright (c) 2014年 Hori,Masaki. All rights reserved.
9 #import "HMShipViewController.h"
11 #import "HMAppDelegate.h"
12 #import "HMUserDefaults.h"
13 #import "HMServerDataStore.h"
16 typedef NS_ENUM(NSInteger, ViewType) {
23 @interface HMShipViewController ()
24 @property (weak) NSView *currentTableView;
25 @property (weak, nonatomic) IBOutlet NSTextField *standardDeviationField;
27 @property (readonly) NSManagedObjectContext *managedObjectContext;
29 @property (readonly) NSNumber *standardDeviation;
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;
39 - (IBAction)changeCategory:(id)sender;
41 - (IBAction)changeView:(id)sender;
44 @implementation HMShipViewController
48 self = [super initWithNibName:NSStringFromClass([self class]) bundle:nil];
54 self.currentTableView = self.expTableView;
56 [self.shipController fetchWithRequest:nil merge:YES error:NULL];
57 [self.shipController setSortDescriptors:HMStandardDefaults.shipviewSortDescriptors];
58 [self.shipController addObserver:self
59 forKeyPath:NSSortDescriptorsBinding
62 [self.shipController addObserver:self
63 forKeyPath:@"arrangedObjects"
67 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
69 selector:@selector(scrollViewDidEndLiveScrollNotification:)
70 name:NSScrollViewDidEndLiveScrollNotification
71 object:self.expTableView];
73 selector:@selector(scrollViewDidEndLiveScrollNotification:)
74 name:NSScrollViewDidEndLiveScrollNotification
75 object:self.powerTableView];
77 selector:@selector(scrollViewDidEndLiveScrollNotification:)
78 name:NSScrollViewDidEndLiveScrollNotification
79 object:self.power2TableView];
81 selector:@selector(scrollViewDidEndLiveScrollNotification:)
82 name:NSScrollViewDidEndLiveScrollNotification
83 object:self.power3TableView];
85 self.standardDeviationField.hidden = NO;
88 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
90 if([keyPath isEqualToString:NSSortDescriptorsBinding]) {
91 HMStandardDefaults.shipviewSortDescriptors = [self.shipController sortDescriptors];
94 if([keyPath isEqualToString:@"arrangedObjects"]) {
95 [self willChangeValueForKey:@"standardDeviation"];
96 [self didChangeValueForKey:@"standardDeviation"];
100 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
102 - (NSManagedObjectContext *)managedObjectContext
104 return [HMServerDataStore defaultManager].managedObjectContext;
107 - (NSNumber *)standardDeviation
109 NSArray *arrengedObjects = self.shipController.arrangedObjects;
112 if(arrengedObjects.count == 0) return @(0);
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;
121 double variance = total / arrengedObjects.count;
123 return @(sqrt(variance));
126 - (void)showViewWithNumber:(ViewType)number
128 NSView *newSelection = nil;
131 newSelection = self.expTableView;
134 newSelection = self.powerTableView;
137 newSelection = self.power2TableView;
140 newSelection = self.power3TableView;
144 if(!newSelection) return;
145 if([self.currentTableView isEqual:newSelection]) return;
148 // NSRect visibleRect = [self.currentTableView.enclosingScrollView documentVisibleRect];
150 [newSelection setFrame:[self.currentTableView frame]];
151 [newSelection setAutoresizingMask:[self.currentTableView autoresizingMask]];
152 [self.view replaceSubview:self.currentTableView with:newSelection];
153 self.currentTableView = newSelection;
155 // [self.currentTableView scrollRectToVisible:visibleRect];
156 [self.view.window makeFirstResponder:self.currentTableView];
160 - (IBAction)changeCategory:(id)sender
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];
169 - (IBAction)changeView:(id)sender
172 if([sender respondsToSelector:@selector(selectedSegment)]) {
173 NSSegmentedCell *cell = [sender cell];
174 NSUInteger index = [sender selectedSegment];
175 tag = [cell tagForSegment:index];
179 [self showViewWithNumber:tag];
182 #pragma mark - NSTableViewDelegate & NSTableViewDataSource
184 - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
186 NSView *itemView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
190 #pragma mark - NSScrollViewDidEndLiveScrollNotification
191 - (void)scrollViewDidEndLiveScrollNotification:(NSNotification *)notification
193 id object = [notification object];
195 NSRect visibleRect = [object documentVisibleRect];
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];