OSDN Git Service

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