@@ -7,12 +7,13 @@ import {
77 OnZoomingHandler ,
88 OnPointerMoveHandler ,
99 OnPointerDownHandler ,
10+ OnDragHandler ,
1011} from "../canvas-event-target" ;
1112import { get_hovering_target , centerOf } from "../math" ;
1213import { utils } from "@design-sdk/core" ;
1314import { LazyFrame } from "@code-editor/canvas/lazy-frame" ;
1415import { HudCustomRenderers , HudSurface } from "./hud-surface" ;
15- import type { Box , XY , CanvasTransform } from "../types" ;
16+ import type { Box , XY , CanvasTransform , XYWH } from "../types" ;
1617import type { FrameOptimizationFactors } from "../frame" ;
1718const designq = utils . query ;
1819
@@ -48,10 +49,23 @@ type CanvasCustomRenderers = HudCustomRenderers & {
4849
4950interface CanvsPreferences {
5051 can_highlight_selected_layer ?: boolean ;
52+ marquee : MarqueeOprions ;
53+ }
54+
55+ interface MarqueeOprions {
56+ /**
57+ * disable marquee - events and selection with dragging.
58+ *
59+ * @default false
60+ */
61+ disabled ?: boolean ;
5162}
5263
5364const default_canvas_preferences : CanvsPreferences = {
5465 can_highlight_selected_layer : false ,
66+ marquee : {
67+ disabled : false ,
68+ } ,
5569} ;
5670
5771interface HovringNode {
@@ -117,6 +131,8 @@ export function Canvas({
117131 ? [ offset [ 0 ] / zoom , offset [ 1 ] / zoom ]
118132 : [ 0 , 0 ] ;
119133 const [ isPanning , setIsPanning ] = useState ( false ) ;
134+ const [ marquee , setMarquee ] = useState < XYWH > ( null ) ;
135+
120136 const cvtransform : CanvasTransform = {
121137 scale : zoom ,
122138 xy : offset ,
@@ -207,6 +223,29 @@ export function Canvas({
207223 setOffset ( [ newx , newy ] ) ;
208224 } ;
209225
226+ const onDrag : OnDragHandler = ( s ) => {
227+ const [ x1 , y1 ] = s . initial ;
228+ const [ x2 , y2 ] = [
229+ // @ts -ignore
230+ s . event . clientX ,
231+ // @ts -ignore
232+ s . event . clientY ,
233+ ] ;
234+
235+ const [ ox , oy ] = offset ;
236+ const [ x , y , w , h ] = [
237+ x1 - ox ,
238+ y1 - oy ,
239+ x2 - x1 , // w
240+ y2 - y1 , // h
241+ ] ;
242+ setMarquee ( [ x , y , w , h ] ) ;
243+ } ;
244+
245+ const onDragEnd : OnDragHandler = ( s ) => {
246+ setMarquee ( null ) ;
247+ } ;
248+
210249 const is_canvas_transforming = isPanning || isZooming ;
211250 const selected_nodes = selectedNodes
212251 ?. map ( ( id ) => designq . find_node_by_id_under_inpage_nodes ( id , nodes ) )
@@ -217,6 +256,9 @@ export function Canvas({
217256 node [ "filekey" ] = filekey ;
218257 return (
219258 < LazyFrame key = { node . id } xy = { [ node . x , node . y ] } size = { node } >
259+ { /* 👇 dev only (for performance tracking) 👇 */ }
260+ { /* <div style={{ width: "100%", height: "100%", background: "grey" }} /> */ }
261+ { /* 👆 ----------------------------------- 👆 */ }
220262 { renderItem ( {
221263 node : node as ReflectSceneNode & { filekey : string } ,
222264 zoom, // ? use scaled_zoom ?
@@ -257,12 +299,17 @@ export function Canvas({
257299 onPointerMoveStart = { ( ) => { } }
258300 onPointerMoveEnd = { ( ) => { } }
259301 onPointerDown = { onPointerDown }
302+ onDrag = { onDrag }
303+ onDragStart = { ( ) => { } } // TODO:
304+ onDragEnd = { onDragEnd }
260305 >
261306 < HudSurface
262307 offset = { nonscaled_offset }
263308 zoom = { zoom }
264309 hide = { is_canvas_transforming }
265310 readonly = { readonly }
311+ disableMarquee = { config . marquee . disabled }
312+ marquee = { marquee }
266313 labelDisplayNodes = { nodes }
267314 selectedNodes = { selected_nodes }
268315 highlights = {
0 commit comments