OSDN Git Service

MappingConfigurationのプロパティを変更
[kcd/KCD.git] / KCD / FleetManager.swift
1 //
2 //  FleetManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 extension Notification.Name {
12     static let DidPrepareFleet = Notification.Name("com.masakih.KCD.Notification.DidPrepareFleet")
13 }
14
15 class FleetManager: NSObject {
16     override init() {
17         super.init()
18         setupFleets()
19     }
20     
21     private(set) var fleets: [Fleet] = []
22     private var fleetController: NSArrayController!
23     
24     override func observeValue(forKeyPath keyPath: String?,
25                                of object: Any?,
26                                change: [NSKeyValueChangeKey: Any]?,
27                                context: UnsafeMutableRawPointer?) {
28         if keyPath == "arrangedObjects.ships" {
29             setNewFleetNumberToShip()
30             return
31         }
32         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
33     }
34     
35     private func setupFleetController() {
36         fleetController = NSArrayController(content: fleets)
37         fleetController.addObserver(self, forKeyPath: "arrangedObjects.ships", context: nil)
38     }
39     private func setupFleets() {
40         fleets = (1...4).flatMap { Fleet(number: $0) }
41         guard fleets.count == 4 else { return print("Can not create Fleet") }
42         if fleets[0].ships.isEmpty {
43             let center = NotificationCenter.default
44             var token: NSObjectProtocol!
45             token = center.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) {_ in 
46                 center.removeObserver(token)
47                 self.setupFleetController()
48                 center.post(name: .DidPrepareFleet, object: self)
49             }
50         } else { setupFleetController() }
51     }
52     
53     private func setNewFleetNumberToShip() {
54         let store = ServerDataStore.oneTimeEditor()
55         
56         // clear all
57         store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
58         
59         // set
60         fleets.enumerated().forEach { (index, fleet) in
61             fleet.ships.forEach {
62                 store.ship(byId: $0.id)?.fleet = (index + 1) as NSNumber
63             }
64         }
65     }
66 }