Files
i2p.i2p/launchers/macosx/I2PLauncher/userinterface/Style2019/AppearanceObserver.swift

84 lines
1.9 KiB
Swift
Raw Normal View History

//
// AppearanceObserver.swift
// I2PLauncher
//
// Created by Mikal Villa on 15/04/2019.
// Copyright © 2019 The I2P Project. All rights reserved.
//
import Cocoa
protocol AppearanceObserver: AnyObject {
func changeAppearance(to newAppearance: NSAppearance)
}
@available(OSX 10.14, *)
class Appearance {
class Weak {
fileprivate weak var object: AnyObject?
init(_ object: AnyObject) {
self.object = object
}
}
private static var effectiveAppearanceObserver: Any? = {
return NSApplication.shared.observe(
\NSApplication.effectiveAppearance,
options: [.new, .initial]
) { _, change in
guard let newValue = change.newValue else { return }
Appearance.fire(newAppearance: newValue)
}
}()
private static var observers = [Weak]()
private static func fire(newAppearance: NSAppearance) {
observers = observers.filter {
guard let object = $0.object else { return false }
(object as? AppearanceObserver)?.changeAppearance(to: newAppearance)
return true
}
}
static func addObserver(_ observer: AppearanceObserver) {
observers = observers.filter { $0.object != nil }
observers.append(Weak(observer))
if effectiveAppearanceObserver == nil {
fatalError("Did not setup appearance observer.")
}
}
static func removeObserver(_ observer: AppearanceObserver) {
observers = observers.filter { $0.object != nil && $0.object !== observer }
}
}
enum InterfaceStyle : String {
case Dark, Light
init() {
let type = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") ?? "Light"
self = InterfaceStyle(rawValue: type)!
}
}
extension NSAppearance {
var isDarkMode: Bool {
let currentStyle = InterfaceStyle()
if #available(OSX 10.14, *) {
return currentStyle == .Dark
} else {
return false
}
}
}