Skip to content

Commit beec547

Browse files
committedMay 17, 2023
Re-write scatterfeatures without magicgui
1 parent 452b848 commit beec547

File tree

1 file changed

+39
-45
lines changed

1 file changed

+39
-45
lines changed
 

‎src/napari_matplotlib/scatter.py

+39-45
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
from typing import Any, List, Optional, Tuple
1+
from typing import Any, Dict, List, Optional, Tuple, Union
22

33
import napari
44
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
86

97
from .base import NapariMPLWidget
108
from .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

Comments
 (0)
Please sign in to comment.