@@ -122,6 +122,7 @@ def __init__(
122
122
super ().__init__ (parent = parent )
123
123
124
124
# ATTRIBUTES ----------------------------------------------------
125
+ self ._data_wrapper : DataWrapper | None = None
125
126
126
127
# mapping of key to a list of objects that control image nodes in the canvas
127
128
self ._img_handles : defaultdict [ImgKey , list [PImageHandle ]] = defaultdict (list )
@@ -235,8 +236,7 @@ def __init__(
235
236
# SETUP ------------------------------------------------------
236
237
237
238
self .set_channel_mode (channel_mode )
238
- if data is not None :
239
- self .set_data (data )
239
+ self .set_data (data )
240
240
241
241
# ------------------- PUBLIC API ----------------------------
242
242
@property
@@ -245,13 +245,15 @@ def dims_sliders(self) -> DimsSliders:
245
245
return self ._dims_sliders
246
246
247
247
@property
248
- def data_wrapper (self ) -> DataWrapper :
248
+ def data_wrapper (self ) -> DataWrapper | None :
249
249
"""Return the DataWrapper object around the datastore."""
250
250
return self ._data_wrapper
251
251
252
252
@property
253
253
def data (self ) -> Any :
254
254
"""Return the data backing the view."""
255
+ if self ._data_wrapper is None :
256
+ return None
255
257
return self ._data_wrapper .data
256
258
257
259
@data .setter
@@ -277,6 +279,14 @@ def set_data(
277
279
or slices that define the slice of the data to display. If not provided,
278
280
the initial index will be set to the middle of the data.
279
281
"""
282
+ # clear current data
283
+ if data is None :
284
+ self ._data_wrapper = None
285
+ self ._clear_images ()
286
+ self ._dims_sliders .clear ()
287
+ self ._data_info_label .setText ("" )
288
+ return
289
+
280
290
# store the data
281
291
self ._data_wrapper = DataWrapper .create (data )
282
292
@@ -351,6 +361,9 @@ def set_ndim(self, ndim: Literal[2, 3]) -> None:
351
361
self ._ndims = ndim
352
362
self ._canvas .set_ndim (ndim )
353
363
364
+ if self ._data_wrapper is None :
365
+ return
366
+
354
367
# set the visibility of the last non-channel dimension
355
368
sizes = list (self ._data_wrapper .sizes ())
356
369
if self ._channel_axis is not None :
@@ -360,8 +373,7 @@ def set_ndim(self, ndim: Literal[2, 3]) -> None:
360
373
self ._dims_sliders .set_dimension_visible (dim3 , True if ndim == 2 else False )
361
374
362
375
# clear image handles and redraw
363
- if self ._img_handles :
364
- self .refresh ()
376
+ self .refresh ()
365
377
366
378
def set_channel_mode (self , mode : ChannelMode | str | None = None ) -> None :
367
379
"""Set the mode for displaying the channels.
@@ -393,8 +405,7 @@ def set_channel_mode(self, mode: ChannelMode | str | None = None) -> None:
393
405
self ._channel_axis , mode != ChannelMode .COMPOSITE
394
406
)
395
407
396
- if self ._img_handles :
397
- self .refresh ()
408
+ self .refresh ()
398
409
399
410
def refresh (self ) -> None :
400
411
"""Refresh the canvas."""
@@ -439,6 +450,9 @@ def _update_slider_ranges(self) -> None:
439
450
440
451
If `sizes` is not provided, sizes will be inferred from the datastore.
441
452
"""
453
+ if self ._data_wrapper is None :
454
+ return
455
+
442
456
maxes = self ._data_wrapper .sizes ()
443
457
self ._dims_sliders .setMaxima ({k : v - 1 for k , v in maxes .items ()})
444
458
@@ -472,6 +486,8 @@ def _update_data_for_index(self, index: Indices) -> None:
472
486
makes a request for the new data slice and queues _on_data_future_done to be
473
487
called when the data is ready.
474
488
"""
489
+ if self ._data_wrapper is None :
490
+ return
475
491
if (
476
492
self ._channel_axis is not None
477
493
and self ._channel_mode == ChannelMode .COMPOSITE
0 commit comments