Prevent UI stuck state when switching between mini and notch recorders
This commit is contained in:
parent
b02a22cb95
commit
4bff63dc00
@ -32,17 +32,17 @@ class MiniWindowManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
func show() {
|
func show() {
|
||||||
if isVisible { return }
|
if isVisible { return }
|
||||||
|
|
||||||
let activeScreen = NSApp.keyWindow?.screen ?? NSScreen.main ?? NSScreen.screens[0]
|
let activeScreen = NSApp.keyWindow?.screen ?? NSScreen.main ?? NSScreen.screens[0]
|
||||||
|
|
||||||
initializeWindow(screen: activeScreen)
|
initializeWindow(screen: activeScreen)
|
||||||
self.isVisible = true
|
self.isVisible = true
|
||||||
miniPanel?.show()
|
miniPanel?.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
func hide() {
|
func hide() {
|
||||||
guard isVisible else { return }
|
guard isVisible else { return }
|
||||||
|
|
||||||
self.isVisible = false
|
self.isVisible = false
|
||||||
self.miniPanel?.hide { [weak self] in
|
self.miniPanel?.hide { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
@ -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
|
||||||
|
|||||||
@ -69,9 +69,7 @@ class NotchRecorderPanel: KeyablePanel {
|
|||||||
// Make window transparent to mouse events except for the content
|
// Make window transparent to mouse events except for the content
|
||||||
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),
|
||||||
|
|||||||
@ -41,11 +41,9 @@ 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
|
||||||
|
|||||||
@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user