4040
4141_viewer_count = 1
4242_codecs_registered = False
43- CellWatcher () # Instantiate the singleton class right away
43+ _cell_watcher = None
44+ if ENVIRONMENT is not Env .HYPHA :
45+ _cell_watcher = CellWatcher () # Instantiate the singleton class right away
4446
4547
4648class ViewerRPC :
@@ -49,7 +51,7 @@ class ViewerRPC:
4951 def __init__ (
5052 self , ui_collapsed = True , rotate = False , ui = "pydata-sphinx" , init_data = None , parent = None , ** add_data_kwargs
5153 ):
52- global _codecs_registered
54+ global _codecs_registered , _cell_watcher
5355 """Create a viewer."""
5456 # Register codecs if they haven't been already
5557 if not _codecs_registered and ENVIRONMENT is not Env .HYPHA :
@@ -64,7 +66,7 @@ def __init__(
6466 self .wid = None
6567 self .parent = parent
6668 if ENVIRONMENT is not Env .JUPYTERLITE :
67- CellWatcher () .add_viewer (self .parent )
69+ _cell_watcher and _cell_watcher .add_viewer (self .parent )
6870 if ENVIRONMENT is not Env .HYPHA :
6971 self .viewer_event = threading .Event ()
7072 self .data_event = threading .Event ()
@@ -74,7 +76,7 @@ async def setup(self):
7476
7577 async def run (self , ctx ):
7678 """ImJoy plugin setup function."""
77- global _viewer_count
79+ global _viewer_count , _cell_watcher
7880 ui = self ._init_viewer_kwargs .get ("ui" , None )
7981 config = build_config (ui )
8082
@@ -102,7 +104,7 @@ async def run(self, ctx):
102104 )
103105 if not defer_for_data_render (self .init_data ):
104106 # Once the viewer has been created any queued requests can be run
105- CellWatcher () .update_viewer_status (self .parent , True )
107+ _cell_watcher .update_viewer_status (self .parent , True )
106108 asyncio .get_running_loop ().call_soon_threadsafe (self .viewer_event .set )
107109
108110 # Wait and then update the screenshot in case rendered level changed
@@ -139,14 +141,16 @@ def update_screenshot(self, base64_image):
139141 self .img .display (html )
140142
141143 def update_viewer_status (self ):
142- if not CellWatcher ().viewer_ready (self .parent ):
143- CellWatcher ().update_viewer_status (self .parent , True )
144+ global _cell_watcher
145+ if not _cell_watcher .viewer_ready (self .parent ):
146+ _cell_watcher .update_viewer_status (self .parent , True )
144147
145148 def set_event (self , event_data ):
146149 if not self .data_event .is_set ():
147150 # Once the data has been set the deferred queue requests can be run
148151 asyncio .get_running_loop ().call_soon_threadsafe (self .data_event .set )
149- self .update_viewer_status ()
152+ if ENVIRONMENT is not Env .HYPHA :
153+ self .update_viewer_status ()
150154
151155
152156class Viewer :
@@ -166,7 +170,6 @@ def __init__(
166170 self .viewer_rpc = ViewerRPC (
167171 ui_collapsed = ui_collapsed , rotate = rotate , ui = ui , init_data = data , parent = self .name , ** add_data_kwargs
168172 )
169- self .cw = CellWatcher ()
170173 if ENVIRONMENT is not Env .JUPYTERLITE :
171174 self ._setup_queueing ()
172175 api .export (self .viewer_rpc )
@@ -219,9 +222,10 @@ def queue_worker(self):
219222 loop .run_until_complete (task )
220223
221224 def call_getter (self , future ):
225+ global _cell_watcher
222226 name = uuid .uuid4 ()
223- CellWatcher () .results [name ] = future
224- future .add_done_callback (functools .partial (CellWatcher () ._callback , name ))
227+ _cell_watcher .results [name ] = future
228+ future .add_done_callback (functools .partial (_cell_watcher ._callback , name ))
225229
226230 def queue_request (self , method , * args , ** kwargs ):
227231 if (
@@ -275,6 +279,7 @@ async def get_cropping_planes(self):
275279
276280 @fetch_value
277281 def set_image (self , image : Image , name : str = 'Image' ):
282+ global _cell_watcher
278283 render_type = _detect_render_type (image , 'image' )
279284 if render_type is RenderType .IMAGE :
280285 image = _get_viewer_image (image , label = False )
@@ -286,7 +291,7 @@ def set_image(self, image: Image, name: str = 'Image'):
286291 svc .set_label_or_image ('image' )
287292 else :
288293 self .queue_request ('setImage' , image , name )
289- CellWatcher () .update_viewer_status (self .name , False )
294+ _cell_watcher and _cell_watcher .update_viewer_status (self .name , False )
290295 elif render_type is RenderType .POINT_SET :
291296 image = _get_viewer_point_set (image )
292297 self .queue_request ('setPointSets' , image )
@@ -531,6 +536,7 @@ async def get_roi_slice(self, scale: int = -1):
531536
532537 @fetch_value
533538 def compare_images (self , fixed_image : Union [str , Image ], moving_image : Union [str , Image ], method : str = None , image_mix : float = None , checkerboard : bool = None , pattern : Union [Tuple [int , int ], Tuple [int , int , int ]] = None , swap_image_order : bool = None ):
539+ global _cell_watcher
534540 # image args may be image name or image object
535541 fixed_name = 'Fixed'
536542 if isinstance (fixed_image , str ):
@@ -555,10 +561,11 @@ def compare_images(self, fixed_image: Union[str, Image], moving_image: Union[str
555561 if swap_image_order is not None :
556562 options ['swapImageOrder' ] = swap_image_order
557563 self .queue_request ('compareImages' , fixed_name , moving_name , options )
558- CellWatcher () .update_viewer_status (self .name , False )
564+ _cell_watcher and _cell_watcher .update_viewer_status (self .name , False )
559565
560566 @fetch_value
561567 def set_label_image (self , label_image : Image ):
568+ global _cell_watcher
562569 render_type = _detect_render_type (label_image , 'image' )
563570 if render_type is RenderType .IMAGE :
564571 label_image = _get_viewer_image (label_image , label = True )
@@ -570,7 +577,7 @@ def set_label_image(self, label_image: Image):
570577 svc .set_label_or_image ('label_image' )
571578 else :
572579 self .queue_request ('setLabelImage' , label_image )
573- CellWatcher () .update_viewer_status (self .name , False )
580+ _cell_watcher and _cell_watcher .update_viewer_status (self .name , False )
574581 elif render_type is RenderType .POINT_SET :
575582 label_image = _get_viewer_point_set (label_image )
576583 self .queue_request ('setPointSets' , label_image )
0 commit comments