~timo-jyrinki/ubuntu/trusty/pitivi/backport_utopic_fixes

« back to all changes in this revision

Viewing changes to pitivi/receiver.py

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2014-04-05 15:28:16 UTC
  • mfrom: (6.1.13 sid)
  • Revision ID: package-import@ubuntu.com-20140405152816-6lijoax4cngiz5j5
Tags: 0.93-3
* debian/control:
  + Depend on python-gi (>= 3.10), older versions do not work
    with pitivi (Closes: #732813).
  + Add missing dependency on gir1.2-clutter-gst-2.0 (Closes: #743692).
  + Add suggests on gir1.2-notify-0.7 and gir1.2-gnomedesktop-3.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
from types import MethodType
2
 
 
3
 
 
4
 
class _receiver_data(object):
5
 
 
6
 
    sender = None
7
 
    sigids = None
8
 
 
9
 
 
10
 
class receiver(object):
11
 
 
12
 
    """A descriptor which wrapps signal connect and disconnect for a single
13
 
    object (the sender). Signal handlers may be registered with the
14
 
    add_handler() method, after which point the handler will be automatically
15
 
    connected when the property value is set. Prior to connecting new signal
16
 
    handlers, old handlers are disconnected."""
17
 
 
18
 
    def __init__(self, setter=None):
19
 
        object.__init__(self)
20
 
        self.handlers = {}
21
 
        self.setter = setter
22
 
 
23
 
    def __get__(self, instance, blah):
24
 
        if hasattr(instance, "_receiver_data"):
25
 
            return instance._receiver_data[self].sender
26
 
        return None
27
 
 
28
 
    def __set__(self, instance, value):
29
 
        if not hasattr(instance, "_receiver_data"):
30
 
            instance._receiver_data = {}
31
 
        if not self in instance._receiver_data:
32
 
            instance._receiver_data[self] = _receiver_data()
33
 
            instance._receiver_data[self].sigids = {}
34
 
        rd = instance._receiver_data[self]
35
 
 
36
 
        # explicitly check for None, because sometimes valid instances have a
37
 
        # False truth value. We don't want to forget to disconnect any signals,
38
 
        # and at the same time we don't want to fail to connect a valid
39
 
        # instance of, say, an empty container.
40
 
        if rd.sender != None:
41
 
            for sid in rd.sigids.itervalues():
42
 
                instance._receiver_data[self].sender.disconnect(sid)
43
 
            rd.sender = None
44
 
            rd.sigids = {}
45
 
        if not (value is None):
46
 
            for sig, hdlr in self.handlers.iteritems():
47
 
                rd.sigids[sig] = value.connect(sig, MethodType(hdlr,
48
 
                    instance))
49
 
            rd.sender = value
50
 
        if self.setter:
51
 
            self.setter(instance)
52
 
 
53
 
    def add_handler(self, signal, hdlr):
54
 
        self.handlers[signal] = hdlr
55
 
 
56
 
 
57
 
def handler(prop, signal):
58
 
 
59
 
    """A decorator which registers a given function as a signal handler for
60
 
    the signal <signal> of object <property>. Property should be a receiver
61
 
    object created with receiver()."""
62
 
 
63
 
    def __handler__(func):
64
 
        prop.add_handler(signal, func)
65
 
        return func
66
 
 
67
 
    return __handler__