aboutsummaryrefslogtreecommitdiff
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
parentbb5daa2e90623691a5259700b9d388d2d21f46d3 (diff)
Basic liquid glass
-rw-r--r--Liquid Glass Bezel.xcodeproj/project.pbxproj16
-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
7 files changed, 85 insertions, 57 deletions
diff --git a/Liquid Glass Bezel.xcodeproj/project.pbxproj b/Liquid Glass Bezel.xcodeproj/project.pbxproj
index 4ac4f8a..59b8918 100644
--- a/Liquid Glass Bezel.xcodeproj/project.pbxproj
+++ b/Liquid Glass Bezel.xcodeproj/project.pbxproj
@@ -10,8 +10,8 @@
42447D7D19407DA00077B4B2 /* BBObjectCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 42447D7C19407DA00077B4B2 /* BBObjectCell.m */; };
42663058193CC1FA00C0DD31 /* BBLiquidGlassBezelInterface.xib in Resources */ = {isa = PBXBuildFile; fileRef = 42663057193CC1FA00C0DD31 /* BBLiquidGlassBezelInterface.xib */; };
B576D2F52993FBD400A8B645 /* BackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B576D2F42993FBD400A8B645 /* BackgroundView.swift */; };
- B57CEE502E698DEC00628387 /* BBLiquidGlassBezelPrefs 2.m in Sources */ = {isa = PBXBuildFile; fileRef = B57CEE4F2E698DEC00628387 /* BBLiquidGlassBezelPrefs 2.m */; };
B57CEE522E698E7100628387 /* BBLiquidGlassBezelPrefs.xib in Resources */ = {isa = PBXBuildFile; fileRef = B57CEE512E698E7100628387 /* BBLiquidGlassBezelPrefs.xib */; };
+ B57CEE572E69989D00628387 /* BBLiquidGlassBezelPrefs.m in Sources */ = {isa = PBXBuildFile; fileRef = B57CEE562E69989D00628387 /* BBLiquidGlassBezelPrefs.m */; };
B59AD27F2997AC2F006DA797 /* LiquidGlassBezelSearchObjectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AD27E2997AC2F006DA797 /* LiquidGlassBezelSearchObjectView.swift */; };
B59AD2812997AE4A006DA797 /* LiquidGlassBezelCollectingSearchObjectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AD2802997AE4A006DA797 /* LiquidGlassBezelCollectingSearchObjectView.swift */; };
B59AD2852997B860006DA797 /* LiquidGlassBezelObjectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AD2842997B860006DA797 /* LiquidGlassBezelObjectCell.swift */; };
@@ -26,11 +26,9 @@
42663057193CC1FA00C0DD31 /* BBLiquidGlassBezelInterface.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BBLiquidGlassBezelInterface.xib; sourceTree = "<group>"; };
B576D2F42993FBD400A8B645 /* BackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackgroundView.swift; sourceTree = "<group>"; };
B576D2F62993FD7500A8B645 /* LiquidGlassBezel-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "LiquidGlassBezel-Bridging-Header.h"; sourceTree = "<group>"; };
- B57CEE4A2E6987E700628387 /* BBLiquidGlassBezelPrefs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BBLiquidGlassBezelPrefs.h; sourceTree = "<group>"; };
- B57CEE4B2E69881000628387 /* BBLiquidGlassBezelPrefs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BBLiquidGlassBezelPrefs.m; sourceTree = "<group>"; };
- B57CEE4E2E698DE900628387 /* BBLiquidGlassBezelPrefs 2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BBLiquidGlassBezelPrefs 2.h"; sourceTree = "<group>"; };
- B57CEE4F2E698DEC00628387 /* BBLiquidGlassBezelPrefs 2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "BBLiquidGlassBezelPrefs 2.m"; sourceTree = "<group>"; };
B57CEE512E698E7100628387 /* BBLiquidGlassBezelPrefs.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BBLiquidGlassBezelPrefs.xib; sourceTree = "<group>"; };
+ B57CEE552E69989500628387 /* BBLiquidGlassBezelPrefs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BBLiquidGlassBezelPrefs.h; sourceTree = "<group>"; };
+ B57CEE562E69989D00628387 /* BBLiquidGlassBezelPrefs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BBLiquidGlassBezelPrefs.m; sourceTree = "<group>"; };
B59AD27E2997AC2F006DA797 /* LiquidGlassBezelSearchObjectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiquidGlassBezelSearchObjectView.swift; sourceTree = "<group>"; };
B59AD2802997AE4A006DA797 /* LiquidGlassBezelCollectingSearchObjectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiquidGlassBezelCollectingSearchObjectView.swift; sourceTree = "<group>"; };
B59AD2842997B860006DA797 /* LiquidGlassBezelObjectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiquidGlassBezelObjectCell.swift; sourceTree = "<group>"; };
@@ -88,8 +86,6 @@
E470B7E41709F3A0000169F2 /* Liquid Glass Bezel */ = {
isa = PBXGroup;
children = (
- B57CEE4A2E6987E700628387 /* BBLiquidGlassBezelPrefs.h */,
- B57CEE4B2E69881000628387 /* BBLiquidGlassBezelPrefs.m */,
E470B7EA1709F3A0000169F2 /* Configuration */,
E470B7E51709F3A0000169F2 /* Supporting Files */,
42447D7B19407DA00077B4B2 /* BBObjectCell.h */,
@@ -101,9 +97,9 @@
B59AD27E2997AC2F006DA797 /* LiquidGlassBezelSearchObjectView.swift */,
B59AD2802997AE4A006DA797 /* LiquidGlassBezelCollectingSearchObjectView.swift */,
B59AD2842997B860006DA797 /* LiquidGlassBezelObjectCell.swift */,
- B57CEE4E2E698DE900628387 /* BBLiquidGlassBezelPrefs 2.h */,
- B57CEE4F2E698DEC00628387 /* BBLiquidGlassBezelPrefs 2.m */,
B57CEE512E698E7100628387 /* BBLiquidGlassBezelPrefs.xib */,
+ B57CEE552E69989500628387 /* BBLiquidGlassBezelPrefs.h */,
+ B57CEE562E69989D00628387 /* BBLiquidGlassBezelPrefs.m */,
);
path = "Liquid Glass Bezel";
sourceTree = "<group>";
@@ -222,9 +218,9 @@
buildActionMask = 2147483647;
files = (
B59AD2812997AE4A006DA797 /* LiquidGlassBezelCollectingSearchObjectView.swift in Sources */,
+ B57CEE572E69989D00628387 /* BBLiquidGlassBezelPrefs.m in Sources */,
B576D2F52993FBD400A8B645 /* BackgroundView.swift in Sources */,
42447D7D19407DA00077B4B2 /* BBObjectCell.m in Sources */,
- B57CEE502E698DEC00628387 /* BBLiquidGlassBezelPrefs 2.m in Sources */,
E470B7F81709F3A0000169F2 /* BBLiquidGlassBezelInterface.m in Sources */,
B59AD2852997B860006DA797 /* LiquidGlassBezelObjectCell.swift in Sources */,
B59AD27F2997AC2F006DA797 /* LiquidGlassBezelSearchObjectView.swift in Sources */,
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()
- }
}