Skip to content

Commit a2acd13

Browse files
authored
SCM - history item now supports searching (microsoft#209070)
1 parent e49b522 commit a2acd13

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

src/vs/workbench/contrib/scm/browser/scmViewPane.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ interface HistoryItemTemplate {
899899
readonly disposables: IDisposable;
900900
}
901901

902-
class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTreeElement, void, HistoryItemTemplate> {
902+
class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTreeElement, LabelFuzzyScore, HistoryItemTemplate> {
903903

904904
static readonly TEMPLATE_ID = 'history-item';
905905
get templateId(): string { return HistoryItemRenderer.TEMPLATE_ID; }
@@ -915,7 +915,7 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
915915

916916
const element = append(container, $('.history-item'));
917917

918-
const iconLabel = new IconLabel(element, { supportIcons: true });
918+
const iconLabel = new IconLabel(element, { supportIcons: true, supportHighlights: true, supportDescriptionHighlights: true });
919919
const iconContainer = prepend(iconLabel.element, $('.icon-container'));
920920

921921
const disposables = new DisposableStore();
@@ -931,15 +931,16 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
931931
return { iconContainer, label: iconLabel, actionBar, statsContainer, filesLabel, insertionsLabel, deletionsLabel, elementDisposables: new DisposableStore(), disposables };
932932
}
933933

934-
renderElement(node: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
934+
renderElement(node: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
935935
const historyItem = node.element;
936936

937937
templateData.iconContainer.className = 'icon-container';
938938
if (historyItem.icon && ThemeIcon.isThemeIcon(historyItem.icon)) {
939939
templateData.iconContainer.classList.add(...ThemeIcon.asClassNameArray(historyItem.icon));
940940
}
941941

942-
templateData.label.setLabel(historyItem.label, historyItem.description);
942+
const [matches, descriptionMatches] = this.processMatches(historyItem, node.filterData);
943+
templateData.label.setLabel(historyItem.label, historyItem.description, { matches, descriptionMatches });
943944

944945
templateData.actionBar.clear();
945946
templateData.actionBar.context = historyItem;
@@ -953,11 +954,22 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
953954
this.renderStatistics(node, index, templateData, height);
954955
}
955956

956-
renderCompressedElements(node: ITreeNode<ICompressedTreeNode<SCMHistoryItemTreeElement>, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
957+
renderCompressedElements(node: ITreeNode<ICompressedTreeNode<SCMHistoryItemTreeElement>, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
957958
throw new Error('Should never happen since node is incompressible');
958959
}
959960

960-
private renderStatistics(node: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
961+
private processMatches(historyItem: SCMHistoryItemTreeElement, filterData: LabelFuzzyScore | undefined): [IMatch[] | undefined, IMatch[] | undefined] {
962+
if (!filterData) {
963+
return [undefined, undefined];
964+
}
965+
966+
return [
967+
historyItem.label === filterData.label ? createMatches(filterData.score) : undefined,
968+
historyItem.description === filterData.label ? createMatches(filterData.score) : undefined
969+
];
970+
}
971+
972+
private renderStatistics(node: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
961973
const historyItem = node.element;
962974

963975
if (historyItem.statistics) {
@@ -988,9 +1000,10 @@ class HistoryItemRenderer implements ICompressibleTreeRenderer<SCMHistoryItemTre
9881000
templateData.statsContainer.classList.toggle('hidden', historyItem.statistics === undefined);
9891001
}
9901002

991-
disposeElement(element: ITreeNode<SCMHistoryItemTreeElement, void>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
1003+
disposeElement(element: ITreeNode<SCMHistoryItemTreeElement, LabelFuzzyScore>, index: number, templateData: HistoryItemTemplate, height: number | undefined): void {
9921004
templateData.elementDisposables.clear();
9931005
}
1006+
9941007
disposeTemplate(templateData: HistoryItemTemplate): void {
9951008
templateData.disposables.dispose();
9961009
}
@@ -1289,7 +1302,10 @@ export class SCMTreeKeyboardNavigationLabelProvider implements ICompressibleKeyb
12891302
} else if (isSCMHistoryItemGroupTreeElement(element)) {
12901303
return element.label;
12911304
} else if (isSCMHistoryItemTreeElement(element)) {
1292-
return element.label;
1305+
// For a history item we want to match both the message and
1306+
// the author. A match in the message takes precedence over
1307+
// a match in the author.
1308+
return [element.label, element.description];
12931309
} else if (isSCMViewSeparator(element)) {
12941310
return element.label;
12951311
} else {

0 commit comments

Comments
 (0)