2 // HMVerticalFleetViewController.m
5 // Created by Hori,Masaki on 2015/11/22.
6 // Copyright (c) 2015年 Hori,Masaki. All rights reserved.
9 #import "HMVerticalFleetViewController.h"
10 #import "HMShipDetailViewController.h"
11 #import "HMMinimumShipViewController.h"
13 #import "HMAppDelegate.h"
15 #import "HMKCShipObject+Extensions.h"
16 #import "HMKCDeck+Extension.h"
18 #import "HMServerDataStore.h"
20 #import "HMAnchorageRepairManager.h"
23 static const NSInteger maxFleetNumber = 4;
25 @interface HMVerticalFleetViewController ()
27 @property (weak) Class shipViewClass;
29 @property (readwrite) HMFleetViewType type;
31 @property (nonatomic, weak) IBOutlet NSView *placeholder01;
32 @property (nonatomic, weak) IBOutlet NSView *placeholder02;
33 @property (nonatomic, weak) IBOutlet NSView *placeholder03;
34 @property (nonatomic, weak) IBOutlet NSView *placeholder04;
35 @property (nonatomic, weak) IBOutlet NSView *placeholder05;
36 @property (nonatomic, weak) IBOutlet NSView *placeholder06;
38 @property (strong) HMShipDetailViewController *detail01;
39 @property (strong) HMShipDetailViewController *detail02;
40 @property (strong) HMShipDetailViewController *detail03;
41 @property (strong) HMShipDetailViewController *detail04;
42 @property (strong) HMShipDetailViewController *detail05;
43 @property (strong) HMShipDetailViewController *detail06;
44 @property (strong) NSArray *details;
46 @property (readonly) NSArray *shipKeys;
49 @property (strong) NSArray *anchorageRepairHolder;
50 @property (strong) HMAnchorageRepairManager *anchorageRepair;
51 @property (readonly) NSNumber *repairTime;
52 @property (readonly) NSNumber *repairableShipCount;
56 @implementation HMVerticalFleetViewController
57 @synthesize fleetNumber = _fleetNumber;
58 @synthesize shipOrder = _shipOrder;
62 return [[[self class] alloc] initWithViewType:miniVierticalType];
65 - (instancetype)initWithViewType:(HMFleetViewType)type
67 Class shipViewClass = Nil;
68 NSString *nibName = nil;
71 nibName = NSStringFromClass([self class]);
72 shipViewClass = [HMShipDetailViewController class];
75 nibName = @"HMFleetMinimumViewController";
76 shipViewClass = [HMMinimumShipViewController class];
78 case miniVierticalType:
79 nibName = @"HMVerticalFleetViewController";
80 shipViewClass = [HMMinimumShipViewController class];
85 self = [super initWithNibName:@"" bundle:nil];
86 NSLog(@"UnknownType");
90 self = [super initWithNibName:nibName bundle:nil];
93 _shipViewClass = shipViewClass;
95 [self buildAnchorageRepairHolder];
102 for(NSString *key in self.shipKeys) {
103 [self.representedObject removeObserver:self
110 NSMutableArray *details = [NSMutableArray new];
111 NSArray *detailKeys = @[@"detail01", @"detail02", @"detail03", @"detail04", @"detail05", @"detail06"];
112 [detailKeys enumerateObjectsUsingBlock:^(id detailKey, NSUInteger idx, BOOL *stop) {
113 HMShipDetailViewController *detail = [self.shipViewClass new];
114 detail.title = [NSString stringWithFormat:@"%ld", idx + 1];
115 [self setValue:detail forKey:detailKey];
117 [details addObject:detail];
119 self.details = details;
121 NSArray *placeholderKeys = @[@"placeholder01", @"placeholder02", @"placeholder03", @"placeholder04", @"placeholder05", @"placeholder06"];
122 [placeholderKeys enumerateObjectsUsingBlock:^(id placeholderKey, NSUInteger idx, BOOL *stop) {
123 NSView *view = [self valueForKey:placeholderKey];
124 HMShipDetailViewController *detail = self.details[idx];
125 [detail.view setFrame:[view frame]];
126 [detail.view setAutoresizingMask:[view autoresizingMask]];
127 [[view superview] replaceSubview:view with:detail.view];
130 self.fleetNumber = 1;
133 - (NSArray *)shipKeys
135 static NSArray *shipKeys = nil;
136 if(shipKeys) return shipKeys;
138 shipKeys = @[@"ship_0", @"ship_1", @"ship_2", @"ship_3", @"ship_4", @"ship_5"];
142 - (void)setShipOfViewForKey:(NSString *)key
144 NSUInteger index = [self.shipKeys indexOfObject:key];
145 if(index != NSNotFound) {
146 NSUInteger shipID = [[self.fleet valueForKey:key] integerValue];
147 [self setShipID:shipID
148 toDetail:self.details[index]];
152 - (void)setShipID:(NSInteger)shipId toDetail:(HMShipDetailViewController *)detail
154 HMServerDataStore *store = [HMServerDataStore defaultManager];
155 NSError *error = nil;
156 HMKCShipObject *ship = nil;
157 NSArray *array = [store objectsWithEntityName:@"Ship"
159 predicateFormat:@"id = %ld", shipId];
161 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
163 if(array.count != 0) {
168 [self willChangeValueForKey:@"repairableShipCount"];
169 [self didChangeValueForKey:@"repairableShipCount"];
171 - (void)setFleet:(HMKCDeck *)fleet
173 for(NSString *key in self.shipKeys) {
174 [self.representedObject removeObserver:self
177 [fleet addObserver:self
183 self.representedObject = fleet;
184 self.title = fleet.name;
186 for(NSString *key in self.shipKeys) {
187 [self setShipOfViewForKey:key];
192 return self.representedObject;
195 - (void)setFleetNumber:(NSInteger)fleetNumber
197 HMServerDataStore *store = [HMServerDataStore defaultManager];
198 NSError *error = nil;
199 NSArray *array = [store objectsWithEntityName:@"Deck"
201 predicateFormat:@"id = %ld", fleetNumber];
203 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
206 if(array.count == 0) {
210 self.fleet = array[0];
211 _fleetNumber = fleetNumber;
213 self.anchorageRepair = self.anchorageRepairHolder[fleetNumber - 1];
215 - (NSInteger)fleetNumber
220 - (void)setShipOrder:(HMFleetViewShipOrder)shipOrder
222 if(_shipOrder == shipOrder) return;
223 _shipOrder = shipOrder;
227 [self reorderShipToDoubleLine];
230 [self reorderShipToLeftToRight];
234 - (HMFleetViewShipOrder)shipOrder
241 return self.type == detailViewType;
243 - (CGFloat)normalHeight
245 // switch(self.type) {
246 // case detailViewType:
247 // return HMFleetViewController.detailViewHeight;
248 // case minimumViewType:
249 // return HMFleetViewController.oldStyleFleetViewHeight;
253 - (CGFloat)upsideHeight
255 // switch(self.type) {
256 // case detailViewType:
258 // case minimumViewType:
259 // return HMFleetViewController.oldStyleFleetViewHeight;
264 + (CGFloat)oldStyleFleetViewHeight
268 + (CGFloat)detailViewHeight
272 + (CGFloat)heightDifference
274 return self.detailViewHeight - self.oldStyleFleetViewHeight;
278 + (NSSet *)keyPathsForValuesAffectingTotalSakuteki
280 return [NSSet setWithObjects:
281 @"detail01.ship.sakuteki_0",
282 @"detail02.ship.sakuteki_0",
283 @"detail03.ship.sakuteki_0",
284 @"detail04.ship.sakuteki_0",
285 @"detail05.ship.sakuteki_0",
286 @"detail06.ship.sakuteki_0",
289 - (NSNumber *)totalSakuteki
292 for(HMShipDetailViewController *detail in self.details) {
293 HMKCShipObject *ship = detail.ship;
294 total += ship.sakuteki_0.integerValue;
299 + (NSSet *)keyPathsForValuesAffectingTotalSeiku
301 return [NSSet setWithObjects:
302 @"detail01.ship.seiku",
303 @"detail02.ship.seiku",
304 @"detail03.ship.seiku",
305 @"detail04.ship.seiku",
306 @"detail05.ship.seiku",
307 @"detail06.ship.seiku",
310 - (NSNumber *)totalSeiku
313 for(HMShipDetailViewController *detail in self.details) {
314 HMKCShipObject *ship = detail.ship;
315 total += ship.seiku.integerValue;
319 + (NSSet *)keyPathsForValuesAffectingTotalCalclatedSeiku
321 return [NSSet setWithObjects:
322 @"detail01.ship.seiku",
323 @"detail02.ship.seiku",
324 @"detail03.ship.seiku",
325 @"detail04.ship.seiku",
326 @"detail05.ship.seiku",
327 @"detail06.ship.seiku",
330 - (NSNumber *)totalCalclatedSeiku
333 for(HMShipDetailViewController *detail in self.details) {
334 HMKCShipObject *ship = detail.ship;
335 total += ship.seiku.integerValue;
336 total += ship.extraSeiku.integerValue;
340 + (NSSet *)keyPathsForValuesAffectingTotalLevel
342 return [NSSet setWithObjects:
351 - (NSNumber *)totalLevel
354 for(HMShipDetailViewController *detail in self.details) {
355 HMKCShipObject *ship = detail.ship;
356 total += ship.lv.integerValue;
360 + (NSSet *)keyPathsForValuesAffectingTotalDrums
362 return [NSSet setWithObjects:
363 @"detail01.ship.totalDrums",
364 @"detail02.ship.totalDrums",
365 @"detail03.ship.totalDrums",
366 @"detail04.ship.totalDrums",
367 @"detail05.ship.totalDrums",
368 @"detail06.ship.totalDrums",
371 - (NSNumber *)totalDrums
374 for(HMShipDetailViewController *detail in self.details) {
375 HMKCShipObject *ship = detail.ship;
376 total += ship.totalDrums.integerValue;
381 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
383 if([self.shipKeys containsObject:keyPath]) {
384 [self setShipOfViewForKey:keyPath];
388 return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
391 - (IBAction)selectNextFleet:(id)sender
393 NSInteger next = self.fleetNumber + 1;
394 self.fleetNumber = next <= maxFleetNumber ? next : 1;
396 - (IBAction)selectPreviousFleet:(id)sender
398 NSInteger prev = self.fleetNumber - 1;
399 self.fleetNumber = prev > 0 ? prev : 4;
403 - (void)reorderShipToDoubleLine
405 NSView *view02 = self.detail02.view;
406 NSView *view03 = self.detail03.view;
407 NSView *view04 = self.detail04.view;
408 NSView *view05 = self.detail05.view;
410 NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
411 NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
412 NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
413 NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
415 view02.autoresizingMask = options04;
416 view03.autoresizingMask = options02;
417 view04.autoresizingMask = options05;
418 view05.autoresizingMask = options03;
420 NSRect frame02 = view02.frame;
421 NSRect frame03 = view03.frame;
422 NSRect frame04 = view04.frame;
423 NSRect frame05 = view05.frame;
425 if(self.enableAnimation) {
426 view02.animator.frame = frame04;
427 view03.animator.frame = frame02;
428 view04.animator.frame = frame05;
429 view05.animator.frame = frame03;
431 view02.frame = frame04;
432 view03.frame = frame02;
433 view04.frame = frame05;
434 view05.frame = frame03;
437 - (void)reorderShipToLeftToRight
439 NSView *view02 = self.detail02.view;
440 NSView *view03 = self.detail03.view;
441 NSView *view04 = self.detail04.view;
442 NSView *view05 = self.detail05.view;
444 NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
445 NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
446 NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
447 NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
449 view02.autoresizingMask = options03;
450 view03.autoresizingMask = options05;
451 view04.autoresizingMask = options02;
452 view05.autoresizingMask = options04;
454 NSRect frame02 = view02.frame;
455 NSRect frame03 = view03.frame;
456 NSRect frame04 = view04.frame;
457 NSRect frame05 = view05.frame;
459 if(self.enableAnimation) {
460 view02.animator.frame = frame03;
461 view03.animator.frame = frame05;
462 view04.animator.frame = frame02;
463 view05.animator.frame = frame04;
465 view02.frame = frame03;
466 view03.frame = frame05;
467 view04.frame = frame02;
468 view05.frame = frame04;
473 - (void)buildAnchorageRepairHolder
475 HMServerDataStore *store = [HMServerDataStore defaultManager];
476 NSError *error = nil;
477 NSArray *array = [store objectsWithEntityName:@"Deck"
478 sortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES]]
482 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
485 if(array.count == 0) {
488 if(array.count < 4) {
493 NSMutableArray *anchorageRepairs = [NSMutableArray new];
494 for(HMKCDeck *deck in array) {
495 id anchorageRepair = [[HMAnchorageRepairManager alloc] initWithDeck:deck];
496 [anchorageRepairs addObject:anchorageRepair];
498 self.anchorageRepairHolder = anchorageRepairs;
500 HMAppDelegate *appDelegate = [[NSApplication sharedApplication] delegate];
501 [appDelegate addCounterUpdateBlock:^{
502 [self willChangeValueForKey:@"repairTime"];
503 [self didChangeValueForKey:@"repairTime"];
506 + (NSSet *)keyPathsForValuesAffectingRepairTime
508 return [NSSet setWithObjects:@"anchorageRepair.repairTime", @"anchorageRepair", nil];
510 - (NSNumber *)repairTime
512 NSDate *compTimeValue = self.anchorageRepair.repairTime;
513 if(!compTimeValue) return nil;
515 NSTimeInterval compTime = [compTimeValue timeIntervalSince1970];
516 NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
517 NSTimeInterval diff = compTime - [now timeIntervalSince1970];
518 return @(diff + 20 * 60);
520 + (NSSet *)keyPathsForValuesAffectingRepairableShipCount
522 return [NSSet setWithObjects:
523 @"anchorageRepair.repairableShipCount", @"anchorageRepair",
528 - (NSNumber *)repairableShipCount
530 return self.anchorageRepair.repairableShipCount;