diff --git a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts index 47954eddc02ac8ec8b554a3c7c9e8bf594188f24..77d25156adac6d3ceadd6ff32dbfc96812d1ed90 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsEditor2.ts @@ -54,13 +54,13 @@ export class SettingsEditor2 extends BaseEditor { private settingsTree: WorkbenchTree; private treeDataSource: SettingsDataSource; - private delayedModifyLogging: Delayer; private delayedFilterLogging: Delayer; private localSearchDelayer: Delayer; private remoteSearchThrottle: ThrottledDelayer; private searchInProgress: TPromise; - private pendingSettingModifiedReport: { key: string, value: any }; + private settingUpdateDelayer: Delayer; + private pendingSettingUpdate: { key: string, value: any }; private selectedElement: TreeElement; @@ -81,12 +81,13 @@ export class SettingsEditor2 extends BaseEditor { @IContextKeyService contextKeyService: IContextKeyService ) { super(SettingsEditor2.ID, telemetryService, themeService); - this.delayedModifyLogging = new Delayer(1000); this.delayedFilterLogging = new Delayer(1000); this.localSearchDelayer = new Delayer(100); this.remoteSearchThrottle = new ThrottledDelayer(200); this.viewState = { settingsTarget: ConfigurationTarget.USER }; + this.settingUpdateDelayer = new Delayer(500); + this.inSettingsEditorContextKey = CONTEXT_SETTINGS_EDITOR.bindTo(contextKeyService); this.searchFocusContextKey = CONTEXT_SETTINGS_SEARCH_FOCUS.bindTo(contextKeyService); @@ -320,31 +321,36 @@ export class SettingsEditor2 extends BaseEditor { } private onDidChangeSetting(key: string, value: any): void { - // ConfigurationService displays the error if this fails. - // Force a render afterwards because onDidConfigurationUpdate doesn't fire if the update doesn't result in an effective setting value change - this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget) - .then(() => this.refreshTreeAndMaintainFocus()); - - const reportModifiedProps = { - key, - query: this.searchWidget.getValue(), - searchResults: this.searchResultModel && this.searchResultModel.getUniqueResults(), - rawResults: this.searchResultModel && this.searchResultModel.getRawResults(), - showConfiguredOnly: this.viewState.showConfiguredOnly, - isReset: typeof value === 'undefined', - settingsTarget: this.settingsTargetsWidget.settingsTarget as SettingsTarget - }; - - if (this.pendingSettingModifiedReport && key !== this.pendingSettingModifiedReport.key) { - this.reportModifiedSetting(reportModifiedProps); + if (this.pendingSettingUpdate && this.pendingSettingUpdate.key !== key) { + this.updateChangedSetting(key, value); } - this.pendingSettingModifiedReport = { key, value }; - this.delayedModifyLogging.trigger(() => this.reportModifiedSetting(reportModifiedProps)); + this.pendingSettingUpdate = { key, value }; + this.settingUpdateDelayer.trigger(() => this.updateChangedSetting(key, value)); + } + + private updateChangedSetting(key: string, value: any): TPromise { + // ConfigurationService displays the error if this fails. + // Force a render afterwards because onDidConfigurationUpdate doesn't fire if the update doesn't result in an effective setting value change + return this.configurationService.updateValue(key, value, this.settingsTargetsWidget.settingsTarget) + .then(() => this.refreshTreeAndMaintainFocus()) + .then(() => { + const reportModifiedProps = { + key, + query: this.searchWidget.getValue(), + searchResults: this.searchResultModel && this.searchResultModel.getUniqueResults(), + rawResults: this.searchResultModel && this.searchResultModel.getRawResults(), + showConfiguredOnly: this.viewState.showConfiguredOnly, + isReset: typeof value === 'undefined', + settingsTarget: this.settingsTargetsWidget.settingsTarget as SettingsTarget + }; + + return this.reportModifiedSetting(reportModifiedProps); + }); } private reportModifiedSetting(props: { key: string, query: string, searchResults: ISearchResult[], rawResults: ISearchResult[], showConfiguredOnly: boolean, isReset: boolean, settingsTarget: SettingsTarget }): void { - this.pendingSettingModifiedReport = null; + this.pendingSettingUpdate = null; const remoteResult = props.searchResults && props.searchResults[SearchResultIdx.Remote]; const localResult = props.searchResults && props.searchResults[SearchResultIdx.Local]; diff --git a/src/vs/workbench/parts/preferences/browser/settingsTree.ts b/src/vs/workbench/parts/preferences/browser/settingsTree.ts index 446bf45b84ff56634d431c2b7974b4682d34cb8f..3f72f2f39dac5638483d3f8a307ddeb8bd696658 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/parts/preferences/browser/settingsTree.ts @@ -423,11 +423,11 @@ export class SettingsRenderer implements IRenderer { resetButton.element.classList.add('setting-reset-button'); resetButton.element.tabIndex = isSelected ? 0 : -1; - attachButtonStyler(resetButton, this.themeService, { + template.toDispose.push(attachButtonStyler(resetButton, this.themeService, { buttonBackground: Color.transparent.toString(), buttonHoverBackground: Color.transparent.toString(), buttonForeground: editorActiveLinkForeground - }); + })); template.toDispose.push(resetButton.onDidClick(e => { this._onDidChangeSetting.fire({ key: element.setting.key, value: undefined });