U
    ÂmœdN¥  ã                   @   sd  d dl Z d dl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Z	d dlZ	d dlZ	d dlmZ d dlZd dlmZmZ d dlZd dlmZmZmZmZ d dlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* dd	l+m,Z, e -e.¡Z/e"j0d
e"j1de"j2de"j3de"j4de"j5de"j6diZ7edd„ ƒZ8i Z9de  :¡ j; Z<d Z=dZ>dd„ Z?d.dd„Z@G dd„ de ƒZAG dd„ deƒZBG dd„ deƒZCG dd„ dee
jDƒZEG d d!„ d!ƒZFe GeB¡G d"d#„ d#ejHƒƒZIG d$d%„ d%e!e
jDƒZJe GeB¡G d&d'„ d'ejKƒƒZLe GeB¡G d(d)„ d)ejMƒƒZNe GeB¡G d*d+„ d+ejOƒƒZPeJZQeEeC_ReJeC_SejTG d,d-„ d-eƒƒZUdS )/é    N)Úcontextmanager)ÚSimpleDialog)ÚImageÚImageTk)Ú_apiÚbackend_toolsÚcbookÚ_c_internal_utils)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚNavigationToolbar2Ú	TimerBaseÚToolContainerBaseÚcursorsÚ_ModeÚ
CloseEventÚKeyEventÚLocationEventÚ
MouseEventÚResizeEvent)ÚGcfé   )Ú_tkaggZfleurZhand2ÚarrowZtcrossÚwatchZsb_h_double_arrowZsb_v_double_arrowc               	   c   s.   t  ¡ } z
d V  W 5 tjd r(t  | ¡ X d S )Nztk.window_focus)r	   ZWin32_GetForegroundWindowÚmplÚrcParamsZWin32_SetForegroundWindow)Ú
foreground© r   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/matplotlib/backends/_backend_tk.pyÚ!_restore_foreground_window_at_end'   s
    

r!   Z	mpl_blit_c                 C   s6   t  | ¡\}}}}}t |j ¡ t|ƒ||||¡ dS )zÍ
    Thin wrapper to blit called via tkapp.call.

    *argsid* is a unique string identifier to fetch the correct arguments from
    the ``_blit_args`` dict, since arguments cannot be passed directly.
    N)Ú
_blit_argsÚpopr   ÚblitÚtkÚ
interpaddrÚstr)ÚargsidÚ
photoimageÚdataptrÚoffsetsÚbboxptrÚ	comp_ruler   r   r    Ú_blit9   s      ÿr.   c              
   C   sH  t  |¡}|jdd… \}}|||jjf}|dk	r¬| ¡ \\}}	\}
}tt |¡dƒ}t	t 
|
¡|ƒ}
tt |	¡dƒ}	t	t 
|¡|ƒ}||
ks–|	|kršdS ||
|	|f}t}nd|d|f}t}| ||||f}tt|ƒƒ}|t|< z| j t|¡ W nR tjk
�rB } z0dt|ƒk�r‚ | j tt¡ | j t|¡ W 5 d}~X Y nX dS )aÂ  
    Blit *aggimage* to *photoimage*.

    *offsets* is a tuple describing how to fill the ``offset`` field of the
    ``Tk_PhotoImageBlock`` struct: it should be (0, 1, 2, 3) for RGBA8888 data,
    (2, 1, 0, 3) for little-endian ARBG32 (i.e. GBRA8888) data and (1, 2, 3, 0)
    for big-endian ARGB32 (i.e. ARGB8888) data.

    If *bbox* is passed, it defines the region that gets blitted. That region
    will be composed with the previous data according to the alpha channel.
    Blitting will be clipped to pixels inside the canvas, including silently
    doing nothing if the *bbox* region is entirely outside the canvas.

    Tcl events must be dispatched to trigger a blit from a non-Tcl thread.
    Né   r   zinvalid command name)ÚnpÚasarrayÚshapeÚctypesÚdataZ	__array__ÚmaxÚmathÚfloorÚminÚceilÚTK_PHOTO_COMPOSITE_OVERLAYÚTK_PHOTO_COMPOSITE_SETr'   Úidr"   r%   ÚcallÚ_blit_tcl_nameÚTclErrorZcreatecommandr.   )r)   Zaggimager+   Úbboxr4   ÚheightÚwidthr*   Úx1Úy1Zx2Úy2r,   r-   Úargsr(   Úer   r   r    r$   E   s2    
	r$   c                       s<   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡ fdd	„Z‡  ZS )
ÚTimerTkz<Subclass of `backend_bases.TimerBase` using Tk timer events.c                    s   d | _ tƒ j||Ž || _d S ©N)Ú_timerÚsuperÚ__init__Úparent)ÚselfrM   rF   Úkwargs©Ú	__class__r   r    rL      s    zTimerTk.__init__c                 C   s    |   ¡  | j | j| j¡| _d S rI   )Ú_timer_stoprM   ÚafterÚ	_intervalÚ	_on_timerrJ   ©rN   r   r   r    Ú_timer_start„   s    zTimerTk._timer_startc                 C   s"   | j d k	r| j | j ¡ d | _ d S rI   )rJ   rM   Úafter_cancelrV   r   r   r    rR   ˆ   s    
zTimerTk._timer_stopc                    sX   t ƒ  ¡  ˆ jsNˆ jrNˆ jdkr6ˆ j ˆ jˆ j¡ˆ _qTˆ j ‡ fdd„¡ˆ _nd ˆ _d S )Nr   c                      s   ˆ j  ˆ jˆ j¡S rI   )rM   rS   rT   rU   r   rV   r   r    Ú<lambda>œ   ó    z#TimerTk._on_timer.<locals>.<lambda>)rK   rU   Z_singlerJ   rT   rM   rS   Ú
after_idlerV   rP   rV   r    rU   �   s    


