@@ -27,6 +27,8 @@ class ViewportInfo:
2727 fov : float | Quantity | None = None
2828 wcs : WCS | None = None
2929 largest_dimension : int | None = None
30+ stretch : BaseStretch | None = None
31+ cuts : BaseInterval | tuple [numbers .Real , numbers .Real ] | None = None
3032
3133@dataclass
3234class ImageViewer :
@@ -42,8 +44,6 @@ class ImageViewer:
4244 zoom_level : float = 1
4345 _cursor : str = ImageViewerInterface .ALLOWED_CURSOR_LOCATIONS [0 ]
4446 marker : Any = "marker"
45- _cuts : BaseInterval | tuple [numbers .Real , numbers .Real ] = AsymmetricPercentileInterval (upper_percentile = 95 )
46- _stretch : BaseStretch = LinearStretch
4747 # viewer: Any
4848
4949 # Allowed locations for cursor display
@@ -70,24 +70,37 @@ def __post_init__(self):
7070 self ._images [None ].fov = None
7171 self ._images [None ].wcs = None
7272
73- def get_stretch (self ) -> BaseStretch :
74- return self ._stretch
73+ def get_stretch (self , image_label : str | None = None ) -> BaseStretch :
74+ image_label = self ._resolve_image_label (image_label )
75+ if image_label not in self ._images :
76+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
77+ return self ._images [image_label ].stretch
7578
76- def set_stretch (self , value : BaseStretch ) -> None :
79+ def set_stretch (self , value : BaseStretch , image_label : str | None = None ) -> None :
7780 if not isinstance (value , BaseStretch ):
7881 raise ValueError (f"Stretch option { value } is not valid. Must be an Astropy.visualization Stretch object." )
79- self ._stretch = value
82+ image_label = self ._resolve_image_label (image_label )
83+ if image_label not in self ._images :
84+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
85+ self ._images [image_label ].stretch = value
8086
81- def get_cuts (self ) -> tuple :
82- return self ._cuts
87+ def get_cuts (self , image_label : str | None = None ) -> tuple :
88+ image_label = self ._resolve_image_label (image_label )
89+ if image_label not in self ._images :
90+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
91+ return self ._images [image_label ].cuts
8392
84- def set_cuts (self , value : tuple [numbers .Real , numbers .Real ] | BaseInterval ) -> None :
93+ def set_cuts (self , value : tuple [numbers .Real , numbers .Real ] | BaseInterval , image_label : str | None = None ) -> None :
8594 if isinstance (value , tuple ) and len (value ) == 2 :
8695 self ._cuts = ManualInterval (value [0 ], value [1 ])
8796 elif isinstance (value , BaseInterval ):
8897 self ._cuts = value
8998 else :
9099 raise ValueError ("Cuts must be an Astropy.visualization Interval object or a tuple of two values." )
100+ image_label = self ._resolve_image_label (image_label )
101+ if image_label not in self ._images :
102+ raise ValueError (f"Image label '{ image_label } ' not found. Please load an image first." )
103+ self ._images [image_label ].cuts = self ._cuts
91104
92105 @property
93106 def cursor (self ) -> str :
0 commit comments