Skip to content

Commit 09b83d3

Browse files
committed
bulk - better view model
1 parent e57ba0c commit 09b83d3

2 files changed

Lines changed: 34 additions & 31 deletions

File tree

src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
import 'vs/css!./media/bulkEdit';
77
import { WorkbenchAsyncDataTree, TreeResourceNavigator, IOpenEvent } from 'vs/platform/list/browser/listService';
88
import { WorkspaceEdit } from 'vs/editor/common/modes';
9-
import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, BulkEditAriaProvider, CategoryElementRenderer, BulkEditNaviLabelProvider } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditTree';
9+
import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, BulkEditAriaProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditTree';
1010
import { FuzzyScore } from 'vs/base/common/filters';
1111
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1212
import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService';
1313
import { diffInserted, diffRemoved } from 'vs/platform/theme/common/colorRegistry';
1414
import { localize } from 'vs/nls';
1515
import { DisposableStore } from 'vs/base/common/lifecycle';
1616
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
17-
import { BulkEditPreviewProvider, BulkFileOperations, BulkFileOperationType, BulkCategory } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview';
17+
import { BulkEditPreviewProvider, BulkFileOperations, BulkFileOperationType } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditPreview';
1818
import { ILabelService } from 'vs/platform/label/common/label';
1919
import { ITextModelService } from 'vs/editor/common/services/resolverService';
2020
import { URI } from 'vs/base/common/uri';
@@ -206,7 +206,7 @@ export class BulkEditPane extends ViewPane {
206206
if (element instanceof FileElement) {
207207
await this._tree.expand(element, true);
208208
}
209-
if (element instanceof BulkCategory) {
209+
if (element instanceof CategoryElement) {
210210
await this._tree.expand(element, true);
211211
expand.push(...this._tree.getNode(element).children);
212212
}
@@ -307,21 +307,21 @@ export class BulkEditPane extends ViewPane {
307307
let leftResource: URI | undefined;
308308
if (fileElement.edit.type & BulkFileOperationType.TextEdit) {
309309
try {
310-
(await this._textModelService.createModelReference(fileElement.uri)).dispose();
311-
leftResource = fileElement.uri;
310+
(await this._textModelService.createModelReference(fileElement.edit.uri)).dispose();
311+
leftResource = fileElement.edit.uri;
312312
} catch {
313313
leftResource = BulkEditPreviewProvider.emptyPreview;
314314
}
315315
}
316316

317-
const previewUri = BulkEditPreviewProvider.asPreviewUri(fileElement.uri);
317+
const previewUri = BulkEditPreviewProvider.asPreviewUri(fileElement.edit.uri);
318318

319319
if (leftResource) {
320320
// show diff editor
321321
this._editorService.openEditor({
322322
leftResource,
323323
rightResource: previewUri,
324-
label: localize('edt.title', "{0} (refactor preview)", basename(fileElement.uri)),
324+
label: localize('edt.title', "{0} (refactor preview)", basename(fileElement.edit.uri)),
325325
options
326326
});
327327
} else {
@@ -336,7 +336,7 @@ export class BulkEditPane extends ViewPane {
336336
}
337337

338338
this._editorService.openEditor({
339-
label: typeLabel && localize('edt.title2', "{0} ({1}, refactor preview)", basename(fileElement.uri), typeLabel),
339+
label: typeLabel && localize('edt.title2', "{0} ({1}, refactor preview)", basename(fileElement.edit.uri), typeLabel),
340340
resource: previewUri,
341341
options
342342
});

src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree.ts

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { IAsyncDataSource, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/t
77
import { ITextModelService } from 'vs/editor/common/services/resolverService';
88
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
99
import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels';
10-
import { URI } from 'vs/base/common/uri';
1110
import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
1211
import { IIdentityProvider, IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list';
1312
import { Range } from 'vs/editor/common/core/range';
@@ -27,16 +26,20 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService';
2726

2827
// --- VIEW MODEL
2928

30-
export class FileElement {
29+
export class CategoryElement {
3130

32-
readonly uri: URI;
31+
constructor(
32+
readonly parent: BulkFileOperations,
33+
readonly category: BulkCategory
34+
) { }
35+
}
36+
37+
export class FileElement {
3338

3439
constructor(
35-
readonly parent: BulkCategory | undefined,
40+
readonly parent: CategoryElement | BulkFileOperations,
3641
readonly edit: BulkFileOperation
37-
) {
38-
this.uri = edit.uri;
39-
}
42+
) { }
4043
}
4144

4245
export class TextEditElement {
@@ -48,7 +51,7 @@ export class TextEditElement {
4851
) { }
4952
}
5053

51-
export type BulkEditElement = BulkCategory | FileElement | TextEditElement;
54+
export type BulkEditElement = CategoryElement | FileElement | TextEditElement;
5255

5356
// --- DATA SOURCE
5457

@@ -73,13 +76,13 @@ export class BulkEditDataSource implements IAsyncDataSource<BulkFileOperations,
7376
// root -> file/text edits
7477
if (element instanceof BulkFileOperations) {
7578
return this.groupByFile
76-
? element.fileOperations.map(op => new FileElement(undefined, op))
77-
: element.categories;
79+
? element.fileOperations.map(op => new FileElement(element, op))
80+
: element.categories.map(cat => new CategoryElement(element, cat));
7881
}
7982

8083
// category
81-
if (element instanceof BulkCategory) {
82-
return element.fileOperations.map(op => new FileElement(element, op));
84+
if (element instanceof CategoryElement) {
85+
return element.category.fileOperations.map(op => new FileElement(element, op));
8386
}
8487

8588
// file: text edit
@@ -209,11 +212,11 @@ export class BulkEditIdentityProvider implements IIdentityProvider<BulkEditEleme
209212

210213
getId(element: BulkEditElement): { toString(): string; } {
211214
if (element instanceof FileElement) {
212-
return element.uri + JSON.stringify(element.parent?.metadata);
215+
return element.edit.uri + (element.parent instanceof CategoryElement ? JSON.stringify(element.parent.category.metadata) : '');
213216
} else if (element instanceof TextEditElement) {
214-
return element.parent.uri.toString() + JSON.stringify(element.edit.textEdit);
217+
return element.parent.edit.uri.toString() + JSON.stringify(element.edit.textEdit);
215218
} else {
216-
return JSON.stringify(element.metadata);
219+
return JSON.stringify(element.category.metadata);
217220
}
218221
}
219222
}
@@ -248,7 +251,7 @@ class CategoryElementTemplate {
248251
}
249252
}
250253

251-
export class CategoryElementRenderer implements ITreeRenderer<BulkCategory, FuzzyScore, CategoryElementTemplate> {
254+
export class CategoryElementRenderer implements ITreeRenderer<CategoryElement, FuzzyScore, CategoryElementTemplate> {
252255

253256
static readonly id: string = 'CategoryElementRenderer';
254257

@@ -258,12 +261,12 @@ export class CategoryElementRenderer implements ITreeRenderer<BulkCategory, Fuzz
258261
return new CategoryElementTemplate(container);
259262
}
260263

261-
renderElement(node: ITreeNode<BulkCategory, FuzzyScore>, _index: number, template: CategoryElementTemplate): void {
264+
renderElement(node: ITreeNode<CategoryElement, FuzzyScore>, _index: number, template: CategoryElementTemplate): void {
262265

263266
template.icon.style.setProperty('--background-dark', null);
264267
template.icon.style.setProperty('--background-light', null);
265268

266-
const { metadata } = node.element;
269+
const { metadata } = node.element.category;
267270
if (ThemeIcon.isThemeIcon(metadata.iconPath)) {
268271
// css
269272
const className = ThemeIcon.asClassName(metadata.iconPath);
@@ -340,12 +343,12 @@ class FileElementTemplate {
340343

341344
this._details.innerText = localize(
342345
'detail.rename', "(renaming from {0})",
343-
this._labelService.getUriLabel(element.uri, { relative: true })
346+
this._labelService.getUriLabel(element.edit.uri, { relative: true })
344347
);
345348

346349
} else {
347350
// create, delete, edit: NAME
348-
this._label.setFile(element.uri, {
351+
this._label.setFile(element.edit.uri, {
349352
matches: createMatches(score),
350353
fileKind: FileKind.FILE,
351354
fileDecorations: { colors: true, badges: false },
@@ -489,9 +492,9 @@ export class BulkEditNaviLabelProvider implements IKeyboardNavigationLabelProvid
489492

490493
getKeyboardNavigationLabel(element: BulkEditElement) {
491494
if (element instanceof FileElement) {
492-
return basename(element.uri);
493-
} else if (element instanceof BulkCategory) {
494-
return element.metadata.label;
495+
return basename(element.edit.uri);
496+
} else if (element instanceof CategoryElement) {
497+
return element.category.metadata.label;
495498
}
496499
return undefined;
497500
}

0 commit comments

Comments
 (0)