case miniVierticalType = 2
}
-fileprivate var shipKeysContext: Int = 0
-fileprivate var shipsContext: Int = 0
+private var shipKeysContext: Int = 0
+private var shipsContext: Int = 0
final class FleetViewController: NSViewController {
private static let maxFleetNumber: Int = 4
- fileprivate let details: [ShipDetailViewController]
+ private let details: [ShipDetailViewController]
private let shipKeys = ["ship_0", "ship_1", "ship_2", "ship_3", "ship_4", "ship_5"]
private let type: FleetViewType
private let fleetController = NSObjectController()
}()
details = (1...6).map {
- guard let res = ShipDetailViewController(type: shipiewType)
- else { fatalError("Can not create ShipDetailViewController") }
+ guard let res = ShipDetailViewController(type: shipiewType) else { fatalError("Can not create ShipDetailViewController") }
res.title = "\($0)"
return res
}
- let nibName: String = {
+ let nibName: NSNib.Name = {
switch viewType {
- case .detailViewType: return "FleetViewController"
- case .minimumViewType: return "FleetMinimumViewController"
- case .miniVierticalType: return "VerticalFleetViewController"
+ case .detailViewType: return FleetViewController.nibName
+ case .minimumViewType: return NSNib.Name("FleetMinimumViewController")
+ case .miniVierticalType: return NSNib.Name("VerticalFleetViewController")
}
}()
@IBOutlet weak var placeholder05: NSView!
@IBOutlet weak var placeholder06: NSView!
- dynamic var fleetNumber: Int = 1 {
+ @objc dynamic var fleetNumber: Int = 1 {
didSet {
ServerDataStore.default
}
}
- dynamic var fleet: Deck? {
+ @objc dynamic var fleet: Deck? {
get { return representedObject as? Deck }
set {
}
}
- var totalSakuteki: Double { return sakutekiCalculator.calculate(ships) }
- var totalSeiku: Int { return ships.reduce(0) { $0 + $1.seiku } }
- var totalCalclatedSeiku: Int { return ships.reduce(0) { $0 + $1.totalSeiku } }
- var totalLevel: Int { return ships.reduce(0) { $0 + $1.lv } }
- var totalDrums: Int { return ships.reduce(0) { $0 + $1.totalDrums } }
+ @objc var totalSakuteki: Double { return sakutekiCalculator.calculate(ships) }
+ @objc var totalSeiku: Int { return ships.reduce(0) { $0 + $1.seiku } }
+ @objc var totalCalclatedSeiku: Int { return ships.reduce(0) { $0 + totalSeiku(of: $1) } }
+ @objc var totalLevel: Int { return ships.reduce(0) { $0 + $1.lv } }
+ @objc var totalDrums: Int { return ships.reduce(0) { $0 + totalDrums(of: $1) } }
+ @objc var totalTPValue: Int {
+
+ return ships
+ .map { ShipTPValueCalculator($0) }
+ .map { $0.value }
+ .reduce(0, +)
+
+ }
+ func totalSeiku(of ship: Ship) -> Int {
+
+ return SeikuCalclator(ship: ship).totalSeiku
+ }
+ func totalDrums(of ship: Ship) -> Int {
+
+ return (0...4).flatMap(ship.slotItem).filter { $0.slotitem_id == 75 }.count
+ }
- fileprivate var ships: [Ship] = [] {
+ private var ships: [Ship] = [] {
willSet {
ships.forEach { ship in
private(set) var anchorageRepair = AnchorageRepairManager.default
- dynamic fileprivate(set) var repairTime: NSNumber?
+ @objc dynamic private(set) var repairTime: NSNumber?
override func viewDidLoad() {
sakutekiCalculator = Formula33(Int(factor))
}
- fleetController.bind("content", to:self, withKeyPath:#keyPath(fleet), options:nil)
+ fleetController.bind(NSBindingName("content"), to:self, withKeyPath:#keyPath(fleet), options:nil)
fleetController.addObserver(self, forKeyPath:"selection.name", context:nil)
shipKeys.forEach {
self.notifyChangeValue(forKey: #keyPath(fleetNumber))
}
+
+ NotificationCenter
+ .default
+ .addObserver(forName: .DidUpdateGuardEscape, object: nil, queue: nil) { [weak self] _ in
+
+ guard let `self` = self else { return }
+
+ self.notifyChangeValue(forKey: #keyPath(totalSeiku))
+ self.notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
+ self.notifyChangeValue(forKey: #keyPath(totalSakuteki))
+ self.notifyChangeValue(forKey: #keyPath(totalDrums))
+ self.notifyChangeValue(forKey: #keyPath(totalTPValue))
+ }
}
- override func observeValue(forKeyPath keyPath: String?,
- of object: Any?,
- change: [NSKeyValueChangeKey: Any]?,
- context: UnsafeMutableRawPointer?) {
+ override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "selection.name" {
case "equippedItem":
notifyChangeValue(forKey: #keyPath(totalSakuteki))
notifyChangeValue(forKey: #keyPath(totalDrums))
+ notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
+ notifyChangeValue(forKey: #keyPath(totalTPValue))
case "seiku":
notifyChangeValue(forKey: #keyPath(totalSeiku))
+ notifyChangeValue(forKey: #keyPath(totalCalclatedSeiku))
case "lv":
notifyChangeValue(forKey: #keyPath(totalLevel))
@IBAction func changeSakutekiCalculator(_ sender: Any?) {
- guard let menuItem = sender as? NSMenuItem
- else { return }
+ guard let menuItem = sender as? NSMenuItem else { return }
switch menuItem.tag {
case 0:
ships = array.flatMap { $0 }
[#keyPath(totalSakuteki), #keyPath(totalSeiku), #keyPath(totalCalclatedSeiku),
- #keyPath(totalLevel), #keyPath(totalDrums), #keyPath(repairable)]
+ #keyPath(totalLevel), #keyPath(totalDrums), #keyPath(repairable),
+ #keyPath(totalTPValue)]
.forEach { notifyChangeValue(forKey: $0) }
}
}
override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
- guard let action = menuItem.action
- else { return false }
+ guard let action = menuItem.action else { return false }
switch action {
if let _ = sakutekiCalculator as? SimpleCalculator {
- menuItem.state = menuItem.tag == 0 ? NSOnState : NSOffState
+ menuItem.state = (menuItem.tag == 0 ? .on : .off)
return true
let cond = 100 + sakuObj.condition
- menuItem.state = menuItem.tag == cond ? NSOnState : NSOffState
+ menuItem.state = (menuItem.tag == cond ? .on : .off)
return true
}
private func reorder(order: [Int]) {
guard order.count == 6 else {
+
print("FleetViewController: order count is not 6.")
return
}
- let views: [NSView] = details.map { $0.view }
- let options: [NSAutoresizingMaskOptions] = views.map { $0.autoresizingMask }
+ let views = details.map { $0.view }
+ let options = views.map { $0.autoresizingMask }
let reorderedOptions = order.map { options[$0] }
zip(views, reorderedOptions).forEach { $0.0.autoresizingMask = $0.1 }
- let frames: [NSRect] = views.map { $0.frame }
+ let frames = views.map { $0.frame }
let reorderedFrames = order.map { frames[$0] }
zip(views, reorderedFrames)
.forEach { $0.0.setFrame($0.1, animate: enableAnimation) }
}
- fileprivate func reorderShipToDoubleLine() {
+ private func reorderShipToDoubleLine() {
reorder(order: [0, 3, 1, 4, 2, 5])
}
- fileprivate func reorderShipToLeftToRight() {
+ private func reorderShipToLeftToRight() {
reorder(order: [0, 2, 4, 1, 3, 5])
}
private var repairShipIds: [Int] { return [19] }
- dynamic var repairable: Bool {
+ @objc dynamic var repairable: Bool {
- guard let flagShip = fleet?[0]
- else { return false }
+ guard let flagShip = fleet?[0] else { return false }
return repairShipIds.contains(flagShip.master_ship.stype.id)
}
}
+
+extension FleetViewController: NibLoadable {}