Skip to content

Commit 8e00e24

Browse files
committed
activityService.showViewActivity
1 parent ad720d6 commit 8e00e24

3 files changed

Lines changed: 87 additions & 46 deletions

File tree

src/vs/workbench/contrib/markers/browser/markers.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
77
import { MarkersModel, compareMarkersByUri } from './markersModel';
8-
import { Disposable } from 'vs/base/common/lifecycle';
8+
import { Disposable, MutableDisposable, IDisposable } from 'vs/base/common/lifecycle';
99
import { IMarkerService, MarkerSeverity, IMarker } from 'vs/platform/markers/common/markers';
10-
import { NumberBadge, ViewContaierActivityByView } from 'vs/workbench/services/activity/common/activity';
10+
import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity';
1111
import { localize } from 'vs/nls';
1212
import Constants from './constants';
1313
import { URI } from 'vs/base/common/uri';
@@ -55,22 +55,21 @@ export class MarkersWorkbenchService extends Disposable implements IMarkersWorkb
5555

5656
export class ActivityUpdater extends Disposable implements IWorkbenchContribution {
5757

58-
private readonly activity: ViewContaierActivityByView;
58+
private readonly activity = this._register(new MutableDisposable<IDisposable>());
5959

6060
constructor(
61-
@IInstantiationService instantiationService: IInstantiationService,
61+
@IActivityService private readonly activityService: IActivityService,
6262
@IMarkerService private readonly markerService: IMarkerService
6363
) {
6464
super();
65-
this.activity = this._register(instantiationService.createInstance(ViewContaierActivityByView, Constants.MARKERS_VIEW_ID));
66-
this._register(this.markerService.onMarkerChanged(() => this.updateActivity()));
67-
this.updateActivity();
65+
this._register(this.markerService.onMarkerChanged(() => this.updateBadge()));
66+
this.updateBadge();
6867
}
6968

70-
private updateActivity(): void {
69+
private updateBadge(): void {
7170
const { errors, warnings, infos } = this.markerService.getStatistics();
7271
const total = errors + warnings + infos;
7372
const message = localize('totalProblems', 'Total {0} Problems', total);
74-
this.activity.setActivity({ badge: new NumberBadge(total, () => message) });
73+
this.activity.value = this.activityService.showViewActivity(Constants.MARKERS_VIEW_ID, { badge: new NumberBadge(total, () => message) });
7574
}
7675
}

src/vs/workbench/services/activity/browser/activityService.ts

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,68 @@
55

66
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
77
import { IActivityService, IActivity } from 'vs/workbench/services/activity/common/activity';
8-
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
8+
import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle';
99
import { IActivityBarService } from 'vs/workbench/services/activityBar/browser/activityBarService';
1010
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
1111
import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views';
1212
import { GLOBAL_ACTIVITY_ID, ACCOUNTS_ACTIIVTY_ID } from 'vs/workbench/common/activity';
13+
import { Event } from 'vs/base/common/event';
14+
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
15+
16+
class ViewContainerActivityByView extends Disposable {
17+
18+
private activity: IActivity | undefined = undefined;
19+
private activityDisposable: IDisposable = Disposable.None;
20+
21+
constructor(
22+
private readonly viewId: string,
23+
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
24+
@IActivityService private readonly activityService: IActivityService,
25+
) {
26+
super();
27+
this._register(Event.filter(this.viewDescriptorService.onDidChangeContainer, e => e.views.some(view => view.id === viewId))(() => this.update()));
28+
this._register(Event.filter(this.viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === viewId))(() => this.update()));
29+
}
30+
31+
setActivity(activity: IActivity): void {
32+
this.activity = activity;
33+
this.update();
34+
}
35+
36+
clearActivity(): void {
37+
this.activity = undefined;
38+
this.update();
39+
}
40+
41+
private update(): void {
42+
this.activityDisposable.dispose();
43+
const container = this.viewDescriptorService.getViewContainerByViewId(this.viewId);
44+
if (container && this.activity) {
45+
this.activityDisposable = this.activityService.showViewContainerActivity(container.id, this.activity);
46+
}
47+
}
48+
49+
dispose() {
50+
this.activityDisposable.dispose();
51+
}
52+
}
53+
54+
interface IViewActivity {
55+
id: number;
56+
readonly activity: ViewContainerActivityByView;
57+
}
1358

