Hide keyboard shortcuts

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:: 

15 

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() 

23 

24 # Execute handler every 500 msec. at idle time. 

25 timer = g.IdleTime(c,handler,delay=500) 

26 if timer: timer.start() 

27 

28 Timer instances are completely independent:: 

29 

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() 

36 

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() 

43 

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)}>" 

86 

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) 

129 

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