1919
2020from typing import TYPE_CHECKING
2121
22+ import numpy as np
2223from guidata .configtools import get_icon , get_image_layout
2324from guidata .dataset import DataSet , FloatItem
2425from guidata .qthelpers import add_actions , create_action
3738from plotpy .tools import AntiAliasingTool , BasePlotMenuTool , SelectPointTool , SelectTool
3839
3940if TYPE_CHECKING : # pragma: no cover
40- from collections .abc import Callable
41+ from collections .abc import Callable , Generator
4142
4243 from qtpy .QtWidgets import QWidget
4344
@@ -65,14 +66,10 @@ def __init__(self, parent: QWidget = None) -> None:
6566 self .antialiased = False
6667
6768 # a dict of dict : plot -> selected items -> HistogramItem
68- self ._tracked_items : dict [BasePlot , dict [BaseImageItem , CurveItem ]] = {}
69+ self ._tracked_items : dict [BasePlot , dict [BaseImageItem , HistogramItem ]] = {}
6970 self .param = CurveParam (_ ("Curve" ), icon = "curve.png" )
7071 self .param .read_config (CONF , "histogram" , "curve" )
7172
72- self .histparam = HistogramParam (_ ("Histogram" ), icon = "histogram.png" )
73- self .histparam .logscale = False
74- self .histparam .n_bins = 256
75-
7673 self .range = XRangeSelection (0 , 1 )
7774 self .range_mono_color = self .range .shapeparam .sel_line .color
7875 self .range_multi_color = CONF .get ("histogram" , "range/multi/color" , "red" )
@@ -103,11 +100,13 @@ def connect_plot(self, plot: BasePlot) -> None:
103100 plot .SIG_ITEM_REMOVED .connect (self .item_removed )
104101 plot .SIG_ACTIVE_ITEM_CHANGED .connect (self .active_item_changed )
105102
106- def tracked_items_gen (self ) -> tuple [BaseImageItem , CurveItem ]:
103+ def tracked_items_gen (
104+ self ,
105+ ) -> Generator [tuple [BaseImageItem , HistogramItem ], None , None ]:
107106 """Generator of tracked items"""
108- for plot , items in list (self ._tracked_items .items ()):
109- for item in list (items .items ()):
110- yield item # tuple item,curve
107+ for _plot , items in list (self ._tracked_items .items ()):
108+ for item_curve_tuple in list (items .items ()):
109+ yield item_curve_tuple # tuple item,curve
111110
112111 def __del_known_items (self , known_items : dict , items : list ) -> None :
113112 """Delete known items
@@ -129,7 +128,9 @@ def selection_changed(self, plot: BasePlot) -> None:
129128 Args:
130129 plot: plot whose selection changed
131130 """
132- items = plot .get_selected_items (item_type = IVoiImageItemType )
131+ items : list [BaseImageItem ] = plot .get_selected_items (
132+ item_type = IVoiImageItemType
133+ )
133134 known_items = self ._tracked_items .setdefault (plot , {})
134135
135136 if items :
@@ -153,13 +154,10 @@ def selection_changed(self, plot: BasePlot) -> None:
153154
154155 for item in items :
155156 if item not in known_items :
156- imin , imax = item .get_lut_range_full ()
157- delta = int (float (imax ) - float (imin ))
158- if delta > 0 and delta < 256 :
159- self .histparam .n_bins = delta
160- else :
161- self .histparam .n_bins = 256
162- curve = HistogramItem (self .param , self .histparam , keep_weakref = True )
157+ histparam = HistogramParam (_ ("Histogram" ), icon = "histogram.png" )
158+ histparam .logscale = False
159+ histparam .n_bins = 256
160+ curve = HistogramItem (self .param , histparam , keep_weakref = True )
163161 curve .set_hist_source (item )
164162 self .add_item (curve , z = 0 )
165163 known_items [item ] = curve
@@ -170,8 +168,18 @@ def selection_changed(self, plot: BasePlot) -> None:
170168 return
171169 self .param .shade = 1.0 / nb_selected
172170 for item , curve in self .tracked_items_gen ():
171+ if np .issubdtype (item .data .dtype , np .integer ):
172+ # For integer data, we use the full range of data type
173+ info = np .iinfo (item .data .dtype )
174+ curve .histparam .bin_min = info .min
175+ curve .histparam .bin_max = info .max
176+ curve .histparam .n_bins = min (info .max - info .min + 1 , 256 )
177+ else :
178+ curve .histparam .bin_min = None
179+ curve .histparam .bin_max = None
180+ curve .histparam .n_bins = 256
173181 self .param .update_item (curve )
174- self .histparam .update_hist (curve )
182+ curve .histparam .update_hist (curve )
175183
176184 self .active_item_changed (plot )
177185
0 commit comments