Skip to content

Commit 82af5cd

Browse files
authored
Add listeners for multi diff tab editor (microsoft#210094)
1 parent d510e84 commit 82af5cd

File tree

2 files changed

+47
-21
lines changed

2 files changed

+47
-21
lines changed

src/vs/workbench/api/browser/mainThreadEditorTabs.ts

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

6-
import { DisposableStore } from 'vs/base/common/lifecycle';
7-
import { ExtHostContext, IExtHostEditorTabsShape, MainContext, IEditorTabDto, IEditorTabGroupDto, MainThreadEditorTabsShape, AnyInputDto, TabInputKind, TabModelOperationKind, TextDiffInputDto } from 'vs/workbench/api/common/extHost.protocol';
8-
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
6+
import { Event } from 'vs/base/common/event';
7+
import { DisposableMap, DisposableStore } from 'vs/base/common/lifecycle';
8+
import { isEqual } from 'vs/base/common/resources';
9+
import { URI } from 'vs/base/common/uri';
10+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
11+
import { ILogService } from 'vs/platform/log/common/log';
12+
import { AnyInputDto, ExtHostContext, IEditorTabDto, IEditorTabGroupDto, IExtHostEditorTabsShape, MainContext, MainThreadEditorTabsShape, TabInputKind, TabModelOperationKind, TextDiffInputDto } from 'vs/workbench/api/common/extHost.protocol';
913
import { EditorResourceAccessor, GroupModelChangeKind, SideBySideEditor } from 'vs/workbench/common/editor';
1014
import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput';
15+
import { isGroupEditorMoveEvent } from 'vs/workbench/common/editor/editorGroupModel';
1116
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
12-
import { columnToEditorGroup, EditorGroupColumn, editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn';
13-
import { GroupDirection, IEditorGroup, IEditorGroupsService, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService';
14-
import { IEditorsChangeEvent, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
17+
import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput';
1518
import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
16-
import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput';
19+
import { ChatEditorInput } from 'vs/workbench/contrib/chat/browser/chatEditorInput';
1720
import { CustomEditorInput } from 'vs/workbench/contrib/customEditor/browser/customEditorInput';
18-
import { URI } from 'vs/base/common/uri';
19-
import { WebviewInput } from 'vs/workbench/contrib/webviewPanel/browser/webviewEditorInput';
20-
import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput';
21-
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
22-
import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput';
23-
import { isEqual } from 'vs/base/common/resources';
24-
import { isGroupEditorMoveEvent } from 'vs/workbench/common/editor/editorGroupModel';
2521
import { InteractiveEditorInput } from 'vs/workbench/contrib/interactive/browser/interactiveEditorInput';
2622
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
27-
import { ILogService } from 'vs/platform/log/common/log';
28-
import { ChatEditorInput } from 'vs/workbench/contrib/chat/browser/chatEditorInput';
2923
import { MultiDiffEditorInput } from 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput';
24+
import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/common/notebookEditorInput';
25+
import { TerminalEditorInput } from 'vs/workbench/contrib/terminal/browser/terminalEditorInput';
26+
import { WebviewInput } from 'vs/workbench/contrib/webviewPanel/browser/webviewEditorInput';
27+
import { columnToEditorGroup, EditorGroupColumn, editorGroupToColumn } from 'vs/workbench/services/editor/common/editorGroupColumn';
28+
import { GroupDirection, IEditorGroup, IEditorGroupsService, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService';
29+
import { IEditorsChangeEvent, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
30+
import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers';
3031

3132
interface TabInfo {
3233
tab: IEditorTabDto;
@@ -44,6 +45,8 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
4445
private readonly _groupLookup: Map<number, IEditorTabGroupDto> = new Map();
4546
// Lookup table for finding tab by id
4647
private readonly _tabInfoLookup: Map<string, TabInfo> = new Map();
48+
// Tracks the currently open MultiDiffEditorInputs to listen to resource changes
49+
private readonly _multiDiffEditorInputListeners: DisposableMap<MultiDiffEditorInput> = new DisposableMap();
4750

4851
constructor(
4952
extHostContext: IExtHostContext,
@@ -65,6 +68,8 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
6568
}
6669
}));
6770

71+
this._dispoables.add(this._multiDiffEditorInputListeners);
72+
6873
// Structural group changes (add, remove, move, etc) are difficult to patch.
6974
// Since they happen infrequently we just rebuild the entire model
7075
this._dispoables.add(this._editorGroupsService.onDidAddGroup(() => this._createTabsModel()));
@@ -201,7 +206,7 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
201206

202207
if (editor instanceof MultiDiffEditorInput) {
203208
const diffEditors: TextDiffInputDto[] = [];
204-
for (const resource of (editor?.initialResources ?? [])) {
209+
for (const resource of (editor?.resources.get() ?? [])) {
205210
if (resource.original && resource.modified) {
206211
diffEditors.push({
207212
kind: TabInputKind.TextDiffInput,
@@ -297,7 +302,24 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
297302
const tabObject = this._buildTabObject(group, editorInput, editorIndex);
298303
tabs.splice(editorIndex, 0, tabObject);
299304
// Update lookup
300-
this._tabInfoLookup.set(this._generateTabId(editorInput, groupId), { group, editorInput, tab: tabObject });
305+
const tabId = this._generateTabId(editorInput, groupId);
306+
this._tabInfoLookup.set(tabId, { group, editorInput, tab: tabObject });
307+
308+
if (editorInput instanceof MultiDiffEditorInput) {
309+
this._multiDiffEditorInputListeners.set(editorInput, Event.fromObservableLight(editorInput.resources)(() => {
310+
const tabInfo = this._tabInfoLookup.get(tabId);
311+
if (!tabInfo) {
312+
return;
313+
}
314+
tabInfo.tab = this._buildTabObject(group, editorInput, editorIndex);
315+
this._proxy.$acceptTabOperation({
316+
groupId,
317+
index: editorIndex,
318+
tabDto: tabInfo.tab,
319+
kind: TabModelOperationKind.TAB_UPDATE
320+
});
321+
}));
322+
}
301323

302324
this._proxy.$acceptTabOperation({
303325
groupId,
@@ -331,6 +353,10 @@ export class MainThreadEditorTabs implements MainThreadEditorTabsShape {
331353
// Update lookup
332354
this._tabInfoLookup.delete(removedTab[0]?.id ?? '');
333355

356+
if (removedTab[0]?.input instanceof MultiDiffEditorInput) {
357+
this._multiDiffEditorInputListeners.deleteAndDispose(removedTab[0]?.input);
358+
}
359+
334360
this._proxy.$acceptTabOperation({
335361
groupId,
336362
index: editorIndex,

src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor
9393

9494
this._register(autorun((reader) => {
9595
/** @description Updates name */
96-
const resources = this._resources.read(reader);
96+
const resources = this.resources.read(reader);
9797
const label = this.label ?? localize('name', "Multi Diff Editor");
9898
if (resources) {
9999
this._name = label + localize({
@@ -237,8 +237,8 @@ export class MultiDiffEditorInput extends EditorInput implements ILanguageSuppor
237237
return false;
238238
}
239239

240-
private readonly _resources = derived(this, reader => this._resolvedSource.cachedPromiseResult.read(reader)?.data?.resources.read(reader));
241-
private readonly _isDirtyObservables = mapObservableArrayCached(this, this._resources.map(r => r ?? []), res => {
240+
public readonly resources = derived(this, reader => this._resolvedSource.cachedPromiseResult.read(reader)?.data?.resources.read(reader));
241+
private readonly _isDirtyObservables = mapObservableArrayCached(this, this.resources.map(r => r ?? []), res => {
242242
const isModifiedDirty = res.modified ? isUriDirty(this._textFileService, res.modified) : constObservable(false);
243243
const isOriginalDirty = res.original ? isUriDirty(this._textFileService, res.original) : constObservable(false);
244244
return derived(reader => /** @description modifiedDirty||originalDirty */ isModifiedDirty.read(reader) || isOriginalDirty.read(reader));

0 commit comments

Comments
 (0)