Skip to content

Commit b8974b0

Browse files
committed
explorer input black magic
fixes microsoft#78153
1 parent 5352ba3 commit b8974b0

1 file changed

Lines changed: 20 additions & 30 deletions

File tree

src/vs/workbench/contrib/files/browser/views/explorerViewer.ts

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)