support to hide/show submenus too

This commit is contained in:
Johannes 2022-09-19 13:46:12 +02:00
parent 3f92eb60d8
commit 70f629f997
No known key found for this signature in database
GPG key ID: 6DEF802A22264FCA
3 changed files with 15 additions and 15 deletions

View file

@ -11,7 +11,7 @@ import { BugIndicatingError } from 'vs/base/common/errors';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { localize } from 'vs/nls';
import { createAndFillInActionBarActions, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { IMenuActionOptions, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
import { IMenuActionOptions, IMenuService, MenuId, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions';
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
@ -102,7 +102,7 @@ export class WorkbenchToolBar extends ToolBar {
let shouldPrependSeparator = secondary.length > 0;
for (let i = 0; i < primary.length; i++) {
const action = primary[i];
if (!(action instanceof MenuItemAction)) {
if (!(action instanceof MenuItemAction) && !(action instanceof SubmenuItemAction)) {
// console.warn(`Action ${action.id}/${action.label} is not a MenuItemAction`);
continue;
}
@ -143,7 +143,7 @@ export class WorkbenchToolBar extends ToolBar {
// add "hide foo" actions
let hideAction: IAction;
if (action instanceof MenuItemAction && action.hideActions) {
if ((action instanceof MenuItemAction || action instanceof SubmenuItemAction) && action.hideActions) {
hideAction = action.hideActions.hide;
} else {
hideAction = toAction({

View file

@ -368,6 +368,7 @@ export class SubmenuItemAction extends SubmenuAction {
constructor(
readonly item: ISubmenuItem,
readonly hideActions: IMenuItemHide | undefined,
private readonly _menuService: IMenuService,
private readonly _contextKeyService: IContextKeyService,
private readonly _options?: IMenuActionOptions

View file

@ -6,7 +6,7 @@
import { RunOnceScheduler } from 'vs/base/common/async';
import { Emitter, Event } from 'vs/base/common/event';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { IMenu, IMenuActionOptions, IMenuCreateOptions, IMenuItem, IMenuItemHide, IMenuService, isIMenuItem, ISubmenuItem, MenuId, MenuItemAction, MenuRegistry, SubmenuItemAction } from 'vs/platform/actions/common/actions';
import { IMenu, IMenuActionOptions, IMenuCreateOptions, IMenuItem, IMenuItemHide, IMenuService, isIMenuItem, isISubmenuItem, ISubmenuItem, MenuId, MenuItemAction, MenuRegistry, SubmenuItemAction } from 'vs/platform/actions/common/actions';
import { ICommandAction, ILocalizedString } from 'vs/platform/action/common/action';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { ContextKeyExpression, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
@ -252,13 +252,12 @@ class Menu implements IMenu {
if (this._contextKeyService.contextMatchesRules(item.when)) {
let action: MenuItemAction | SubmenuItemAction | undefined;
const isMenuItem = isIMenuItem(item);
const menuHide = createMenuHide(this._id, isMenuItem ? item.command : item, this._hiddenStates);
if (isMenuItem) {
const menuHide = createMenuHide(this._id, item.command, this._hiddenStates);
action = new MenuItemAction(item.command, item.alt, options, menuHide, this._contextKeyService, this._commandService);
} else {
action = new SubmenuItemAction(item, this._menuService, this._contextKeyService, options);
action = new SubmenuItemAction(item, menuHide, this._menuService, this._contextKeyService, options);
if (action.actions.length === 0) {
action = undefined;
}
@ -338,24 +337,24 @@ class Menu implements IMenu {
}
}
function createMenuHide(menu: MenuId, command: ICommandAction, states: PersistedMenuHideState): IMenuItemHide {
function createMenuHide(menu: MenuId, command: ICommandAction | ISubmenuItem, states: PersistedMenuHideState): IMenuItemHide {
const id = `${menu.id}/${command.id}`;
const id = isISubmenuItem(command) ? command.submenu.id : command.id;
const title = typeof command.title === 'string' ? command.title : command.title.value;
const hide = toAction({
id,
id: `hide/${menu.id}/${id}`,
label: localize('hide.label', 'Hide \'{0}\'', title),
run() { states.updateHidden(menu, command.id, true); }
run() { states.updateHidden(menu, id, true); }
});
const toggle = toAction({
id,
id: `toggle/${menu.id}/${id}`,
label: title,
get checked() { return !states.isHidden(menu, command.id); },
get checked() { return !states.isHidden(menu, id); },
run() {
const newValue = !states.isHidden(menu, command.id);
states.updateHidden(menu, command.id, newValue);
const newValue = !states.isHidden(menu, id);
states.updateHidden(menu, id, newValue);
}
});