2 // HMBroserWindowController.m
5 // Created by Hori,Masaki on 2014/02/11.
6 // Copyright (c) 2014年 Hori,Masaki. All rights reserved.
9 #import "HMBroserWindowController.h"
11 #import "HMAppDelegate.h"
12 #import "HMUserDefaults.h"
13 #import "HMDocksViewController.h"
14 #import "HMShipViewController.h"
15 #import "HMPowerUpSupportViewController.h"
16 #import "HMStrengthenListViewController.h"
17 #import "HMGameViewController.h"
18 #import "HMCombileViewController.h"
19 #import "HMCombinedCommand.h"
20 #import "HMFleetViewController.h"
21 #import "HMResourceViewController.h"
22 #import "HMRepairListViewController.h"
23 #import "HMAncherageRepairTimerViewController.h"
26 #import "HMServerDataStore.h"
29 typedef NS_ENUM(NSInteger, ViewType) {
36 typedef NS_ENUM(NSUInteger, FleetViewPosition) {
41 kOldStyle = 0xffffffff,
44 @interface HMBroserWindowController ()
45 @property (strong) HMGameViewController *gameViewController;
47 @property (weak) IBOutlet NSView *resourcePlaceholder;
48 @property (strong) HMResourceViewController *resourceViewController;
50 @property (weak) IBOutlet NSView *ancherageRepariTimerPlaceholder;
51 @property (strong) HMAncherageRepairTimerViewController *ancherageRepariTimerViewController;
53 @property (strong) NSNumber *flagShipID;
55 @property (strong) HMFleetViewController *fleetViewController;
56 @property FleetViewPosition fleetViewPosition;
58 @property (weak) IBOutlet NSTabView *informations;
59 @property (strong) HMDocksViewController *docksViewController;
60 @property (strong) HMShipViewController *shipViewController;
61 @property (strong) HMPowerUpSupportViewController *powerUpViewController;
62 @property (strong) HMStrengthenListViewController *strengthedListViewController;
63 @property (strong) HMRepairListViewController *repairListViewController;
66 @property (strong) HMCombileViewController *combinedViewController;
67 @property BOOL isCombinedMode;
71 @implementation HMBroserWindowController
72 @synthesize fleetViewPosition = _fleetViewPosition;
74 + (NSSet *)keyPathsForValuesAffectingFlagShipName
76 return [NSSet setWithObject:@"flagShipID"];
81 self = [super initWithWindowNibName:NSStringFromClass([self class])];
90 self.gameViewController = [HMGameViewController new];
91 [self.gameViewController.view setFrame:[self.placeholder frame]];
92 [self.gameViewController.view setFrameOrigin:NSZeroPoint];
93 [self.gameViewController.view setAutoresizingMask:[self.placeholder autoresizingMask]];
94 [self.placeholder addSubview:self.gameViewController.view];
96 self.resourceViewController = [HMResourceViewController new];
97 [self.resourceViewController.view setFrameOrigin:NSZeroPoint];
98 [self.resourcePlaceholder addSubview:self.resourceViewController.view];
100 self.ancherageRepariTimerViewController = [HMAncherageRepairTimerViewController new];
101 [self.ancherageRepariTimerViewController.view setFrameOrigin:NSZeroPoint];
102 [self.ancherageRepariTimerPlaceholder addSubview:self.ancherageRepariTimerViewController.view];
104 self.docksViewController = [HMDocksViewController new];
105 self.shipViewController = [HMShipViewController new];
106 self.powerUpViewController = [HMPowerUpSupportViewController new];
107 self.strengthedListViewController = [HMStrengthenListViewController new];
108 self.repairListViewController = [HMRepairListViewController new];
109 NSTabViewItem *item = [self.informations tabViewItemAtIndex:0];
110 item.view = self.docksViewController.view;
111 item = [self.informations tabViewItemAtIndex:1];
112 item.view = self.shipViewController.view;
113 item = [self.informations tabViewItemAtIndex:2];
114 item.view = self.powerUpViewController.view;
115 item = [self.informations tabViewItemAtIndex:3];
116 item.view = self.strengthedListViewController.view;
117 item = [self.informations tabViewItemAtIndex:4];
118 item.view = self.repairListViewController.view;
120 _fleetViewController = [HMFleetViewController viewControlerWithViewType:detailViewType];
121 [self.fleetViewController.view setFrame:[self.deckPlaceholder frame]];
122 [self.fleetViewController.view setAutoresizingMask:[self.deckPlaceholder autoresizingMask]];
123 [[self.deckPlaceholder superview] replaceSubview:self.deckPlaceholder with:self.fleetViewController.view];
124 _fleetViewPosition = kBelow;
125 [self setFleetViewPosition:HMStandardDefaults.fleetViewPosition animation:NO];
126 self.fleetViewController.enableAnimation = NO;
127 self.fleetViewController.shipOrder = HMStandardDefaults.fleetViewShipOrder;
128 self.fleetViewController.enableAnimation = YES;
130 [self bind:@"flagShipID" toObject:self.deckContoller withKeyPath:@"selection.ship_0" options:nil];
132 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
134 selector:@selector(didCangeCombined:)
135 name:HMCombinedCommandCombinedDidCangeNotification
138 if(HMStandardDefaults.lastHasCombinedView) {
139 [self showCombinedView];
143 - (void)windowWillClose:(id)notification
145 HMStandardDefaults.lastHasCombinedView = self.isCombinedMode;
148 - (NSManagedObjectContext *)managedObjectContext
150 return [HMServerDataStore defaultManager].managedObjectContext;
153 - (void)showViewWithNumber:(ViewType)type
155 [self.informations selectTabViewItemAtIndex:type];
158 - (IBAction)reloadContent:(id)sender
160 [self.gameViewController reloadContent:sender];
163 - (IBAction)deleteCacheAndReload:(id)sender
165 [self.gameViewController deleteCacheAndReload:sender];
168 - (IBAction)clearQuestList:(id)sender
170 HMServerDataStore *store = [HMServerDataStore oneTimeEditor];
171 NSArray *objects = [store objectsWithEntityName:@"Quest"
174 NSManagedObjectContext *moc = store.managedObjectContext;
175 for(id object in objects) {
176 [moc deleteObject:object];
180 - (NSString *)flagShipName
182 NSError *error = nil;
183 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ship"];
184 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id = %@", self.flagShipID];
185 [request setPredicate:predicate];
186 NSArray *array = [self.managedObjectContext executeFetchRequest:request
188 if([array count] == 0) {
192 id flagShipName = [array[0] valueForKeyPath:@"master_ship.name"];
193 if(!flagShipName || [flagShipName isKindOfClass:[NSNull class]]) {
200 - (IBAction)selectView:(id)sender
202 [self showViewWithNumber:[sender tag]];
204 - (IBAction)screenShot:(id)sender
206 [self.gameViewController screenShot:sender];
209 - (void)swipeWithEvent:(NSEvent *)event
211 if(!HMStandardDefaults.useSwipeChangeCombinedView) return;
213 if([event deltaX] > 0) {
214 [self showCombinedView];
216 if([event deltaX] < 0) {
217 [self hideCombinedView];
221 #pragma mark - Combined view
222 - (IBAction)showHideCombinedView:(id)sender
224 if(self.isCombinedMode) {
225 [self hideCombinedView];
227 [self showCombinedView];
230 - (void)showCombinedView
232 if(self.isCombinedMode) return;
233 if(self.fleetViewPosition == kOldStyle) return;
235 self.isCombinedMode = YES;
237 if(!self.combinedViewController) {
238 self.combinedViewController = [HMCombileViewController new];
239 self.combinedViewController.view.hidden = YES;
241 [self.combinedViewController.view setAutoresizingMask:[self.combinedViewPlaceholder autoresizingMask]];
242 [[self.combinedViewPlaceholder superview] replaceSubview:self.combinedViewPlaceholder with:self.combinedViewController.view];
245 NSRect winFrame = self.window.frame;
246 CGFloat incrementWidth = NSMaxX(self.combinedViewController.view.frame);
247 winFrame.size.width += incrementWidth;
248 winFrame.origin.x -= incrementWidth;
250 self.combinedViewController.view.hidden = NO;
251 [self.window setFrame:winFrame display:YES animate:YES];
253 - (void)hideCombinedView
255 if(!self.isCombinedMode) return;
256 self.isCombinedMode = NO;
258 NSRect winFrame = self.window.frame;
259 CGFloat incrementWidth = NSMaxX(self.combinedViewController.view.frame);
260 winFrame.size.width -= incrementWidth;
261 winFrame.origin.x += incrementWidth;
263 [self.window setFrame:winFrame display:YES animate:YES];
264 self.combinedViewController.view.hidden = YES;
267 - (void)didCangeCombined:(id)notification
269 if(!HMStandardDefaults.autoCombinedView) return;
271 NSDictionary *info = [notification userInfo];
272 NSNumber *typeValue = info[HMCombinedType];
273 CombineType type = typeValue.integerValue;
274 if(![NSThread isMainThread]) {
275 [NSThread sleepForTimeInterval:0.1];
277 dispatch_async(dispatch_get_main_queue(),
281 [self hideCombinedView];
286 [self showCombinedView];
289 NSLog(@"combined type is unknown type. %ld", type);
290 [self showCombinedView];
296 #pragma mark - FleetView position
297 // ###############################
298 const CGFloat margin = 1;
299 const CGFloat flashTopMargin = 4;
300 // ###############################
303 - (void)changeFleetViewForFleetViewPositionIfNeeded:(FleetViewPosition)fleetViewPosition
305 if(self.fleetViewPosition == fleetViewPosition) return;
306 if(self.fleetViewPosition != kOldStyle && fleetViewPosition != kOldStyle) return;
308 if(fleetViewPosition == kOldStyle && self.isCombinedMode) {
309 [self hideCombinedView];
312 HMFleetViewType type = fleetViewPosition == kOldStyle ? minimumViewType : detailViewType;
314 HMFleetViewController *newController = [HMFleetViewController viewControlerWithViewType:type];
315 newController.enableAnimation = YES;
316 newController.shipOrder = self.fleetViewController.shipOrder;
318 NSView *currentView = self.fleetViewController.view;
319 NSRect newFrame = newController.view.frame;
320 newFrame.origin = currentView.frame.origin;
321 newController.view.frame = newFrame;
322 newController.view.autoresizingMask = currentView.autoresizingMask;
323 [currentView.superview replaceSubview:currentView with:newController.view];
325 self.fleetViewController = newController;
328 - (CGFloat)windowHeightForFleetViewPosition:(FleetViewPosition)fleetViewPosition
330 CGFloat windowContentHeight = [self.window.contentView frame].size.height;
332 if(self.fleetViewPosition == fleetViewPosition) return windowContentHeight;
334 if(self.fleetViewPosition == kOldStyle) {
335 windowContentHeight += HMFleetViewController.heightDifference;
337 if(fleetViewPosition == kOldStyle) {
338 windowContentHeight -= HMFleetViewController.heightDifference;
341 return windowContentHeight;
343 - (NSRect)windowFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
345 NSRect windowContentRect = [self.window frame];
347 if(self.fleetViewPosition == fleetViewPosition) return windowContentRect;
349 if(self.fleetViewPosition == kOldStyle) {
350 windowContentRect.size.height += HMFleetViewController.heightDifference;
351 windowContentRect.origin.y -= HMFleetViewController.heightDifference;
353 if(fleetViewPosition == kOldStyle) {
354 windowContentRect.size.height -= HMFleetViewController.heightDifference;
355 windowContentRect.origin.y += HMFleetViewController.heightDifference;
358 return windowContentRect;
361 - (NSRect)flashFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
365 CGFloat windowContentHeight = [self windowHeightForFleetViewPosition:fleetViewPosition];
366 NSRect flashRect = self.placeholder.frame;
368 switch(fleetViewPosition) {
370 flashY = windowContentHeight - flashRect.size.height - self.fleetViewController.normalHeight;
373 flashY = windowContentHeight - flashRect.size.height;
376 flashY = windowContentHeight - flashRect.size.height - self.fleetViewController.upsideHeight - margin;
379 flashY = windowContentHeight - flashRect.size.height - flashTopMargin;
382 NSLog(@"%s: unknown position.", __PRETTY_FUNCTION__);
386 flashRect.origin.y = flashY;
390 - (NSRect)fleetViewFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
392 CGFloat fleetViewHeight;
395 CGFloat windowContentHeight = [self windowHeightForFleetViewPosition:fleetViewPosition];
396 NSRect flashRect = self.placeholder.frame;
397 NSRect fleetListRect = self.fleetViewController.view.frame;
399 switch(fleetViewPosition) {
401 fleetViewHeight = self.fleetViewController.normalHeight;
402 fleetViewY = windowContentHeight - fleetViewHeight;
405 fleetViewHeight = self.fleetViewController.normalHeight;
406 fleetViewY = windowContentHeight - fleetViewHeight - flashRect.size.height - margin;
409 fleetViewHeight = self.fleetViewController.normalHeight + flashRect.size.height + margin + margin;
410 fleetViewY = windowContentHeight - fleetViewHeight;
413 fleetViewHeight = HMFleetViewController.oldStyleFleetViewHeight;
414 fleetViewY = windowContentHeight - fleetViewHeight - flashRect.size.height - margin - flashTopMargin;
417 NSLog(@"%s: unknown position.", __PRETTY_FUNCTION__);
421 fleetListRect.size.height = fleetViewHeight;
422 fleetListRect.origin.y = fleetViewY;
423 return fleetListRect;
426 - (void)setFleetViewPosition:(FleetViewPosition)fleetViewPosition animation:(BOOL)flag
428 [self changeFleetViewForFleetViewPositionIfNeeded:fleetViewPosition];
430 NSRect windowFrame = [self windowFrameForFleetViewPosition:fleetViewPosition];
431 NSRect flashRect = [self flashFrameForFleetViewPosition:fleetViewPosition];
432 NSRect fleetListRect = [self fleetViewFrameForFleetViewPosition:fleetViewPosition];
434 _fleetViewPosition = fleetViewPosition;
435 HMStandardDefaults.fleetViewPosition = fleetViewPosition;
438 NSDictionary *winAnime = @{
439 NSViewAnimationTargetKey : self.window,
440 NSViewAnimationEndFrameKey : [NSValue valueWithRect:windowFrame],
442 NSDictionary *flashAnime = @{
443 NSViewAnimationTargetKey : self.placeholder,
444 NSViewAnimationEndFrameKey : [NSValue valueWithRect:flashRect],
446 NSDictionary *fleetAnime = @{
447 NSViewAnimationTargetKey : self.fleetViewController.view,
448 NSViewAnimationEndFrameKey : [NSValue valueWithRect:fleetListRect],
450 NSAnimation *anime = [[NSViewAnimation alloc] initWithViewAnimations:@[winAnime, flashAnime, fleetAnime]];
451 [anime startAnimation];
453 [self.window setFrame:windowFrame display:NO];
454 self.placeholder.frame = flashRect;
455 self.fleetViewController.view.frame = fleetListRect;
459 - (void)setFleetViewPosition:(FleetViewPosition)fleetViewPosition
461 [self setFleetViewPosition:fleetViewPosition animation:YES];
463 - (FleetViewPosition)fleetViewPosition
465 return _fleetViewPosition;
467 - (IBAction)fleetListAbove:(id)sender
469 self.fleetViewPosition = kAbove;
471 - (IBAction)fleetListBelow:(id)sender
473 self.fleetViewPosition = kBelow;
475 - (IBAction)fleetListDivide:(id)sender
477 self.fleetViewPosition = kDivided;
479 - (IBAction)fleetListSimple:(id)sender
481 self.fleetViewPosition = kOldStyle;
484 - (IBAction)reorderToDoubleLine:(id)sender
486 self.fleetViewController.shipOrder = doubleLine;
487 HMStandardDefaults.fleetViewShipOrder = doubleLine;
489 - (IBAction)reorderToLeftToRight:(id)sender
491 self.fleetViewController.shipOrder = leftToRight;
492 HMStandardDefaults.fleetViewShipOrder = leftToRight;
495 - (IBAction)selectNextFleet:(id)sender
497 [_fleetViewController selectNextFleet:sender];
499 - (IBAction)selectPreviousFleet:(id)sender
501 [_fleetViewController selectPreviousFleet:sender];
505 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
507 SEL action = menuItem.action;
509 if(action == @selector(reloadContent:) || action == @selector(screenShot:) || action == @selector(deleteCacheAndReload:)) {
510 return [self.gameViewController validateMenuItem:menuItem];
512 if(action == @selector(selectView:)) {
515 if(action == @selector(selectNextFleet:) || action == @selector(selectPreviousFleet:)) {
519 if(action == @selector(fleetListAbove:)) {
520 if(self.fleetViewPosition == kAbove) {
521 menuItem.state = NSOnState;
523 menuItem.state = NSOffState;
527 if(action == @selector(fleetListBelow:)) {
528 if(self.fleetViewPosition == kBelow) {
529 menuItem.state = NSOnState;
531 menuItem.state = NSOffState;
535 if(action == @selector(fleetListDivide:)) {
536 if(self.fleetViewPosition == kDivided) {
537 menuItem.state = NSOnState;
539 menuItem.state = NSOffState;
543 if(action == @selector(fleetListSimple:)) {
544 if(self.fleetViewPosition == kOldStyle) {
545 menuItem.state = NSOnState;
547 menuItem.state = NSOffState;
552 if(action == @selector(reorderToDoubleLine:)) {
553 if(self.fleetViewController.shipOrder == doubleLine) {
554 menuItem.state = NSOnState;
556 menuItem.state = NSOffState;
560 if(action == @selector(reorderToLeftToRight:)) {
561 if(self.fleetViewController.shipOrder == leftToRight) {
562 menuItem.state = NSOnState;
564 menuItem.state = NSOffState;
568 if(action == @selector(clearQuestList:)) {
571 if(action == @selector(showHideCombinedView:)) {
572 if(self.isCombinedMode) {
573 menuItem.title = NSLocalizedString(@"Hide Combined View", @"View menu, hide combined view");
575 menuItem.title = NSLocalizedString(@"Show Combined View", @"View menu, show combined view");
577 if(self.fleetViewPosition == kOldStyle) return NO;