Prevent UI stuck state when switching between mini and notch recorders

This commit is contained in:
Beingpax 2025-11-01 10:14:17 +05:45
parent b02a22cb95
commit 4bff63dc00
5 changed files with 22 additions and 13 deletions

View File

@ -32,17 +32,17 @@ class MiniWindowManager: ObservableObject {
}
func show() {
if isVisible { return }
let activeScreen = NSApp.keyWindow?.screen ?? NSScreen.main ?? NSScreen.screens[0]
initializeWindow(screen: activeScreen)
self.isVisible = true
miniPanel?.show()
}
func hide() {
guard isVisible else { return }
self.isVisible = false
self.miniPanel?.hide { [weak self] in
guard let self = self else { return }
@ -70,6 +70,7 @@ class MiniWindowManager: ObservableObject {
}
private func deinitializeWindow() {
miniPanel?.orderOut(nil)
windowController?.close()
windowController = nil
miniPanel = nil

View File

@ -69,9 +69,7 @@ class NotchRecorderPanel: KeyablePanel {
// Make window transparent to mouse events except for the content
self.ignoresMouseEvents = false
self.isMovable = false
print("NotchRecorderPanel initialized")
NotificationCenter.default.addObserver(
self,
selector: #selector(handleScreenParametersChange),

View File

@ -41,11 +41,9 @@ class NotchWindowManager: ObservableObject {
func hide() {
guard isVisible else { return }
// Remove animation for instant state change
self.isVisible = false
// Don't wait for animation, clean up immediately
self.notchPanel?.hide { [weak self] in
guard let self = self else { return }
self.deinitializeWindow()
@ -72,6 +70,7 @@ class NotchWindowManager: ObservableObject {
}
private func deinitializeWindow() {
notchPanel?.orderOut(nil)
windowController?.close()
windowController = nil
notchPanel = nil

View File

@ -12,13 +12,11 @@ extension WhisperState {
if recorderType == "notch" {
if notchWindowManager == nil {
notchWindowManager = NotchWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new notch window manager")
}
notchWindowManager?.show()
} else {
if miniWindowManager == nil {
miniWindowManager = MiniWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new mini window manager")
}
miniWindowManager?.show()
}

View File

@ -31,6 +31,19 @@ class WhisperState: NSObject, ObservableObject {
@Published var recorderType: String = UserDefaults.standard.string(forKey: "RecorderType") ?? "mini" {
didSet {
if isMiniRecorderVisible {
if oldValue == "notch" {
notchWindowManager?.hide()
notchWindowManager = nil
} else {
miniWindowManager?.hide()
miniWindowManager = nil
}
Task { @MainActor in
try? await Task.sleep(nanoseconds: 50_000_000)
showRecorderPanel()
}
}
UserDefaults.standard.set(recorderType, forKey: "RecorderType")
}
}