OSDN Git Service

ColorSetを変更
[kcd/KCD.git] / KCD / ColorSet.swift
1 //
2 //  ColorSet.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2018/06/24.
6 //  Copyright © 2018年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 enum AppearanceMode {
12     
13     case normal
14     
15     case highContrast
16     
17     case dark
18     
19     case highContrastDark
20 }
21
22 struct ColorName {
23     
24     let name: String
25     
26     init(name: String) {
27         
28         self.name = name
29     }
30     
31     init(_ name: String) {
32         
33         self.name = name
34     }
35 }
36
37 extension ColorName: Equatable {
38     
39     static func == (lhs: ColorName, rhs: ColorName) -> Bool {
40         
41         return lhs.name == rhs.name
42     }
43 }
44
45 extension ColorName {
46     
47     // for DamageView
48     static let damageViewInnerSlightly = ColorName("DamageView.inner.slightly")
49     static let damageViewInnerModest = ColorName("DamageView.inner.modest")
50     static let damageViewInnerBadly = ColorName("DamageView.inner.badly")
51     static let damageViewBoarderSlightly = ColorName("DamageView.border.slightly")
52     static let damageViewBoarderModest = ColorName("DamageView.border.modest")
53     static let damageViewBoarderBadly = ColorName("DamageView.border.badly")
54     
55     // for AirPlanInfoView
56     static let airPlanInforViewNormal = ColorName("AirPlanInfoView.normal")
57     static let airPlanInforViewTired = ColorName("AirPlanInfoView.tired")
58     static let airPlanInforViewBad = ColorName("AirPlanInfoView.bad")
59     static let airPlanInforViewBoarderNormal = ColorName("AirPlanInfoView.boarder.normal")
60     static let airPlanInforViewBoarderTired = ColorName("AirPlanInfoView.border.tired")
61     static let airPlanInforViewBoarderBad = ColorName("AirPlanInfoView.boarder.bad")
62     
63     // for SuppliesCell
64     static let suppliesCellGreen = ColorName("SuppliesCell.greenColor")
65     static let suppliesCellYellow = ColorName("SuppliesCell.yellowColor")
66     static let suppliesCellOrange = ColorName("SuppliesCell.orangeColor")
67     static let suppliesCellRedColor = ColorName("SuppliesCell.redColor")
68     static let suppliesCellBorder = ColorName("SuppliesCell.borderColor")
69     static let suppliesCellBackground = ColorName("SuppliesCell.backgroundColor")
70     
71     // for SlotItemLevelView
72     static let slotItemLevelViewLevel = ColorName("SlotItemLevelView.levelColor")
73     static let slotItemLevelViewLowAirLevel = ColorName("SlotItemLevelView.airLevel.low")
74     static let slotItemLevelViewHighAirLevel = ColorName("SlotItemLevelView.airLevel.high")
75     static let slotItemLevelViewLowAirLevelShadow = ColorName("SlotItemLevelView.airLevel.low.shadow")
76     static let slotItemLevelViewHighAirLevelShadow = ColorName("SlotItemLevelView.airLevel.high.shadow")
77 }
78
79 protocol ColorSet {
80     
81     subscript(named: ColorName) -> NSColor { get }
82 }
83
84
85 struct ColorSetManager {
86     
87     static var current: ColorSet {
88         
89         switch currentMode() {
90             
91         case .normal: return BaseColorSet.shared
92             
93         case .highContrast: return HighContrastColorSet.shared
94             
95         case .dark: return DarkModeColorSet.shared
96             
97         case .highContrastDark: return HighContrastDarkModeColorSet.shared
98         }
99     }
100     
101     private static func currentMode() -> AppearanceMode {
102         
103         if #available(macOS 10.14, *) {
104             
105             return currentMode1014()
106         }
107         
108         if NSWorkspace.shared.accessibilityDisplayShouldIncreaseContrast {
109             
110             return .highContrast
111         }
112         
113         return .normal
114     }
115     
116     @available(macOS 10.14, *)
117     private static func currentMode1014() -> AppearanceMode {
118         
119         switch NSAppearance.current.name {
120             
121         case .aqua: return .normal
122             
123             /// not available in macOS 10.13 SDK
124 //        case .accessibilityHighContrastAqua: return .highContrast
125 //
126 //        case .darkAqua: return .dark
127 //
128 //        case .accessibilityHighContrastDarkAqua: return .highContrastDark
129             
130         default: return .normal
131         }
132     }
133 }
134
135 private struct BaseColorSet: ColorSet {
136     
137     static let shared = BaseColorSet()
138     
139     subscript(named: ColorName) -> NSColor {
140         
141         switch named {
142             
143         case .damageViewInnerSlightly: return #colorLiteral(red: 1.000, green: 0.956, blue: 0.012, alpha: 0.5)
144             
145         case .damageViewInnerModest: return NSColor.orange.withAlphaComponent(0.5)
146             
147         case .damageViewInnerBadly: return NSColor.red.withAlphaComponent(0.5)
148             
149         case .damageViewBoarderSlightly: return NSColor.orange.withAlphaComponent(0.5)
150             
151         case .damageViewBoarderModest: return NSColor.orange.withAlphaComponent(0.9)
152             
153         case .damageViewBoarderBadly: return NSColor.red.withAlphaComponent(0.9)
154             
155             
156         case .airPlanInforViewNormal: return .clear
157             
158         case .airPlanInforViewTired: return #colorLiteral(red: 1, green: 0.7233425379, blue: 0.1258574128, alpha: 0.8239436619)
159             
160         case .airPlanInforViewBad: return #colorLiteral(red: 0.7320367694, green: 0.07731548697, blue: 0.06799335033, alpha: 1)
161             
162         case .airPlanInforViewBoarderNormal: return .clear
163             
164         case .airPlanInforViewBoarderTired: return #colorLiteral(red: 0.458858192, green: 0.3335277438, blue: 0.07979661971, alpha: 1)
165             
166         case .airPlanInforViewBoarderBad: return #colorLiteral(red: 0.5462518334, green: 0.04599834234, blue: 0.04913448542, alpha: 1)
167             
168             
169         case .suppliesCellGreen: return NSColor(calibratedWhite: 0.39, alpha: 1.0)
170             
171         case .suppliesCellYellow: return NSColor(calibratedWhite: 0.55, alpha: 1.0)
172             
173         case .suppliesCellOrange: return NSColor(calibratedWhite: 0.7, alpha: 1.0)
174             
175         case .suppliesCellRedColor: return NSColor(calibratedWhite: 0.79, alpha: 1.0)
176             
177         case .suppliesCellBorder: return .gridColor
178             
179         case .suppliesCellBackground: return .controlColor
180             
181             
182         case .slotItemLevelViewLevel: return #colorLiteral(red: 0.135, green: 0.522, blue: 0.619, alpha: 1)
183             
184         case .slotItemLevelViewLowAirLevel: return #colorLiteral(red: 0.257, green: 0.523, blue: 0.643, alpha: 1)
185             
186         case .slotItemLevelViewHighAirLevel: return #colorLiteral(red: 0.784, green: 0.549, blue: 0.000, alpha: 1)
187             
188         case .slotItemLevelViewLowAirLevelShadow: return #colorLiteral(red: 0.095, green: 0.364, blue: 0.917, alpha: 1)
189             
190         case .slotItemLevelViewHighAirLevelShadow: return .yellow
191             
192         default: return .clear
193             
194         }
195     }
196 }
197
198
199 private protocol SpecialColorSet: ColorSet {
200     
201     func color(named: ColorName) -> NSColor?
202 }
203
204 private extension SpecialColorSet {
205     
206     subscript(named: ColorName) -> NSColor {
207         
208         return color(named: named) ?? BaseColorSet.shared[named]
209     }
210 }
211
212
213 private struct HighContrastColorSet: SpecialColorSet {
214     
215     static let shared = HighContrastColorSet()
216     
217     func color(named: ColorName) -> NSColor? {
218         
219         switch named {
220             
221         case .damageViewBoarderSlightly: return .red
222             
223         case .damageViewBoarderModest: return .red
224             
225         case .damageViewBoarderBadly: return .red
226             
227         default: return nil
228         }
229     }
230 }
231
232 private struct DarkModeColorSet: SpecialColorSet {
233     
234     static let shared = DarkModeColorSet()
235     
236     func color(named: ColorName) -> NSColor? {
237         
238         switch named {
239             
240         default: return nil
241         }
242     }
243 }
244
245 private struct HighContrastDarkModeColorSet: SpecialColorSet {
246     
247     static let shared = HighContrastDarkModeColorSet()
248     
249     func color(named: ColorName) -> NSColor? {
250         
251         return nil
252     }
253 }