OSDN Git Service

staticプロパティをインスタンスプロパティに変更
[kcd/KCD.git] / KCD / AirBaseWindowController.swift
1 //
2 //  AirBaseWindowController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/22.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class AirBaseWindowController: NSWindowController {
12     
13     @objc let managedObjectContext = ServerDataStore.default.context
14     
15     @IBOutlet private var areaMatrix: NSMatrix!
16     @IBOutlet private var squadronTab: NSSegmentedControl!
17     @IBOutlet private var planesTable: NSTableView!
18     @IBOutlet private var airBaseController: NSArrayController!
19     
20     private var contentObservation: NSKeyValueObservation?
21     
22     override var windowNibName: NSNib.Name {
23         
24         return .nibName(instanceOf: self)
25     }
26     
27     @objc dynamic var areaId: Int = 0 {
28         
29         didSet {
30             
31             updatePredicate()
32             updatePlaneSegment()
33         }
34     }
35     
36     @objc dynamic var rId: Int = 1 {
37         
38         didSet {
39             
40             updatePredicate()
41             updatePlaneSegment()
42         }
43     }
44     
45     private var areas: [Int] {
46         
47         guard let content = airBaseController.content as? [AirBase] else {
48             
49             return []
50         }
51         
52         return content
53             .compactMap { $0.area_id }
54             .unique()
55             .sorted(by: <)
56     }
57     
58     override func windowDidLoad() {
59         
60         super.windowDidLoad()
61                 
62         contentObservation = airBaseController.observe(\NSArrayController.content) { [weak self] _, _ in
63             
64             guard let `self` = self else {
65                 
66                 return
67             }
68             
69             self.updateAreaRadio()
70             self.updatePlaneSegment()
71             
72             if self.areaId == 0 {
73                 
74                 self.areaId = self.areas.first ?? 0
75                 self.updatePredicate()
76             }
77         }
78     }
79     
80     private func updateAreaRadio() {
81         
82         //  更新の必要性チェック
83         let areas = self.areas
84         let currentTags = areaMatrix.cells.map { $0.tag }
85         
86         if currentTags == areas {
87             
88             return
89         }
90         
91         // 最初の設定以外でareasが空の場合は処理をしない
92         if areas.isEmpty, areaId != 0 {
93             
94             return
95         }
96         
97         let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
98         if areas.count != cellCount {
99             
100             let diff = areas.count - areaMatrix.numberOfColumns
101             while areas.count != areaMatrix.numberOfColumns {
102                 
103                 if diff < 0 {
104                     
105                     areaMatrix.removeColumn(0)
106                     
107                 } else {
108                     
109                     areaMatrix.addColumn()
110                 }
111             }
112         }
113         
114         if areaMatrix.numberOfColumns == 0 {
115             
116             areaMatrix.addColumn()
117             let areaCell = areaMatrix.cell(atRow: 0, column: 0)
118             areaCell?.title = ""
119             areaCell?.tag = -10_000
120             
121             areaMatrix.isEnabled = false
122             
123         } else {
124             
125             areaMatrix.isEnabled = true
126         }
127         
128         let t = AreaNameTransformer()
129         areas.enumerated().forEach {
130             
131             let areaCell = areaMatrix.cell(atRow: 0, column: $0.offset)
132             areaCell?.title = t.transformedValue($0.element) as? String ?? String($0.element)
133             areaCell?.tag = $0.element
134         }
135     }
136     
137     private func updatePlaneSegment() {
138         
139         guard let content = airBaseController.content as? [AirBase] else {
140             
141             return
142         }
143         
144         let area = NSCountedSet()
145         content.forEach { area.add($0.area_id) }
146         let count = area.count(for: areaId)
147         (0...2).forEach { squadronTab.setEnabled($0 < count, forSegment: $0) }
148     }
149     
150     private func updatePredicate() {
151         
152         airBaseController.filterPredicate = NSPredicate.empty
153             .and(NSPredicate(#keyPath(AirBase.area_id), equal: areaId))
154             .and(NSPredicate(#keyPath(AirBase.rid), equal: rId))
155         airBaseController.setSelectionIndex(0)
156         planesTable.deselectAll(nil)
157     }
158 }
159
160 extension AirBaseWindowController: NSTableViewDelegate {
161     
162     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
163         
164         guard let identifier = tableColumn?.identifier else {
165             
166             return nil
167         }
168         
169         return tableView.makeView(withIdentifier: identifier, owner: nil)
170     }
171     
172     func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
173         
174         return false
175     }
176 }