Source code for direct.showbase.DirectObject

"""Defines the DirectObject class, a convenient class to inherit from if the
object needs to be able to respond to events."""

__all__ = ['DirectObject']

from direct.directnotify.DirectNotifyGlobal import directNotify
from direct.task.TaskManagerGlobal import taskMgr
from .MessengerGlobal import messenger


[docs]class DirectObject: """ This is the class that all Direct/SAL classes should inherit from """ #def __del__(self): # This next line is useful for debugging leaks #print "Destructing: ", self.__class__.__name__ # Wrapper functions to have a cleaner, more object oriented approach to # the messenger functionality.
[docs] def accept(self, event, method, extraArgs=[]): return messenger.accept(event, self, method, extraArgs, 1)
[docs] def acceptOnce(self, event, method, extraArgs=[]): return messenger.accept(event, self, method, extraArgs, 0)
[docs] def ignore(self, event): return messenger.ignore(event, self)
[docs] def ignoreAll(self): return messenger.ignoreAll(self)
[docs] def isAccepting(self, event): return messenger.isAccepting(event, self)
[docs] def getAllAccepting(self): return messenger.getAllAccepting(self)
[docs] def isIgnoring(self, event): return messenger.isIgnoring(event, self)
#This function must be used if you want a managed task
[docs] def addTask(self, *args, **kwargs): if not hasattr(self, "_taskList"): self._taskList = {} kwargs['owner'] = self task = taskMgr.add(*args, **kwargs) return task
[docs] def doMethodLater(self, *args, **kwargs): if not hasattr(self, "_taskList"): self._taskList = {} kwargs['owner'] = self task = taskMgr.doMethodLater(*args, **kwargs) return task
[docs] def removeTask(self, taskOrName): if isinstance(taskOrName, str): # we must use a copy, since task.remove will modify self._taskList if hasattr(self, '_taskList'): taskListValues = list(self._taskList.values()) for task in taskListValues: if task.name == taskOrName: task.remove() else: taskOrName.remove()
[docs] def removeAllTasks(self): if hasattr(self, '_taskList'): for task in list(self._taskList.values()): task.remove()
def _addTask(self, task): self._taskList[task.id] = task def _clearTask(self, task): del self._taskList[task.id]
[docs] def detectLeaks(self): if not __dev__: return # call this after the DirectObject instance has been destroyed # if it's leaking, will notify user # make sure we're not still listening for messenger events events = messenger.getAllAccepting(self) # make sure we're not leaking tasks # TODO: include tasks that were added directly to the taskMgr tasks = [] if hasattr(self, '_taskList'): tasks = [task.name for task in self._taskList.values()] if len(events) != 0 or len(tasks) != 0: estr = ('listening to events: %s' % events if len(events) != 0 else '') andStr = (' and ' if len(events) != 0 and len(tasks) != 0 else '') tstr = ('%srunning tasks: %s' % (andStr, tasks) if len(tasks) != 0 else '') notify = directNotify.newCategory('LeakDetect') crash = getattr(getRepository(), '_crashOnProactiveLeakDetect', False) func = (self.notify.error if crash else self.notify.warning) func('destroyed %s instance is still %s%s' % (self.__class__.__name__, estr, tstr))
#snake_case alias: add_task = addTask do_method_later = doMethodLater detect_leaks = detectLeaks accept_once = acceptOnce ignore_all = ignoreAll get_all_accepting = getAllAccepting is_ignoring = isIgnoring remove_all_tasks = removeAllTasks remove_task = removeTask is_accepting = isAccepting