o
    h@                     @   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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
CloseEvent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 )figsocket)formatcanvasfigure	get_labelnumweb_sockets).0manager r   u/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/backends/backend_nbagg.py
<listcomp>   s    
z#connection_info.<locals>.<listcomp>zFigures pending show: 
)r	   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forward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   texttooltip_text
image_filename_of_methodr   r   r   r   8   s    
zNavigationIPy.<listcomp>))DownloadzDownload plotr-   r-   N)__name__
__module____qualname__r   	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   r<   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   cidr   r   r   rB   O   s   
z6FigureManagerNbAgg.create_with_canvas.<locals>.destroyclose_event)r   show	draw_idlempl_connect)clscanvas_classr   r   rB   r   rD   r   create_with_canvasG   s   
z%FigureManagerNbAgg.create_with_canvasc                 C   s   t tt  d S r@   )r   r   r9   get_javascriptr=   r   r   r   
display_jsV   s   zFigureManagerNbAgg.display_jsc                 C   sj   | j s|   |   n| j  d| _ t| dr | j| j t s3ddl	m
} |j| jd  d S d S )NT_cidgcfr   r   )r:   rO   _create_commr   rH   hasattrrA   rP   r   matplotlib._pylab_helpersr	   r$   popr   )r=   r	   r   r   r   rG   \   s   


zFigureManagerNbAgg.showc                 C   s   d| _ |   dS )zJ
        A special method to re-show the figure in the notebook.

        FN)r:   rG   rN   r   r   r   reshowm   s   zFigureManagerNbAgg.reshowc                 C   s
   t | jS r@   )boolr   rN   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 r)|
 S d S )N)streamzweb_backend/js/nbagg_mpl.jszutf-8)encoding)ioStringIOr;   rM   writepathlibPath__file__parent	read_textgetvalue)rJ   rX   outputr>   r   r   rM   y   s   
z!FigureManagerNbAgg.get_javascriptc                 C   s   t | }| | |S r@   )
CommSocketadd_web_socketr=   commr   r   r   rQ      s   
zFigureManagerNbAgg._create_commc                 C   s.   |  d t| jD ]}|  q
|   d S )Nclose)_send_eventlistr   on_closeclearup_closedrf   r   r   r   rB      s   

zFigureManagerNbAgg.destroyc                 C   s8   dd | j D | _ t| j dkrtd| j  dS 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   rF   N)r   r#   r   r   _processrN   r   r   r   rl      s   z!FigureManagerNbAgg.clearup_closedc                    s    fdd| j D | _ d S )Nc                    s   h | ]
}|j j kr|qS r   )rg   comm_idrn   rq   r   r   ro      s    z1FigureManagerNbAgg.remove_comm.<locals>.<setcomp>)r   )r=   rq   r   rr   r   remove_comm      zFigureManagerNbAgg.remove_commr@   )r5   r6   r7   r.   _toolbar2_class
ToolbarClsr<   classmethodrL   rO   rG   rU   propertyrW   rM   rQ   rB   rl   rs   __classcell__r   r   r>   r   r9   @   s     

r9   c                   @   s   e Zd ZeZdS )FigureCanvasNbAggN)r5   r6   r7   r9   manager_classr   r   r   r   rz      s    rz   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 )rd   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	y3 } zt
d|d }~ww 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contentrq   )
_ext_closers   rl   )close_messager   r=   r   r   	_on_close   s   z&CommSocket.__init__.<locals>._on_close)supports_binaryr   struuiduuid4r   r   r   rg   AttributeErrorRuntimeErroron_msg
on_messager   rk   )r=   r   errr   r   r   r   r<      s"   zCommSocket.__init__c                 C   s   | j p| jj S r@   )r   rg   _closedrN   r   r   r   rm      s   zCommSocket.is_openc                 C   s2   |   rz| j  W d S  ty   Y d S w d S r@   )rm   rg   rh   KeyErrorrN   r   r   r   rk      s   zCommSocket.on_closec                 C   s   | j dt|i d S )Nr~   )rg   sendjsondumps)r=   r   r   r   r   	send_json   rt   zCommSocket.send_jsonc                 C   sL   | j r| jjddi|gd d S t|d}d| }| jd|i d S )Nblobz	image/png)buffersasciizdata:image/png;base64,r~   )r   rg   r   r   decode)r=   r   r~   data_urir   r   r   send_binary   s
   
zCommSocket.send_binaryc                 C   s^   t |d d }|d dkr|   | j  d S |d dkr'|d | _d S | j| d S )Nr   r~   typeclosingr   value)r   loadsrk   r   rl   r   handle_json)r=   messager   r   r   r      s   zCommSocket.on_messageN)
r5   r6   r7   __doc__r<   rm   rk   r   r   r   r   r   r   r   rd      s    	

rd   c                   @   s   e Zd ZeZeZdS )_BackendNbAggN)r5   r6   r7   rz   FigureCanvasr9   FigureManagerr   r   r   r   r      s    r   )#r   base64r   rZ   r   r]   r   ipykernel.commr   IPython.displayr   r   r   r|   r   rS   r	   matplotlib.backend_basesr
   r   r   backend_webagg_corer   r   r   r   r   r'   r/   r.   r9   rz   rd   exportr   r   r   r   r   <module>   s8    _M