Browse Source

new object oriented tasks!

Zachary Pavlov 18 years ago
parent
commit
fa4278b3ae
2 changed files with 39 additions and 2 deletions
  1. 28 0
      direct/src/showbase/DirectObject.py
  2. 11 2
      direct/src/task/Task.py

+ 28 - 0
direct/src/showbase/DirectObject.py

@@ -43,3 +43,31 @@ class DirectObject:
 
     def classTree(self):
         return ClassTree(self)
+
+    #This function must be used if you want a managed task
+    def addTask(self, *args, **kwargs):
+        if(not hasattr(self,"_taskList")):
+            self._taskList = {}
+        kwargs['owner']=self
+        task = taskMgr.add(*args, **kwargs)
+        self._taskList[task.id] = task
+        return task
+    
+    def doMethodLater(self, *args, **kwargs):
+        if(not hasattr(self,"_taskList")):
+            self._taskList ={}
+        kwargs['owner']=self            
+        task = taskMgr.doMethodLater(*args, **kwargs)
+        self._taskList[task.id] = task
+        return task
+    
+    def removeTask(self, task):
+        task.remove()
+
+    def removeAllTasks(self):
+        for task in self._taskList.values():
+            task.remove()
+
+    def _clearTask(self, task):
+        del self._taskList[task.id]        
+        

+ 11 - 2
direct/src/task/Task.py

@@ -84,6 +84,10 @@ class Task:
         # Unique ID for each task
         self.id = Task.count
         Task.count += 1
+
+        #set to have the task managed
+        self.owner = None
+
         self.__call__ = callback
         self._priority = priority
         self._removed = 0
@@ -125,6 +129,8 @@ class Task:
 
     def remove(self):
         if not self._removed:
+            if(self.owner):
+                self.owner._clearTask(self)
             self._removed = 1
             # Remove any refs to real objects
             # In case we hang around the doLaterList for a while
@@ -474,7 +480,7 @@ class TaskManager:
         return cont
 
     def doMethodLater(self, delayTime, funcOrTask, name, extraArgs=None,
-            priority=0, uponDeath=None, appendTask=False):
+            priority=0, uponDeath=None, appendTask=False, owner = None):
         if delayTime < 0:
             self.notify.warning('doMethodLater: added task: %s with negative delay: %s' % (name, delayTime))
         if isinstance(funcOrTask, Task):
@@ -485,6 +491,7 @@ class TaskManager:
             self.notify.error('doMethodLater: Tried to add a task that was not a Task or a func')
         task.setPriority(priority)
         task.name = name
+        task.owner = owner
         if extraArgs == None:
             extraArgs = []
             appendTask = True
@@ -518,7 +525,8 @@ class TaskManager:
         return task
 
     def add(self, funcOrTask, name, priority=0, extraArgs=None, uponDeath=None,
-            appendTask = False):
+            appendTask = False, owner = None):
+        
         """
         Add a new task to the taskMgr.
         You can add a Task object or a method that takes one argument.
@@ -533,6 +541,7 @@ class TaskManager:
                 'add: Tried to add a task that was not a Task or a func')
         task.setPriority(priority)
         task.name = name
+        task.owner = owner
         if extraArgs == None:
             extraArgs = []
             appendTask = True