소스 검색

Fix widget selection and desktop widget layering after clicking desktop

Persist the Widgets library sidebar selection in AppStorage so it survives
NSHostingController rootView replacement when reopening the Widgets window.

Raise desktop widget panels one level above desktop icons and order them
front on mouse down so they stay draggable after Finder desktop clicks.

Made-with: Cursor
huzaifahayat12 3 달 전
부모
커밋
e573bcfb11
2개의 변경된 파일38개의 추가작업 그리고 3개의 파일을 삭제
  1. 8 1
      google_apps/Widgets/DesktopWidgetWindowManager.swift
  2. 30 2
      google_apps/Widgets/WidgetsWindowManager.swift

+ 8 - 1
google_apps/Widgets/DesktopWidgetWindowManager.swift

@@ -68,7 +68,9 @@ final class DesktopWidgetWindowManager {
         panel.isFloatingPanel = false
         panel.becomesKeyOnlyIfNeeded = false
         panel.isMovable = true
-        panel.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.desktopIconWindow)))
+        // One level above desktop icons so Finder desktop clicks do not leave our widget behind the desktop layer.
+        let desktopIconLevel = Int(CGWindowLevelForKey(.desktopIconWindow))
+        panel.level = NSWindow.Level(rawValue: desktopIconLevel + 1)
         panel.hasShadow = true
         panel.isOpaque = false
         panel.backgroundColor = .clear
@@ -202,6 +204,11 @@ final class DesktopWidgetWindowManager {
 private final class DesktopWidgetPanel: NSPanel {
     override var canBecomeKey: Bool { false }
     override var canBecomeMain: Bool { false }
+
+    override func mouseDown(with event: NSEvent) {
+        orderFront(nil)
+        super.mouseDown(with: event)
+    }
 }
 
 private struct DesktopWidgetHostView: View {

+ 30 - 2
google_apps/Widgets/WidgetsWindowManager.swift

@@ -65,6 +65,9 @@ private struct WidgetsWindowRootView: View {
     let selectedAppID: UUID?
 
     @AppStorage("widgetAppIDsData") private var widgetAppIDsData = ""
+    /// Survives `NSHostingController.rootView` replacement so the sidebar stays selected like macOS widget settings.
+    @AppStorage("widgetsLibrarySidebarSelectedAppID") private var persistedSidebarAppID: String = ""
+
     @State private var selection: UUID?
 
     var body: some View {
@@ -82,10 +85,35 @@ private struct WidgetsWindowRootView: View {
             .padding(.top, 12)
         }
         .onAppear {
-            selection = selectedAppID ?? selection ?? apps.first?.id
+            restoreSelectionFromStorage()
         }
         .onChange(of: selectedAppID) { newValue in
-            if let newValue { selection = newValue }
+            if let newValue {
+                selection = newValue
+                persistedSidebarAppID = newValue.uuidString
+            }
+        }
+        .onChange(of: selection) { newValue in
+            if let newValue {
+                persistedSidebarAppID = newValue.uuidString
+            }
+        }
+    }
+
+    private func restoreSelectionFromStorage() {
+        if let selectedAppID {
+            selection = selectedAppID
+            persistedSidebarAppID = selectedAppID.uuidString
+            return
+        }
+        if let stored = UUID(uuidString: persistedSidebarAppID),
+           apps.contains(where: { $0.id == stored }) {
+            selection = stored
+            return
+        }
+        if let first = apps.first {
+            selection = first.id
+            persistedSidebarAppID = first.id.uuidString
         }
     }
 }