Explorar o código

Refresh widget picker when desktop widgets are removed

Make DesktopWidgetWindowManager an ObservableObject and bump a published
token when instances are added or removed. Observe it in WidgetsRootView so
the +/- control updates after removing a widget from the desktop.

Made-with: Cursor
huzaifahayat12 hai 3 meses
pai
achega
76f5905d94

+ 14 - 1
google_apps/Widgets/DesktopWidgetWindowManager.swift

@@ -1,14 +1,22 @@
 import AppKit
+import Combine
 import SwiftUI
 
-final class DesktopWidgetWindowManager {
+final class DesktopWidgetWindowManager: ObservableObject {
     static let shared = DesktopWidgetWindowManager()
 
     private let storageKey = "widgetInstancesData"
     private var windowsByInstanceID: [UUID: NSPanel] = [:]
 
+    /// Bumps when persisted widget instances are added or removed so SwiftUI can refresh pickers.
+    @Published private(set) var instancesChangeToken: Int = 0
+
     private init() {}
 
+    private func notifyInstancesChanged() {
+        instancesChangeToken += 1
+    }
+
     func show(instance: WidgetInstance, appProvider: (UUID) -> LauncherApp?) {
         guard let app = appProvider(instance.appID) else { return }
         let resolvedVariant = WidgetTemplates.variant(for: app, variantID: instance.variantID)
@@ -35,6 +43,8 @@ final class DesktopWidgetWindowManager {
         // Ensure the newly added widget is visually on top.
         panel.orderFront(nil)
         panel.orderFrontRegardless()
+
+        notifyInstancesChanged()
     }
 
     /// Returns `true` if there is already a persisted widget instance for the given `appID + variantID`.
@@ -57,6 +67,7 @@ final class DesktopWidgetWindowManager {
         }
 
         saveInstances(remaining)
+        notifyInstancesChanged()
         return removed.count
     }
 
@@ -80,6 +91,7 @@ final class DesktopWidgetWindowManager {
         }
 
         saveInstances(remaining)
+        notifyInstancesChanged()
     }
 
     // MARK: - Panel construction
@@ -270,6 +282,7 @@ final class DesktopWidgetWindowManager {
         }
         let instances = loadInstances().filter { $0.id != instanceID }
         saveInstances(instances)
+        notifyInstancesChanged()
     }
 
     // MARK: - Persistence

+ 5 - 4
google_apps/Widgets/WidgetsRootView.swift

@@ -10,6 +10,7 @@ struct WidgetsRootView: View {
     @Binding var selectedAppID: UUID?
     @Binding var widgetLibraryIDsData: String
 
+    @ObservedObject private var desktopWidgetManager = DesktopWidgetWindowManager.shared
     @ObservedObject private var premiumStore = PremiumStore.shared
     @State private var query = ""
     @State private var toastMessage: String?
@@ -196,7 +197,7 @@ struct WidgetsRootView: View {
     }
 
     private func addToDesktop(app: LauncherApp, variant: WidgetVariant) {
-        guard !DesktopWidgetWindowManager.shared.hasInstance(appID: app.id, variantID: variant.id) else {
+        guard !desktopWidgetManager.hasInstance(appID: app.id, variantID: variant.id) else {
             return
         }
         ensureInWidgetLibrary(appID: app.id)
@@ -206,14 +207,14 @@ struct WidgetsRootView: View {
             size: variant.size,
             origin: nil
         )
-        DesktopWidgetWindowManager.shared.show(instance: instance, appProvider: { id in
+        desktopWidgetManager.show(instance: instance, appProvider: { id in
             apps.first { $0.id == id }
         })
         showAddedToast(for: app, variant: variant)
     }
 
     private func isWidgetAdded(appID: UUID, variantID: String) -> Bool {
-        DesktopWidgetWindowManager.shared.hasInstance(appID: appID, variantID: variantID)
+        desktopWidgetManager.hasInstance(appID: appID, variantID: variantID)
     }
 
     private func handleWidgetTap(app: LauncherApp, variant: WidgetVariant) {
@@ -229,7 +230,7 @@ struct WidgetsRootView: View {
     }
 
     private func removeFromDesktop(app: LauncherApp, variant: WidgetVariant) {
-        let removedCount = DesktopWidgetWindowManager.shared.removeInstances(appID: app.id, variantID: variant.id)
+        let removedCount = desktopWidgetManager.removeInstances(appID: app.id, variantID: variant.id)
         guard removedCount > 0 else { return }
         showRemovedToast(for: app)
     }