Coverage for C:\leo.repo\leo-editor\leo\plugins\qt_idle_time.py : 23%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2#@+leo-ver=5-thin
3#@+node:ekr.20140907103315.18777: * @file ../plugins/qt_idle_time.py
4#@@first
5"""Leo's Qt idle-time code."""
6import time
7from leo.core import leoGlobals as g
8from leo.core.leoQt import QtCore
9#@+others
10#@+node:ekr.20141028061518.24: ** class IdleTime
11class IdleTime:
12 """
13 A class that executes a handler with a given delay at idle time. The
14 handler takes a single argument, the IdleTime instance::
16 def handler(timer):
17 \"""IdleTime handler. timer is an IdleTime instance.\"""
18 delta_t = timer.time-timer.starting_time
19 g.trace(timer.count,timer.c.shortFileName(),'%2.4f' % (delta_t))
20 if timer.count >= 5:
21 g.trace('done')
22 timer.stop()
24 # Execute handler every 500 msec. at idle time.
25 timer = g.IdleTime(c,handler,delay=500)
26 if timer: timer.start()
28 Timer instances are completely independent::
30 def handler1(timer):
31 delta_t = timer.time-timer.starting_time
32 g.trace('%2s %s %2.4f' % (timer.count,timer.c.shortFileName(),delta_t))
33 if timer.count >= 5:
34 g.trace('done')
35 timer.stop()
37 def handler2(timer):
38 delta_t = timer.time-timer.starting_time
39 g.trace('%2s %s %2.4f' % (timer.count,timer.c.shortFileName(),delta_t))
40 if timer.count >= 10:
41 g.trace('done')
42 timer.stop()
44 timer1 = g.IdleTime(c,handler1,delay=500)
45 timer2 = g.IdleTime(c,handler2,delay=1000)
46 if timer1 and timer2:
47 timer1.start()
48 timer2.start()
49 """
50 #@+others
51 #@+node:ekr.20140825042850.18406: *3* IdleTime.__init__
52 def __init__(self, handler, delay=500, tag=None):
53 """ctor for IdleTime class."""
54 # For use by handlers...
55 self.count = 0
56 # The number of times handler has been called.
57 self.starting_time = None
58 # Time that the timer started.
59 self.time = None
60 # Time that the handle is called.
61 self.tag = tag
62 # An arbitrary string/object for use during debugging.
63 # For use by the IdleTime class...
64 self.delay = delay
65 # The argument to self.timer.start:
66 # 0 for idle time, otherwise a delay in msec.
67 self.enabled = False
68 # True: run the timer continuously.
69 self.handler = handler
70 # The user-provided idle-time handler.
71 self.waiting_for_idle = False
72 # True if we have already waited for the minimum delay\
73 # Create the timer, but do not fire it.
74 self.timer = QtCore.QTimer()
75 self.timer.timeout.connect(self.at_idle_time)
76 # Add this instance to the global idle_timers.list.
77 # This reference prevents this instance from being destroyed.
78 g.app.idle_timers.append(self)
79 #@+node:ekr.20140825102404.18525: *3* IdleTime.__repr__
80 def __repr__(self):
81 """IdleTime repr."""
82 tag = self.tag
83 if tag:
84 return f"<IdleTime: {tag if isinstance(tag, str) else repr(tag)}>"
85 return f"<IdleTime: id: {id(self)}>"
87 __str__ = __repr__
88 #@+node:ekr.20140825042850.18407: *3* IdleTime.at_idle_time
89 def at_idle_time(self):
90 """Call self.handler not more than once every self.delay msec."""
91 if g.app.killed:
92 self.stop()
93 elif self.enabled:
94 if self.waiting_for_idle:
95 # At idle time: call the handler.
96 self.call_handler()
97 # Requeue the timer with the appropriate delay.
98 # 0 means wait until idle time.
99 self.waiting_for_idle = not self.waiting_for_idle
100 if self.timer.isActive():
101 self.timer.stop()
102 self.timer.start(0 if self.waiting_for_idle else self.delay)
103 elif self.timer.isActive():
104 self.timer.stop()
105 #@+node:ekr.20140825042850.18408: *3* IdleTime.call_handler
106 def call_handler(self):
107 """Carefully call the handler."""
108 try:
109 self.count += 1
110 self.time = time.time()
111 self.handler(self)
112 except Exception:
113 g.es_exception()
114 self.stop()
115 #@+node:ekr.20140825080012.18529: *3* IdleTime.destroy_self
116 def destroy_self(self):
117 """Remove the instance from g.app.idle_timers."""
118 if not g.app.killed and self in g.app.idle_timers:
119 g.app.idle_timers.remove(self)
120 #@+node:ekr.20140825042850.18409: *3* IdleTime.start & stop
121 def start(self):
122 """Start idle-time processing"""
123 self.enabled = True
124 if self.starting_time is None:
125 self.starting_time = time.time()
126 # Wait at least self.delay msec, then wait for idle time.
127 self.last_delay = self.delay
128 self.timer.start(self.delay)
130 def stop(self):
131 """Stop idle-time processing. May be called during shutdown."""
132 self.enabled = False
133 if hasattr(self, 'timer') and self.timer.isActive():
134 self.timer.stop()
135 #@-others
136#@-others
137#@@language python
138#@@tabwidth -4
139#@@pagewidth 70
140#@-leo