2 // ShipMasterDetailWindowController.swift
5 // Created by Hori,Masaki on 2017/01/05.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 final class ShipMasterDetailWindowController: NSWindowController {
13 @objc let managedObjectContext = ServerDataStore.default.context
14 @objc let fleetManager: FleetManager = {
16 return AppDelegate.shared.fleetManager ?? FleetManager()
19 "id", "name", "shortTypeName",
20 "slot_0", "slot_1", "slot_2", "slot_3", "slot_4",
21 "onslot_0", "onslot_1", "onslot_2", "onslot_3", "onslot_4",
22 "leng", "slot_ex", "sakuteki_0", "sakuteki_1"
25 @IBOutlet private var shipController: NSArrayController!
26 @IBOutlet private var fleetMemberController: NSArrayController!
27 @IBOutlet private var deckController: NSArrayController!
28 @IBOutlet private weak var decksView: NSTableView!
29 @IBOutlet private weak var shipsView: NSTableView!
30 @IBOutlet private weak var fleetMemberView: NSTableView!
31 @IBOutlet private weak var sally: NSTextField!
33 override var windowNibName: NSNib.Name {
35 return .nibName(instanceOf: self)
38 @objc dynamic var selectedDeck: Deck? {
42 fleetShips = selectedDeck?[0...6] ?? []
46 @objc dynamic var fleetShips: [Ship] = []
48 @objc dynamic var selectedShip: Ship? {
50 didSet { buildSpec() }
52 @objc dynamic var spec: [[String: Any]] = []
54 @objc dynamic var equipments: NSArray?
56 private func buildSpec() {
58 guard let selectedShip = selectedShip else {
63 spec = specNames.compactMap { key -> [String: Any]? in
65 guard let v = selectedShip.value(forKeyPath: key) else {
70 return ["name": key, "value": v]
72 equipments = selectedShip.equippedItem.array as NSArray?
75 @IBAction func applySally(_ sender: AnyObject?) {
77 let store = ServerDataStore.oneTimeEditor()
80 guard let selectedShip = self.selectedShip else {
84 guard let ship = store.exchange(selectedShip) else {
89 // ship.sally_area = sally.integerValue as NSNumber
91 let eq = ship.equippedItem.array
92 let slotId = self.sally.integerValue
94 let pos = min(4, eq.count)
98 ship.equippedItem = NSOrderedSet(array: Array(eq.dropLast()))
101 if let slotItem = store.slotItem(by: slotId) {
103 ship.setItem(slotId, to: pos)
105 ship.equippedItem = NSOrderedSet(array: ship.equippedItem.array + [slotItem])
108 store.save(errorHandler: {_ in})
113 extension ShipMasterDetailWindowController: NSTableViewDelegate {
115 func tableViewSelectionDidChange(_ notification: Notification) {
117 guard let tableView = notification.object as? NSTableView else {
123 (shipsView, shipController),
124 (fleetMemberView, fleetMemberController),
125 (decksView, deckController)
128 .filter { $0.0 == tableView }
132 if let selectedObjects = controller?.selectedObjects as? [Ship] {
134 selectedShip = selectedObjects.first
136 } else if let selectedObjects = controller?.selectedObjects as? [Deck] {
138 selectedDeck = selectedObjects.first