Skip to content

Commit bea4f7e

Browse files
authored
Merge pull request #47 from BiAPoL/canvaswidget-refactor
Canvaswidget refactor
2 parents cc69b46 + 24d03a0 commit bea4f7e

File tree

4 files changed

+338
-136
lines changed

4 files changed

+338
-136
lines changed

docs/examples/canvas_widget_example.ipynb

Lines changed: 20 additions & 20 deletions
Large diffs are not rendered by default.

docs/plotter_api.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
.. autosummary::
1111
1212
~CanvasWidget.active_artist
13+
~CanvasWidget.active_selector
1314
1415
.. rubric:: Attributes Summary
1516
@@ -26,18 +27,23 @@
2627
.. autosummary::
2728
2829
~CanvasWidget.add_artist
30+
~CanvasWidget.remove_artist
2931
~CanvasWidget.add_selector
32+
~CanvasWidget.remove_selector
3033
~CanvasWidget.on_enable_selector
34+
~CanvasWidget.hide_color_overlay
3135
3236
.. rubric:: Signals Summary
3337
3438
.. autosummary::
3539
3640
~CanvasWidget.artist_changed_signal
41+
~CanvasWidget.selector_changed_signal
3742
3843
.. rubric:: Properties Documentation
3944
4045
.. autoattribute:: active_artist
46+
.. autoattribute:: active_selector
4147
4248
.. rubric:: Attributes Documentation
4349
@@ -50,10 +56,14 @@
5056
.. rubric:: Methods Documentation
5157
5258
.. automethod:: add_artist
59+
.. automethod:: remove_artist
5360
.. automethod:: add_selector
61+
.. automethod:: remove_selector
5462
.. automethod:: on_enable_selector
63+
.. automethod:: hide_color_overlay
5564
5665
.. rubric:: Signals Documentation
5766
5867
.. autoattribute:: artist_changed_signal
68+
.. autoattribute:: selector_changed_signal
5969
```
Lines changed: 103 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,114 @@
1-
import numpy as np
1+
import pytest
2+
from matplotlib.widgets import (EllipseSelector, LassoSelector,
3+
RectangleSelector)
24

5+
from biaplotter.artists import Histogram2D, Scatter
36
from biaplotter.plotter import CanvasWidget
7+
from biaplotter.selectors import (InteractiveEllipseSelector,
8+
InteractiveLassoSelector,
9+
InteractiveRectangleSelector)
410

511

6-
def test_widget(make_napari_viewer):
12+
@pytest.fixture
13+
def canvas_widget(make_napari_viewer):
14+
"""Fixture to create a CanvasWidget instance for testing."""
715
# make viewer and add an image layer using our fixture
816
viewer = make_napari_viewer()
917

1018
# create our widget, passing in the viewer
1119
widget = CanvasWidget(viewer)
20+
return widget
1221

13-
viewer.window.add_dock_widget(widget)
1422

15-
# check that the widget exists
16-
assert widget is not None
23+
def test_initialization(canvas_widget):
24+
"""Test that the CanvasWidget initializes correctly."""
25+
assert canvas_widget.artists
26+
assert canvas_widget.selectors
27+
assert canvas_widget.active_artist == canvas_widget.artists["HISTOGRAM2D"]
28+
assert canvas_widget.active_selector is None
29+
30+
31+
def test_add_and_remove_artist(canvas_widget):
32+
"""Test adding and removing artists."""
33+
scatter = Scatter(ax=canvas_widget.axes)
34+
canvas_widget.add_artist("NEW_SCATTER", scatter)
35+
assert "NEW_SCATTER" in canvas_widget.artists
36+
assert canvas_widget.artists["NEW_SCATTER"] == scatter
37+
38+
canvas_widget.remove_artist("NEW_SCATTER")
39+
assert "NEW_SCATTER" not in canvas_widget.artists
40+
41+
42+
def test_set_active_artist(canvas_widget):
43+
"""Test setting the active artist."""
44+
canvas_widget.active_artist = "SCATTER"
45+
assert canvas_widget.active_artist == canvas_widget.artists["SCATTER"]
46+
assert canvas_widget.artists["SCATTER"].visible
47+
assert not canvas_widget.artists["HISTOGRAM2D"].visible
48+
49+
50+
def test_add_and_remove_selector(canvas_widget):
51+
"""Test adding and removing selectors."""
52+
lasso = InteractiveEllipseSelector(
53+
ax=canvas_widget.axes, canvas_widget=canvas_widget
54+
)
55+
canvas_widget.add_selector("NEW_LASSO", lasso)
56+
assert "NEW_LASSO" in canvas_widget.selectors
57+
assert canvas_widget.selectors["NEW_LASSO"] == lasso
58+
59+
canvas_widget.remove_selector("NEW_LASSO")
60+
assert "NEW_LASSO" not in canvas_widget.selectors
61+
62+
63+
def test_set_active_selector(canvas_widget):
64+
"""Test setting the active selector."""
65+
canvas_widget.active_selector = "LASSO"
66+
assert canvas_widget.active_selector == canvas_widget.selectors["LASSO"]
67+
assert isinstance(
68+
canvas_widget.selectors["LASSO"]._selector, LassoSelector
69+
)
70+
71+
canvas_widget.active_selector = "ELLIPSE"
72+
assert canvas_widget.active_selector == canvas_widget.selectors["ELLIPSE"]
73+
assert not isinstance(
74+
canvas_widget.selectors["LASSO"]._selector, LassoSelector
75+
)
76+
77+
78+
def test_disable_all_selectors(canvas_widget):
79+
"""Test disabling all selectors."""
80+
canvas_widget.active_selector = "LASSO"
81+
canvas_widget._disable_all_selectors()
82+
assert canvas_widget.active_selector is None
83+
for selector in canvas_widget.selectors.values():
84+
assert selector._selector is None
85+
86+
87+
def test_hide_color_overlay(canvas_widget):
88+
"""Test the hide_color_overlay method."""
89+
canvas_widget.hide_color_overlay(True)
90+
assert not canvas_widget.active_artist.overlay_visible
91+
92+
canvas_widget.hide_color_overlay(False)
93+
assert canvas_widget.active_artist.overlay_visible
94+
95+
96+
def test_signals(canvas_widget, qtbot):
97+
"""Test that signals are emitted correctly."""
98+
with qtbot.waitSignal(
99+
canvas_widget.artist_changed_signal, timeout=100
100+
) as signal:
101+
canvas_widget.active_artist = "SCATTER"
102+
assert signal.args == ["SCATTER"]
103+
104+
with qtbot.waitSignal(
105+
canvas_widget.selector_changed_signal, timeout=100
106+
) as signal:
107+
canvas_widget.active_selector = "LASSO"
108+
assert signal.args == ["LASSO"]
109+
110+
with qtbot.waitSignal(
111+
canvas_widget.selector_changed_signal, timeout=100
112+
) as signal:
113+
canvas_widget._disable_all_selectors()
114+
assert signal.args == [""]

0 commit comments

Comments
 (0)