@@ -509,100 +509,92 @@ export function useTimelineEditing({
509509 return [ ...flatMembers , ...domMembers ] ;
510510 } ;
511511
512- const stableAudioGroupAttribute = useStableHandlers (
513- {
514- ...setAudioGroupAttribute ,
515- // Same two-array member lookup syncStoredGroupAttribute mirrors into
516- // (timelineAudioGroupVolume.ts): a sub-composition's group members have
517- // no flat twin, only a domClipChildren entry, so both are checked.
518- setQuiet : track (
519- guard ( audioGroupMembers , setAudioGroupAttribute . setQuiet , ( reason , groupId , attr ) => {
520- setAudioGroupAttribute . revertLive ( groupId , attr ) ;
512+ const audioGroupAttribute = {
513+ ...setAudioGroupAttribute ,
514+ // Same two-array member lookup syncStoredGroupAttribute mirrors into
515+ // (timelineAudioGroupVolume.ts): a sub-composition's group members have
516+ // no flat twin, only a domClipChildren entry, so both are checked.
517+ setQuiet : track (
518+ guard ( audioGroupMembers , setAudioGroupAttribute . setQuiet , ( reason , groupId , attr ) => {
519+ setAudioGroupAttribute . revertLive ( groupId , attr ) ;
520+ return refused ( reason ) ;
521+ } ) ,
522+ ) ,
523+ } ;
524+ const stableAudioGroupAttribute = useStableHandlers ( audioGroupAttribute , projectId ) ;
525+ const elementFxAttribute = {
526+ ...setElementFxAttribute ,
527+ setMany : track ( guard ( ( edits ) => edits . map ( ( edit ) => edit . element ) , setElementsAttribute ) ) ,
528+ setQuiet : track (
529+ guard (
530+ ( element ) => [ element ] ,
531+ setElementFxAttribute . setQuiet ,
532+ ( reason , element , attr ) => {
533+ setElementFxAttribute . revertLive ( element , attr ) ;
521534 return refused ( reason ) ;
522- } ) ,
535+ } ,
523536 ) ,
524- } ,
525- projectId ,
526- ) ;
527- const stableElementFxAttribute = useStableHandlers (
528- {
529- ...setElementFxAttribute ,
530- setMany : track ( guard ( ( edits ) => edits . map ( ( edit ) => edit . element ) , setElementsAttribute ) ) ,
531- setQuiet : track (
532- guard (
533- ( element ) => [ element ] ,
534- setElementFxAttribute . setQuiet ,
535- ( reason , element , attr ) => {
536- setElementFxAttribute . revertLive ( element , attr ) ;
537- return refused ( reason ) ;
538- } ,
539- ) ,
540- ) ,
541- } ,
542- projectId ,
543- ) ;
537+ ) ,
538+ } ;
539+ const stableElementFxAttribute = useStableHandlers ( elementFxAttribute , projectId ) ;
544540 // Every write-handler is tracked here, the one place all hand edits
545541 // converge, so undo never races a write; canEdit gates the same point.
546542 // Coverage boundary: see the PR body, not every kind resolves an element.
547543 const trackedRazorSplit = track (
548544 guard ( ( element ) => withLinkPartners ( [ element ] ) , handleRazorSplit ) ,
549545 ) ;
550- return useStableHandlers (
551- {
552- handleTimelineElementMove : track ( guard ( ( element ) => [ element ] , handleTimelineElementMove ) ) ,
553- handleTimelineElementResize : track (
554- guard ( ( element ) => [ element ] , handleTimelineElementResize ) ,
546+ const editing = {
547+ handleTimelineElementMove : track ( guard ( ( element ) => [ element ] , handleTimelineElementMove ) ) ,
548+ handleTimelineElementResize : track ( guard ( ( element ) => [ element ] , handleTimelineElementResize ) ) ,
549+ handleToggleTrackHidden : track (
550+ guard (
551+ ( trackIndex ) => timelineElements . filter ( ( el ) => el . track === trackIndex ) ,
552+ handleToggleTrackHidden ,
555553 ) ,
556- handleToggleTrackHidden : track (
557- guard (
558- ( trackIndex ) => timelineElements . filter ( ( el ) => el . track === trackIndex ) ,
559- handleToggleTrackHidden ,
560- ) ,
554+ ) ,
555+ handleToggleElementHidden : track (
556+ guard ( ( elementKey ) => {
557+ const keys = new Set ( Array . isArray ( elementKey ) ? elementKey : [ elementKey ] ) ;
558+ return timelineElements . filter ( ( el ) => keys . has ( el . key ?? el . id ) ) ;
559+ } , handleToggleElementHidden ) ,
560+ ) ,
561+ handleAutoGroupCarveSources : track ( handleAutoGroupCarveSources ) ,
562+ setAudioGroupAttribute : stableAudioGroupAttribute ,
563+ setElementFxAttribute : stableElementFxAttribute ,
564+ handleTimelineElementDelete : track (
565+ guard ( ( element ) => withLinkPartners ( [ element ] ) , linkEditing . handleLinkedElementDelete ) ,
566+ ) ,
567+ handleTimelineElementsDelete : track (
568+ guard ( withLinkPartners , linkEditing . handleLinkedElementsDelete ) ,
569+ ) ,
570+ handleTimelineElementDeleteOnly : track (
571+ guard ( ( element ) => [ element ] , linkEditing . handleDeleteElementOnly ) ,
572+ ) ,
573+ handleLinkEdit : track ( guard ( linkEditTargets , linkEditing . handleLinkEdit ) ) ,
574+ handleTimelineElementSplit : trackedRazorSplit ,
575+ handleRazorSplit : trackedRazorSplit ,
576+ handleFreezeFrame : track ( guard ( ( element ) => [ element ] , handleFreezeFrame ) ) ,
577+ // Same selection the handler itself splits (useRazorSplit.ts).
578+ handleRazorSplitAll : track (
579+ guard (
580+ ( splitTime ) => selectSplittableElements ( usePlayerStore . getState ( ) . elements , splitTime ) ,
581+ handleRazorSplitAll ,
561582 ) ,
562- handleToggleElementHidden : track (
563- guard ( ( elementKey ) => {
564- const keys = new Set ( Array . isArray ( elementKey ) ? elementKey : [ elementKey ] ) ;
565- return timelineElements . filter ( ( el ) => keys . has ( el . key ?? el . id ) ) ;
566- } , handleToggleElementHidden ) ,
567- ) ,
568- handleAutoGroupCarveSources : track ( handleAutoGroupCarveSources ) ,
569- setAudioGroupAttribute : stableAudioGroupAttribute ,
570- setElementFxAttribute : stableElementFxAttribute ,
571- handleTimelineElementDelete : track (
572- guard ( ( element ) => withLinkPartners ( [ element ] ) , linkEditing . handleLinkedElementDelete ) ,
573- ) ,
574- handleTimelineElementsDelete : track (
575- guard ( withLinkPartners , linkEditing . handleLinkedElementsDelete ) ,
576- ) ,
577- handleTimelineElementDeleteOnly : track (
578- guard ( ( element ) => [ element ] , linkEditing . handleDeleteElementOnly ) ,
579- ) ,
580- handleLinkEdit : track ( guard ( linkEditTargets , linkEditing . handleLinkEdit ) ) ,
581- handleTimelineElementSplit : trackedRazorSplit ,
582- handleRazorSplit : trackedRazorSplit ,
583- handleFreezeFrame : track ( guard ( ( element ) => [ element ] , handleFreezeFrame ) ) ,
584- // Same selection the handler itself splits (useRazorSplit.ts).
585- handleRazorSplitAll : track (
586- guard (
587- ( splitTime ) => selectSplittableElements ( usePlayerStore . getState ( ) . elements , splitTime ) ,
588- handleRazorSplitAll ,
589- ) ,
590- ) ,
591- handleTimelineAssetDrop : track ( handleTimelineAssetDrop ) ,
592- handleTimelineFileDrop : track ( handleTimelineFileDrop ) ,
593- handleTimelineCompositionDrop : track ( handleTimelineCompositionDrop ) ,
594- handleBlockedTimelineEdit,
595- handleTimelineGroupMove : track (
596- guard ( ( changes ) => changes . map ( ( c ) => c . element ) , groupEditing . handleTimelineGroupMove ) ,
597- ) ,
598- handleTimelineGroupResize : track (
599- guard ( ( changes ) => changes . map ( ( c ) => c . element ) , groupEditing . handleTimelineGroupResize ) ,
600- ) ,
601- restoreLiveLanes : ( restore : Parameters < typeof setElementFxAttribute . restoreLive > [ 0 ] ) => {
602- setElementFxAttribute . restoreLive ( restore ) ;
603- setAudioGroupAttribute . restoreLive ( restore ) ;
604- } ,
583+ ) ,
584+ handleTimelineAssetDrop : track ( handleTimelineAssetDrop ) ,
585+ handleTimelineFileDrop : track ( handleTimelineFileDrop ) ,
586+ handleTimelineCompositionDrop : track ( handleTimelineCompositionDrop ) ,
587+ handleBlockedTimelineEdit,
588+ handleTimelineGroupMove : track (
589+ guard ( ( changes ) => changes . map ( ( c ) => c . element ) , groupEditing . handleTimelineGroupMove ) ,
590+ ) ,
591+ handleTimelineGroupResize : track (
592+ guard ( ( changes ) => changes . map ( ( c ) => c . element ) , groupEditing . handleTimelineGroupResize ) ,
593+ ) ,
594+ restoreLiveLanes : ( restore : Parameters < typeof setElementFxAttribute . restoreLive > [ 0 ] ) => {
595+ setElementFxAttribute . restoreLive ( restore ) ;
596+ setAudioGroupAttribute . restoreLive ( restore ) ;
605597 } ,
606- projectId ,
607- ) ;
598+ } ;
599+ return useStableHandlers ( editing , projectId ) ;
608600}
0 commit comments