Skip to content

Commit 03c0c29

Browse files
authored
Merge branch 'main' into fix/improve-marker-placements
2 parents dec68f6 + 86637ca commit 03c0c29

File tree

3 files changed

+46
-32
lines changed

3 files changed

+46
-32
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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 { RunOnceScheduler } from 'vs/base/common/async';
7+
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
8+
import { AccessibilitySignal, IAccessibilitySignalService } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService';
9+
10+
/**
11+
* Schedules a signal to play while progress is happening.
12+
*/
13+
export class AccessibilityProgressSignalScheduler extends Disposable {
14+
private _scheduler: RunOnceScheduler;
15+
private _signalLoop: IDisposable | undefined;
16+
constructor(msLoopTime: number, msDelayTime: number, @IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService) {
17+
super();
18+
this._scheduler = new RunOnceScheduler(() => {
19+
this._signalLoop = this._accessibilitySignalService.playSignalLoop(AccessibilitySignal.chatResponsePending, msLoopTime);
20+
}, msDelayTime);
21+
this._scheduler.schedule();
22+
}
23+
override dispose(): void {
24+
super.dispose();
25+
this._signalLoop?.dispose();
26+
this._scheduler.dispose();
27+
}
28+
}
29+

src/vs/workbench/contrib/chat/browser/chatAccessibilityService.ts

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { status } from 'vs/base/browser/ui/aria/aria';
7-
import { RunOnceScheduler } from 'vs/base/common/async';
8-
import { Disposable, DisposableMap, IDisposable } from 'vs/base/common/lifecycle';
7+
import { Disposable, DisposableMap } from 'vs/base/common/lifecycle';
98
import { AccessibilitySignal, IAccessibilitySignalService } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService';
109
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
10+
import { AccessibilityProgressSignalScheduler } from 'vs/platform/accessibilitySignal/browser/progressAccessibilitySignalScheduler';
1111
import { IChatAccessibilityService } from 'vs/workbench/contrib/chat/browser/chat';
1212
import { IChatResponseViewModel } from 'vs/workbench/contrib/chat/common/chatViewModel';
1313

14+
const CHAT_RESPONSE_PENDING_AUDIO_CUE_LOOP_MS = 5000;
15+
const CHAT_RESPONSE_PENDING_ALLOWANCE_MS = 4000;
1416
export class ChatAccessibilityService extends Disposable implements IChatAccessibilityService {
1517

1618
declare readonly _serviceBrand: undefined;
1719

18-
private _pendingSignalMap: DisposableMap<number, AccessibilitySignalScheduler> = this._register(new DisposableMap());
20+
private _pendingSignalMap: DisposableMap<number, AccessibilityProgressSignalScheduler> = this._register(new DisposableMap());
1921

2022
private _requestId: number = 0;
2123

@@ -25,7 +27,7 @@ export class ChatAccessibilityService extends Disposable implements IChatAccessi
2527
acceptRequest(): number {
2628
this._requestId++;
2729
this._accessibilitySignalService.playSignal(AccessibilitySignal.chatRequestSent, { allowManyInParallel: true });
28-
this._pendingSignalMap.set(this._requestId, this._instantiationService.createInstance(AccessibilitySignalScheduler));
30+
this._pendingSignalMap.set(this._requestId, this._instantiationService.createInstance(AccessibilityProgressSignalScheduler, CHAT_RESPONSE_PENDING_AUDIO_CUE_LOOP_MS, CHAT_RESPONSE_PENDING_ALLOWANCE_MS));
2931
return this._requestId;
3032
}
3133
acceptResponse(response: IChatResponseViewModel | string | undefined, requestId: number): void {
@@ -41,25 +43,3 @@ export class ChatAccessibilityService extends Disposable implements IChatAccessi
4143
}
4244
}
4345

44-
const CHAT_RESPONSE_PENDING_AUDIO_CUE_LOOP_MS = 5000;
45-
const CHAT_RESPONSE_PENDING_ALLOWANCE_MS = 4000;
46-
/**
47-
* Schedules an audio cue to play when a chat response is pending for too long.
48-
*/
49-
class AccessibilitySignalScheduler extends Disposable {
50-
private _scheduler: RunOnceScheduler;
51-
private _signalLoop: IDisposable | undefined;
52-
constructor(@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService) {
53-
super();
54-
this._scheduler = new RunOnceScheduler(() => {
55-
this._signalLoop = this._accessibilitySignalService.playSignalLoop(AccessibilitySignal.chatResponsePending, CHAT_RESPONSE_PENDING_AUDIO_CUE_LOOP_MS);
56-
}, CHAT_RESPONSE_PENDING_ALLOWANCE_MS);
57-
this._scheduler.schedule();
58-
}
59-
override dispose(): void {
60-
super.dispose();
61-
this._signalLoop?.dispose();
62-
this._scheduler.cancel();
63-
this._scheduler.dispose();
64-
}
65-
}

src/vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class NotebookCellOutlineProvider {
4242
}
4343

4444
private readonly _outlineEntryFactory: NotebookOutlineEntryFactory;
45+
private readonly delayRecomputeActive: () => void;
4546
constructor(
4647
private readonly _editor: INotebookEditor,
4748
private readonly _target: OutlineTarget,
@@ -52,20 +53,27 @@ export class NotebookCellOutlineProvider {
5253
@IConfigurationService private readonly _configurationService: IConfigurationService,
5354
) {
5455
this._outlineEntryFactory = new NotebookOutlineEntryFactory(notebookExecutionStateService);
56+
const delayerRecomputeActive = this._disposables.add(new Delayer(10));
57+
this.delayRecomputeActive = () => delayerRecomputeActive.trigger(() => {
58+
const { changeEventTriggered } = this._recomputeActive();
59+
if (!changeEventTriggered) {
60+
this._onDidChange.fire({});
61+
}
62+
});
5563

5664
this._disposables.add(Event.debounce<void, void>(
5765
_editor.onDidChangeSelection,
5866
(last, _current) => last,
5967
200
6068
)(() => {
61-
this._recomputeActive();
69+
this.delayRecomputeActive();
6270
}, this))
6371
this._disposables.add(Event.debounce<INotebookViewCellsUpdateEvent, INotebookViewCellsUpdateEvent>(
6472
_editor.onDidChangeViewCells,
6573
(last, _current) => last ?? _current,
6674
200
6775
)(() => {
68-
this._recomputeActive();
76+
this.delayRecomputeActive();
6977
}, this)
7078
);
7179

@@ -253,10 +261,7 @@ export class NotebookCellOutlineProvider {
253261
}
254262
}));
255263

256-
const { changeEventTriggered } = this._recomputeActive();
257-
if (!changeEventTriggered) {
258-
this._onDidChange.fire({});
259-
}
264+
this.delayRecomputeActive();
260265
}
261266

262267
private _recomputeActive(): { changeEventTriggered: boolean } {

0 commit comments

Comments
 (0)