2 // ShipViewController.swift
5 // Created by Hori,Masaki on 2016/12/25.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 fileprivate enum ViewType: Int {
18 class ShipViewController: MainTabVIewItemViewController {
19 let managedObjectContext = ServerDataStore.default.context
22 NotificationCenter.default.removeObserver(self)
25 @IBOutlet var shipController: NSArrayController!
26 @IBOutlet var expTableView: NSScrollView!
27 @IBOutlet var powerTableView: NSScrollView!
28 @IBOutlet var power2TableView: NSScrollView!
29 @IBOutlet var power3TableView: NSScrollView!
30 @IBOutlet weak var standardDeviationField: NSTextField!
32 override var nibName: String! {
33 return "ShipViewController"
35 override var hasShipTypeSelector: Bool { return true }
36 override var selectedShipType: ShipType {
38 shipController.filterPredicate = predicate(for: selectedShipType)
39 shipController.rearrangeObjects()
43 var standardDeviation: Double {
44 guard let ships = shipController.arrangedObjects as? [Ship],
46 let avg = shipController.value(forKeyPath: "arrangedObjects.@avg.lv") as? Double
48 let total = ships.reduce(0.0) {
49 let delta = Double($1.lv) - avg
50 return $0 + delta * delta
52 return sqrt(total / Double(ships.count))
55 fileprivate weak var currentTableView: NSView?
57 override func viewDidLoad() {
60 currentTableView = expTableView
63 try shipController.fetch(with: nil, merge: true)
65 fatalError("ShipViewController: can not fetch. \(error)")
67 shipController.sortDescriptors = UserDefaults.standard.shipviewSortDescriptors
68 shipController.addObserver(self, forKeyPath: NSSortDescriptorsBinding, context: nil)
69 shipController.addObserver(self, forKeyPath: "arrangedObjects", context: nil)
71 let tableViews = [expTableView, powerTableView, power2TableView, power3TableView]
74 NotificationCenter.default
75 .addObserver(forName: .NSScrollViewDidEndLiveScroll, object: $0, queue: nil) {
76 guard let target = $0.object as? NSScrollView else { return }
77 let visibleRect = target.documentVisibleRect
79 .filter { $0 != target }
80 .forEach { $0?.documentView?.scrollToVisible(visibleRect) }
84 standardDeviationField.isHidden = false
87 override func observeValue(forKeyPath keyPath: String?,
89 change: [NSKeyValueChangeKey: Any]?,
90 context: UnsafeMutableRawPointer?) {
91 if keyPath == NSSortDescriptorsBinding {
92 UserDefaults.standard.shipviewSortDescriptors = shipController.sortDescriptors
95 if keyPath == "arrangedObjects" {
96 notifyChangeValue(forKey: "standardDeviation")
100 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
103 fileprivate func showView(with type: ViewType) {
104 let newSelection: NSView = {
106 case .exp: return expTableView
107 case .power: return powerTableView
108 case .power2: return power2TableView
109 case .power3: return power3TableView
112 if currentTableView == newSelection { return }
113 guard let tableView = currentTableView
115 newSelection.frame = tableView.frame
116 newSelection.autoresizingMask = tableView.autoresizingMask
117 view.replaceSubview(tableView, with: newSelection)
118 view.window?.makeFirstResponder(newSelection)
119 currentTableView = newSelection
122 private func tag(_ sender: AnyObject?) -> Int {
123 guard let sender = sender
125 if let control = sender as? NSSegmentedControl,
126 let cell = sender.cell as? NSSegmentedCell {
127 return cell.tag(forSegment: control.selectedSegment)
129 if let control = sender as? NSControl {
134 @IBAction func changeView(_ sender: AnyObject?) {
135 ViewType(rawValue: tag(sender)).map { showView(with: $0) }
139 extension ShipViewController: NSTableViewDelegate {
140 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
141 guard let identifier = tableColumn?.identifier else { return nil }
142 return tableView.make(withIdentifier: identifier, owner: nil)