Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/common/dialogs.ts
3291 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 { DeferredPromise } from '../../base/common/async.js';
7
import { Event, Emitter } from '../../base/common/event.js';
8
import { Disposable } from '../../base/common/lifecycle.js';
9
import { IDialogArgs, IDialogResult } from '../../platform/dialogs/common/dialogs.js';
10
11
export interface IDialogViewItem {
12
readonly args: IDialogArgs;
13
14
close(result?: IDialogResult | Error): void;
15
}
16
17
export interface IDialogHandle {
18
readonly item: IDialogViewItem;
19
readonly result: Promise<IDialogResult | undefined>;
20
}
21
22
export interface IDialogsModel {
23
24
readonly onWillShowDialog: Event<void>;
25
readonly onDidShowDialog: Event<void>;
26
27
readonly dialogs: IDialogViewItem[];
28
29
show(dialog: IDialogArgs): IDialogHandle;
30
}
31
32
export class DialogsModel extends Disposable implements IDialogsModel {
33
34
readonly dialogs: IDialogViewItem[] = [];
35
36
private readonly _onWillShowDialog = this._register(new Emitter<void>());
37
readonly onWillShowDialog = this._onWillShowDialog.event;
38
39
private readonly _onDidShowDialog = this._register(new Emitter<void>());
40
readonly onDidShowDialog = this._onDidShowDialog.event;
41
42
show(dialog: IDialogArgs): IDialogHandle {
43
const promise = new DeferredPromise<IDialogResult | undefined>();
44
45
const item: IDialogViewItem = {
46
args: dialog,
47
close: result => {
48
this.dialogs.splice(0, 1);
49
if (result instanceof Error) {
50
promise.error(result);
51
} else {
52
promise.complete(result);
53
}
54
this._onDidShowDialog.fire();
55
}
56
};
57
58
this.dialogs.push(item);
59
this._onWillShowDialog.fire();
60
61
return {
62
item,
63
result: promise.p
64
};
65
}
66
}
67
68