mirror of
https://github.com/microsoft/vscode.git
synced 2026-08-14 17:54:53 +01:00
widget per terminal
This commit is contained in:
+25
-8
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user