a
    s=ic-                     @   s  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZmZ d	d
lmZmZmZ d	dlmZmZ dd ZddddddddZG dd deZG dd deZG dd deZG dd dZej G dd deZ!dS )z,Interactive figures in the IPython notebook.    )	b64encodeN)Comm)display
JavascriptHTML)is_interactiveGcf)_BackendNavigationToolbar2   )FigureCanvasWebAggCoreFigureManagerWebAggNavigationToolbar2WebAgg)TimerTornadoTimerAsyncioc                  C   s8   dd t  D } t s.| dtt j  d| S )z
    Return a string showing the figure and connection status for the backend.

    This is intended as a diagnostic tool, and not for general use.
    c                 S   s0   g | ](}d j |jj p"d |j|jdqS )z{fig} - {socket}z	Figure {})Zfigsocket)formatcanvasfigureZ	get_labelnumweb_sockets).0manager r   r/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/matplotlib/backends/backend_nbagg.py
<listcomp>   s   
z#connection_info.<locals>.<listcomp>zFigures pending show: 
)r	   Zget_all_fig_managersr   appendlenfigsjoin)resultr   r   r   connection_info   s    r#   z
fa fa-homezfa fa-arrow-leftzfa fa-arrow-rightzfa fa-square-ozfa fa-arrowszfa fa-floppy-o)homebackforwardZzoom_to_rectmovedownloadNc                   @   s    e Zd Zdd ejd D ZdS )NavigationIPyc                 C   s,   g | ]$\}}}}|t v r||t | |fqS r   )_FONT_AWESOME_CLASSES)r   textZtooltip_textZ
image_fileZname_of_methodr   r   r   r   8   s
   
zNavigationIPy.<listcomp>))ZDownloadzDownload plotr(   r(   N)__name__
__module____qualname__r   Z	toolitemsr   r   r   r   r)   5   s
   r)   c                       s   e Zd Ze ZZ fddZedd Zdd Z	dd Z
d	d
 Zedd Zed fdd	Zdd Zdd Zdd Zdd Z  ZS )FigureManagerNbAggc                    s   d| _ t || d S )NF)_shownsuper__init__)selfr   r   	__class__r   r   r2   C   s    zFigureManagerNbAgg.__init__c                    sH   || |  |t  r(      fdd} d|S )Nc                    s      t d S N)mpl_disconnectr	   destroy)eventr   Zcidr   r   r   r8   O   s    
z6FigureManagerNbAgg.create_with_canvas.<locals>.destroyclose_event)r   show	draw_idleZmpl_connect)clsZcanvas_classr   r   r8   r   r:   r   create_with_canvasG   s    
z%FigureManagerNbAgg.create_with_canvasc                 C   s   t tt  d S r6   )r   r   r/   get_javascriptr3   r   r   r   
display_jsV   s    zFigureManagerNbAgg.display_jsc                 C   sf   | j s|   |   n
| j  d| _ t| dr@| j| j t sbddl	m
} |j| jd  d S )NT_cidgcfr   r   )r0   rB   _create_commr   r=   hasattrr7   rC   r   matplotlib._pylab_helpersr	   r    popr   )r3   r	   r   r   r   r<   \   s    


zFigureManagerNbAgg.showc                 C   s   d| _ |   dS )zJ
        A special method to re-show the figure in the notebook.

        FN)r0   r<   rA   r   r   r   reshowm   s    zFigureManagerNbAgg.reshowc                 C   s
   t | jS r6   )boolr   rA   r   r   r   	connectedu   s    zFigureManagerNbAgg.connectedNc                    sV   |d u rt  }n|}t j|d |ttjd j	dd |d u rR|
 S d S )N)streamzweb_backend/js/nbagg_mpl.jszutf-8)encoding)ioStringIOr1   r@   writepathlibPath__file__parent	read_textgetvalue)r>   rK   outputr4   r   r   r@   y   s    
z!FigureManagerNbAgg.get_javascriptc                 C   s   t | }| | |S r6   )
CommSocketZadd_web_socketr3   commr   r   r   rD      s    
zFigureManagerNbAgg._create_commc                 C   s.   |  d t| jD ]}|  q|   d S )Nclose)Z_send_eventlistr   on_closeclearup_closedrX   r   r   r   r8      s    

zFigureManagerNbAgg.destroyc                 C   s.   dd | j D | _ t| j dkr*| j  dS )zClear up any closed Comms.c                 S   s   h | ]}|  r|qS r   )is_openr   r   r   r   r   	<setcomp>   s   z4FigureManagerNbAgg.clearup_closed.<locals>.<setcomp>r   N)r   r   r   r;   rA   r   r   r   r]      s    z!FigureManagerNbAgg.clearup_closedc                    s    fdd| j D | _ d S )Nc                    s   h | ]}|j j kr|qS r   )rY   comm_idr_   ra   r   r   r`      s   z1FigureManagerNbAgg.remove_comm.<locals>.<setcomp>)r   )r3   ra   r   rb   r   remove_comm   s    zFigureManagerNbAgg.remove_comm)N)r,   r-   r.   r)   Z_toolbar2_classZ
ToolbarClsr2   classmethodr?   rB   r<   rH   propertyrJ   r@   rD   r8   r]   rc   __classcell__r   r   r4   r   r/   @   s   

r/   c                   @   s   e Zd ZeZdS )FigureCanvasNbAggN)r,   r-   r.   r/   Zmanager_classr   r   r   r   rg      s   rg   c                   @   s@   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S )rW   aL  
    Manages the Comm connection between IPython and the browser (client).

    Comms are 2 way, with the CommSocket being able to publish a message
    via the send_json method, and handle a message with on_message. On the
    JS side figure.send_message and figure.ws.onmessage do the sending and
    receiving respectively.

    c              
      s   d _  _tt _ttdj  ztddjid_W n. t	yr } zt
d|W Y d }~n
d }~0 0 jj j d_ fdd}j| d S )	Nz<div id=%r></div>
matplotlibid)datazTUnable to create an IPython notebook Comm instance. Are you in the IPython notebook?Fc                    s$   d_  | d d     d S )NTcontentra   )
_ext_closerc   r]   )Zclose_messager   r3   r   r   	_on_close   s    z&CommSocket.__init__.<locals>._on_close)supports_binaryr   struuiduuid4r   r   r   rY   AttributeErrorRuntimeErrorZon_msg
on_messagerl   r\   )r3   r   errrn   r   rm   r   r2      s    zCommSocket.__init__c                 C   s   | j p| jj S r6   )rl   rY   _closedrA   r   r   r   r^      s    zCommSocket.is_openc                 C   s.   |   r*z| j  W n ty(   Y n0 d S r6   )r^   rY   rZ   KeyErrorrA   r   r   r   r\      s
    zCommSocket.on_closec                 C   s   | j dt|i d S )Nrj   )rY   sendjsondumps)r3   rk   r   r   r   	send_json   s    zCommSocket.send_jsonc                 C   sJ   | j r| jjddi|gd n(t|d}d|}| jd|i d S )Nblobz	image/png)buffersasciizdata:image/png;base64,{0}rj   )ro   rY   ry   r   decoder   )r3   r}   rj   Zdata_urir   r   r   send_binary   s
    
zCommSocket.send_binaryc                 C   sZ   t |d d }|d dkr2|   | j  n$|d dkrJ|d | _n| j| d S )Nrk   rj   typeclosingro   value)rz   loadsr\   r   r]   ro   Zhandle_json)r3   messager   r   r   ru      s    zCommSocket.on_messageN)
r,   r-   r.   __doc__r2   r^   r\   r|   r   ru   r   r   r   r   rW      s   	

rW   c                   @   s   e Zd ZeZeZdS )_BackendNbAggN)r,   r-   r.   rg   ZFigureCanvasr/   ZFigureManagerr   r   r   r   r      s   r   )"r   base64r   rM   rz   rP   rq   Zipykernel.commr   IPython.displayr   r   r   rh   r   rF   r	   Zmatplotlib.backend_basesr
   r   Zbackend_webagg_corer   r   r   r   r   r#   r*   r)   r/   rg   rW   exportr   r   r   r   r   <module>   s6   _M