提交 7941b1b0 编写于 作者: R Rob Lourens

Show pref search result count badges for user and workspace settings

上级 69f9a3b8
......@@ -119,7 +119,6 @@ export class PreferencesEditor extends BaseEditor {
constructor(
@IPreferencesService private preferencesService: IPreferencesService,
@IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService,
@ITelemetryService telemetryService: ITelemetryService,
@IWorkbenchEditorService private editorService: IWorkbenchEditorService,
@IContextKeyService private contextKeyService: IContextKeyService,
......@@ -155,7 +154,7 @@ export class PreferencesEditor extends BaseEditor {
this._register(this.sideBySidePreferencesWidget.onFocus(() => this.lastFocusedWidget = this.sideBySidePreferencesWidget));
this._register(this.sideBySidePreferencesWidget.onDidSettingsTargetChange(target => this.switchSettings(target)));
this.preferencesRenderers = this._register(new PreferencesRenderersController(this.preferencesSearchService, this.telemetryService));
this.preferencesRenderers = this._register(this.instantiationService.createInstance(PreferencesRenderersController));
this._register(this.preferencesRenderers.onDidFilterResultsCountChange(count => this.showSearchResultsMessage(count)));
}
......@@ -286,17 +285,20 @@ export class PreferencesEditor extends BaseEditor {
});
}
private showSearchResultsMessage(count: number): void {
if (this.searchWidget.getValue()) {
if (count === 0) {
this.searchWidget.showMessage(nls.localize('noSettingsFound', "No Results"), count);
} else if (count === 1) {
this.searchWidget.showMessage(nls.localize('oneSettingFound', "1 Setting Found"), count);
private showSearchResultsMessage(count: IPreferencesCount): void {
const countValue = count.count;
if (count.target) {
this.sideBySidePreferencesWidget.setResultCount(count.target, count.count);
} else if (this.searchWidget.getValue()) {
if (countValue === 0) {
this.searchWidget.showMessage(nls.localize('noSettingsFound', "No Results"), countValue);
} else if (countValue === 1) {
this.searchWidget.showMessage(nls.localize('oneSettingFound', "1 Setting Found"), countValue);
} else {
this.searchWidget.showMessage(nls.localize('settingsFound', "{0} Settings Found", count), count);
this.searchWidget.showMessage(nls.localize('settingsFound', "{0} Settings Found", countValue), countValue);
}
} else {
this.searchWidget.showMessage(nls.localize('totalSettingsMessage', "Total {0} Settings", count), count);
this.searchWidget.showMessage(nls.localize('totalSettingsMessage', "Total {0} Settings", countValue), countValue);
}
}
......@@ -365,6 +367,11 @@ interface IFilterOrSearchResult {
metadata: IStringDictionary<IFilterMetadata>;
}
interface IPreferencesCount {
target?: SettingsTarget;
count: number;
}
class PreferencesRenderersController extends Disposable {
private _defaultPreferencesRenderer: IPreferencesRenderer<ISetting>;
......@@ -375,18 +382,20 @@ class PreferencesRenderersController extends Disposable {
private _settingsNavigator: SettingsNavigator;
private _remoteFilterInProgress: TPromise<any>;
private _prefsModelsForSearch = new Map<SettingsTarget, ISettingsEditorModel>();
private _currentLocalSearchProvider: ISearchProvider;
private _currentRemoteSearchProvider: ISearchProvider;
private _lastQuery: string;
private _lastFilterResult: IFilterOrSearchResult;
private _onDidFilterResultsCountChange: Emitter<number> = this._register(new Emitter<number>());
public onDidFilterResultsCountChange: Event<number> = this._onDidFilterResultsCountChange.event;
private _onDidFilterResultsCountChange: Emitter<IPreferencesCount> = this._register(new Emitter<IPreferencesCount>());
public onDidFilterResultsCountChange: Event<IPreferencesCount> = this._onDidFilterResultsCountChange.event;
constructor(
private preferencesSearchService: IPreferencesSearchService,
private telemetryService: ITelemetryService
@IPreferencesSearchService private preferencesSearchService: IPreferencesSearchService,
@ITelemetryService private telemetryService: ITelemetryService,
@IPreferencesService private preferencesService: IPreferencesService,
) {
super();
}
......@@ -468,6 +477,13 @@ class PreferencesRenderersController extends Disposable {
}
filterPs.push(this._filterOrSearchPreferences(query, this.editablePreferencesRenderer, searchProvider, groupId, groupLabel, groupOrder));
const something = [
this.searchSettingsTarget(searchProvider, ConfigurationTarget.WORKSPACE, groupId, groupLabel, groupOrder),
this.searchSettingsTarget(searchProvider, ConfigurationTarget.USER, groupId, groupLabel, groupOrder)
];
// for (const folder of this.workspaceContextService.getWorkspace().folders) {
// const folderSettingsResource = this.preferencesService.getFolderSettingsResource(folder.uri);
return TPromise.join(filterPs).then(results => {
const [defaultFilterResult, editableFilterResult] = results;
......@@ -482,6 +498,34 @@ class PreferencesRenderersController extends Disposable {
});
}
private searchSettingsTarget(provider: ISearchProvider, target: SettingsTarget, groupId: string, groupLabel: string, groupOrder: number): TPromise<void> {
return this.getPreferencesEditorModel(target).then(model => {
return this._filterOrSearchPreferencesModel('', <ISettingsEditorModel>model, provider, groupId, groupLabel, groupOrder);
}).then(result => {
const count = result ? this._flatten(result.filteredGroups).length : 0;
this._onDidFilterResultsCountChange.fire({ target, count });
}, err => {
if (!isPromiseCanceledError(err)) {
return TPromise.wrapError(err);
}
return null;
});
}
private async getPreferencesEditorModel(target: SettingsTarget): TPromise<ISettingsEditorModel> {
const resource = target === ConfigurationTarget.USER ? this.preferencesService.userSettingsResource :
target === ConfigurationTarget.WORKSPACE ? this.preferencesService.workspaceSettingsResource :
target;
if (!this._prefsModelsForSearch.has(target)) {
const model = await this.preferencesService.createPreferencesEditorModel(resource);
this._prefsModelsForSearch.set(target, <ISettingsEditorModel>model);
}
return this._prefsModelsForSearch.get(target);
}
focusNextPreference(forward: boolean = true) {
if (!this._settingsNavigator) {
return;
......@@ -507,48 +551,53 @@ class PreferencesRenderersController extends Disposable {
private _filterOrSearchPreferences(filter: string, preferencesRenderer: IPreferencesRenderer<ISetting>, provider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise<IFilterResult> {
if (preferencesRenderer) {
const model = <ISettingsEditorModel>preferencesRenderer.preferencesModel;
const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null);
return searchP
.then<ISearchResult>(null, err => {
if (isPromiseCanceledError(err)) {
return TPromise.wrapError(err);
} else {
/* __GDPR__
"defaultSettings.searchError" : {
"message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
const message = getErrorMessage(err).trim();
if (message) {
// Empty message = any generic network error
this.telemetryService.publicLog('defaultSettings.searchError', { message });
}
return null;
}
})
.then(searchResult => {
const filterResult = searchResult ?
model.updateResultGroup(groupId, {
id: groupId,
label: groupLabel,
result: searchResult,
order: groupOrder
}) :
model.updateResultGroup(groupId, null);
if (filterResult) {
filterResult.query = filter;
}
preferencesRenderer.filterPreferences(filterResult);
return filterResult;
});
return this._filterOrSearchPreferencesModel(filter, model, provider, groupId, groupLabel, groupOrder).then(filterResult => {
preferencesRenderer.filterPreferences(filterResult);
return filterResult;
});
}
return TPromise.wrap(null);
}
private _filterOrSearchPreferencesModel(filter: string, model: ISettingsEditorModel, provider: ISearchProvider, groupId: string, groupLabel: string, groupOrder: number): TPromise<IFilterResult> {
const searchP = provider ? provider.searchModel(model) : TPromise.wrap(null);
return searchP
.then<ISearchResult>(null, err => {
if (isPromiseCanceledError(err)) {
return TPromise.wrapError(err);
} else {
/* __GDPR__
"defaultSettings.searchError" : {
"message": { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
const message = getErrorMessage(err).trim();
if (message) {
// Empty message = any generic network error
this.telemetryService.publicLog('defaultSettings.searchError', { message });
}
return null;
}
})
.then(searchResult => {
const filterResult = searchResult ?
model.updateResultGroup(groupId, {
id: groupId,
label: groupLabel,
result: searchResult,
order: groupOrder
}) :
model.updateResultGroup(groupId, null);
if (filterResult) {
filterResult.query = filter;
}
return filterResult;
});
}
private consolidateAndUpdate(defaultFilterResult: IFilterResult, editableFilterResult: IFilterResult): void {
const defaultPreferencesFilteredGroups = defaultFilterResult ? defaultFilterResult.filteredGroups : this._getAllPreferences(this._defaultPreferencesRenderer);
const editablePreferencesFilteredGroups = editableFilterResult ? editableFilterResult.filteredGroups : this._getAllPreferences(this._editablePreferencesRenderer);
......@@ -556,7 +605,7 @@ class PreferencesRenderersController extends Disposable {
this._settingsNavigator = new SettingsNavigator(this._lastQuery ? consolidatedSettings : []);
const totalCount = consolidatedSettings.length;
this._onDidFilterResultsCountChange.fire(totalCount);
this._onDidFilterResultsCountChange.fire({ count: totalCount });
}
private _getAllPreferences(preferencesRenderer: IPreferencesRenderer<ISetting>): ISettingsGroup[] {
......@@ -705,6 +754,10 @@ class SideBySidePreferencesWidget extends Widget {
});
}
public setResultCount(settingsTarget: SettingsTarget, count: number): void {
this.settingsTargetsWidget.setResultCount(settingsTarget, count);
}
public layout(dimension: Dimension): void {
this.dimension = dimension;
this.sash.setDimenesion(this.dimension);
......
......@@ -492,6 +492,24 @@ export class SettingsTargetsWidget extends Widget {
}
}
public setResultCount(settingsTarget: SettingsTarget, count: number): void {
if (settingsTarget === ConfigurationTarget.WORKSPACE) {
let label = localize('workspaceSettings', "Workspace Settings");
if (count) {
label += ` (${count})`;
}
this.workspaceSettings.label = label;
} else if (settingsTarget === ConfigurationTarget.USER) {
let label = localize('userSettings', "User Settings");
if (count) {
label += ` (${count})`;
}
this.userSettings.label = label;
}
}
private onWorkbenchStateChanged(): void {
this.folderSettings.folder = null;
this.update();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册