OSDN Git Service

処理を簡素にわかりやすくした
[kcd/KCD.git] / KCD / BattleInformationViewController.swift
1 //
2 //  BattleInformationViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/11/30.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 class BattleInformationViewController: NSViewController {
12     
13     private let notificationObserver = NotificationObserver()
14     
15     @objc private let battleManagedObjectContext = TemporaryDataStore.default.context
16     
17     @IBOutlet private var battleContoller: NSObjectController!
18     @IBOutlet private weak var cellNumberField: NSTextField!
19     
20     override var nibName: NSNib.Name {
21         
22         return .nibName(instanceOf: self)
23     }
24     
25     private var battle: Battle? {
26         didSet { updateProperties() }
27     }
28     @objc dynamic private var cellNumber: Int = 0
29     private var battleCellNumber: Int = 0
30     private var isBossCell: Bool = false
31     private var deckId: Int = 0 {
32         didSet {
33             fleetName = ServerDataStore.default.deck(by: deckId)?.name
34         }
35     }
36     private var fleetName: String?
37     private var mapArea: Int?
38     private var mapInfo: Int?
39     private var areaNumber: String? {
40         
41         guard let mapInfo = self.mapInfo else { return nil }
42         
43         let mapArea: String
44         switch self.mapArea {
45         case let area? where area > 10: mapArea = "E"
46         case let area?: mapArea = "\(area)"
47         case .none: return nil
48         }
49         
50         return "\(mapArea)-\(mapInfo)"
51     }
52     private var areaName: String? {
53         
54         guard let mapArea = self.mapArea else { return nil }
55         guard let mapInfo = self.mapInfo else { return nil }
56         
57         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
58     }
59     
60     @objc private var sortieString: String? {
61         
62         guard let fleetName = self.fleetName else { return nil }
63         guard let areaName = self.areaName else { return nil }
64         guard let areaNumber = self.areaNumber else { return nil }
65         
66         if battleCellNumber == 0 {
67             
68             return String(format: LocalizedStrings.sortieInfomation.string,
69                           arguments: [fleetName, areaName, areaNumber])
70         }
71         if isBossCell {
72             
73             return String(format: LocalizedStrings.battleWithBOSS.string,
74                           arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
75         }
76         
77         return String(format: LocalizedStrings.battleInformation.string,
78                       arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
79     }
80     
81     override func viewDidLoad() {
82         
83         super.viewDidLoad()
84         
85         notificationObserver
86             .addObserver(forName: .NSManagedObjectContextObjectsDidChange,
87                          object: TemporaryDataStore.default.context,
88                          queue: .main) { notification in
89                             
90                             if let battle: Battle = notification.insertedManagedObjects().first {
91                                 
92                                 self.battle = battle
93                             }
94                             
95                             if let _: Battle = notification.updatedManagedObjects().first {
96                                 
97                                 self.updateProperties()
98                             }
99                             
100                             if let _: Battle = notification.deletedManagedObjects().first {
101                                 
102                                 self.battle = nil
103                             }
104         }
105         
106         #if DEBUG
107             cellNumberField.isHidden = false
108         #endif
109     }
110     
111     private func updateProperties() {
112         
113         cellNumber = battle?.no ?? 0
114         battleCellNumber = battle?.battleCell as? Int ?? 0
115         isBossCell = battle?.isBossCell ?? false
116         deckId = battle?.deckId ?? 0
117         mapArea = battle?.mapArea
118         mapInfo = battle?.mapInfo
119         
120         notifyChangeValue(forKey: #keyPath(sortieString))
121     }
122 }