More context menu options in the tree

Summary:
Added ability to copy element name and any inline attributes

Changelog:
UI Debugger - Added extra context menu items for copying element name and attributes
UI Debugger - Added open in Android studio button
UI Debugger - Improve speed of loading the Open in IDE buttons

Reviewed By: lblasa

Differential Revision: D43153666

fbshipit-source-id: 8b440d77444cd6849388e7e9d348da4527db5baf
This commit is contained in:
Luke De Feo
2023-02-15 08:27:19 -08:00
committed by Facebook GitHub Bot
parent feded6403c
commit 96bed18df2

View File

@@ -8,9 +8,17 @@
*/ */
import {FrameworkEvent, FrameworkEventType, Id, UINode} from '../types'; import {FrameworkEvent, FrameworkEventType, Id, UINode} from '../types';
import React, {Ref, RefObject, useEffect, useMemo, useRef} from 'react'; import React, {
ReactNode,
Ref,
RefObject,
useEffect,
useMemo,
useRef,
} from 'react';
import { import {
Atom, Atom,
getFlipperLib,
HighlightManager, HighlightManager,
HighlightProvider, HighlightProvider,
styled, styled,
@@ -109,8 +117,8 @@ export function Tree2({
text={searchTerm} text={searchTerm}
highlightColor={theme.searchHighlightBackground.yellow}> highlightColor={theme.searchHighlightBackground.yellow}>
<ContextMenu <ContextMenu
focusedNode={focusedNode} focusedNodeId={focusedNode}
hoveredNode={hoveredNode} hoveredNodeId={hoveredNode}
nodes={nodes} nodes={nodes}
onContextMenuOpen={instance.uiActions.onContextMenuOpen} onContextMenuOpen={instance.uiActions.onContextMenuOpen}
onFocusNode={instance.uiActions.onFocusNode}> onFocusNode={instance.uiActions.onFocusNode}>
@@ -407,18 +415,44 @@ const renderDepthOffset = 8;
const ContextMenu: React.FC<{ const ContextMenu: React.FC<{
nodes: Map<Id, UINode>; nodes: Map<Id, UINode>;
hoveredNode?: Id; hoveredNodeId?: Id;
focusedNode?: Id; focusedNodeId?: Id;
onFocusNode: (id?: Id) => void; onFocusNode: (id?: Id) => void;
onContextMenuOpen: (open: boolean) => void; onContextMenuOpen: (open: boolean) => void;
}> = ({ }> = ({
nodes, nodes,
hoveredNode, hoveredNodeId,
children, children,
focusedNode, focusedNodeId,
onFocusNode, onFocusNode,
onContextMenuOpen, onContextMenuOpen,
}) => { }) => {
const copyItems: ReactNode[] = [];
const hoveredNode = nodes.get(hoveredNodeId ?? Number.MAX_SAFE_INTEGER);
if (hoveredNode) {
copyItems.push(<Menu.Divider />);
copyItems.push(
<UIDebuggerMenuItem
key={'Copy Element name'}
text={'Copy Element name'}
onClick={() => {
getFlipperLib().writeTextToClipboard(hoveredNode.name);
}}
/>,
);
copyItems.push(
Object.entries(hoveredNode.inlineAttributes).map(([key, value]) => (
<UIDebuggerMenuItem
key={key}
text={`Copy ${key}`}
onClick={() => {
getFlipperLib().writeTextToClipboard(value);
}}
/>
)),
);
}
return ( return (
<Dropdown <Dropdown
onVisibleChange={(visible) => { onVisibleChange={(visible) => {
@@ -426,17 +460,17 @@ const ContextMenu: React.FC<{
}} }}
overlay={() => ( overlay={() => (
<Menu> <Menu>
{hoveredNode != null && focusedNode !== hoveredNode && ( {hoveredNode != null && focusedNodeId !== hoveredNodeId && (
<UIDebuggerMenuItem <UIDebuggerMenuItem
key="focus" key="focus"
text={`Focus ${nodes.get(hoveredNode)?.name}`} text={`Focus ${hoveredNode.name}`}
onClick={() => { onClick={() => {
onFocusNode(hoveredNode); onFocusNode(hoveredNodeId);
}} }}
/> />
)} )}
{focusedNode && ( {focusedNodeId && (
<UIDebuggerMenuItem <UIDebuggerMenuItem
key="remove-focus" key="remove-focus"
text="Remove focus" text="Remove focus"
@@ -445,6 +479,7 @@ const ContextMenu: React.FC<{
}} }}
/> />
)} )}
{copyItems}
</Menu> </Menu>
)} )}
trigger={['contextMenu']}> trigger={['contextMenu']}>