From 91e326d95063574cba0f6d5064d89ba6521f887d Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Tue, 1 Apr 2008 02:31:21 +0000 Subject: [PATCH] added Pulse, EventPulse, EventArgument --- direct/src/fsm/StatePush.py | 102 ++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/direct/src/fsm/StatePush.py b/direct/src/fsm/StatePush.py index 9ff294f209..2068e976b9 100755 --- a/direct/src/fsm/StatePush.py +++ b/direct/src/fsm/StatePush.py @@ -1,3 +1,11 @@ +# classes for event-driven programming +# http://en.wikipedia.org/wiki/Event-driven_programming + +__all__ = ['StateVar', 'FunctionCall', 'EnterExit', 'Pulse', 'EventPulse', + 'EventArgument', ] + +from direct.showbase.DirectObject import DirectObject + class PushesStateChanges: # base class for objects that broadcast state changes to a set of subscriber objects def __init__(self, value): @@ -154,6 +162,8 @@ if __debug__: sv.destroy() del fc del sv + del handler + del l class EnterExit(StateChangeNode): # call enterFunc when our state becomes true, exitFunc when it becomes false @@ -198,3 +208,95 @@ if __debug__: assert l == [1,0,1,] sv.set(False) assert l == [1,0,1,0,] + ee.destroy() + sv.destroy() + del ee + del sv + del enter + del exit + del l + +class Pulse(PushesStateChanges): + # changes state to True then immediately to False whenever sendPulse is called + def __init__(self): + PushesStateChanges.__init__(self, False) + + def sendPulse(self): + self._handlePotentialStateChange(True) + self._handlePotentialStateChange(False) + +if __debug__: + l = [] + def handler(value, l=l): + l.append(value) + p = Pulse() + fc = FunctionCall(p, handler) + assert l == [] + p.sendPulse() + assert l == [True, False, ] + p.sendPulse() + assert l == [True, False, True, False, ] + fc.destroy() + p.destroy() + del fc + del p + del l + del handler + +class EventPulse(Pulse, DirectObject): + # sends a pulse whenever a specific messenger message is sent + def __init__(self, event): + Pulse.__init__(self) + self.accept(event, self.sendPulse) + + def destroy(self): + self.ignoreAll() + Pulse.destroy(self) + +if __debug__: + l = [] + def handler(value, l=l): + l.append(value) + ep = EventPulse('testEvent') + fc = FunctionCall(ep, handler) + assert l == [] + messenger.send('testEvent') + assert l == [True, False, ] + messenger.send('testEvent') + assert l == [True, False, True, False, ] + fc.destroy() + ep.destroy() + del fc + del ep + del l + del handler + +class EventArgument(PushesStateChanges, DirectObject): + # pushes a particular argument of a particular messenger event + def __init__(self, event, index=0): + PushesStateChanges.__init__(self, None) + self._index = index + self.accept(event, self._handleEvent) + + def destroy(self): + self.ignoreAll() + del self._index + PushesStateChanges.destroy(self) + + def _handleEvent(self, *args): + self._handlePotentialStateChange(args[self._index]) + +if __debug__: + l = [] + def handler(value, l=l): + l.append(value) + ea = EventArgument('testEvent', index=1) + fc = FunctionCall(ea, handler) + messenger.send('testEvent', ['a', 'b']) + assert l == ['b',] + fc.destroy() + ea.destroy() + del fc + del ea + del l +