Skip to content

Commit

Permalink
Add single level of categorization #126089
Browse files Browse the repository at this point in the history
  • Loading branch information
rzhao271 committed Jun 22, 2021
1 parent 8883fbe commit b733a8d
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,10 @@
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-control {
width: 500px;
}
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-control textarea {
/* Keep textarea at a constant height */
height: 150px !important;
}

.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-enum .setting-item-value > .setting-item-control,
.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-text .setting-item-value > .setting-item-control {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import { IUserDataSyncWorkbenchService } from 'vs/workbench/services/userDataSyn
import { preferencesClearInputIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons';
import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust';
import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';

export const enum SettingsFocusContext {
Search,
Expand Down Expand Up @@ -120,6 +121,8 @@ export class SettingsEditor2 extends EditorPane {
}
return type === SettingValueType.Enum ||
type === SettingValueType.StringOrEnumArray ||
type === SettingValueType.Object ||
type === SettingValueType.String ||
type === SettingValueType.Complex ||
type === SettingValueType.Boolean ||
type === SettingValueType.Exclude;
Expand Down Expand Up @@ -195,6 +198,7 @@ export class SettingsEditor2 extends EditorPane {
@IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService,
@IUserDataAutoSyncEnablementService private readonly userDataAutoSyncEnablementService: IUserDataAutoSyncEnablementService,
@IWorkspaceTrustManagementService private readonly workspaceTrustManagementService: IWorkspaceTrustManagementService,
@IExtensionService private readonly extensionService: IExtensionService
) {
super(SettingsEditor2.ID, telemetryService, themeService, storageService);
this.delayedFilterLogging = new Delayer<void>(1000);
Expand Down Expand Up @@ -1011,7 +1015,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.isWorkpaceTrusted() && (this.viewState.settingsTarget instanceof URI || this.viewState.settingsTarget === ConfigurationTarget.WORKSPACE)) {
const configuredUntrustedWorkspaceSettings = resolveConfiguredUntrustedSettings(groups, this.viewState.settingsTarget, this.configurationService);
Expand Down
73 changes: 52 additions & 21 deletions src/vs/workbench/contrib/preferences/browser/settingsTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent';
import { alert as ariaAlert } from 'vs/base/browser/ui/aria/aria';
import { Button } from 'vs/base/browser/ui/button/button';
import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox';
import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
import { IInputOptions, InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
import { CachedListVirtualDelegate } from 'vs/base/browser/ui/list/list';
import { DefaultStyleController, IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
import { ISelectOptionItem, SelectBox } from 'vs/base/browser/ui/selectBox/selectBox';
Expand Down Expand Up @@ -60,6 +60,7 @@ import { ILogService } from 'vs/platform/log/common/log';
import { settingsMoreActionIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons';
import { IWorkbenchConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';

const $ = DOM.$;

Expand Down Expand Up @@ -338,27 +339,60 @@ export function resolveConfiguredUntrustedSettings(groups: ISettingsGroup[], tar
return [...allSettings].filter(setting => setting.restricted && inspectSetting(setting.key, target, configurationService).isConfigured);
}

export function resolveExtensionsSettings(groups: ISettingsGroup[]): ITOCEntry<ISetting> {
const settingsGroupToEntry = (group: ISettingsGroup) => {
export async function resolveExtensionsSettings(extensionService: IExtensionService, groups: ISettingsGroup[]): Promise<ITOCEntry<ISetting>> {
const extGroupTree = new Map<string, ITOCEntry<ISetting>>();
const addEntryToTree = (extensionId: string, extensionName: string, childEntry: ITOCEntry<ISetting>) => {
if (!extGroupTree.has(extensionId)) {
const rootEntry = {
id: extensionId,
label: extensionName,
children: [childEntry]
};
extGroupTree.set(extensionId, rootEntry);
} else {
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);
let extensionName = group.title;
if (extension) {
extensionName = extension.displayName ?? extension.name;
}

const childEntry = {
id: group.id,
label: group.title,
settings: flatSettings
};
} as ITOCEntry<ISetting>;
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<ISetting>[] = [];
for (const value of extGroupTree.values()) {
if (value.children!.length === 1) {
// only one child,so no need to nest it
extGroups.push(value.children![0]);
} else {
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<string>, allSettings: Set<ISetting>, logService: ILogService): ITOCEntry<ISetting> {
Expand Down Expand Up @@ -1288,7 +1322,12 @@ export class SettingTextRenderer extends AbstractSettingRenderer implements ITre
const common = this.renderCommonTemplate(null, _container, 'text');
const validationErrorMessageElement = DOM.append(common.containerElement, $('.setting-item-validation-message'));

const inputBox = new InputBox(common.controlElement, this._contextViewService);
const inputBoxOptions: IInputOptions = {
flexibleHeight: true,
flexibleWidth: false,
flexibleMaxHeight: 150
};
const inputBox = new InputBox(common.controlElement, this._contextViewService, inputBoxOptions);
common.toDispose.add(inputBox);
common.toDispose.add(attachInputBoxStyler(inputBox, this._themeService, {
inputBackground: settingsTextInputBackground,
Expand All @@ -1305,14 +1344,6 @@ export class SettingTextRenderer extends AbstractSettingRenderer implements ITre
inputBox.inputElement.classList.add(AbstractSettingRenderer.CONTROL_CLASS);
inputBox.inputElement.tabIndex = 0;

// TODO@9at8: listWidget filters out all key events from input boxes, so we need to come up with a better way
// Disable ArrowUp and ArrowDown behaviour in favor of list navigation
common.toDispose.add(DOM.addStandardDisposableListener(inputBox.inputElement, DOM.EventType.KEY_DOWN, e => {
if (e.equals(KeyCode.UpArrow) || e.equals(KeyCode.DownArrow)) {
e.preventDefault();
}
}));

const template: ISettingTextItemTemplate = {
...common,
inputBox,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,6 @@ export abstract class AbstractListSettingWidget<TDataItem extends object> extend
listHeight += ITEM_HEIGHT;
this.listElement.appendChild(header);
}

this.rowElements = this.model.items.map((item, i) => this.renderDataOrEditItem(item, i, focused));
this.rowElements.forEach(rowElement => this.listElement.appendChild(rowElement));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,10 @@ export class DefaultSettings extends Disposable {
enumDescriptions = prop.items!.enumDescriptions || prop.items!.markdownEnumDescriptions;
}

if (prop.type === 'string' && !prop.enum) {
console.log('dbg str ' + key);
}

result.push({
key,
value,
Expand Down

0 comments on commit b733a8d

Please sign in to comment.