o
    	^W$                     @   s@   d dl mZ G dd deZG dd deZdd Zdd	 Zd
S )   )_gic                   @   sj   e Zd ZdZG dd deZdddZddejdddddfdd	Z	dd
dZ
dd ZdddZdd ZdS )Signala  Object 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                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )zSignal.BoundSignalz
        Temporary binding object which can be used for connecting signals
        without specifying the signal name string to connect.
        c                 O   s   t | |S N)str__new__clsnameargskargs r   2/usr/lib/python3/dist-packages/gi/_signalhelper.pyr   N   s   zSignal.BoundSignal.__new__c                 C   s   t |  || _|| _d S r   )r   __init__signalgobj)selfr   r   r   r   r   r   Q   s   

zSignal.BoundSignal.__init__c                 C   s   d|  S )NzBoundSignal("%s")r   r   r   r   r   __repr__V   s   zSignal.BoundSignal.__repr__c                 O   s   | j j| jg|R i |S )zCall the signals closure.)r   funcr   r   r
   r   r   r   r   __call__Y   s   zSignal.BoundSignal.__call__c                 O   s   | j j| |g|R i |S )z^Same as GObject.Object.connect except there is no need to specify
            the signal name.r   connect)r   callbackr
   r   r   r   r   r   ]   s   zSignal.BoundSignal.connectc                 O   s$   | j j| d | |g|R i |S )a
  Same as GObject.Object.connect except there is no need to specify
            the signal name. In addition concats "::<detail>" to the signal name
            when connecting; for use with notifications like "notify" when a property
            changes.
            z::r   )r   r   detailr
   r   r   r   r   connect_detailedb   s   $z#Signal.BoundSignal.connect_detailedc                 C   s   | j | dS )z"Same as GObject.Object.disconnect.N)r   
disconnect)r   
handler_idr   r   r   r   j   s   zSignal.BoundSignal.disconnectc                 O   s   | j jt| g|R i |S )z[Same as GObject.Object.emit except there is no need to specify
            the signal name.)r   emitr   r   r   r   r   r   n   s   zSignal.BoundSignal.emitN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   BoundSignalI   s    r#    c                 O   s   t |r|j}t| |S r   )callabler   r   r   r   r   r   r   r   s   s   zSignal.__new__Nc	           	      C   s   |d u r
t |r
|}|r|s|j}t|  |r"|s"|s"t|\}}|d u r)t }|| _|| _|| _|| _	|| _|| _
|| _d S r   )r%   r"   r   r   get_signal_annotationstupler   flagsreturn_type	arg_typesaccumulator	accu_data)	r   r	   r   r(   r)   r*   docr+   r,   r   r   r   r   x   s    

zSignal.__init__c                 C   s   |du r| S |  | |S )z:Returns a BoundSignal when accessed on an object instance.N)r#   )r   instanceownerr   r   r   __get__   s   zSignal.__get__c              
   O   sh   t |tjr| j|g|R i | dS t| rt| }n|j}t| ||| j| j| j	| j
| j| jdS )zmAllows for instantiated Signals to be used as a decorator or calling
        of the underlying signal method.r	   r   r(   r)   r*   r-   r+   r,   N)
isinstancer   GObjectr   r   r   typer(   r)   r*   r"   r+   r,   )r   objr
   r   r	   r   r   r   r      s   
zSignal.__call__c              
   C   s*   t | || j| j| j| j| j| j| jdS )z%Returns a renamed copy of the Signal.r1   )r4   r   r(   r)   r*   r"   r+   r,   )r   newNamer   r   r   copy   s   zSignal.copyc                 C   s   | j | j| j| j| jfS )zKReturns a tuple of: (flags, return_type, arg_types, accumulator, accu_data))r(   r)   r*   r+   r,   r   r   r   r   get_signal_args   s   zSignal.get_signal_args)r$   r   )r   r    r!   r"   r   r#   r   r   SIGNAL_RUN_FIRSTr   r0   r   r7   r8   r   r   r   r   r      s    1
*



r   c                   @   s   e Zd ZdZdd ZdS )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
    c                 C   s   dS )zReturns the string 'override'.overrider   r   r   r   r   r8      s   zSignalOverride.get_signal_argsN)r   r    r!   r"   r8   r   r   r   r   r:      s    r:   c                    sZ   t  }d}t| dr)ddl}||  t  fdd jD }d jv r) jd }||fS )a  Attempt 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__    c                 3   s$    | ]}| j v r j | V  qd S r   )annotations).0argspecr   r   	<genexpr>   s    z)get_signal_annotations.<locals>.<genexpr>return)r'   hasattrinspectgetfullargspecr
   r>   )r   r*   r)   rF   r   rA   r   r&      s   



r&   c                 C   s   | j di }i }| j  D ]0\}}t|tr>t|}|s*|}||}t| || ||v r4td| |||< |	 ||< q|| _
| D ]\}}|jdurcd|dd }t| |sct| ||j qFdS )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.Ndo_-_)__dict__getitemsr2   r   r   r7   setattr
ValueErrorr8   rH   r   replacerE   )r   gsignals
newsignalsr	   r   
signalNamefuncNamer   r   r   install_signals   s,   



rV   N)r$   r   r   r   r:   r&   rV   r   r   r   r   <module>   s    