aboutsummaryrefslogtreecommitdiff
path: root/Liquid Glass Bezel/BackgroundView.swift
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-09-04 12:27:28 +0200
committerRuben Beltran del Rio <git@r.bdr.sh>2025-09-04 12:27:28 +0200
commit192eddee203348ec85d52e277d59fc2c5ef96664 (patch)
tree168fd55fc99844ca1ac5cdf7947f5083f72b31ed /Liquid Glass Bezel/BackgroundView.swift
parentbb5daa2e90623691a5259700b9d388d2d21f46d3 (diff)
Basic liquid glass
Diffstat (limited to 'Liquid Glass Bezel/BackgroundView.swift')
-rw-r--r--Liquid Glass Bezel/BackgroundView.swift90
1 files changed, 61 insertions, 29 deletions
diff --git a/Liquid Glass Bezel/BackgroundView.swift b/Liquid Glass Bezel/BackgroundView.swift
index e5f4c86..508ee02 100644
--- a/Liquid Glass Bezel/BackgroundView.swift
+++ b/Liquid Glass Bezel/BackgroundView.swift
@@ -5,70 +5,109 @@ import Cocoa
class BackgroundView: QSBezelBackgroundView {
private var glassView: NSGlassEffectView?
+ private var preferencesObserver: NSObjectProtocol?
override func awakeFromNib() {
super.awakeFromNib()
configureParentView()
setupGlassEffect()
+ observePreferenceChanges()
}
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
configureParentView()
setupGlassEffect()
+ observePreferenceChanges()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
configureParentView()
setupGlassEffect()
+ observePreferenceChanges()
+ }
+
+ deinit {
+ if let observer = preferencesObserver {
+ NotificationCenter.default.removeObserver(observer)
+ }
}
private func configureParentView() {
- // Make the parent background much more transparent so glass effect shows through
- setColor(NSColor.clear) // Try completely transparent first
- setIsGlass(NSNumber(value: false)) // Disable the parent's glass rendering
-
- // Alternative: if clear doesn't work, try a very transparent background
- // setColor(NSColor.black.withAlphaComponent(0.1))
+ setColor(NSColor.clear)
+ setIsGlass(NSNumber(value: false))
}
private func setupGlassEffect() {
let glassView = NSGlassEffectView(frame: bounds)
glassView.autoresizingMask = [.width, .height]
glassView.cornerRadius = 12.0
- glassView.style = .clear
- // Create a content view for the glass effect
+ glassView.wantsLayer = true
+ glassView.layer?.masksToBounds = true
+ glassView.layer?.cornerRadius = 12.0
+
+ updateGlassStyle(glassView)
+ updateGlassTint(glassView)
+
let contentView = NSView(frame: glassView.bounds)
contentView.autoresizingMask = [.width, .height]
+ contentView.alphaValue = 0
glassView.contentView = contentView
- // Add subtle tint based on appearance
- updateGlassTint()
- // Insert the glass view at the bottom of the view hierarchy
addSubview(glassView, positioned: .below, relativeTo: nil)
self.glassView = glassView
}
- private func updateGlassTint() {
- guard let glassView = glassView else { return }
-
- let darkMode = effectiveAppearance.name == .darkAqua
- if darkMode {
- // Very subtle tint for dark mode to maintain translucency
- glassView.tintColor = NSColor.black.withAlphaComponent(0.05)
- } else {
- // Even lighter tint for light mode
- glassView.tintColor = NSColor.white.withAlphaComponent(0.02)
+ private func observePreferenceChanges() {
+ preferencesObserver = NotificationCenter.default.addObserver(
+ forName: UserDefaults.didChangeNotification,
+ object: nil,
+ queue: .main
+ ) { [weak self] _ in
+ self?.updateGlassStyleFromPreferences()
}
}
+ private func updateGlassStyleFromPreferences() {
+ guard let glassView = glassView else { return }
+ updateGlassStyle(glassView)
+ updateGlassTint(glassView)
+ }
+
+ private func updateGlassStyle(_ glassView: NSGlassEffectView) {
+ let useGlassStyle = UserDefaults.standard.bool(forKey: "QSLiquidGlassBezelGlassStyle")
+ glassView.style = useGlassStyle ? .clear : .regular
+
+ glassView.cornerRadius = 12.0
+
+ if !useGlassStyle {
+ glassView.layer?.masksToBounds = true
+ glassView.layer?.cornerRadius = 12.0
+ }
+ }
+
+ private func updateGlassTint(_ glassView: NSGlassEffectView) {
+ let shouldApplyTint = UserDefaults.standard.bool(forKey: "QSLiquidGlassBezelApplyTint")
+
+ if !shouldApplyTint {
+ glassView.tintColor = nil
+ return
+ }
+
+ // QSAppearance1B -> The B I'm guessing is for Background
+ // The 1 I believe is the 1st row, which is Main window.
+ // My other assumptions T for text, A for Accents.
+ let tintColor = UserDefaults.standard.color(forKey: "QSAppearance1B")
+
+ glassView.tintColor = tintColor
+ }
+
override func viewDidMoveToWindow() {
super.viewDidMoveToWindow()
- // Ensure the window is configured for transparency
if let window = self.window {
window.backgroundColor = NSColor.clear
window.isOpaque = false
@@ -76,13 +115,6 @@ class BackgroundView: QSBezelBackgroundView {
}
override func draw(_ rect: NSRect) {
- // Don't call super.draw(rect) to avoid the parent's opaque background
- // The glass effect will handle the visual appearance
return
}
-
- override func viewDidChangeEffectiveAppearance() {
- super.viewDidChangeEffectiveAppearance()
- updateGlassTint()
- }
}