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 {
35 @objc dynamic var rId: Int = 1 {
43 private var areas: [Int] {
45 guard let content = airBaseController.content as? [AirBase] else { return [] }
48 .flatMap { $0.area_id }
53 override func windowDidLoad() {
57 contentObservation = airBaseController.observe(\NSArrayController.content) { [weak self] _, _ in
59 guard let `self` = self else { return }
61 self.updateAreaRadio()
62 self.updatePlaneSegment()
66 self.areaId = self.areas.first ?? 0
67 self.updatePredicate()
72 private func updateAreaRadio() {
75 let areas = self.areas
76 let currentTags = areaMatrix.cells.map { $0.tag }
78 if currentTags == areas { return }
80 // 最初の設定以外でareasが空の場合は処理をしない
81 if areas.isEmpty, areaId != 0 { return }
83 let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
84 if areas.count != cellCount {
86 let diff = areas.count - areaMatrix.numberOfColumns
87 while areas.count != areaMatrix.numberOfColumns {
91 areaMatrix.removeColumn(0)
95 areaMatrix.addColumn()
100 if areaMatrix.numberOfColumns == 0 {
102 areaMatrix.addColumn()
103 let areaCell = areaMatrix.cell(atRow: 0, column: 0)
105 areaCell?.tag = -10_000
107 areaMatrix.isEnabled = false
111 areaMatrix.isEnabled = true
114 let t = AreaNameTransformer()
115 areas.enumerated().forEach {
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
123 private func updatePlaneSegment() {
125 guard let content = airBaseController.content as? [AirBase] else { return }
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) }
133 private func updatePredicate() {
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)
143 extension AirBaseWindowController: NSTableViewDelegate {
145 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
147 guard let identifier = tableColumn?.identifier else { return nil }
149 return tableView.makeView(withIdentifier: identifier, owner: nil)
152 func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {