aboutsummaryrefslogtreecommitdiff
path: root/Liquid Glass Bezel
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
parentbb5daa2e90623691a5259700b9d388d2d21f46d3 (diff)
Basic liquid glass
Diffstat (limited to 'Liquid Glass Bezel')
-rw-r--r--Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.h6
-rw-r--r--Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.m10
-rw-r--r--Liquid Glass Bezel/BBLiquidGlassBezelPrefs.h2
-rw-r--r--Liquid Glass Bezel/BBLiquidGlassBezelPrefs.m2
-rw-r--r--Liquid Glass Bezel/BBLiquidGlassBezelPrefs.xib16
-rw-r--r--Liquid Glass Bezel/BackgroundView.swift90
6 files changed, 79 insertions, 47 deletions
diff --git a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.h b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.h
deleted file mode 100644
index 36c5177..0000000
--- a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#import <QSInterface/QSInterface.h>
-NS_ASSUME_NONNULL_BEGIN
-@interface BBLiquidGlassBezelPrefs : QSPreferencePane {
-}
-@end
-NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.m b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.m
deleted file mode 100644
index 4e57c7a..0000000
--- a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs 2.m
+++ /dev/null
@@ -1,10 +0,0 @@
-//
-// BBLiquidGlassBezelPrefs.h
-// Liquid Glass Bezel
-//
-// Created by Ruben Beltran del Rio on 2025-09-04.
-// Copyright © 2025 BRNBW. All rights reserved.
-//
-#import "BBLiquidGlassBezelPrefs.h"
-@implementation BBLiquidGlassBezelPrefs
-@end \ No newline at end of file
diff --git a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.h b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.h
index 2ce6bb6..b4efd1d 100644
--- a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.h
+++ b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.h
@@ -3,8 +3,8 @@
NS_ASSUME_NONNULL_BEGIN
@interface BBLiquidGlassBezelPrefs : QSPreferencePane {
-
}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.m b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.m
index 1deb432..0e3818e 100644
--- a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.m
+++ b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.m
@@ -1,5 +1,5 @@
//
-// BBLiquidGlassBezelPrefs.h
+// BBLiquidGlassBezelPrefs.m
// Liquid Glass Bezel
//
// Created by Ruben Beltran del Rio on 2025-09-04.
diff --git a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.xib b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.xib
index 41e51fd..535c2a7 100644
--- a/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.xib
+++ b/Liquid Glass Bezel/BBLiquidGlassBezelPrefs.xib
@@ -47,6 +47,22 @@
<binding destination="od0-QH-X0x" name="selectedTag" keyPath="values.QSLiquidGlassBezelGlassStyle" id="8w3-oM-wU3"/>
</connections>
</popUpButton>
+ <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" id="3r2-JJ-734">
+ <rect key="frame" x="12" y="197" width="110" height="16"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <textFieldCell key="cell" lineBreakMode="clipping" title="Tint Background?" id="mEt-5D-Xf3">
+ <font key="font" usesAppearanceFont="YES"/>
+ <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ <switch horizontalHuggingPriority="750" verticalHuggingPriority="750" baseWritingDirection="leftToRight" alignment="left" id="Wex-ov-GHa" userLabel="Tint Background Switch">
+ <rect key="frame" x="144" y="192" width="50" height="25"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <connections>
+ <binding destination="od0-QH-X0x" name="value" keyPath="values.QSLiquidGlassBezelApplyTint" id="nJL-hI-usC"/>
+ </connections>
+ </switch>
</subviews>
</view>
<point key="canvasLocation" x="94.5" y="148.5"/>
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()
- }
}