1
1
import {
2
2
type CachedMetadata ,
3
+ type Debouncer ,
3
4
type EventRef ,
4
5
type MarkdownPostProcessorContext ,
5
6
MarkdownRenderChild ,
6
7
MarkdownRenderer ,
7
8
type TAbstractFile ,
8
9
TFile ,
10
+ debounce ,
9
11
} from 'obsidian' ;
10
12
import { App , Keymap } from 'obsidian' ;
11
13
import { GlobalQuery } from '../Config/GlobalQuery' ;
@@ -21,6 +23,8 @@ import type { Task } from '../Task/Task';
21
23
import { type BacklinksEventHandler , type EditButtonClickHandler , QueryResultsRenderer } from './QueryResultsRenderer' ;
22
24
import { createAndAppendElement } from './TaskLineRenderer' ;
23
25
26
+ type RenderParams = { tasks : Task [ ] ; state : State } ;
27
+
24
28
/**
25
29
* `QueryRenderer` is responsible for rendering queries in Markdown code blocks
26
30
* annotated with the 'tasks' processor.
@@ -97,6 +101,7 @@ class QueryRenderChild extends MarkdownRenderChild {
97
101
private observer : IntersectionObserver | null = null ;
98
102
99
103
private readonly queryResultsRenderer : QueryResultsRenderer ;
104
+ private readonly debouncedRenderFn : Debouncer < [ RenderParams ] , void > ;
100
105
101
106
constructor ( {
102
107
app,
@@ -128,6 +133,8 @@ class QueryRenderChild extends MarkdownRenderChild {
128
133
this . app = app ;
129
134
this . plugin = plugin ;
130
135
this . events = events ;
136
+
137
+ this . debouncedRenderFn = debounce ( ( params : RenderParams ) => this . render ( params ) , 300 , true ) ;
131
138
}
132
139
133
140
onload ( ) {
@@ -232,6 +239,9 @@ class QueryRenderChild extends MarkdownRenderChild {
232
239
clearTimeout ( this . queryReloadTimeout ) ;
233
240
}
234
241
242
+ // Cancel any pending debounced renders
243
+ this . debouncedRenderFn . cancel ( ) ;
244
+
235
245
this . observer ?. disconnect ( ) ;
236
246
this . observer = null ;
237
247
}
@@ -263,7 +273,11 @@ class QueryRenderChild extends MarkdownRenderChild {
263
273
} , millisecondsToMidnight + 1000 ) ; // Add buffer to be sure to run after midnight.
264
274
}
265
275
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 ) {
267
281
// We got here because the Cache reported a change in at least one task in the vault.
268
282
// So note that any results we have already drawn are now out-of-date:
269
283
this . isCacheChangedSinceLastRedraw = true ;
@@ -315,8 +329,7 @@ class QueryRenderChild extends MarkdownRenderChild {
315
329
private rereadQueryFromFile ( ) {
316
330
this . queryResultsRenderer . rereadQueryFromFile ( ) ;
317
331
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 ( ) } ) ;
320
333
}
321
334
}
322
335
0 commit comments