From 0ea57dc64fe229cf504bbc61583aad8e4426c8bc Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 7 Nov 2018 17:51:36 -0800 Subject: [PATCH] #61590 - show settings editor actions in editor toolbar instead of private ... menu --- .../preferences/browser/preferencesActions.ts | 2 +- .../preferences/browser/settingsTreeModels.ts | 4 +- .../parts/preferences/common/preferences.ts | 5 ++ .../media/edit-json-inverse.svg | 3 + .../electron-browser/media/edit-json.svg | 3 + .../preferences.contribution.ts | 52 ++++++++++++++- .../electron-browser/settingsEditor2.ts | 63 +++---------------- .../test/browser/settingsTreeModels.test.ts | 4 +- 8 files changed, 75 insertions(+), 61 deletions(-) create mode 100644 src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg create mode 100644 src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg diff --git a/src/vs/workbench/parts/preferences/browser/preferencesActions.ts b/src/vs/workbench/parts/preferences/browser/preferencesActions.ts index 7386406e30f..660f311f5dd 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesActions.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesActions.ts @@ -6,6 +6,7 @@ import { Action } from 'vs/base/common/actions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; +import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import * as nls from 'vs/nls'; @@ -13,7 +14,6 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; -import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; export class OpenRawDefaultSettingsAction extends Action { diff --git a/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts index c48c4e88020..25b42b9ea63 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts @@ -12,8 +12,8 @@ import { ConfigurationScope } from 'vs/platform/configuration/common/configurati import { SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { ITOCEntry, knownAcronyms } from 'vs/workbench/parts/preferences/browser/settingsLayout'; import { IExtensionSetting, ISearchResult, ISetting, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; +import { MODIFIED_SETTING_TAG } from 'vs/workbench/parts/preferences/common/preferences'; -export const MODIFIED_SETTING_TAG = 'modified'; export const ONLINE_SERVICES_SETTING_TAG = 'usesOnlineServices'; export interface ISettingsEditorViewState { @@ -523,7 +523,7 @@ export interface IParsedQuery { } const tagRegex = /(^|\s)@tag:("([^"]*)"|[^"]\S*)/g; -export function parseQuery(query: string): IParsedQuery { +export function getQueryWithoutTags(query: string): IParsedQuery { const tags: string[] = []; query = query.replace(tagRegex, (_, __, quotedTag, tag) => { tags.push(tag || quotedTag); diff --git a/src/vs/workbench/parts/preferences/common/preferences.ts b/src/vs/workbench/parts/preferences/common/preferences.ts index dc91043baf2..7d8e2c1dc76 100644 --- a/src/vs/workbench/parts/preferences/common/preferences.ts +++ b/src/vs/workbench/parts/preferences/common/preferences.ts @@ -79,6 +79,9 @@ export const SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH = 'settings.acti export const SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST = 'settings.action.focusSettingsList'; export const SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU = 'settings.action.showContextMenu'; +export const SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED = 'settings.filterByModified'; +export const SETTINGS_EDITOR_COMMAND_FILTER_ONLINE = 'settings.filterByOnline'; + export const KEYBINDINGS_EDITOR_COMMAND_SEARCH = 'keybindings.editor.searchKeybindings'; export const KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS = 'keybindings.editor.clearSearchResults'; export const KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS = 'keybindings.editor.recordSearchKeys'; @@ -96,3 +99,5 @@ export const KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS = 'keybindings.editor.show export const FOLDER_SETTINGS_PATH = join('.vscode', 'settings.json'); export const DEFAULT_SETTINGS_EDITOR_SETTING = 'workbench.settings.openDefaultSettings'; + +export const MODIFIED_SETTING_TAG = 'modified'; \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg b/src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg new file mode 100644 index 00000000000..6dc96a9e122 --- /dev/null +++ b/src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg b/src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg new file mode 100644 index 00000000000..747e2706bc0 --- /dev/null +++ b/src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts index 399004504fc..78c7429dab8 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts @@ -23,7 +23,7 @@ import { IKeybindingsEditor, IPreferencesSearchService, CONTEXT_KEYBINDING_FOCUS, CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_SEARCH, CONTEXT_SETTINGS_EDITOR, SETTINGS_EDITOR_COMMAND_FOCUS_FILE, CONTEXT_SETTINGS_SEARCH_FOCUS, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING, SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH, CONTEXT_TOC_ROW_FOCUS, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST, - SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS + SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED, SETTINGS_EDITOR_COMMAND_FILTER_ONLINE } from 'vs/workbench/parts/preferences/common/preferences'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; @@ -566,6 +566,20 @@ const showContextMenuCommand = new ShowContextMenuCommand({ }); showContextMenuCommand.register(); +CommandsRegistry.registerCommand(SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED, serviceAccessor => { + const control = serviceAccessor.get(IEditorService).activeControl as SettingsEditor2; + if (control instanceof SettingsEditor2) { + control.focusSearch(`@${MODIFIED_SETTING_TAG}`); + } +}); + +CommandsRegistry.registerCommand(SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, serviceAccessor => { + const control = serviceAccessor.get(IEditorService).activeControl as SettingsEditor2; + if (control instanceof SettingsEditor2) { + control.focusSearch(`@tag:usesOnlineServices`); + } +}); + // Preferences menu MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { @@ -585,3 +599,39 @@ MenuRegistry.appendMenuItem(MenuId.MenubarPreferencesMenu, { }, order: 1 }); + +// Editor tool items + +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { + command: { + id: OpenSettingsJsonAction.ID, + title: OpenSettingsJsonAction.LABEL, + iconLocation: { + dark: URI.parse(require.toUrl('vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg')), + light: URI.parse(require.toUrl('vs/workbench/parts/preferences/electron-browser/media/edit-json.svg')) + } + }, + group: 'navigation', + order: 1, + when: CONTEXT_SETTINGS_EDITOR +}); + +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { + command: { + id: SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED, + title: nls.localize('filterModifiedLabel', "Show modified settings") + }, + group: '1_filter', + order: 1, + when: CONTEXT_SETTINGS_EDITOR +}); + +MenuRegistry.appendMenuItem(MenuId.EditorTitle, { + command: { + id: SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, + title: nls.localize('filterOnlineServicesLabel', "Show settings for online services"), + }, + group: '1_filter', + order: 2, + when: CONTEXT_SETTINGS_EDITOR +}); diff --git a/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts index 24041d0f836..c18ea29f009 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts @@ -4,24 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; -import { Action } from 'vs/base/common/actions'; import * as arrays from 'vs/base/common/arrays'; -import { isArray } from 'vs/base/common/types'; import { Delayer, ThrottledDelayer } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import * as collections from 'vs/base/common/collections'; import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors'; +import { isArray } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { collapseAll, expandAll } from 'vs/base/parts/tree/browser/treeUtils'; import 'vs/css!./media/settingsEditor2'; import { localize } from 'vs/nls'; -import { ConfigurationTarget, IConfigurationOverrides, IConfigurationService, ConfigurationTargetToString } from 'vs/platform/configuration/common/configuration'; +import { ConfigurationTarget, ConfigurationTargetToString, IConfigurationOverrides, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { WorkbenchTree } from 'vs/platform/list/browser/listService'; @@ -35,18 +32,17 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditor, IEditorMemento } from 'vs/workbench/common/editor'; import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput'; -import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { commonlyUsedData, tocData } from 'vs/workbench/parts/preferences/browser/settingsLayout'; -import { ISettingLinkClickEvent, resolveExtensionsSettings, resolveSettingsTree, SettingsDataSource, SettingsRenderer, SettingsTree, SimplePagedDataSource, ISettingOverrideClickEvent } from 'vs/workbench/parts/preferences/browser/settingsTree'; -import { ISettingsEditorViewState, MODIFIED_SETTING_TAG, ONLINE_SERVICES_SETTING_TAG, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; +import { ISettingLinkClickEvent, ISettingOverrideClickEvent, resolveExtensionsSettings, resolveSettingsTree, SettingsDataSource, SettingsRenderer, SettingsTree, SimplePagedDataSource } from 'vs/workbench/parts/preferences/browser/settingsTree'; +import { getQueryWithoutTags, ISettingsEditorViewState, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; import { settingsTextInputBorder } from 'vs/workbench/parts/preferences/browser/settingsWidgets'; import { TOCRenderer, TOCTree, TOCTreeModel } from 'vs/workbench/parts/preferences/browser/tocTree'; -import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/parts/preferences/common/preferences'; +import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/parts/preferences/common/preferences'; +import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; import { IPreferencesService, ISearchResult, ISettingsEditorModel, ISettingsEditorOptions, SettingsEditorOptions, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; const $ = DOM.$; @@ -59,7 +55,7 @@ export class SettingsEditor2 extends BaseEditor { private static SETTING_UPDATE_SLOW_DEBOUNCE: number = 1000; private static readonly SUGGESTIONS: string[] = [ - '@modified', '@tag:usesOnlineServices' + `@${MODIFIED_SETTING_TAG}`, '@tag:usesOnlineServices' ]; private static shouldSettingUpdateFast(type: SettingValueType | SettingValueType[]): boolean { @@ -128,7 +124,6 @@ export class SettingsEditor2 extends BaseEditor { @IInstantiationService private instantiationService: IInstantiationService, @IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService, @ILogService private logService: ILogService, - @IEnvironmentService private environmentService: IEnvironmentService, @IContextKeyService contextKeyService: IContextKeyService, @IContextMenuService private contextMenuService: IContextMenuService, @IStorageService private storageService: IStorageService, @@ -415,31 +410,6 @@ export class SettingsEditor2 extends BaseEditor { actionRunner: this.actionRunner })); - const actions: Action[] = [ - this.instantiationService.createInstance(FilterByTagAction, - localize('filterModifiedLabel', "Show modified settings"), - MODIFIED_SETTING_TAG, - this) - ]; - if (this.environmentService.appQuality !== 'stable') { - actions.push( - this.instantiationService.createInstance( - FilterByTagAction, - localize('filterOnlineServicesLabel', "Show settings for online services"), - ONLINE_SERVICES_SETTING_TAG, - this)); - actions.push(new Separator()); - } - actions.push(new Action('settings.openSettingsJson', localize('openSettingsJsonLabel', "Open settings.json"), undefined, undefined, () => { - return this.openSettingsFile().then(editor => { - const currentQuery = parseQuery(this.searchWidget.getValue()); - if (editor instanceof PreferencesEditor && currentQuery) { - editor.focusSearch(currentQuery.query); - } - }); - })); - - this.toolbar.setActions([], actions)(); this.toolbar.context = { target: this.settingsTargetsWidget.settingsTarget }; } @@ -1021,7 +991,7 @@ export class SettingsEditor2 extends BaseEditor { private triggerSearch(query: string): Thenable { this.viewState.tagFilters = new Set(); if (query) { - const parsedQuery = parseQuery(query); + const parsedQuery = getQueryWithoutTags(query); query = parsedQuery.query; parsedQuery.tags.forEach(tag => this.viewState.tagFilters.add(tag)); } @@ -1271,20 +1241,3 @@ interface ISettingsEditor2State { interface ISettingsToolbarContext { target: SettingsTarget; } - -class FilterByTagAction extends Action { - static readonly ID = 'settings.filterByTag'; - - constructor( - label: string, - private tag: string, - private settingsEditor: SettingsEditor2 - ) { - super(FilterByTagAction.ID, label, 'toggle-filter-tag'); - } - - run(): Thenable { - this.settingsEditor.focusSearch(this.tag === MODIFIED_SETTING_TAG ? `@${this.tag} ` : `@tag:${this.tag} `, false); - return Promise.resolve(null); - } -} diff --git a/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts b/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts index 4765bd00733..0d9ea23f213 100644 --- a/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts +++ b/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { settingKeyToDisplayFormat, parseQuery, IParsedQuery } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; +import { settingKeyToDisplayFormat, getQueryWithoutTags, IParsedQuery } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; suite('SettingsTree', () => { test('settingKeyToDisplayFormat', () => { @@ -106,7 +106,7 @@ suite('SettingsTree', () => { test('parseQuery', () => { function testParseQuery(input: string, expected: IParsedQuery) { assert.deepEqual( - parseQuery(input), + getQueryWithoutTags(input), expected, input ); -- GitLab