OSDN Git Service

スクリーンショットやリロードが選択出来ない場合がある問題を修正
[kcd/KCD.git] / KCD / HMBroserWindowController.m
1 //
2 //  HMBroserWindowController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/02/11.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMBroserWindowController.h"
10
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"
24
25
26 #import "HMServerDataStore.h"
27
28
29 typedef NS_ENUM(NSInteger, ViewType) {
30         kScheduleType = 0,
31         kOrganizeType = 1,
32         kPowerUpType = 2,
33         kRepairListType = 3,
34 };
35
36 typedef NS_ENUM(NSUInteger, FleetViewPosition) {
37         kAbove,
38         kBelow,
39         kDivided,
40         
41         kOldStyle = 0xffffffff,
42 };
43
44 @interface HMBroserWindowController ()
45 @property (strong) HMGameViewController *gameViewController;
46
47 @property (weak) IBOutlet NSView *resourcePlaceholder;
48 @property (strong) HMResourceViewController *resourceViewController;
49
50 @property (weak) IBOutlet NSView *ancherageRepariTimerPlaceholder;
51 @property (strong) HMAncherageRepairTimerViewController *ancherageRepariTimerViewController;
52
53 @property (strong) NSNumber *flagShipID;
54
55 @property (strong) HMFleetViewController *fleetViewController;
56 @property FleetViewPosition fleetViewPosition;
57
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;
64
65
66 @property (strong) HMCombileViewController *combinedViewController;
67 @property BOOL isCombinedMode;
68
69 @end
70
71 @implementation HMBroserWindowController
72 @synthesize fleetViewPosition = _fleetViewPosition;
73
74 + (NSSet *)keyPathsForValuesAffectingFlagShipName
75 {
76         return [NSSet setWithObject:@"flagShipID"];
77 }
78
79 - (id)init
80 {
81         self = [super initWithWindowNibName:NSStringFromClass([self class])];
82         if(self) {
83                 [self loadWindow];
84         }
85         return self;
86 }
87
88 - (void)awakeFromNib
89 {
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];
95         
96         self.resourceViewController = [HMResourceViewController new];
97         [self.resourceViewController.view setFrameOrigin:NSZeroPoint];
98         [self.resourcePlaceholder addSubview:self.resourceViewController.view];
99         
100         self.ancherageRepariTimerViewController = [HMAncherageRepairTimerViewController new];
101         [self.ancherageRepariTimerViewController.view setFrameOrigin:NSZeroPoint];
102         [self.ancherageRepariTimerPlaceholder addSubview:self.ancherageRepariTimerViewController.view];
103         
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;
119         
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;
129         
130         [self bind:@"flagShipID" toObject:self.deckContoller withKeyPath:@"selection.ship_0" options:nil];
131         
132         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
133         [nc addObserver:self
134                    selector:@selector(didCangeCombined:)
135                            name:HMCombinedCommandCombinedDidCangeNotification
136                          object:nil];
137         
138         if(HMStandardDefaults.lastHasCombinedView) {
139                 [self showCombinedView];
140         }
141 }
142
143 - (void)windowWillClose:(id)notification
144 {
145         HMStandardDefaults.lastHasCombinedView = self.isCombinedMode;
146 }
147
148 - (NSManagedObjectContext *)managedObjectContext
149 {
150         return [HMServerDataStore defaultManager].managedObjectContext;
151 }
152
153 - (void)showViewWithNumber:(ViewType)type
154 {
155         [self.informations selectTabViewItemAtIndex:type];
156 }
157
158 - (IBAction)reloadContent:(id)sender
159 {
160         [self.gameViewController reloadContent:sender];
161 }
162
163 - (IBAction)deleteCacheAndReload:(id)sender
164 {
165         [self.gameViewController deleteCacheAndReload:sender];
166 }
167
168 - (IBAction)clearQuestList:(id)sender
169 {
170         HMServerDataStore *store = [HMServerDataStore oneTimeEditor];
171         NSArray *objects = [store objectsWithEntityName:@"Quest"
172                                                                                   predicate:nil
173                                                                                           error:NULL];
174         NSManagedObjectContext *moc = store.managedObjectContext;
175         for(id object in objects) {
176                 [moc deleteObject:object];
177         }
178 }
179
180 - (NSString *)flagShipName
181 {
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
187                                                                                                          error:&error];
188         if([array count] == 0) {
189                 return nil;
190         }
191         
192         id flagShipName = [array[0] valueForKeyPath:@"master_ship.name"];
193         if(!flagShipName || [flagShipName isKindOfClass:[NSNull class]]) {
194                 return nil;
195         }
196         
197         return flagShipName;
198 }
199
200 - (IBAction)selectView:(id)sender
201 {
202         [self showViewWithNumber:[sender tag]];
203 }
204 - (IBAction)screenShot:(id)sender
205 {
206         [self.gameViewController screenShot:sender];
207 }
208
209 - (void)swipeWithEvent:(NSEvent *)event
210 {
211         if(!HMStandardDefaults.useSwipeChangeCombinedView) return;
212         
213         if([event deltaX] > 0) {
214                 [self showCombinedView];
215         }
216         if([event deltaX] < 0) {
217                 [self hideCombinedView];
218         }
219 }
220
221 #pragma mark - Combined view
222 - (IBAction)showHideCombinedView:(id)sender
223 {
224         if(self.isCombinedMode) {
225                 [self hideCombinedView];
226         } else {
227                 [self showCombinedView];
228         }
229 }
230 - (void)showCombinedView
231 {
232         if(self.isCombinedMode) return;
233         if(self.fleetViewPosition == kOldStyle) return;
234         
235         self.isCombinedMode = YES;
236         
237         if(!self.combinedViewController) {
238                 self.combinedViewController = [HMCombileViewController new];
239                 self.combinedViewController.view.hidden = YES;
240                 
241                 [self.combinedViewController.view setAutoresizingMask:[self.combinedViewPlaceholder autoresizingMask]];
242                 [[self.combinedViewPlaceholder superview] replaceSubview:self.combinedViewPlaceholder with:self.combinedViewController.view];
243         }
244         
245         NSRect winFrame = self.window.frame;
246         CGFloat incrementWidth = NSMaxX(self.combinedViewController.view.frame);
247         winFrame.size.width += incrementWidth;
248         winFrame.origin.x -= incrementWidth;
249         
250         self.combinedViewController.view.hidden = NO;
251         [self.window setFrame:winFrame display:YES animate:YES];
252 }
253 - (void)hideCombinedView
254 {
255         if(!self.isCombinedMode) return;
256         self.isCombinedMode = NO;
257         
258         NSRect winFrame = self.window.frame;
259         CGFloat incrementWidth = NSMaxX(self.combinedViewController.view.frame);
260         winFrame.size.width -= incrementWidth;
261         winFrame.origin.x += incrementWidth;
262         
263         [self.window setFrame:winFrame display:YES animate:YES];
264         self.combinedViewController.view.hidden = YES;
265 }
266
267 - (void)didCangeCombined:(id)notification
268 {
269         if(!HMStandardDefaults.autoCombinedView) return;
270         
271         NSDictionary *info = [notification userInfo];
272         NSNumber *typeValue = info[HMCombinedType];
273         CombineType type = typeValue.integerValue;
274         if(![NSThread isMainThread]) {
275                 [NSThread sleepForTimeInterval:0.1];
276         }
277         dispatch_async(dispatch_get_main_queue(),
278                                    ^{
279                                            switch(type) {
280                                                    case cancel:
281                                                            [self hideCombinedView];
282                                                            break;
283                                                    case maneuver:
284                                                    case water:
285                                                    case transportation:
286                                                            [self showCombinedView];
287                                                            break;
288                                                    default:
289                                                            NSLog(@"combined type is unknown type. %ld", type);
290                                                            [self showCombinedView];
291                                                            break;
292                                            }
293                                    });
294 }
295
296 #pragma mark - FleetView position
297 // ###############################
298 const CGFloat margin = 1;
299 const CGFloat flashTopMargin = 4;
300 // ###############################
301
302
303 - (void)changeFleetViewForFleetViewPositionIfNeeded:(FleetViewPosition)fleetViewPosition
304 {
305         if(self.fleetViewPosition == fleetViewPosition) return;
306         if(self.fleetViewPosition != kOldStyle && fleetViewPosition != kOldStyle) return;
307         
308         if(fleetViewPosition == kOldStyle && self.isCombinedMode) {
309                 [self hideCombinedView];
310         }
311         
312         HMFleetViewType type = fleetViewPosition == kOldStyle ? minimumViewType : detailViewType;
313         
314         HMFleetViewController *newController = [HMFleetViewController viewControlerWithViewType:type];
315         newController.enableAnimation = YES;
316         newController.shipOrder = self.fleetViewController.shipOrder;
317         
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];
324         
325         self.fleetViewController = newController;
326 }
327
328 - (CGFloat)windowHeightForFleetViewPosition:(FleetViewPosition)fleetViewPosition
329 {
330         CGFloat windowContentHeight = [self.window.contentView frame].size.height;
331         
332         if(self.fleetViewPosition == fleetViewPosition) return windowContentHeight;
333         
334         if(self.fleetViewPosition == kOldStyle) {
335                 windowContentHeight += HMFleetViewController.heightDifference;
336         }
337         if(fleetViewPosition == kOldStyle) {
338                 windowContentHeight -= HMFleetViewController.heightDifference;
339         }
340         
341         return windowContentHeight;
342 }
343 - (NSRect)windowFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
344 {
345         NSRect windowContentRect = [self.window frame];
346         
347         if(self.fleetViewPosition == fleetViewPosition) return windowContentRect;
348         
349         if(self.fleetViewPosition == kOldStyle) {
350                 windowContentRect.size.height += HMFleetViewController.heightDifference;
351                 windowContentRect.origin.y -= HMFleetViewController.heightDifference;
352         }
353         if(fleetViewPosition == kOldStyle) {
354                 windowContentRect.size.height -= HMFleetViewController.heightDifference;
355                 windowContentRect.origin.y += HMFleetViewController.heightDifference;
356         }
357         
358         return windowContentRect;
359 }
360
361 - (NSRect)flashFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
362 {
363         CGFloat flashY;
364         
365         CGFloat windowContentHeight = [self windowHeightForFleetViewPosition:fleetViewPosition];
366         NSRect flashRect = self.placeholder.frame;
367         
368         switch(fleetViewPosition) {
369                 case kAbove:
370                         flashY = windowContentHeight - flashRect.size.height - self.fleetViewController.normalHeight;
371                         break;
372                 case kBelow:
373                         flashY = windowContentHeight - flashRect.size.height;
374                         break;
375                 case kDivided:
376                         flashY = windowContentHeight - flashRect.size.height - self.fleetViewController.upsideHeight - margin;
377                         break;
378                 case kOldStyle:
379                         flashY = windowContentHeight - flashRect.size.height - flashTopMargin;
380                         break;
381                 default:
382                         NSLog(@"%s: unknown position.", __PRETTY_FUNCTION__);
383                         return NSZeroRect;
384         }
385         
386         flashRect.origin.y = flashY;
387         return flashRect;
388 }
389
390 - (NSRect)fleetViewFrameForFleetViewPosition:(FleetViewPosition)fleetViewPosition
391 {
392         CGFloat fleetViewHeight;
393         CGFloat fleetViewY;
394         
395         CGFloat windowContentHeight = [self windowHeightForFleetViewPosition:fleetViewPosition];
396         NSRect flashRect = self.placeholder.frame;
397         NSRect fleetListRect = self.fleetViewController.view.frame;
398         
399         switch(fleetViewPosition) {
400                 case kAbove:
401                         fleetViewHeight = self.fleetViewController.normalHeight;
402                         fleetViewY = windowContentHeight - fleetViewHeight;
403                         break;
404                 case kBelow:
405                         fleetViewHeight = self.fleetViewController.normalHeight;
406                         fleetViewY = windowContentHeight - fleetViewHeight - flashRect.size.height - margin;
407                         break;
408                 case kDivided:
409                         fleetViewHeight = self.fleetViewController.normalHeight + flashRect.size.height + margin + margin;
410                         fleetViewY = windowContentHeight - fleetViewHeight;
411                         break;
412                 case kOldStyle:
413                         fleetViewHeight = HMFleetViewController.oldStyleFleetViewHeight;
414                         fleetViewY = windowContentHeight - fleetViewHeight - flashRect.size.height - margin - flashTopMargin;
415                         break;
416                 default:
417                         NSLog(@"%s: unknown position.", __PRETTY_FUNCTION__);
418                         return NSZeroRect;
419         }
420         
421         fleetListRect.size.height = fleetViewHeight;
422         fleetListRect.origin.y = fleetViewY;
423         return fleetListRect;
424 }
425
426 - (void)setFleetViewPosition:(FleetViewPosition)fleetViewPosition animation:(BOOL)flag
427 {
428         [self changeFleetViewForFleetViewPositionIfNeeded:fleetViewPosition];
429         
430         NSRect windowFrame = [self windowFrameForFleetViewPosition:fleetViewPosition];
431         NSRect flashRect = [self flashFrameForFleetViewPosition:fleetViewPosition];
432         NSRect fleetListRect = [self fleetViewFrameForFleetViewPosition:fleetViewPosition];
433         
434         _fleetViewPosition = fleetViewPosition;
435         HMStandardDefaults.fleetViewPosition = fleetViewPosition;
436         
437         if(flag) {
438                 NSDictionary *winAnime = @{
439                                                                    NSViewAnimationTargetKey : self.window,
440                                                                    NSViewAnimationEndFrameKey : [NSValue valueWithRect:windowFrame],
441                                                                    };
442                 NSDictionary *flashAnime = @{
443                                                    NSViewAnimationTargetKey : self.placeholder,
444                                                    NSViewAnimationEndFrameKey : [NSValue valueWithRect:flashRect],
445                                                    };
446                 NSDictionary *fleetAnime = @{
447                                                                  NSViewAnimationTargetKey : self.fleetViewController.view,
448                                                                  NSViewAnimationEndFrameKey : [NSValue valueWithRect:fleetListRect],
449                                                                  };
450                 NSAnimation *anime = [[NSViewAnimation alloc] initWithViewAnimations:@[winAnime, flashAnime, fleetAnime]];
451                 [anime startAnimation];
452         } else {
453                 [self.window setFrame:windowFrame display:NO];
454                 self.placeholder.frame = flashRect;
455                 self.fleetViewController.view.frame = fleetListRect;
456         }
457 }
458
459 - (void)setFleetViewPosition:(FleetViewPosition)fleetViewPosition
460 {
461         [self setFleetViewPosition:fleetViewPosition animation:YES];
462 }
463 - (FleetViewPosition)fleetViewPosition
464 {
465         return _fleetViewPosition;
466 }
467 - (IBAction)fleetListAbove:(id)sender
468 {
469         self.fleetViewPosition = kAbove;
470 }
471 - (IBAction)fleetListBelow:(id)sender
472 {
473         self.fleetViewPosition = kBelow;
474 }
475 - (IBAction)fleetListDivide:(id)sender
476 {
477         self.fleetViewPosition = kDivided;
478 }
479 - (IBAction)fleetListSimple:(id)sender
480 {
481         self.fleetViewPosition = kOldStyle;
482 }
483
484 - (IBAction)reorderToDoubleLine:(id)sender
485 {
486         self.fleetViewController.shipOrder = doubleLine;
487         HMStandardDefaults.fleetViewShipOrder = doubleLine;
488 }
489 - (IBAction)reorderToLeftToRight:(id)sender
490 {
491         self.fleetViewController.shipOrder = leftToRight;
492         HMStandardDefaults.fleetViewShipOrder = leftToRight;
493 }
494
495 - (IBAction)selectNextFleet:(id)sender
496 {
497         [_fleetViewController selectNextFleet:sender];
498 }
499 - (IBAction)selectPreviousFleet:(id)sender
500 {
501         [_fleetViewController selectPreviousFleet:sender];
502 }
503
504
505 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
506 {
507         SEL action = menuItem.action;
508         
509         if(action == @selector(reloadContent:) || action == @selector(screenShot:) || action == @selector(deleteCacheAndReload:)) {
510                 return [self.gameViewController validateMenuItem:menuItem];
511         }
512         if(action == @selector(selectView:)) {
513                 return YES;
514         }
515         if(action == @selector(selectNextFleet:) || action == @selector(selectPreviousFleet:)) {
516                 return YES;
517         }
518         
519         if(action == @selector(fleetListAbove:)) {
520                 if(self.fleetViewPosition == kAbove) {
521                         menuItem.state = NSOnState;
522                 } else {
523                         menuItem.state = NSOffState;
524                 }
525                 return YES;
526         }
527         if(action == @selector(fleetListBelow:)) {
528                 if(self.fleetViewPosition == kBelow) {
529                         menuItem.state = NSOnState;
530                 } else {
531                         menuItem.state = NSOffState;
532                 }
533                 return YES;
534         }
535         if(action == @selector(fleetListDivide:)) {
536                 if(self.fleetViewPosition == kDivided) {
537                         menuItem.state = NSOnState;
538                 } else {
539                         menuItem.state = NSOffState;
540                 }
541                 return YES;
542         }
543         if(action == @selector(fleetListSimple:)) {
544                 if(self.fleetViewPosition == kOldStyle) {
545                         menuItem.state = NSOnState;
546                 } else {
547                         menuItem.state = NSOffState;
548                 }
549                 return YES;
550         }
551         
552         if(action == @selector(reorderToDoubleLine:)) {
553                 if(self.fleetViewController.shipOrder == doubleLine) {
554                         menuItem.state = NSOnState;
555                 } else {
556                         menuItem.state = NSOffState;
557                 }
558                 return YES;
559         }
560         if(action == @selector(reorderToLeftToRight:)) {
561                 if(self.fleetViewController.shipOrder == leftToRight) {
562                         menuItem.state = NSOnState;
563                 } else {
564                         menuItem.state = NSOffState;
565                 }
566                 return YES;
567         }
568         if(action == @selector(clearQuestList:)) {
569                 return YES;
570         }
571         if(action == @selector(showHideCombinedView:)) {
572                 if(self.isCombinedMode) {
573                         menuItem.title = NSLocalizedString(@"Hide Combined View", @"View menu, hide combined view");
574                 } else {
575                         menuItem.title = NSLocalizedString(@"Show Combined View", @"View menu, show combined view");
576                 }
577                 if(self.fleetViewPosition == kOldStyle) return NO;
578                 return YES;
579         }
580         
581         return NO;
582 }
583
584 @end