62 lines
1.9 KiB
Python
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
|
||
|
|
||
|
|
||
|
|