diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 8c507269e8e0be34f9be51e02b447602c1e41d1a..0b040799230e2e3bb073720a0d1d4a14e37fc281 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -76,6 +76,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe private previousActiveHandlerDescriptor: QuickOpenHandlerDescriptor; private actionProvider = new ContributableActionProvider(); private previousValue = ''; + private visibilityChangeTimeoutHandle: number; constructor( private eventService: IEventService, @@ -208,7 +209,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe onOk: () => { /* ignore, handle later */ }, onCancel: () => { /* ignore, handle later */ }, onType: (value: string) => { /* ignore, handle later */ }, - onShow: () => this._onShow.fire() + onShow: () => this.emitQuickOpenVisibilityChange(true) }, { inputPlaceHolder: options.placeHolder || '' }, @@ -348,11 +349,11 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe this.pickOpenWidget.refresh(model, value ? { autoFocusFirstEntry: true } : autoFocus); }, onShow: () => { - this._onShow.fire(); // event + this.emitQuickOpenVisibilityChange(true); // event }, onHide: () => { this.restoreFocus(); // focus back to editor or viewlet - this._onHide.fire(); // event + this.emitQuickOpenVisibilityChange(false); // event } }); @@ -378,6 +379,22 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe }); } + private emitQuickOpenVisibilityChange(isVisible: boolean): void { + if (this.visibilityChangeTimeoutHandle) { + window.clearTimeout(this.visibilityChangeTimeoutHandle); + } + + this.visibilityChangeTimeoutHandle = setTimeout(() => { + if (isVisible) { + this._onShow.fire(); + } else { + this._onHide.fire(); + } + + this.visibilityChangeTimeoutHandle = void 0; + }, 100 /* to prevent flashing, we accumulate visibility changes over a timeout of 100ms */); + } + public refresh(input?: string): TPromise { if (!this.quickOpenWidget.isVisible()) { return TPromise.as(null); @@ -421,7 +438,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe onType: (value: string) => this.onType(value || ''), onShow: () => { this.inQuickOpenMode.set(true); - this._onShow.fire(); + this.emitQuickOpenVisibilityChange(true); }, onHide: () => { this.inQuickOpenMode.reset(); @@ -432,7 +449,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe } this.restoreFocus(); // focus back to editor or viewlet - this._onHide.fire(); + this.emitQuickOpenVisibilityChange(false); } }, { inputPlaceHolder: this.hasHandler(HELP_PREFIX) ? nls.localize('quickOpenInput', "Type '?' to get help on the actions you can take from here") : ''