historical/toontown-classic.git/otp/otpbase/OTPTimer.py
2024-01-16 11:20:27 -06:00

120 lines
3.8 KiB
Python

from panda3d.core import Vec4
from direct.gui.DirectGui import DirectFrame, DGG
from direct.task import Task
from direct.showbase.PythonUtil import bound
from otp.otpbase import OTPGlobals
class OTPTimer(DirectFrame):
ClockImage = None
TimerId = 0
def __init__(self, useImage = True, highlightNearEnd = True):
if useImage:
image = self.getImage()
else:
image = None
DirectFrame.__init__(self, state=DGG.DISABLED, relief=None, scale=0.45, image=image, image_pos=(0, 0, 0), text='0', text_fg=(0, 0, 0, 1), text_font=OTPGlobals.getInterfaceFont(), text_pos=(-0.01, -0.15), text_scale=0.35)
self.initialiseoptions(OTPTimer)
self.timerId = OTPTimer.TimerId
OTPTimer.TimerId += 1
self.highlightNearEnd = highlightNearEnd
self.countdownTask = None
self.currentTime = 0
self.taskTime = 0.0
self.setFontColor(Vec4(0, 0, 0, 1))
return
def setFontColor(self, vColor):
self.vFontColor = vColor
def getImage(self):
if OTPTimer.ClockImage == None:
model = loader.loadModel('phase_3.5/models/gui/clock_gui')
OTPTimer.ClockImage = model.find('**/alarm_clock')
model.removeNode()
return OTPTimer.ClockImage
def posInTopRightCorner(self):
self.reparentTo(base.a2dTopRight)
self.setPos(-0.173, 0, -0.17)
def posBelowTopRightCorner(self):
self.reparentTo(base.a2dTopRight)
self.setPos(-0.173, 0, -0.42)
def posAboveShtikerBook(self):
self.reparentTo(base.a2dBottomRight)
self.setPos(-0.173, 0, 0.37)
def posAboveMapButton(self):
self.reparentTo(base.a2dBottomRight)
self.setPos(-0.173, 0, 0.65)
def setTime(self, time):
time = bound(time, 0, 999)
if time == self.currentTime:
return
self.currentTime = time
timeStr = str(time)
timeStrLen = len(timeStr)
if timeStrLen == 1:
if time <= 5 and self.highlightNearEnd:
self.setTimeStr(timeStr, 0.34, (-0.025, -0.125), Vec4(1, 0, 0, 1))
else:
self.setTimeStr(timeStr, 0.34, (-0.025, -0.125))
elif timeStrLen == 2:
self.setTimeStr(timeStr, 0.27, (-0.025, -0.1))
elif timeStrLen == 3:
self.setTimeStr(timeStr, 0.2, (-0.01, -0.08))
def setTimeStr(self, timeStr, scale = 0.2, pos = (-0.01, -0.08), fg = None):
self['text'] = ''
self['text_fg'] = fg or self.vFontColor
self['text_scale'] = scale
self['text_pos'] = pos
self['text'] = timeStr
def getElapsedTime(self):
return self.taskTime
def _timerTask(self, task):
countdownTime = int(task.duration - task.time)
self.setTime(countdownTime)
self.taskTime = task.time
if task.time >= task.duration:
self.timerExpired()
if task.callback:
task.callback()
return Task.done
else:
return Task.cont
def countdown(self, duration, callback = None):
self.countdownTask = Task.Task(self._timerTask)
self.countdownTask.duration = duration
self.countdownTask.callback = callback
taskMgr.remove('timerTask%s' % self.timerId)
return taskMgr.add(self.countdownTask, 'timerTask%s' % self.timerId)
def timerExpired(self):
pass
def stop(self):
if self.countdownTask:
taskMgr.remove(self.countdownTask)
def reset(self):
self.stop()
self.setTime(0)
taskMgr.remove('timerTask%s' % self.timerId)
self.taskTime = 0.0
def destroy(self):
self.reset()
self.countdownTask = None
DirectFrame.destroy(self)
return
def cleanup(self):
self.destroy()
self.notify.warning('Call destroy, not cleanup')