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 var areaMatrix: NSMatrix!
16 @IBOutlet var squadronTab: NSSegmentedControl!
17 @IBOutlet var planesTable: NSTableView!
18 @IBOutlet var airBaseController: NSArrayController!
20 override var windowNibName: NSNib.Name {
22 return .nibName(instanceOf: self)
25 @objc dynamic var areaId: Int = 0 {
33 @objc dynamic var rId: Int = 1 {
41 private var areas: [Int] {
43 guard let content = airBaseController.content as? [AirBase]
47 .flatMap { $0.area_id }
52 override func windowDidLoad() {
56 airBaseController.addObserver(self, forKeyPath: "content", context: nil)
59 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
61 guard keyPath == "content" else {
62 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
71 areaId = areas.first ?? 0
76 private func updateAreaRadio() {
79 let areas = self.areas
80 let currentTags = areaMatrix.cells.map { $0.tag }
82 if currentTags == areas { return }
84 // 最初の設定以外でareasが空の場合は処理をしない
85 if areas.isEmpty, areaId != 0 { return }
87 let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
88 if areas.count != cellCount {
90 let diff = areas.count - areaMatrix.numberOfColumns
91 while areas.count != areaMatrix.numberOfColumns {
95 areaMatrix.removeColumn(0)
99 areaMatrix.addColumn()
104 if areaMatrix.numberOfColumns == 0 {
106 areaMatrix.addColumn()
107 let areaCell = areaMatrix.cell(atRow: 0, column: 0)
109 areaCell?.tag = -10_000
111 areaMatrix.isEnabled = false
115 areaMatrix.isEnabled = true
118 let t = AreaNameTransformer()
119 areas.enumerated().forEach {
121 let areaCell = areaMatrix.cell(atRow: 0, column: $0.offset)
122 areaCell?.title = t.transformedValue($0.element) as? String ?? String($0.element)
123 areaCell?.tag = $0.element
127 private func updatePlaneSegment() {
129 guard let content = airBaseController.content as? [AirBase]
132 let area = NSCountedSet()
133 content.forEach { area.add($0.area_id) }
134 let count = area.count(for: areaId)
135 (0...2).forEach { squadronTab.setEnabled($0 < count, forSegment: $0) }
138 private func updatePredicate() {
140 airBaseController.filterPredicate = NSPredicate(format: "area_id = %ld AND rid = %ld", areaId, rId)
141 airBaseController.setSelectionIndex(0)
142 planesTable.deselectAll(nil)
146 extension AirBaseWindowController: NSTableViewDelegate {
148 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
150 guard let identifier = tableColumn?.identifier
153 return tableView.makeView(withIdentifier: identifier, owner: nil)
156 func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {