diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 25f52b57d3f..1b067bef553 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -152,6 +152,56 @@ registerColor('scm.historyItemSelectedStatisticsBorder', { hcLight: transparent(listActiveSelectionForeground, 0.2) }, localize('scm.historyItemSelectedStatisticsBorder', "History item selected statistics border color.")); +function processResourceFilterData(uri: URI, filterData: FuzzyScore | LabelFuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] { + if (!filterData) { + return [undefined, undefined]; + } + + if (!(filterData as LabelFuzzyScore).label) { + const matches = createMatches(filterData as FuzzyScore); + return [matches, undefined]; + } + + const fileName = basename(uri); + const label = (filterData as LabelFuzzyScore).label; + const pathLength = label.length - fileName.length; + const matches = createMatches((filterData as LabelFuzzyScore).score); + + // FileName match + if (label === fileName) { + return [matches, undefined]; + } + + // FilePath match + const labelMatches: IMatch[] = []; + const descriptionMatches: IMatch[] = []; + + for (const match of matches) { + if (match.start > pathLength) { + // Label match + labelMatches.push({ + start: match.start - pathLength, + end: match.end - pathLength + }); + } else if (match.end < pathLength) { + // Description match + descriptionMatches.push(match); + } else { + // Spanning match + labelMatches.push({ + start: 0, + end: match.end - pathLength + }); + descriptionMatches.push({ + start: match.start, + end: pathLength + }); + } + } + + return [labelMatches, descriptionMatches]; +} + interface ISCMLayout { height: number | undefined; width: number | undefined; @@ -605,7 +655,7 @@ class ResourceRenderer implements ICompressibleTreeRenderer pathLength) { - // Label match - labelMatches.push({ - start: match.start - pathLength, - end: match.end - pathLength - }); - } else if (match.end < pathLength) { - // Description match - descriptionMatches.push(match); - } else { - // Spanning match - labelMatches.push({ - start: 0, - end: match.end - pathLength - }); - descriptionMatches.push({ - start: match.start, - end: pathLength - }); - } - } - - return [labelMatches, descriptionMatches]; - } - private onDidColorThemeChange(): void { for (const [template, data] of this.renderedResources) { this.renderIcon(template, data); @@ -1017,7 +1017,7 @@ interface HistoryItemChangeTemplate { readonly disposables: IDisposable; } -class HistoryItemChangeRenderer implements ICompressibleTreeRenderer, void, HistoryItemChangeTemplate> { +class HistoryItemChangeRenderer implements ICompressibleTreeRenderer, FuzzyScore | LabelFuzzyScore, HistoryItemChangeTemplate> { static readonly TEMPLATE_ID = 'historyItemChange'; get templateId(): string { return HistoryItemChangeRenderer.TEMPLATE_ID; } @@ -1036,24 +1036,37 @@ class HistoryItemChangeRenderer implements ICompressibleTreeRenderer, void>, index: number, templateData: HistoryItemChangeTemplate, height: number | undefined): void { + renderElement(node: ITreeNode, FuzzyScore | LabelFuzzyScore>, index: number, templateData: HistoryItemChangeTemplate, height: number | undefined): void { const historyItemChangeOrFolder = node.element; const uri = ResourceTree.isResourceNode(historyItemChangeOrFolder) ? historyItemChangeOrFolder.element?.uri ?? historyItemChangeOrFolder.uri : historyItemChangeOrFolder.uri; const fileKind = ResourceTree.isResourceNode(historyItemChangeOrFolder) ? FileKind.FOLDER : FileKind.FILE; const hidePath = this.viewMode() === ViewMode.Tree; - templateData.fileLabel.setFile(uri, { fileDecorations: { colors: false, badges: true }, fileKind, hidePath, }); + let matches: IMatch[] | undefined; + let descriptionMatches: IMatch[] | undefined; + + if (ResourceTree.isResourceNode(historyItemChangeOrFolder)) { + if (!historyItemChangeOrFolder.element) { + matches = createMatches(node.filterData as FuzzyScore | undefined); + } + } else { + [matches, descriptionMatches] = processResourceFilterData(uri, node.filterData); + } + + templateData.fileLabel.setFile(uri, { fileDecorations: { colors: false, badges: true }, fileKind, hidePath, matches, descriptionMatches }); } - renderCompressedElements(node: ITreeNode>, void>, index: number, templateData: HistoryItemChangeTemplate, height: number | undefined): void { + renderCompressedElements(node: ITreeNode>, FuzzyScore | LabelFuzzyScore>, index: number, templateData: HistoryItemChangeTemplate, height: number | undefined): void { const compressed = node.element as ICompressedTreeNode>; const folder = compressed.elements[compressed.elements.length - 1]; const label = compressed.elements.map(e => e.name); + const matches = createMatches(node.filterData as FuzzyScore | undefined); templateData.fileLabel.setResource({ resource: folder.uri, name: label }, { fileDecorations: { colors: false, badges: true }, fileKind: FileKind.FOLDER, + matches, separator: this.labelService.getSeparator(folder.uri.scheme) }); }