1
- from typing import Any , List , Optional , Tuple
1
+ from typing import Any , Dict , List , Optional , Tuple , Union
2
2
3
3
import napari
4
4
import 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
8
6
9
7
from .base import NapariMPLWidget
10
8
from .util import Interval
@@ -27,9 +25,7 @@ def __init__(
27
25
parent : Optional [QWidget ] = None ,
28
26
):
29
27
super ().__init__ (napari_viewer , parent = parent )
30
-
31
28
self .add_single_axes ()
32
- self .update_layers (None )
33
29
34
30
def clear (self ) -> None :
35
31
"""
@@ -124,54 +120,51 @@ def __init__(
124
120
parent : Optional [QWidget ] = None ,
125
121
):
126
122
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 )
136
136
137
137
@property
138
- def x_axis_key (self ) -> Optional [str ]:
138
+ def x_axis_key (self ) -> Union [str , None ]:
139
139
"""
140
140
Key to access x axis data from the FeaturesTable.
141
141
"""
142
- return self ._x_axis_key
142
+ if self ._selectors ["x" ].count () == 0 :
143
+ return None
144
+ else :
145
+ return self ._selectors ["x" ].currentText ()
143
146
144
147
@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 )
147
150
self ._draw ()
148
151
149
152
@property
150
- def y_axis_key (self ) -> Optional [str ]:
153
+ def y_axis_key (self ) -> Union [str , None ]:
151
154
"""
152
155
Key to access y axis data from the FeaturesTable.
153
156
"""
154
- return self ._y_axis_key
157
+ if self ._selectors ["y" ].count () == 0 :
158
+ return None
159
+ else :
160
+ return self ._selectors ["y" ].currentText ()
155
161
156
162
@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 )
170
165
self ._draw ()
171
166
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 ]:
175
168
"""
176
169
Get the valid axis keys from the layer FeatureTable.
177
170
@@ -195,11 +188,12 @@ def _ready_to_scatter(self) -> bool:
195
188
return False
196
189
197
190
feature_table = self .layers [0 ].features
191
+ valid_keys = self ._get_valid_axis_keys ()
198
192
return (
199
193
feature_table is not None
200
194
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
203
197
)
204
198
205
199
def draw (self ) -> None :
@@ -240,9 +234,9 @@ def _on_update_layers(self) -> None:
240
234
"""
241
235
Called when the layer selection changes by ``self.update_layers()``.
242
236
"""
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