@@ -2546,29 +2546,24 @@ export default function App() {
25462546 [ runtime , currentId ] ,
25472547 ) ;
25482548
2549- const handleEditRoi = useCallback ( async ( ) => {
2550- if ( ! runtime || ! currentId ) return ;
2551- const segs = await runtime . getSignalRoi ( currentId ) ;
2552- // "Edit numerically" now opens the docked ROI panel (no modal) with
2553- // the coordinate form, selecting the first ROI. Drawing stays
2554- // disarmed so the plot keeps pan/zoom until the user picks a tool.
2549+ const handleToggleRoiEditMode = useCallback ( async ( ) => {
2550+ if ( roiEditMode ) {
2551+ // Leaving the editor: disarm drawing and clear the active selection.
2552+ setRoiEditMode ( false ) ;
2553+ setRoiDrawGeometry ( null ) ;
2554+ setSelectedRoiIndex ( null ) ;
2555+ return ;
2556+ }
2557+ // Entering the unified ROI editor: load the current ROI, arm the
2558+ // range-draw tool so a first ROI can be traced immediately, and
2559+ // pre-select the first ROI (if any) so its coordinate form opens at once.
2560+ const segs =
2561+ runtime && currentId ? await runtime . getSignalRoi ( currentId ) : [ ] ;
25552562 setRoi ( segs ) ;
2556- setRoiDrawGeometry ( null ) ;
2563+ setRoiDrawGeometry ( "segment" ) ;
25572564 setSelectedRoiIndex ( segs . length > 0 ? 0 : null ) ;
25582565 setRoiEditMode ( true ) ;
2559- } , [ runtime , currentId ] ) ;
2560-
2561- const handleToggleRoiEditMode = useCallback ( ( ) => {
2562- setRoiEditMode ( ( m ) => {
2563- const next = ! m ;
2564- // Entering edit mode arms the range-draw tool so the user can trace
2565- // a first ROI immediately (even when none exists yet); leaving it
2566- // disarms drawing and clears the active selection.
2567- setRoiDrawGeometry ( next ? "segment" : null ) ;
2568- if ( ! next ) setSelectedRoiIndex ( null ) ;
2569- return next ;
2570- } ) ;
2571- } , [ ] ) ;
2566+ } , [ roiEditMode , runtime , currentId ] ) ;
25722567
25732568 // Live-edit callback fed by the plot when the user drags a ROI handle or
25742569 // draws a brand-new rectangle in edit mode. The backend is updated with
@@ -2758,16 +2753,6 @@ export default function App() {
27582753 // Image ROI handlers (Phase 13)
27592754 // ------------------------------------------------------------------
27602755
2761- const handleImageEditRoi = useCallback ( async ( ) => {
2762- if ( ! runtime || ! currentId ) return ;
2763- const segs = await runtime . getImageRoi ( currentId ) ;
2764- // Open the docked ROI panel (no modal) with the coordinate form.
2765- setImageRoi ( segs ) ;
2766- setRoiDrawGeometry ( null ) ;
2767- setSelectedRoiIndex ( segs . length > 0 ? 0 : null ) ;
2768- setImageRoiEditMode ( true ) ;
2769- } , [ runtime , currentId ] ) ;
2770-
27712756 const handleImageAddRectangle = useCallback ( async ( ) => {
27722757 if ( ! runtime || ! currentId || ! imageData ) return ;
27732758 const sx = ( imageData . width * imageData . dx ) / 4 || 1 ;
@@ -2813,22 +2798,26 @@ export default function App() {
28132798 await runtime . setImageRoi ( currentId , next ) ;
28142799 } , [ runtime , currentId , imageRoi , imageData ] ) ;
28152800
2816- const handleToggleImageRoiEditMode = useCallback ( ( ) => {
2817- setImageRoiEditMode ( ( m ) => {
2818- const next = ! m ;
2819- // Entering edit mode arms the rectangle-draw tool so a first ROI can
2820- // be traced right away; leaving it disarms drawing and clears the
2821- // active selection. ROI editing and the erase session are mutually
2822- // exclusive, so entering one leaves the other.
2823- setRoiDrawGeometry ( next ? "rectangle" : null ) ;
2824- if ( next ) {
2825- setImageEraseMode ( false ) ;
2826- setEraseRegions ( [ ] ) ;
2827- }
2828- if ( ! next ) setSelectedRoiIndex ( null ) ;
2829- return next ;
2830- } ) ;
2831- } , [ ] ) ;
2801+ const handleToggleImageRoiEditMode = useCallback ( async ( ) => {
2802+ if ( imageRoiEditMode ) {
2803+ setImageRoiEditMode ( false ) ;
2804+ setRoiDrawGeometry ( null ) ;
2805+ setSelectedRoiIndex ( null ) ;
2806+ return ;
2807+ }
2808+ // Entering the unified ROI editor: load the current ROI, arm the
2809+ // rectangle-draw tool, and pre-select the first ROI (if any) so its
2810+ // coordinate form opens at once. ROI editing and the erase session are
2811+ // mutually exclusive, so entering one leaves the other.
2812+ const segs =
2813+ runtime && currentId ? await runtime . getImageRoi ( currentId ) : [ ] ;
2814+ setImageRoi ( segs ) ;
2815+ setImageEraseMode ( false ) ;
2816+ setEraseRegions ( [ ] ) ;
2817+ setRoiDrawGeometry ( "rectangle" ) ;
2818+ setSelectedRoiIndex ( segs . length > 0 ? 0 : null ) ;
2819+ setImageRoiEditMode ( true ) ;
2820+ } , [ imageRoiEditMode , runtime , currentId ] ) ;
28322821
28332822 // Live-edit callback fed by the plot when the user drags a ROI handle
28342823 // or draws a brand-new shape in edit mode. The backend is updated with
@@ -3903,7 +3892,6 @@ export default function App() {
39033892 ...( treeKind === "signal"
39043893 ? buildRoiActions ( roi , roiEditMode , hasRoiClipboard , {
39053894 onToggleEditMode : handleToggleRoiEditMode ,
3906- onEditNumerically : handleEditRoi ,
39073895 onExtractEach : handleRoiExtractEach ,
39083896 onExtractMerged : handleRoiExtractMerged ,
39093897 onCopy : handleRoiCopy ,
@@ -3918,7 +3906,6 @@ export default function App() {
39183906 onAddRectangle : handleImageAddRectangle ,
39193907 onAddCircle : handleImageAddCircle ,
39203908 onCreateGrid : handleCreateRoiGrid ,
3921- onEditNumerically : handleImageEditRoi ,
39223909 onExtractEach : handleImageRoiExtractEach ,
39233910 onExtractMerged : handleImageRoiExtractMerged ,
39243911 onCopy : handleImageRoiCopy ,
@@ -3955,7 +3942,6 @@ export default function App() {
39553942 handleDeleteAll ,
39563943 handleApplyFeature ,
39573944 handleEditProperties ,
3958- handleEditRoi ,
39593945 handleToggleRoiEditMode ,
39603946 handleRoiExtractEach ,
39613947 handleRoiExtractMerged ,
@@ -3968,7 +3954,6 @@ export default function App() {
39683954 handleImageAddRectangle ,
39693955 handleImageAddCircle ,
39703956 handleCreateRoiGrid ,
3971- handleImageEditRoi ,
39723957 handleImageRoiExtractEach ,
39733958 handleToggleImageRoiEditMode ,
39743959 handleImageRoiExtractMerged ,
0 commit comments