Skip to content

Commit 455ffe3

Browse files
authored
Merge pull request #3597 from ilandikov/feat-auto-update-global-filter
feat: redraw search results after global filter is edited
2 parents 557c975 + a0e9648 commit 455ffe3

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

src/Config/SettingsTab.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,20 @@ export class SettingsTab extends PluginSettingTab {
110110
// wide enough for the whole string to be visible.
111111
text.setPlaceholder(i18n.t('settings.globalFilter.filter.placeholder'))
112112
.setValue(GlobalFilter.getInstance().get())
113-
.onChange(async (value) => {
114-
updateSettings({ globalFilter: value });
115-
GlobalFilter.getInstance().set(value);
116-
await this.plugin.saveSettings();
117-
setSettingVisibility(globalFilterHidden, value.length > 0);
118-
});
113+
.onChange(
114+
debounce(
115+
async (value) => {
116+
updateSettings({ globalFilter: value });
117+
GlobalFilter.getInstance().set(value);
118+
await this.plugin.saveSettings();
119+
setSettingVisibility(globalFilterHidden, value.length > 0);
120+
121+
this.events.triggerReloadVault();
122+
},
123+
500,
124+
true,
125+
),
126+
);
119127
});
120128

121129
globalFilterHidden = new Setting(containerEl)

src/Obsidian/Cache.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import { DateFallback } from '../DateTime/DateFallback';
1717
import { getSettings } from '../Config/Settings';
1818
import { Lazy } from '../lib/Lazy';
1919
import { Logger, logging } from '../lib/logging';
20+
import { PerformanceTracker } from '../lib/PerformanceTracker';
21+
import { GlobalFilter } from '../Config/GlobalFilter';
2022
import type { TasksEvents } from './TasksEvents';
2123
import { FileParser } from './FileParser';
2224

@@ -31,9 +33,11 @@ export class Cache {
3133

3234
private readonly metadataCache: MetadataCache;
3335
private readonly metadataCacheEventReferences: EventRef[];
36+
3437
private readonly vault: Vault;
3538
private readonly workspace: Workspace;
3639
private readonly vaultEventReferences: EventRef[];
40+
3741
private readonly events: TasksEvents;
3842
private readonly eventsEventReferences: EventRef[];
3943

@@ -72,9 +76,11 @@ export class Cache {
7276

7377
this.metadataCache = metadataCache;
7478
this.metadataCacheEventReferences = [];
79+
7580
this.vault = vault;
7681
this.workspace = workspace;
7782
this.vaultEventReferences = [];
83+
7884
this.events = events;
7985
this.eventsEventReferences = [];
8086

@@ -227,11 +233,20 @@ export class Cache {
227233
handler({ tasks: this.tasks, state: this.state });
228234
});
229235
this.eventsEventReferences.push(requestReference);
236+
237+
// The caller is responsible for debouncing this:
238+
const reloadVaultReference = this.events.onReloadVault(async () => await this.loadVault());
239+
this.eventsEventReferences.push(reloadVaultReference);
230240
}
231241

232242
private loadVault(): Promise<void> {
233243
this.logger.debug('Cache.loadVault()');
234244
return this.tasksMutex.runExclusive(async () => {
245+
const measureLoad = new PerformanceTracker(
246+
`Loading vault with global filter '${GlobalFilter.getInstance().get()}'`,
247+
);
248+
measureLoad.start();
249+
235250
this.state = State.Initializing;
236251
this.logger.debug('Cache.loadVault(): state = Initializing');
237252

@@ -244,6 +259,11 @@ export class Cache {
244259
// TODO Why is this displayed twice:
245260
this.logger.debug('Cache.loadVault(): state = Warm');
246261

262+
// Report that we have finished loading before notifying subscribers,
263+
// so we don't double-count things like redrawing search results.
264+
// These have their own timer code.
265+
measureLoad.finish();
266+
247267
// Notify that the cache is now warm:
248268
this.notifySubscribers();
249269
});

src/Obsidian/TasksEvents.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ enum Event {
88
CacheUpdate = 'obsidian-tasks-plugin:cache-update',
99
RequestCacheUpdate = 'obsidian-tasks-plugin:request-cache-update',
1010
ReloadOpenSearchResults = 'obsidian-tasks-plugin:reload-open-search-results',
11+
ReloadVault = 'obsidian-tasks-plugin:reload-vault',
1112
}
1213

1314
interface CacheUpdateData {
@@ -69,6 +70,20 @@ export class TasksEvents {
6970
this.obsidianEvents.trigger(Event.ReloadOpenSearchResults);
7071
}
7172

73+
// ------------------------------------------------------------------------
74+
// ReloadVault event
75+
76+
public onReloadVault(handler: () => void): EventRef {
77+
this.logger.debug('TasksEvents.onReloadVault()');
78+
const name = Event.ReloadVault;
79+
return this.obsidianEvents.on(name, handler);
80+
}
81+
82+
public triggerReloadVault(): void {
83+
this.logger.debug('TasksEvents.triggerReloadVault()');
84+
this.obsidianEvents.trigger(Event.ReloadVault);
85+
}
86+
7287
public off(eventRef: EventRef): void {
7388
this.logger.debug('TasksEvents.off()');
7489
this.obsidianEvents.offref(eventRef);

0 commit comments

Comments
 (0)