ÿzTimerTk._on_timer)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rL   rW   rR   rU   Ú__classcell__r   r   rP   r    rH   |   s
   rH   c                       sð   e Zd ZdZe dd„ ¡Zd6‡ fdd„	Zd7dd„Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd8dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zedd"œd#d$„ƒZd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd9d0d1„Zd2d3„ Zd4d5„ Z‡  ZS ):ÚFigureCanvasTkr%   c                 C   s   t S rI   )ÚFigureManagerTk)Úclsr   r   r    rY   ¤   rZ   zFigureCanvasTk.<lambda>Nc           	         sÌ  t ƒ  |¡ d | _d | _| jdd�\}}tj|d||ddd�| _tj| j||d�| _	| jj
|d |d | j	d� | j d	| j¡ tjd
krš| j d| j¡ | j d| j¡ | j d| j¡ | j d| j¡ | j d| j¡ | j d| j¡ dD ]}| j || j¡ qîdD ]}| j || j¡ �qdD ]}| j || j¡ �q$dD ]}| j || j¡ �q@| j ¡ }t | ¡‰t |¡‰‡‡‡fdd„}| d|d¡‰‡ ‡‡fdd„}| d|d¡‰ | j ¡  d | _d | _d S )NT©ZphysicalÚwhiter   )ÚmasterÚ
backgroundrB   rA   ÚborderwidthZhighlightthickness©rf   rB   rA   r/   ©Úimagez<Configure>Úwin32z<Map>z<Key>z<Motion>ú<Enter>ú<Leave>z<KeyRelease>)z
<Button-1>z
<Button-2>z
<Button-3>)z<Double-Button-1>z<Double-Button-2>z<Double-Button-3>)z<ButtonRelease-1>z<ButtonRelease-2>z<ButtonRelease-3>)z
<Button-4>z
<Button-5>c                    s6   ˆƒ }|d kr,ˆƒ }|d k	r(|  dˆ ¡ d S | | ¡S )Nú<MouseWheel>)ÚunbindÚscroll_event_windows©ÚeventrN   Úroot)Úscroll_event_windows_idÚweakrootÚweakselfr   r    rq   Ï   s    z5FigureCanvasTk.__init__.<locals>.scroll_event_windowsro   ú+c                    sJ   ˆƒ }|d kr,ˆƒ }|d k	r(|  dˆ ¡ d S | j|jkrFtd|ƒ ¡  d S )Nú	<Destroy>Zclose_event)rp   ÚwidgetÚ	_tkcanvasr   Ú_processrr   )Úfilter_destroy_idrv   rw   r   r    Úfilter_destroyÛ   s    z/FigureCanvasTk.__init__.<locals>.filter_destroyry   )rK   rL   Ú_idle_draw_idÚ_event_loop_idÚget_width_heightr%   ZCanvasr{   Ú
PhotoImageÚ_tkphotoÚcreate_imageÚbindÚresizeÚsysÚplatformÚ_update_device_pixel_ratioÚ	key_pressÚmotion_notify_eventÚenter_notify_eventÚleave_notify_eventÚkey_releaseÚbutton_press_eventÚbutton_dblclick_eventÚbutton_release_eventÚscroll_eventZwinfo_toplevelÚweakrefÚrefÚ	focus_setÚ_rubberband_rect_blackÚ_rubberband_rect_white)	rN   Úfigurerf   ÚwÚhÚnamert   rq   r~   rP   )r}   ru   rv   rw   r    rL   ¦   sX        þ  ÿ



	
zFigureCanvasTk.__init__c                 C   sH   t | jj dd¡d dƒ}|  |¡rD| jdd�\}}| jj||d� d S )Nr%   ÚscalinggUUUUUUõ?r/   Trd   ©rB   rA   )Úroundr{   r%   r=   Z_set_device_pixel_ratior�   Ú	configure)rN   rs   Úratior™   rš   r   r   r    r‰   ë   s    
z)FigureCanvasTk._update_device_pixel_ratioc                 C   s    |j |j }}| jj}|| }|| }| jj||dd� | j | j¡ tj	| jt
|ƒt
|ƒd�| _| jjt
|d ƒt
|d ƒ| jd� td| ƒ ¡  |  ¡  d S )NF)Úforwardri   r/   rj   Zresize_event)rB   rA   r˜   ZdpiZset_size_inchesr{   Údeleterƒ   r%   r‚   Úintr„   r   r|   Ú	draw_idle)rN   rs   rB   rA   ZdpivalZwinchZhinchr   r   r    r†   ÷   s$      ÿ
 
 ÿzFigureCanvasTk.resizec                    s(   ˆ j r
d S ‡ fdd„}ˆ j |¡ˆ _ d S )Nc                     s   zˆ  ¡  W 5 d ˆ _ X d S rI   )r   Zdraw©rF   rV   r   r    Ú	idle_draw  s    z+FigureCanvasTk.draw_idle.<locals>.idle_draw)r   r{   r[   )rN   r¦   r   rV   r    r¤     s    zFigureCanvasTk.draw_idlec                 C   s   | j S )z¿
        Return the Tk widget used to implement FigureCanvasTkAgg.

        Although the initial implementation uses a Tk canvas,  this routine
        is intended to hide that fact.
        )r{   rV   r   r   r    Úget_tk_widget  s    zFigureCanvasTk.get_tk_widgetc                 C   s&   | j  |j¡| jjj| j  |j¡ fS rI   )r{   ÚcanvasxÚxr˜   r@   rA   ÚcanvasyÚy©rN   rs   r   r   r    Ú_event_mpl_coords  s    þz FigureCanvasTk._event_mpl_coordsc                 C   s,   t d| f|  |¡ž|  |¡|dœŽ ¡  d S )Nr‹   ©Ú	modifiersÚguiEvent)r   r­   Ú_mpl_modifiersr|   r¬   r   r   r    r‹   %  s    ÿýz"FigureCanvasTk.motion_notify_eventc                 C   s,   t d| f|  |¡ž|  |¡|dœŽ ¡  d S )NZfigure_enter_eventr®   ©r   r­   r±   r|   r¬   r   r   r    rŒ   +  s    ÿýz!FigureCanvasTk.enter_notify_eventc                 C   s,   t d| f|  |¡ž|  |¡|dœŽ ¡  d S )NZfigure_leave_eventr®   r²   r¬   r   r   r    r�   1  s    ÿýz!FigureCanvasTk.leave_notify_eventFc                 C   sd   | j  ¡  t|dd ƒ}tjdkr2dddœ ||¡}td| f|  |¡|fž||  |¡|dœŽ 	¡  d S )NÚnumÚdarwiné   r/   ©r/   rµ   r�   )Údblclickr¯   r°   )
