mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 15:14:33 +00:00
Update Metal Enabler and Smoothened Animations
This commit is contained in:
parent
c6568c33da
commit
2d2ac570cd
3 changed files with 40 additions and 7 deletions
|
|
@ -412,6 +412,7 @@
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = Atoll;
|
INFOPLIST_KEY_CFBundleDisplayName = Atoll;
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
INFOPLIST_KEY_LSUIElement = YES;
|
INFOPLIST_KEY_LSUIElement = YES;
|
||||||
|
INFOPLIST_KEY_MetalCaptureEnabled = YES;
|
||||||
INFOPLIST_KEY_NSAppleEventsUsageDescription = "Dynamic Island uses AppleScripts to control Spotify and Apple Music";
|
INFOPLIST_KEY_NSAppleEventsUsageDescription = "Dynamic Island uses AppleScripts to control Spotify and Apple Music";
|
||||||
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Dynamic Island needs Bluetooth access to detect when audio devices connect and display their battery status in the HUD.";
|
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Dynamic Island needs Bluetooth access to detect when audio devices connect and display their battery status in the HUD.";
|
||||||
INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription = "Show calender events inside the notch";
|
INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription = "Show calender events inside the notch";
|
||||||
|
|
@ -479,6 +480,7 @@
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = Atoll;
|
INFOPLIST_KEY_CFBundleDisplayName = Atoll;
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
|
||||||
INFOPLIST_KEY_LSUIElement = YES;
|
INFOPLIST_KEY_LSUIElement = YES;
|
||||||
|
INFOPLIST_KEY_MetalCaptureEnabled = YES;
|
||||||
INFOPLIST_KEY_NSAppleEventsUsageDescription = "Dynamic Island uses AppleScripts to control Spotify and Apple Music";
|
INFOPLIST_KEY_NSAppleEventsUsageDescription = "Dynamic Island uses AppleScripts to control Spotify and Apple Music";
|
||||||
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Dynamic Island needs Bluetooth access to detect when audio devices connect and display their battery status in the HUD.";
|
INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "Dynamic Island needs Bluetooth access to detect when audio devices connect and display their battery status in the HUD.";
|
||||||
INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription = "Show calender events inside the notch";
|
INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription = "Show calender events inside the notch";
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ struct LockScreenMusicPanel: View {
|
||||||
@ObservedObject var musicManager = MusicManager.shared
|
@ObservedObject var musicManager = MusicManager.shared
|
||||||
@ObservedObject private var routeManager = AudioRouteManager.shared
|
@ObservedObject private var routeManager = AudioRouteManager.shared
|
||||||
@StateObject private var volumeModel = MediaOutputVolumeViewModel()
|
@StateObject private var volumeModel = MediaOutputVolumeViewModel()
|
||||||
|
@ObservedObject private var animator: LockScreenPanelAnimator
|
||||||
@State private var sliderValue: Double = 0
|
@State private var sliderValue: Double = 0
|
||||||
@State private var dragging: Bool = false
|
@State private var dragging: Bool = false
|
||||||
@State private var isActive = true
|
@State private var isActive = true
|
||||||
|
|
@ -31,6 +32,10 @@ struct LockScreenMusicPanel: View {
|
||||||
@Default(.musicAuxRightControl) private var rightAuxControl
|
@Default(.musicAuxRightControl) private var rightAuxControl
|
||||||
@Default(.enableLyrics) private var enableLyrics
|
@Default(.enableLyrics) private var enableLyrics
|
||||||
|
|
||||||
|
init(animator: LockScreenPanelAnimator) {
|
||||||
|
_animator = ObservedObject(wrappedValue: animator)
|
||||||
|
}
|
||||||
|
|
||||||
private let collapsedPanelCornerRadius: CGFloat = 28
|
private let collapsedPanelCornerRadius: CGFloat = 28
|
||||||
private let expandedPanelCornerRadius: CGFloat = 52
|
private let expandedPanelCornerRadius: CGFloat = 52
|
||||||
private let collapsedAlbumArtCornerRadius: CGFloat = 16
|
private let collapsedAlbumArtCornerRadius: CGFloat = 16
|
||||||
|
|
@ -100,6 +105,9 @@ struct LockScreenMusicPanel: View {
|
||||||
updatePanelSize()
|
updatePanelSize()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.scaleEffect(animator.isPresented ? 1 : 0.9, anchor: .center)
|
||||||
|
.opacity(animator.isPresented ? 1 : 0)
|
||||||
|
.animation(.spring(response: 0.52, dampingFraction: 0.8), value: animator.isPresented)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,11 @@ import SkyLightWindow
|
||||||
import Defaults
|
import Defaults
|
||||||
import QuartzCore
|
import QuartzCore
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
final class LockScreenPanelAnimator: ObservableObject {
|
||||||
|
@Published var isPresented: Bool = false
|
||||||
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
class LockScreenPanelManager {
|
class LockScreenPanelManager {
|
||||||
static let shared = LockScreenPanelManager()
|
static let shared = LockScreenPanelManager()
|
||||||
|
|
@ -21,6 +26,8 @@ class LockScreenPanelManager {
|
||||||
private let collapsedPanelCornerRadius: CGFloat = 28
|
private let collapsedPanelCornerRadius: CGFloat = 28
|
||||||
private let expandedPanelCornerRadius: CGFloat = 52
|
private let expandedPanelCornerRadius: CGFloat = 52
|
||||||
private(set) var latestFrame: NSRect?
|
private(set) var latestFrame: NSRect?
|
||||||
|
private let panelAnimator = LockScreenPanelAnimator()
|
||||||
|
private var hideTask: Task<Void, Never>?
|
||||||
|
|
||||||
private init() {
|
private init() {
|
||||||
print("[\(timestamp())] LockScreenPanelManager: initialized")
|
print("[\(timestamp())] LockScreenPanelManager: initialized")
|
||||||
|
|
@ -81,7 +88,10 @@ class LockScreenPanelManager {
|
||||||
|
|
||||||
window.setFrame(targetFrame, display: true)
|
window.setFrame(targetFrame, display: true)
|
||||||
latestFrame = targetFrame
|
latestFrame = targetFrame
|
||||||
let hosting = NSHostingView(rootView: LockScreenMusicPanel())
|
hideTask?.cancel()
|
||||||
|
panelAnimator.isPresented = false
|
||||||
|
|
||||||
|
let hosting = NSHostingView(rootView: LockScreenMusicPanel(animator: panelAnimator))
|
||||||
hosting.frame = NSRect(origin: .zero, size: targetFrame.size)
|
hosting.frame = NSRect(origin: .zero, size: targetFrame.size)
|
||||||
window.contentView = hosting
|
window.contentView = hosting
|
||||||
|
|
||||||
|
|
@ -100,6 +110,11 @@ class LockScreenPanelManager {
|
||||||
// Keep the window alive and simply order it out on unlock to avoid SkyLight crashes.
|
// Keep the window alive and simply order it out on unlock to avoid SkyLight crashes.
|
||||||
window.orderFrontRegardless()
|
window.orderFrontRegardless()
|
||||||
|
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
self.panelAnimator.isPresented = true
|
||||||
|
}
|
||||||
|
|
||||||
print("[\(timestamp())] LockScreenPanelManager: panel visible")
|
print("[\(timestamp())] LockScreenPanelManager: panel visible")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -142,16 +157,24 @@ class LockScreenPanelManager {
|
||||||
func hidePanel() {
|
func hidePanel() {
|
||||||
print("[\(timestamp())] LockScreenPanelManager: hidePanel")
|
print("[\(timestamp())] LockScreenPanelManager: hidePanel")
|
||||||
|
|
||||||
|
panelAnimator.isPresented = false
|
||||||
|
hideTask?.cancel()
|
||||||
|
|
||||||
guard let window = panelWindow else {
|
guard let window = panelWindow else {
|
||||||
print("LockScreenPanelManager: no panel to hide")
|
print("LockScreenPanelManager: no panel to hide")
|
||||||
|
latestFrame = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
window.orderOut(nil)
|
hideTask = Task { [weak self, weak window] in
|
||||||
window.contentView = nil
|
try? await Task.sleep(for: .milliseconds(360))
|
||||||
|
guard let self else { return }
|
||||||
latestFrame = nil
|
await MainActor.run {
|
||||||
|
window?.orderOut(nil)
|
||||||
print("[\(timestamp())] LockScreenPanelManager: panel hidden")
|
window?.contentView = nil
|
||||||
|
self.latestFrame = nil
|
||||||
|
print("[\(self.timestamp())] LockScreenPanelManager: panel hidden")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue