Skip to content
7 changes: 4 additions & 3 deletions apptools/logger/plugin/logger_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
List,
Property,
Undefined,
on_trait_change,
observe,
)

root_logger = logging.getLogger()
Expand Down Expand Up @@ -170,8 +170,9 @@ def _get_mail_files(self):
"apptools.logger.plugin.mail_files"
)

@on_trait_change("preferences.level_")
def _level_changed(self, new):
@observe("preferences.level_")
def _use_updated_preferences_level(self, event):
new = event.new
if (
new is not None
and new is not Undefined
Expand Down
6 changes: 3 additions & 3 deletions apptools/logger/plugin/view/logger_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
Property,
Str,
cached_property,
on_trait_change,
observe,
)
from traitsui.api import View, Group, Item, CodeEditor, TabularEditor, spring
from traitsui.tabular_adapter import TabularAdapter
Expand Down Expand Up @@ -144,8 +144,8 @@ def update(self, force=False):
# Private interface
###########################################################################

@on_trait_change("service.preferences.level_")
def _update_log_records(self):
@observe("service.preferences.level_")
def _update_log_records(self, event):
self.service.handler._view = self
self.update(force=True)

Expand Down
6 changes: 3 additions & 3 deletions apptools/preferences/preference_binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,10 @@ def _preferences_default(self):

#### Trait change handlers ################################################

def _on_trait_changed(self, obj, trait_name, old, new):
def _on_trait_changed(self, event):
""" Dynamic trait change handler. """

self.preferences.set(self.preference_path, new)
self.preferences.set(self.preference_path, event.new)

#### Other observer pattern listeners #####################################

Expand Down Expand Up @@ -121,7 +121,7 @@ def _initialize(self):
""" Wire-up trait change handlers etc. """

# Listen for the object's trait being changed.
self.obj.on_trait_change(self._on_trait_changed, self.trait_name)
self.obj.observe(self._on_trait_changed, self.trait_name)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like we don't have a good place to unhook this listener

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah I noticed this as well... not sure what the best thing to do is


# Listen for the preference value being changed.
components = self.preference_path.split(".")
Expand Down
19 changes: 10 additions & 9 deletions apptools/preferences/tests/test_preference_binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,20 @@
from apptools.preferences.api import bind_preference
from apptools.preferences.api import set_default_preferences
from traits.api import Bool, HasTraits, Int, Float, Str
from traits.observation.api import match


# This module's package.
PKG = "apptools.preferences.tests"


def listener(obj, trait_name, old, new):
def listener(event):
""" A useful trait change handler for testing! """

listener.obj = obj
listener.trait_name = trait_name
listener.old = old
listener.new = new
listener.obj = event.object
listener.trait_name = event.name
listener.old = event.old
listener.new = event.new


class PreferenceBindingTestCase(unittest.TestCase):
Expand Down Expand Up @@ -77,7 +78,7 @@ class AcmeUI(HasTraits):
visible = Bool

acme_ui = AcmeUI()
acme_ui.on_trait_change(listener)
acme_ui.observe(listener, match(lambda n, t: True))

# Make some bindings.
bind_preference(acme_ui, "bgcolor", "acme.ui.bgcolor")
Expand Down Expand Up @@ -228,7 +229,7 @@ class AcmeUI(HasTraits):
visible = Bool

acme_ui = AcmeUI()
acme_ui.on_trait_change(listener)
acme_ui.observe(listener, match(lambda n, t: True))

# Create an empty preferences node and use that in some of the
# bindings!
Expand Down Expand Up @@ -267,7 +268,7 @@ def _width_changed(self, trait_name, old, new):
self.ratio = 3.0

acme_ui = AcmeUI()
acme_ui.on_trait_change(listener)
acme_ui.observe(listener, match(lambda n, t: True))

# Make some bindings.
bind_preference(acme_ui, "bgcolor", "acme.ui.bgcolor")
Expand Down Expand Up @@ -304,7 +305,7 @@ class AcmeUI(HasTraits):
color = Str

acme_ui = AcmeUI()
acme_ui.on_trait_change(listener)
acme_ui.observe(listener, match(lambda n, t: True))

# Make some bindings.
bind_preference(acme_ui, "color", "acme.ui.bgcolor")
Expand Down
31 changes: 16 additions & 15 deletions apptools/preferences/tests/test_preferences_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,23 @@
Any, Bool, HasTraits, Int, Float, List, Str,
push_exception_handler, pop_exception_handler,
)
from traits.observation.api import match


