Skip to content

Commit 74a91ba

Browse files
authored
Fix compressed navigator indent highlight (#13162)
1 parent d0a09a9 commit 74a91ba

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

packages/core/src/browser/tree/tree-compression/compressed-tree-widget.tsx

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ export class CompressedTreeWidget extends TreeViewWelcomeWidget {
5858
}
5959
}
6060

61+
protected override shouldRenderIndent(node: TreeNode): boolean {
62+
return !this.compressionToggle.compress
63+
|| !this.compressionService.isCompressionParticipant(node)
64+
|| this.compressionService.getCompressionHead(node) === node;
65+
}
66+
6167
protected override shouldDisplayNode(node: TreeNode): boolean {
6268
if (this.compressionToggle.compress && this.compressionService.isCompressionParticipant(node) && !this.compressionService.isCompressionHead(node)) {
6369
return false;
@@ -66,14 +72,18 @@ export class CompressedTreeWidget extends TreeViewWelcomeWidget {
6672
}
6773

6874
protected override getDepthForNode(node: TreeNode, depths: Map<CompositeTreeNode | undefined, number>): number {
69-
if (!this.compressionToggle.compress) { return super.getDepthForNode(node, depths); }
75+
if (!this.compressionToggle.compress) {
76+
return super.getDepthForNode(node, depths);
77+
}
7078
const parent = this.compressionService.getCompressionHead(node.parent) ?? node.parent;
7179
const parentDepth = depths.get(parent);
7280
return parentDepth === undefined ? 0 : TreeNode.isVisible(node.parent) ? parentDepth + 1 : parentDepth;
7381
}
7482

7583
protected override toNodeRow(node: TreeNode, index: number, depth: number): CompressedNodeRow {
76-
if (!this.compressionToggle.compress) { return super.toNodeRow(node, index, depth); }
84+
if (!this.compressionToggle.compress) {
85+
return super.toNodeRow(node, index, depth);
86+
}
7787
const row: CompressedNodeRow = { node, index, depth };
7888
if (this.compressionService.isCompressionHead(node)) {
7989
row.compressionChain = this.compressionService.getCompressionChain(node);
@@ -102,7 +112,9 @@ export class CompressedTreeWidget extends TreeViewWelcomeWidget {
102112
}
103113

104114
protected override getCaptionChildren(node: TreeNode, props: CompressedNodeProps): React.ReactNode {
105-
if (!this.compressionToggle.compress || !props.compressionChain) { return super.getCaptionChildren(node, props); }
115+
if (!this.compressionToggle.compress || !props.compressionChain) {
116+
return super.getCaptionChildren(node, props);
117+
}
106118
return props.compressionChain.map((subNode, index, self) => {
107119
const classes = ['theia-tree-compressed-label-part'];
108120
if (SelectableTreeNode.isSelected(subNode)) {
@@ -129,21 +141,27 @@ export class CompressedTreeWidget extends TreeViewWelcomeWidget {
129141
}
130142

131143
protected override handleUp(event: KeyboardEvent): void {
132-
if (!this.compressionToggle.compress) { return super.handleUp(event); }
144+
if (!this.compressionToggle.compress) {
145+
return super.handleUp(event);
146+
}
133147
const type = this.props.multiSelect && this.hasShiftMask(event) ? TreeSelection.SelectionType.RANGE : undefined;
134148
this.model.selectPrevRow(type);
135149
this.node.focus();
136150
}
137151

138152
protected override handleDown(event: KeyboardEvent): void {
139-
if (!this.compressionToggle.compress) { return super.handleDown(event); }
153+
if (!this.compressionToggle.compress) {
154+
return super.handleDown(event);
155+
}
140156
const type = this.props.multiSelect && this.hasShiftMask(event) ? TreeSelection.SelectionType.RANGE : undefined;
141157
this.model.selectNextRow(type);
142158
this.node.focus();
143159
}
144160

145161
protected override async handleLeft(event: KeyboardEvent): Promise<void> {
146-
if (!this.compressionToggle.compress) { return super.handleLeft(event); }
162+
if (!this.compressionToggle.compress) {
163+
return super.handleLeft(event);
164+
}
147165
if (Boolean(this.props.multiSelect) && (this.hasCtrlCmdMask(event) || this.hasShiftMask(event))) {
148166
return;
149167
}
@@ -160,7 +178,9 @@ export class CompressedTreeWidget extends TreeViewWelcomeWidget {
160178
}
161179

162180
protected override async handleRight(event: KeyboardEvent): Promise<void> {
163-
if (!this.compressionToggle.compress) { return super.handleRight(event); }
181+
if (!this.compressionToggle.compress) {
182+
return super.handleRight(event);
183+
}
164184
if (Boolean(this.props.multiSelect) && (this.hasCtrlCmdMask(event) || this.hasShiftMask(event))) {
165185
return;
166186
}

packages/core/src/browser/tree/tree-widget.tsx

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -894,22 +894,33 @@ export class TreeWidget extends ReactWidget implements StatefulWidget {
894894
let current: TreeNode | undefined = node;
895895
let depth = props.depth;
896896
while (current && depth) {
897-
const classNames: string[] = [TREE_NODE_INDENT_GUIDE_CLASS];
898-
if (this.needsActiveIndentGuideline(current)) {
899-
classNames.push('active');
900-
} else {
901-
classNames.push(renderIndentGuides === 'onHover' ? 'hover' : 'always');
897+
if (this.shouldRenderIndent(current)) {
898+
const classNames: string[] = [TREE_NODE_INDENT_GUIDE_CLASS];
899+
if (this.needsActiveIndentGuideline(current)) {
900+
classNames.push('active');
901+
} else {
902+
classNames.push(renderIndentGuides === 'onHover' ? 'hover' : 'always');
903+
}
904+
const paddingLeft = this.getDepthPadding(depth);
905+
indentDivs.unshift(<div key={depth} className={classNames.join(' ')} style={{
906+
paddingLeft: `${paddingLeft}px`
907+
}} />);
908+
depth--;
902909
}
903-
const paddingLeft = this.getDepthPadding(depth);
904-
indentDivs.unshift(<div key={depth} className={classNames.join(' ')} style={{
905-
paddingLeft: `${paddingLeft}px`
906-
}} />);
907910
current = current.parent;
908-
depth--;
909911
}
910912
return indentDivs;
911913
}
912914

915+
/**
916+
* Determines whether an indentation div should be rendered for the specified tree node.
917+
* If there are multiple tree nodes inside of a single rendered row,
918+
* this method should only return true for the first node.
919+
*/
920+
protected shouldRenderIndent(node: TreeNode): boolean {
921+
return true;
922+
}
923+
913924
protected needsActiveIndentGuideline(node: TreeNode): boolean {
914925
const parent = node.parent;
915926
if (!parent || !this.isExpandable(parent)) {

0 commit comments

Comments
 (0)