Improve performance of rendering during search
Optimize the tree view rendering during searches by enhancing the render queue ordering. This update changes the rendering order to prioritize visible nodes, leading to faster appearance of these nodes during searches. The ordering logic now ignores the depth in the hierarchy and instead focused on the node order. The collapsed check for the node itself is removed, ensuring that visible collapsed parents are first while their invisible children are rendered later.
This commit is contained in:
@@ -1,29 +0,0 @@
|
||||
import { ReadOnlyTreeNode } from '../../Node/TreeNode';
|
||||
import { RenderQueueOrderer } from './RenderQueueOrderer';
|
||||
|
||||
export class CollapseDepthOrderer implements RenderQueueOrderer {
|
||||
public orderNodes(nodes: Iterable<ReadOnlyTreeNode>): ReadOnlyTreeNode[] {
|
||||
return orderNodes(nodes);
|
||||
}
|
||||
}
|
||||
|
||||
function orderNodes(nodes: Iterable<ReadOnlyTreeNode>): ReadOnlyTreeNode[] {
|
||||
return [...nodes]
|
||||
.sort((a, b) => {
|
||||
const [aCollapseStatus, bCollapseStatus] = [isNodeCollapsed(a), isNodeCollapsed(b)];
|
||||
if (aCollapseStatus !== bCollapseStatus) {
|
||||
return (aCollapseStatus ? 1 : 0) - (bCollapseStatus ? 1 : 0);
|
||||
}
|
||||
return a.hierarchy.depthInTree - b.hierarchy.depthInTree;
|
||||
});
|
||||
}
|
||||
|
||||
function isNodeCollapsed(node: ReadOnlyTreeNode): boolean {
|
||||
if (!node.state.current.isExpanded) {
|
||||
return true;
|
||||
}
|
||||
if (node.hierarchy.parent) {
|
||||
return isNodeCollapsed(node.hierarchy.parent);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { ReadOnlyTreeNode } from '../../Node/TreeNode';
|
||||
import { RenderQueueOrderer } from './RenderQueueOrderer';
|
||||
|
||||
export class CollapsedParentOrderer implements RenderQueueOrderer {
|
||||
public orderNodes(nodes: Iterable<ReadOnlyTreeNode>): ReadOnlyTreeNode[] {
|
||||
return orderNodes(nodes);
|
||||
}
|
||||
}
|
||||
|
||||
function orderNodes(nodes: Iterable<ReadOnlyTreeNode>): ReadOnlyTreeNode[] {
|
||||
return [...nodes]
|
||||
.map((node, index) => ({ node, index }))
|
||||
.sort((a, b) => {
|
||||
const [
|
||||
isANodeOfCollapsedParent,
|
||||
isBNodeOfCollapsedParent,
|
||||
] = [isParentCollapsed(a.node), isParentCollapsed(b.node)];
|
||||
if (isANodeOfCollapsedParent !== isBNodeOfCollapsedParent) {
|
||||
return (isANodeOfCollapsedParent ? 1 : 0) - (isBNodeOfCollapsedParent ? 1 : 0);
|
||||
}
|
||||
return a.index - b.index;
|
||||
})
|
||||
.map(({ node }) => node);
|
||||
}
|
||||
|
||||
function isParentCollapsed(node: ReadOnlyTreeNode): boolean {
|
||||
const parentNode = node.hierarchy.parent;
|
||||
if (parentNode) {
|
||||
if (!parentNode.state.current.isExpanded) {
|
||||
return true;
|
||||
}
|
||||
return isParentCollapsed(parentNode);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import { NodeRenderingStrategy } from './Scheduling/NodeRenderingStrategy';
|
||||
import { DelayScheduler } from './DelayScheduler';
|
||||
import { TimeoutDelayScheduler } from './Scheduling/TimeoutDelayScheduler';
|
||||
import { RenderQueueOrderer } from './Ordering/RenderQueueOrderer';
|
||||
import { CollapseDepthOrderer } from './Ordering/CollapseDepthOrderer';
|
||||
import { CollapsedParentOrderer } from './Ordering/CollapsedParentOrderer';
|
||||
|
||||
/**
|
||||
* Renders tree nodes gradually to prevent UI freeze when loading large amounts of nodes.
|
||||
@@ -21,7 +21,7 @@ export function useGradualNodeRendering(
|
||||
scheduler: DelayScheduler = new TimeoutDelayScheduler(),
|
||||
initialBatchSize = 30,
|
||||
subsequentBatchSize = 5,
|
||||
orderer: RenderQueueOrderer = new CollapseDepthOrderer(),
|
||||
orderer: RenderQueueOrderer = new CollapsedParentOrderer(),
|
||||
): NodeRenderingStrategy {
|
||||
const nodesToRender = new Set<ReadOnlyTreeNode>();
|
||||
const nodesBeingRendered = shallowRef(new Set<ReadOnlyTreeNode>());
|
||||
|
||||
Reference in New Issue
Block a user