U
    ÍZjW$  ã                   @   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   úS/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-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f|ž|Ž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| |f|ž|Ž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 | |f|ž|Ž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   Z
handler_idr   r   r   r   j   s    zSignal.BoundSignal.disconnectc                 O   s   | j jt| ƒf|ž|Ž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 krt |ƒr|}|r"|s"|j}t | ¡ |rD|sD|sDt|ƒ\}}|d krRtƒ }|| _|| _|| _|| _	|| _|| _
|| _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k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   sd   t |tjƒr | j|f|ž|Ž n@t| ƒr2t| ƒ}n|j}t| ƒ||| j| j| j	| j
| j| jd�S 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   Z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.r0   )r2   r   r'   r(   r)   r!   r*   r+   )r   Z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#   )N)N)r   r   r    r!   r   r"   r   r   ZSIGNAL_RUN_FIRSTr   r/   r   r4   r5   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   r5   Â   s    zSignalOverride.get_signal_argsN)r   r   r    r!   r5   r   r   r   r   r6   µ   s   r6   c                    sZ   t ƒ }d}t| dƒrRddl}| | ¡‰ t ‡ fdd„ˆ jD ƒƒ}dˆ jkrRˆ 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 k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(   rB   r   r=   r   r%   Ç   s    



r%   c                 C   sÌ   | j  di ¡}i }| j  ¡ D ]`\}}t|tƒrt|ƒ}|sT|}| |¡}t| ||ƒ ||krhtd| ƒ‚|||< | 	¡ ||< q|| _
| ¡ D ]:\}}|jdk	rŒd| dd¡ }t| |ƒsŒt| ||jƒ qŒd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.NZdo_ú-Ú_)Ú__dict__ÚgetÚitemsr1   r   r   r4   ÚsetattrÚ
ValueErrorr5   rD   r   ÚreplacerA   )r   ZgsignalsZ
newsignalsr	   r   Z
signalNameÚfuncNamer   r   r   Úinstall_signalsÜ   s&    



rN   N)r#   r   r   r   r6   r%   rN   r   r   r   r   Ú<module>   s
    