提交 d7559c7b 编写于 作者: J Joao Moreno

🐛 don't fwd menu action args automatically

fixes #23162
上级 364e5efb
...@@ -234,6 +234,6 @@ export class ActionRunner extends EventEmitter implements IActionRunner { ...@@ -234,6 +234,6 @@ export class ActionRunner extends EventEmitter implements IActionRunner {
} }
protected runAction(action: IAction, context?: any): TPromise<any> { protected runAction(action: IAction, context?: any): TPromise<any> {
return TPromise.as(action.run(context)); return TPromise.as(context ? action.run(context) : action.run());
} }
} }
...@@ -126,7 +126,7 @@ export class ContextMenuController implements IEditorContribution { ...@@ -126,7 +126,7 @@ export class ContextMenuController implements IEditorContribution {
const result: IAction[] = []; const result: IAction[] = [];
let contextMenu = this._menuService.createMenu(MenuId.EditorContext, this._contextKeyService); let contextMenu = this._menuService.createMenu(MenuId.EditorContext, this._contextKeyService);
const groups = contextMenu.getActions(this._editor.getModel().uri); const groups = contextMenu.getActions({ arg: this._editor.getModel().uri });
contextMenu.dispose(); contextMenu.dispose();
for (let group of groups) { for (let group of groups) {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { IMenu, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IMenu, MenuItemAction, IMenuActionOptions } from 'vs/platform/actions/common/actions';
import { IMessageService } from 'vs/platform/message/common/message'; import { IMessageService } from 'vs/platform/message/common/message';
import Severity from 'vs/base/common/severity'; import Severity from 'vs/base/common/severity';
import { IAction } from 'vs/base/common/actions'; import { IAction } from 'vs/base/common/actions';
...@@ -17,8 +17,8 @@ import { domEvent } from 'vs/base/browser/event'; ...@@ -17,8 +17,8 @@ import { domEvent } from 'vs/base/browser/event';
import { Emitter } from 'vs/base/common/event'; import { Emitter } from 'vs/base/common/event';
export function fillInActions(menu: IMenu, context: any, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void { export function fillInActions(menu: IMenu, options: IMenuActionOptions, target: IAction[] | { primary: IAction[]; secondary: IAction[]; }, isPrimaryGroup: (group: string) => boolean = group => group === 'navigation'): void {
const groups = menu.getActions(context); const groups = menu.getActions(options);
if (groups.length === 0) { if (groups.length === 0) {
return; return;
} }
......
...@@ -60,9 +60,14 @@ export class MenuId { ...@@ -60,9 +60,14 @@ export class MenuId {
} }
} }
export interface IMenuActionOptions {
arg?: any;
shouldForwardArgs?: boolean;
}
export interface IMenu extends IDisposable { export interface IMenu extends IDisposable {
onDidChange: Event<IMenu>; onDidChange: Event<IMenu>;
getActions(arg?: any): [string, MenuItemAction[]][]; getActions(options?: IMenuActionOptions): [string, MenuItemAction[]][];
} }
export const IMenuService = createDecorator<IMenuService>('menuService'); export const IMenuService = createDecorator<IMenuService>('menuService');
...@@ -158,7 +163,7 @@ export class ExecuteCommandAction extends Action { ...@@ -158,7 +163,7 @@ export class ExecuteCommandAction extends Action {
export class MenuItemAction extends ExecuteCommandAction { export class MenuItemAction extends ExecuteCommandAction {
private _arg: any; private _options: IMenuActionOptions;
readonly item: ICommandAction; readonly item: ICommandAction;
readonly alt: MenuItemAction; readonly alt: MenuItemAction;
...@@ -166,24 +171,30 @@ export class MenuItemAction extends ExecuteCommandAction { ...@@ -166,24 +171,30 @@ export class MenuItemAction extends ExecuteCommandAction {
constructor( constructor(
item: ICommandAction, item: ICommandAction,
alt: ICommandAction, alt: ICommandAction,
arg: any, options: IMenuActionOptions,
@ICommandService commandService: ICommandService @ICommandService commandService: ICommandService
) { ) {
typeof item.title === 'string' ? super(item.id, item.title, commandService) : super(item.id, item.title.value, commandService); typeof item.title === 'string' ? super(item.id, item.title, commandService) : super(item.id, item.title.value, commandService);
this._cssClass = item.iconClass; this._cssClass = item.iconClass;
this._enabled = true; this._enabled = true;
this._arg = arg; this._options = options;
this.item = item; this.item = item;
this.alt = alt ? new MenuItemAction(alt, undefined, arg, commandService) : undefined; this.alt = alt ? new MenuItemAction(alt, undefined, this._options, commandService) : undefined;
} }
run(...args: any[]): TPromise<any> { run(...args: any[]): TPromise<any> {
if (this._arg) { let runArgs = [];
return super.run(this._arg, ...args);
} else { if (this._options.arg) {
return super.run(...args); runArgs = [...runArgs, this._options.arg];
} }
if (this._options.shouldForwardArgs) {
runArgs = [...runArgs, ...args];
}
return super.run(...runArgs);
} }
} }
......
...@@ -9,7 +9,7 @@ import Event, { Emitter } from 'vs/base/common/event'; ...@@ -9,7 +9,7 @@ import Event, { Emitter } from 'vs/base/common/event';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { MenuId, MenuRegistry, MenuItemAction, IMenu, IMenuItem } from 'vs/platform/actions/common/actions'; import { MenuId, MenuRegistry, MenuItemAction, IMenu, IMenuItem, IMenuActionOptions } from 'vs/platform/actions/common/actions';
import { ICommandService } from 'vs/platform/commands/common/commands'; import { ICommandService } from 'vs/platform/commands/common/commands';
type MenuItemGroup = [string, IMenuItem[]]; type MenuItemGroup = [string, IMenuItem[]];
...@@ -69,14 +69,14 @@ export class Menu implements IMenu { ...@@ -69,14 +69,14 @@ export class Menu implements IMenu {
return this._onDidChange.event; return this._onDidChange.event;
} }
getActions(arg?: any): [string, MenuItemAction[]][] { getActions(options: IMenuActionOptions): [string, MenuItemAction[]][] {
const result: [string, MenuItemAction[]][] = []; const result: [string, MenuItemAction[]][] = [];
for (let group of this._menuGroups) { for (let group of this._menuGroups) {
const [id, items] = group; const [id, items] = group;
const activeActions: MenuItemAction[] = []; const activeActions: MenuItemAction[] = [];
for (const item of items) { for (const item of items) {
if (this._contextKeyService.contextMatchesRules(item.when)) { if (this._contextKeyService.contextMatchesRules(item.when)) {
const action = new MenuItemAction(item.command, item.alt, arg, this._commandService); const action = new MenuItemAction(item.command, item.alt, options, this._commandService);
action.order = item.order; //TODO@Ben order is menu item property, not an action property action.order = item.order; //TODO@Ben order is menu item property, not an action property
activeActions.push(action); activeActions.push(action);
} }
......
...@@ -325,7 +325,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl ...@@ -325,7 +325,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl
const titleBarMenu = this.menuService.createMenu(MenuId.EditorTitle, scopedContextKeyService); const titleBarMenu = this.menuService.createMenu(MenuId.EditorTitle, scopedContextKeyService);
this.disposeOnEditorActions.push(titleBarMenu, titleBarMenu.onDidChange(_ => this.update())); this.disposeOnEditorActions.push(titleBarMenu, titleBarMenu.onDidChange(_ => this.update()));
fillInActions(titleBarMenu, this.resourceContext.get(), { primary, secondary }); fillInActions(titleBarMenu, { arg: this.resourceContext.get() }, { primary, secondary });
} }
return { primary, secondary }; return { primary, secondary };
...@@ -475,7 +475,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl ...@@ -475,7 +475,7 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl
} }
// Fill in contributed actions // Fill in contributed actions
fillInActions(this.contextMenu, this.resourceContext.get(), actions); fillInActions(this.contextMenu, { arg: this.resourceContext.get() }, actions);
return actions; return actions;
} }
......
...@@ -220,7 +220,7 @@ export class BaseDebugController extends DefaultController { ...@@ -220,7 +220,7 @@ export class BaseDebugController extends DefaultController {
this.contextMenuService.showContextMenu({ this.contextMenuService.showContextMenu({
getAnchor: () => anchor, getAnchor: () => anchor,
getActions: () => this.actionProvider.getSecondaryActions(tree, element).then(actions => { getActions: () => this.actionProvider.getSecondaryActions(tree, element).then(actions => {
fillInActions(this.contributedContextMenu, this.getContext(element), actions); fillInActions(this.contributedContextMenu, { arg: this.getContext(element) }, actions);
return actions; return actions;
}), }),
onHide: (wasCancelled?: boolean) => { onHide: (wasCancelled?: boolean) => {
......
...@@ -484,7 +484,7 @@ export class FileController extends DefaultController { ...@@ -484,7 +484,7 @@ export class FileController extends DefaultController {
getAnchor: () => anchor, getAnchor: () => anchor,
getActions: () => { getActions: () => {
return this.state.actionProvider.getSecondaryActions(tree, stat).then(actions => { return this.state.actionProvider.getSecondaryActions(tree, stat).then(actions => {
fillInActions(this.contributedContextMenu, stat.resource, actions); fillInActions(this.contributedContextMenu, { arg: stat.resource }, actions);
return actions; return actions;
}); });
}, },
......
...@@ -142,7 +142,7 @@ export class SCMMenus implements IDisposable { ...@@ -142,7 +142,7 @@ export class SCMMenus implements IDisposable {
const primary = []; const primary = [];
const secondary = []; const secondary = [];
const result = { primary, secondary }; const result = { primary, secondary };
fillInActions(menu, resource.uri, result, g => g === 'inline'); fillInActions(menu, { arg: resource.uri, shouldForwardArgs: true }, result, g => g === 'inline');
menu.dispose(); menu.dispose();
contextKeyService.dispose(); contextKeyService.dispose();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册