OSDN Git Service

staticプロパティをインスタンスプロパティに変更
[kcd/KCD.git] / KCD / DocksViewController.swift
index 71007f1..62e59e3 100644 (file)
 
 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()
+    func update()
+}
+
+final class DocksViewController: MainTabVIewItemViewController {
     
-    let missionStates = (2...4).flatMap { MissionStatus(number: $0) }
-    let ndockStatus = (1...4).flatMap { NyukyoDockStatus(number: $0) }
-    let kdockStatus = (1...4).flatMap { KenzoDockStatus(number: $0) }
+    @objc let managedObjectContext = ServerDataStore.default.context
+    let questListViewController = QuestListViewController()
+    let battleInfoViewController = BattleInformationViewController()
     
-    var nDock1Time: NSNumber? = nil
-    var nDock2Time: NSNumber? = nil
-    var nDock3Time: NSNumber? = nil
-    var nDock4Time: NSNumber? = nil
+    private var updaters: [DockInformationUpdater] = []
     
-    var nDock1ShipName: String? = nil
-    var nDock2ShipName: String? = nil
-    var nDock3ShipName: String? = nil
-    var nDock4ShipName: String? = nil
+    @objc dynamic var nDock1Time: NSNumber?
+    @objc dynamic var nDock2Time: NSNumber?
+    @objc dynamic var nDock3Time: NSNumber?
+    @objc dynamic var nDock4Time: NSNumber?
     
-    var kDock1Time: NSNumber? = nil
-    var kDock2Time: NSNumber? = nil
-    var kDock3Time: NSNumber? = nil
-    var kDock4Time: NSNumber? = nil
+    @objc dynamic var nDock1ShipName: String?
+    @objc dynamic var nDock2ShipName: String?
+    @objc dynamic var nDock3ShipName: String?
+    @objc dynamic var nDock4ShipName: String?
     
-    var deck2Time: NSNumber? = nil
-    var deck3Time: NSNumber? = nil
-    var deck4Time: NSNumber? = nil
+    @objc dynamic var kDock1Time: NSNumber?
+    @objc dynamic var kDock2Time: NSNumber?
+    @objc dynamic var kDock3Time: NSNumber?
+    @objc dynamic var kDock4Time: NSNumber?
     
-    var mission2Name: String? = nil
-    var mission3Name: String? = nil
-    var mission4Name: String? = nil
+    @objc dynamic var deck2Time: NSNumber?
+    @objc dynamic var deck3Time: NSNumber?
+    @objc dynamic var deck4Time: NSNumber?
     
-    @IBOutlet var battleContoller: NSObjectController!
-    @IBOutlet weak var questListViewPlaceholder: NSView!
-    @IBOutlet weak var cellNumberField: NSTextField!
+    @objc dynamic var mission2Name: String?
+    @objc dynamic var mission3Name: String?
+    @objc dynamic var mission4Name: String?
     
-    override var nibName: String! {
-        return "DocksViewController"
-    }
+    @IBOutlet private weak var battleInformationViewPlaceholder: NSView!
+    @IBOutlet private weak var questListViewPlaceholder: NSView!
     
-    var battle: Battle? {
-        return TemporaryDataStore.default.battle()
-    }
-    
-    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()
         
-        let appDelegate = NSApplication.shared().delegate as! AppDelegate
-        appDelegate.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: ()
+            
         }
     }
-    
 }