r{   r•   Úgetattrr‡   rˆ   Úgetr   r­   r±   r|   )rN   rs   r·   r³   r   r   r    r�   7  s    

 ÿýz!FigureCanvasTk.button_press_eventc                 C   s   | j |dd� d S )NT)r·   )r�   r¬   r   r   r    r�   C  s    z$FigureCanvasTk.button_dblclick_eventc                 C   sX   t |dd ƒ}tjdkr(dddœ ||¡}td| f|  |¡|fž|  |¡|dœŽ ¡  d S )Nr³   r´   rµ   r/   r¶   r‘   r®   )r¸   r‡   rˆ   r¹   r   r­   r±   r|   )rN   rs   r³   r   r   r    r‘   F  s    
 ÿýz#FigureCanvasTk.button_release_eventc                 C   sV   t |dd ƒ}|dkrdn|dkr$dnd}td| f|  |¡ž||  |¡|dœŽ ¡  d S )	Nr³   é   r   é   éÿÿÿÿr   r’   ©Ústepr¯   r°   )r¸   r   r­   r±   r|   )rN   rs   r³   r¾   r   r   r    r’   O  s    ÿýzFigureCanvasTk.scroll_eventc              	   C   s„   |j  |j|j¡}|| jkr dS | j |j| ¡  ¡}| jjj	| j 
|j| ¡  ¡ }|jd }td| ||||  |¡|d� ¡  dS )zMouseWheel event processorNéx   r’   r½   )rz   Zwinfo_containingZx_rootZy_rootr{   r¨   Úwinfo_rootxr˜   r@   rA   rª   Úwinfo_rootyÚdeltar   r±   r|   )rN   rs   r™   r©   r«   r¾   r   r   r    rq   W  s    
ÿ
   þz#FigureCanvasTk.scroll_event_windows©Úexcludec                   sJ   t jdkrdddgn t jdkr*ddddgn
dddd	g}‡ ‡fd
d„|D ƒS )Nrl   )Zctrlrº   Úcontrol)Úalti   rÆ   )Úshiftr   rÇ   r´   )rÆ   é   rÆ   )rK   é   rK   )rÆ   rÉ   rÆ   )rK   é@   rK   c                    s(   g | ] \}}}ˆ j |@ rˆ|kr|‘qS r   )Ústate)Ú.0r›   ÚmaskÚkey©rs   rÄ   r   r    Ú
<listcomp>~  s    
 ÿz1FigureCanvasTk._mpl_modifiers.<locals>.<listcomp>)r‡   rˆ   )rs   rÄ   r¯   r   rÏ   r    r±   e  s(    üý	ûüü÷zFigureCanvasTk._mpl_modifiersc                 C   sT   |j }t ||j¡}|d k	rP| j||d�}d|kr@|r@| d¡ d ||f•¡S d S )NrÃ   rÇ   rx   )Úcharr   Z_unikey_or_keysym_to_mplkeyZkeysymr±   ÚremoveÚjoin)rN   rs   ZunikeyrÎ   Úmodsr   r   r    Ú_get_key�  s    
