Skip to content

Commit c3ebe9d

Browse files
committed
feat: Debounce the redrawing when Includes settings change
1 parent c98add4 commit c3ebe9d

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/Renderer/QueryRenderer.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import {
22
type CachedMetadata,
3+
type Debouncer,
34
type EventRef,
45
type MarkdownPostProcessorContext,
56
MarkdownRenderChild,
67
MarkdownRenderer,
78
type TAbstractFile,
89
TFile,
10+
debounce,
911
} from 'obsidian';
1012
import { App, Keymap } from 'obsidian';
1113
import { GlobalQuery } from '../Config/GlobalQuery';
@@ -21,6 +23,8 @@ import type { Task } from '../Task/Task';
2123
import { type BacklinksEventHandler, type EditButtonClickHandler, QueryResultsRenderer } from './QueryResultsRenderer';
2224
import { createAndAppendElement } from './TaskLineRenderer';
2325

26+
type RenderParams = { tasks: Task[]; state: State };
27+
2428
/**
2529
* `QueryRenderer` is responsible for rendering queries in Markdown code blocks
2630
* annotated with the 'tasks' processor.
@@ -97,6 +101,7 @@ class QueryRenderChild extends MarkdownRenderChild {
97101
private observer: IntersectionObserver | null = null;
98102

99103
private readonly queryResultsRenderer: QueryResultsRenderer;
104+
private readonly debouncedRenderFn: Debouncer<[RenderParams], void>;
100105

101106
constructor({
102107
app,
@@ -128,6 +133,8 @@ class QueryRenderChild extends MarkdownRenderChild {
128133
this.app = app;
129134
this.plugin = plugin;
130135
this.events = events;
136+
137+
this.debouncedRenderFn = debounce((params: RenderParams) => this.render(params), 300, true);
131138
}
132139

133140
onload() {
@@ -232,6 +239,9 @@ class QueryRenderChild extends MarkdownRenderChild {
232239
clearTimeout(this.queryReloadTimeout);
233240
}
234241

242+
// Cancel any pending debounced renders
243+
this.debouncedRenderFn.cancel();
244+
235245
this.observer?.disconnect();
236246
this.observer = null;
237247
}
@@ -263,7 +273,11 @@ class QueryRenderChild extends MarkdownRenderChild {
263273
}, millisecondsToMidnight + 1000); // Add buffer to be sure to run after midnight.
264274
}
265275

266-
private async render({ tasks, state }: { tasks: Task[]; state: State }) {
276+
private debouncedRender(params: RenderParams): void {
277+
this.debouncedRenderFn(params);
278+
}
279+
280+
private async render({ tasks, state }: RenderParams) {
267281
// We got here because the Cache reported a change in at least one task in the vault.
268282
// So note that any results we have already drawn are now out-of-date:
269283
this.isCacheChangedSinceLastRedraw = true;
@@ -315,8 +329,7 @@ class QueryRenderChild extends MarkdownRenderChild {
315329
private rereadQueryFromFile() {
316330
this.queryResultsRenderer.rereadQueryFromFile();
317331
this.isCacheChangedSinceLastRedraw = true;
318-
// TODO Debounce this rendering
319-
this.render({ tasks: this.plugin.getTasks(), state: this.plugin.getState() });
332+
this.debouncedRender({ tasks: this.plugin.getTasks(), state: this.plugin.getState() });
320333
}
321334
}
322335

0 commit comments

Comments
 (0)