OSDN Git Service

NSManagedObjetの監視を別クラスに分けてbindingを削除した
[kcd/KCD.git] / KCD / SlotItemWindowController.swift
1 //
2 //  SlotItemWindowController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/21.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class SlotItemWindowController: NSWindowController {
12     
13     enum ShowType: Int {
14         
15         case all = -1
16         case nonEquiped = 0
17         case equiped = 1
18     }
19     
20     @objc let managedObjectContext = ServerDataStore.default.context
21     
22     @IBOutlet var slotItemController: NSArrayController!
23     @IBOutlet var searchField: NSSearchField!
24     
25     override var windowNibName: NSNib.Name {
26         
27         return .nibName(instanceOf: self)
28     }
29     
30     @objc var showEquipmentType: Int {
31         
32         get { return UserDefaults.standard[.showEquipmentType].rawValue }
33         set {
34             notifyChangeValue(forKey: #keyPath(showEquipmentTypeTitle)) {
35                 
36                 UserDefaults.standard[.showEquipmentType] = ShowType(rawValue: newValue) ?? .all
37             }
38             slotItemController.fetchPredicate = filterPredicate
39         }
40     }
41     
42     var filterPredicate: NSPredicate? {
43         
44         switch UserDefaults.standard[.showEquipmentType] {
45         case .all:
46             return nil
47             
48         case .nonEquiped:
49             return NSPredicate.isNil(#keyPath(SlotItem.equippedShip.lv))
50                 .and(.isNil(#keyPath(SlotItem.extraEquippedShip.lv)))
51             
52         case .equiped:
53             return NSPredicate.empty
54                 .and(.isNotNil(#keyPath(SlotItem.equippedShip.lv)))
55                 .or(.isNotNil(#keyPath(SlotItem.extraEquippedShip.lv)))
56         }
57     }
58     
59     @objc var showEquipmentTypeTitle: String {
60         
61         switch UserDefaults.standard[.showEquipmentType] {
62             
63         case .all: return LocalizedStrings.allEquipment.string
64             
65         case .nonEquiped: return LocalizedStrings.unequiped.string
66             
67         case .equiped: return LocalizedStrings.equiped.string
68         }
69     }
70     
71     override func windowDidLoad() {
72         
73         super.windowDidLoad()
74         
75         // refresh filter
76         let type = showEquipmentType
77         showEquipmentType = type
78     }
79 }
80
81
82 @available(OSX 10.12.2, *)
83 private var objectForTouchBar: [Int: NSTouchBar] = [:]
84
85 @available(OSX 10.12.2, *)
86 extension SlotItemWindowController {
87     
88     @IBOutlet var myTouchBar: NSTouchBar? {
89         
90         get { return objectForTouchBar[hash] }
91         set { objectForTouchBar[hash] = newValue }
92     }
93
94     override var touchBar: NSTouchBar? {
95         
96         get {
97             if let _ = myTouchBar {
98                 
99                 return myTouchBar
100             }
101             
102             var topLevel: NSArray?
103             Bundle.main.loadNibNamed(NSNib.Name("SlotItemWindowTouchBar"),
104                                      owner: self,
105                                      topLevelObjects: &topLevel)
106             return myTouchBar
107         }
108         set {}
109     }
110     
111     @IBAction func nextShowType(_ sender: AnyObject?) {
112         
113         let next = (showEquipmentType + 2) % 3 - 1
114         showEquipmentType = next
115     }
116     @IBAction func selectSearchField(_ sender: AnyObject?) {
117         
118         window!.makeFirstResponder(searchField)
119     }
120 }