OSDN Git Service

装備のレベルと熟練度を表示するビューを追加
authormasakih <masakih@users.sourceforge.jp>
Thu, 20 Aug 2015 13:04:28 +0000 (22:04 +0900)
committermasakih <masakih@users.sourceforge.jp>
Thu, 20 Aug 2015 13:04:28 +0000 (22:04 +0900)
KCD.xcodeproj/project.pbxproj
KCD/HMSlotItemLevelView.h [new file with mode: 0644]
KCD/HMSlotItemLevelView.m [new file with mode: 0644]

index a814ec7..35f60bd 100644 (file)
@@ -73,6 +73,7 @@
                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 */,
diff --git a/KCD/HMSlotItemLevelView.h b/KCD/HMSlotItemLevelView.h
new file mode 100644 (file)
index 0000000..62adf6b
--- /dev/null
@@ -0,0 +1,15 @@
+//
+//  HMSlotItemLevelView.h
+//  KCD
+//
+//  Created by Hori,Masaki on 2015/08/16.
+//  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@interface HMSlotItemLevelView : NSTextField
+
+@property (nonatomic, strong) NSNumber *slotItemID;
+
+@end
diff --git a/KCD/HMSlotItemLevelView.m b/KCD/HMSlotItemLevelView.m
new file mode 100644 (file)
index 0000000..b5c2848
--- /dev/null
@@ -0,0 +1,389 @@
+//
+//  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