1459
export class ActivityService implements IActivityService {
1560

1661
public _serviceBrand: undefined;
1762

63+
private viewActivities = new Map<string, IViewActivity>();
64+
1865
constructor(
1966
@IPanelService private readonly panelService: IPanelService,
2067
@IActivityBarService private readonly activityBarService: IActivityBarService,
2168
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
69+
@IInstantiationService private readonly instantiationService: IInstantiationService
2270
) { }
2371

2472
showViewContainerActivity(viewContainerId: string, { badge, clazz, priority }: IActivity): IDisposable {
@@ -35,6 +83,30 @@ export class ActivityService implements IActivityService {
3583
return Disposable.None;
3684
}
3785

86+
showViewActivity(viewId: string, activity: IActivity): IDisposable {
87+
let maybeItem = this.viewActivities.get(viewId);
88+
89+
if (maybeItem) {
90+
maybeItem.id++;
91+
} else {
92+
maybeItem = {
93+
id: 1,
94+
activity: this.instantiationService.createInstance(ViewContainerActivityByView, viewId)
95+
};
96+
}
97+
98+
const id = maybeItem.id;
99+
maybeItem.activity.setActivity(activity);
100+
101+
const item = maybeItem;
102+
return toDisposable(() => {
103+
if (item.id === id) {
104+
item.activity.dispose();
105+
this.viewActivities.delete(viewId);
106+
}
107+
});
108+
}
109+
38110
showAccountsActivity({ badge, clazz, priority }: IActivity): IDisposable {
39111
return this.activityBarService.showActivity(ACCOUNTS_ACTIIVTY_ID, badge, clazz, priority);
40112
}

src/vs/workbench/services/activity/common/activity.ts

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
6+
import { IDisposable } from 'vs/base/common/lifecycle';
77
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
8-
import { IViewDescriptorService } from 'vs/workbench/common/views';
9-
import { Event } from 'vs/base/common/event';
108

119
export interface IActivity {
1210
readonly badge: IBadge;
@@ -25,6 +23,11 @@ export interface IActivityService {
2523
*/
2624
showViewContainerActivity(viewContainerId: string, badge: IActivity): IDisposable;
2725

26+
/**
27+
* Show activity for the given view
28+
*/
29+
showViewActivity(viewId: string, badge: IActivity): IDisposable;
30+
2831
/**
2932
* Show accounts activity
3033
*/
@@ -36,39 +39,6 @@ export interface IActivityService {
3639
showGlobalActivity(activity: IActivity): IDisposable;
3740
}
3841

39-
export class ViewContaierActivityByView extends Disposable {
40-
41-
private activity: IActivity | undefined = undefined;
42-
private activityDisposable: IDisposable = Disposable.None;
43-
44-
constructor(
45-
private readonly viewId: string,
46-
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
47-
@IActivityService private readonly activityService: IActivityService,
48-
) {
49-
super();
50-
this._register(Event.filter(this.viewDescriptorService.onDidChangeContainer, e => e.views.some(view => view.id === viewId))(() => this.update()));
51-
this._register(Event.filter(this.viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === viewId))(() => this.update()));
52-
}
53-
54-
setActivity(activity: IActivity): void {
55-
this.activity = activity;
56-
this.update();
57-
}
58-
59-
private update(): void {
60-
this.activityDisposable.dispose();
61-
const container = this.viewDescriptorService.getViewContainerByViewId(this.viewId);
62-
if (container && this.activity) {
63-
this.activityDisposable = this.activityService.showViewContainerActivity(container.id, this.activity);
64-
}
65-
}
66-
67-
dispose() {
68-
this.activityDisposable.dispose();
69-
}
70-
}
71-
7242
export interface IBadge {
7343
getDescription(): string;
7444
}

0 commit comments

Comments
 (0)