import Cocoa
-class DocksViewController: MainTabVIewItemViewController {
- deinit {
- [("deck2Time", "mission2Name"),
- ("deck3Time", "mission3Name"),
- ("deck4Time", "mission4Name")]
- .forEach {
- unbind($0.0)
- unbind($0.1)
- }
- [("nDock1Time", "nDock1ShipName"),
- ("nDock2Time", "nDock2ShipName"),
- ("nDock3Time", "nDock3ShipName"),
- ("nDock4Time", "nDock4ShipName")]
- .forEach {
- unbind($0.0)
- unbind($0.1)
- }
- ["kDock1Time", "kDock2Time", "kDock3Time", "kDock4Time"]
- .forEach { unbind($0) }
-
- ["selection", "selection.no", "content.battleCell"]
- .forEach {
- battleContoller.removeObserver(self, forKeyPath: $0)
- }
- }
+protocol DockInformationUpdater: class {
- let managedObjectContext = ServerDataStore.default.managedObjectContext
- let battleManagedObjectController = TemporaryDataStore.default.managedObjectContext
- let questListViewController = QuestListViewController()
-
- let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
- let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
- let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
+ func update()
+}
+
+final class DocksViewController: MainTabVIewItemViewController {
- var nDock1Time: NSNumber? = nil
- var nDock2Time: NSNumber? = nil
- var nDock3Time: NSNumber? = nil
- var nDock4Time: NSNumber? = nil
+ @objc let managedObjectContext = ServerDataStore.default.context
+ let questListViewController = QuestListViewController()
+ let battleInfoViewController = BattleInformationViewController()
- var nDock1ShipName: String? = nil
- var nDock2ShipName: String? = nil
- var nDock3ShipName: String? = nil
- var nDock4ShipName: String? = nil
+ private var updaters: [DockInformationUpdater] = []
- var kDock1Time: NSNumber? = nil
- var kDock2Time: NSNumber? = nil
- var kDock3Time: NSNumber? = nil
- var kDock4Time: NSNumber? = nil
+ @objc dynamic var nDock1Time: NSNumber?
+ @objc dynamic var nDock2Time: NSNumber?
+ @objc dynamic var nDock3Time: NSNumber?
+ @objc dynamic var nDock4Time: NSNumber?
- var deck2Time: NSNumber? = nil
- var deck3Time: NSNumber? = nil
- var deck4Time: NSNumber? = nil
+ @objc dynamic var nDock1ShipName: String?
+ @objc dynamic var nDock2ShipName: String?
+ @objc dynamic var nDock3ShipName: String?
+ @objc dynamic var nDock4ShipName: String?
- var mission2Name: String? = nil
- var mission3Name: String? = nil
- var mission4Name: String? = nil
+ @objc dynamic var kDock1Time: NSNumber?
+ @objc dynamic var kDock2Time: NSNumber?
+ @objc dynamic var kDock3Time: NSNumber?
+ @objc dynamic var kDock4Time: NSNumber?
- @IBOutlet var battleContoller: NSObjectController!
- @IBOutlet weak var questListViewPlaceholder: NSView!
- @IBOutlet weak var cellNumberField: NSTextField!
+ @objc dynamic var deck2Time: NSNumber?
+ @objc dynamic var deck3Time: NSNumber?
+ @objc dynamic var deck4Time: NSNumber?
- override var nibName: String! {
- return "DocksViewController"
- }
+ @objc dynamic var mission2Name: String?
+ @objc dynamic var mission3Name: String?
+ @objc dynamic var mission4Name: String?
- var battle: Battle? {
- return TemporaryDataStore.default.battle()
- }
+ @IBOutlet private weak var battleInformationViewPlaceholder: NSView!
+ @IBOutlet private weak var questListViewPlaceholder: NSView!
- var cellNumber: Int {
- return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
- }
- var battleCellNumber: Int {
- return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
- }
- var isBossCell: Bool {
- return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
- }
- var fleetName: String? {
- guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
- return ServerDataStore.default.deck(byId: deckId)?.name
- }
- var areaNumber: String? {
- let mapArea: String = {
- guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
- if mapArea > 10 { return "E" }
- return "\(mapArea)"
- }()
- guard mapArea != "" else { return nil }
- guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
- return "\(mapArea)-\(mapInfo)"
- }
- var areaName: String? {
- guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int,
- let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int
- else { return nil }
+ override var nibName: NSNib.Name {
- return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
- }
- var sortieString: String? {
- guard let fleetName = self.fleetName,
- let areaName = self.areaName,
- let areaNumber = self.areaNumber
- else { return nil }
- if battleCellNumber == 0 {
- let format = NSLocalizedString("%@ in sortie into %@ (%@)", comment: "Sortie")
- return String(format: format, arguments: [fleetName, areaName, areaNumber])
- }
- if isBossCell {
- let format = NSLocalizedString("%@ battle against the enemy main fleet at %@ war zone in %@ (%@) now", comment: "Sortie")
- return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
- }
- let format = NSLocalizedString("%@ battle at %@ war zone in %@ (%@) now", comment: "Sortie")
- return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
+ return .nibName(instanceOf: self)
}
override func viewDidLoad() {
+
super.viewDidLoad()
setupStatus()
- AppDelegate.shared.addCounterUpdate {
- self.missionStates.forEach { $0.update() }
- self.kdockStatus.forEach { $0.update() }
- self.ndockStatus.forEach { $0.update() }
+ replace(view: battleInformationViewPlaceholder, with: battleInfoViewController)
+ replace(view: questListViewPlaceholder, with: questListViewController)
+ }
+
+ private func setupStatus() {
+
+ (2...4).forEach {
+
+ createMissionSatusFuture(number: $0)
+ .onSuccess { status in
+
+ self.updaters += [status]
+ status.delegate = self
+ }
+ .onFailure { error in
+
+ Logger.shared.log("\(error)")
+ }
}
- questListViewController.view.frame = questListViewPlaceholder.frame
- questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
- questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
-
- ["selection", "selection.no", "content.battleCell"]
- .forEach {
- battleContoller.addObserver(self, forKeyPath: $0, context: nil)
+ (1...4).forEach {
+
+ createNyukyoDockStatusFuture(number: $0)
+ .onSuccess { status in
+
+ self.updaters += [status]
+ status.delegate = self
+ }
+ .onFailure { error in
+
+ Logger.shared.log("\(error)")
+ }
+
+ createKenzoDockStatusFuture(number: $0)
+ .onSuccess { status in
+
+ self.updaters += [status]
+ status.delegate = self
+ }
+ .onFailure { error in
+
+ Logger.shared.log("\(error)")
+ }
}
- #if DEBUG
- cellNumberField.isHidden = false
- #endif
+ AppDelegate.shared.addCounterUpdate {
+
+ self.updaters.forEach { $0.update() }
+ }
}
+}
+
+extension DocksViewController: MissionStatusObserver {
- override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
- if keyPath == "selection" || keyPath == "content.battleCell" {
- willChangeValue(forKey: "sortieString")
- didChangeValue(forKey: "sortieString")
- return
- }
- if keyPath == "selection.no" {
- willChangeValue(forKey: "cellNumber")
- didChangeValue(forKey: "cellNumber")
- return
- }
+ func didUpdate(state: MissionStatus) {
- super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+ switch state.number {
+
+ case 2:
+ deck2Time = state.time.map { $0 as NSNumber }
+ mission2Name = state.name
+
+ case 3:
+ deck3Time = state.time.map { $0 as NSNumber }
+ mission3Name = state.name
+
+ case 4:
+ deck4Time = state.time.map { $0 as NSNumber }
+ mission4Name = state.name
+
+ default: ()
+
+ }
}
+}
+
+extension DocksViewController: NyukyoDockStatusObserver {
- private func setupStatus() {
- let missionKeys = [
- ("deck2Time", "mission2Name"),
- ("deck3Time", "mission3Name"),
- ("deck4Time", "mission4Name")
- ]
- zip(missionStates, missionKeys).forEach {
- bind($0.1.0, to: $0.0, withKeyPath: "time", options: nil)
- bind($0.1.1, to: $0.0, withKeyPath: "name", options: nil)
- }
+ func didUpdate(state: NyukyoDockStatus) {
- let ndockKeys = [
- ("nDock1Time", "nDock1ShipName"),
- ("nDock2Time", "nDock2ShipName"),
- ("nDock3Time", "nDock3ShipName"),
- ("nDock4Time", "nDock4ShipName")
- ]
- zip(ndockStatus, ndockKeys).forEach {
- bind($0.1.0, to: $0.0, withKeyPath: "time", options: nil)
- bind($0.1.1, to: $0.0, withKeyPath: "name", options: nil)
+ switch state.number {
+
+ case 1:
+ nDock1Time = state.time.map { $0 as NSNumber }
+ nDock1ShipName = state.name
+
+ case 2:
+ nDock2Time = state.time.map { $0 as NSNumber }
+ nDock2ShipName = state.name
+
+ case 3:
+ nDock3Time = state.time.map { $0 as NSNumber }
+ nDock3ShipName = state.name
+
+ case 4:
+ nDock4Time = state.time.map { $0 as NSNumber }
+ nDock4ShipName = state.name
+
+ default: ()
+
}
+ }
+}
+
+extension DocksViewController: KenzoDockStatusObserver {
+
+ func didUpdate(state: KenzoDockStatus) {
- let kdockKeys = ["kDock1Time", "kDock2Time", "kDock3Time", "kDock4Time"]
- zip(kdockStatus, kdockKeys).forEach {
- bind($0.1, to: $0.0, withKeyPath: "time", options: nil)
+ switch state.number {
+
+ case 1:
+ kDock1Time = state.time.map { $0 as NSNumber }
+
+ case 2:
+ kDock2Time = state.time.map { $0 as NSNumber }
+
+ case 3:
+ kDock3Time = state.time.map { $0 as NSNumber }
+
+ case 4:
+ kDock4Time = state.time.map { $0 as NSNumber }
+
+ default: ()
+
}
}
-
}