OSDN Git Service

f28d0307727eaf0bfb1937d75da2db9261d73426
[kcd/KCD.git] / KCD / HMFleetViewController.m
1 //
2 //  HMFleetViewController.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/03/01.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMFleetViewController.h"
10 #import "HMShipDetailViewController.h"
11 #import "HMMinimumShipViewController.h"
12
13 #import "HMKCShipObject+Extensions.h"
14 #import "HMKCDeck+Extension.h"
15
16 #import "HMServerDataStore.h"
17
18 @interface HMFleetViewController ()
19
20 @property (weak) Class shipViewClass;
21
22 @property (readwrite) HMFleetViewType type;
23
24 @property (nonatomic, weak) IBOutlet NSView *placeholder01;
25 @property (nonatomic, weak) IBOutlet NSView *placeholder02;
26 @property (nonatomic, weak) IBOutlet NSView *placeholder03;
27 @property (nonatomic, weak) IBOutlet NSView *placeholder04;
28 @property (nonatomic, weak) IBOutlet NSView *placeholder05;
29 @property (nonatomic, weak) IBOutlet NSView *placeholder06;
30
31 @property (strong) HMShipDetailViewController *detail01;
32 @property (strong) HMShipDetailViewController *detail02;
33 @property (strong) HMShipDetailViewController *detail03;
34 @property (strong) HMShipDetailViewController *detail04;
35 @property (strong) HMShipDetailViewController *detail05;
36 @property (strong) HMShipDetailViewController *detail06;
37
38 @end
39
40 @implementation HMFleetViewController
41 @synthesize fleetNumber = _fleetNumber;
42 @synthesize shipOrder = _shipOrder;
43
44 + (instancetype)new
45 {
46         return [[[self class] alloc] initWithViewType:minimumViewType];
47 }
48
49 - (instancetype)initWithViewType:(HMFleetViewType)type
50 {
51         Class shipViewClass = Nil;
52         NSString *nibName = nil;
53         switch (type) {
54                 case detailViewType:
55                         nibName = NSStringFromClass([self class]);
56                         shipViewClass = [HMShipDetailViewController class];
57                         break;
58                 case minimumViewType:
59                         nibName = @"HMFleetMinimumViewController";
60                         shipViewClass = [HMMinimumShipViewController class];
61                         break;
62         }
63         
64         if(!nibName) {
65                 self = [super initWithNibName:@"" bundle:nil];
66                 NSLog(@"UnknownType");
67                 return nil;
68         }
69         
70         self = [super initWithNibName:nibName bundle:nil];
71         if(self) {
72                 _type = type;
73                 _shipViewClass = shipViewClass;
74         }
75         return self;
76 }
77
78 //- (id)init
79 //{
80 //      self = [super initWithNibName:NSStringFromClass([self class]) bundle:nil];
81 //      return self;
82 //}
83
84 - (void)awakeFromNib {
85         
86         for(NSInteger i = 1; i < 7; i++) {
87                 NSString *detailKey = [NSString stringWithFormat:@"detail%02ld", i];
88                 NSString *placeholderKey = [NSString stringWithFormat:@"placeholder%02ld", i];
89                 HMShipDetailViewController *detail = [self.shipViewClass new];
90                 detail.title = [NSString stringWithFormat:@"%ld", i];
91                 [self setValue:detail forKey:detailKey];
92                 NSView *view = [self valueForKey:placeholderKey];
93                 
94                 [detail.view setFrame:[view frame]];
95                 [detail.view setAutoresizingMask:[view autoresizingMask]];
96                 [[view superview] replaceSubview:view with:detail.view];
97         }
98         
99         self.fleetNumber = 1;
100 }
101
102 - (void)setShipID:(NSInteger)shipId toDetail:(HMShipDetailViewController *)detail
103 {
104         HMServerDataStore *store = [HMServerDataStore defaultManager];
105         NSError *error = nil;
106         HMKCShipObject *ship = nil;
107         NSArray *array = [store objectsWithEntityName:@"Ship"
108                                                                                         error:&error
109                                                                   predicateFormat:@"id = %ld", shipId];
110         if(error) {
111                 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
112         }
113         if(array.count != 0) {
114                 ship = array[0];
115         }
116         detail.ship = ship;
117 }
118 - (void)setFleet:(HMKCDeck *)fleet
119 {
120         for(NSInteger i = 0; i < 6; i++) {
121                 [self.representedObject removeObserver:self
122                                                                         forKeyPath:[NSString stringWithFormat:@"ship_%ld", i]];
123         }
124         
125         for(NSInteger i = 0; i < 6; i++) {
126                 [fleet addObserver:self
127                                 forKeyPath:[NSString stringWithFormat:@"ship_%ld", i]
128                                    options:0
129                                    context:NULL];
130         }
131         
132         self.representedObject = fleet;
133         self.title = fleet.name;
134         
135         for(NSInteger i = 1; i < 7; i++) {
136                 NSString *shipID = [self.fleet valueForKey:[NSString stringWithFormat:@"ship_%ld", i - 1]];
137                 HMShipDetailViewController *detail = [self valueForKey:[NSString stringWithFormat:@"detail%02ld", i]];
138                 [self setShipID:shipID.integerValue toDetail:detail];
139         }
140 }
141 - (HMKCDeck *)fleet
142 {
143         return self.representedObject;
144 }
145
146 - (void)setFleetNumber:(NSInteger)fleetNumber
147 {
148         HMServerDataStore *store = [HMServerDataStore defaultManager];
149         NSError *error = nil;
150         NSArray *array = [store objectsWithEntityName:@"Deck"
151                                                                                         error:NULL
152                                                                   predicateFormat:@"id = %ld", fleetNumber];
153         if(error) {
154                 NSLog(@"%s error: %@", __PRETTY_FUNCTION__, error);
155                 return;
156         }
157         if(array.count == 0) {
158                 return;
159         }
160         
161         self.fleet = array[0];
162         _fleetNumber = fleetNumber;
163 }
164 - (NSInteger)fleetNumber
165 {
166         return _fleetNumber;
167 }
168
169 - (void)setShipOrder:(HMFleetViewShipOrder)shipOrder
170 {
171         if(_shipOrder == shipOrder) return;
172         _shipOrder = shipOrder;
173         
174         switch(shipOrder) {
175                 case doubleLine:
176                         [self reorderShipToDoubleLine];
177                         break;
178                 case leftToRight:
179                         [self reorderShipToLeftToRight];
180                         break;
181         }
182 }
183 - (HMFleetViewShipOrder)shipOrder
184 {
185         return _shipOrder;
186 }
187
188 - (BOOL)canDivide
189 {
190         return self.type == detailViewType;
191 }
192 - (CGFloat)normalHeight
193 {
194         switch(self.type) {
195                 case detailViewType:
196                         return 288;
197                 case minimumViewType:
198                         return 60;
199         }
200         return 0;
201 }
202 - (CGFloat)upsideHeight
203 {
204         switch(self.type) {
205                 case detailViewType:
206                         return 159;
207                 case minimumViewType:
208                         return 60;
209         }
210         return 0;
211 }
212
213
214 + (NSSet *)keyPathsForValuesAffectingTotalSakuteki
215 {
216         return [NSSet setWithObjects:
217                         @"detail01.ship.sakuteki_0",
218                         @"detail02.ship.sakuteki_0",
219                         @"detail03.ship.sakuteki_0",
220                         @"detail04.ship.sakuteki_0",
221                         @"detail05.ship.sakuteki_0",
222                         @"detail06.ship.sakuteki_0",
223                         nil];
224 }
225 - (NSNumber *)totalSakuteki
226 {
227         NSInteger total = 0;
228         for(NSInteger i = 1; i < 7; i++) {
229                 HMShipDetailViewController *detail = [self valueForKey:[NSString stringWithFormat:@"detail%02ld", i]];
230                 HMKCShipObject *ship = detail.ship;
231                 total += ship.sakuteki_0.integerValue;
232         }
233         return @(total);
234 }
235
236 + (NSSet *)keyPathsForValuesAffectingTotalSeiku
237 {
238         return [NSSet setWithObjects:
239                         @"detail01.ship.seiku",
240                         @"detail02.ship.seiku",
241                         @"detail03.ship.seiku",
242                         @"detail04.ship.seiku",
243                         @"detail05.ship.seiku",
244                         @"detail06.ship.seiku",
245                         nil];
246 }
247 - (NSNumber *)totalSeiku
248 {
249         NSInteger total = 0;
250         for(NSInteger i = 1; i < 7; i++) {
251                 HMShipDetailViewController *detail = [self valueForKey:[NSString stringWithFormat:@"detail%02ld", i]];
252                 HMKCShipObject *ship = detail.ship;
253                 total += ship.seiku.integerValue;
254         }
255         return @(total);
256 }
257
258 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
259 {
260         if([keyPath isEqualToString:@"ship_0"]) {
261                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail01];
262                 return;
263         }
264         if([keyPath isEqualToString:@"ship_1"]) {
265                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail02];
266                 return;
267         }
268         if([keyPath isEqualToString:@"ship_2"]) {
269                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail03];
270                 return;
271         }
272         if([keyPath isEqualToString:@"ship_3"]) {
273                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail04];
274                 return;
275         }
276         if([keyPath isEqualToString:@"ship_4"]) {
277                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail05];
278                 return;
279         }
280         if([keyPath isEqualToString:@"ship_5"]) {
281                 [self setShipID:[[object valueForKey:keyPath] integerValue] toDetail:self.detail06];
282                 return;
283         }
284         
285         return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
286 }
287
288 - (void)reorderShipToDoubleLine
289 {
290         NSView *view02 = self.detail02.view;
291         NSView *view03 = self.detail03.view;
292         NSView *view04 = self.detail04.view;
293         NSView *view05 = self.detail05.view;
294         
295         NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
296         NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
297         NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
298         NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
299         
300         view02.autoresizingMask = options04;
301         view03.autoresizingMask = options02;
302         view04.autoresizingMask = options05;
303         view05.autoresizingMask = options03;
304         
305         NSRect frame02 = view02.frame;
306         NSRect frame03 = view03.frame;
307         NSRect frame04 = view04.frame;
308         NSRect frame05 = view05.frame;
309         
310         view02.animator.frame = frame04;
311         view03.animator.frame = frame02;
312         view04.animator.frame = frame05;
313         view05.animator.frame = frame03;
314 }
315 - (void)reorderShipToLeftToRight
316 {
317         NSView *view02 = self.detail02.view;
318         NSView *view03 = self.detail03.view;
319         NSView *view04 = self.detail04.view;
320         NSView *view05 = self.detail05.view;
321         
322         NSAutoresizingMaskOptions options02 = view02.autoresizingMask;
323         NSAutoresizingMaskOptions options03 = view03.autoresizingMask;
324         NSAutoresizingMaskOptions options04 = view04.autoresizingMask;
325         NSAutoresizingMaskOptions options05 = view05.autoresizingMask;
326         
327         view02.autoresizingMask = options03;
328         view03.autoresizingMask = options05;
329         view04.autoresizingMask = options02;
330         view05.autoresizingMask = options04;
331         
332         NSRect frame02 = view02.frame;
333         NSRect frame03 = view03.frame;
334         NSRect frame04 = view04.frame;
335         NSRect frame05 = view05.frame;
336         
337         view02.animator.frame = frame03;
338         view03.animator.frame = frame05;
339         view04.animator.frame = frame02;
340         view05.animator.frame = frame04;
341 }
342
343 @end