zFigureCanvasTk._get_keyc                 C   s,   t d| |  |¡f|  |¡žd|iŽ ¡  d S )NZkey_press_eventr°   ©r   rÕ   r­   r|   r¬   r   r   r    rŠ   ‹  s    ÿÿþzFigureCanvasTk.key_pressc                 C   s,   t d| |  |¡f|  |¡žd|iŽ ¡  d S )NZkey_release_eventr°   rÖ   r¬   r   r   r    rŽ   �  s    ÿÿþzFigureCanvasTk.key_releasec                 O   s   t | jf|ž|ŽS rI   )rH   r{   )rN   rF   rO   r   r   r    Ú	new_timer•  s    zFigureCanvasTk.new_timerc                 C   s   | j  ¡  d S rI   )r{   ÚupdaterV   r   r   r    Úflush_events™  s    zFigureCanvasTk.flush_eventsr   c                 C   sN   |dkr@t d| ƒ}|dkr0| j || j¡| _n| j | j¡| _| j ¡  d S )Nr   iè  )r£   r{   rS   Ústop_event_loopr€   r[   Úmainloop)rN   ÚtimeoutZmillisecondsr   r   r    Ústart_event_loop�  s     ÿÿzFigureCanvasTk.start_event_loopc                 C   s(   | j r| j | j ¡ d | _ | j ¡  d S rI   )r€   r{   rX   ÚquitrV   r   r   r    rÚ   ©  s    zFigureCanvasTk.stop_event_loopc                 C   s2   z| j jt| d� W n tjk
r,   Y nX d S )N)Úcursor)r{   rŸ   ÚcursordÚtkinterr?   )rN   rß   r   r   r    Ú
set_cursor°  s    zFigureCanvasTk.set_cursor)NN)N)F)r   ) r\   r]   r^   Zrequired_interactive_frameworkr   ZclasspropertyÚmanager_classrL   r‰   r†   r¤   r§   r­   r‹   rŒ   r�   r�   r�   r‘   r’   rq   Ústaticmethodr±   rÕ   rŠ   rŽ   r×   rÙ   rÝ   rÚ   râ   r`   r   r   rP   r    ra   ¢   s4   E
	
	

ra   c                       st   e Zd ZdZdZ‡ fdd„Zedd„ ƒZedd„ ƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )rb   zí
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : tk.Toolbar
        The tk.Toolbar
    window : tk.Window
        The tk.Window
    Fc                    s�   || _ tƒ  ||¡ | j  ¡  | jjjtjtj	dd� t
| ¡ dƒ}tj|dd|› �d�| _d| _t ||j ¡ ¡r†| j d| j¡| _d	| _d S )
Nr   )ÚsideÚfillÚexpandrÈ   é`   Z
window_dpi)rf   Úvaluer›   Ú ÚwriteF)ÚwindowrK   rL   ÚwithdrawÚcanvasr{   Úpackr%   ÚTOPZBOTHr£   Zwm_frameÚIntVarÚ_window_dpiÚ_window_dpi_cbnamer   Zenable_dpi_awarenessr&   Z	trace_addÚ_update_window_dpiÚ_shown)rN   rî   r³   rì   Zwindow_framerP   r   r    rL   Ç  s    
ÿ ÿzFigureManagerTk.__init__c                 C   sü   t ƒ �ì t ¡ d kr$t ¡  t ¡  tjdd�}| ¡  t	t 
d¡ƒ}tj||d�}t	t 
d¡ƒ}tj||d�}z| d||¡ W n. tk
r° }	 zt d|	¡ W 5 d }	~	X Y nX |||d�}
| |
||ƒ}t ¡ râ| ¡  |
 ¡  |W  5 Q R £ S Q R X d S )	NÚ
matplotlib)Z	classNamezimages/matplotlib.png)Úfilerf   zimages/matplotlib_large.pngFz"Could not load matplotlib icon: %s©rf   )r!   r   Ú"_get_running_interactive_frameworkZ_setup_new_guiappr	   Z Win32_SetProcessDpiAwareness_maxr%   ZTkrí   r'   Ú_get_data_pathr   r‚   Z	iconphotoÚ	ExceptionÚ_logÚinfor   Úis_interactiveÚshowr¤   )rc   Zcanvas_classr˜   r³   rì   Z
icon_fnameZicon_imgZicon_fname_largeZicon_img_largeÚexcrî   Úmanagerr   r   r    Úcreate_with_canvasÜ  s6    ÿÿ ÿz"FigureManagerTk.create_with_canvasc                 C   sH   t  ¡ }|rD|d }t|ƒ}|jr&d S d|_z|j ¡  W 5 d|_X d S )Nr   TF)r   Zget_all_fig_managersÚtypeÚ_owns_mainlooprì   rÛ   )rc   ZmanagersZfirst_managerrã   r   r   r    Ústart_main_loop  s    zFigureManagerTk.start_main_loopc                 G   sH   | j  ¡ }| j dd|d ¡ | jr:t| jdƒr:| j ¡  | j ¡  d S )Nr%   rœ   éH   Ú_rescale)	rò   r¹   rì   r=   ZtoolbarÚhasattrr  rî   r‰   )rN   rF   Znewdpir   r   r    rô     s
    

z"FigureManagerTk._update_window_dpic                 C   sP   d}||ks||kr:t jdkr:td|› d|› d|› d�ƒ‚| jjj||d� d S )NiÀ\ Úlinuxz/You have requested to resize the Tk window to (z, z), one of which is bigger than zÔ.  At larger sizes xorg will either exit with an error on newer versions (~1.20) or cause corruption on older version (~1.19).  We do not expect a window over a million pixel wide or tall to be intended behavior.r�   )r‡   rˆ   Ú
ValueErrorrî   r{   rŸ   )rN   rB   rA   Úmax_sizer   r   r    r†     s    ÿzFigureManagerTk.resizec              	      sŒ   t ƒ �| ˆ js@‡ fdd„}ˆ j d|¡ ˆ j ¡  ˆ jj ¡  n
ˆ j ¡  t	j
d rxˆ jjj dd¡ ˆ jjj dd¡ dˆ _W 5 Q R X d S )	Nc                     s   t  ˆ ¡ d S rI   )r   Údestroyr¥   rV   r   r    r  '  s    z%FigureManagerTk.show.<locals>.destroyZWM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r!   rõ   rì   ÚprotocolZ	deiconifyrî   r{   r•   r¤   r   r   r  Ú
attributes)rN   r  r   rV   r    rÿ   $  s    


