Highlight tree nodes when monitored event matches

Summary: Tree node flashes to highlight an event occured

Reviewed By: lblasa

Differential Revision: D42996554

fbshipit-source-id: fc51a76ce7e33d041d094fedc91f05338b907bec
This commit is contained in:
Luke De Feo
2023-02-06 04:33:11 -08:00
committed by Facebook GitHub Bot
parent 8fc97f2caa
commit dc9c445f9e

View File

@@ -64,6 +64,7 @@ export function Tree2({
const frameworkEventsMonitoring = useValue( const frameworkEventsMonitoring = useValue(
instance.uiState.frameworkEventMonitoring, instance.uiState.frameworkEventMonitoring,
); );
const highlightedNodes = useValue(instance.uiState.highlightedNodes);
const {treeNodes, refs} = useMemo(() => { const {treeNodes, refs} = useMemo(() => {
const treeNodes = toTreeNodes( const treeNodes = toTreeNodes(
@@ -126,6 +127,7 @@ export function Tree2({
treeNode={treeNode} treeNode={treeNode}
frameworkEvents={frameworkEvents} frameworkEvents={frameworkEvents}
frameworkEventsMonitoring={frameworkEventsMonitoring} frameworkEventsMonitoring={frameworkEventsMonitoring}
highlightedNodes={highlightedNodes}
selectedNode={selectedNode} selectedNode={selectedNode}
hoveredNode={hoveredNode} hoveredNode={hoveredNode}
isUsingKBToScroll={isUsingKBToScroll} isUsingKBToScroll={isUsingKBToScroll}
@@ -150,6 +152,7 @@ const MemoTreeItemContainer = React.memo(
prevProps.treeNode === nextProps.treeNode && prevProps.treeNode === nextProps.treeNode &&
prevProps.isContextMenuOpen === nextProps.isContextMenuOpen && prevProps.isContextMenuOpen === nextProps.isContextMenuOpen &&
prevProps.frameworkEvents === nextProps.frameworkEvents && prevProps.frameworkEvents === nextProps.frameworkEvents &&
prevProps.highlightedNodes === nextProps.highlightedNodes &&
prevProps.frameworkEventsMonitoring === prevProps.frameworkEventsMonitoring ===
nextProps.frameworkEventsMonitoring && nextProps.frameworkEventsMonitoring &&
prevProps.hoveredNode !== id && //make sure that prev or next hover/selected node doesnt concern this tree node prevProps.hoveredNode !== id && //make sure that prev or next hover/selected node doesnt concern this tree node
@@ -200,6 +203,7 @@ function TreeItemContainer({
treeNode, treeNode,
frameworkEvents, frameworkEvents,
frameworkEventsMonitoring, frameworkEventsMonitoring,
highlightedNodes,
selectedNode, selectedNode,
hoveredNode, hoveredNode,
isUsingKBToScroll, isUsingKBToScroll,
@@ -212,6 +216,7 @@ function TreeItemContainer({
innerRef: Ref<any>; innerRef: Ref<any>;
treeNode: TreeNode; treeNode: TreeNode;
frameworkEvents: Map<Id, FrameworkEvent[]>; frameworkEvents: Map<Id, FrameworkEvent[]>;
highlightedNodes: Set<Id>;
frameworkEventsMonitoring: Map<FrameworkEventType, boolean>; frameworkEventsMonitoring: Map<FrameworkEventType, boolean>;
selectedNode?: Id; selectedNode?: Id;
hoveredNode?: Id; hoveredNode?: Id;
@@ -227,8 +232,9 @@ function TreeItemContainer({
{treeNode.indentGuide != null && ( {treeNode.indentGuide != null && (
<IndentGuide indentGuide={treeNode.indentGuide} /> <IndentGuide indentGuide={treeNode.indentGuide} />
)} )}
<TreeItemContent <TreeItemRow
ref={innerRef} ref={innerRef}
isHighlighted={highlightedNodes.has(treeNode.id)}
isSelected={treeNode.id === selectedNode} isSelected={treeNode.id === selectedNode}
isHovered={hoveredNode === treeNode.id} isHovered={hoveredNode === treeNode.id}
onMouseEnter={() => { onMouseEnter={() => {
@@ -262,7 +268,7 @@ function TreeItemContainer({
frameworkEvents={frameworkEvents} frameworkEvents={frameworkEvents}
frameworkEventsMonitoring={frameworkEventsMonitoring} frameworkEventsMonitoring={frameworkEventsMonitoring}
/> />
</TreeItemContent> </TreeItemRow>
</div> </div>
); );
} }
@@ -323,11 +329,12 @@ function InlineAttributes({attributes}: {attributes: Record<string, string>}) {
const TreeItemHeight = '26px'; const TreeItemHeight = '26px';
const HalfTreeItemHeight = `calc(${TreeItemHeight} / 2)`; const HalfTreeItemHeight = `calc(${TreeItemHeight} / 2)`;
const TreeItemContent = styled.li<{ const TreeItemRow = styled.li<{
item: TreeNode; item: TreeNode;
isHovered: boolean; isHovered: boolean;
isSelected: boolean; isSelected: boolean;
}>(({item, isHovered, isSelected}) => ({ isHighlighted: boolean;
}>(({item, isHovered, isSelected, isHighlighted}) => ({
display: 'flex', display: 'flex',
alignItems: 'baseline', alignItems: 'baseline',
height: TreeItemHeight, height: TreeItemHeight,
@@ -336,7 +343,12 @@ const TreeItemContent = styled.li<{
borderRadius: '3px', borderRadius: '3px',
borderColor: isHovered ? theme.selectionBackgroundColor : 'transparent', borderColor: isHovered ? theme.selectionBackgroundColor : 'transparent',
borderStyle: 'solid', borderStyle: 'solid',
backgroundColor: isSelected ? theme.selectionBackgroundColor : theme.white,
backgroundColor: isHighlighted
? 'rgba(255,0,0,.3)'
: isSelected
? theme.selectionBackgroundColor
: theme.white,
})); }));
function ExpandedIconOrSpace(props: { function ExpandedIconOrSpace(props: {