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 )z”Adds 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    