From 1d19c0593ebe6abe60468e12e87459ab68586603 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Thu, 04 Jun 2026 12:07:09 +0800
Subject: [PATCH] Refresh app index when application folders change

---
 Apptag/ContentView.swift |   37 +++++++++++++++++++++++++++----------
 1 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/Apptag/ContentView.swift b/Apptag/ContentView.swift
index 86e511f..59964a3 100644
--- a/Apptag/ContentView.swift
+++ b/Apptag/ContentView.swift
@@ -376,6 +376,7 @@
     @State private var refreshInProgress = false
     @State private var refreshAgainAfterCurrent = false
     @State private var refreshAgainForceLayout = false
+    @State private var refreshAgainUseCache = true
     @FocusState private var bubbleNoteFocused: Bool
 
     // Quick Search
@@ -532,7 +533,7 @@
         }
         .onAppear {
             refreshNotchHeight()
-            refreshAppsIfNeeded()
+            refreshAppsForOverlay()
             if let initialQuickSearchSource, !initialQuickSearchConsumed {
                 initialQuickSearchConsumed = true
                 if initialQuickSearchSource == QuickSearchOpenSource.globalHidden {
@@ -545,6 +546,7 @@
                 }
                 quickSearchOpenedAt = Date()
                 refreshQuickSearchResults()
+                refreshAppsForQuickSearch()
                 NotificationCenter.default.post(
                     name: .tagLauncherQuickSearchVisibilityChanged,
                     object: nil,
@@ -558,7 +560,7 @@
         .onReceive(NotificationCenter.default.publisher(for: .tagLauncherOverlayDidShow)) { _ in
             resetTransientDragState()
             refreshNotchHeight()
-            refreshAppsIfNeeded()
+            refreshAppsForOverlay()
         }
         .onReceive(NotificationCenter.default.publisher(for: .tagLauncherOverlayDidHide)) { _ in
             resetTransientDragState()
@@ -676,7 +678,7 @@
                     selectedID: quickSearchSelectedID,
                     focusToken: quickSearchFocusToken,
                     selectionScrollToken: quickSearchSelectionScrollToken,
-                    isLoading: quickSearchDocuments.isEmpty && refreshInProgress,
+                    isLoading: quickSearchShouldShowLoading,
                     maxVisibleRows: quickSearchMaxVisibleRows(in: proxy.size),
                     panelTopY: quickSearchPanelTopY(in: proxy.size),
                     panelHeight: quickSearchPanelContentHeight(in: proxy.size),
@@ -695,7 +697,7 @@
     }
 
     private func quickSearchPanelContentHeight(in size: CGSize) -> CGFloat {
-        let hasResultList = !(quickSearchDocuments.isEmpty && refreshInProgress)
+        let hasResultList = !quickSearchShouldShowLoading
             && quickSearchErrorMessage == nil
             && !quickSearchResults.isEmpty
         let visibleRows = min(max(1, quickSearchResults.count), quickSearchMaxVisibleRows(in: size))
@@ -735,7 +737,7 @@
         quickSearchErrorMessage = nil
         quickSearchFocusToken &+= 1
         refreshQuickSearchResults()
-        refreshApps()
+        refreshAppsForQuickSearch()
         NotificationCenter.default.post(
             name: .tagLauncherQuickSearchVisibilityChanged,
             object: nil,
@@ -752,6 +754,10 @@
             && smartStartNotice == nil
             && !appGridInteraction.dropRefreshVisible
             && !quickSearchVisible
+    }
+
+    private var quickSearchShouldShowLoading: Bool {
+        quickSearchVisible && refreshInProgress && quickSearchResults.isEmpty
     }
 
     private func closeQuickSearch(
@@ -1807,6 +1813,16 @@
         refreshApps()
     }
 
+    private func refreshAppsForOverlay() {
+        guard AppIndexer.shouldRefreshForSearchPathChanges() else { return }
+        refreshApps()
+    }
+
+    private func refreshAppsForQuickSearch() {
+        guard AppIndexer.shouldRefreshForSearchPathChanges() else { return }
+        refreshApps()
+    }
+
     private func refreshNotchHeight() {
         let mousePoint = NSEvent.mouseLocation
         let activeScreen = NSScreen.screens.first(where: {
@@ -2417,10 +2433,9 @@
 
     func refreshApps(forceLayoutRefresh: Bool = false, useCache: Bool = true) {
         guard !refreshInProgress else {
-            if forceLayoutRefresh {
-                refreshAgainAfterCurrent = true
-                refreshAgainForceLayout = true
-            }
+            refreshAgainAfterCurrent = true
+            refreshAgainForceLayout = refreshAgainForceLayout || forceLayoutRefresh
+            refreshAgainUseCache = refreshAgainUseCache && useCache
             return
         }
 
@@ -2436,9 +2451,11 @@
                 refreshInProgress = false
                 if refreshAgainAfterCurrent {
                     let shouldForceLayout = refreshAgainForceLayout
+                    let shouldUseCache = refreshAgainUseCache
                     refreshAgainAfterCurrent = false
                     refreshAgainForceLayout = false
-                    refreshApps(forceLayoutRefresh: shouldForceLayout)
+                    refreshAgainUseCache = true
+                    refreshApps(forceLayoutRefresh: shouldForceLayout, useCache: shouldUseCache)
                 }
             }
         }

--
Gitblit v1.9.3