Skip to content

Commit b1ed56f

Browse files
committed
use button bar for accept, discard, and regen
1 parent e4cad50 commit b1ed56f

File tree

4 files changed

+87
-21
lines changed

4 files changed

+87
-21
lines changed

src/vs/workbench/contrib/inlineChat/browser/inlineChat.css

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
padding-left: 10px;
135135
padding-right: 4px;
136136
margin-left: auto;
137+
align-self: center;
137138
}
138139

139140
.monaco-editor .inline-chat .markdownMessage {
@@ -183,28 +184,32 @@
183184
color: var(--vscode-editorWarning-foreground);
184185
}
185186

187+
.monaco-editor .inline-chat .status .actions {
188+
display: flex;
189+
}
190+
191+
.monaco-editor .inline-chat .status .actions > .monaco-button,
192+
.monaco-editor .inline-chat .status .actions > .monaco-button-dropdown {
193+
margin-right: 6px;
194+
}
195+
196+
.monaco-editor .inline-chat .status .actions > .monaco-button-dropdown > .monaco-dropdown-button {
197+
display: flex;
198+
align-items: center;
199+
padding: 0 4px;
200+
}
201+
186202
.monaco-editor .inline-chat .status .monaco-toolbar .action-item {
187203
padding: 0 2px;
188204
}
189205

206+
/* TODO@jrieken not needed? */
190207
.monaco-editor .inline-chat .status .monaco-toolbar .action-label.checked {
191208
color: var(--vscode-inputOption-activeForeground);
192209
background-color: var(--vscode-inputOption-activeBackground);
193210
outline: 1px solid var(--vscode-inputOption-activeBorder);
194211
}
195212

196-
.monaco-editor .inline-chat .status .monaco-toolbar .action-item.button-item .action-label {
197-
color: var(--vscode-button-foreground);
198-
background-color: var(--vscode-button-background);
199-
border-radius: 2px;
200-
padding: 4px 6px;
201-
line-height: 18px;
202-
}
203-
204-
.monaco-editor .inline-chat .status .monaco-toolbar .action-item.button-item .action-label>.codicon {
205-
color: unset;
206-
font-size: 14px;
207-
}
208213

209214
/* preview */
210215

