U
    	^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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   Z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.r/   )r1   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   r3   r4   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   r4      s    zSignalOverride.get_signal_argsN)r   r   r   r    r4   r   r   r   r   r5      s   r5   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inspectZgetfullargspecr
   r9   )r   r(   r'   rA   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	rd|dd }t| |st| ||j qd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.NZdo_-_)__dict__getitemsr0   r   r   r3   setattr
ValueErrorr4   rB   r   replacer@   )r   ZgsignalsZ
newsignalsr	   r   Z
signalNameZfuncNamer   r   r   install_signals   s&    



rK   N)r"   r   r   r   r5   r$   rK   r   r   r   r   <module>   s
    