OSDN Git Service

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