OSDN Git Service

ApplicationDirecroriesの中のアプリケーションに依存する部分を分離した
[kcd/KCD.git] / KCD / PowerUpSupportViewController.swift
1 //
2 //  PowerUpSupportViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/25.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class PowerUpSupportViewController: MainTabVIewItemViewController {
12     
13     @objc let managedObjectContext = ServerDataStore.default.context
14     
15     @IBOutlet private var shipController: NSArrayController!
16     @IBOutlet private weak var typeSegment: NSSegmentedControl!
17     
18     private var sortDescriptorsObservation: NSKeyValueObservation?
19     
20     override var hasShipTypeSelector: Bool { return true }
21     override var selectedShipType: ShipTabType {
22         
23         didSet {
24             
25             shipController.filterPredicate = customPredicate()
26             shipController.rearrangeObjects()
27         }
28     }
29     
30     override var nibName: NSNib.Name {
31         
32         return .nibName(instanceOf: self)
33     }
34     
35     var omitPredicate: NSPredicate? {
36         
37         let sd = UserDefaults.standard
38         let predicates = [(Bool, NSPredicate)]()
39             .appended { (sd[.hideMaxKaryoku], .false(#keyPath(Ship.isMaxKaryoku))) }
40             .appended { (sd[.hideMaxRaisou], .false(#keyPath(Ship.isMaxRaisou))) }
41             .appended { (sd[.hideMaxTaiku], .false(#keyPath(Ship.isMaxTaiku))) }
42             .appended { (sd[.hideMaxSoukou], .false(#keyPath(Ship.isMaxSoukou))) }
43             .appended { (sd[.hideMaxLucky], .false(#keyPath(Ship.isMaxLucky))) }
44             .compactMap { (b, s) in b ? s : nil }
45         
46         if predicates.isEmpty {
47             
48             return nil
49         }
50         
51         return .and(predicates)
52     }
53     
54     override func viewDidLoad() {
55         
56         super.viewDidLoad()
57         
58         changeCategory(nil)
59         
60         do {
61             
62             try shipController.fetch(with: nil, merge: true)
63             
64         } catch {
65             
66             fatalError("PowerUpSupportViewController: can not fetch. \(error)")
67         }
68         
69         shipController.sortDescriptors = UserDefaults.standard[.powerupSupportSortDecriptors]
70         sortDescriptorsObservation = shipController.observe(\NSArrayController.sortDescriptors) { [weak self] _, _ in
71             
72             UserDefaults.standard[.powerupSupportSortDecriptors] = self?.shipController.sortDescriptors ?? []
73         }
74     }
75     
76     private func customPredicate() -> NSPredicate? {
77         
78         switch (shipTypePredicte(for: selectedShipType), omitPredicate) {
79             
80         case let (s?, o?): return .and([o, s])
81             
82         case let (s?, nil): return s
83             
84         case let (nil, o?): return o
85             
86         default: return nil
87             
88         }
89     }
90     
91     @IBAction func changeCategory(_ sender: AnyObject?) {
92         
93         ShipTabType(rawValue: typeSegment.selectedSegment).map { selectedShipType = $0 }
94     }
95 }