o ^W$@s@ddlmZGdddeZGdddeZddZdd Zd S) )_gic@sjeZdZdZGdddeZdddZddejdddddfdd Z dd d Z d d Z dddZ ddZ dS)SignalaObject which gives a nice API for creating and binding signals. :param name: Name of signal or callable closure when used as a decorator. :type name: str or callable :param callable func: Callable closure method. :param GObject.SignalFlags flags: Flags specifying when to run closure. :param type return_type: Return type of the Signal. :param list arg_types: List of argument types specifying the signals function signature :param str doc: Documentation of signal object. :param callable accumulator: Accumulator method with the signature: func(ihint, return_accu, handler_return, accu_data) -> boolean :param object accu_data: User data passed to the accumulator. :Example: .. code-block:: python class Spam(GObject.Object): velocity = 0 @GObject.Signal def pushed(self): self.velocity += 1 @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST) def pulled(self): self.velocity -= 1 stomped = GObject.Signal('stomped', arg_types=(int,)) @GObject.Signal def annotated_signal(self, a:int, b:str): "Python3 annotation support for parameter types. def on_pushed(obj): print(obj) spam = Spam() spam.pushed.connect(on_pushed) spam.pushed.emit() c@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)zSignal.BoundSignalz Temporary binding object which can be used for connecting signals without specifying the signal name string to connect. cOs t||SN)str__new__clsnameargskargsr 2/usr/lib/python3/dist-packages/gi/_signalhelper.pyrNs zSignal.BoundSignal.__new__cCst|||_||_dSr)r__init__signalgobj)selfrrr r r rQs  zSignal.BoundSignal.__init__cCsd|S)NzBoundSignal("%s")r rr r r __repr__VszSignal.BoundSignal.__repr__cOs|jj|jg|Ri|S)zCall the signals closure.)rfuncrrr r r r r __call__YszSignal.BoundSignal.__call__cOs|jj||g|Ri|S)z^Same as GObject.Object.connect except there is no need to specify the signal name.rconnect)rcallbackr r r r r r]szSignal.BoundSignal.connectcOs$|jj|d||g|Ri|S)a Same as GObject.Object.connect except there is no need to specify the signal name. In addition concats "::" to the signal name when connecting; for use with notifications like "notify" when a property changes. z::r)rrdetailr r r r r connect_detailedbs$z#Signal.BoundSignal.connect_detailedcCs|j|dS)z"Same as GObject.Object.disconnect.N)r disconnect)r handler_idr r r rjszSignal.BoundSignal.disconnectcOs|jjt|g|Ri|S)z[Same as GObject.Object.emit except there is no need to specify the signal name.)remitrrr r r rnszSignal.BoundSignal.emitN) __name__ __module__ __qualname____doc__rrrrrrrrr r r r BoundSignalIs r#cOst|r|j}t||Sr)callablerrrrr r r rss zSignal.__new__Nc Cs|dur t|r |}|r|s|j}t||r"|s"|s"t|\}}|dur)t}||_||_||_||_ ||_||_ ||_ dSr) r%r"rrget_signal_annotationstuplerflags return_type arg_types accumulator accu_data) rr rr(r)r*docr+r,r r r rxs     zSignal.__init__cCs|dur|S|||S)z:Returns a BoundSignal when accessed on an object instance.N)r#)rinstanceownerr r r __get__s zSignal.__get__c Osht|tjr|j|g|Ri|dSt|rt|}n|j}t||||j|j|j |j |j |j dS)zmAllows for instantiated Signals to be used as a decorator or calling of the underlying signal method.r rr(r)r*r-r+r,N) isinstancerGObjectrrrtyper(r)r*r"r+r,)robjr r r r r r rs   zSignal.__call__c Cs*t|||j|j|j|j|j|j|jdS)z%Returns a renamed copy of the Signal.r1)r4rr(r)r*r"r+r,)rnewNamer r r copys z Signal.copycCs|j|j|j|j|jfS)zKReturns a tuple of: (flags, return_type, arg_types, accumulator, accu_data))r(r)r*r+r,rr r r get_signal_argsszSignal.get_signal_args)r$r)rr r!r"rr#rrSIGNAL_RUN_FIRSTrr0rr7r8r r r r rs1 *    rc@seZdZdZddZdS)SignalOverridea&Specialized sub-class of Signal which can be used as a decorator for overriding existing signals on GObjects. :Example: .. code-block:: python class MyWidget(Gtk.Widget): @GObject.SignalOverride def configure_event(self): pass cCsdS)zReturns the string 'override'.overrider rr r r r8szSignalOverride.get_signal_argsN)rr r!r"r8r r r r r:s r:csZt}d}t|dr)ddl}||tfddjD}djvr)jd}||fS)aAttempt pulling python 3 function annotations off of 'func' for use as a signals type information. Returns an ordered nested tuple of (return_type, (arg_type1, arg_type2, ...)). If the given function does not have annotations then (None, tuple()) is returned. N__annotations__c3s$|] }|jvrj|VqdSr) annotations).0argspecr r s  z)get_signal_annotations..return)r'hasattrinspectgetfullargspecr r>)rr*r)rFr rAr r&s    r&cCs|jdi}i}|jD]0\}}t|tr>t|}|s*|}||}t|||||vr4td||||<| ||<q||_ |D]\}}|j durcd| dd}t ||sct|||j qFdS)zAdds Signal instances on a GObject derived class into the '__gsignals__' dictionary to be picked up and registered as real GObject signals. __gsignals__z(Signal "%s" has already been registered.Ndo_-_)__dict__getitemsr2rrr7setattr ValueErrorr8rHrreplacerE)rgsignals newsignalsr r signalNamefuncNamer r r install_signalss,       rVN)r$rrrr:r&rVr r r r s