@@ -1332,11 +1332,41 @@ def _find_matching_segmentation_path(
13321332 return matching_files [0 ] if matching_files else None
13331333
13341334 for file_pattern , original_pattern in pattern_map .items ():
1335- if not re .search (original_pattern , data_value ):
1335+ matched = re .search (original_pattern , data_value )
1336+ if not matched :
13361337 continue
1337- for file in sorted (root .rglob ("*" )):
1338- if re .search (file_pattern , file .name ):
1339- return file
1338+ identifiers : list [str ] = []
1339+ identifiers .extend (
1340+ str (group )
1341+ for group in matched .groups ()
1342+ if isinstance (group , str ) and group .strip ()
1343+ )
1344+ identifiers .extend (
1345+ [
1346+ pathlib .Path (data_value ).stem ,
1347+ pathlib .Path (candidate_path ).stem ,
1348+ ]
1349+ )
1350+ identifiers = list (dict .fromkeys (idf for idf in identifiers if idf ))
1351+
1352+ candidate_roots : list [pathlib .Path ] = []
1353+ parent_name = pathlib .Path (candidate_path ).parent .name
1354+ if parent_name :
1355+ parent_scoped_root = root / parent_name
1356+ if parent_scoped_root .exists ():
1357+ candidate_roots .append (parent_scoped_root )
1358+ candidate_roots .append (root )
1359+
1360+ for search_root in candidate_roots :
1361+ matching_files = [
1362+ file
1363+ for file in sorted (search_root .rglob ("*" ))
1364+ if file .is_file ()
1365+ and re .search (file_pattern , file .name )
1366+ and any (idf in file .stem for idf in identifiers )
1367+ ]
1368+ if matching_files :
1369+ return matching_files [0 ]
13401370 return None
13411371
13421372 def _prepare_3d_label_overlay (
@@ -2619,7 +2649,7 @@ def _resolve_plotter_window_height(
26192649 return int (height_digits .group (0 ))
26202650 return 300
26212651
2622- def _add_label_overlay_toggle_control (
2652+ def _add_label_overlay_toggle_control ( # noqa: C901
26232653 self : CytoDataFrame_type ,
26242654 plotter : Any ,
26252655 overlay_actors : List [Any ],
@@ -2654,6 +2684,80 @@ def _toggle_overlay(state: Any) -> None:
26542684 size = size ,
26552685 position = position ,
26562686 )
2687+ label_text = str (display_options .get ("label_overlay_toggle_label" , "Mask" ))
2688+ label_font_size = int (
2689+ display_options .get ("label_overlay_toggle_font_size" , 9 )
2690+ )
2691+ label_gap = int (display_options .get ("label_overlay_toggle_label_gap" , 24 ))
2692+ label_shift_left = int (
2693+ display_options .get ("label_overlay_toggle_label_shift_left" , 212 )
2694+ )
2695+ estimated_text_px = int (max (32 , len (label_text ) * label_font_size * 0.95 ))
2696+ label_pos = (
2697+ max (
2698+ 0 ,
2699+ int (position [0 ]) - estimated_text_px - label_gap - label_shift_left ,
2700+ ),
2701+ max (0 , int (position [1 ]) + 10 ),
2702+ )
2703+ window_size = getattr (plotter , "window_size" , None )
2704+ window_width = 300
2705+ if (
2706+ isinstance (window_size , (tuple , list ))
2707+ and len (window_size ) >= MIN_POSITION_COMPONENTS
2708+ and isinstance (window_size [0 ], (int , float ))
2709+ ):
2710+ window_width = int (window_size [0 ])
2711+ window_width = max (1 , window_width )
2712+ window_height = max (
2713+ 1 ,
2714+ self ._resolve_plotter_window_height (
2715+ plotter = plotter ,
2716+ display_options = display_options ,
2717+ ),
2718+ )
2719+ label_pos_norm = (
2720+ max (0.01 , min (0.95 , float (label_pos [0 ]) / float (window_width ))),
2721+ max (0.01 , min (0.95 , float (label_pos [1 ]) / float (window_height ))),
2722+ )
2723+ label_name = f"cdf-label-toggle-{ uuid .uuid4 ().hex } "
2724+ text_added = False
2725+ try :
2726+ plotter .add_text (
2727+ label_text ,
2728+ position = label_pos_norm ,
2729+ font_size = label_font_size ,
2730+ color = "white" ,
2731+ name = label_name ,
2732+ viewport = True ,
2733+ shadow = True ,
2734+ )
2735+ text_added = True
2736+ except Exception :
2737+ pass
2738+ if not text_added :
2739+ try :
2740+ plotter .add_text (
2741+ label_text ,
2742+ position = label_pos ,
2743+ font_size = label_font_size ,
2744+ color = "white" ,
2745+ name = label_name ,
2746+ shadow = True ,
2747+ )
2748+ text_added = True
2749+ except Exception :
2750+ pass
2751+ if not text_added :
2752+ with contextlib .suppress (Exception ):
2753+ plotter .add_text (
2754+ label_text ,
2755+ position = "lower_right" ,
2756+ font_size = label_font_size ,
2757+ color = "white" ,
2758+ name = label_name ,
2759+ shadow = True ,
2760+ )
26572761 logger .debug ("Added 3D label overlay toggle checkbox to plotter view." )
26582762
26592763 def _toggle_overlay_actors_visibility (
0 commit comments