Skip to content

Commit c4db36e

Browse files
committed
viewlet progress shows progress bar and activity badge
1 parent aa52214 commit c4db36e

7 files changed

Lines changed: 56 additions & 51 deletions

File tree

src/vs/platform/progress/common/progress.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export interface IProgress<T> {
3535
report(item: T): void;
3636
}
3737

38+
export const emptyProgress: IProgress<any> = Object.freeze({ report() { } });
39+
3840
export class Progress<T> implements IProgress<T> {
3941

4042
private _callback: () => void;

src/vs/workbench/browser/parts/compositePart.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,10 @@ export abstract class CompositePart<T extends Composite> extends Part {
464464
this.messageService.show(Severity.Error, types.isString(error) ? new Error(error) : error);
465465
}
466466

467+
public getProgressIndicator(id: string): IProgressService {
468+
return this.mapProgressServiceToComposite[id];
469+
}
470+
467471
protected getActions(): IAction[] {
468472
return [];
469473
}

src/vs/workbench/browser/parts/sidebar/sidebarPart.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes';
2525
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
2626
import Event from 'vs/base/common/event';
2727

28-
export interface ISidebar {
29-
onDidViewletOpen: Event<IViewlet>;
30-
onDidViewletClose: Event<IViewlet>;
31-
openViewlet(id: string, focus?: boolean): TPromise<IViewlet>;
32-
getActiveViewlet(): IViewlet;
33-
getLastActiveViewletId(): string;
34-
hideActiveViewlet(): TPromise<void>;
35-
}
36-
37-
export class SidebarPart extends CompositePart<Viewlet> implements ISidebar {
28+
export class SidebarPart extends CompositePart<Viewlet> {
3829

3930
public static activeViewletSettingsKey = 'workbench.sidebar.activeviewletid';
4031

src/vs/workbench/services/progress/browser/progressService2.ts

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,16 @@
55
'use strict';
66

77
import 'vs/css!vs/workbench/services/progress/browser/media/progressService2';
8-
import { always } from 'vs/base/common/async';
8+
import * as dom from 'vs/base/browser/dom';
9+
import { IActivityBarService, ProgressBadge } from 'vs/workbench/services/activity/common/activityBarService';
910
import { IDisposable } from 'vs/base/common/lifecycle';
10-
import { Registry } from 'vs/platform/platform';
11-
import { IProgressService2, IProgress, Progress } from 'vs/platform/progress/common/progress';
11+
import { IProgressService2, IProgress, Progress, emptyProgress } from 'vs/platform/progress/common/progress';
12+
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
1213
import { OcticonLabel } from 'vs/base/browser/ui/octiconLabel/octiconLabel';
14+
import { Registry } from 'vs/platform/platform';
1315
import { StatusbarAlignment, IStatusbarRegistry, StatusbarItemDescriptor, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar';
1416
import { TPromise } from 'vs/base/common/winjs.base';
15-
import { IActivityBarService, ProgressBadge } from 'vs/workbench/services/activity/common/activityBarService';
16-
import * as dom from 'vs/base/browser/dom';
17-
18-
class ActivityBarProgress implements IProgress<number> {
19-
20-
private _handle: IDisposable;
21-
22-
constructor(
23-
private _activityBar: IActivityBarService,
24-
private _viewletId: string) {
25-
26-
}
27-
28-
dispose(): void {
29-
if (this._handle) {
30-
this._handle.dispose();
31-
this._handle = undefined;
32-
}
33-
}
34-
35-
report(n: number): void {
36-
if (!this._handle) {
37-
this._handle = this._activityBar.showActivity(this._viewletId, new ProgressBadge(() => '...'), 'progress-badge');
38-
}
39-
}
40-
}
17+
import { always } from 'vs/base/common/async';
4118

4219
class WindowProgressItem implements IStatusbarItem {
4320

@@ -79,7 +56,8 @@ export class ProgressService2 implements IProgressService2 {
7956
private _stack: Progress<string>[] = [];
8057

8158
constructor(
82-
@IActivityBarService private _activityBar: IActivityBarService
59+
@IActivityBarService private _activityBar: IActivityBarService,
60+
@IViewletService private _viewletService: IViewletService
8361
) {
8462
//
8563
}
@@ -98,11 +76,6 @@ export class ProgressService2 implements IProgressService2 {
9876
});
9977
}
10078

101-
withViewletProgress(viewletId: string, task: (progress: IProgress<number>) => TPromise<any>): void {
102-
const progress = new ActivityBarProgress(this._activityBar, viewletId);
103-
always(task(progress), () => progress.dispose());
104-
}
105-
10679
private _updateProgress() {
10780
if (this._stack.length === 0) {
10881
WindowProgressItem.Instance.hide();
@@ -111,6 +84,26 @@ export class ProgressService2 implements IProgressService2 {
11184
WindowProgressItem.Instance.text = this._stack[0].value;
11285
}
11386
}
87+
88+
withViewletProgress(viewletId: string, task: (progress: IProgress<number>) => TPromise<any>): void {
89+
90+
const promise = task(emptyProgress);
91+
92+
// show in viewlet
93+
const viewletProgress = this._viewletService.getProgressIndicator(viewletId);
94+
viewletProgress.showWhile(promise);
95+
96+
// show activity bar
97+
const activityProgress = this._activityBar.showActivity(
98+
viewletId,
99+
new ProgressBadge(() => '...'),
100+
'progress-badge'
101+
);
102+
103+
always(promise, () => {
104+
activityProgress.dispose();
105+
});
106+
}
114107
}
115108

116109

src/vs/workbench/services/viewlet/browser/viewlet.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet';
99
import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
1010
import Event from 'vs/base/common/event';
1111
import { ViewletDescriptor } from 'vs/workbench/browser/viewlet';
12+
import { IProgressService } from 'vs/platform/progress/common/progress';
1213

1314
export const IViewletService = createDecorator<IViewletService>('viewletService');
1415

@@ -42,4 +43,9 @@ export interface IViewletService {
4243
* Returns all registered viewlets
4344
*/
4445
getViewlets(): ViewletDescriptor[];
45-
}
46+
47+
/**
48+
*
49+
*/
50+
getProgressIndicator(id: string): IProgressService;
51+
}

src/vs/workbench/services/viewlet/browser/viewletService.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ import { TPromise, ValueCallback } from 'vs/base/common/winjs.base';
88
import { IViewlet } from 'vs/workbench/common/viewlet';
99
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
1010
import Event from 'vs/base/common/event';
11-
import { ISidebar } from 'vs/workbench/browser/parts/sidebar/sidebarPart';
11+
import { SidebarPart } from 'vs/workbench/browser/parts/sidebar/sidebarPart';
1212
import { Registry } from 'vs/platform/platform';
1313
import { ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet';
1414
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
15+
import { IProgressService } from 'vs/platform/progress/common/progress';
1516

1617
export class ViewletService implements IViewletService {
1718

1819
public _serviceBrand: any;
1920

20-
private sidebarPart: ISidebar;
21+
private sidebarPart: SidebarPart;
2122
private viewletRegistry: ViewletRegistry;
2223

2324
private extensionViewlets: ViewletDescriptor[];
@@ -28,7 +29,7 @@ export class ViewletService implements IViewletService {
2829
public get onDidViewletClose(): Event<IViewlet> { return this.sidebarPart.onDidViewletClose; };
2930

3031
constructor(
31-
sidebarPart: ISidebar,
32+
sidebarPart: SidebarPart,
3233
@IExtensionService private extensionService: IExtensionService
3334
) {
3435
this.sidebarPart = sidebarPart;
@@ -99,4 +100,8 @@ export class ViewletService implements IViewletService {
99100
public getViewlet(id: string): ViewletDescriptor {
100101
return this.getViewlets().filter(viewlet => viewlet.id === id)[0];
101102
}
102-
}
103+
104+
public getProgressIndicator(id: string): IProgressService {
105+
return this.sidebarPart.getProgressIndicator(id);
106+
}
107+
}

src/vs/workbench/test/browser/services.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ class TestViewletService implements IViewletService {
126126
public getViewlet(id: string): ViewletDescriptor {
127127
return null;
128128
}
129+
130+
public getProgressIndicator(id: string) {
131+
return null;
132+
}
129133
}
130134

131135
class TestPanelService implements IPanelService {
@@ -444,4 +448,4 @@ suite('Workbench UI Services', () => {
444448
});
445449
});
446450
});
447-
});
451+
});

0 commit comments

Comments
 (0)