src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { EditorAction2 } from 'vs/editor/browser/editorExtensions';
1010
import { EmbeddedCodeEditorWidget, EmbeddedDiffEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget';
1111
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
1212
import { InlineChatController, InlineChatRunOptions } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController';
13-
import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_ACTIVE_REQUEST, CTX_INLINE_CHAT_HAS_PROVIDER, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_EMPTY, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_VISIBLE, MENU_INLINE_CHAT_WIDGET, MENU_INLINE_CHAT_WIDGET_DISCARD, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_LAST_FEEDBACK, CTX_INLINE_CHAT_SHOWING_DIFF, CTX_INLINE_CHAT_EDIT_MODE, EditMode, CTX_INLINE_CHAT_LAST_RESPONSE_TYPE, MENU_INLINE_CHAT_WIDGET_MARKDOWN_MESSAGE, CTX_INLINE_CHAT_MESSAGE_CROP_STATE, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_DID_EDIT, CTX_INLINE_CHAT_HAS_STASHED_SESSION, MENU_INLINE_CHAT_WIDGET_FEEDBACK, ACTION_ACCEPT_CHANGES } from 'vs/workbench/contrib/inlineChat/common/inlineChat';
13+
import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_HAS_ACTIVE_REQUEST, CTX_INLINE_CHAT_HAS_PROVIDER, CTX_INLINE_CHAT_INNER_CURSOR_FIRST, CTX_INLINE_CHAT_INNER_CURSOR_LAST, CTX_INLINE_CHAT_EMPTY, CTX_INLINE_CHAT_OUTER_CURSOR_POSITION, CTX_INLINE_CHAT_VISIBLE, MENU_INLINE_CHAT_WIDGET, MENU_INLINE_CHAT_WIDGET_DISCARD, MENU_INLINE_CHAT_WIDGET_STATUS, CTX_INLINE_CHAT_LAST_FEEDBACK, CTX_INLINE_CHAT_SHOWING_DIFF, CTX_INLINE_CHAT_EDIT_MODE, EditMode, CTX_INLINE_CHAT_LAST_RESPONSE_TYPE, MENU_INLINE_CHAT_WIDGET_MARKDOWN_MESSAGE, CTX_INLINE_CHAT_MESSAGE_CROP_STATE, CTX_INLINE_CHAT_DOCUMENT_CHANGED, CTX_INLINE_CHAT_DID_EDIT, CTX_INLINE_CHAT_HAS_STASHED_SESSION, MENU_INLINE_CHAT_WIDGET_FEEDBACK, ACTION_ACCEPT_CHANGES, ACTION_REGENERATE_RESPONSE } from 'vs/workbench/contrib/inlineChat/common/inlineChat';
1414
import { localize } from 'vs/nls';
1515
import { IAction2Options, MenuRegistry } from 'vs/platform/actions/common/actions';
1616
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
@@ -163,14 +163,15 @@ export class ReRunRequestAction extends AbstractInlineChatAction {
163163

164164
constructor() {
165165
super({
166-
id: 'inlineChat.regenerate',
166+
id: ACTION_REGENERATE_RESPONSE,
167167
title: localize('rerun', 'Regenerate Response'),
168+
shortTitle: localize('rerunShort', 'Regenerate'),
168169
icon: Codicon.refresh,
169170
precondition: ContextKeyExpr.and(CTX_INLINE_CHAT_VISIBLE, CTX_INLINE_CHAT_EMPTY.negate(), CTX_INLINE_CHAT_LAST_RESPONSE_TYPE),
170171
menu: {
171172
id: MENU_INLINE_CHAT_WIDGET_STATUS,
172-
group: '0_main',
173-
order: 1,
173+
group: '2_feedback',
174+
order: 3,
174175
}
175176
});
176177
}

src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import { invertLineRange, lineRangeAsRange } from 'vs/workbench/contrib/inlineCh
4444
import { ICodeEditorViewState, ScrollType } from 'vs/editor/common/editorCommon';
4545
import { LineRange } from 'vs/editor/common/core/lineRange';
4646
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
47-
import { MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions';
47+
import { IMenuService, MenuItemAction, SubmenuItemAction } from 'vs/platform/actions/common/actions';
4848
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
4949
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
5050
import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
@@ -53,6 +53,9 @@ import { renderLabelWithIcons } from 'vs/base/browser/ui/iconLabel/iconLabels';
5353
import { ExpansionState } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession';
5454
import { IdleValue } from 'vs/base/common/async';
5555
import * as aria from 'vs/base/browser/ui/aria/aria';
56+
import { ButtonBar, IButton } from 'vs/base/browser/ui/button/button';
57+
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
58+
import { onUnexpectedError } from 'vs/base/common/errors';
5659

5760
const defaultAriaLabel = localize('aria-label', "Inline Chat Input");
5861

@@ -193,7 +196,9 @@ export class InlineChatWidget {
193196
@IKeybindingService private readonly _keybindingService: IKeybindingService,
194197
@IInstantiationService private readonly _instantiationService: IInstantiationService,
195198
@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,
196-
@IConfigurationService private readonly _configurationService: IConfigurationService
199+
@IConfigurationService private readonly _configurationService: IConfigurationService,
200+
@IMenuService private readonly _menuService: IMenuService,
201+
@IContextMenuService private readonly _contextMenuService: IContextMenuService,
197202
) {
198203

199204
// input editor logic
@@ -333,9 +338,63 @@ export class InlineChatWidget {
333338
return createActionViewItem(this._instantiationService, action, options);
334339
}
335340
};
336-
const statusToolbar = this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.statusToolbar, MENU_INLINE_CHAT_WIDGET_STATUS, { ...workbenchToolbarOptions, hiddenItemStrategy: HiddenItemStrategy.Ignore });
337-
this._store.add(statusToolbar.onDidChangeMenuItems(() => this._onDidChangeHeight.fire()));
338-
this._store.add(statusToolbar);
341+
// const statusToolbar = this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.statusToolbar, MENU_INLINE_CHAT_WIDGET_STATUS, { ...workbenchToolbarOptions, hiddenItemStrategy: HiddenItemStrategy.Ignore });
342+
// this._store.add(statusToolbar.onDidChangeMenuItems(() => this._onDidChangeHeight.fire()));
343+
// this._store.add(statusToolbar);
344+
345+
// TODO@jrieken extract this as re-usable MenuButtonBar similar to MenuWorkbenchToolBar
346+
// add telemetry for workbench actions....
347+
//
348+
const menu = this._menuService.createMenu(MENU_INLINE_CHAT_WIDGET_STATUS, this._contextKeyService);
349+
const buttonBar = new ButtonBar(this._elements.statusToolbar);
350+
this._store.add(menu);
351+
this._store.add(buttonBar);
352+
353+
const populateButtonBarFromMenu = () => {
354+
355+
buttonBar.clear();
356+
357+
const actions = menu
358+
.getActions({ renderShortTitle: true })
359+
.flatMap(entry => entry[1]);
360+
361+
for (let i = 0; i < actions.length; i++) {
362+
const action = actions[i];
363+
let btnAction: IAction;
364+
let btn: IButton;
365+
366+
if (action instanceof SubmenuItemAction && action.actions.length > 0) {
367+
const [first, ...rest] = action.actions;
368+
btnAction = first;
369+
btn = buttonBar.addButtonWithDropdown({
370+
secondary: i > 0,
371+
actions: rest,
372+
contextMenuProvider: this._contextMenuService
373+
});
374+
} else {
375+
btnAction = action;
376+
btn = buttonBar.addButton({ secondary: i > 0 });
377+
}
378+
379+
btn.label = btnAction.label;
380+
btn.enabled = btnAction.enabled;
381+
const kb = _keybindingService.lookupKeybinding(btnAction.id);
382+
if (kb) {
383+
btn.element.title = localize('labelWithKeybinding', "{0} ({1})", btnAction.label, kb.getLabel());
384+
}
385+
btn.onDidClick(async () => {
386+
try {
387+
await btnAction.run();
388+
} catch (error) {
389+
onUnexpectedError(error);
390+
}
391+
});
392+
}
393+
};
394+
395+
populateButtonBarFromMenu();
396+
this._store.add(menu.onDidChange(populateButtonBarFromMenu));
397+
339398

340399
const feedbackToolbar = this._instantiationService.createInstance(MenuWorkbenchToolBar, this._elements.feedbackToolbar, MENU_INLINE_CHAT_WIDGET_FEEDBACK, { ...workbenchToolbarOptions, hiddenItemStrategy: HiddenItemStrategy.Ignore });
341400
this._store.add(feedbackToolbar.onDidChangeMenuItems(() => this._onDidChangeHeight.fire()));

src/vs/workbench/contrib/inlineChat/common/inlineChat.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ export const CTX_INLINE_CHAT_EDIT_MODE = new RawContextKey<EditMode>('config.inl
122122
// --- (select) action identifier
123123

124124
export const ACTION_ACCEPT_CHANGES = 'interactive.acceptChanges';
125+
export const ACTION_REGENERATE_RESPONSE = 'inlineChat.regenerate';
125126

126127
// --- menus
127128

0 commit comments

Comments
 (0)