OSDN Git Service

洋上補給の補強増設用のショートネームをつけた
[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             updatePredicate()
31             updatePlaneSegment()
32         }
33     }
34     
35     @objc dynamic var rId: Int = 1 {
36         
37         didSet {
38             updatePredicate()
39             updatePlaneSegment()
40         }
41     }
42     
43     private var areas: [Int] {
44         
45         guard let content = airBaseController.content as? [AirBase] else { return [] }
46         
47         return content
48             .flatMap { $0.area_id }
49             .unique()
50             .sorted(by: <)
51     }
52     
53     override func windowDidLoad() {
54         
55         super.windowDidLoad()
56                 
57         contentObservation = airBaseController.observe(\NSArrayController.content) { [weak self] _, _ in
58             
59             guard let `self` = self else { return }
60             
61             self.updateAreaRadio()
62             self.updatePlaneSegment()
63             
64             if self.areaId == 0 {
65                 
66                 self.areaId = self.areas.first ?? 0
67                 self.updatePredicate()
68             }
69         }
70     }
71     
72     private func updateAreaRadio() {
73         
74         //  更新の必要性チェック
75         let areas = self.areas
76         let currentTags = areaMatrix.cells.map { $0.tag }
77         
78         if currentTags == areas { return }
79         
80         // 最初の設定以外でareasが空の場合は処理をしない
81         if areas.isEmpty, areaId != 0 { return }
82         
83         let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
84         if areas.count != cellCount {
85             
86             let diff = areas.count - areaMatrix.numberOfColumns
87             while areas.count != areaMatrix.numberOfColumns {
88                 
89                 if diff < 0 {
90                     
91                     areaMatrix.removeColumn(0)
92                     
93                 } else {
94                     
95                     areaMatrix.addColumn()
96                 }
97             }
98         }
99         
100         if areaMatrix.numberOfColumns == 0 {
101             
102             areaMatrix.addColumn()
103             let areaCell = areaMatrix.cell(atRow: 0, column: 0)
104             areaCell?.title = ""
105             areaCell?.tag = -10_000
106             
107             areaMatrix.isEnabled = false
108             
109         } else {
110             
111             areaMatrix.isEnabled = true
112         }
113         
114         let t = AreaNameTransformer()
115         areas.enumerated().forEach {
116             
117             let areaCell = areaMatrix.cell(atRow: 0, column: $0.offset)
118             areaCell?.title = t.transformedValue($0.element) as? String ?? String($0.element)
119             areaCell?.tag = $0.element
120         }
121     }
122     
123     private func updatePlaneSegment() {
124         
125         guard let content = airBaseController.content as? [AirBase] else { return }
126         
127         let area = NSCountedSet()
128         content.forEach { area.add($0.area_id) }
129         let count = area.count(for: areaId)
130         (0...2).forEach { squadronTab.setEnabled($0 < count, forSegment: $0) }
131     }
132     
133     private func updatePredicate() {
134         
135         airBaseController.filterPredicate = NSPredicate.empty
136             .and(NSPredicate(#keyPath(AirBase.area_id), equal: areaId))
137             .and(NSPredicate(#keyPath(AirBase.rid), equal: rId))
138         airBaseController.setSelectionIndex(0)
139         planesTable.deselectAll(nil)
140     }
141 }
142
143 extension AirBaseWindowController: NSTableViewDelegate {
144     
145     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
146         
147         guard let identifier = tableColumn?.identifier else { return nil }
148         
149         return tableView.makeView(withIdentifier: identifier, owner: nil)
150     }
151     
152     func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
153         
154         return false
155     }
156 }