OSDN Git Service

swiftlint 'line_length'の警告を修正
[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 class AirBaseWindowController: NSWindowController {
12     let managedObjectContext = ServerDataStore.default.managedObjectContext
13     
14     @IBOutlet var areaMatrix: NSMatrix!
15     @IBOutlet var squadronTab: NSSegmentedControl!
16     @IBOutlet var planesTable: NSTableView!
17     @IBOutlet var airBaseController: NSArrayController!
18     
19     override var windowNibName: String! {
20         return "AirBaseWindowController"
21     }
22     
23     dynamic var areaId: Int = 0 {
24         didSet {
25             updatePredicate()
26             updatePlaneSegment()
27         }
28     }
29     dynamic var rId: Int = 0 {
30         didSet {
31             updatePredicate()
32             updatePlaneSegment()
33         }
34     }
35     
36     override func windowDidLoad() {
37         super.windowDidLoad()
38         
39         rId = 1
40         
41         airBaseController.addObserver(self, forKeyPath: "content", context: nil)
42         
43         updateAreaRadio()
44         updatePlaneSegment()
45     }
46     
47     override func observeValue(forKeyPath keyPath: String?,
48                                of object: Any?,
49                                change: [NSKeyValueChangeKey: Any]?,
50                                context: UnsafeMutableRawPointer?) {
51         guard keyPath == "content" else {
52             super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
53             return
54         }
55         
56         updateAreaRadio()
57         updatePlaneSegment()
58     }
59     
60     private func updateAreaRadio() {
61         guard let content = airBaseController.content as? [AirBase]
62             else { return }
63         let areas = content
64             .flatMap { $0.area_id }
65             .unique()
66             .sorted(by: <)
67         
68         let cellCount = areaMatrix.numberOfRows * areaMatrix.numberOfColumns
69         if areas.count != cellCount {
70             let diff = areas.count - areaMatrix.numberOfColumns
71             while areas.count != areaMatrix.numberOfColumns {
72                 if diff < 0 {
73                     areaMatrix.removeColumn(0)
74                 } else {
75                     areaMatrix.addColumn()
76                 }
77             }
78         }
79         
80         if areaMatrix.numberOfColumns == 0 {
81             areaMatrix.addColumn()
82             let areaCell = areaMatrix.cell(atRow: 0, column: 0)
83             areaCell?.title = ""
84             areaCell?.tag = -10_000
85             
86             areaMatrix.isEnabled = false
87         } else {
88             areaMatrix.isEnabled = true
89         }
90         
91         let t = AreaNameTransformer()
92         areas.enumerated().forEach {
93             let areaCell = areaMatrix.cell(atRow: 0, column: $0.offset)
94             areaCell?.title = t.transformedValue($0.element) as? String ?? String($0.element)
95             areaCell?.tag = $0.element
96         }
97         
98         areaId = areas.first ?? 0
99     }
100     
101     private func updatePlaneSegment() {
102         guard let content = airBaseController.content as? NSArray else { return }
103         let area = NSCountedSet()
104         content.forEach {
105             if let i = ($0 as? AirBase)?.area_id {
106                 area.add(i)
107             }
108         }
109         let count = area.count(for: areaId)
110         [0, 1, 2].forEach { squadronTab.setEnabled($0 < count, forSegment: $0) }
111     }
112     
113     private func updatePredicate() {
114         airBaseController.filterPredicate = NSPredicate(format: "area_id = %ld AND rid = %ld", areaId, rId)
115         airBaseController.setSelectionIndex(0)
116         planesTable.deselectAll(nil)
117     }
118 }
119
120 extension AirBaseWindowController: NSTableViewDelegate {
121     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
122         return tableView.make(withIdentifier: (tableColumn?.identifier)!, owner: nil)
123     }
124     
125     func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
126         return false
127     }
128 }