def width_listener(obj, trait_name, old, new):
def width_listener(event):

width_listener.obj = obj
width_listener.trait_name = trait_name
width_listener.old = old
width_listener.new = new
width_listener.obj = event.object
width_listener.trait_name = event.name
width_listener.old = event.old
width_listener.new = event.new


def bgcolor_listener(obj, trait_name, old, new):
def bgcolor_listener(event):

bgcolor_listener.obj = obj
bgcolor_listener.trait_name = trait_name
bgcolor_listener.old = old
bgcolor_listener.new = new
bgcolor_listener.obj = event.object
bgcolor_listener.trait_name = event.name
bgcolor_listener.old = event.old
bgcolor_listener.new = event.new


# This module's package.
Expand Down Expand Up @@ -105,7 +106,7 @@ class AcmeUIPreferencesHelper(PreferencesHelper):
names = List(Str)

helper = AcmeUIPreferencesHelper()
helper.on_trait_change(bgcolor_listener)
helper.observe(bgcolor_listener, match(lambda n, t: True))

# Make sure the helper was initialized properly.
self.assertEqual("blue", helper.bgcolor)
Expand Down Expand Up @@ -157,7 +158,7 @@ class AcmeUIPreferencesHelper(PreferencesHelper):
names = List(Str)

helper = AcmeUIPreferencesHelper(preferences_path="acme.ui")
helper.on_trait_change(bgcolor_listener)
helper.observe(bgcolor_listener, match(lambda n, t: True))

# Make sure the helper was initialized properly.
self.assertEqual("blue", helper.bgcolor)
Expand Down Expand Up @@ -344,7 +345,7 @@ class Widget(HasTraits):
background_color = Str

w = Widget()
w.on_trait_change(bgcolor_listener)
w.observe(bgcolor_listener, match(lambda n, t: True))

p = self.preferences
p.load(self.example)
Expand Down Expand Up @@ -480,8 +481,8 @@ class AcmeUIPreferencesHelper(PreferencesHelper):
helper = AcmeUIPreferencesHelper()

# We only listen to some of the traits so the testing is easier.
helper.on_trait_change(width_listener, ["width"])
helper.on_trait_change(bgcolor_listener, ["bgcolor"])
helper.observe(width_listener, ["width"])
helper.observe(bgcolor_listener, ["bgcolor"])

# Create a new preference node.
p1 = Preferences()
Expand Down
16 changes: 7 additions & 9 deletions apptools/preferences/ui/widget_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@


# Enthought library imports.
from traits.api import Any
from traits.api import Any, observe
from traitsui.api import EditorFactory
from traitsui.toolkit import toolkit_object
Editor = toolkit_object('editor:Editor')
Expand Down Expand Up @@ -40,9 +40,6 @@ def init(self, parent):
# Create the editor's control.
self.control = page.create_control(parent)

# Listen for the page being changed.
self.object.on_trait_change(self._on_page_changed, "selected_page")

def dispose(self):
""" Dispose of the editor. """

Expand All @@ -58,14 +55,15 @@ def update_editor(self):
# Private interface.
###########################################################################

def _on_page_changed(self, obj, trait_name, old, new):
@observe("object:selected_page")
def _handle_change_to_selected_page(self, event):
""" Dynamic trait change handler. """

if old is not None:
old.destroy_control()
if event.old is not None:
event.old.destroy_control()

if new is not None:
self.control = new.create_control(self.parent)
if event.new is not None:
self.control = event.new.create_control(self.parent)


class WidgetEditor(EditorFactory):
Expand Down
6 changes: 3 additions & 3 deletions apptools/scripting/recorder_with_ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
A Recorder subclass that presents a simple user interface.
"""

from traits.api import Code, Button, Int, on_trait_change, Any
from traits.api import Code, Button, Int, observe, Any
from traitsui.api import View, Item, Group, HGroup, CodeEditor, spring, Handler

from .recorder import Recorder
Expand Down Expand Up @@ -88,8 +88,8 @@ def on_ui_close(self):
######################################################################
# Non-public interface.
######################################################################
@on_trait_change("lines[]")
def _update_code(self):
@observe("lines.items")
def _update_code(self, event):
self.code = self.get_code()
self.current_line = len(self.lines) + 1

Expand Down
1 change: 1 addition & 0 deletions docs/releases/upcoming/285.feature.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
start replacing on_trait_change with observe (#285)