@@ -47,6 +47,11 @@ const default_canvas_preferences: CanvsPreferences = {
4747 can_highlight_selected_layer : false ,
4848} ;
4949
50+ interface HovringNode {
51+ node : ReflectSceneNode ;
52+ reason : "frame-title" | "raycast" | "external" ;
53+ }
54+
5055export function Canvas ( {
5156 renderItem,
5257 onSelectNode,
@@ -68,12 +73,14 @@ export function Canvas({
6873 const [ xy , setXY ] = useState < [ number , number ] > ( INITIAL_XY ) ;
6974 const [ isPanning , setIsPanning ] = useState ( false ) ;
7075
76+ const node = ( id ) => designq . find_node_by_id_under_inpage_nodes ( id , nodes ) ;
77+
7178 const wshighlight = highlightedLayer
72- ? designq . find_node_by_id_under_inpage_nodes ( highlightedLayer , nodes )
79+ ? ( { node : node ( highlightedLayer ) , reason : "external" } as HovringNode )
7380 : null ;
7481
7582 const [ hoveringLayer , setHoveringLayer ] =
76- useState < ReflectSceneNode | null > ( wshighlight ) ;
83+ useState < HovringNode | null > ( wshighlight ) ;
7784
7885 useEffect ( ( ) => {
7986 setHoveringLayer ( wshighlight ) ;
@@ -92,15 +99,33 @@ export function Canvas({
9299 offset : xy ,
93100 margin : LAYER_HOVER_HIT_MARGIN ,
94101 } ) ;
95- setHoveringLayer ( hovering ) ;
102+
103+ if ( ! hovering ) {
104+ if (
105+ hoveringLayer &&
106+ hoveringLayer . node &&
107+ hoveringLayer . reason === "frame-title"
108+ ) {
109+ // skip
110+ } else {
111+ setHoveringLayer ( null ) ;
112+ }
113+ } else {
114+ setHoveringLayer ( { node : hovering , reason : "raycast" } ) ;
115+ }
96116 } ;
97117
98118 const onPointerDown : OnPointerDownHandler = ( state ) => {
99119 if ( isPanning || isZooming ) {
100120 return ;
101121 }
102122 if ( hoveringLayer ) {
103- onSelectNode ( hoveringLayer ) ;
123+ switch ( hoveringLayer . reason ) {
124+ case "frame-title" :
125+ case "raycast" :
126+ onSelectNode ( hoveringLayer . node ) ;
127+ break ;
128+ }
104129 } else {
105130 onClearSelection ( ) ;
106131 }
@@ -176,23 +201,29 @@ export function Canvas({
176201 </ DisableBackdropFilter >
177202 </ CanvasTransformRoot >
178203 < HudSurface
179- xy = { xy }
204+ offset = { xy }
180205 zoom = { zoom }
181206 hide = { is_canvas_transforming }
182207 readonly = { readonly }
183208 labelDisplayNodes = { nodes }
184209 selectedNodes = { selected_nodes }
185210 highlights = {
186- hoveringLayer
211+ hoveringLayer ?. node
187212 ? ( config . can_highlight_selected_layer
188- ? [ hoveringLayer ]
189- : noduplicates ( [ hoveringLayer ] , selected_nodes )
213+ ? [ hoveringLayer . node ]
214+ : noduplicates ( [ hoveringLayer . node ] , selected_nodes )
190215 ) . map ( ( h ) => ( {
191216 id : h . id ,
192217 xywh : [ h . absoluteX , h . absoluteY , h . width , h . height ] ,
193218 } ) )
194219 : [ ]
195220 }
221+ onHoverNode = { ( id ) => {
222+ setHoveringLayer ( { node : node ( id ) , reason : "frame-title" } ) ;
223+ } }
224+ onSelectNode = { ( id ) => {
225+ onSelectNode ( node ( id ) ) ;
226+ } }
196227 />
197228 </ >
198229 ) ;
0 commit comments