diff --git a/chaco/tools/range_selection.py b/chaco/tools/range_selection.py index d9c67131f..82475bbcd 100644 --- a/chaco/tools/range_selection.py +++ b/chaco/tools/range_selection.py @@ -15,6 +15,7 @@ Instance, Int, List, + observe, Property, Str, Trait, @@ -676,13 +677,12 @@ def _determine_axis(self): else: return 0 - def __mapper_changed(self, event): - self.deselect() - - def _axis_changed(self, old, new): - if old is not None: - self.plot.observe( - self.__mapper_changed, old + "_mapper", remove=True - ) - if new is not None: - self.plot.observe(self.__mapper_changed, new + "_mapper") + @observe([ + "component.index_mapper", + "component.value_mapper", + "_plot.index_mapper", + "_plot.value_mapper" + ]) + def _axis_mapper_updated(self, event): + if event.name == self.axis + "_mapper": + self.deselect() diff --git a/chaco/tools/tests/test_range_selection.py b/chaco/tools/tests/test_range_selection.py index 44357af50..225eeee5d 100644 --- a/chaco/tools/tests/test_range_selection.py +++ b/chaco/tools/tests/test_range_selection.py @@ -3,6 +3,7 @@ import numpy as np +from chaco.api import LinearMapper from chaco.array_plot_data import ArrayPlotData from chaco.plot import Plot from chaco.tools.range_selection import RangeSelection @@ -75,3 +76,54 @@ def test_selection_no_warning(self): tool.selection = (1.5, 3.5) tool.selection = [1.0, 2.0] tool.selection = None + + # regression test for enthought/chaco#597 + @unittest.mock.patch('chaco.tools.range_selection.RangeSelection.deselect') + def test_notifiers_connected(self, mocked_deselect): + plot_data = ArrayPlotData() + arr = np.arange(4.0) + plot_data.set_data("x", arr) + plot_data.set_data("y", arr) + + plot = Plot(plot_data) + + renderer = plot.plot(("x", "y"))[0] + tool = RangeSelection(renderer) + renderer.tools.append(tool) + + # attempt to trigger change handler for the index_mapper trait on the + # RangeSelection tool's plot + # assign a new mapper with same attrs + renderer.index_mapper = LinearMapper( + range=renderer.index_mapper.range, + stretch_data=renderer.index_mapper.stretch_data + ) + + mocked_deselect.assert_called_once() + + # regression test for enthought/chaco#597 + @unittest.mock.patch('chaco.tools.range_selection.RangeSelection.deselect') + def test_notifiers_connected_specify_plot(self, mocked_deselect): + plot_data = ArrayPlotData() + arr = np.arange(4.0) + plot_data.set_data("x", arr) + plot_data.set_data("y", arr) + + plot = Plot(plot_data) + + renderer = plot.plot(("x", "y"))[0] + tool = RangeSelection(renderer) + renderer.tools.append(tool) + + new_renderer = plot.plot(("x", "y"), type='scatter')[0] + tool.plot = new_renderer + + # attempt to trigger change handler for the index_mapper trait on the + # RangeSelection tool's plot + # assign a new mapper with same attrs + new_renderer.index_mapper = LinearMapper( + range=new_renderer.index_mapper.range, + stretch_data=new_renderer.index_mapper.stretch_data + ) + + mocked_deselect.assert_called_once()