F471784D1B6FA18800F5E59D /* HMKCResource.m in Sources */ = {isa = PBXBuildFile; fileRef = F471784C1B6FA18800F5E59D /* HMKCResource.m */; };
F47178501B6FA1B300F5E59D /* HMResourceHistoryDataStore.m in Sources */ = {isa = PBXBuildFile; fileRef = F471784F1B6FA1B300F5E59D /* HMResourceHistoryDataStore.m */; };
F47B78B218A7B42B0011386E /* HMJSONViewWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = F47B78B018A7B42B0011386E /* HMJSONViewWindowController.m */; };
+ F47E895D1B80DB9F00B2E552 /* HMSlotItemLevelView.m in Sources */ = {isa = PBXBuildFile; fileRef = F47E895C1B80DB9F00B2E552 /* HMSlotItemLevelView.m */; };
F48F7B021907D7B800E78AE1 /* HMPortCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = F48F7B011907D7B800E78AE1 /* HMPortCommand.m */; };
F494DC5F18C30AE100AE97E4 /* HMMissionStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = F494DC5E18C30AE100AE97E4 /* HMMissionStatus.m */; };
F494DC6318C608C100AE97E4 /* HMShipViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F494DC6118C608C100AE97E4 /* HMShipViewController.m */; };
F471784F1B6FA1B300F5E59D /* HMResourceHistoryDataStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMResourceHistoryDataStore.m; sourceTree = "<group>"; };
F47B78AF18A7B42B0011386E /* HMJSONViewWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HMJSONViewWindowController.h; sourceTree = "<group>"; };
F47B78B018A7B42B0011386E /* HMJSONViewWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMJSONViewWindowController.m; sourceTree = "<group>"; };
+ F47E895B1B80DB9F00B2E552 /* HMSlotItemLevelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HMSlotItemLevelView.h; sourceTree = "<group>"; };
+ F47E895C1B80DB9F00B2E552 /* HMSlotItemLevelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMSlotItemLevelView.m; sourceTree = "<group>"; };
F48F7B001907D7B800E78AE1 /* HMPortCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HMPortCommand.h; sourceTree = "<group>"; };
F48F7B011907D7B800E78AE1 /* HMPortCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMPortCommand.m; sourceTree = "<group>"; };
F494DC5618C23E4300AE97E4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MainMenu.strings; sourceTree = "<group>"; };
F4BEF00A1B11A5DE004702B8 /* HMShipDetailViewController.xib */,
F4ED5D281B78D0CA00D1BDEF /* HMHaihiView.h */,
F4ED5D291B78D0CA00D1BDEF /* HMHaihiView.m */,
+ F47E895B1B80DB9F00B2E552 /* HMSlotItemLevelView.h */,
+ F47E895C1B80DB9F00B2E552 /* HMSlotItemLevelView.m */,
F4D6BCB71AA32BEA00742FEB /* HMFleetViewController.h */,
F4D6BCB81AA32BEA00742FEB /* HMFleetViewController.m */,
F4BEF0071B11A5D3004702B8 /* HMFleetViewController.xib */,
F4B414EC18B0A7D600468DAF /* HMMasterUseItemCommand.m in Sources */,
F4513EF318B991F800073552 /* HMMemberBasicCommand.m in Sources */,
F4268009193AF4E000B2C27F /* HMUserDefaults.m in Sources */,
+ F47E895D1B80DB9F00B2E552 /* HMSlotItemLevelView.m in Sources */,
F44AB20019E050F600F217AF /* HMKCDeck.m in Sources */,
F43F3D4F1A34ACCD00D6DAF7 /* HMKCShipObject.m in Sources */,
F448F9951B70E9BE004901AD /* HMKCMaterial.m in Sources */,
--- /dev/null
+//
+// HMSlotItemLevelView.m
+// KCD
+//
+// Created by Hori,Masaki on 2015/08/16.
+// Copyright (c) 2015年 Hori,Masaki. All rights reserved.
+//
+
+#import "HMSlotItemLevelView.h"
+
+#import "HMServerDataStore.h"
+#import "HMKCSlotItemObject+Extensions.h"
+
+#import "HMPortNotifyCommand.h"
+
+
+static NSColor *sContentColor = nil;
+
+@interface HMSlotItemLevelView ()
+
+@property (strong) HMKCSlotItemObject *slotItem;
+
+@end
+
+@implementation HMSlotItemLevelView
+
+- (void)awakeFromNib
+{
+ NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
+ [nc addObserver:self
+ selector:@selector(didAlivalPort:)
+ name:@"HMPortAPIRecieveNotification"
+ object:nil];
+}
+
+- (void)calcContentColor
+{
+ NSRect rect = NSMakeRect(1, 1, 2, 2);
+ NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
+ sContentColor = [rep colorAtX:1 y:1];
+}
+- (void)drawRect:(NSRect)dirtyRect {
+
+ [super drawRect:dirtyRect];
+
+ if(!sContentColor) [self calcContentColor];
+
+ if(!self.slotItemID) return;
+ if(self.slotItemID.integerValue == 0) return;
+ if(self.slotItemID.integerValue == -1) return;
+
+ NSNumber *aLevel = [self slotItemAlv];
+ if([aLevel isKindOfClass:[NSNumber class]]) {
+ [[self colorForALevel:aLevel] set];
+ [[self shadowForALevel:aLevel] set];
+ [[self bezierPathForALevel:aLevel] stroke];
+ } else {
+ [self drawLevel];
+ }
+}
+
+- (void)didAlivalPort:(NSNotification *)notification
+{
+ self.needsDisplay = YES;
+}
+
+#pragma mark - Air Level
+
+- (CGFloat)offset
+{
+ return 4;
+}
+- (CGFloat)padding
+{
+ return 4.0;
+}
+- (CGFloat)slideOffset
+{
+ return 3.5;
+}
+- (NSBezierPath *)levelOneBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+ path.lineWidth = 1;
+
+ return path;
+}
+- (NSBezierPath *)levelTwoBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - 3.0, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - 3.0, frame.size.height)];
+
+ path.lineWidth = 1;
+
+ return path;
+}
+- (NSBezierPath *)levelThreeBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - 3.0, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - 3.0, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - 3.0 * 2, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - 3.0 * 2, frame.size.height)];
+
+ path.lineWidth = 1;
+
+ return path;
+}
+- (NSBezierPath *)levelFourBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+
+ path.lineWidth = 2;
+
+ return path;
+}
+- (NSBezierPath *)levelFiveBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset - self.padding, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - self.padding, frame.size.height)];
+
+ path.lineWidth = 2;
+
+ return path;
+}
+- (NSBezierPath *)levelSixBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset - self.padding, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - self.padding, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - self.slideOffset - self.padding * 2, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - self.padding * 2, frame.size.height)];
+
+ path.lineWidth = 2;
+
+ return path;
+}
+- (NSBezierPath *)levelSevenBezierPath
+{
+ NSRect frame = NSInsetRect(self.frame, 0, 1);
+ frame.origin = NSZeroPoint;
+ NSBezierPath *path = [NSBezierPath bezierPath];
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - 4.0, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset, frame.size.height * 0.5)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - 4.0, frame.size.height)];
+
+ [path moveToPoint:NSMakePoint(frame.size.width - self.offset - 4.0 - self.padding, 0)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - self.padding, frame.size.height * 0.5)];
+ [path lineToPoint:NSMakePoint(frame.size.width - self.offset - 4.0 - self.padding, frame.size.height)];
+
+ path.lineWidth = 2;
+
+ return path;
+}
+
+
+- (NSBezierPath *)bezierPathForALevel:(NSNumber *)level
+{
+ NSBezierPath *path = nil;
+ switch (level.integerValue) {
+ case 0:
+ return nil;
+ case 1:
+ path = [self levelOneBezierPath];
+ break;
+ case 2:
+ path = [self levelTwoBezierPath];
+ break;
+ case 3:
+ path = [self levelThreeBezierPath];
+ break;
+ case 4:
+ path = [self levelFourBezierPath];
+ break;
+ case 5:
+ path = [self levelFiveBezierPath];
+ break;
+ case 6:
+ path = [self levelSixBezierPath];
+ break;
+ case 7:
+ path = [self levelSevenBezierPath];
+ break;
+ default:
+ return nil;
+ }
+
+ return path;
+}
+
+- (NSColor *)colorForALevel:(NSNumber *)level
+{
+ switch (level.integerValue) {
+ case 0:
+ return nil;
+ case 1:
+ case 2:
+ case 3:
+ return [NSColor colorWithCalibratedRed:0.332 green:0.543 blue:0.646 alpha:1.000];
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ return [NSColor colorWithCalibratedRed:200/255.0 green:140/255.0 blue:0.000 alpha:1.000];
+ default:
+ return nil;
+ }
+ return nil;
+}
+- (NSShadow *)shadowForALevel:(NSNumber *)level
+{
+ NSShadow *shadow = [NSShadow new];
+ switch (level.integerValue) {
+ case 0:
+ return nil;
+ case 1:
+ case 2:
+ case 3:
+ shadow.shadowColor = [NSColor colorWithCalibratedRed:0.152 green:0.501 blue:0.853 alpha:1.000];
+ shadow.shadowBlurRadius = 4;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ shadow.shadowColor = [NSColor yellowColor];
+ shadow.shadowBlurRadius = 3;
+ break;
+ default:
+ return nil;
+ }
+ return shadow;
+}
+
+- (NSNumber *)slotItemAlv
+{
+ if(!self.slotItemID) return nil;
+
+ if(!self.slotItem) {
+ [self fetchSlotItem];
+ }
+
+ return self.slotItem.alv;
+}
+
+
+#pragma mark - Level
+
+- (NSColor *)levelColor
+{
+ return [NSColor colorWithCalibratedRed:0.135 green:0.522 blue:0.619 alpha:1.000];
+}
+- (void)drawLevel
+{
+ NSNumber *level = self.slotItemLevel;
+ if(!level || [level isKindOfClass:[NSNull class]]) return;
+ if(level.integerValue == 0) return;
+
+ NSString *string = [NSString stringWithFormat:@"★+%@", level];
+ if(level.integerValue == 10) {
+ string = @"max";
+ }
+ NSFont *font = [NSFont systemFontOfSize:[NSFont smallSystemFontSize]];
+
+ NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:string
+ attributes:@{
+ NSFontAttributeName : font,
+ NSForegroundColorAttributeName : [self levelColor],
+ }
+ ];
+ NSRect boundingRect = [attrString boundingRectWithSize:self.frame.size options:0];
+ NSRect rect = self.frame;
+ rect.origin.x = self.frame.size.width - boundingRect.size.width * 2;
+ rect.origin.y = 0;
+ rect.size.width = boundingRect.size.width * 2;
+
+
+ NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
+ [NSColor colorWithCalibratedWhite:1 alpha:0.000], 0.0,
+ sContentColor, 0.5,
+ sContentColor, 1.0,
+ nil];
+
+ [gradient drawInRect:rect angle:0.0];
+
+ rect = self.frame;
+ rect.origin.x = self.frame.size.width - boundingRect.size.width - 1.0;
+ rect.origin.y = 0;
+
+
+ [attrString drawInRect:rect];
+}
+
+- (NSNumber *)slotItemLevel
+{
+ if(!self.slotItemID) return nil;
+
+ if(!self.slotItem) {
+ [self fetchSlotItem];
+ }
+
+ return self.slotItem.level;
+}
+
+#pragma mark - property
+
+- (void)fetchSlotItem
+{
+ if(!self.slotItemID || [self.slotItemID isEqual:@(-1)]) {
+ self.slotItem = nil;
+ return;
+ }
+
+ HMServerDataStore *store = [HMServerDataStore defaultManager];
+ NSError *error = nil;
+ NSArray *array = [store objectsWithEntityName:@"SlotItem"
+ error:&error
+ predicateFormat:@"id = %@", self.slotItemID];
+ if(error) {
+ NSLog(@"SlotItem is invalid -> %@", error);
+ self.slotItem = nil;
+ return;
+ }
+ if(array.count == 0) {
+ NSLog(@"Can not find slotItem for %@", self.slotItemID);
+ self.slotItem = nil;
+ return;
+ }
+
+ [self.slotItem removeObserver:self forKeyPath:@"level"];
+ [self.slotItem removeObserver:self forKeyPath:@"alv"];
+
+ self.slotItem = array[0];
+
+ [self.slotItem addObserver:self forKeyPath:@"level" options:0 context:NULL];
+ [self.slotItem addObserver:self forKeyPath:@"alv" options:0 context:NULL];
+}
+- (void)setSlotItemID:(NSNumber *)slotItemID
+{
+ if([self.slotItemID isEqual:slotItemID]) return;
+ self.slotItem = nil;
+ _slotItemID = slotItemID;
+ [self fetchSlotItem];
+ self.needsDisplay = YES;
+}
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+ if([keyPath isEqualToString:@"level"] || [keyPath isEqualToString:@"alv"]) {
+ self.needsDisplay = YES;
+ return;
+ }
+
+ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+}
+
+@end