88from PySide6 .QtGui import QCursor
99from PySide6 .QtWidgets import QSizePolicy , QToolTip , QVBoxLayout , QWidget
1010
11+ from interface .theme import DARK_THEME , current_theme
12+
13+
14+ def _apply_plot_theme (plot : pg .PlotWidget , title : str , x_label : str , y_label : str , theme : str ) -> None :
15+ """Apply colors to a pyqtgraph plot, which does not inherit Qt QSS."""
16+ if theme == DARK_THEME :
17+ background , foreground , axis = "#141414" , "#eeeeee" , "#6a6a6a"
18+ else :
19+ background , foreground , axis = "#ffffff" , "#202020" , "#8a8a8a"
20+ plot .setBackground (background )
21+ plot .setTitle (title , color = foreground , size = "10pt" )
22+ plot .setLabel ("bottom" , x_label , color = foreground )
23+ plot .setLabel ("left" , y_label , color = foreground )
24+ plot .getAxis ("bottom" ).setPen (pg .mkPen (axis ))
25+ plot .getAxis ("left" ).setPen (pg .mkPen (axis ))
26+ plot .getAxis ("bottom" ).setTextPen (pg .mkPen (foreground ))
27+ plot .getAxis ("left" ).setTextPen (pg .mkPen (foreground ))
28+
1129
1230class DatasetBarChartWidget (QWidget ):
1331 """Compact bar chart for dataset composition and token statistics."""
@@ -33,22 +51,18 @@ def __init__(
3351 self .labels : list [str ] = []
3452 self .values : list [float ] = []
3553 self .value_suffix = ""
54+ self .title = title
55+ self .y_label = y_label
3656
3757 layout = QVBoxLayout (self )
3858 layout .setContentsMargins (0 , 0 , 0 , 0 )
3959 layout .setSpacing (0 )
4060 pg .setConfigOptions (antialias = True )
4161 self .plot = pg .PlotWidget ()
42- self .plot .setBackground ("#141414" )
43- self .plot .setTitle (title , color = "#eeeeee" , size = "10pt" )
44- self .plot .setLabel ("left" , y_label , color = "#d7d7d7" )
62+ self .apply_theme (current_theme ())
4563 self .plot .showGrid (x = False , y = True , alpha = 0.24 )
4664 self .plot .setMenuEnabled (False )
4765 self .plot .setMouseEnabled (x = False , y = False )
48- self .plot .getAxis ("bottom" ).setPen (pg .mkPen ("#6a6a6a" ))
49- self .plot .getAxis ("left" ).setPen (pg .mkPen ("#6a6a6a" ))
50- self .plot .getAxis ("bottom" ).setTextPen (pg .mkPen ("#cfcfcf" ))
51- self .plot .getAxis ("left" ).setTextPen (pg .mkPen ("#cfcfcf" ))
5266 self .plot .getPlotItem ().setContentsMargins (8 , 8 , 8 , 8 )
5367 self .bar_item = pg .BarGraphItem (x = [], height = [], width = 0.58 , brush = pg .mkBrush ("#f5b041" ))
5468 self .plot .addItem (self .bar_item )
@@ -58,6 +72,10 @@ def __init__(
5872 layout .addWidget (self .plot )
5973 self .clear ()
6074
75+ def apply_theme (self , theme : str ) -> None :
76+ """Refresh this custom plot for the selected application theme."""
77+ _apply_plot_theme (self .plot , self .title , "" , self .y_label , theme )
78+
6179 def clear (self ) -> None :
6280 """Clear chart values."""
6381
@@ -163,17 +181,10 @@ def __init__(
163181 layout .setSpacing (0 )
164182 pg .setConfigOptions (antialias = True )
165183 self .plot = pg .PlotWidget ()
166- self .plot .setBackground ("#141414" )
167- self .plot .setTitle (title , color = "#eeeeee" , size = "11pt" )
168- self .plot .setLabel ("bottom" , "Optimizer step" , color = "#d7d7d7" )
169- self .plot .setLabel ("left" , y_label , color = "#d7d7d7" )
184+ self .apply_theme (current_theme ())
170185 self .plot .showGrid (x = True , y = True , alpha = 0.28 )
171186 self .plot .setMenuEnabled (False )
172187 self .plot .setMouseEnabled (x = True , y = True )
173- self .plot .getAxis ("bottom" ).setPen (pg .mkPen ("#6a6a6a" ))
174- self .plot .getAxis ("left" ).setPen (pg .mkPen ("#6a6a6a" ))
175- self .plot .getAxis ("bottom" ).setTextPen (pg .mkPen ("#cfcfcf" ))
176- self .plot .getAxis ("left" ).setTextPen (pg .mkPen ("#cfcfcf" ))
177188 self .plot .getPlotItem ().setContentsMargins (10 , 8 , 10 , 8 )
178189 self .legend = self .plot .addLegend (offset = (12 , 8 ), brush = pg .mkBrush (20 , 20 , 20 , 180 ), pen = pg .mkPen ("#444444" ))
179190 self .primary_curve = self .plot .plot ([], [], pen = pg .mkPen ("#f5b041" , width = 2 ), name = primary_label )
@@ -188,6 +199,10 @@ def __init__(
188199 layout .addWidget (self .plot )
189200 self ._refresh_plot ()
190201
202+ def apply_theme (self , theme : str ) -> None :
203+ """Refresh this custom plot for the selected application theme."""
204+ _apply_plot_theme (self .plot , self .title , "Optimizer step" , self .y_label , theme )
205+
191206 def clear (self ) -> None :
192207 """Remove all plotted loss values."""
193208
@@ -397,4 +412,3 @@ def _nearest_point(self, x_value: float, y_value: float) -> Optional[tuple[str,
397412 )
398413 distance = ((nearest [1 ] - x_value ) / x_span ) ** 2 + ((nearest [2 ] - y_value ) / y_span ) ** 2
399414 return nearest if distance < 0.01 else None
400-
0 commit comments