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

@ -70,6 +70,7 @@ class MiniWindowManager: ObservableObject {
} }
private func deinitializeWindow() { private func deinitializeWindow() {
miniPanel?.orderOut(nil)
windowController?.close() windowController?.close()
windowController = nil windowController = nil
miniPanel = nil miniPanel = nil

View File

@ -70,8 +70,6 @@ class NotchRecorderPanel: KeyablePanel {
self.ignoresMouseEvents = false self.ignoresMouseEvents = false
self.isMovable = false self.isMovable = false
print("NotchRecorderPanel initialized")
NotificationCenter.default.addObserver( NotificationCenter.default.addObserver(
self, self,
selector: #selector(handleScreenParametersChange), selector: #selector(handleScreenParametersChange),

View File

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

View File

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

View File

@ -31,6 +31,19 @@ class WhisperState: NSObject, ObservableObject {
@Published var recorderType: String = UserDefaults.standard.string(forKey: "RecorderType") ?? "mini" { @Published var recorderType: String = UserDefaults.standard.string(forKey: "RecorderType") ?? "mini" {
didSet { 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") UserDefaults.standard.set(recorderType, forKey: "RecorderType")
} }
} }