Rev 060c33a...Leo build: 20140825070951 contains a spectacular collapse in 
complexity in idle-time handling.

Instantly, registering idle-time event handlers can be considered 
deprecated, though I have no plans to remove the horrendous older code.

The new pattern allows multiple, independent (or cooperating) idle-time 
handlers, created at will as needed.

The new code is based on the IdleTime class in qtGui.py.  Rather than 
access this directly, code should use the g.IdleTime proxy::

    def IdleTime(c,handler,delay=500):
        '''A proxy for the g.app.gui.IdleTime class.'''
        if g.app and g.app.gui and hasattr(g.app.gui,'idleTimeClass'):
            return g.app.gui.idleTimeClass(c,handler,delay)
        else:
            return None

g.IdleTime ensures that all is well when using gui's that don't have an 
IdleTime class.

Here is how to use the new code::

    def handler(it):
        '''The IdleTime handler: called at idle time.'''
        delta_t = it.time-it.starting_time
        g.trace(it.count,it.c.shortFileName(),'%2.4f' % (delta_t))
        if it.count >= 5:
            g.trace('done')
            it.stop()

    it = g.IdleTime(c,handler,delay=500)
    if it: it.start()

The code creates an instance of the IdleTime class that calls the given 
handler at idle time, and no more than once every 500 msec.  Here is the 
output::

    handler 1 ekr.leo 0.5100
    handler 2 ekr.leo 1.0300
    handler 3 ekr.leo 1.5400
    handler 4 ekr.leo 2.0500
    handler 5 ekr.leo 2.5610
    handler done

Timer instances are completely independent.  For example:

    def handler1(it):
        '''The IdleTime handler: called at idle time.'''
        delta_t = it.time-it.starting_time
        g.trace('%2s %s %2.4f' % (it.count,it.c.shortFileName(),delta_t))
        if it.count >= 5:
            g.trace('done')
            it.stop()

    def handler2(it):
        '''The IdleTime handler: called at idle time.'''
        delta_t = it.time-it.starting_time
        g.trace('%2s %s %2.4f' % (it.count,it.c.shortFileName(),delta_t))
        if it.count >= 10:
            g.trace('done')
            it.stop()

    it1 = g.IdleTime(c,handler1,delay=500)
    it2 = g.IdleTime(c,handler2,delay=1000)
    if it1 and it2:
        it1.start()
        it2.start()

Here is the output::

    handler1  1 ekr.leo 0.5200
    handler2  1 ekr.leo 1.0100
    handler1  2 ekr.leo 1.0300
    handler1  3 ekr.leo 1.5400
    handler2  2 ekr.leo 2.0300
    handler1  4 ekr.leo 2.0600
    handler1  5 ekr.leo 2.5600
    handler1 done
    handler2  3 ekr.leo 3.0400
    handler2  4 ekr.leo 4.0600
    handler2  5 ekr.leo 5.0700
    handler2  6 ekr.leo 6.0800
    handler2  7 ekr.leo 7.1000
    handler2  8 ekr.leo 8.1100
    handler2  9 ekr.leo 9.1300
    handler2 10 ekr.leo 10.1400
    handler2 done

That's it.  I plan to use this new code in attempt to do syntax coloring in 
pieces at idle time.  No guarantee that it can work, but I have hopes...

Edward

P.S.  Here is the IdleTime class, as rendered by the flatten-script 
command.  This is beautiful code::

    class IdleTime:
        '''A class that executes a handler at idle time.'''
        def __init__(self,c,handler,delay=500):
            '''ctor for IdleTime class.'''
            # g.trace('(IdleTime)')
            self.c = c
            self.count = 0
                # The number of times handler has been called.
            self.delay = delay
                # The argument to self.timer.start:
                # 0 for idle time, otherwise a delay in msec.
            self.enabled = False
                # True: run the timer continuously.
            self.handler = handler
                # The user-provided idle-time handler.
            self.last_delay = 0
                # The previous value of self.delay.
            self.starting_time = None
                # Time that the timer started.
            self.time = None
                # Time that the handle is called.
            # Create the timer, but do not fire it.
            self.timer = QtCore.QTimer()
            def IdleTime_callback():
                self.at_idle_time()
            self.timer.timeout.connect(IdleTime_callback)

        def at_idle_time(self):
            '''Call self.handler not more than once every self.delay 
msec.'''
            trace = False and not g.unitTesting
            if self.enabled:
                # Idle-time processing is enabled.
                if self.last_delay == 0:
                    # At idle time: call the handler.
                    if trace: g.trace('at idle time')
                    self.call_handler()
                    # Now wait at for at least self.delay msec.
                    self.last_delay = self.delay
                    self.timer.stop()
                    self.timer.start(self.delay)
                else:
                    # We have waited at least self.delay msec.
                    # Now wait for idle time.
                    if trace: g.trace('waiting for idle time')
                    self.last_delay = 0
                    self.timer.stop()
                    self.timer.start(0)
            else:
                # Idle-time processing is disabled.  Stop the timer.
                if trace: g.trace('Stopping timer.')
                self.timer.stop()

        def call_handler(self):
            '''Carefully call the handler.'''
            try:
                self.count += 1
                self.time = time.time()
                self.handler(self)
            except Exception:
                g.es_exception()
                self.stop()

        def start(self):
            '''Start idle-time processing'''
            self.enabled = True
            if self.starting_time is None:
                self.starting_time = time.time()
            # Wait at least self.delay msec, then wait for idle time.
            self.last_delay = self.delay
            self.timer.start(self.delay)
    
        def stop(self):
            '''Stop idle-time processing.'''
            self.enabled = False

EKR

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.

Reply via email to