OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / ShipMasterDetailWindowController.swift
index 177e77c..dd95a54 100644 (file)
 
 import Cocoa
 
-class ShipMasterDetailWindowController: NSWindowController {
-    let managedObjectContext = ServerDataStore.default.managedObjectContext
-    let fleetManager: FleetManager = {
-        let appDelegate = NSApplication.shared().delegate as! AppDelegate
-        return appDelegate.fleetManager
+final class ShipMasterDetailWindowController: NSWindowController {
+    
+    @objc let managedObjectContext = ServerDataStore.default.context
+    @objc let fleetManager: FleetManager = {
+        
+        return AppDelegate.shared.fleetManager ?? FleetManager()
     }()
     let specNames = [
-        "name", "shortTypeName",
+        "id", "name", "shortTypeName",
         "slot_0", "slot_1", "slot_2", "slot_3", "slot_4",
         "onslot_0", "onslot_1", "onslot_2", "onslot_3", "onslot_4",
-        "leng", "slot_ex", "id"
+        "leng", "slot_ex", "sakuteki_0", "sakuteki_1"
     ]
     
-    @IBOutlet var shipController: NSArrayController!
-    @IBOutlet var fleetMemberController: NSArrayController!
-    @IBOutlet weak var shipsView: NSTableView!
-    @IBOutlet weak var fleetMemberView: NSTableView!
-    @IBOutlet weak var sally: NSTextField!
+    @IBOutlet private var shipController: NSArrayController!
+    @IBOutlet private var fleetMemberController: NSArrayController!
+    @IBOutlet private var deckController: NSArrayController!
+    @IBOutlet private weak var decksView: NSTableView!
+    @IBOutlet private weak var shipsView: NSTableView!
+    @IBOutlet private weak var fleetMemberView: NSTableView!
+    @IBOutlet private weak var sally: NSTextField!
     
-    override var windowNibName: String! {
-        return "ShipMasterDetailWindowController"
+    override var windowNibName: NSNib.Name {
+        
+        return .nibName(instanceOf: self)
     }
     
-    dynamic var selectedShip: Ship? {
+    @objc dynamic var selectedDeck: Deck? {
+        
+        didSet {
+            fleetShips = selectedDeck?[0...6] ?? []
+        }
+    }
+    
+    @objc dynamic var fleetShips: [Ship] = []
+    
+    @objc dynamic var selectedShip: Ship? {
+        
         didSet { buildSpec() }
     }
-    dynamic var spec: [[String: AnyObject]] = []
+    @objc dynamic var spec: [[String: Any]] = []
     
-    var equipments: NSArray?
+    @objc dynamic var equipments: NSArray?
     
     private func buildSpec() {
+        
         guard let selectedShip = selectedShip else { return }
-        spec = specNames.flatMap { (s:String) -> [String: AnyObject]? in
-            guard let v = selectedShip.value(forKeyPath: s) else { return nil }
-            var d = [String: AnyObject]()
-            d["name"] = s as AnyObject?
-            d["value"] = v as AnyObject?
-            return d
+        
+        spec = specNames.compactMap { key -> [String: Any]? in
+            
+            guard let v = selectedShip.value(forKeyPath: key) else { return nil }
+            
+            return ["name": key, "value": v]
         }
         equipments = selectedShip.equippedItem.array as NSArray?
     }
     
     @IBAction func applySally(_ sender: AnyObject?) {
+        
         let store = ServerDataStore.oneTimeEditor()
-        guard let i = selectedShip?.objectID,
-            let ship = store.object(with: i) as? Ship
-            else { return }
-        ship.sally_area = sally.integerValue as NSNumber
+        store.sync {
+            guard let selectedShip = self.selectedShip else { return }
+            guard let ship = store.exchange(selectedShip) else { return }
+            //
+            //        ship.sally_area = sally.integerValue as NSNumber
+            
+            let eq = ship.equippedItem.array
+            let slotId = self.sally.integerValue
+            
+            let pos = min(4, eq.count)
+            
+            if eq.count > 4 {
+                
+                ship.equippedItem = NSOrderedSet(array: Array(eq.dropLast()))
+            }
+            
+            if let slotItem = store.slotItem(by: slotId) {
+                
+                ship.setItem(slotId, to: pos)
+                
+                ship.equippedItem = NSOrderedSet(array: ship.equippedItem.array + [slotItem])
+            }
+            
+            store.save(errorHandler: {_ in})
+        }
     }
 }
 
 extension ShipMasterDetailWindowController: NSTableViewDelegate {
+    
     func tableViewSelectionDidChange(_ notification: Notification) {
+        
         guard let tableView = notification.object as? NSTableView else { return }
+        
         let controller = [
             (shipsView, shipController),
-            (fleetMemberView, fleetMemberController)
+            (fleetMemberView, fleetMemberController),
+            (decksView, deckController)
             ]
+            .lazy
             .filter { $0.0 == tableView }
+            .flatMap { $0.1 }
             .first
-        guard let selectedObjects = controller?.1.selectedObjects as? [Ship],
-            selectedObjects.count != 0 else { return }
-        selectedShip = selectedObjects[0]
+        
+        if let selectedObjects = controller?.selectedObjects as? [Ship] {
+            
+            selectedShip = selectedObjects.first
+            
+        } else if let selectedObjects = controller?.selectedObjects as? [Deck] {
+        
+            selectedDeck = selectedObjects.first
+        }
     }
 }
-