Browse Source

fixed FrameDelayedCall destroy/finish if callback already called, added destroy/finish to DelayedCall

Darren Ranalli 18 years ago
parent
commit
89638440e5
1 changed files with 21 additions and 2 deletions
  1. 21 2
      direct/src/showbase/PythonUtil.py

+ 21 - 2
direct/src/showbase/PythonUtil.py

@@ -2501,8 +2501,23 @@ class DelayedCall:
         if delay is None:
             delay = .01
         self._func = func
-        taskMgr.doMethodLater(delay, self._doCallback, 'DelayedCallback-%s' % name)
+        self._taskName = 'DelayedCallback-%s' % name
+        self._delay = delay
+        self._finished = False
+        self._addDoLater()
+    def destroy(self):
+        self._finished = True
+        self._removeDoLater()
+    def finish(self):
+        if not self._finished:
+            self._doCallback()
+        self.destroy()
+    def _addDoLater(self):
+        taskMgr.doMethodLater(self._delay, self._doCallback, self._taskName)
+    def _removeDoLater(self):
+        taskMgr.remove(self._taskName)
     def _doCallback(self, task):
+        self._finished = True
         func = self._func
         del self._func
         func()
@@ -2519,11 +2534,15 @@ class FrameDelayedCall:
         self._callback = callback
         self._cancelFunc = cancelFunc
         self._taskName = uniqueName('%s-%s' % (self.__class__.__name__, self._name))
+        self._finished = False
         self._startTask()
     def destroy(self):
+        self._finished = True
         self._stopTask()
     def finish(self):
-        self._callback()
+        if not self._finished:
+            self._finished = True
+            self._callback()
         self.destroy()
     def _startTask(self):
         taskMgr.add(self._frameTask, self._taskName)