Merge pull request #239945 from microsoft/tyriar/239939

Manage action item disposables in a map
This commit is contained in:
Daniel Imms
2025-02-07 06:11:21 -08:00
committed by GitHub

View File

@@ -35,7 +35,7 @@ import { renderLabelWithIcons } from '../../../../base/browser/ui/iconLabel/icon
import { getColorForSeverity } from './terminalStatusList.js';
import { getFlatContextMenuActions, MenuEntryActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js';
import { DropdownWithPrimaryActionViewItem } from '../../../../platform/actions/browser/dropdownWithPrimaryActionViewItem.js';
import { DisposableStore, dispose, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
import { DisposableMap, DisposableStore, dispose, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
import { URI } from '../../../../base/common/uri.js';
import { ColorScheme } from '../../../../platform/theme/common/theme.js';
import { getColorClass, getUriClasses } from './terminalIcon.js';
@@ -67,6 +67,7 @@ export class TerminalViewPane extends ViewPane {
private readonly _singleTabMenu: IMenu;
private _viewShowing: IContextKey<boolean>;
private readonly _disposableStore = this._register(new DisposableStore());
private readonly _actionDisposables: DisposableMap<TerminalCommandId> = this._register(new DisposableMap());
constructor(
options: IViewPaneOptions,
@@ -251,12 +252,12 @@ export class TerminalViewPane extends ViewPane {
}
override createActionViewItem(action: Action, options: IBaseActionViewItemOptions): IActionViewItem | undefined {
this._disposableStore.clear();
switch (action.id) {
case TerminalCommandId.Split: {
// Split needs to be special cased to force splitting within the panel, not the editor
const that = this;
const panelOnlySplitAction = new class extends Action {
const store = new DisposableStore();
const panelOnlySplitAction = store.add(new class extends Action {
constructor() {
super(action.id, action.label, action.class, action.enabled);
this.checked = action.checked;
@@ -270,17 +271,22 @@ export class TerminalViewPane extends ViewPane {
}
return;
}
};
this._disposableStore.add(panelOnlySplitAction);
return this._disposableStore.add(new ActionViewItem(action, panelOnlySplitAction, { ...options, icon: true, label: false, keybinding: this._getKeybindingLabel(action) }));
});
const item = store.add(new ActionViewItem(action, panelOnlySplitAction, { ...options, icon: true, label: false, keybinding: this._getKeybindingLabel(action) }));
this._actionDisposables.set(action.id, store);
return item;
}
case TerminalCommandId.SwitchTerminal: {
return this._disposableStore.add(this._instantiationService.createInstance(SwitchTerminalActionViewItem, action));
const item = this._instantiationService.createInstance(SwitchTerminalActionViewItem, action);
this._actionDisposables.set(action.id, item);
return item;
}
case TerminalCommandId.Focus: {
if (action instanceof MenuItemAction) {
const actions = getFlatContextMenuActions(this._singleTabMenu.getActions({ shouldForwardArgs: true }));
return this._instantiationService.createInstance(SingleTerminalTabActionViewItem, action, actions);
const item = this._instantiationService.createInstance(SingleTerminalTabActionViewItem, action, actions);
this._actionDisposables.set(action.id, item);
return item;
}
break;
}