@@ -218,56 +218,46 @@ export class FilesRenderer implements ITreeRenderer<ExplorerItem, FuzzyScore, IF
218218 const lastDot = value . lastIndexOf ( '.' ) ;
219219
220220 inputBox . value = value ;
221+ inputBox . focus ( ) ;
222+ inputBox . select ( { start : 0 , end : lastDot > 0 && ! stat . isDirectory ? lastDot : value . length } ) ;
221223
222- let isFinishableDisposeEvent = false ;
223- setTimeout ( ( ) => {
224- // Check if disposed
225- if ( ! inputBox . inputElement ) {
226- return ;
227- }
228- inputBox . focus ( ) ;
229- inputBox . select ( { start : 0 , end : lastDot > 0 && ! stat . isDirectory ? lastDot : value . length } ) ;
230- isFinishableDisposeEvent = true ;
231- } , 0 ) ;
232-
233- const done = once ( async ( success : boolean ) => {
224+ const done = once ( async ( success : boolean , blur : boolean ) => {
234225 label . element . style . display = 'none' ;
235226 const value = inputBox . value ;
236227 dispose ( toDispose ) ;
237- label . element . remove ( ) ;
238- // Timeout: once done rendering only then re-render #70902
239- setTimeout ( ( ) => editableData . onFinish ( value , success ) , 0 ) ;
228+ container . removeChild ( label . element ) ;
229+ editableData . onFinish ( value , success ) ;
240230 } ) ;
241231
242- const blurDisposable = DOM . addDisposableListener ( inputBox . inputElement , DOM . EventType . BLUR , ( ) => {
243- done ( inputBox . isInputValid ( ) ) ;
244- } ) ;
232+ // It can happen that the tree re-renders this node. When that happens,
233+ // we're gonna get a blur event first and only after an element disposable.
234+ // Because of that, we should setTimeout the blur handler to differentiate
235+ // between the blur happening because of a unrender or because of a user action.
236+ let ignoreBlur = false ;
245237
246238 const toDispose = [
247239 inputBox ,
248240 DOM . addStandardDisposableListener ( inputBox . inputElement , DOM . EventType . KEY_DOWN , ( e : IKeyboardEvent ) => {
249241 if ( e . equals ( KeyCode . Enter ) ) {
250242 if ( inputBox . validate ( ) ) {
251- done ( true ) ;
243+ done ( true , false ) ;
252244 }
253245 } else if ( e . equals ( KeyCode . Escape ) ) {
254- done ( false ) ;
246+ done ( false , false ) ;
255247 }
256248 } ) ,
257- blurDisposable ,
249+ DOM . addDisposableListener ( inputBox . inputElement , DOM . EventType . BLUR , ( ) => {
250+ setTimeout ( ( ) => {
251+ if ( ! ignoreBlur ) {
252+ done ( inputBox . isInputValid ( ) , true ) ;
253+ }
254+ } , 0 ) ;
255+ } ) ,
258256 label ,
259257 styler
260258 ] ;
261259
262- return toDisposable ( ( ) => {
263- if ( isFinishableDisposeEvent ) {
264- done ( false ) ;
265- }
266- else {
267- dispose ( toDispose ) ;
268- label . element . remove ( ) ;
269- }
270- } ) ;
260+ return toDisposable ( ( ) => ignoreBlur = true ) ;
271261 }
272262
273263 disposeElement ?( element : ITreeNode < ExplorerItem , FuzzyScore > , index : number , templateData : IFileTemplateData ) : void {
0 commit comments