"""Contains the Timer class."""
__all__ = ['Timer']
from panda3d.core import ClockObject
from . import Task
from .TaskManagerGlobal import taskMgr
[docs]class Timer:
    id = 0
[docs]    def __init__(self, name=None):
        self.finalT = 0.0
        self.currT = 0.0
        if name is None:
            name = 'default-timer-%d' % Timer.id
            Timer.id += 1
        self.name = name
        self.started = 0
        self.callback = None 
[docs]    def start(self, t, name):
        if self.started:
            self.stop()
        self.callback = None
        self.finalT = t
        self.name = name
        self.startT = ClockObject.getGlobalClock().getFrameTime()
        self.currT = 0.0
        taskMgr.add(self.__timerTask, self.name + '-run')
        self.started = 1 
[docs]    def startCallback(self, t, callback):
        if self.started:
            self.stop()
        self.callback = callback
        self.finalT = t
        self.startT = ClockObject.getGlobalClock().getFrameTime()
        self.currT = 0.0
        taskMgr.add(self.__timerTask, self.name + '-run')
        self.started = 1 
[docs]    def stop(self):
        if not self.started:
            return 0.0
        taskMgr.remove(self.name + '-run')
        self.started = 0
        return self.currT 
[docs]    def resume(self):
        assert self.currT <= self.finalT
        assert self.started == 0
        self.start(self.finalT - self.currT, self.name) 
[docs]    def restart(self):
        if self.callback is not None:
            self.startCallback(self.finalT, self.callback)
        else:
            self.start(self.finalT, self.name) 
[docs]    def isStarted(self):
        return self.started 
[docs]    def addT(self, t):
        self.finalT = self.finalT + t 
[docs]    def setT(self, t):
        self.finalT = t 
[docs]    def getT(self):
        return self.finalT - self.currT 
    def __timerTask(self, task):
        t = ClockObject.getGlobalClock().getFrameTime()
        te = t - self.startT
        self.currT = te
        if te >= self.finalT:
            if self.callback is not None:
                self.callback()
            else:
                from direct.showbase.MessengerGlobal import messenger
                messenger.send(self.name)
            return Task.done
        return Task.cont