forked from I2P_Developers/i2p.i2p
84 lines
1.9 KiB
Swift
84 lines
1.9 KiB
Swift
//
|
|
// 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
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|