From 22c0c2c27c54bec15cefef00a3b0da69dd00cbe2 Mon Sep 17 00:00:00 2001 From: Raymond Zhao Date: Tue, 14 Sep 2021 10:04:07 -0700 Subject: [PATCH] Add single level of categorization #126089 (#126861) --- .../platform/extensions/common/extensions.ts | 3 + .../browser/media/settingsEditor2.css | 19 +++--- .../preferences/browser/settingsEditor2.ts | 8 ++- .../preferences/browser/settingsLayout.ts | 1 + .../preferences/browser/settingsTree.ts | 63 ++++++++++++++++--- .../preferences/browser/settingsTreeModels.ts | 2 +- .../preferences/common/preferences.ts | 1 + .../preferences/common/preferencesModels.ts | 5 +- 8 files changed, 79 insertions(+), 23 deletions(-) diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index f9a5b4879c317..19e2540021b11 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -25,6 +25,9 @@ export interface IConfigurationProperty { } export interface IConfiguration { + id?: string, + order?: number, + title?: string, properties: { [key: string]: IConfigurationProperty; }; } diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 7382ab87e10e2..583cbb5ba77b7 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -288,6 +288,9 @@ padding-right: 24px; overflow: visible; } +.settings-editor > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-contents.group-title { + max-width: min(100%, 1000px); /* Cut off title if too long for window */ +} .settings-editor > .settings-body > .settings-tree-container .settings-group-title-label, .settings-editor > .settings-body > .settings-tree-container .setting-item-contents { @@ -559,15 +562,17 @@ padding-left: 15px; width: 100%; position: relative; + overflow: hidden; + text-overflow: ellipsis; } - -.settings-editor > .settings-body > .settings-tree-container .settings-group-level-1 { - font-size: 24px; +.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-1 { + font-size: 26px; } - -.settings-editor > .settings-body > .settings-tree-container .settings-group-level-2 { - padding-top: 32px; - font-size: 20px; +.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-2 { + font-size: 22px; +} +.settings-editor > .settings-body > .settings-tree-container .settings-group-title-label.settings-group-level-3 { + font-size: 18px; } .settings-editor.search-mode > .settings-body .settings-toc-container .monaco-list-row .settings-toc-count { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index db6ad679819bd..bbe3ed7e597b0 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -54,6 +54,7 @@ import { preferencesClearInputIcon } from 'vs/workbench/contrib/preferences/brow import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export const enum SettingsFocusContext { Search, @@ -199,7 +200,8 @@ export class SettingsEditor2 extends EditorPane { @IEditorGroupsService protected editorGroupService: IEditorGroupsService, @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, @IUserDataAutoSyncEnablementService private readonly userDataAutoSyncEnablementService: IUserDataAutoSyncEnablementService, - @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService + @IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService, + @IExtensionService private readonly extensionService: IExtensionService ) { super(SettingsEditor2.ID, telemetryService, themeService, storageService); this.delayedFilterLogging = new Delayer(1000); @@ -307,7 +309,7 @@ export class SettingsEditor2 extends EditorPane { this.modelDisposables.clear(); this.modelDisposables.add(model.onDidChangeGroups(() => { this.updatedConfigSchemaDelayer.trigger(() => { - this.onConfigUpdate(undefined, undefined, true); + this.onConfigUpdate(undefined, false, true); }); })); this.defaultSettingsEditorModel = model; @@ -1025,7 +1027,7 @@ export class SettingsEditor2 extends EditorPane { const commonlyUsed = resolveSettingsTree(commonlyUsedData, dividedGroups.core, this.logService); resolvedSettingsRoot.children!.unshift(commonlyUsed.tree); - resolvedSettingsRoot.children!.push(resolveExtensionsSettings(dividedGroups.extension || [])); + resolvedSettingsRoot.children!.push(await resolveExtensionsSettings(this.extensionService, dividedGroups.extension || [])); if (!this.workspaceTrustManagementService.isWorkspaceTrusted() && (this.viewState.settingsTarget instanceof URI || this.viewState.settingsTarget === ConfigurationTarget.WORKSPACE)) { const configuredUntrustedWorkspaceSettings = resolveConfiguredUntrustedSettings(groups, this.viewState.settingsTarget, this.configurationService); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts b/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts index de10a05a9e67c..e532f58846b93 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts @@ -7,6 +7,7 @@ import { localize } from 'vs/nls'; export interface ITOCEntry { id: string; label: string; + order?: number; children?: ITOCEntry[]; settings?: Array; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 8c5bf6f536904..43a88e04aa66a 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -60,6 +60,7 @@ import { settingsMoreActionIcon } from 'vs/workbench/contrib/preferences/browser import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; const $ = DOM.$; @@ -358,27 +359,69 @@ export function resolveConfiguredUntrustedSettings(groups: ISettingsGroup[], tar return [...allSettings].filter(setting => setting.restricted && inspectSetting(setting.key, target, configurationService).isConfigured); } -export function resolveExtensionsSettings(groups: ISettingsGroup[]): ITOCEntry { - const settingsGroupToEntry = (group: ISettingsGroup) => { +export async function resolveExtensionsSettings(extensionService: IExtensionService, groups: ISettingsGroup[]): Promise> { + const extGroupTree = new Map>(); + const addEntryToTree = (extensionId: string, extensionName: string, childEntry: ITOCEntry) => { + if (!extGroupTree.has(extensionId)) { + const rootEntry = { + id: extensionId, + label: extensionName, + children: [] + }; + extGroupTree.set(extensionId, rootEntry); + } + extGroupTree.get(extensionId)!.children!.push(childEntry); + }; + const processGroupEntry = async (group: ISettingsGroup) => { const flatSettings = arrays.flatten( group.sections.map(section => section.settings)); - return { + const extensionId = group.extensionInfo!.id; + const extension = await extensionService.getExtension(extensionId); + const extensionName = extension!.displayName ?? extension!.name; + + const childEntry = { id: group.id, label: group.title, + order: group.order, settings: flatSettings }; + addEntryToTree(extensionId, extensionName, childEntry); }; - const extGroups = groups + const processPromises = groups .sort((a, b) => a.title.localeCompare(b.title)) - .map(g => settingsGroupToEntry(g)); + .map(g => processGroupEntry(g)); + + return Promise.all(processPromises).then(() => { + const extGroups: ITOCEntry[] = []; + for (const value of extGroupTree.values()) { + if (value.children!.length === 1) { + // push a flattened setting + extGroups.push({ + id: value.id, + label: value.children![0].label, + settings: value.children![0].settings + }); + } else { + value.children!.sort((a, b) => { + if (a.order !== undefined && b.order !== undefined) { + return a.order - b.order; + } else { + // leave things as-is + return 0; + } + }); + extGroups.push(value); + } + } - return { - id: 'extensions', - label: localize('extensions', "Extensions"), - children: extGroups - }; + return { + id: 'extensions', + label: localize('extensions', "Extensions"), + children: extGroups + }; + }); } function _resolveSettingsTree(tocData: ITOCEntry, allSettings: Set, logService: ILogService): ITOCEntry { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index 0e7c14ed83f54..b4aafa2d75305 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -429,9 +429,9 @@ export class SettingsTreeModel { } private createSettingsTreeGroupElement(tocEntry: ITOCEntry, parent?: SettingsTreeGroupElement): SettingsTreeGroupElement { - const depth = parent ? this.getDepth(parent) + 1 : 0; const element = new SettingsTreeGroupElement(tocEntry.id, undefined, tocEntry.label, depth, false); + element.parent = parent; const children: SettingsTreeGroupChild[] = []; if (tocEntry.settings) { diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index 08db9ca1b1a41..272500e729483 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -41,6 +41,7 @@ export interface ISettingsGroup { range: IRange; title: string; titleRange: IRange; + order: number; sections: ISettingsSection[]; extensionInfo?: IConfigurationExtensionInfo; } diff --git a/src/vs/workbench/services/preferences/common/preferencesModels.ts b/src/vs/workbench/services/preferences/common/preferencesModels.ts index 6b16ea3dddd09..0be0e8105179e 100644 --- a/src/vs/workbench/services/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/services/preferences/common/preferencesModels.ts @@ -197,6 +197,7 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti }], title: modelGroup.title, titleRange: modelGroup.titleRange, + order: modelGroup.order, extensionInfo: modelGroup.extensionInfo }; } @@ -566,7 +567,7 @@ export class DefaultSettings extends Disposable { if (!settingsGroup) { settingsGroup = result.find(g => g.title === title && g.extensionInfo?.id === config.extensionInfo?.id); if (!settingsGroup) { - settingsGroup = { sections: [{ settings: [] }], id: config.id || '', title: title || '', titleRange: nullRange, range: nullRange, extensionInfo: config.extensionInfo }; + settingsGroup = { sections: [{ settings: [] }], id: config.id || '', title: title || '', titleRange: nullRange, order: config.order ?? 0, range: nullRange, extensionInfo: config.extensionInfo }; result.push(settingsGroup); } } else { @@ -575,7 +576,7 @@ export class DefaultSettings extends Disposable { } if (config.properties) { if (!settingsGroup) { - settingsGroup = { sections: [{ settings: [] }], id: config.id || '', title: config.id || '', titleRange: nullRange, range: nullRange, extensionInfo: config.extensionInfo }; + settingsGroup = { sections: [{ settings: [] }], id: config.id || '', title: config.id || '', titleRange: nullRange, order: config.order ?? 0, range: nullRange, extensionInfo: config.extensionInfo }; result.push(settingsGroup); } const configurationSettings: ISetting[] = [];