Skip to content

Commit fb3c407

Browse files
authored
feat: add AI settings search toggle (#249648)
1 parent abf1002 commit fb3c407

File tree

10 files changed

+328
-163
lines changed

10 files changed

+328
-163
lines changed

src/vs/base/browser/ui/toggle/toggle.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IKeyboardEvent } from '../../keyboardEvent.js';
7-
import { BaseActionViewItem, IActionViewItemOptions } from '../actionbar/actionViewItems.js';
8-
import { Widget } from '../widget.js';
96
import { IAction } from '../../../common/actions.js';
107
import { Codicon } from '../../../common/codicons.js';
11-
import { ThemeIcon } from '../../../common/themables.js';
128
import { Emitter, Event } from '../../../common/event.js';
139
import { KeyCode } from '../../../common/keyCodes.js';
14-
import './toggle.css';
15-
import { isActiveElement, $, addDisposableListener, EventType } from '../../dom.js';
16-
import { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';
17-
import { IHoverDelegate } from '../hover/hoverDelegate.js';
10+
import { ThemeIcon } from '../../../common/themables.js';
11+
import { $, addDisposableListener, EventType, isActiveElement } from '../../dom.js';
12+
import { IKeyboardEvent } from '../../keyboardEvent.js';
13+
import { BaseActionViewItem, IActionViewItemOptions } from '../actionbar/actionViewItems.js';
1814
import type { IManagedHover } from '../hover/hover.js';
15+
import { IHoverDelegate } from '../hover/hoverDelegate.js';
1916
import { getBaseLayerHoverDelegate } from '../hover/hoverDelegate2.js';
17+
import { getDefaultHoverDelegate } from '../hover/hoverDelegateFactory.js';
18+
import { Widget } from '../widget.js';
19+
import './toggle.css';
2020

2121
export interface IToggleOpts extends IToggleStyles {
2222
readonly actionClassName?: string;
@@ -65,20 +65,27 @@ export class ToggleActionViewItem extends BaseActionViewItem {
6565
inputActiveOptionForeground: options.toggleStyles?.inputActiveOptionForeground,
6666
hoverDelegate: options.hoverDelegate
6767
}));
68-
this._register(this.toggle.onChange(() => this._action.checked = !!this.toggle && this.toggle.checked));
68+
this._register(this.toggle.onChange(() => {
69+
this._action.checked = !!this.toggle && this.toggle.checked;
70+
}));
6971
}
7072

7173
override render(container: HTMLElement): void {
7274
this.element = container;
7375
this.element.appendChild(this.toggle.domNode);
76+
77+
this.updateChecked();
78+
this.updateEnabled();
7479
}
7580

