OSDN Git Service

staticプロパティをインスタンスプロパティに変更
[kcd/KCD.git] / KCD / DocksViewController.swift
index 551fe76..62e59e3 100644 (file)
@@ -8,57 +8,44 @@
 
 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 {
         
@@ -71,52 +58,130 @@ final class DocksViewController: MainTabVIewItemViewController {
         
         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)
         }
     }
-    
 }