B
    ]t\"                 @   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Zddlm	Z	m
Z
mZ yddlmZ W n  ek
r|   ddlmZ Y nX ddlmZ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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e#Z$ej%G dd deZ&dS )z+Interactive figures in the IPython notebook    )	b64encodeN)display
JavascriptHTML)Comm)rcParamsis_interactive)Gcf)_BackendFigureCanvasBaseNavigationToolbar2)FigureCanvasWebAggCoreFigureManagerWebAggNavigationToolbar2WebAggTimerTornadoc              C   sh   g } x<t  D ]0}|jj}| d| p4d|j|j qW 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.

    z	{0} - {0}z
Figure {0}zFigures pending show: {0}
)r	   get_all_fig_managerscanvasfigureappendformatZ	get_labelnumweb_socketsr   len
_activeQuejoin)resultmanagerZfig r   @lib/python3.7/site-packages/matplotlib/backends/backend_nbagg.pyconnection_info   s    
r    zfa fa-home icon-homez fa fa-arrow-left icon-arrow-leftz"fa fa-arrow-right icon-arrow-rightzfa fa-square-o icon-check-emptyzfa fa-arrows icon-movezfa fa-floppy-o icon-save)homeZbackZforwardZzoom_to_rectZmovedownloadNc               @   s    e Zd Zdd ejd D ZdS )NavigationIPyc             C   s,   g | ]$\}}}}|t kr||t | |fqS r   )_FONT_AWESOME_CLASSES).0textZtooltip_textZ
image_fileZname_of_methodr   r   r   
<listcomp>C   s   
zNavigationIPy.<listcomp>))ZDownloadzDownload plotr"   r"   N)__name__
__module____qualname__r   Z	toolitemsr   r   r   r   r#   @   s   r#   c                   sr   e Zd ZeZ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             C   s   d| _ t| || d S )NF)_shownr   __init__)selfr   r   r   r   r   r-   N   s    zFigureManagerNbAgg.__init__c             C   s   t tt  d S )N)r   r   r+   get_javascript)r.   r   r   r   
display_jsR   s    zFigureManagerNbAgg.display_jsc             C   s,   | j s|   |   n
| j  d| _ d S )NT)r,   r0   _create_commr   	draw_idle)r.   r   r   r   showX   s
    

zFigureManagerNbAgg.showc             C   s   d| _ |   dS )zJ
        A special method to re-show the figure in the notebook.

        FN)r,   r3   )r.   r   r   r   reshow`   s    zFigureManagerNbAgg.reshowc             C   s
   t | jS )N)boolr   )r.   r   r   r   	connectedh   s    zFigureManagerNbAgg.connectedNc                sV   |d krt  }n|}t j|d |ttjd j	dd |d krR|
 S d S )N)streamzweb_backend/js/nbagg_mpl.jszutf-8)encoding)ioStringIOsuperr/   writepathlibZPath__file__parentZ	read_textgetvalue)clsr7   output)	__class__r   r   r/   l   s    

z!FigureManagerNbAgg.get_javascriptc             C   s   t | }| | |S )N)
CommSocketZadd_web_socket)r.   commr   r   r   r1   y   s    
zFigureManagerNbAgg._create_commc             C   s2   |  d xt| jD ]}|  qW |   d S )Nclose)Z_send_eventlistr   on_closeclearup_closed)r.   rE   r   r   r   destroy~   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%   socketr   r   r   	<setcomp>   s    z4FigureManagerNbAgg.clearup_closed.<locals>.<setcomp>r   N)r   r   r   close_event)r.   r   r   r   rI      s    z!FigureManagerNbAgg.clearup_closedc                s    fdd| j D | _ d S )Nc                s   h | ]}|j j ks|qS r   )rE   comm_id)r%   rL   )rO   r   r   rM      s    z1FigureManagerNbAgg.remove_comm.<locals>.<setcomp>)r   )r.   rO   r   )rO   r   remove_comm   s    zFigureManagerNbAgg.remove_comm)N)r(   r)   r*   r#   Z
ToolbarClsr-   r0   r3   r4   propertyr6   classmethodr/   r1   rJ   rI   rP   __classcell__r   r   )rC   r   r+   K   s   r+   c               @   s   e Zd Zdd ZdS )FigureCanvasNbAggc             O   s
   t ||S )N)r   )r.   argskwargsr   r   r   	new_timer   s    zFigureCanvasNbAgg.new_timerN)r(   r)   r*   rW   r   r   r   r   rT      s   rT   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  ytddjid_W n t	k
r`   t
dY nX 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contentrO   )
_ext_closerP   rI   )Zclose_message)r   r.   r   r   	_on_close   s    z&CommSocket.__init__.<locals>._on_close)supports_binaryr   struuidZuuid4r   r   r   rE   AttributeErrorRuntimeErrorZon_msg
on_messager\   rH   )r.   r   r]   r   )r   r.   r   r-      s    zCommSocket.__init__c             C   s   | j p| jj S )N)r\   rE   Z_closed)r.   r   r   r   rK      s    zCommSocket.is_openc             C   s0   |   r,y| j  W n tk
r*   Y nX d S )N)rK   rE   rF   KeyError)r.   r   r   r   rH      s
    zCommSocket.on_closec             C   s   | j dt|i d S )NrZ   )rE   sendjsondumps)r.   r[   r   r   r   	send_json   s    zCommSocket.send_jsonc             C   s,   t |d}d|}| jd|i d S )Nasciizdata:image/png;base64,{0}rZ   )r   decoder   rE   re   )r.   ZblobrZ   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 )Nr[   rZ   typeclosingr^   value)rf   loadsrH   r   rI   r^   Zhandle_json)r.   messager   r   r   rc      s    zCommSocket.on_messageN)
r(   r)   r*   __doc__r-   rK   rH   rh   rk   rc   r   r   r   r   rD      s   	
rD   c               @   s8   e Zd ZeZeZedd Zedd Z	edd Z
dS )_BackendNbAggc                sB   t |}t| }t r*|  |j  |d fdd |S )NrN   c                s
   t  S )N)r	   rJ   )Zevent)r   r   r   <lambda>   s    z?_BackendNbAgg.new_figure_manager_given_figure.<locals>.<lambda>)rT   r+   r   r3   r   r2   Zmpl_connect)r   r   r   r   r   )r   r   new_figure_manager_given_figure   s    

z-_BackendNbAgg.new_figure_manager_given_figurec             C   s   |    d S )N)r3   )r   r   r   r   trigger_manager_draw   s    z"_BackendNbAgg.trigger_manager_drawc              O   sn   ddl m} | }|sd S t }xF|D ]>}|  t|drL|j|j |s(||j	kr(|j	
| q(W d S )Nr   )r	   _cidgcf)matplotlib._pylab_helpersr	   r   r   r3   hasattrr   Zmpl_disconnectrv   r   remove)rU   rV   r	   Zmanagersinteractiver   r   r   r   r3      s    

z_BackendNbAgg.showN)r(   r)   r*   rT   ZFigureCanvasr+   ZFigureManagerstaticmethodrt   ru   r3   r   r   r   r   rr      s
   
rr   )'rq   base64r   r9   rf   osr=   r`   ZIPython.displayr   r   r   Zipykernel.commr   ImportErrorZIPython.kernel.commrX   r   r   rw   r	   Zmatplotlib.backend_basesr
   r   r   Z'matplotlib.backends.backend_webagg_corer   r   r   r   r    r$   r#   r+   rT   objectrD   Zexportrr   r   r   r   r   <module>   s:   GI