7681
protected override updateEnabled(): void {
7782
if (this.toggle) {
7883
if (this.isEnabled()) {
7984
this.toggle.enable();
85+
this.element?.classList.remove('disabled');
8086
} else {
8187
this.toggle.disable();
88+
this.element?.classList.add('disabled');
8289
}
8390
}
8491
}
@@ -220,10 +227,12 @@ export class Toggle extends Widget {
220227

221228
enable(): void {
222229
this.domNode.setAttribute('aria-disabled', String(false));
230+
this.domNode.classList.remove('disabled');
223231
}
224232

225233
disable(): void {
226234
this.domNode.setAttribute('aria-disabled', String(true));
235+
this.domNode.classList.add('disabled');
227236
}
228237

229238
setTitle(newTitle: string): void {

src/vs/workbench/browser/workbench.contribution.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { Registry } from '../../platform/registry/common/platform.js';
7-
import { localize } from '../../nls.js';
8-
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from '../../platform/configuration/common/configurationRegistry.js';
9-
import { isMacintosh, isWindows, isLinux, isWeb, isNative } from '../../base/common/platform.js';
10-
import { ConfigurationMigrationWorkbenchContribution, DynamicWorkbenchSecurityConfiguration, IConfigurationMigrationRegistry, workbenchConfigurationNodeBase, Extensions, ConfigurationKeyValuePairs, problemsConfigurationNodeBase, windowConfigurationNodeBase, DynamicWindowConfiguration } from '../common/configuration.js';
116
import { isStandalone } from '../../base/browser/browser.js';
7+
import { isLinux, isMacintosh, isNative, isWeb, isWindows } from '../../base/common/platform.js';
8+
import { localize } from '../../nls.js';
9+
import { Extensions as ConfigurationExtensions, ConfigurationScope, IConfigurationRegistry } from '../../platform/configuration/common/configurationRegistry.js';
10+
import product from '../../platform/product/common/product.js';
11+
import { Registry } from '../../platform/registry/common/platform.js';
12+
import { ConfigurationKeyValuePairs, ConfigurationMigrationWorkbenchContribution, DynamicWindowConfiguration, DynamicWorkbenchSecurityConfiguration, Extensions, IConfigurationMigrationRegistry, problemsConfigurationNodeBase, windowConfigurationNodeBase, workbenchConfigurationNodeBase } from '../common/configuration.js';
1213
import { WorkbenchPhase, registerWorkbenchContribution2 } from '../common/contributions.js';
14+
import { CustomEditorLabelService } from '../services/editor/common/customEditorLabelService.js';
1315
import { ActivityBarPosition, EditorActionsLocation, EditorTabsMode, LayoutSettings } from '../services/layout/browser/layoutService.js';
1416
import { defaultWindowTitle, defaultWindowTitleSeparator } from './parts/titlebar/windowTitle.js';
15-
import { CustomEditorLabelService } from '../services/editor/common/customEditorLabelService.js';
1617

1718
const registry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);
1819

@@ -619,11 +620,11 @@ const registry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Con
619620
'default': 'ui',
620621
'scope': ConfigurationScope.WINDOW
621622
},
622-
'workbench.settings.showSuggestions': {
623+
'workbench.settings.showAISearchToggle': {
623624
'type': 'boolean',
624-
'default': false,
625-
'description': localize('settings.showSuggestions', "Controls whether setting suggestions are shown below the search bar in the Settings editor."),
626-
'tags': ['experimental']
625+
'default': product.quality !== 'stable',
626+
'description': localize('settings.showAISearchToggle', "Controls whether the AI search toggle is shown in the search bar in the Settings editor."),
627+
'tags': ['experimental', 'onExP']
627628
},
628629
'workbench.hover.delay': {
629630
'type': 'number',

src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
margin: 4px 0px;
4646
}
4747

48+
.settings-editor > .settings-header > .search-container.with-ai-toggle > .settings-count-widget {
49+
right: 65px;
50+
}
51+
4852
.settings-editor > .settings-header > .search-container > .settings-count-widget:empty {
4953
visibility: hidden;
5054
}
@@ -59,8 +63,14 @@
5963
width: 43px;
6064
}
6165

66+
.settings-editor > .settings-header > .search-container.with-ai-toggle > .settings-clear-widget {
67+
width: 62px;
68+
}
69+
6270
.settings-editor > .settings-header > .search-container > .settings-clear-widget .action-label {
6371
padding: 2px;
72+
margin-left: 0px;
73+
box-sizing: content-box;
6474
}
6575

