1- from typing import Any , List , Optional , Tuple
1+ from typing import Any , Dict , List , Optional , Tuple , Union
22
33import napari
44import numpy .typing as npt
5- from magicgui import magicgui
6- from magicgui .widgets import ComboBox
7- from qtpy .QtWidgets import QWidget
5+ from qtpy .QtWidgets import QComboBox , QLabel , QVBoxLayout , QWidget
86
97from .base import NapariMPLWidget
108from .util import Interval
@@ -27,9 +25,7 @@ def __init__(
2725 parent : Optional [QWidget ] = None ,
2826 ):
2927 super ().__init__ (napari_viewer , parent = parent )
30-
3128 self .add_single_axes ()
32- self .update_layers (None )
3329
3430 def clear (self ) -> None :
3531 """
@@ -124,54 +120,51 @@ def __init__(
124120 parent : Optional [QWidget ] = None ,
125121 ):
126122 super ().__init__ (napari_viewer , parent = parent )
127- self ._key_selection_function_gui = magicgui (
128- self ._set_axis_keys ,
129- x_axis_key = {"choices" : self ._get_valid_axis_keys },
130- y_axis_key = {"choices" : self ._get_valid_axis_keys },
131- call_button = "plot" ,
132- )
133- _key_selection_widget = self ._key_selection_function_gui .native
134- _key_selection_widget .setParent (self )
135- self .layout ().addWidget (_key_selection_widget )
123+
124+ self .layout ().addLayout (QVBoxLayout ())
125+
126+ self ._selectors : Dict [str , QComboBox ] = {}
127+ for dim in ["x" , "y" ]:
128+ self ._selectors [dim ] = QComboBox ()
129+ # Re-draw when combo boxes are updated
130+ self ._selectors [dim ].currentTextChanged .connect (self ._draw )
131+
132+ self .layout ().addWidget (QLabel (f"{ dim } -axis:" ))
133+ self .layout ().addWidget (self ._selectors [dim ])
134+
135+ self .update_layers (None )
136136
137137 @property
138- def x_axis_key (self ) -> Optional [str ]:
138+ def x_axis_key (self ) -> Union [str , None ]:
139139 """
140140 Key to access x axis data from the FeaturesTable.
141141 """
142- return self ._x_axis_key
142+ if self ._selectors ["x" ].count () == 0 :
143+ return None
144+ else :
145+ return self ._selectors ["x" ].currentText ()
143146
144147 @x_axis_key .setter
145- def x_axis_key (self , key : Optional [ str ] ) -> None :
146- self ._x_axis_key = key
148+ def x_axis_key (self , key : str ) -> None :
149+ self ._selectors [ "x" ]. setCurrentText ( key )
147150 self ._draw ()
148151
149152 @property
150- def y_axis_key (self ) -> Optional [str ]:
153+ def y_axis_key (self ) -> Union [str , None ]:
151154 """
152155 Key to access y axis data from the FeaturesTable.
153156 """
154- return self ._y_axis_key
157+ if self ._selectors ["y" ].count () == 0 :
158+ return None
159+ else :
160+ return self ._selectors ["y" ].currentText ()
155161
156162 @y_axis_key .setter
157- def y_axis_key (self , key : Optional [str ]) -> None :
158- """
159- Set the y-axis key.
160- """
161- self ._y_axis_key = key
162- self ._draw ()
163-
164- def _set_axis_keys (self , x_axis_key : str , y_axis_key : str ) -> None :
165- """
166- Set both axis keys and then redraw the plot.
167- """
168- self ._x_axis_key = x_axis_key
169- self ._y_axis_key = y_axis_key
163+ def y_axis_key (self , key : str ) -> None :
164+ self ._selectors ["y" ].setCurrentText (key )
170165 self ._draw ()
171166
172- def _get_valid_axis_keys (
173- self , combo_widget : Optional [ComboBox ] = None
174- ) -> List [str ]:
167+ def _get_valid_axis_keys (self ) -> List [str ]:
175168 """
176169 Get the valid axis keys from the layer FeatureTable.
177170
@@ -195,11 +188,12 @@ def _ready_to_scatter(self) -> bool:
195188 return False
196189
197190 feature_table = self .layers [0 ].features
191+ valid_keys = self ._get_valid_axis_keys ()
198192 return (
199193 feature_table is not None
200194 and len (feature_table ) > 0
201- and self .x_axis_key is not None
202- and self .y_axis_key is not None
195+ and self .x_axis_key in valid_keys
196+ and self .y_axis_key in valid_keys
203197 )
204198
205199 def draw (self ) -> None :
@@ -240,9 +234,9 @@ def _on_update_layers(self) -> None:
240234 """
241235 Called when the layer selection changes by ``self.update_layers()``.
242236 """
243- if hasattr ( self , "_key_selection_widget" ):
244- self . _key_selection_function_gui . reset_choices ()
245-
246- # reset the axis keys
247- self . _x_axis_key = None
248- self . _y_axis_key = None
237+ # Clear combobox
238+ for dim in [ "x" , "y" ]:
239+ while self . _selectors [ dim ]. count () > 0 :
240+ self . _selectors [ dim ]. removeItem ( 0 )
241+ # Add keys for newly selected layer
242+ self . _selectors [ dim ]. addItems ( self . _get_valid_axis_keys ())
0 commit comments