Browse Source

other->source, push initial state on subscription

Darren Ranalli 18 years ago
parent
commit
26075761d7
1 changed files with 30 additions and 21 deletions
  1. 30 21
      direct/src/fsm/StatePush.py

+ 30 - 21
direct/src/fsm/StatePush.py

@@ -25,6 +25,7 @@ class PushesStateChanges:
 
 
     def _addSubscription(self, subscriber):
     def _addSubscription(self, subscriber):
         self._subscribers.add(subscriber)
         self._subscribers.add(subscriber)
+        subscriber._recvStatePush(self)
 
 
     def _removeSubscription(self, subscriber):
     def _removeSubscription(self, subscriber):
         self._subscribers.remove(subscriber)
         self._subscribers.remove(subscriber)
@@ -48,26 +49,33 @@ if __debug__:
 
 
 class ReceivesStateChanges:
 class ReceivesStateChanges:
     # base class for objects that subscribe to state changes from PushesStateChanges objects
     # base class for objects that subscribe to state changes from PushesStateChanges objects
-    def __init__(self, other):
-        self._other = None
-        self._subscribeTo(other)
+    def __init__(self, source):
+        self._source = None
+        self._initSource = source
+
+    def _finishInit(self):
+        # initialization is split across two functions to allow objects that derive from this
+        # class to set everything up so that they can respond appropriately to the initial
+        # state push from the state source
+        self._subscribeTo(self._initSource)
+        del self._initSource
 
 
     def destroy(self):
     def destroy(self):
         self._unsubscribe()
         self._unsubscribe()
-        del self._other
+        del self._source
 
 
-    def _subscribeTo(self, other):
+    def _subscribeTo(self, source):
         self._unsubscribe()
         self._unsubscribe()
-        self._other = other
-        if self._other:
-            self._other._addSubscription(self)
+        self._source = source
+        if self._source:
+            self._source._addSubscription(self)
 
 
     def _unsubscribe(self):
     def _unsubscribe(self):
-        if self._other:
-            self._other._removeSubscription(self)
-            self._other = None
+        if self._source:
+            self._source._removeSubscription(self)
+            self._source = None
 
 
-    def _recvStatePush(self, other):
+    def _recvStatePush(self, source):
         pass
         pass
 
 
 if __debug__:
 if __debug__:
@@ -94,17 +102,18 @@ if __debug__:
 
 
 class StateChangeNode(PushesStateChanges, ReceivesStateChanges):
 class StateChangeNode(PushesStateChanges, ReceivesStateChanges):
     # base class that can be used to create a state-change notification chain
     # base class that can be used to create a state-change notification chain
-    def __init__(self, other):
-        ReceivesStateChanges.__init__(self, other)
-        PushesStateChanges.__init__(self, other.getState())
+    def __init__(self, source):
+        ReceivesStateChanges.__init__(self, source)
+        PushesStateChanges.__init__(self, source.getState())
+        ReceivesStateChanges._finishInit(self)
 
 
     def destroy(self):
     def destroy(self):
         PushesStateChanges.destroy(self)
         PushesStateChanges.destroy(self)
         ReceivesStateChanges.destroy(self)
         ReceivesStateChanges.destroy(self)
 
 
-    def _recvStatePush(self, other):
+    def _recvStatePush(self, source):
         # got a state push, apply new state to self
         # got a state push, apply new state to self
-        self._handlePotentialStateChange(other._value)
+        self._handlePotentialStateChange(source._value)
 
 
 if __debug__:
 if __debug__:
     sv = StateVar(0)
     sv = StateVar(0)
@@ -134,9 +143,9 @@ if __debug__:
 
 
 class FunctionCall(StateChangeNode):
 class FunctionCall(StateChangeNode):
     # calls func with new state whenever state changes
     # calls func with new state whenever state changes
-    def __init__(self, other, func):
+    def __init__(self, source, func):
         self._func = func
         self._func = func
-        StateChangeNode.__init__(self, other)
+        StateChangeNode.__init__(self, source)
 
 
     def destroy(self):
     def destroy(self):
         StateChangeNode.destroy(self)
         StateChangeNode.destroy(self)
@@ -167,10 +176,10 @@ if __debug__:
 
 
 class EnterExit(StateChangeNode):
 class EnterExit(StateChangeNode):
     # call enterFunc when our state becomes true, exitFunc when it becomes false
     # call enterFunc when our state becomes true, exitFunc when it becomes false
-    def __init__(self, other, enterFunc, exitFunc):
+    def __init__(self, source, enterFunc, exitFunc):
         self._enterFunc = enterFunc
         self._enterFunc = enterFunc
         self._exitFunc = exitFunc
         self._exitFunc = exitFunc
-        StateChangeNode.__init__(self, other)
+        StateChangeNode.__init__(self, source)
 
 
     def destroy(self):
     def destroy(self):
         StateChangeNode.destroy(self)
         StateChangeNode.destroy(self)