OSDN Git Service

不要となっていたプロパティを削除
[kcd/KCD.git] / KCD / StrengthenListViewController.swift
1 //
2 //  StrengthenListViewController.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 private let resourceName = "EnhancementListItem2"
12 private let resourceExtension = "plist"
13
14
15 private struct FilterCategories {
16     
17     static let allType: [EquipmentType] = (1...100).compactMap { EquipmentType(rawValue: $0) }
18     static let canonType: [EquipmentType] = [.smallCaliberMainGun, .mediumCaliberMainGun,
19                                              .largeCaliberMainGun, .largeCaliberMainGunII]
20     static let torpedoType: [EquipmentType] = [.secondaryGun, .torpedo,
21                                                .antiAircraftGun, .antiSunmrinerSercher, .submarinTorpedo,
22                                                .largeSonar]
23     static let airplaneType: [EquipmentType] = [.fighter, .bomber, .attacker, .searcher,
24                                                 .airplaneSearcher, .airplaneBomber,
25                                                 .largeAirplane, .airplaneFighter,
26                                                 .landAttecker, .localFighter,
27                                                 .jetFighter, .jetBomber,
28                                                 .jetAttacker, .jetSearcher,
29                                                 .searcherII]
30     static let radarType: [EquipmentType] = [.smallRadar, .largeRadar,
31                                              .sonar, .depthCharge,
32                                              .submarineEquipment]
33     static let otherType: [EquipmentType] = {
34         
35         return allType
36             .filter { !canonType.contains($0) }
37             .filter { !torpedoType.contains($0) }
38             .filter { !airplaneType.contains($0) }
39             .filter { !radarType.contains($0) }
40     }()
41     
42     enum FilterType: Int {
43         
44         case all = 0
45         
46         case canon
47         
48         case torpedo
49         
50         case airplane
51         
52         case radar
53         
54         case other
55     }
56     
57     let categories: [EquipmentType]
58     
59     init(type: FilterType) {
60         
61         switch type {
62             
63         case .all: categories = FilterCategories.allType
64             
65         case .canon: categories = FilterCategories.canonType
66             
67         case .torpedo: categories = FilterCategories.torpedoType
68             
69         case .airplane: categories = FilterCategories.airplaneType
70             
71         case .radar: categories = FilterCategories.radarType
72             
73         case .other: categories = FilterCategories.otherType
74             
75         }
76     }
77 }
78
79 final class StrengthenListViewController: MainTabVIewItemViewController {
80     
81     @IBOutlet private weak var tableView: NSTableView!
82     
83     @objc dynamic var itemList: Any { return filteredItems as Any }
84     @objc dynamic var offsetDay: Int = 0 {
85         
86         didSet { buildList() }
87     }
88     @objc dynamic var filterType: Int = 0 {
89         
90         didSet {
91             
92             if let t = FilterCategories.FilterType(rawValue: filterType) {
93                 
94                 showsTypes = FilterCategories(type: t).categories
95                 
96             } else {
97                 
98                 showsTypes = FilterCategories.allType
99             }
100             buildList()
101         }
102     }
103     
104     override var nibName: NSNib.Name {
105         
106         return .nibName(instanceOf: self)
107     }
108     
109     private var filteredItems: [StrengthenListItem] = [] {
110         
111         willSet { willChangeValue(forKey: #keyPath(itemList)) }
112         didSet { didChangeValue(forKey: #keyPath(itemList)) }
113     }
114     
115     private let itemListBuildNotifier = PeriodicNotifier(hour: 0, minutes: 0)
116     private let plistDownloadNotifier = PeriodicNotifier(hour: 23, minutes: 55)
117     private let downloader = EnhancementListItemDownloader(name: resourceName, extension: resourceExtension)
118     private var equipmentStrengthenList: [EnhancementListItem] = []
119     private var showsTypes: [EquipmentType] = FilterCategories.allType
120     
121     override func viewDidLoad() {
122         
123         super.viewDidLoad()
124         
125         if let url = Bundle.main.url(forResource: resourceName, withExtension: resourceExtension),
126             let data = try? Data(contentsOf: url) {
127             
128             guard let array = NSKeyedUnarchiver.unarchiveObject(with: data) as? [EnhancementListItem] else {
129                 
130                 Logger.shared.log("\(resourceName).\(resourceExtension) not found.")
131                 
132                 return
133             }
134             
135             equipmentStrengthenList = array
136             buildList()
137         }
138         
139         let nc = NotificationCenter.default
140         nc.addObserver(forName: .Periodic, object: itemListBuildNotifier, queue: nil) { [weak self] _ in
141             
142             self?.buildList()
143         }
144         
145         nc.addObserver(forName: .Periodic, object: plistDownloadNotifier, queue: nil) { [weak self] _ in
146             
147             self?.downloadPList()
148         }
149         
150         #if DEBUG
151 //          downloadPList()
152         #else
153             downloadPList()
154         #endif
155     }
156     
157     private func weekdayFiltered() -> [EnhancementListItem] {
158         
159         if offsetDay == -1 {
160             
161             return allItemList()
162         }
163         
164         let currentDay = NSCalendar.current.dateComponents([.weekday], from: Date())
165         var targetWeekday = currentDay.weekday! + offsetDay
166         if targetWeekday > 7 {
167             
168             targetWeekday = 1
169         }
170         
171         return equipmentStrengthenList.filter { $0.weekday == targetWeekday }
172     }
173     
174     private func convert(items: [EnhancementListItem]) -> [StrengthenListItem] {
175         
176         guard let item = items.first else { return [] }
177         
178         let group: StrengthenListItem = StrengthenListGroupItem(type: item.equipmentType)
179         let items: [StrengthenListItem] = items.map(StrengthenListEnhancementItem.init(item:))
180         
181         return [group] + items
182     }
183     
184     private func buildList() {
185         
186         let filtered = weekdayFiltered()
187         filteredItems = filtered
188             .map { $0.equipmentType }
189             .unique()
190             .filter { showsTypes.contains($0) }
191             .map { type in filtered.filter { $0.equipmentType == type } }
192             .flatMap(convert)
193     }
194     
195     private func downloadPList() {
196         
197         downloader.download { [weak self] items in
198             
199             DispatchQueue.main.async {
200                 
201                 self?.equipmentStrengthenList = items
202                 self?.buildList()
203             }
204         }
205     }
206     
207     private func packSecondShipName(_ items: [EnhancementListItem]) -> [String] {
208         
209         return items.flatMap { $0.secondsShipNames }.unique()
210     }
211     
212     private func allItemList() -> [EnhancementListItem] {
213         
214         return equipmentStrengthenList
215             .map { $0.identifier }
216             .unique()
217             .map { identifier in equipmentStrengthenList.filter { $0.identifier == identifier } }
218             .compactMap { $0.first?.replace(secondsShipNames: packSecondShipName($0)) }
219     }
220 }
221
222 extension StrengthenListViewController: NSTableViewDelegate {
223     
224     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
225         
226         let item = filteredItems[row]
227         
228         return item.cellType.makeCellWithItem(item: item, tableView: tableView, owner: nil)
229     }
230     
231     func tableView(_ tableView: NSTableView, isGroupRow row: Int) -> Bool {
232         
233         return filteredItems[row] is StrengthenListGroupItem
234     }
235     
236     func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
237         
238         let item = filteredItems[row]
239         
240         return item.cellType.estimateCellHeightForItem(item: item, tableView: tableView)
241     }
242 }