Sfoglia il codice sorgente

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 mesi fa
parent
commit
e573bcfb11

+ 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
         }
     }
 }