Mercurial > fife-parpg
diff engine/extensions/fife_timer.py @ 255:51cc05d862f2
Merged editor_rewrite branch to trunk.
This contains changes that may break compatibility against existing clients.
For a list of changes that may affect your client, see: http://wiki.fifengine.de/Changes_to_pychan_and_FIFE_in_editor_rewrite_branch
author | cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Mon, 08 Jun 2009 16:00:02 +0000 |
parents | |
children | 48c99636453e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/extensions/fife_timer.py Mon Jun 08 16:00:02 2009 +0000 @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +import fife + +""" +Convenient timers +================= + +Usage:: + import timer + timer.init( my_fife_engine.getTimeManager() ) + def spam(): + print "SPAM SPAM ", + return "More spam?" # a string is a true value, so it's repeated. + repeater = timer.repeatCall(500,spam) + def stop_spam(): + repeater.stop() + print "BACON EGGS AND SPAM" + timer.delayCall(50000,stop_spam) + +""" + + +_manager = None +_alltimers = {} + +def init(timemanager): + """ + Initialize timers. + + @param timemanager: A L{fife.TimeManager} as retuned by L{fife.Engine.getTimeManager}. + """ + global _manager + _manager = timemanager + +class Timer(fife.TimeEvent): + def __init__(self,delay=0,callback=None): + super(Timer,self).__init__(0) + self.manager = _manager + self.is_registered = False + self.callback = callback + self.setPeriod(delay) + + def start(self): + if self.is_registered: + return + self.is_registered = True + global _alltimers + _alltimers[self]=1 + self.manager.registerEvent(self) + + def stop(self): + if not self.is_registered: + return + self.is_registered = False + global _alltimers + del _alltimers[self] + self.manager.unregisterEvent(self) + + def updateEvent(self,delta): + if callable(self.callback): + self.callback() + +def delayCall(delay,callback): + """ + Delay a function call by a number of milliseconds. + + @param delay Delay in milliseconds. + @param callback The function to call. + + @return The timer. + """ + timer = Timer(delay) + def cbwa(c, *args): + c(*args) + def real_callback(c, t): + t.stop() + c() + + timer.callback = cbwa(real_callback, callback, timer) + timer.start() + return timer + +from traceback import print_exc +def repeatCall(period,callback): + """ + Repeat a function call. + + @param period Period between calls in milliseconds. + @param callback The function to call. + + @return The timer. + + The call is repeated until the callback returns a False + value (i.e. None) or the timer is stopped. + """ + timer = Timer(period) + def real_callback(): + try: + if not callback(): + timer.stop() + except Exception: + print_exc() + timer.stop() + + timer.callback = real_callback + timer.start() + return timer + +__all__ = [init,Timer,delayCall,repeatCall] +