From 28c6d7f5116a28626785a060fd7d85f3095aa590 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Mon, 9 Jan 2023 11:02:55 -0800 Subject: [PATCH 1/3] move isHiddenByDefault --- src/vs/platform/action/common/action.ts | 2 -- src/vs/platform/actions/common/actions.ts | 1 + src/vs/platform/actions/common/menuService.ts | 19 +++++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/action/common/action.ts b/src/vs/platform/action/common/action.ts index 85aed52dd75..35bee427113 100644 --- a/src/vs/platform/action/common/action.ts +++ b/src/vs/platform/action/common/action.ts @@ -77,8 +77,6 @@ export interface ICommandAction { * or define toggle-info including an icon and a title that goes well with a checkmark. */ toggled?: ContextKeyExpression | ICommandActionToggleInfo; - - isHiddenByDefault?: boolean; } export type ISerializableCommandAction = UriDto; diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index a97144a1265..4f561f9a174 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -23,6 +23,7 @@ export interface IMenuItem { when?: ContextKeyExpression; group?: 'navigation' | string; order?: number; + isHiddenByDefault?: boolean; } export interface ISubmenuItem { diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 59bcbafb018..451f219b015 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -77,14 +77,14 @@ class PersistedMenuHideState { this._disposables.dispose(); } - isHidden(menu: MenuId, commandId: string, defaultState: boolean): boolean { + isHidden(menu: MenuId, commandId: string, hiddenByDefault: boolean): boolean { const state = this._data[menu.id]?.includes(commandId) ?? false; - return defaultState ? state : !state; + return hiddenByDefault ? !state : state; } - updateHidden(menu: MenuId, commandId: string, hidden: boolean): void { + updateHidden(menu: MenuId, commandId: string, hidden: boolean, hiddenByDefault: boolean): void { const entries = this._data[menu.id]; - if (!hidden) { + if (hidden === hiddenByDefault) { // remove and cleanup if (entries) { const idx = entries.indexOf(commandId); @@ -226,7 +226,7 @@ class MenuInfo { for (const item of items) { if (this._contextKeyService.contextMatchesRules(item.when)) { const isMenuItem = isIMenuItem(item); - const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates); + const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates, isMenuItem ? item.isHiddenByDefault : undefined); if (isMenuItem) { // MenuItemAction activeActions.push(new MenuItemAction(item.command, item.alt, options, menuHide, this._contextKeyService, this._commandService)); @@ -397,23 +397,22 @@ class MenuImpl implements IMenu { } } -function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, states: PersistedMenuHideState): IMenuItemHide { +function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, states: PersistedMenuHideState, hiddenByDefault?: boolean): IMenuItemHide { const id = isISubmenuItem(command) ? command.submenu.id : command.id; const title = typeof command.title === 'string' ? command.title : command.title.value; - const defaultState = isISubmenuItem(command) ? true : !command.isHiddenByDefault; const hide = toAction({ id: `hide/${menu.id}/${id}`, label: localize('hide.label', 'Hide \'{0}\'', title), - run() { states.updateHidden(menu, id, true); } + run() { states.updateHidden(menu, id, true, !!hiddenByDefault); } }); const toggle = toAction({ id: `toggle/${menu.id}/${id}`, label: title, - get checked() { return !states.isHidden(menu, id, defaultState); }, - run() { states.updateHidden(menu, id, !this.checked); } + get checked() { return !states.isHidden(menu, id, !hiddenByDefault); }, + run() { states.updateHidden(menu, id, !this.checked, !!hiddenByDefault); } }); return { From 015020b5ff510109e1fed94dcc153b890fba3385 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 10 Jan 2023 09:43:51 +0100 Subject: [PATCH 2/3] encapsulate default hide logic into hide state object --- src/vs/platform/actions/common/menuService.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 451f219b015..43b90209e75 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -77,12 +77,25 @@ class PersistedMenuHideState { this._disposables.dispose(); } - isHidden(menu: MenuId, commandId: string, hiddenByDefault: boolean): boolean { + private _isHiddenByDefault(menu: MenuId, commandId: string) { + let hiddenByDefault = false; + for (const item of MenuRegistry.getMenuItems(menu)) { + if (isIMenuItem(item) && item.command.id === commandId) { + hiddenByDefault = Boolean(item.isHiddenByDefault); + break; + } + } + return hiddenByDefault; + } + + isHidden(menu: MenuId, commandId: string): boolean { + const hiddenByDefault = this._isHiddenByDefault(menu, commandId); const state = this._data[menu.id]?.includes(commandId) ?? false; return hiddenByDefault ? !state : state; } - updateHidden(menu: MenuId, commandId: string, hidden: boolean, hiddenByDefault: boolean): void { + updateHidden(menu: MenuId, commandId: string, hidden: boolean): void { + const hiddenByDefault = this._isHiddenByDefault(menu, commandId); const entries = this._data[menu.id]; if (hidden === hiddenByDefault) { // remove and cleanup @@ -226,7 +239,7 @@ class MenuInfo { for (const item of items) { if (this._contextKeyService.contextMatchesRules(item.when)) { const isMenuItem = isIMenuItem(item); - const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates, isMenuItem ? item.isHiddenByDefault : undefined); + const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates); if (isMenuItem) { // MenuItemAction activeActions.push(new MenuItemAction(item.command, item.alt, options, menuHide, this._contextKeyService, this._commandService)); @@ -397,7 +410,7 @@ class MenuImpl implements IMenu { } } -function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, states: PersistedMenuHideState, hiddenByDefault?: boolean): IMenuItemHide { +function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, states: PersistedMenuHideState): IMenuItemHide { const id = isISubmenuItem(command) ? command.submenu.id : command.id; const title = typeof command.title === 'string' ? command.title : command.title.value; @@ -405,14 +418,14 @@ function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, st const hide = toAction({ id: `hide/${menu.id}/${id}`, label: localize('hide.label', 'Hide \'{0}\'', title), - run() { states.updateHidden(menu, id, true, !!hiddenByDefault); } + run() { states.updateHidden(menu, id, true); } }); const toggle = toAction({ id: `toggle/${menu.id}/${id}`, label: title, - get checked() { return !states.isHidden(menu, id, !hiddenByDefault); }, - run() { states.updateHidden(menu, id, !this.checked, !!hiddenByDefault); } + get checked() { return !states.isHidden(menu, id); }, + run() { states.updateHidden(menu, id, !this.checked); } }); return { From e2ff4f3e94274b2f5d492edef4fc69055a8c010e Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 10 Jan 2023 09:52:59 +0100 Subject: [PATCH 3/3] fix bool condition --- src/vs/platform/actions/common/menuService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 43b90209e75..77d4405e31f 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -97,7 +97,7 @@ class PersistedMenuHideState { updateHidden(menu: MenuId, commandId: string, hidden: boolean): void { const hiddenByDefault = this._isHiddenByDefault(menu, commandId); const entries = this._data[menu.id]; - if (hidden === hiddenByDefault) { + if (hidden === !hiddenByDefault) { // remove and cleanup if (entries) { const idx = entries.indexOf(commandId);