|
|
@@ -1,27 +1,33 @@
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
|
-from direct.showbase.PythonUtil import Functor
|
|
|
+from direct.showbase.PythonUtil import Functor, makeList
|
|
|
from direct.showbase import DirectObject
|
|
|
|
|
|
class BulletinBoardWatcher(DirectObject.DirectObject):
|
|
|
- """This class allows you to wait for a set of posts to be made to the
|
|
|
- bulletin board, and give you a notification when all posts have been
|
|
|
- made. Values of posts are not examined."""
|
|
|
+ """ This class allows you to wait for a set of posts to be made to (or
|
|
|
+ removed from) the bulletin board, and gives you a notification when all
|
|
|
+ posts have been made. Values of posts are not examined."""
|
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('BulletinBoardWatcher')
|
|
|
|
|
|
- def __init__(self, name, postNames, callback):
|
|
|
+ def __init__(self, name, postNames, callback, removeNames=None):
|
|
|
self.notify.debug('__init__: %s, %s, %s' % (name, postNames, callback))
|
|
|
+ if removeNames is None:
|
|
|
+ removeNames = []
|
|
|
self.name = name
|
|
|
- if type(postNames) == type(''):
|
|
|
- postNames = [postNames]
|
|
|
- self.postNames = postNames
|
|
|
+ self.postNames = makeList(postNames)
|
|
|
+ self.removeNames = makeList(removeNames)
|
|
|
self.callback = callback
|
|
|
- self.waitingOn = {}
|
|
|
- for name in postNames:
|
|
|
+ self.waitingOn = set()
|
|
|
+ for name in self.postNames:
|
|
|
if not bboard.has(name):
|
|
|
eventName = bboard.getEvent(name)
|
|
|
- self.acceptOnce(eventName, Functor(self.handlePost, eventName))
|
|
|
- self.waitingOn[eventName] = None
|
|
|
- self.checkDone()
|
|
|
+ self.waitingOn.add(eventName)
|
|
|
+ self.acceptOnce(eventName, Functor(self._handleEvent, eventName))
|
|
|
+ for name in self.removeNames:
|
|
|
+ if bboard.has(name):
|
|
|
+ eventName = bboard.getRemoveEvent(name)
|
|
|
+ self.waitingOn.add(eventName)
|
|
|
+ self.acceptOnce(eventName, Functor(self._handleEvent, eventName))
|
|
|
+ self._checkDone()
|
|
|
|
|
|
def destroy(self):
|
|
|
self.ignoreAll()
|
|
|
@@ -31,13 +37,13 @@ class BulletinBoardWatcher(DirectObject.DirectObject):
|
|
|
def isDone(self):
|
|
|
return len(self.waitingOn) == 0
|
|
|
|
|
|
- def checkDone(self):
|
|
|
+ def _checkDone(self):
|
|
|
if self.isDone():
|
|
|
self.notify.debug('%s: done' % self.name)
|
|
|
self.callback()
|
|
|
|
|
|
- def handlePost(self, eventName):
|
|
|
+ def _handleEvent(self, eventName):
|
|
|
self.notify.debug('%s: handlePost(%s)' % (self.name, eventName))
|
|
|
assert eventName in self.waitingOn
|
|
|
- del self.waitingOn[eventName]
|
|
|
- self.checkDone()
|
|
|
+ self.waitingOn.remove(eventName)
|
|
|
+ self._checkDone()
|