diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 26c14053498ea955b4a72ac1491a7d92d3213ca5..ccc7280c879a1fb6dc1809ff43ffae0b7deb9109 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -46,6 +46,7 @@ export class SettingsEditor2 extends BaseEditor { private settingsTargetsWidget: SettingsTargetsWidget; private showConfiguredSettingsOnlyCheckbox: HTMLInputElement; + private savedExpandedGroups: any[]; private settingsTreeContainer: HTMLElement; private settingsTree: WorkbenchTree; @@ -267,6 +268,25 @@ export class SettingsEditor2 extends BaseEditor { private onShowConfiguredOnlyClicked(): void { this.viewState.showConfiguredOnly = this.showConfiguredSettingsOnlyCheckbox.checked; this.refreshTree(); + + // TODO@roblou - This is slow + if (this.viewState.showConfiguredOnly) { + this.savedExpandedGroups = this.settingsTree.getExpandedElements(); + const nav = this.settingsTree.getNavigator(); + let element; + while (element = nav.next()) { + this.settingsTree.expand(element); + } + } else if (this.savedExpandedGroups) { + const nav = this.settingsTree.getNavigator(); + let element; + while (element = nav.next()) { + this.settingsTree.collapse(element); + } + + this.settingsTree.expandAll(this.savedExpandedGroups); + this.savedExpandedGroups = null; + } } private onDidChangeSetting(key: string, value: any): void { diff --git a/src/vs/workbench/parts/preferences/browser/settingsTree.ts b/src/vs/workbench/parts/preferences/browser/settingsTree.ts index b45227555251fd0c51091211522e58f7bf0a9b39..adb7c2281cb09177038859702f71dae35a5a3b90 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsTree.ts @@ -25,6 +25,7 @@ import { SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferenc import { ISearchResult, ISetting, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import URI from 'vs/base/common/uri'; const $ = DOM.$; @@ -75,6 +76,17 @@ export interface IGroupElement extends ITreeItem { export type TreeElement = ISettingElement | IGroupElement; export type TreeElementOrRoot = TreeElement | DefaultSettingsEditorModel | SearchResultModel; +function inspectSetting(key: string, target: SettingsTarget, configurationService: IConfigurationService): { isConfigured: boolean, inspected: any, targetSelector: string } { + const inspectOverrides = URI.isUri(target) ? { resource: target } : undefined; + const inspected = configurationService.inspect(key, inspectOverrides); + const targetSelector = target === ConfigurationTarget.USER ? 'user' : + target === ConfigurationTarget.WORKSPACE ? 'workspace' : + 'workspaceFolder'; + const isConfigured = typeof inspected[targetSelector] !== 'undefined'; + + return { isConfigured, inspected, targetSelector }; +} + export class SettingsDataSource implements IDataSource { constructor( private viewState: ISettingsEditorViewState, @@ -91,9 +103,8 @@ export class SettingsDataSource implements IDataSource { } getSettingElement(setting: ISetting, group: ISettingsGroup): ISettingElement { - const targetSelector = this.viewState.settingsTarget === ConfigurationTarget.USER ? 'user' : 'workspace'; - const inspected = this.configurationService.inspect(setting.key); - const isConfigured = typeof inspected[targetSelector] !== 'undefined'; + const { isConfigured, inspected, targetSelector } = inspectSetting(setting.key, this.viewState.settingsTarget, this.configurationService); + const displayValue = isConfigured ? inspected[targetSelector] : inspected.default; const overriddenScopeList = []; if (targetSelector === 'user' && typeof inspected.workspace !== 'undefined') { @@ -514,19 +525,35 @@ export class SettingsRenderer implements IRenderer { } export class SettingsTreeFilter implements IFilter { - constructor(private viewState: ISettingsEditorViewState) { } + constructor( + private viewState: ISettingsEditorViewState, + @IConfigurationService private configurationService: IConfigurationService + ) { } isVisible(tree: ITree, element: TreeElement): boolean { if (this.viewState.showConfiguredOnly && element.type === TreeItemType.setting) { return element.isConfigured; } - if (element.type === TreeItemType.groupTitle) { - // TODO - hide if no visible children + if (element.type === TreeItemType.groupTitle && this.viewState.showConfiguredOnly) { + return this.groupHasConfiguredSetting(element.group); } return true; } + + private groupHasConfiguredSetting(group: ISettingsGroup): boolean { + for (let section of group.sections) { + for (let setting of section.settings) { + const { isConfigured } = inspectSetting(setting.key, this.viewState.settingsTarget, this.configurationService); + if (isConfigured) { + return true; + } + } + } + + return false; + } } export class SettingsTreeController extends WorkbenchTreeController {