zFigureManagerTk.showc                    sŒ   ˆ j jrˆ j j ˆ j j¡ ˆ j jr4ˆ j j ˆ j j¡ ˆ jrJˆ j dˆ j¡ ‡ fdd„}t 	¡ dkrxˆ j
 ˆ j
jd|¡ nˆ j
 ¡  |ƒ  d S )Nrë   c                      s&   ˆ j  ¡  ˆ jr"t ¡ s"ˆ j  ¡  d S rI   )rì   r  r  r   Zget_num_fig_managersrÞ   r   rV   r   r    Údelayed_destroy@  s    
z0FigureManagerTk.destroy.<locals>.delayed_destroyr%   r   )rî   r   r{   rX   r€   ró   rò   Ztrace_remover   rù   rì   r[   rS   rØ   )rN   rF   r  r   rV   r    r  3  s    
zFigureManagerTk.destroyc                 C   s
   | j  ¡ S rI   ©rì   Zwm_titlerV   r   r   r    Úget_window_titleM  s    z FigureManagerTk.get_window_titlec                 C   s   | j  |¡ d S rI   r  )rN   Útitler   r   r    Úset_window_titleP  s    z FigureManagerTk.set_window_titlec                 C   s$   t | j d¡ƒ}| j d| ¡ d S )Nz-fullscreen)Úboolrì   r  )rN   Zis_fullscreenr   r   r    Úfull_screen_toggleS  s    z"FigureManagerTk.full_screen_toggle)r\   r]   r^   r_   r  rL   Úclassmethodr  r  rô   r†   rÿ   r  r  r  r  r`   r   r   rP   r    rb   ·  s   
$
rb   c                       s¸   e Zd Zejddd�edd„ ƒƒZd$ddœd	d
„Zdd„ Zdd„ Z	‡ fdd„Z
‡ fdd„Zdd„ Zdd„ Zdd„ Ze d¡edd„ ƒƒZdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Z‡  ZS )%ÚNavigationToolbar2Tkú3.6zself.master)Úalternativec                 C   s   | j S rI   rø   rV   r   r   r    rY   Z  rZ   zNavigationToolbar2Tk.<lambda>NT)Úpack_toolbarc          
   	   C   s<  |dkr|  ¡ j}tjj| |dt|jjjƒdd� i | _	| j
D ]j\}}}}|dkr\|  ¡  q>| j|tt d|› d�¡ƒ|dkt| |ƒd� | j	|< }|dk	r>t ||¡ q>tjj|d	d
�| _tj| | jdd�}	|	jtjd� tj| d�| _tj| | j| jtjd�| _| jjtjd� t | |¡ |�r8| jtjtjd� dS )a  
        Parameters
        ----------
        canvas : `FigureCanvas`
            The figure canvas on which to operate.
        window : tk.Window
            The tk.Window which owns this toolbar.
        pack_toolbar : bool, default: True
            If True, add the toolbar to the parent's pack manager's packing
            list during initialization with ``side="bottom"`` and ``fill="x"``.
            If you want to use the toolbar with a different layout manager, use
            ``pack_toolbar=False``.
        Nr/   é2   )rf   rh   rB   rA   zimages/ú.png)ÚzoomÚpan)ÚtoggleÚcommandé
   )rt   Úsizeu   Â 
Â )rf   ÚfontÚtext©rå   rø   )rf   r#  ÚtextvariableÚjustify©rå   ræ   ) r§   rf   r%   ÚFramerL   r£   r˜   r@   rB   Ú_buttonsZ	toolitemsÚ_SpacerÚ_Buttonr'   r   rú   r¸   ÚToolTipÚcreateToolTiprá   r#  ÚFontÚ_label_fontÚLabelrï   ÚRIGHTÚ	StringVarÚmessageÚ_message_labelr   ZBOTTOMÚX)
rN   rî   rì   r  r$  Ztooltip_textÚ
image_fileÚcallbackÚbuttonÚlabelr   r   r    rL   \  s@    
 ÿ
ü
ÿ
þzNavigationToolbar2Tk.__init__c                 C   sŽ   |   ¡ D ]r}t|tjtjfƒr8t|dƒrzt | |¡ qzqt|tjƒr^|j	dd� |j
dd� qt|tjƒrlqt d|j¡ q| jj	dd� d	S )
a¬  
        Scale all children of the toolbar to current DPI setting.

        Before this is called, the Tk scaling setting will have been updated to
        match the new DPI. Tk widgets do not update for changes to scaling, but
        all measurements made after the change will match the new scaling. Thus
        this function re-applies all the same sizes in points, which Tk will
        scale correctly to pixels.
        Ú_image_fileÚ18p)rA   Ú3p)ÚpadxzUnknown child class %sr!  ©r"  N)Zwinfo_childrenÚ
isinstancer%   ÚButtonÚCheckbuttonr  r  Ú_set_image_for_buttonr)  rŸ   Úpack_configurer1  rü   ÚwarningZwinfo_classr0  ©rN   rz   r   r   r    r  “  s    

