Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/files/common/dirtyFilesIndicator.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as nls from '../../../../nls.js';
7
import { IWorkbenchContribution } from '../../../common/contributions.js';
8
import { VIEWLET_ID } from './files.js';
9
import { Disposable, MutableDisposable } from '../../../../base/common/lifecycle.js';
10
import { IActivityService, NumberBadge } from '../../../services/activity/common/activity.js';
11
import { IWorkingCopyService } from '../../../services/workingCopy/common/workingCopyService.js';
12
import { IWorkingCopy, WorkingCopyCapabilities } from '../../../services/workingCopy/common/workingCopy.js';
13
import { IFilesConfigurationService } from '../../../services/filesConfiguration/common/filesConfigurationService.js';
14
15
export class DirtyFilesIndicator extends Disposable implements IWorkbenchContribution {
16
17
static readonly ID = 'workbench.contrib.dirtyFilesIndicator';
18
19
private readonly badgeHandle = this._register(new MutableDisposable());
20
21
private lastKnownDirtyCount = 0;
22
23
constructor(
24
@IActivityService private readonly activityService: IActivityService,
25
@IWorkingCopyService private readonly workingCopyService: IWorkingCopyService,
26
@IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService
27
) {
28
super();
29
30
this.updateActivityBadge();
31
32
this.registerListeners();
33
}
34
35
private registerListeners(): void {
36
37
// Working copy dirty indicator
38
this._register(this.workingCopyService.onDidChangeDirty(workingCopy => this.onWorkingCopyDidChangeDirty(workingCopy)));
39
}
40
41
private onWorkingCopyDidChangeDirty(workingCopy: IWorkingCopy): void {
42
const gotDirty = workingCopy.isDirty();
43
if (gotDirty && !(workingCopy.capabilities & WorkingCopyCapabilities.Untitled) && this.filesConfigurationService.hasShortAutoSaveDelay(workingCopy.resource)) {
44
return; // do not indicate dirty of working copies that are auto saved after short delay
45
}
46
47
if (gotDirty || this.lastKnownDirtyCount > 0) {
48
this.updateActivityBadge();
49
}
50
}
51
52
private updateActivityBadge(): void {
53
const dirtyCount = this.lastKnownDirtyCount = this.workingCopyService.dirtyCount;
54
55
// Indicate dirty count in badge if any
56
if (dirtyCount > 0) {
57
this.badgeHandle.value = this.activityService.showViewContainerActivity(
58
VIEWLET_ID,
59
{
60
badge: new NumberBadge(dirtyCount, num => num === 1 ? nls.localize('dirtyFile', "1 unsaved file") : nls.localize('dirtyFiles', "{0} unsaved files", dirtyCount)),
61
}
62
);
63
} else {
64
this.badgeHandle.clear();
65
}
66
}
67
}
68
69