import Cocoa
-final class DocksViewController: MainTabVIewItemViewController {
+protocol DockInformationUpdater: class {
- deinit {
-
- [NSBindingName(#keyPath(deck2Time)), NSBindingName(#keyPath(mission2Name)),
- NSBindingName(#keyPath(deck3Time)), NSBindingName(#keyPath(mission3Name)),
- NSBindingName(#keyPath(deck4Time)), NSBindingName(#keyPath(mission4Name))]
- .forEach(unbind)
- [NSBindingName(#keyPath(nDock1Time)), NSBindingName(#keyPath(nDock1ShipName)),
- NSBindingName(#keyPath(nDock2Time)), NSBindingName(#keyPath(nDock2ShipName)),
- NSBindingName(#keyPath(nDock3Time)), NSBindingName(#keyPath(nDock3ShipName)),
- NSBindingName(#keyPath(nDock4Time)), NSBindingName(#keyPath(nDock4ShipName))]
- .forEach(unbind)
- [NSBindingName(#keyPath(kDock1Time)), NSBindingName(#keyPath(kDock2Time)),
- NSBindingName(#keyPath(kDock3Time)), NSBindingName(#keyPath(kDock4Time))]
- .forEach(unbind)
- }
+ func update()
+}
+
+final class DocksViewController: MainTabVIewItemViewController {
@objc let managedObjectContext = ServerDataStore.default.context
let questListViewController = QuestListViewController()
let battleInfoViewController = BattleInformationViewController()
- let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
- let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
- let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
+ private var updaters: [DockInformationUpdater] = []
- @objc var nDock1Time: NSNumber?
- @objc var nDock2Time: NSNumber?
- @objc var nDock3Time: NSNumber?
- @objc var nDock4Time: NSNumber?
+ @objc dynamic var nDock1Time: NSNumber?
+ @objc dynamic var nDock2Time: NSNumber?
+ @objc dynamic var nDock3Time: NSNumber?
+ @objc dynamic var nDock4Time: NSNumber?
- @objc var nDock1ShipName: String?
- @objc var nDock2ShipName: String?
- @objc var nDock3ShipName: String?
- @objc var nDock4ShipName: String?
+ @objc dynamic var nDock1ShipName: String?
+ @objc dynamic var nDock2ShipName: String?
+ @objc dynamic var nDock3ShipName: String?
+ @objc dynamic var nDock4ShipName: String?
- @objc var kDock1Time: NSNumber?
- @objc var kDock2Time: NSNumber?
- @objc var kDock3Time: NSNumber?
- @objc var kDock4Time: NSNumber?
+ @objc dynamic var kDock1Time: NSNumber?
+ @objc dynamic var kDock2Time: NSNumber?
+ @objc dynamic var kDock3Time: NSNumber?
+ @objc dynamic var kDock4Time: NSNumber?
- @objc var deck2Time: NSNumber?
- @objc var deck3Time: NSNumber?
- @objc var deck4Time: NSNumber?
+ @objc dynamic var deck2Time: NSNumber?
+ @objc dynamic var deck3Time: NSNumber?
+ @objc dynamic var deck4Time: NSNumber?
- @objc var mission2Name: String?
- @objc var mission3Name: String?
- @objc var mission4Name: String?
+ @objc dynamic var mission2Name: String?
+ @objc dynamic var mission3Name: String?
+ @objc dynamic var mission4Name: String?
- @IBOutlet weak var battleInformationViewPlaceholder: NSView!
- @IBOutlet weak var questListViewPlaceholder: NSView!
+ @IBOutlet private weak var battleInformationViewPlaceholder: NSView!
+ @IBOutlet private weak var questListViewPlaceholder: NSView!
override var nibName: NSNib.Name {
setupStatus()
- AppDelegate.shared.addCounterUpdate {
+ replace(view: battleInformationViewPlaceholder, with: battleInfoViewController)
+ replace(view: questListViewPlaceholder, with: questListViewController)
+ }
+
+ private func setupStatus() {
+
+ (2...4).forEach {
- self.missionStates.forEach { $0.update() }
- self.kdockStatus.forEach { $0.update() }
- self.ndockStatus.forEach { $0.update() }
+ createMissionSatusFuture(number: $0)
+ .onSuccess { status in
+
+ self.updaters += [status]
+ status.delegate = self
+ }
+ .onFailure { error in
+
+ Logger.shared.log("\(error)")
+ }
}
- battleInfoViewController.view.frame = battleInformationViewPlaceholder.frame
- battleInfoViewController.view.autoresizingMask = battleInformationViewPlaceholder.autoresizingMask
- battleInformationViewPlaceholder.superview?.replaceSubview(battleInformationViewPlaceholder, with: battleInfoViewController.view)
+ (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)")
+ }
+ }
- questListViewController.view.frame = questListViewPlaceholder.frame
- questListViewController.view.autoresizingMask = questListViewPlaceholder.autoresizingMask
- questListViewPlaceholder.superview?.replaceSubview(questListViewPlaceholder, with: questListViewController.view)
+ AppDelegate.shared.addCounterUpdate {
+
+ self.updaters.forEach { $0.update() }
+ }
}
+}
+
+extension DocksViewController: MissionStatusObserver {
- private func setupStatus() {
+ func didUpdate(state: MissionStatus) {
- let missionKeys = [
- (#keyPath(deck2Time), #keyPath(mission2Name)),
- (#keyPath(deck3Time), #keyPath(mission3Name)),
- (#keyPath(deck4Time), #keyPath(mission4Name))
- ]
- zip(missionStates, missionKeys).forEach {
-
- bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(MissionStatus.time), options: nil)
- bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(MissionStatus.name), options: nil)
+ 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 {
+
+ func didUpdate(state: NyukyoDockStatus) {
- let ndockKeys = [
- (#keyPath(nDock1Time), #keyPath(nDock1ShipName)),
- (#keyPath(nDock2Time), #keyPath(nDock2ShipName)),
- (#keyPath(nDock3Time), #keyPath(nDock3ShipName)),
- (#keyPath(nDock4Time), #keyPath(nDock4ShipName))
- ]
- zip(ndockStatus, ndockKeys).forEach {
-
- bind(NSBindingName(rawValue: $0.1.0), to: $0.0, withKeyPath: #keyPath(NyukyoDockStatus.time), options: nil)
- bind(NSBindingName(rawValue: $0.1.1), to: $0.0, withKeyPath: #keyPath(NyukyoDockStatus.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 = [#keyPath(kDock1Time), #keyPath(kDock2Time), #keyPath(kDock3Time), #keyPath(kDock4Time)]
- zip(kdockStatus, kdockKeys).forEach {
+ 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: ()
- bind(NSBindingName(rawValue: $0.1), to: $0.0, withKeyPath: #keyPath(KenzoDockStatus.time), options: nil)
}
}
-
}