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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 11 additions & 4 deletions
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

Lines changed: 17 additions & 0 deletions
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

Lines changed: 29 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy