Viewing file: widgets.py (2.33 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
import time, os
from twisted.internet import task from twisted.python import log, util
from nevow import athena, loaders, static
class Clock(athena.LiveFragment): jsClass = u"WidgetDemo.Clock"
docFactory = loaders.xmlstr('''\ <div xmlns:nevow="http://nevow.com/ns/nevow/0.1" xmlns:athena="http://divmod.org/ns/athena/0.7" nevow:render="liveFragment"> <div> <a href="#"><athena:handler event="onclick" handler="start" /> Start </a> <a href="#"><athena:handler event="onclick" handler="stop" /> Stop </a> </div> <div class="clock-time" /> </div> ''')
running = False
def start(self): if self.running: return self.loop = task.LoopingCall(self.updateTime) self.loop.start(1) self.running = True athena.expose(start)
def stop(self): if not self.running: return self.loop.stop() self.running = False athena.expose(stop)
def _oops(self, err): log.err(err) if self.running: self.loop.stop() self.running = False
def updateTime(self): self.callRemote('setTime', unicode(time.ctime(), 'ascii')).addErrback(self._oops)
class WidgetPage(athena.LivePage): docFactory = loaders.xmlstr("""\ <html xmlns:nevow="http://nevow.com/ns/nevow/0.1"> <head> <nevow:invisible nevow:render="liveglue" /> </head> <body> <div nevow:render="clock"> First Clock </div> <div nevow:render="clock"> Second Clock </div> <div nevow:render="debug" /> </body> </html> """)
addSlash = True
def __init__(self, *a, **kw): super(WidgetPage, self).__init__(*a, **kw) self.jsModules.mapping[u'WidgetDemo'] = util.sibpath(__file__, 'widgets.js')
def childFactory(self, ctx, name): ch = super(WidgetPage, self).childFactory(ctx, name) if ch is None: p = util.sibpath(__file__, name) if os.path.exists(p): ch = static.File(file(p)) return ch
def render_clock(self, ctx, data): c = Clock() c.page = self return ctx.tag[c]
def render_debug(self, ctx, data): f = athena.IntrospectionFragment() f.setFragmentParent(self) return ctx.tag[f]
|