Merge pull request #209292 from microsoft/merogge/tab-action-bar

register `Action`s created in `getTerminalActionBarArgs`
This commit is contained in:
Megan Rogge 2024-04-01 14:34:35 -07:00 committed by GitHub
commit 2c3efed801
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 31 additions and 2 deletions

View file

@ -5,7 +5,7 @@
import * as dom from 'vs/base/browser/dom';
import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
import { IAction } from 'vs/base/common/actions';
import { Action, IAction } from 'vs/base/common/actions';
import { CancellationToken } from 'vs/base/common/cancellation';
import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem';
import { IMenu, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
@ -30,6 +30,7 @@ import { openContextMenu } from 'vs/workbench/contrib/terminal/browser/terminalC
import { ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService';
import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService';
import { IBaseActionViewItemOptions } from 'vs/base/browser/ui/actionbar/actionViewItems';
import { DisposableStore } from 'vs/base/common/lifecycle';
export class TerminalEditor extends EditorPane {
@ -46,6 +47,8 @@ export class TerminalEditor extends EditorPane {
private _cancelContextMenu: boolean = false;
private _disposableStore = this._register(new DisposableStore());
constructor(
group: IEditorGroup,
@ITelemetryService telemetryService: ITelemetryService,
@ -212,6 +215,7 @@ export class TerminalEditor extends EditorPane {
if (action instanceof MenuItemAction) {
const location = { viewColumn: ACTIVE_GROUP };
const actions = getTerminalActionBarArgs(location, this._terminalProfileService.availableProfiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu);
this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions);
const button = this._instantiationService.createInstance(DropdownWithPrimaryActionViewItem, action, actions.dropdownAction, actions.dropdownMenuActions, actions.className, this._contextMenuService, { hoverDelegate: options.hoverDelegate });
return button;
}
@ -220,6 +224,17 @@ export class TerminalEditor extends EditorPane {
return super.getActionViewItem(action, options);
}
/**
* Actions might be of type Action (disposable) or Separator or SubmenuAction, which don't extend Disposable
*/
private _registerDisposableActions(dropdownAction: IAction, dropdownMenuActions: IAction[]): void {
this._disposableStore.clear();
if (dropdownAction instanceof Action) {
this._disposableStore.add(dropdownAction);
}
dropdownMenuActions.filter(a => a instanceof Action).forEach(a => this._disposableStore.add(a));
}
private _getDefaultProfileName(): string {
let defaultProfileName;
try {

View file

@ -33,7 +33,7 @@ import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';
import { getColorForSeverity } from 'vs/workbench/contrib/terminal/browser/terminalStatusList';
import { createAndFillInContextMenuActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem';
import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { DisposableStore, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { ColorScheme } from 'vs/platform/theme/common/theme';
import { getColorClass, getUriClasses } from 'vs/workbench/contrib/terminal/browser/terminalIcon';
@ -58,6 +58,7 @@ export class TerminalViewPane extends ViewPane {
private readonly _dropdownMenu: IMenu;
private readonly _singleTabMenu: IMenu;
private _viewShowing: IContextKey<boolean>;
private _disposableStore = this._register(new DisposableStore());
constructor(
options: IViewPaneOptions,
@ -272,6 +273,7 @@ export class TerminalViewPane extends ViewPane {
case TerminalCommandId.New: {
if (action instanceof MenuItemAction) {
const actions = getTerminalActionBarArgs(TerminalLocation.Panel, this._terminalProfileService.availableProfiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu);
this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions);
this._newDropdown?.dispose();
this._newDropdown = new DropdownWithPrimaryActionViewItem(action, actions.dropdownAction, actions.dropdownMenuActions, actions.className, this._contextMenuService, { hoverDelegate: options.hoverDelegate }, this._keybindingService, this._notificationService, this._contextKeyService, this._themeService, this._accessibilityService);
this._updateTabActionBar(this._terminalProfileService.availableProfiles);
@ -282,6 +284,17 @@ export class TerminalViewPane extends ViewPane {
return super.getActionViewItem(action, options);
}
/**
* Actions might be of type Action (disposable) or Separator or SubmenuAction, which don't extend Disposable
*/
private _registerDisposableActions(dropdownAction: IAction, dropdownMenuActions: IAction[]): void {
this._disposableStore.clear();
if (dropdownAction instanceof Action) {
this._disposableStore.add(dropdownAction);
}
dropdownMenuActions.filter(a => a instanceof Action).forEach(a => this._disposableStore.add(a));
}
private _getDefaultProfileName(): string {
let defaultProfileName;
try {
@ -298,6 +311,7 @@ export class TerminalViewPane extends ViewPane {
private _updateTabActionBar(profiles: ITerminalProfile[]): void {
const actions = getTerminalActionBarArgs(TerminalLocation.Panel, profiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu);
this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions);
this._newDropdown?.update(actions.dropdownAction, actions.dropdownMenuActions);
}