2 // AirBaseWindowController.swift
5 // Created by Hori,Masaki on 2016/12/22.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 final class AirBaseWindowController: NSWindowController {
13 @objc let managedObjectContext = ServerDataStore.default.context
15 @IBOutlet private var areaMatrix: NSMatrix!
16 @IBOutlet private var squadronTab: NSSegmentedControl!
17 @IBOutlet private var planesTable: NSTableView!
18 @IBOutlet private var airBaseController: NSArrayController!
20 private var contentObservation: NSKeyValueObservation?
22 override var windowNibName: NSNib.Name {
24 return .nibName(instanceOf: self)
27 @objc dynamic var areaId: Int = 0 {
36 @objc dynamic var rId: Int = 1 {
45 private var areas: [Int] {
47 guard let content = airBaseController.content as? [AirBase] else {
53 .compactMap { $0.area_id }
58 override func windowDidLoad() {
62 contentObservation = airBaseController.observe(\NSArrayController.content) { [weak self] _, _ in
64 guard let `self` = self else {
69 self.updateAreaRadio()
70 self.updatePlaneSegment()
74 self.areaId = self.areas.first ?? 0
75 self.updatePredicate()
80 private func updateAreaRadio() {
83 let areas = self.areas
84 let currentTags = areaMatrix.cells.map { $0.tag }
86 if currentTags == areas {
91 // 最初の設定以外でareasが空の場合は処理をしない
92 if areas.isEmpty, areaId != 0 {
97 let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
98 if areas.count != cellCount {
100 let diff = areas.count - areaMatrix.numberOfColumns
101 while areas.count != areaMatrix.numberOfColumns {
105 areaMatrix.removeColumn(0)
109 areaMatrix.addColumn()
114 if areaMatrix.numberOfColumns == 0 {
116 areaMatrix.addColumn()
117 let areaCell = areaMatrix.cell(atRow: 0, column: 0)
119 areaCell?.tag = -10_000
121 areaMatrix.isEnabled = false
125 areaMatrix.isEnabled = true
128 let t = AreaNameTransformer()
129 areas.enumerated().forEach {
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
137 private func updatePlaneSegment() {
139 guard let content = airBaseController.content as? [AirBase] else {
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) }
150 private func updatePredicate() {
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)
160 extension AirBaseWindowController: NSTableViewDelegate {
162 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
164 guard let identifier = tableColumn?.identifier else {
169 return tableView.makeView(withIdentifier: identifier, owner: nil)
172 func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {