B
    b_#                 @   s   d Z dZddlZddlZG dd deZG dd dZG dd	 d	eZe ZG d
d deZe Zi Z	i Z
e ZeedfddZeedfddZefddZdd Zdd ZG dd dZdd Zdd Zdd ZdS )z,Provides global signal dispatching services.z(Patrick K. O'Brien <pobrien@orbtech.com>    Nc               @   s   e Zd ZdddZdS )DispatcherErrorNc             C   s
   || _ d S )N)args)selfr    r   /lib/python3.7/site-packages/wx/py/dispatcher.py__init__
   s    zDispatcherError.__init__)N)__name__
__module____qualname__r   r   r   r   r   r   	   s   r   c               @   s   e Zd ZdZdd ZdS )	Parameterz+Used to represent default parameter values.c             C   s   | j jS )N)	__class__r   )r   r   r   r   __repr__   s    zParameter.__repr__N)r   r	   r
   __doc__r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )AnyN)r   r	   r
   r   r   r   r   r      s    r   c               @   s   e Zd ZdS )	AnonymousN)r   r	   r
   r   r   r   r   r      s    r   Tc       	      C   s   |dkrt d|rt| } t|}i }|tkr:t| }nF|t|< |dtfkr|fdd}yt||}|t|< W n   Y nX g }||kr|| }n|||< y||  W n t	k
r   Y nX |
|  dS )a  
    Connect receiver to sender for signal.

    * If sender is Any, receiver will receive signal from any sender.
    * If signal is Any, receiver will receive any signal from sender.
    * If sender is None, receiver will receive signal from Anonymous.
    * If signal is Any and sender is None, receiver will receive any
      signal from Anonymous.
    * If signal is Any and sender is Any, receiver will receive any
      signal from any sender.
    * If weak is true, weak references will be used.
    Nzsignal cannot be Nonec             S   s   t |d d S )N)	senderkey)_removeSender)objectr   r   r   r   remove8   s    zconnect.<locals>.remove)r   safeRefidconnectionsr   weakrefrefsendersr   
ValueErrorappend)	receiversignalsenderweakr   signalsr   Z
weakSender	receiversr   r   r   connect   s2    

r#   c             C   s   |dkrt d|rt| } t|}yt| | }W n$ tk
rX   t d||f Y nX y||  W n& tk
r   t d| ||f Y nX t|| dS )zDisconnect receiver from sender for signal.

    Disconnecting is not required. The use of disconnect is the same as for
    connect, only in reverse. Think of it as undoing a previous connection.Nzsignal cannot be Nonez)No receivers for signal %r from sender %sz9No connection to receiver %s for signal %r from sender %s)r   r   r   r   KeyErrorr   r   _cleanupConnections)r   r   r   r    r   r"   r   r   r   
disconnectL   s    r&   c       
      K   s  t |}t t}g }y|t| |   W n tk
r>   Y nX g }yt| t }W n tk
rh   Y nX x$|D ]}||dkrp|| qpW g }yt| |  }W n tk
r   Y nX x$|D ]}||dkr|| qW g }yt| t }W n tk
r
   Y nX x(|D ] }||dkr|| qW g }xb|D ]Z}t|tj	ks`t
|trt| }|dkrtq@t|f| |d|}	|||	fg7 }q@W |S )zSend signal from sender to all connected receivers.

    Return a list of tuple pairs [(receiver, response), ... ].
    If sender is not specified, signal is sent anonymously.r   N)r   r   )r   r   extendr   r$   countr   typer   ReferenceType
isinstanceBoundMethodWeakref_call)
r   r   kwdsr   Zanykeyr"   Zanyreceiversr   Z	responsesZresponser   r   r   send`   sR    




r/   c             K   s   t | dr(t | jds"t | jdr(| j} t | drL| jj}|jd|j }n6t | drn| j}|jd|j }ntd| t| f |jd@ sxt	|D ]}||kr||= qW | f |S )z0Call receiver with only arguments it can accept.__call____func____code__   r   zUnknown receiver %s of type %s   )
hasattrr0   r1   r2   co_varnamesco_argcountr   r)   co_flagslist)r   r.   ZfcZ
acceptableargr   r   r   r-      s    




r-   c             C   sj   t | dr^| jdk	r^| j}| j}|tkr4t t|< |t| krRt| dt| |< t| | S t| tS )z4Return a *safe* weak reference to a callable object.__self__N)boundMethod)	r5   r;   r1   _boundMethodsr   WeakKeyDictionaryr,   r   _removeReceiver)r   ZselfkeyZfunckeyr   r   r   r      s    

r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r,   zBoundMethodWeakref class.c             C   s6   d| _ | fdd}t|j|| _t|j|| _dS )z9Return a weak-reference-like instance for a bound method.r   c             S   s   d|_ t|d dS )z=Set self.isDead to true when method or instance is destroyed.r3   )r   N)isDeadr?   )r   r   r   r   r   r      s    z+BoundMethodWeakref.__init__.<locals>.removeN)r@   r   r   r;   weakSelfr1   weakFunc)r   r<   r   r   r   r   r      s    zBoundMethodWeakref.__init__c             C   s   d| j | jf S )z"Return the closest representation.z <bound method weakref for %s.%s>)rA   rB   )r   r   r   r   r      s    zBoundMethodWeakref.__repr__c             C   s@   | j r
dS |  }|  j}y
t||S  tk
r:   dS X dS )z.Return a strong reference to the bound method.N)r@   rA   rB   r   getattrAttributeError)r   r   methodr   r   r   r0      s    

zBoundMethodWeakref.__call__N)r   r	   r
   r   r   r   r0   r   r   r   r   r,      s   
r,   c             C   sR   dd t D }x>|D ]6\}}yt | | |  W n   Y nX t|| qW dS )z!Remove receiver from connections.c             S   s"   g | ]}t | D ]}||fqqS r   )r   ).0r   r   r   r   r   
<listcomp>   s   z#_removeReceiver.<locals>.<listcomp>N)r   r   r%   )r   Z	list_keysr   r   r   r   r   r?      s    r?   c             C   s.   t |  | }|s*t |  }||= |s*t|  dS )zBDelete any empty signals for senderkey. Delete senderkey if empty.N)r   r   )r   r   r"   r!   r   r   r   r%      s    r%   c             C   s"   t | = y
t| = W n   Y nX dS )z"Remove senderkey from connections.N)r   r   )r   r   r   r   r      s
    
r   )r   
__author__typesr   	Exceptionr   r   r   r   r   r   r>   r=   r#   r&   r/   r-   r   r,   r?   r%   r   r   r   r   r   <module>   s*   -7