From 367c84c332cdf08dfd01b8da8af7914287ae9033 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 27 Nov 2018 12:16:45 +0100 Subject: [PATCH] don't fire context key change async --- src/vs/platform/actions/common/menu.ts | 14 +++++----- .../contextkey/browser/contextKeyService.ts | 28 +++++++++---------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/vs/platform/actions/common/menu.ts b/src/vs/platform/actions/common/menu.ts index 72013076fb1..b49dac83870 100644 --- a/src/vs/platform/actions/common/menu.ts +++ b/src/vs/platform/actions/common/menu.ts @@ -31,16 +31,16 @@ export class Menu implements IMenu { debounceEvent( filterEvent(MenuRegistry.onDidChangeMenu, menuId => menuId === this._id), () => { }, - 100 + 50 )(this._build, this, this._disposables); - // when context keys change we need to change if the menu also + // when context keys change we need to check if the menu also // has changed - this._contextKeyService.onDidChangeContext(event => { - if (event.affectsSome(this._contextKeys)) { - this._onDidChange.fire(); - } - }, this, this._disposables); + debounceEvent( + this._contextKeyService.onDidChangeContext, + (last, event) => last || event.affectsSome(this._contextKeys), + 50 + )(e => e && this._onDidChange.fire(), this, this._disposables); } private _build(): void { diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index 236e4b6afa1..d2d2da5045d 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter, Event, debounceEvent } from 'vs/base/common/event'; +import { Emitter, Event, mapEvent } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { keys } from 'vs/base/common/map'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; @@ -193,14 +193,14 @@ class ContextKey implements IContextKey { } } -export class ContextKeyChangeEvent implements IContextKeyChangeEvent { - - private _keys: string[] = []; - - collect(oneOrManyKeys: string | string[]): void { - this._keys = this._keys.concat(oneOrManyKeys); +class SimpleContextKeyChangeEvent implements IContextKeyChangeEvent { + constructor(private readonly _key: string) { } + affectsSome(keys: IReadableSet): boolean { + return keys.has(this._key); } - +} +class ArrayContextKeyChangeEvent implements IContextKeyChangeEvent { + constructor(private readonly _keys: string[]) { } affectsSome(keys: IReadableSet): boolean { for (const key of this._keys) { if (keys.has(key)) { @@ -236,13 +236,11 @@ export abstract class AbstractContextKeyService implements IContextKeyService { public get onDidChangeContext(): Event { if (!this._onDidChangeContext) { - this._onDidChangeContext = debounceEvent(this._onDidChangeContextKey.event, (prev, cur) => { - if (!prev) { - prev = new ContextKeyChangeEvent(); - } - prev.collect(cur); - return prev; - }, 25); + this._onDidChangeContext = mapEvent(this._onDidChangeContextKey.event, ((changedKeyOrKeys): IContextKeyChangeEvent => { + return typeof changedKeyOrKeys === 'string' + ? new SimpleContextKeyChangeEvent(changedKeyOrKeys) + : new ArrayContextKeyChangeEvent(changedKeyOrKeys); + })); } return this._onDidChangeContext; }