zNavigationToolbar2Tk._rescalec                 C   sT   dt jfdt jffD ]:\}}|| jkr| j|kr@| j|  ¡  q| j|  ¡  qd S )NZZoomÚPan)r   ZZOOMZPANr*  ÚmodeÚselectÚdeselect)rN   r$  rH  r   r   r    Ú_update_buttons_checked®  s
    

z,NavigationToolbar2Tk._update_buttons_checkedc                    s   t ƒ j|Ž  |  ¡  d S rI   )rK   r  rK  ©rN   rF   rP   r   r    r  ·  s    zNavigationToolbar2Tk.panc                    s   t ƒ j|Ž  |  ¡  d S rI   )rK   r  rK  rL  rP   r   r    r  »  s    zNavigationToolbar2Tk.zoomc                 C   s   | j  |¡ d S rI   )r4  Úset©rN   Úsr   r   r    Úset_message¿  s    z NavigationToolbar2Tk.set_messagec                 C   sŠ   | j jr| j j | j j¡ | j jr4| j j | j j¡ | j jjj}|| }|| }| j j ||||¡| j _| j jj||||ddd�| j _d S )Nre   )rµ   rµ   )ÚoutlineÚdash)	rî   r—   r{   r¢   r–   r˜   r@   rA   Zcreate_rectangle)rN   rs   Úx0Úy0rC   rD   rA   r   r   r    Údraw_rubberbandÂ  s.       ÿÿ     ÿÿz$NavigationToolbar2Tk.draw_rubberbandc                 C   sH   | j jr"| j j | j j¡ d | j _| j jrD| j j | j j¡ d | j _d S rI   )rî   r—   r{   r¢   r–   rV   r   r   r    Úremove_rubberbandÒ  s    z&NavigationToolbar2Tk.remove_rubberbandc                 C   s   | j jS rI   )rî   r–   rV   r   r   r    rY   Û  rZ   c              	      s®  ˆj dkrdS t dˆj ¡}| |j dd¡¡}ˆ d¡}‡fdd„‰ ‡ fdd	„}d
d„ }t |dkrr| 	¡ rr|n|¡�p}| 
d¡}tj| ||f¡| d�}|ˆ_dt ˆ ˆ d¡¡¡ }	|||	ƒ}
tj|
 ||f¡| d�}|ˆ_W 5 Q R X |dƒ�rd|i}nd|i}tˆtjƒ�r”ˆ d¡dk�r”| jdk�r:d}n>ˆ dƒ\}}}ˆ dƒ\}}}|| d || d || d f}||ƒ�rŒ||d< n||d< ˆjf |dddœ—Ž dS )z�
        Set the image for a button based on its pixel size.

        The pixel size is determined by the DPI scaling of the window.
        NZimagesr  z
_large.pngr<  c                    s   ˆ   ˆ  | ¡¡S rI   )Ú	winfo_rgbÚcget)Z
color_name)r9  r   r    Ú
_get_colorî  s    z>NavigationToolbar2Tk._set_image_for_button.<locals>._get_colorc                    s   t | tƒrˆ | ƒ} t| ƒdk S )Ng    àÿß@)r@  r'   r5   )Úcolor)rY  r   r    Ú_is_darkò  s    
z<NavigationToolbar2Tk._set_image_for_button.<locals>._is_darkc                 S   sH   t  | ¡ ¡ }|dd d…f dkjdd�}|||d d…f< tj|dd�S )N.rµ   r   r¼   )ZaxisÚRGBA)rH  )r0   r1   ÚcopyÚallr   Z	fromarray)rk   rZ  Z
image_dataZ
black_maskr   r   r    Ú_recolor_icon÷  s    zANavigationToolbar2Tk._set_image_for_button.<locals>._recolor_iconé   r\  rø   g ààào?r   rg   rk   Úselectcolorrê   Zx11Zactivebackgroundr/   Zselectimage)rA   rB   )r;  r   rú   Ú	with_namer›   ÚreplaceZwinfo_pixelsr   ÚopenÚexistsÚconvertr   r‚   r†   Z_ntimager0   ÚarrayrW  rX  Z_ntimage_altr@  r%   rB  Z_windowingsystemrŸ   )rN   r9  Zpath_regularZ
path_larger"  r[  r_  Zimrk   r   Zim_altZ	image_altZimage_kwargsra  Úr1Úg1Úb1Úr2Úg2Úb2r   )rY  r9  r    rC  Ý  sT    
ÿ
ÿ
ÿ
 ÿ


ÿþ"

z*NavigationToolbar2Tk._set_image_for_buttonc              
   C   s„   |st j| ||dddd�}n,t j| d�}t j| ||d|dddd�}||_||_|d k	rdt | |¡ n|j| j	d� |j
t jd	� |S )
NZflatZgroover   )rf   r$  r   ÚreliefÚ
overreliefrh   rø   F)rf   r$  r   ZindicatoronÚvariableZ	offreliefro  rh   )r#  r%  )r%   rA  rñ   rB  Úvarr;  r  rC  rŸ   r0  rï   ÚLEFT)rN   r$  r7  r  r   Úbrq  r   r   r    r,  ,  s6        þ
     ýzNavigationToolbar2Tk._Buttonc                 C   s(   t j| dt jdd�}|jt jdd� |S )Nr<  ZDarkGray)rf   rA   rn  Úbgr=  )rå   r>  )r%   r)  ZRIDGErï   rr  rN  r   r   r    r+  H  s    zNavigationToolbar2Tk._Spacerc              
   G   sü   | j  ¡  ¡ }| j  ¡ }| |¡}||fgt| ¡ ƒ }dd„ |D ƒ}d}tj 	t
