pyqtgraph/SignalProxy.py
2010-07-27 00:13:23 -04:00

62 lines
1.9 KiB
Python

# -*- coding: utf-8 -*-
from PyQt4 import QtCore
from ptime import time
def proxyConnect(source, signal, slot, delay=0.3):
"""Connect a signal to a slot with delay. Returns the SignalProxy
object that was created. Be sure to store this object so it is not
garbage-collected immediately."""
sp = SignalProxy(source, signal, delay)
sp.connect(sp, signal, slot)
return sp
class SignalProxy(QtCore.QObject):
"""Object which collects rapid-fire signals and condenses them
into a single signal. Used, for example, to prevent a SpinBox
from generating multiple signals when the mouse wheel is rolled
over it."""
def __init__(self, source, signal, delay=0.3):
QtCore.QObject.__init__(self)
source.connect(source, signal, self.signal)
self.delay = delay
self.waitUntil = 0
self.args = None
self.timers = 0
self.signal = signal
def setDelay(self, delay):
self.delay = delay
def flush(self):
"""If there is a signal queued up, send it now."""
if self.args is None:
return False
self.emit(self.signal, *self.args)
self.args = None
return True
def signal(self, *args):
"""Received signal, queue to be forwarded later."""
self.waitUntil = time() + self.delay
self.args = args
self.timers += 1
QtCore.QTimer.singleShot((self.delay*1000)+1, self.tryEmit)
def tryEmit(self):
"""Emit signal if it has been long enougn since receiving the last signal."""
if self.args is None:
return False
self.timers -= 1
t = time()
if t >= self.waitUntil:
return self.flush()
else:
if self.timers == 0:
self.timers += 1
QtCore.QTimer.singleShot((self.waitUntil - t) * 1000, self.tryEmit)
return True