import Cocoa
-struct ColorName {
+enum AppearanceMode {
- let name: String
+ case normal
- init(name: String) {
+ case highContrast
+
+ case dark
+
+ case highContrastDark
+}
+
+extension AppearanceMode {
+
+ static var current: AppearanceMode {
- self.name = name
+ if #available(macOS 10.14, *) {
+
+ return currentMode1014()
+ }
+
+ if NSWorkspace.shared.accessibilityDisplayShouldIncreaseContrast {
+
+ return .highContrast
+ }
+
+ return .normal
}
- init(_ name: String) {
+ @available(macOS 10.14, *)
+ private static func currentMode1014() -> AppearanceMode {
- self.name = name
+ switch NSAppearance.current.name {
+
+ case .aqua: return .normal
+
+ /// not available in macOS 10.13 SDK
+// case .accessibilityHighContrastAqua: return .highContrast
+//
+// case .darkAqua: return .dark
+//
+// case .accessibilityHighContrastDarkAqua: return .highContrastDark
+
+ default: return .normal
+ }
}
}
-extension ColorName: Equatable {
+struct ColorName: Equatable {
+
+ private let name: String
- static func == (lhs: ColorName, rhs: ColorName) -> Bool {
+ private init(_ name: String) {
- return lhs.name == rhs.name
+ self.name = name
}
}
static let slotItemLevelViewHighAirLevelShadow = ColorName("SlotItemLevelView.airLevel.high.shadow")
}
-class ColorSet {
+protocol ColorSet {
+
+ subscript(named: ColorName) -> NSColor { get }
+}
+
+
+struct ColorSetManager {
static var current: ColorSet {
- if NSWorkspace.shared.accessibilityDisplayShouldIncreaseContrast {
+ switch AppearanceMode.current {
+
+ case .normal: return BaseColorSet.shared
+
+ case .highContrast: return HighContrastColorSet.shared
- return HighContrastColorSet.shared
+ case .dark: return DarkModeColorSet.shared
+
+ case .highContrastDark: return HighContrastDarkModeColorSet.shared
}
-
- return ColorSet.shared
}
+}
+
+private struct BaseColorSet: ColorSet {
- class var shared: ColorSet { return _shared }
-
- private static let _shared = ColorSet()
+ static let shared = BaseColorSet()
subscript(named: ColorName) -> NSColor {
}
-class HighContrastColorSet: ColorSet {
+private protocol SpecialColorSet: ColorSet {
- override class var shared: ColorSet { return _shared }
+ func color(named: ColorName) -> NSColor?
+}
+
+private extension SpecialColorSet {
- private static let _shared = HighContrastColorSet()
+ subscript(named: ColorName) -> NSColor {
+
+ return color(named: named) ?? BaseColorSet.shared[named]
+ }
+}
+
+
+private struct HighContrastColorSet: SpecialColorSet {
+
+ static let shared = HighContrastColorSet()
- override subscript(named: ColorName) -> NSColor {
+ func color(named: ColorName) -> NSColor? {
switch named {
- case .damageViewBoarderSlightly: return NSColor.red
+ case .damageViewBoarderSlightly: return .red
- case .damageViewBoarderModest: return NSColor.red
+ case .damageViewBoarderModest: return .red
- case .damageViewBoarderBadly: return NSColor.red
+ case .damageViewBoarderBadly: return .red
- default: return super[named]
+ default: return nil
}
}
}
-class DarkModeColorSet: ColorSet {
-
- override class var shared: ColorSet { return _shared }
+private struct DarkModeColorSet: SpecialColorSet {
- private static let _shared = DarkModeColorSet()
+ static let shared = DarkModeColorSet()
- override subscript(named: ColorName) -> NSColor {
+ func color(named: ColorName) -> NSColor? {
switch named {
- default: return super[named]
+ default: return nil
}
}
}
+
+private struct HighContrastDarkModeColorSet: SpecialColorSet {
+
+ static let shared = HighContrastDarkModeColorSet()
+
+ func color(named: ColorName) -> NSColor? {
+
+ return nil
+ }
+}