Skip to content

Commit 02de039

Browse files
committed
Add layer hint to widget
1 parent c32af55 commit 02de039

File tree

4 files changed

+59
-4
lines changed

4 files changed

+59
-4
lines changed

docs/changelog.rst

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ New features
88
~~~~~~~~~~~~
99
- Added ``MPLWidget`` as a widget containing just a Matplotlib canvas
1010
without any association with a napari viewer.
11+
- Added text to each widget indicating how many layers need to be selected
12+
for the widget to plot something.
1113

1214
Visual improvements
1315
~~~~~~~~~~~~~~~~~~~

src/napari_matplotlib/base.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ class NapariMPLWidget(BaseNapariMPLWidget):
138138
for creating and working with the Matplotlib figure and any axes.
139139
"""
140140

141+
#: Number of layers taken as input
142+
n_layers_input = Interval(None, None)
143+
#: Type of layer taken as input
144+
input_layer_types: Tuple[napari.layers.Layer, ...] = (napari.layers.Layer,)
145+
141146
def __init__(
142147
self,
143148
napari_viewer: napari.viewer.Viewer,
@@ -149,10 +154,12 @@ def __init__(
149154
self._setup_callbacks()
150155
self.layers: List[napari.layers.Layer] = []
151156

152-
#: Number of layers taken as input
153-
n_layers_input = Interval(None, None)
154-
#: Type of layer taken as input
155-
input_layer_types: Tuple[napari.layers.Layer, ...] = (napari.layers.Layer,)
157+
helper_text = self.n_layers_input._helper_text
158+
if helper_text is not None:
159+
if self.name is None:
160+
self.layout().insertWidget(0, QLabel(helper_text))
161+
else:
162+
self.layout().insertWidget(1, QLabel(helper_text))
156163

157164
@property
158165
def n_selected_layers(self) -> int:

src/napari_matplotlib/tests/test_util.py

+17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,23 @@ def test_interval():
1616
"string" in interval # type: ignore
1717

1818

19+
@pytest.mark.parametrize(
20+
"lower, upper, text",
21+
[
22+
(None, None, None),
23+
(1, None, "Select at least 1 layer to generate plot"),
24+
(4, None, "Select at least 4 layers to generate plot"),
25+
(None, 1, "Select at most 1 layer to generate plot"),
26+
(None, 5939, "Select at most 5939 layers to generate plot"),
27+
(1, 1, "Select 1 layer to generate plot"),
28+
(2, 2, "Select 2 layers to generate plot"),
29+
(1, 2, "Select between 1 and 2 layers to generate plot"),
30+
],
31+
)
32+
def test_interval_helper_text(lower, upper, text):
33+
assert Interval(lower, upper)._helper_text == text
34+
35+
1936
def test_get_size_from_css(mocker):
2037
"""Test getting the max-width and max-height from something in css"""
2138
test_css = """

src/napari_matplotlib/util.py

+29
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,35 @@ def __contains__(self, val: int) -> bool:
4646
return False
4747
return True
4848

49+
@property
50+
def _helper_text(self) -> Optional[str]:
51+
"""
52+
Helper text for widgets.
53+
"""
54+
if self.lower is None and self.upper is None:
55+
helper_text = None
56+
elif self.lower is not None and self.upper is None:
57+
helper_text = (
58+
f"Select at least {self.lower} layers to generate plot"
59+
)
60+
elif self.lower is None and self.upper is not None:
61+
helper_text = (
62+
f"Select at most {self.upper} layers to generate plot"
63+
)
64+
elif self.lower == self.upper:
65+
helper_text = f"Select {self.lower} layers to generate plot"
66+
67+
else:
68+
helper_text = (
69+
f"Select between {self.lower} and "
70+
f"{self.upper} layers to generate plot"
71+
)
72+
73+
if helper_text is not None:
74+
helper_text = helper_text.replace("1 layers", "1 layer")
75+
76+
return helper_text
77+
4978

5079
def _has_id(nodes: List[tinycss2.ast.Node], id_name: str) -> bool:
5180
"""

0 commit comments

Comments
 (0)