widget per terminal

This commit is contained in:
meganrogge
2024-02-09 11:46:48 -06:00
parent eedd668787
commit 0d202eff3d
2 changed files with 31 additions and 8 deletions
@@ -11,7 +11,7 @@ import { localize2 } from 'vs/nls';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { IDetachedTerminalInstance, ITerminalContribution, ITerminalInstance, ITerminalService, IXtermTerminal } from 'vs/workbench/contrib/terminal/browser/terminal';
import { IDetachedTerminalInstance, ITerminalContribution, ITerminalInstance, ITerminalService, IXtermTerminal, isDetachedTerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal';
import { registerActiveXtermAction } from 'vs/workbench/contrib/terminal/browser/terminalActions';
import { registerTerminalContribution } from 'vs/workbench/contrib/terminal/browser/terminalExtensions';
import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager';
@@ -30,7 +30,11 @@ export class TerminalChatContribution extends Disposable implements ITerminalCon
static get(instance: ITerminalInstance | IDetachedTerminalInstance): TerminalChatContribution | null {
return instance.getContribution<TerminalChatContribution>(TerminalChatContribution.ID);
}
/**
* Currently focused chat widget. This is used to track action context since
* 'active terminals' are only tracked for non-detached terminal instanecs.
*/
static activeChatWidget?: TerminalChatContribution;
private _chatWidget: Lazy<TerminalChatWidget> | undefined;
private _lastLayoutDimensions: IDimension | undefined;
@@ -42,7 +46,7 @@ export class TerminalChatContribution extends Disposable implements ITerminalCon
widgetManager: TerminalWidgetManager,
@IInstantiationService private readonly _instantiationService: IInstantiationService,
@IConfigurationService private _configurationService: IConfigurationService,
@ITerminalService terminalService: ITerminalService
@ITerminalService private readonly _terminalService: ITerminalService
) {
super();
if (!this._configurationService.getValue(TerminalSettingId.ExperimentalInlineChat)) {
@@ -64,7 +68,16 @@ export class TerminalChatContribution extends Disposable implements ITerminalCon
}
this._chatWidget = new Lazy(() => {
const chatWidget = this._instantiationService.createInstance(TerminalChatWidget, this._instance.domElement!, this._instance);
chatWidget.focusTracker.onDidFocus(() => {
TerminalChatContribution.activeChatWidget = this;
if (!isDetachedTerminalInstance(this._instance)) {
this._terminalService.setActiveInstance(this._instance);
}
});
chatWidget.focusTracker.onDidBlur(() => {
TerminalChatContribution.activeChatWidget = undefined;
this._instance.resetScrollbarVisibility();
});
if (!this._instance.domElement) {
throw new Error('FindWidget expected terminal DOM to be initialized');
}
@@ -99,7 +112,8 @@ registerActiveXtermAction({
ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated),
),
run: (_xterm, _accessor, activeInstance) => {
TerminalChatContribution.get(activeInstance)?.chatWidget?.reveal();
const contr = TerminalChatContribution.activeChatWidget || TerminalChatContribution.get(activeInstance);
contr?.chatWidget?.reveal();
}
});
@@ -118,7 +132,8 @@ registerActiveXtermAction({
ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated),
),
run: (_xterm, _accessor, activeInstance) => {
TerminalChatContribution.get(activeInstance)?.chatWidget?.hide();
const contr = TerminalChatContribution.activeChatWidget || TerminalChatContribution.get(activeInstance);
contr?.chatWidget?.hide();
}
});
@@ -137,7 +152,8 @@ registerActiveXtermAction({
group: 'navigation',
},
run: (_xterm, _accessor, activeInstance) => {
TerminalChatContribution.get(activeInstance)?.chatWidget?.acceptInput();
const contr = TerminalChatContribution.activeChatWidget || TerminalChatContribution.get(activeInstance);
contr?.chatWidget?.acceptInput();
}
});
@@ -154,6 +170,7 @@ registerActiveXtermAction({
group: 'navigation',
},
run: (_xterm, _accessor, activeInstance) => {
TerminalChatContribution.get(activeInstance)?.chatWidget?.cancel();
const contr = TerminalChatContribution.activeChatWidget || TerminalChatContribution.get(activeInstance);
contr?.chatWidget?.cancel();
}
});
@@ -3,6 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IFocusTracker, trackFocus } from 'vs/base/browser/dom';
import { Disposable } from 'vs/base/common/lifecycle';
import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
@@ -18,6 +19,7 @@ export class TerminalChatWidget extends Disposable {
private _widgetContainer: HTMLElement;
private _chatWidgetFocused: IContextKey<boolean>;
private _chatWidgetVisible: IContextKey<boolean>;
private readonly _focusTracker: IFocusTracker;
constructor(
private readonly _container: HTMLElement,
private readonly _instance: ITerminalInstance | IDetachedTerminalInstance,
@@ -44,6 +46,7 @@ export class TerminalChatWidget extends Disposable {
}));
this._widget.render(this._widgetContainer);
this._register(this._widget.onDidFocus(() => this._chatWidgetFocused.set(true)));
this._focusTracker = this._register(trackFocus(this._widgetContainer));
}
reveal(): void {
this._widgetContainer.classList.remove('hide');
@@ -70,4 +73,7 @@ export class TerminalChatWidget extends Disposable {
layout(width: number): void {
this._widget?.layout(100, width < 300 ? 300 : width);
}
public get focusTracker(): IFocusTracker {
return this._focusTracker;
}
}