OSDN Git Service

Equatableを自動実装させるようにした
[kcd/KCD.git] / KCD / ColorSet.swift
index 49de570..78da017 100644 (file)
@@ -8,26 +8,60 @@
 
 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
     }
 }
 
@@ -65,21 +99,32 @@ extension ColorName {
     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 {
         
@@ -141,38 +186,58 @@ class ColorSet {
 }
 
 
-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
+    }
+}