Skip to content

Commit 2d5ca2a

Browse files
committed
Fix clearing span selector
1 parent 8cad1b6 commit 2d5ca2a

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

lib/matplotlib/tests/test_widgets.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,38 @@ def onselect(epress, erelease):
460460
assert artist.get_alpha() == 0.3
461461

462462

463+
def test_span_selector_clear():
464+
ax = get_ax()
465+
466+
def onselect(*args):
467+
pass
468+
469+
tool = widgets.SpanSelector(ax, onselect, 'horizontal', interactive=True)
470+
do_event(tool, 'press', xdata=10, ydata=10, button=1)
471+
do_event(tool, 'onmove', xdata=100, ydata=120, button=1)
472+
do_event(tool, 'release', xdata=100, ydata=120, button=1)
473+
474+
# press-release event outside the selector to clear the selector
475+
do_event(tool, 'press', xdata=130, ydata=130, button=1)
476+
do_event(tool, 'release', xdata=130, ydata=130, button=1)
477+
assert not tool._selection_completed
478+
479+
tool = widgets.SpanSelector(ax, onselect, 'horizontal', interactive=True,
480+
ignore_event_outside=True)
481+
do_event(tool, 'press', xdata=10, ydata=10, button=1)
482+
do_event(tool, 'onmove', xdata=100, ydata=120, button=1)
483+
do_event(tool, 'release', xdata=100, ydata=120, button=1)
484+
485+
# press-release event outside the selector ignored
486+
do_event(tool, 'press', xdata=130, ydata=130, button=1)
487+
do_event(tool, 'release', xdata=130, ydata=130, button=1)
488+
assert tool._selection_completed
489+
assert tool.extents == (10, 100)
490+
491+
do_event(tool, 'on_key_press', key='escape')
492+
assert not tool._selection_completed
493+
494+
463495
def test_tool_line_handle():
464496
ax = get_ax()
465497

lib/matplotlib/widgets.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,7 +1981,6 @@ def on_key_press(self, event):
19811981
for artist in self.artists:
19821982
artist.set_visible(False)
19831983
self.update()
1984-
return
19851984
for (state, modifier) in self.state_modifier_keys.items():
19861985
if modifier in key:
19871986
self._state.add(state)
@@ -2316,6 +2315,11 @@ def direction(self, direction):
23162315
else:
23172316
self._direction = direction
23182317

2318+
def _on_key_press(self, event):
2319+
key = event.key or ''
2320+
if key == self.state_modifier_keys['clear']:
2321+
self._selection_completed = False
2322+
23192323
def _release(self, event):
23202324
"""Button release event handler."""
23212325
self._set_cursor(False)
@@ -2354,9 +2358,11 @@ def _hover(self, event):
23542358
if self.ignore(event):
23552359
return
23562360

2357-
if self._active_handle is not None:
2361+
if self._active_handle is not None or not self._selection_completed:
23582362
# Do nothing if button is pressed and a handle is active, which may
23592363
# occur with drag_from_anywhere=True.
2364+
# Do nothing if selection is not completed, which occurs when
2365+
# a selector has been cleared
23602366
return
23612367

23622368
_, e_dist = self._edge_handles.closest(event.x, event.y)

0 commit comments

Comments
 (0)