jd ¡}| j  ¡ }	tjj| j  ¡ jd||||	d�}
|
dkr’d S |dkr°tj t|
ƒ¡t
jd< z| j j |
¡ W n4 tk
rö } ztj dt|ƒ¡ W 5 d }~X Y nX d S )	Nc                 S   s   g | ]\}}|d | f‘qS )z*.%sr   )rÌ   Úextr›   r   r   r    rÐ   W  s     z4NavigationToolbar2Tk.save_figure.<locals>.<listcomp>rê   zsavefig.directoryzSave the figure)rf   r  Ú	filetypesÚdefaultextensionÚ
initialdirÚinitialfile)rê   r   zError saving file)rî   Zget_supported_filetypesr]  Zget_default_filetyper#   ÚsortedÚitemsÚosÚpathÚ
expanduserr   r   Zget_default_filenamerá   Z
filedialogZasksaveasfilenamer§   rf   Údirnamer'   r˜   Zsavefigrû   Z
messageboxZ	showerror)rN   rF   rv  Zdefault_filetypeZdefault_filetype_nameZsorted_filetypesZtk_filetypesrw  rx  ry  ÚfnamerG   r   r   r    Úsave_figureN  s6    


ÿ

ú	ÿz NavigationToolbar2Tk.save_figurec                 C   sn   t jt jdœ}| jjdk}| jjt| jjƒd k }d| jkrN|| | jd d< d| jkrj|| | jd d< d S )N)TFr   r   ZBackrË   ÚForward)r%   ZNORMALZDISABLEDZ
_nav_stackÚ_posÚlenZ	_elementsr*  )rN   Z	state_mapZcan_backZcan_forwardr   r   r    Úset_history_buttonsv  s    

