diff --git a/chaco/scatter_inspector_overlay.py b/chaco/scatter_inspector_overlay.py index 6cbcf7cc5..9f96ee4ef 100644 --- a/chaco/scatter_inspector_overlay.py +++ b/chaco/scatter_inspector_overlay.py @@ -7,6 +7,7 @@ # Enthought library imports from enable.api import ColorTrait, MarkerTrait from traits.api import Float, Int, Str, Trait +from traits.observation.events import TraitChangeEvent # Local, relative imports from .abstract_overlay import AbstractOverlay @@ -41,7 +42,7 @@ class ScatterInspectorOverlay(AbstractOverlay): # using a series of trait change handlers (defined at the end of the # class) #@on_trait_change('component.index.metadata_changed,component.value.metadata_changed') - def metadata_changed(self, object, name, old, new): + def metadata_updated(self, event): if self.component is not None: self.component.request_redraw() @@ -125,19 +126,27 @@ def _draw_overlay(self, gc, view_bounds=None, mode="normal"): def _component_changed(self, old, new): if old: - old.on_trait_change(self._ds_changed, 'index', remove=True) + old.observe(self._ds_changed, 'index', remove=True) if hasattr(old, "value"): - old.on_trait_change(self._ds_changed, 'value', remove=True) + old.observe(self._ds_changed, 'value', remove=True) if new: for dsname in ("index", "value"): if not hasattr(new, dsname): continue - new.on_trait_change(self._ds_changed, dsname) + new.observe(self._ds_changed, dsname) if getattr(new, dsname): - self._ds_changed(new, dsname, None, getattr(new,dsname)) - - def _ds_changed(self, object, name, old, new): + self._ds_changed( + TraitChangeEvent( + object=new, + name=dsname, + old=None, + new=getattr(new, dsname) + ) + ) + + def _ds_changed(self, event): + old, new = event.old, event.new if old: - old.on_trait_change(self.metadata_changed, 'metadata_changed', remove=True) + old.observe(self.metadata_updated, 'metadata_changed', remove=True) if new: - new.on_trait_change(self.metadata_changed, 'metadata_changed') + new.observe(self.metadata_updated, 'metadata_changed') diff --git a/chaco/tools/image_inspector_tool.py b/chaco/tools/image_inspector_tool.py index 3568753fd..e76d4de11 100644 --- a/chaco/tools/image_inspector_tool.py +++ b/chaco/tools/image_inspector_tool.py @@ -126,17 +126,18 @@ def _build_text_from_event(self, event): def _image_inspector_changed(self, old, new): if old: - old.on_trait_event(self._new_value_updated, 'new_value', + old.observe(self._new_value_updated, 'new_value', remove=True) - old.on_trait_change(self._tool_visible_changed, "visible", + old.observe(self._tool_visible_updated, "visible", remove=True) if new: - new.on_trait_event(self._new_value_updated, 'new_value') - new.on_trait_change(self._tool_visible_changed, "visible") - self._tool_visible_changed() + new.observe(self._new_value_updated, 'new_value') + new.observe(self._tool_visible_updated, "visible") + self._tool_visible_updated() def _new_value_updated(self, event): - if event is None: + new_value_event = event.new + if new_value_event is None: self.text = "" if self.visibility == "auto": self.visible = False @@ -149,13 +150,13 @@ def _new_value_updated(self, event): else: self.alternate_position = None - self.text = self._build_text_from_event(event) + self.text = self._build_text_from_event(new_value_event) self.component.request_redraw() def _visible_changed(self): self.component.request_redraw() - def _tool_visible_changed(self): + def _tool_visible_updated(self, event=None): self.visibility = self.image_inspector.visible if self.visibility != "auto": self.visible = self.visibility diff --git a/chaco/tools/range_selection.py b/chaco/tools/range_selection.py index bc58f26de..113ad8d8d 100644 --- a/chaco/tools/range_selection.py +++ b/chaco/tools/range_selection.py @@ -660,13 +660,13 @@ def _determine_axis(self): else: return 0 - def __mapper_changed(self): + def __mapper_changed(self, event): self.deselect() def _axis_changed(self, old, new): if old is not None: - self.plot.on_trait_change(self.__mapper_changed, - old + "_mapper", remove=True) + self.plot.observe( + self.__mapper_changed, old + "_mapper", remove=True + ) if new is not None: - self.plot.on_trait_change(self.__mapper_changed, - old + "_mapper", remove=True) + self.plot.observe(self.__mapper_changed, new + "_mapper") diff --git a/chaco/tools/range_selection_overlay.py b/chaco/tools/range_selection_overlay.py index c2b948d31..9cf161557 100644 --- a/chaco/tools/range_selection_overlay.py +++ b/chaco/tools/range_selection_overlay.py @@ -159,10 +159,11 @@ def _attach_metadata_handler(self, old, new): datasource = getattr(self.plot, self.axis) if old: - datasource.on_trait_change(self._metadata_change_handler, "metadata_changed", - remove=True) + datasource.observe( + self._metadata_change_handler, "metadata_changed", remove=True + ) if new: - datasource.on_trait_change(self._metadata_change_handler, "metadata_changed") + datasource.observe(self._metadata_change_handler, "metadata_changed") def _metadata_change_handler(self, event): self.component.request_redraw() diff --git a/chaco/tools/simple_zoom.py b/chaco/tools/simple_zoom.py index 723ffa914..7d8b01b08 100644 --- a/chaco/tools/simple_zoom.py +++ b/chaco/tools/simple_zoom.py @@ -149,7 +149,7 @@ def __init__(self, component=None, *args, **kw): self._orig_low_setting = (x_range.low_setting, y_range.low_setting) self._orig_high_setting = \ (x_range.high_setting, y_range.high_setting) - component.on_trait_change(self._reset_state_to_current, + component.observe(self._reset_state_to_current, "index_data_changed") def enable(self, event=None): @@ -571,7 +571,7 @@ def _activate(self): # implementations of abstract methods on ToolHistoryMixin #------------------------------------------------------------------------ - def _reset_state_to_current(self): + def _reset_state_to_current(self, event=None): """ Clears the tool history, and sets the current state to be the first state in the history. """ diff --git a/chaco/tools/tests/test_image_inspector.py b/chaco/tools/tests/test_image_inspector.py index 61474b612..4544b7151 100644 --- a/chaco/tools/tests/test_image_inspector.py +++ b/chaco/tools/tests/test_image_inspector.py @@ -57,7 +57,7 @@ def test_mouse_move_custom_overlay(self): tool = self.tool # Add a listener to catch the emitted event: - tool.on_trait_change(self.store_inspector_event, "new_value") + tool.observe(self.store_inspector_event, "new_value") try: self.assertIsNone(self.insp_event) @@ -67,13 +67,13 @@ def test_mouse_move_custom_overlay(self): self.assertEqual(self.overlay2.text, 'Position: (0, 0)') finally: - tool.on_trait_change(self.store_inspector_event, "new_value", + tool.observe(self.store_inspector_event, "new_value", remove=True) # Helper methods ---------------------------------------------------------- def store_inspector_event(self, event): - self.insp_event = event + self.insp_event = event.new class TestImageInspectorToolGray(BaseImageInspectorTool, TestCase): @@ -89,7 +89,7 @@ def test_mouse_move_collect_image_info(self): tool = self.tool # Add a listener to catch the emitted event: - tool.on_trait_change(self.store_inspector_event, "new_value") + tool.observe(self.store_inspector_event, "new_value") try: self.assertIsNone(self.insp_event) @@ -136,7 +136,7 @@ def test_mouse_move_collect_image_info(self): self.assertEqual(self.overlay.text, '(1, 1)\n3') finally: - tool.on_trait_change(self.store_inspector_event, "new_value", + tool.observe(self.store_inspector_event, "new_value", remove=True) @@ -153,7 +153,7 @@ def test_mouse_move_collect_image_info(self): tool = self.tool # Add a listener to catch the emitted event: - tool.on_trait_change(self.store_inspector_event, "new_value") + tool.observe(self.store_inspector_event, "new_value") try: self.assertIsNone(self.insp_event) @@ -205,5 +205,5 @@ def test_mouse_move_collect_image_info(self): self.assertEqual(self.overlay.text, '(1, 1)\n(9, 10, 11)') finally: - tool.on_trait_change(self.store_inspector_event, "new_value", + tool.observe(self.store_inspector_event, "new_value", remove=True) diff --git a/chaco/tools/tests/test_scatter_inspector.py b/chaco/tools/tests/test_scatter_inspector.py index f933ebcba..5d1c4ab24 100644 --- a/chaco/tools/tests/test_scatter_inspector.py +++ b/chaco/tools/tests/test_scatter_inspector.py @@ -103,7 +103,7 @@ def test_hover_triggers_event(self): tool = self.tool # Add a listener to catch the emitted event: - tool.on_trait_change(self.store_inspector_event, "inspector_event") + tool.observe(self.store_inspector_event, "inspector_event") try: self.assertIsNone(self.insp_event) @@ -131,14 +131,14 @@ def test_hover_triggers_event(self): self.assertEqual(self.insp_event.event_type, "hover") self.assertEqual(self.insp_event.event_index, 1) finally: - tool.on_trait_change(self.store_inspector_event, "inspector_event", + tool.observe(self.store_inspector_event, "inspector_event", remove=True) def test_select_triggers_event(self): tool = self.tool # Add a listener to catch the emitted event: - tool.on_trait_change(self.store_inspector_event, "inspector_event") + tool.observe(self.store_inspector_event, "inspector_event") try: self.assertIsNone(self.insp_event) @@ -162,10 +162,11 @@ def test_select_triggers_event(self): self.assertEqual(self.insp_event.event_type, "deselect") self.assertEqual(self.insp_event.event_index, 1) finally: - tool.on_trait_change(self.store_inspector_event, "inspector_event", - remove=True) + tool.observe( + self.store_inspector_event, "inspector_event", remove=True + ) # Helper methods ---------------------------------------------------------- def store_inspector_event(self, event): - self.insp_event = event + self.insp_event = event.new diff --git a/examples/demo/advanced/scalar_image_function_inspector.py b/examples/demo/advanced/scalar_image_function_inspector.py index 9ba886488..adeb05044 100644 --- a/examples/demo/advanced/scalar_image_function_inspector.py +++ b/examples/demo/advanced/scalar_image_function_inspector.py @@ -178,8 +178,7 @@ def create_plot(self): array([]), sort_order=("ascending","ascending")) image_index_range = DataRange2D(self._image_index) - self._image_index.on_trait_change(self._metadata_changed, - "metadata_changed") + self._image_index.observe(self._metadata_changed, "metadata_changed") self._image_value = ImageData(data=array([]), value_depth=1) image_value_range = DataRange1D(self._image_value) @@ -323,7 +322,8 @@ def update(self, model): # Event handlers #--------------------------------------------------------------------------- - def _metadata_changed(self, old, new): + def _metadata_changed(self, event): + old, new = event.old, event.new """ This function takes out a cross section from the image data, based on the line inspector selections, and updates the line and scatter plots.""" diff --git a/examples/demo/advanced/scalar_image_function_inspector_old.py b/examples/demo/advanced/scalar_image_function_inspector_old.py index 5656c460d..6f19ecc67 100644 --- a/examples/demo/advanced/scalar_image_function_inspector_old.py +++ b/examples/demo/advanced/scalar_image_function_inspector_old.py @@ -140,8 +140,7 @@ def create_plot(self): array([]), sort_order=("ascending","ascending")) image_index_range = DataRange2D(self._image_index) - self._image_index.on_trait_change(self._metadata_changed, - "metadata_changed") + self._image_index.observe(self._metadata_changed, "metadata_changed") self._image_value = ImageData(data=array([]), value_depth=1) image_value_range = DataRange1D(self._image_value) @@ -283,7 +282,8 @@ def update(self, model): # Event handlers #--------------------------------------------------------------------------- - def _metadata_changed(self, old, new): + def _metadata_changed(self, event): + old, new = event.old, event.new """ This function takes out a cross section from the image data, based on the line inspector selections, and updates the line and scatter plots.""" @@ -353,7 +353,7 @@ class Controller(Handler): def init(self, info): self.model = info.object.model self.view = info.object.view - self.model.on_trait_change(self._model_changed, "model_changed") + self.model.observe(self._model_changed, "model_changed") #--------------------------------------------------------------------------- @@ -371,7 +371,7 @@ def edit_plot(self, ui_info): # Private Controller interface #--------------------------------------------------------------------------- - def _model_changed(self): + def _model_changed(self, event): if self.view is not None: self.view.update(self.model) diff --git a/examples/demo/basic/image_lasso.py b/examples/demo/basic/image_lasso.py index e510d92b9..32e416918 100644 --- a/examples/demo/basic/image_lasso.py +++ b/examples/demo/basic/image_lasso.py @@ -23,7 +23,11 @@ # # Create the Chaco plot. #=============================================================================== -def lasso_updated(lasso_tool, name, old, new_selections): +def lasso_updated(event): + lasso_tool = event.object + name = event.name + old = event.old + new_selections = event.new # new_selections is a list of arrays of coordinates in dataspace. It is a # list because the LassoSelection supports multiple, disjoint selection regions. for i, selection in enumerate(new_selections): @@ -62,7 +66,7 @@ def _create_plot_component():# Create a scalar field to colormap plot.padding = 50 lasso_selection = LassoSelection(component=img_plot) - lasso_selection.on_trait_change(lasso_updated, "disjoint_selections") + lasso_selection.observe(lasso_updated, "disjoint_selections") lasso_overlay = LassoOverlay(lasso_selection = lasso_selection, component=img_plot) img_plot.tools.append(lasso_selection) img_plot.overlays.append(lasso_overlay) diff --git a/examples/demo/basic/scatter_inspector.py b/examples/demo/basic/scatter_inspector.py index 394b6b37a..a8178fa07 100644 --- a/examples/demo/basic/scatter_inspector.py +++ b/examples/demo/basic/scatter_inspector.py @@ -53,9 +53,10 @@ def _create_plot_component(): scatter.overlays.append(overlay) # Optional: add a listener on inspector events: - def echo(new): + def echo(event): + new = event.new print("{} event on element {}".format(new.event_type, new.event_index)) - inspector.on_trait_change(echo, "inspector_event") + inspector.observe(echo, "inspector_event") return plot diff --git a/examples/demo/basic/scatter_rect_select.py b/examples/demo/basic/scatter_rect_select.py index cf6d2e845..29cc6c060 100644 --- a/examples/demo/basic/scatter_rect_select.py +++ b/examples/demo/basic/scatter_rect_select.py @@ -107,7 +107,7 @@ class Demo(HasTraits): resizable=True, title=title ) - def _selection_changed(self): + def _selection_changed(self, event): mask = self.index_datasource.metadata['selections'] print("New selection: ") print(compress(mask, arange(len(mask)))) @@ -123,8 +123,7 @@ def _plot_default(self): # Set up the trait handler for the selection self.index_datasource = my_plot.index - rect_selection.on_trait_change(self._selection_changed, - 'selection_changed') + rect_selection.observe(self._selection_changed, 'selection_changed') return plot diff --git a/examples/demo/basic/scatter_select.py b/examples/demo/basic/scatter_select.py index 535bbc88f..9e169eb38 100644 --- a/examples/demo/basic/scatter_select.py +++ b/examples/demo/basic/scatter_select.py @@ -98,7 +98,7 @@ class Demo(HasTraits): resizable=True, title=title ) - def _selection_changed(self): + def _selection_changed(self, event): mask = self.index_datasource.metadata['selection'] print("New selection: ") print(compress(mask, arange(len(mask)))) @@ -115,8 +115,7 @@ def _plot_default(self): # Set up the trait handler for the selection self.index_datasource = my_plot.index - lasso_selection.on_trait_change(self._selection_changed, - 'selection_changed') + lasso_selection.observe(self._selection_changed, 'selection_changed') return plot diff --git a/examples/demo/basic/scatter_toggle.py b/examples/demo/basic/scatter_toggle.py index 359743b94..6d580e0da 100644 --- a/examples/demo/basic/scatter_toggle.py +++ b/examples/demo/basic/scatter_toggle.py @@ -104,7 +104,7 @@ class Demo(HasTraits): resizable=True, title=title ) - def _metadata_handler(self): + def _metadata_handler(self, event): sel_indices = self.index_datasource.metadata.get('selections', []) print("Selection indices:", sel_indices) @@ -119,8 +119,9 @@ def _plot_default(self): # Set up the trait handler for the selection self.index_datasource = my_plot.index - self.index_datasource.on_trait_change(self._metadata_handler, - "metadata_changed") + self.index_datasource.observe( + self._metadata_handler, "metadata_changed" + ) return plot diff --git a/examples/demo/chaco_trait_editor.py b/examples/demo/chaco_trait_editor.py index e84aa63bb..c417356a3 100644 --- a/examples/demo/chaco_trait_editor.py +++ b/examples/demo/chaco_trait_editor.py @@ -125,7 +125,7 @@ def init(self, parent): # Do not allow the user to reset the range range_selection.event_state = "selected" range_selection.deselect = lambda x: None - range_selection.on_trait_change(self.update_interval, 'selection') + range_selection.observe(self.update_interval, 'selection') plot.tools.append(range_selection) plot.overlays.append(RangeKnobsOverlay(plot)) @@ -143,7 +143,8 @@ def init(self, parent): else: self.control.setMaximumSize(factory.width, factory.height) - def update_interval(self, value): + def update_interval(self, event): + value = event.new low, high = value low = max(low, 0) diff --git a/examples/demo/financial/correlations.py b/examples/demo/financial/correlations.py index 1cadf0363..c0656220d 100644 --- a/examples/demo/financial/correlations.py +++ b/examples/demo/financial/correlations.py @@ -103,7 +103,7 @@ def _create_returns_plot(self): # Grab a reference to the Time axis datasource and add a listener to its # selections metadata self.times_ds = renderer.index - self.times_ds.on_trait_change(self._selections_changed, 'metadata_changed') + self.times_ds.observe(self._selections_updated, 'metadata_changed') self.returns_plot = plot def _create_corr_plot(self): @@ -121,13 +121,15 @@ def _create_data(self, *names): plotdata.set_data(name, cumprod(random.lognormal(0.0, 0.04, size=numpoints))) self.plotdata = plotdata - def _selections_changed(self, event): + def _selections_updated(self, event): + metadata_changed_event = event.new if self.corr_renderer is None: return - if not isinstance(event, dict) or "selections" not in event: + if not isinstance(metadata_changed_event, dict) \ + or "selections" not in metadata_changed_event: return corr_index = self.corr_renderer.index - selections = event["selections"] + selections = metadata_changed_event["selections"] if selections is None: corr_index.metadata.pop("selections", None) return @@ -136,7 +138,9 @@ def _selections_changed(self, event): data = self.times_ds.get_data() low_ndx = data.searchsorted(low) high_ndx = data.searchsorted(high) - corr_index.metadata["selections"] = arange(low_ndx, high_ndx+1, 1, dtype=int) + corr_index.metadata["selections"] = arange( + low_ndx, high_ndx+1, 1, dtype=int + ) self.corr_plot.request_redraw() @observe("sym1,sym2") diff --git a/examples/demo/financial/stock_prices.py b/examples/demo/financial/stock_prices.py index f7e0d7655..6df06ee11 100644 --- a/examples/demo/financial/stock_prices.py +++ b/examples/demo/financial/stock_prices.py @@ -93,26 +93,28 @@ def _create_price_plots(self, times, prices, mini_height=75): miniplot.tools.append(range_tool) range_overlay = RangeSelectionOverlay(miniplot, metadata_name="selections") miniplot.overlays.append(range_overlay) - range_tool.on_trait_change(self._range_selection_handler, "selection") + range_tool.observe(self._range_selection_handler, "selection") # Attach a handler that sets the tool when the plot's index range changes self.range_tool = range_tool - price_plot.index_range.on_trait_change(self._plot_range_handler, "updated") + price_plot.index_range.observe(self._plot_range_handler, "updated") return price_plot, miniplot def _range_selection_handler(self, event): + range_selection_event = event.new # The event obj should be a tuple (low, high) in data space - if event is not None: - low, high = event + if range_selection_event is not None: + low, high = range_selection_event self.price_plot.index_range.low = low self.price_plot.index_range.high = high else: self.price_plot.index_range.set_bounds("auto", "auto") def _plot_range_handler(self, event): - if event is not None: + plot_range_event = event.new + if plot_range_event is not None: low, high = event if "auto" not in (low, high): self.range_tool.selection = (low, high) @@ -136,7 +138,7 @@ def _create_vol_plot(self, times, volumes, height=100): constrain_direction="x")) return vol_plot - def _create_window(self): + def _create_component(self): # Create the data and datasource objects # In order for the date axis to work, the index data points need to @@ -179,7 +181,7 @@ def _create_window(self): fill_padding=False) container.add(mini_plot, vol_plot, price_plot) - return Window(self, -1, component=container) + return container if __name__ == "__main__": # Save demo so that it doesn't get garbage collected when run within diff --git a/examples/demo/zoomed_plot/zoom_overlay.py b/examples/demo/zoomed_plot/zoom_overlay.py index 86762cfe2..6bddc45ca 100644 --- a/examples/demo/zoomed_plot/zoom_overlay.py +++ b/examples/demo/zoomed_plot/zoom_overlay.py @@ -97,12 +97,13 @@ def _get_selection_screencoords(self): def _source_changed(self, old, new): if old is not None and old.controller is not None: - old.controller.on_trait_change(self._selection_update_handler, "selection", + old.controller.observe(self._selection_update_handler, "selection", remove=True) if new is not None and new.controller is not None: - new.controller.on_trait_change(self._selection_update_handler, "selection") + new.controller.observe(self._selection_update_handler, "selection") - def _selection_update_handler(self, value): + def _selection_update_handler(self, event): + value = event.new if value is not None and self.destination is not None: r = self.destination.index_mapper.range start, end = amin(value), amax(value)