import Cocoa
-class PowerUpSupportViewController: MainTabVIewItemViewController {
- let managedObjectContext = ServerDataStore.default.managedObjectContext
+final class PowerUpSupportViewController: MainTabVIewItemViewController {
- deinit {
- shipController.removeObserver(self, forKeyPath: NSSortDescriptorsBinding)
- }
+ @objc let managedObjectContext = ServerDataStore.default.context
+
+ @IBOutlet private var shipController: NSArrayController!
+ @IBOutlet private weak var typeSegment: NSSegmentedControl!
- @IBOutlet var shipController: NSArrayController!
- @IBOutlet weak var typeSegment: NSSegmentedControl!
+ private var sortDescriptorsObservation: NSKeyValueObservation?
override var hasShipTypeSelector: Bool { return true }
- override var selectedShipType: ShipType {
+ override var selectedShipType: ShipTabType {
+
didSet {
- shipController.filterPredicate = customPredicate(for: selectedShipType)
+ shipController.filterPredicate = customPredicate()
shipController.rearrangeObjects()
}
}
- override var nibName: String! {
- return "PowerUpSupportViewController"
+
+ override var nibName: NSNib.Name {
+
+ return .nibName(instanceOf: self)
}
var omitPredicate: NSPredicate? {
+
let sd = UserDefaults.standard
- let hideKyes = [(Bool, String)]()
- .appended { (sd.hideMaxKaryoku, "isMaxKaryoku != TRUE") }
- .appended { (sd.hideMaxRaisou, "isMaxRaisou != TRUE") }
- .appended { (sd.hideMaxTaiku, "isMaxTaiku != TRUE") }
- .appended { (sd.hideMaxSoukou, "isMaxSoukou != TRUE") }
- .appended { (sd.hideMaxLucky, "isMaxLucky != TRUE") }
- .flatMap { (b, s) in b ? s : nil }
- if hideKyes.isEmpty { return nil }
- return NSPredicate(format: hideKyes.joined(separator: " AND "))
+ let predicates = [(Bool, NSPredicate)]()
+ .appended { (sd[.hideMaxKaryoku], .false(#keyPath(Ship.isMaxKaryoku))) }
+ .appended { (sd[.hideMaxRaisou], .false(#keyPath(Ship.isMaxRaisou))) }
+ .appended { (sd[.hideMaxTaiku], .false(#keyPath(Ship.isMaxTaiku))) }
+ .appended { (sd[.hideMaxSoukou], .false(#keyPath(Ship.isMaxSoukou))) }
+ .appended { (sd[.hideMaxLucky], .false(#keyPath(Ship.isMaxLucky))) }
+ .compactMap { (b, s) in b ? s : nil }
+
+ if predicates.isEmpty { return nil }
+
+ return .and(predicates)
}
override func viewDidLoad() {
+
super.viewDidLoad()
changeCategory(nil)
- try! shipController.fetch(with: nil, merge: true)
- shipController.sortDescriptors = UserDefaults.standard.powerupSupportSortDecriptors
- shipController.addObserver(self, forKeyPath: NSSortDescriptorsBinding, context: nil)
- }
-
- override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
- if keyPath == NSSortDescriptorsBinding {
- UserDefaults.standard.powerupSupportSortDecriptors = shipController.sortDescriptors
- return
+
+ do {
+
+ try shipController.fetch(with: nil, merge: true)
+
+ } catch {
+
+ fatalError("PowerUpSupportViewController: can not fetch. \(error)")
}
- super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+ shipController.sortDescriptors = UserDefaults.standard[.powerupSupportSortDecriptors]
+ sortDescriptorsObservation = shipController.observe(\NSArrayController.sortDescriptors) { [weak self] _, _ in
+
+ UserDefaults.standard[.powerupSupportSortDecriptors] = self?.shipController.sortDescriptors ?? []
+ }
}
- fileprivate func customPredicate(for type: ShipType) -> NSPredicate? {
- if let catPredicate = self.predicate(for: type) {
- if let omitPredicate = self.omitPredicate {
- return NSCompoundPredicate(type: .and,
- subpredicates: [omitPredicate, catPredicate])
- }
- return catPredicate
+ private func customPredicate() -> NSPredicate? {
+
+ switch (shipTypePredicte(for: selectedShipType), omitPredicate) {
+
+ case let (s?, o?): return .and([o, s])
+ case let (s?, nil): return s
+ case let (nil, o?): return o
+ default: return nil
}
- return omitPredicate
}
@IBAction func changeCategory(_ sender: AnyObject?) {
- guard let type = ShipType(rawValue: Int(typeSegment.selectedSegment)) else { return }
- shipController.filterPredicate = customPredicate(for: type)
- shipController.rearrangeObjects()
+
+ ShipTabType(rawValue: typeSegment.selectedSegment).map { selectedShipType = $0 }
}
}