z(NavigationToolbar2Tk.set_history_buttons)N)r\   r]   r^   r   Ú
deprecatedÚpropertyrì   rL   r  rK  r  r  rP  rU  rV  ÚlastrectrC  r,  r+  r�  r…  r`   r   r   rP   r    r  X  s&   
ÿ7	
ÿO(r  c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )r-  zi
    Tooltip recipe from
    http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml#e387
    c                    s>   t | ƒ‰‡ ‡fdd„}‡fdd„}|  d|¡ |  d|¡ d S )Nc                    s   ˆ  ˆ ¡ d S rI   )Úshowtip©rs   ©r$  ÚtoolTipr   r    ÚenterŠ  s    z$ToolTip.createToolTip.<locals>.enterc                    s   ˆ   ¡  d S rI   )ÚhidetiprŠ  )rŒ  r   r    ÚleaveŒ  s    z$ToolTip.createToolTip.<locals>.leaverm   rn   )r-  r…   )rz   r$  r�  r�  r   r‹  r    r.  ‡  s
    zToolTip.createToolTipc                 C   s"   || _ d | _d | _d | _| _d S )Nr   )rz   Ú	tipwindowr<   r©   r«   rF  r   r   r    rL   ‘  s    zToolTip.__init__c                 C   sÚ   || _ | js| j sdS | j d¡\}}}}|| j ¡  | j ¡  }|| j ¡  }t | j¡ | _}| 	d¡ | 
d||f ¡ z|j dd|jdd¡ W n tjk
r®   Y nX tj|| j tjtjdd	�}|jdd
� dS )zDisplay text in tooltip window.NÚinsertr   z+%d+%dz!::tk::unsupported::MacWindowStyleÚstyleÚhelpZnoActivates)r$  r'  rn  rh   )Zipadx)r$  r�  rz   r@   rÀ   Zwinfo_widthrÁ   r%   ZToplevelZwm_overrideredirectZwm_geometryr=   Ú_wr?   r1  rr  ZSOLIDrï   )rN   r$  r©   r«   Ú_Útwr:  r   r   r    r‰  —  s.    
  þ ÿzToolTip.showtipc                 C   s   | j }d | _ |r| ¡  d S rI   )r�  r  )rN   r–  r   r   r    rŽ  ­  s    zToolTip.hidetipN)	r\   r]   r^   r_   rä   r.  rL   r‰  rŽ  r   r   r   r    r-  ‚  s   
	r-  c                   @   s2   e Zd Zdd„ Zdd„ Ze d¡edd„ ƒƒZdS )	ÚRubberbandTkc                 C   s   t  |  ¡ d ||||¡ d S rI   )r  rU  Ú"_make_classic_style_pseudo_toolbar)rN   rS  rT  rC   rD   r   r   r    rU  ¶  s         ÿzRubberbandTk.draw_rubberbandc                 C   s   t  |  ¡ ¡ d S rI   )r  rV  r˜  rV   r   r   r    rV  º  s    ÿzRubberbandTk.remove_rubberbandr  c                 C   s
   | j jjS rI   )r˜   rî   r–   rV   r   r   r    rY   ¿  rZ   zRubberbandTk.<lambda>N)	r\   r]   r^   rU  rV  r   r†  r‡  rˆ  r   r   r   r    r—  ´  s
   
ÿr—  c                   @   sV   e Zd Zd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d„ ZdS )Ú	ToolbarTkNc                 C   sÆ   t  | |¡ |d kr"| jj ¡ j}| jjjjj\}}d||  }}t	j
j| |t|ƒt|ƒdd� tjjdd�| _t	j| d�| _t	j| | j| jd�| _| jjt	jd� i | _| jt	jt	jd	� i | _d S )
Nr  r/   )rf   rB   rA   rh   r!  r?  rø   )rf   r#  r&  r%  r(  )r   rL   Útoolmanagerrî   r§   rf   r˜   r@   Z	intervalxr%   r)  r£   rá   r#  r/  r0  r3  Ú_messager1  r5  rï   r2  Ú
_toolitemsrð   r6  Ú_groups)rN   rš  rì   ZxminZxmaxrA   rB   r   r   r    rL   Ã  s&    
 þ
ÿzToolbarTk.__init__c                 C   s
   t  | ¡S rI   )r  r  rV   r   r   r    r  Õ  s    zToolbarTk._rescalec              	      s’   ˆ  |¡}| ¡ }|t|ƒks&|dk r,d }	n|| }	t |ˆ ||‡ ‡fdd„¡}
|
j|	d� |d k	rpt |
|¡ ˆj 	ˆ g ¡ ˆjˆ   
|
¡ d S )Nr   c                      s
   ˆ  ˆ ¡S rI   )Ú_button_clickr   ©r›   rN   r   r    rY   á  rZ   z(ToolbarTk.add_toolitem.<locals>.<lambda>)Úbefore)Ú_get_groupframeZpack_slavesr„  r  r,  rD  r-  r.  rœ  Ú
setdefaultÚappend)rN   r›   ÚgroupÚpositionr7  Údescriptionr  ÚframeZbuttonsr   r9  r   rŸ  r    Úadd_toolitemØ  s    
ÿzToolbarTk.add_toolitemc                 C   sT   || j krJ| j r|  ¡  tj| dd�}|jtjtjd� | j|_|| j |< | j | S )Nr   )rf   rh   r(  )r�  Ú_add_separatorr%   r)  rï   rr  ÚYr0  )rN   r¤  r§  r   r   r    r¡  è  s    

zToolbarTk._get_groupframec                 C   s
   t  | ¡S rI   )r  r+  rV   r   r   r    r©  ò  s    zToolbarTk._add_separatorc                 C   s   |   |¡ d S rI   )Ztrigger_tool)rN   r›   r   r   r    rž  õ  s    zToolbarTk._button_clickc                 C   s8   || j krd S | j | D ]}|r*| ¡  q| ¡  qd S rI   )rœ  rI  rJ  )rN   r›   ZtoggledÚtoolitemr   r   r    Útoggle_toolitemø  s    

zToolbarTk.toggle_toolitemc                 C   s$   | j | D ]}| ¡  q
| j |= d S rI   )rœ  Zpack_forget)rN   r›   r«  r   r   r    Úremove_toolitem  s    
zToolbarTk.remove_toolitemc                 C   s   | j  |¡ d S rI   )r›  rM  rN  r   r   r    rP    s    zToolbarTk.set_message)N)r\   r]   r^   rL   r  r¨  r¡  r©  rž  r¬  r­  rP  r   r   r   r    r™  Â  s   

	r™  c                   @   s   e Zd Zdd„ ZdS )ÚSaveFigureTkc                 G   s   t  |  ¡ ¡ d S rI   )r  r�  r˜  rL  r   r   r    Útrigger  s    ÿzSaveFigureTk.triggerN©r\   r]   r^   r¯  r   r   r   r    r®  
  s   r®  c                   @   s   e Zd Zdd„ ZdS )ÚConfigureSubplotsTkc                 G   s   t  | ¡ d S rI   )r  Zconfigure_subplotsrL  r   r   r    r¯    s    zConfigureSubplotsTk.triggerNr°  r   r   r   r    r±    s   r±  c                   @   s   e Zd Zdd„ ZdS )ÚHelpTkc                    s*   t | jjj|  ¡ dgƒ‰ ‡ fdd„ˆ _d S )NÚOKc                    s   ˆ j j ¡ S rI   )r§  rf   rí   )r³   ©Zdialogr   r    rY     rZ   z HelpTk.trigger.<locals>.<lambda>)r   r˜   rî   r{   Z_get_help_textÚdonerL  r   r´  r    r¯    s      ÿzHelpTk.triggerNr°  r   r   r   r    r²    s   r²  c                   @   s    e Zd ZejZeZeZ	ej
ZdS )Ú
_BackendTkN)r\   r]   r^   r%   Z	TkVersionZbackend_versionra   ZFigureCanvasrb   ZFigureManagerr  rÛ   r   r   r   r    r¶  $  s   r¶  )N)VÚuuidr“   Ú
contextlibr   Úloggingr6   Úos.pathr|  r‡   rá   r%   Ztkinter.filedialogZtkinter.fontZtkinter.messageboxZtkinter.simpledialogr   Únumpyr0   ZPILr   r   rö   r   r   r   r   r	   Zmatplotlib.backend_basesr
   r   r   r   r   r   r   r   r   r   r   r   r   Zmatplotlib._pylab_helpersr   rê   r   Ú	getLoggerr\   rü   ZMOVEZHANDZPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICALrà   r!   r"   Úuuid4Úhexr>   r:   r;   r.   r$   rH   ra   rb   r)  r  r-  Z_register_tool_classZRubberbandBaser—  r™  ZSaveFigureBaser®  ZConfigureSubplotsBaser±  ZToolHelpBaser²  ZToolbarZ_toolbar2_classZ_toolmanager_toolbar_classZexportr¶  r   r   r   r    Ú<module>   s„   <
       ù
	
7&   "  ,2H