6676
.settings-editor > .settings-header > .settings-header-controls {
@@ -255,10 +265,15 @@
255265
.settings-editor > .settings-body .settings-tree-container .monaco-list-row .mouseover .setting-toolbar-container > .monaco-toolbar .codicon,
256266
.settings-editor > .settings-body .settings-tree-container .monaco-list-row.focused .setting-item-contents .setting-toolbar-container > .monaco-toolbar .codicon,
257267
.settings-editor > .settings-body .settings-tree-container .monaco-list-row .setting-toolbar-container:hover > .monaco-toolbar .codicon,
258-
.settings-editor > .settings-body .settings-tree-container .monaco-list-row .setting-toolbar-container > .monaco-toolbar .active .codicon {
268+
.settings-editor > .settings-body .settings-tree-container .monaco-list-row .setting-toolbar-container > .monaco-toolbar .active .codicon,
269+
.settings-editor > .settings-header .search-container .settings-clear-widget .action-label {
259270
opacity: 1;
260271
}
261272

273+
.settings-editor > .settings-header .search-container .settings-clear-widget .monaco-custom-toggle.disabled {
274+
pointer-events: initial;
275+
}
276+
262277
.settings-editor > .settings-body .settings-tree-container .setting-toolbar-container > .monaco-toolbar .codicon {
263278
opacity: 0;
264279
display: flex;

src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,51 +8,52 @@ import { Disposable, DisposableStore, MutableDisposable } from '../../../../base
88
import { Schemas } from '../../../../base/common/network.js';
99
import { isBoolean, isObject, isString } from '../../../../base/common/types.js';
1010
import { URI } from '../../../../base/common/uri.js';
11+
import { ICodeEditor, isCodeEditor } from '../../../../editor/browser/editorBrowser.js';
1112
import { EditorContributionInstantiation, registerEditorContribution } from '../../../../editor/browser/editorExtensions.js';
1213
import { Context as SuggestContext } from '../../../../editor/contrib/suggest/browser/suggest.js';
1314
import * as nls from '../../../../nls.js';
15+
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
1416
import { Action2, MenuId, MenuRegistry, registerAction2 } from '../../../../platform/actions/common/actions.js';
1517
import { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';
18+
import { ConfigurationTarget } from '../../../../platform/configuration/common/configuration.js';
1619
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
1720
import { InputFocusedContext, IsMacNativeContext } from '../../../../platform/contextkey/common/contextkeys.js';
1821
import { SyncDescriptor } from '../../../../platform/instantiation/common/descriptors.js';
1922
import { IInstantiationService, ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
20-
import { KeybindingsRegistry, KeybindingWeight } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
23+
import { KeybindingWeight, KeybindingsRegistry } from '../../../../platform/keybinding/common/keybindingsRegistry.js';
2124
import { ILabelService } from '../../../../platform/label/common/label.js';
25+
import { IListService } from '../../../../platform/list/browser/listService.js';
2226
import { Registry } from '../../../../platform/registry/common/platform.js';
27+
import { IUserDataProfilesService } from '../../../../platform/userDataProfile/common/userDataProfile.js';
2328
import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from '../../../../platform/workspace/common/workspace.js';
2429
import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from '../../../browser/actions/workspaceCommands.js';
2530
import { EditorPaneDescriptor, IEditorPaneRegistry } from '../../../browser/editor.js';
31+
import { resolveCommandsContext } from '../../../browser/parts/editor/editorCommandsContext.js';
32+
import { RemoteNameContext, ResourceContextKey, WorkbenchStateContext } from '../../../common/contextkeys.js';
2633
import { IWorkbenchContribution, WorkbenchPhase, registerWorkbenchContribution2 } from '../../../common/contributions.js';
2734
import { EditorExtensions, IEditorFactoryRegistry, IEditorSerializer } from '../../../common/editor.js';
2835
import { EditorInput } from '../../../common/editor/editorInput.js';
29-
import { ResourceContextKey, RemoteNameContext, WorkbenchStateContext } from '../../../common/contextkeys.js';
30-
import { ExplorerFolderContext, ExplorerRootContext } from '../../files/common/files.js';
31-
import { KeybindingsEditor } from './keybindingsEditor.js';
32-
import { ConfigureLanguageBasedSettingsAction } from './preferencesActions.js';
33-
import { preferencesOpenSettingsIcon } from './preferencesIcons.js';
34-
import { SettingsEditor2, SettingsFocusContext } from './settingsEditor2.js';
35-
import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, CONTEXT_WHEN_FOCUS, KEYBINDINGS_EDITOR_COMMAND_ACCEPT_WHEN, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_HISTORY, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REJECT_WHEN, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_EXTENSION_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from '../common/preferences.js';
36-
import { PreferencesContribution } from '../common/preferencesContribution.js';
36+
import { IEditorGroup, IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';
3737
import { IEditorService } from '../../../services/editor/common/editorService.js';
3838
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
3939
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
4040
import { KeybindingsEditorInput } from '../../../services/preferences/browser/keybindingsEditorInput.js';
4141
import { DEFINE_KEYBINDING_EDITOR_CONTRIB_ID, IDefineKeybindingEditorContribution, IPreferencesService } from '../../../services/preferences/common/preferences.js';
4242
import { PreferencesEditorInput, SettingsEditor2Input } from '../../../services/preferences/common/preferencesEditorInput.js';
43-
import { IUserDataProfileService, CURRENT_PROFILE_CONTEXT } from '../../../services/userDataProfile/common/userDataProfile.js';
44-
import { IUserDataProfilesService } from '../../../../platform/userDataProfile/common/userDataProfile.js';
45-
import { ICodeEditor, isCodeEditor } from '../../../../editor/browser/editorBrowser.js';
46-
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
47-
import { resolveCommandsContext } from '../../../browser/parts/editor/editorCommandsContext.js';
48-
import { IEditorGroup, IEditorGroupsService } from '../../../services/editor/common/editorGroupsService.js';
49-
import { IListService } from '../../../../platform/list/browser/listService.js';
5043
import { SettingsEditorModel } from '../../../services/preferences/common/preferencesModels.js';
51-
import { IPreferencesRenderer, WorkspaceSettingsRenderer, UserSettingsRenderer } from './preferencesRenderers.js';
52-
import { ConfigurationTarget } from '../../../../platform/configuration/common/configuration.js';
44+
import { CURRENT_PROFILE_CONTEXT, IUserDataProfileService } from '../../../services/userDataProfile/common/userDataProfile.js';
45+
import { ExplorerFolderContext, ExplorerRootContext } from '../../files/common/files.js';
46+
import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_ROW_FOCUS, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, CONTEXT_WHEN_FOCUS, KEYBINDINGS_EDITOR_COMMAND_ACCEPT_WHEN, KEYBINDINGS_EDITOR_COMMAND_ADD, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_HISTORY, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND_TITLE, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REJECT_WHEN, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_EXTENSION_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, REQUIRE_TRUSTED_WORKSPACE_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from '../common/preferences.js';
47+
import { PreferencesContribution } from '../common/preferencesContribution.js';
48+
import { KeybindingsEditor } from './keybindingsEditor.js';
49+
import { ConfigureLanguageBasedSettingsAction } from './preferencesActions.js';
5350
import { PreferencesEditor } from './preferencesEditor.js';
51+
import { preferencesOpenSettingsIcon } from './preferencesIcons.js';
52+
import { IPreferencesRenderer, UserSettingsRenderer, WorkspaceSettingsRenderer } from './preferencesRenderers.js';
53+
import { SettingsEditor2, SettingsFocusContext } from './settingsEditor2.js';
5454

5555
const SETTINGS_EDITOR_COMMAND_SEARCH = 'settings.action.search';
56+
const SETTINGS_EDITOR_COMMAND_TOGGLE_AI_SEARCH = 'settings.action.toggleAiSearch';
5657

5758
const SETTINGS_EDITOR_COMMAND_FOCUS_FILE = 'settings.action.focusSettingsFile';
5859
const SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH = 'settings.action.focusSettingsFromSearch';
@@ -489,7 +490,28 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon
489490
}
490491
}
491492
}));
492-
493+
this._register(registerAction2(class extends Action2 {
494+
constructor() {
495+
super({
496+
id: SETTINGS_EDITOR_COMMAND_TOGGLE_AI_SEARCH,
497+
precondition: CONTEXT_SETTINGS_EDITOR,
498+
keybinding: {
499+
primary: KeyMod.CtrlCmd | KeyCode.KeyI,
500+
weight: KeybindingWeight.EditorContrib,
501+
when: null
502+
},
503+
category,
504+
f1: true,
505+
title: nls.localize2('settings.toggleAiSearch', "Toggle AI Settings Search")
506+
});
507+
}
508+
run(accessor: ServicesAccessor) {
509+
const editorPane = accessor.get(IEditorService).activeEditorPane;
510+
if (editorPane instanceof SettingsEditor2) {
511+
editorPane.toggleAiSearch();
512+
}
513+
}
514+
}));
493515
this._register(registerAction2(class extends Action2 {
494516
constructor() {
495517
super({

src/vs/workbench/contrib/preferences/browser/preferencesIcons.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ export const settingsRemoveIcon = registerIcon('settings-remove', Codicon.close,
2525
export const settingsDiscardIcon = registerIcon('settings-discard', Codicon.discard, localize('preferencesDiscardIcon', 'Icon for the discard action in the Settings UI.'));
2626

2727
export const preferencesClearInputIcon = registerIcon('preferences-clear-input', Codicon.clearAll, localize('preferencesClearInput', 'Icon for clear input in the Settings and keybinding UI.'));
28+
export const preferencesAiResultsIcon = registerIcon('preferences-ai-results', Codicon.sparkle, localize('preferencesAiResults', 'Icon for showing AI results in the Settings UI.'));
2829
export const preferencesFilterIcon = registerIcon('preferences-filter', Codicon.filter, localize('settingsFilter', 'Icon for the button that suggests filters for the Settings UI.'));
2930
export const preferencesOpenSettingsIcon = registerIcon('preferences-open-settings', Codicon.goToFile, localize('preferencesOpenSettings', 'Icon for open settings commands.'));

0 commit comments

Comments
 (0)