InterestWatcher.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from direct.directnotify.DirectNotifyGlobal import directNotify
  2. from direct.showbase.DirectObject import DirectObject
  3. from direct.showbase.EventGroup import EventGroup
  4. class InterestWatcher(DirectObject):
  5. """Object that observes all interests adds/removes over a period of time,
  6. and sends out an event when all of those interests have closed"""
  7. notify = directNotify.newCategory('InterestWatcher')
  8. def __init__(self, interestMgr, name, doneEvent=None,
  9. recurse=True, start=True, mustCollect=False, doCollectionMgr=None):
  10. DirectObject.__init__(self)
  11. self._interestMgr = interestMgr
  12. if doCollectionMgr is None:
  13. doCollectionMgr = interestMgr
  14. self._doCollectionMgr = doCollectionMgr
  15. self._eGroup = EventGroup(name, doneEvent=doneEvent)
  16. self._doneEvent = self._eGroup.getDoneEvent()
  17. self._gotEvent = False
  18. self._recurse = recurse
  19. if self._recurse:
  20. # this will hold a dict of parentId to set(zoneIds) that are closing
  21. self.closingParent2zones = {}
  22. if start:
  23. self.startCollect(mustCollect)
  24. def startCollect(self, mustCollect=False):
  25. self._mustCollect = mustCollect
  26. self.accept(self._interestMgr._getAddInterestEvent(), self._handleInterestOpenEvent)
  27. self.accept(self._interestMgr._getRemoveInterestEvent(), self._handleInterestCloseEvent)
  28. def stopCollect(self):
  29. self.ignore(self._interestMgr._getAddInterestEvent())
  30. self.ignore(self._interestMgr._getRemoveInterestEvent())
  31. mustCollect = self._mustCollect
  32. del self._mustCollect
  33. if not self._gotEvent:
  34. if mustCollect:
  35. logFunc = self.notify.error
  36. else:
  37. logFunc = self.notify.warning
  38. logFunc('%s: empty interest-complete set' % self.getName())
  39. self.destroy()
  40. messenger.send(self.getDoneEvent())
  41. else:
  42. self.accept(self.getDoneEvent(), self.destroy)
  43. def destroy(self):
  44. if hasattr(self, '_eGroup'):
  45. self._eGroup.destroy()
  46. del self._eGroup
  47. del self._gotEvent
  48. del self._interestMgr
  49. self.ignoreAll()
  50. def getName(self):
  51. return self._eGroup.getName()
  52. def getDoneEvent(self):
  53. return self._doneEvent
  54. def _handleInterestOpenEvent(self, event):
  55. self._gotEvent = True
  56. self._eGroup.addEvent(event)
  57. def _handleInterestCloseEvent(self, event, parentId, zoneIdList):
  58. self._gotEvent = True
  59. self._eGroup.addEvent(event)
  60. """
  61. if self._recurse:
  62. # this interest is in the process of closing. If an interest
  63. # underneath any objects in that interest close, we need to know
  64. # about it.
  65. self.closingParent2zones.setdefault(parentId, set())
  66. self.closingParent2zones[parentId].union(set(zoneIdList))
  67. """