Skip to content

Commit

Permalink
Simplify the wx event code (#256)
Browse files Browse the repository at this point in the history
  • Loading branch information
mdickinson authored Nov 27, 2020
1 parent f28228b commit 60efc6c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 13 deletions.
48 changes: 47 additions & 1 deletion traits_futures/tests/test_pinger.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,14 @@
import threading
import unittest

from traits.api import Event, HasStrictTraits, Instance, Int
from traits.api import (
Event,
HasStrictTraits,
Instance,
Int,
List,
on_trait_change,
)

from traits_futures.toolkit_support import toolkit

Expand Down Expand Up @@ -104,6 +111,28 @@ def _pingee_default(self):
)


class MultipleListeners(HasStrictTraits):
"""
Listener for PingListeners, accumulating pings from all listeners.
"""

# The individual PingListeners to listen to.
listeners = List(Instance(PingListener))

#: Event fired every time a ping is received.
ping = Event()

#: Total number of pings received from all listeners.
ping_count = Int(0)

def _ping_fired(self):
self.ping_count += 1

@on_trait_change("listeners:ping")
def _transmit_ping(self):
self.ping = True


class TestPinger(GuiTestAssistant, unittest.TestCase):
def setUp(self):
GuiTestAssistant.setUp(self)
Expand Down Expand Up @@ -148,6 +177,23 @@ def test_multiple_background_pingers(self):

self.assertEqual(self.listener.ping_count, 15)

def test_multiple_pingees(self):
listener1 = PingListener()
listener2 = PingListener()
listeners = MultipleListeners(listeners=[listener1, listener2])

with BackgroundPinger(listener1.pingee) as pinger1:
with BackgroundPinger(listener2.pingee) as pinger2:
pinger1.ping(3)
pinger2.ping(4)

self.run_until(
listeners, "ping", lambda obj: obj.ping_count >= 7
)

self.assertEqual(listener1.ping_count, 3)
self.assertEqual(listener2.ping_count, 4)

def test_background_threads_finish_before_event_loop_starts(self):
# Previous tests keep the background threads running until we've
# received the expected number of pings. But that shouldn't be
Expand Down
16 changes: 4 additions & 12 deletions traits_futures/wx/pinger.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,11 @@
the main thread execute a (fixed, parameterless) callback.
"""

import wx
import wx.lib.newevent


#: Event type that's unique to the Pinger infrastructure.
_PING_EVENT_TYPE = wx.NewEventType()


class _PingEvent(wx.PyCommandEvent):
""" wx event used to signal that a message has been sent """

def __init__(self):
wx.PyCommandEvent.__init__(self, _PING_EVENT_TYPE)
#: Create new event type that's unique to the Pinger infrastructure.
_PingEvent, _PingEventBinder = wx.lib.newevent.NewEvent()


class Pinger:
Expand Down Expand Up @@ -77,8 +70,7 @@ class Pingee(wx.EvtHandler):
def __init__(self, on_ping):
wx.EvtHandler.__init__(self)
self._on_ping = on_ping
self._binder = wx.PyEventBinder(_PING_EVENT_TYPE)
self.Bind(self._binder, self._on_ping_event)
self.Bind(_PingEventBinder, self._on_ping_event)

def _on_ping_event(self, event):
"""
Expand Down

0 comments on commit 60efc6c

Please sign in to comment.