Skip to content

Commit

Permalink
move sorting and filter-state into marker view model #14783
Browse files Browse the repository at this point in the history
  • Loading branch information
jrieken committed Mar 6, 2018
1 parent 879f54e commit 8301ae6
Show file tree
Hide file tree
Showing 6 changed files with 212 additions and 202 deletions.
22 changes: 12 additions & 10 deletions src/vs/workbench/parts/markers/browser/markersPanel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ export class MarkersPanel extends Panel {
"source" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
this.telemetryService.publicLog('problems.marker.opened', { source: marker.marker.source });
this.telemetryService.publicLog('problems.marker.opened', { source: marker.raw.source });
this.editorService.openEditor({
resource: marker.resource,
options: {
Expand Down Expand Up @@ -197,6 +197,7 @@ export class MarkersPanel extends Panel {
const controller = this.instantiationService.createInstance(Controller);
this.tree = this.instantiationService.createInstance(WorkbenchTree, this.treeContainer, {
dataSource: new Viewer.DataSource(),
filter: new Viewer.DataFilter(),
renderer,
controller,
sorter: new Viewer.Sorter(),
Expand Down Expand Up @@ -294,13 +295,12 @@ export class MarkersPanel extends Panel {
}

private autoExpand(): void {
for (const resource of this.markersWorkbenchService.markersModel.filteredResources) {
const resourceUri = resource.uri.toString();
if (!this.autoExpanded.has(resourceUri)) {
this.markersWorkbenchService.markersModel.forEachFilteredResource(resource => {
if (!this.autoExpanded.has(resource.uri.toString())) {
this.tree.expand(resource).done(null, errors.onUnexpectedError);
this.autoExpanded.add(resourceUri);
this.autoExpanded.add(resource.uri.toString());
}
}
});
}

private autoReveal(focus: boolean = false): void {
Expand Down Expand Up @@ -332,13 +332,15 @@ export class MarkersPanel extends Panel {
}

private getResourceForCurrentActiveResource(): Resource {
let res: Resource = null;
if (this.currentActiveResource) {
let resources = this.markersWorkbenchService.markersModel.filteredResources.filter((resource): boolean => {
return this.currentActiveResource.toString() === resource.uri.toString();
this.markersWorkbenchService.markersModel.forEachFilteredResource(resource => {
if (!res && resource.uri.toString() === this.currentActiveResource.toString()) {
res = resource;
}
});
return resources.length > 0 ? resources[0] : null;
}
return null;
return res;
}

private hasSelectedMarkerFor(resource: Resource): boolean {
Expand Down
34 changes: 23 additions & 11 deletions src/vs/workbench/parts/markers/browser/markersTreeViewer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import { TPromise, Promise } from 'vs/base/common/winjs.base';
import * as dom from 'vs/base/browser/dom';
import * as network from 'vs/base/common/network';
import { IDataSource, ITree, IRenderer, IAccessibilityProvider, ISorter } from 'vs/base/parts/tree/browser/tree';
import { IDataSource, ITree, IRenderer, IAccessibilityProvider, ISorter, IFilter } from 'vs/base/parts/tree/browser/tree';
import Severity from 'vs/base/common/severity';
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
import { FileLabel, ResourceLabel } from 'vs/workbench/browser/labels';
Expand Down Expand Up @@ -41,15 +41,15 @@ interface IMarkerTemplateData {
}

export class DataSource implements IDataSource {
public getId(tree: ITree, element: any): string {
public getId(tree: ITree, element: MarkersModel | Resource | Marker): string {
if (element instanceof MarkersModel) {
return 'root';
}
if (element instanceof Resource) {
return element.uri.toString();
}
if (element instanceof Marker) {
return (<Marker>element).id;
return element.id;
}
return '';
}
Expand All @@ -58,12 +58,12 @@ export class DataSource implements IDataSource {
return element instanceof MarkersModel || element instanceof Resource;
}

public getChildren(tree: ITree, element: any): Promise {
public getChildren(tree: ITree, element: MarkersModel | Resource): Promise {
if (element instanceof MarkersModel) {
return TPromise.as((<MarkersModel>element).filteredResources);
return Promise.as(element.resources);
}
if (element instanceof Resource) {
return TPromise.as(element.markers);
return Promise.as(element.markers);
}
return null;
}
Expand All @@ -73,6 +73,18 @@ export class DataSource implements IDataSource {
}
}

export class DataFilter implements IFilter {
public isVisible(tree: ITree, element: Resource | Marker | any): boolean {
if (element instanceof Resource) {
return element.filteredMarkersCount > 0;
}
if (element instanceof Marker) {
return element.isSelected;
}
return true;
}
}

export class Renderer implements IRenderer {

private static readonly RESOURCE_TEMPLATE_ID = 'resource-template';
Expand Down Expand Up @@ -164,13 +176,13 @@ export class Renderer implements IRenderer {
} else if ((<IResourceTemplateData>templateData).resourceLabel) {
(<IResourceTemplateData>templateData).resourceLabel.setLabel({ name: element.name, description: element.uri.toString(), resource: element.uri }, { matches: element.uriMatches });
}
templateData.count.setCount(element.markers.length);
templateData.count.setCount(element.filteredMarkersCount);
}

private renderMarkerElement(tree: ITree, element: Marker, templateData: IMarkerTemplateData) {
let marker = element.marker;
let marker = element.raw;
templateData.icon.className = 'icon ' + Renderer.iconClassNameFor(marker);
templateData.description.set(marker.message, element.labelMatches);
templateData.description.set(marker.message, element.messageMatches);
templateData.description.element.title = marker.message;

dom.toggleClass(templateData.source.element, 'marker-source', !!marker.source);
Expand Down Expand Up @@ -211,10 +223,10 @@ export class MarkersTreeAccessibilityProvider implements IAccessibilityProvider

public getAriaLabel(tree: ITree, element: any): string {
if (element instanceof Resource) {
return Messages.MARKERS_TREE_ARIA_LABEL_RESOURCE(element.name, element.markers.length);
return Messages.MARKERS_TREE_ARIA_LABEL_RESOURCE(element.name, element.filteredMarkersCount);
}
if (element instanceof Marker) {
return Messages.MARKERS_TREE_ARIA_LABEL_MARKER(element.marker);
return Messages.MARKERS_TREE_ARIA_LABEL_MARKER(element.raw);
}
return null;
}
Expand Down
21 changes: 10 additions & 11 deletions src/vs/workbench/parts/markers/common/markers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,24 +42,23 @@ export class MarkersWorkbenchService extends Disposable implements IMarkersWorkb
}

filter(filter: string): void {
this.markersModel.update(new FilterOptions(filter));
this.markersModel.updateFilterOptions(new FilterOptions(filter));
this.refreshBadge();
}

private onMarkerChanged(resources: URI[]): void {
const bulkUpdater = this.markersModel.getBulkUpdater();
for (const resource of resources) {
bulkUpdater.add(resource, this.markerService.read({ resource }));
}
bulkUpdater.done();
this.markersModel.updateMarkers(updater => {
for (const resource of resources) {
updater(resource, this.markerService.read({ resource }));
}
});
this.refreshBadge();
this._onDidChangeMarkersForResources.fire(resources);
}

private refreshBadge(): void {
const total = this.markersModel.total();
const count = this.markersModel.count();
const message = total === count ? localize('totalProblems', 'Total {0} Problems', total) : localize('filteredProblems', 'Showing {0} of {1} Problems', count, total);
this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(count, () => message));
const { total, filtered } = this.markersModel.stats();
const message = total === filtered ? localize('totalProblems', 'Total {0} Problems', total) : localize('filteredProblems', 'Showing {0} of {1} Problems', filtered, total);
this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(filtered, () => message));
}
}
}
Loading

0 comments on commit 8301ae6

Please sign in to comment.