
     lf                        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jX                  e-      Z.e!j^                  d
e!j`                  de!jb                  de!jd                  de!jf                  de!jh                  de!jj                  diZ6ed        Z7i Z8d e jr                         jt                  z   Z;d Z<dZ=d Z>d0dZ? G d de      Z@ G d de      ZA G d de      ZB G d dee	j                        ZD G d d      ZE ej                  eA       G d d ej                               ZH ej                  d!d"#       G d$ d%ej                               ZK G d& d'e e	j                        ZL ej                  eA       G d( d)ej                               ZN ej                  eA       G d* d+ej                               ZP ej                  eA       G d, d-ej                               ZReLZSeDeB_T        eLeB_U        ej                   G d. d/e             ZWy)1    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   )_tkaggfleurhand2arrowtcrosswatchsb_h_double_arrowsb_v_double_arrowc               #      K   t        j                         } 	 d  t        j                  d   rt        j                  |        y y # t        j                  d   rt        j                  |        w w xY ww)Nztk.window_focus)r
   Win32_GetForegroundWindowmplrcParamsWin32_SetForegroundWindow)
foregrounds    A/usr/lib/python3/dist-packages/matplotlib/backends/_backend_tk.py!_restore_foreground_window_at_endr)   &   s]     "<<>JD<<)*77
C +3<<)*77
C +s   A4A *A4+A11A4	mpl_blit_c                     t         j                  |       \  }}}}}t        j                  |j                  j                         t        |      ||||       y)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_rules         r(   _blitr8   8   sH     8B~~f7M4J'9
KK
((*C
OW7G-    c                 h   t        j                  |      }|j                  dd \  }}|||j                  j                  f}||j                         \  \  }}	\  }
}t        t        j                  |      d      }t        t        j                  |
      |      }
t        t        j                  |	      d      }	t        t        j                  |      |      }||
kD  s|	|kD  ry||
|	|f}t        }nd|d|f}t        }| ||||f}t        t        |            }|t        |<   	 | j                   j#                  t$        |       y# t         j&                  $ r\}dt        |      vr | j                   j)                  t$        t*               | j                   j#                  t$        |       Y d}~yd}~ww xY w)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data	__array__maxmathfloorminceilTK_PHOTO_COMPOSITE_OVERLAYTK_PHOTO_COMPOSITE_SETr1   idr,   r/   call_blit_tcl_nameTclErrorcreatecommandr8   )r3   aggimager5   bboxr@   heightwidthr4   x1y1x2y2r6   r7   argsr2   es                    r(   r.   r.   D   sr     ::hDJJrNMFEudkk../G!^^-R(2rB#2&B#2'Gbr2r".	eQ'*	 w);D D]FJv3>62;; 3!Q/##NE:>622	3s   ! E F1AF,,F1c                   8     e Zd ZdZ fdZd Zd Z fdZ xZS )TimerTkz<Subclass of `backend_bases.TimerBase` using Tk timer events.c                 @    d | _         t        |   |i | || _        y N)_timersuper__init__parent)selfr_   rV   kwargs	__class__s       r(   r^   zTimerTk.__init__~   s#    $)&)r9   c                     | j                          | j                  j                  | j                  | j                        | _        y r[   )_timer_stopr_   after	_interval	_on_timerr\   r`   s    r(   _timer_startzTimerTk._timer_start   s.    kk''Gr9   c                 t    | j                   %| j                  j                  | j                          d | _         y r[   )r\   r_   after_cancelrh   s    r(   rd   zTimerTk._timer_stop   s)    ;;"KK$$T[[1r9   c                 4    t                     j                  su j                  ri j                  dkD  r6 j
                  j                   j                   j                         _        y  j
                  j                   fd       _        y d  _        y )Nr   c                  d     j                   j                   j                   j                        S r[   )r_   re   rf   rg   rh   s   r(   <lambda>z#TimerTk._on_timer.<locals>.<lambda>   s     DKK--dnndnnM r9   )r]   rg   _singler\   rf   r_   re   
after_idle)r`   rb   s   `r(   rg   zTimerTk._on_timer   sm    
 ||~~!"kk//O #kk44M DKr9   )	__name__
__module____qualname____doc__r^   ri   rd   rg   __classcell__rb   s   @r(   rY   rY   {   s     F
H
 r9   rY   c                        e Zd ZdZ ej
                  d       Zd fd	ZddZd Z	d Z
d Zd Zd	 Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd Z xZS )FigureCanvasTkr/   c                     t         S r[   )FigureManagerTk)clss    r(   rn   zFigureCanvasTk.<lambda>   s    ? r9   c                     t            |       d  _        d  _         j	                  d      \  }}t        j                  |d||dd       _        t        j                   j                  ||       _	         j                  j                  |dz  |dz   j                          j                  j                  d	 j                         t        j                  d
k(  r& j                  j                  d j                          j                  j                  d j                           j                  j                  d j"                          j                  j                  d j$                          j                  j                  d j&                          j                  j                  d j(                         dD ](  } j                  j                  | j*                         * dD ](  } j                  j                  | j,                         * dD ](  } j                  j                  | j.                         * dD ](  } j                  j                  | j0                         *  j                  j3                         }|j                  d j4                  d        fd}|j                  d|d        j                  j7                          d  _        d  _        y )NTphysicalwhiter   )master
backgroundrQ   rP   borderwidthhighlightthicknessr   rQ   rP   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>z<MouseWheel>+c                 l    | j                   j                  u rt        d      j                          y y )Nclose_event)widget	_tkcanvasr   _process)eventr`   s    r(   filter_destroyz/FigureCanvasTk.__init__.<locals>.filter_destroy   s+    ||t~~-=$/88: .r9   z	<Destroy>)r]   r^   _idle_draw_id_event_loop_idget_width_heightr/   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_eventwinfo_toplevelscroll_event_windows	focus_set_rubberband_rect_black_rubberband_rect_white)	r`   figurer   whnamerootr   rb   s	   `       r(   r^   zFigureCanvasTk.__init__   sg    !"$$d$31gA1D >>16##AqD!Q$dmm#DM4;;7<<7"NN)H)HIGT^^4J(@(@AIt'>'>?It'>'>?ND,<,<=> 	?DNNd&=&=>	?O 	BDNNd&@&@A	BO 	ADNNd&?&?@	A
 / 	9DNNd&7&78	9 ~~,,.		.$";";SA	; 			+~s3  "&*#&*#r9   c                     t        | j                  j                  j                  dd      dz  d      }| j	                  |      r3| j                  d      \  }}| j                  j                  ||       y y )Nr/   scalinggUUUUUU?r;   Tr}   rQ   rP   )roundr   r/   rJ   _set_device_pixel_ratior   	configure)r`   r   ratior   r   s        r(   r   z)FigureCanvasTk._update_device_pixel_ratio   so     dnn'',,T9=I1M''. (($(7DAqNN$$1Q$7 /r9   c                 @   |j                   |j                  }}| j                  j                  }||z  }||z  }| j                  j	                  ||d       | j
                  j                  | j                         t        j                  | j
                  t        |      t        |            | _        | j
                  j                  t        |dz        t        |dz        | j                         t        d|       j                          | j                          y )NF)forwardr   r;   r   resize_event)rQ   rP   r   dpiset_size_inchesr   deleter   r/   r   intr   r   r   	draw_idle)r`   r   rQ   rP   dpivalwinchhinchs          r(   r   zFigureCanvasTk.resize   s    U\\v ##E5%#@dmm,>>UCKI##	NC
O4== 	$ 	BND)224r9   c                 j      j                   ry  fd} j                  j                  |       _         y )Nc                  N    	 j                          d _        y # d _        w xY wr[   )drawr   rV   r`   s    r(   	idle_drawz+FigureCanvasTk.draw_idle.<locals>.idle_draw   s"    *		%)"T"s    	$)r   r   rp   )r`   r   s   ` r(   r   zFigureCanvasTk.draw_idle   s-    	* "^^66yAr9   c                     | 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   rh   s    r(   get_tk_widgetzFigureCanvasTk.get_tk_widget  s     ~~r9   c                     | j                   j                  |j                        | j                  j                  j
                  | j                   j                  |j                        z
  fS r[   )r   canvasxxr   rO   rP   canvasyyr`   r   s     r(   _event_mpl_coordsz FigureCanvasTk._event_mpl_coords
  sQ     &&uww/  ''$..*@*@*IIK 	Kr9   c                 ^    t        d| g| j                  |      d|ij                          y )Nr   guiEvent)r   r   r   r   s     r(   r   z"FigureCanvasTk.motion_notify_event  s1    ($ 	#**51	#!	##+8:r9   c                 ^    t        d| g| j                  |      d|ij                          y )Nfigure_enter_eventr   r   r   r   r   s     r(   r   z!FigureCanvasTk.enter_notify_event  1    *D 	&--e4	&$	&&.hjr9   c                 ^    t        d| g| j                  |      d|ij                          y )Nfigure_leave_eventr   r   r   s     r(   r   z!FigureCanvasTk.leave_notify_event  r   r9   c                    | j                   j                          t        |dd       }t        j                  dk(  rdddj                  ||      }t        d| g| j                  |      |||dj                          y )Nnumdarwin   r;   r;   r   r   )dblclickr   )	r   r   getattrr   r   getr   r   r   )r`   r   r   r   s       r(   r   z!FigureCanvasTk.button_press_event   s|      "eUD)<<8#A,""3,C' 	#**51	#36	#AI!	##+8:r9   c                 *    | j                  |d       y )NT)r   )r   r   s     r(   r   z$FigureCanvasTk.button_dblclick_event+  s    5r9   c                     t        |dd       }t        j                  dk(  rdddj                  ||      }t	        d| g| j                  |      |d|ij                          y )Nr   r   r   r;   r   r   r   )r   r   r   r   r   r   r   )r`   r   r   s      r(   r   z#FigureCanvasTk.button_release_event.  si    eUD)<<8#A,""3,C)4 	#**51	#36	#!	##+8:r9   c                     t        |dd       }|dk(  rdn|dk(  rdnd}t        d| g| j                  |      ||dj                          y )	Nr      r      r   r   stepr   )r   r   r   r   )r`   r   r   r   s       r(   r   zFigureCanvasTk.scroll_event6  sV    eUD)1Hqq"a>4 	#**51	#8<!	##+8:r9   c                    |j                   j                  |j                  |j                        }|| j                  k7  ry| j                  j                  |j                  |j                         z
        }| j                  j                  j                  | j                  j                  |j                  |j                         z
        z
  }|j                  dz  }t        d| ||||      j                          y)zMouseWheel event processorNx   r   r   )r   winfo_containingx_rooty_rootr   r   winfo_rootxr   rO   rP   r   winfo_rootydeltar   r   )r`   r   r   r   r   r   s         r(   r   z#FigureCanvasTk.scroll_event_windows=  s     LL))%,,ENN""5<<!--/#AB[[$$~~%%ellQ]]_&DEF{{S >4adU	44<HJr9   c                 D   |j                   }t        j                  ||j                        }t        j
                  dk(  rg d}nt        j
                  dk(  rg d}ng d}|=|D ]8  \  }}}|j                  d|z  z  s||vs|dk(  r|r'dj                  ||      }: |S )	Nr   )r;   ctrlcontrol)   altr   r   shiftr   r   )r   )r   r   r   r   )r   r]   r]   )r   )r   r   r   r   )   r]   r]   r   r   z{0}+{1})charr	   _unikey_or_keysym_to_mplkeykeysymr   r   stateformat)r`   r   unikeykey	modifiersbitmaskprefixkey_names           r(   _get_keyzFigureCanvasTk._get_keyJ  s    //E <<7"I \\X%II ?-6 <);;!w,/HC4G"g-&'..vs;<
 
r9   c                 ~    t        d| | j                  |      g| j                  |      d|ij                          y )Nkey_press_eventr   r   r  r   r   r   s     r(   r   zFigureCanvasTk.key_pressq  s=    "Du%	!(,(>(>u(E	!	!!)r9   c                 ~    t        d| | j                  |      g| j                  |      d|ij                          y )Nkey_release_eventr   r  r   s     r(   r   zFigureCanvasTk.key_releasev  s=    $du%	!(,(>(>u(E	!	!!)r9   c                 4    t        | j                  g|i |S r[   )rY   r   )r`   rV   ra   s      r(   	new_timerzFigureCanvasTk.new_timer{  s    t~~7777r9   c                 8    | j                   j                          y r[   )r   updaterh   s    r(   flush_eventszFigureCanvasTk.flush_events  s    r9   c                    |dkD  rit        d|z        }|dkD  r,| j                  j                  || j                        | _        n*| j                  j                  | j                        | _        | j                  j                          y )Nr   i  )r   r   re   stop_event_loopr   rp   mainloop)r`   timeoutmillisecondss      r(   start_event_loopzFigureCanvasTk.start_event_loop  ss    Q;tg~.La&*nn&:&: $"6"6'8# '+nn&?&?(('*#!r9   c                     | j                   r,| j                  j                  | j                          d | _         | j                  j                          y r[   )r   r   rk   quitrh   s    r(   r  zFigureCanvasTk.stop_event_loop  s;    NN''(;(;<"&Dr9   c                 ~    	 | j                   j                  t        |          y # t        j                  $ r Y y w xY w)N)cursor)r   r   cursordtkinterrL   r`   r  s     r(   
set_cursorzFigureCanvasTk.set_cursor  s8    	NN$$GFO$< 		s   #& <<)NNr[   )F)r   )rq   rr   rs   required_interactive_frameworkr   classpropertymanager_classr^   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r  r  ru   rv   s   @r(   rx   rx      s    %)"&D&&'BCM0+d
8"BK.
1
1
	.6..?%N,
,
8 
"r9   rx   c                   `     e Zd ZdZdZ fdZed        Zd Zd Z	d Z
d Zd	 Zd
 Zd Z xZS )rz   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                 2   || _         t        | 	  ||       | j                   j                          | j                  j
                  j                  t        j                  t        j                  d       t        |j                         d      }t        j                  |dd|       | _        d| _        t        j                   ||j                  j#                               r+| j                  j%                  d| j&                        | _        d	| _        y )
Nr   )sidefillexpand   `   
window_dpi)r   valuer    writeF)windowr]   r^   withdrawcanvasr   packr/   TOPBOTHr   wm_frameIntVar_window_dpi_window_dpi_cbnamer   enable_dpi_awarenessr0   	trace_add_update_window_dpi_shown)r`   r.  r   r,  window_framerb   s        r(   r^   zFigureManagerTk.__init__  s    % 	""RWWQ"G
 6??,b199F",6|n*EG"$&&|VYY5I5I5KL&*&6&6&@&@00'2D# r9   c                    t               5  t        j                         (t        j                          t	        j
                          t        j                  d      }|j                          t        t        j                  d            }t        j                  ||      }t        t        j                  d            }t        j                  ||      }	 |j                  d||        |||      }
 | |
||      }t#        j$                         r |j'                          |
j)                          |cd d d        S # t        $ r }	t        j!                  d|	       Y d }	~	wd }	~	ww xY w# 1 sw Y   y xY w)	N
matplotlib)	classNamezimages/matplotlib.png)filer   zimages/matplotlib_large.pngFz"Could not load matplotlib icon: %sr   )r)   r	   "_get_running_interactive_framework_setup_new_guiappr
    Win32_SetProcessDpiAwareness_maxr/   Tkr-  r1   _get_data_pathr   r   	iconphoto	Exception_loginfor$   is_interactiveshowr   )r{   canvas_classr   r   r,  
icon_fnameicon_imgicon_fname_largeicon_img_largeexcr.  managers               r(   create_with_canvasz"FigureManagerTk.create_with_canvas  s@    /0  	779A'')!BBDUU\2FOO U11') *J))z&IH"5#7#7-$/  0$//%f6NE  A
 "&8F&#v.G!!#  "A 	  	.  E		>DDE/ 	  	s7   CE+D?,A	E+?	E(E#E+#E((E++E4c                 $   | j                   j                         }| j                  j                  dd|dz         | j                  r0t        | j                  d      r| j                  j                          | j                  j                          y )Nr/   r   H   _rescale)	r4  r   r,  rJ   toolbarhasattrrU  r.  r   )r`   rV   newdpis      r(   r8  z"FigureManagerTk._update_window_dpi  sd    !!%%'y&2+6<<GDLL*=LL!!#..0r9   c           	          d}||kD  s||kD  r(t         j                  dk(  rt        d| d| d| d      | j                  j                  j                  ||       y )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   )r`   rQ   rP   max_sizes       r(   r   zFigureManagerTk.resize  sq    H 1s||w7N!!&r& 2""* ,++, , 	''eF'Cr9   c                 D    t               5   j                  s` fd} j                  j                  d|        j                  j	                           j
                  j                  j                          n j
                  j                          t        j                  d   r` j
                  j                  j                  j                  dd        j
                  j                  j                  j                  dd       d _        d d d        y # 1 sw Y   y xY w)Nc                  0    t        j                         y r[   )r   destroyr   s    r(   r_  z%FigureManagerTk.show.<locals>.destroy  s    KK%r9   WM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r)   r9  r,  protocol	deiconifyr.  r   r   r   r$   r%   rQ  
attributes)r`   r_  s   ` r(   rJ  zFigureManagerTk.show  s    .0 	;;&$$%7A%%'%%//1%%'||12##**55j!D##**55j!DDK	 	 	s   DDDc                      j                   j                  r9 j                   j                  j                   j                   j                          j                   j                  r9 j                   j                  j                   j                   j                          j
                  r& j                  j                  d j
                          fd}t        j                         dk(  r2 j                  j                   j                  j                  d|       y  j                  j                           |        y )Nr+  c                       j                   j                           j                  r0t        j                         s j                   j                          y y y r[   )r,  r_  _owns_mainloopr   get_num_fig_managersr  rh   s   r(   delayed_destroyz0FigureManagerTk.destroy.<locals>.delayed_destroy  s@    KK!""3+C+C+E  " ,F"r9   r/   r   )r.  r   r   rk   r   r5  r4  trace_remover	   r@  r,  rp   re   r  )r`   rV   rh  s   `  r(   r_  zFigureManagerTk.destroy  s    ;;$$KK!!..t{{/H/HI;;%%KK!!..t{{/I/IJ""))'43J3JK	# 335=KK""4;;#4#4aIKK r9   c                 6    | j                   j                         S r[   r,  wm_titlerh   s    r(   get_window_titlez FigureManagerTk.get_window_title%  s    {{##%%r9   c                 :    | j                   j                  |       y r[   rk  )r`   titles     r(   set_window_titlez FigureManagerTk.set_window_title(  s    U#r9   c                     t        | j                  j                  d            }| j                  j                  d|        y )Nz-fullscreen)boolr,  rc  )r`   is_fullscreens     r(   full_screen_togglez"FigureManagerTk.full_screen_toggle+  s2    T[[33MBC}-.?@r9   )rq   rr   rs   rt   rf  r^   classmethodrR  r8  r   rJ  r_  rm  rp  rt  ru   rv   s   @r(   rz   rz     sN     N* " "H1D4&$Ar9   rz   c                        e Zd Z  ej                  dd       ed             ZddddZd Zd	 Z	 fd
Z
 fdZd Zd Zd Z  ej                  d       ed             Zd Zd Zd Zd Zd Z xZS )NavigationToolbar2Tk3.6zself.masteralternativec                     | j                   S r[   r?  rh   s    r(   rn   zNavigationToolbar2Tk.<lambda>2  s
    dkk r9   T)pack_toolbarc                n   ||j                         j                  }t        j                  j	                  | |dt        |j                  j                  j                        d       i | _	        | j                  D ]  \  }}}}|| j                          | j                  |t        t        j                  d| d            |dv t!        | |            x| j                  |<   }|nt"        j%                  ||        t&        j(                  j+                  |d	
      | _        t        j.                  | | j,                  d      }	|	j1                  t        j2                         t        j4                  |       | _        t        j.                  | | j,                  | j6                  t        j2                        | _        | j8                  j1                  t        j2                         t;        j                  | |       |r0| j1                  t        j<                  t        j>                         yy)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   )r   r   rQ   rP   zimages/.png)zoompan)togglecommand
   )r   sizeu    
 )r   fonttextr#  r?  )r   r  textvariablejustifyr#  r$  ) r   r   r/   Framer^   r   r   rO   rQ   _buttons	toolitems_Spacer_Buttonr1   r	   rD  r   ToolTipcreateToolTipr  r  Font_label_fontLabelr/  RIGHT	StringVarmessage_message_labelr   BOTTOMX)
r`   r.  r,  r|  r  tooltip_text
image_filecallbackbuttonlabels
             r(   r^   zNavigationToolbar2Tk.__init__4  s    >))+22F
$v1 #FMM$6$6$<$< =b 	 	J 8< 	@4D,
H|/3||,,wzl$-GHI#6#D(3	 0< 0 d#f  +))&,?	@ #<<,,&r,B 4+;+;FH


!||40 hhd9I9I48LL/1xx9 	  bhh /##D&1II299244I0 r9   c                    | j                         D ]  }t        |t        j                  t        j                  f      r$t        |d      rt        j                  | |       PQt        |t        j                        r&|j                  dd       |j                  d       t        |t        j                        rt        j                  d|j                          | j                  j                  d	       y
)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22p1p)rP   pady4p)padxzUnknown child class %sr  r  N)winfo_children
isinstancer/   ButtonCheckbuttonrW  rw  _set_image_for_buttonr  r   pack_configurer  rG  warningwinfo_classr  r`   r   s     r(   rU  zNavigationToolbar2Tk._rescalek  s     ))+ 	KF&299bnn"=>6=1(>>tVL FBHH-  D 9%%4%0FBHH-5v7I7IJ	K 	"""+r9   c                    dt         j                  fdt         j                  ffD ]^  \  }}|| j                  v s| j                  |k(  r| j                  |   j                          B| j                  |   j                          ` y )NZoomPan)r   ZOOMPANr  modeselectdeselect)r`   r  r  s      r(   _update_buttons_checkedz,NavigationToolbar2Tk._update_buttons_checked  sn    "EJJ/%1CD 	3JD$t}}$99$MM$'..0MM$'002	3r9   c                 >    t        |   |  | j                          y r[   )r]   r  r  r`   rV   rb   s     r(   r  zNavigationToolbar2Tk.pan  s    T$$&r9   c                 >    t        |   |  | j                          y r[   )r]   r  r  r  s     r(   r  zNavigationToolbar2Tk.zoom  s    d$$&r9   c                 :    | j                   j                  |       y r[   )r  setr`   ss     r(   set_messagez NavigationToolbar2Tk.set_message  s    r9   c                    | j                   j                  r9| j                   j                  j                  | j                   j                         | j                   j                  r9| j                   j                  j                  | j                   j                         | j                   j
                  j                  j                  }||z
  }||z
  }| j                   j                  j                  ||||      | j                   _        | j                   j                  j                  ||||dd      | j                   _        y )Nr   )r   r   )outlinedash)	r.  r   r   r   r   r   rO   rP   create_rectangle)r`   r   x0y0rR   rS   rP   s          r(   draw_rubberbandz$NavigationToolbar2Tk.draw_rubberband  s    ;;--KK!!(()K)KL;;--KK!!(()K)KL##((//b[b[KK!!22BB  	* KK!!22BBf 3 > 	*r9   c                    | j                   j                  rJ| j                   j                  j                  | j                   j                         d | j                   _        | j                   j                  rK| j                   j                  j                  | j                   j                         d | j                   _        y y r[   )r.  r   r   r   r   rh   s    r(   remove_rubberbandz&NavigationToolbar2Tk.remove_rubberband  s}    ;;--KK!!(()K)KL15DKK.;;--KK!!(()K)KL15DKK. .r9   c                 .    | j                   j                  S r[   )r.  r   rh   s    r(   rn   zNavigationToolbar2Tk.<lambda>  s    dkk@@ r9   c           	      &   j                   yt        j                  dj                         }|j                  |j                  j                  dd            }j                  d      }fdfd}d }t        j                  |d	kD  r|j                         r|n|      5 }|j                  d
      }t        j                  |j                  ||f      |       }|_        dt        j                   j#                  j%                  d                  z  }	 |||	      }
t        j                  |
j                  ||f      |       }|_        ddd        |d      rdi}ndi}t)        t*        j,                        rhj%                  d      dk7  rT| j.                  dk7  rd}n/ d      \  }}} d      \  }}}||z   dz  ||z   dz  ||z   dz  f} ||      r|d<   n|d<    j0                  di |ddd y# 1 sw Y   xY w)z
        Set the image for a button based on its pixel size.

        The pixel size is determined by the DPI scaling of the window.
        Nimagesr  z
_large.png18pc                 D    j                  j                  |             S r[   )	winfo_rgbcget)
color_namer  s    r(   
_get_colorz>NavigationToolbar2Tk._set_image_for_button.<locals>._get_color  s    ##FKK
$;<<r9   c                 P    t        | t              r |       } t        |       dk  S )Ng    @)r  r1   rB   )colorr  s    r(   _is_darkz<NavigationToolbar2Tk._set_image_for_button.<locals>._is_dark  s&    %%"5)u:	))r9   c                     t        j                  |       j                         }|dd df   dk(  j                  d      }|||d df<   t	        j
                  |d      S )N.r   r   r   )axisRGBA)r  )r<   r=   copyallr   	fromarray)r   r  
image_data
black_masks       r(   _recolor_iconzANavigationToolbar2Tk._set_image_for_button.<locals>._recolor_icon  sa    E*//1J$S"1"W-277R7@J).Jz2A2~&??:F;;r9      r  r?  g o?r'   r   r   selectcolorr*  x11activebackgroundr;   selectimage)rP   rQ    )r  r	   rD  	with_namer   replacewinfo_pixelsr   openexistsconvertr   r   r   _ntimager<   arrayr  r  _ntimage_altr  r/   r  _windowingsystemr   )r`   r  path_regular
path_larger  r  r  imr   r'   im_alt	image_altimage_kwargsr  r1g1b1r2g2b2r  s    `                  @r(   r  z*NavigationToolbar2Tk._set_image_for_button  s    % ++Hf6H6HI!++%%fl;=
""5)	=	*
	< ZZtbyZ5F5F5H
)+ 	,.0F#B&&ryy$'>tLE#FO &  \!:;*= =J"2z2F**tTl+D:I"+F	, L!
 $Y/L#U+L
 vr~~.M*b0$$-+
 (6
B'(:;
B "2qy2b5!)beQY?$.7]+.3]+C<CUCY	, 	,s   %B/HHc           
      n   |st        j                  | ||ddd      }n:t        j                  |       }t        j                  | ||d|ddd      }||_        ||_        |t        j                  | |       n|j                  | j                         |j                  t         j                  	       |S )
Nflatgroover   )r   r  r  relief
overreliefr   r?  F)r   r  r  indicatoronvariable	offreliefr  r   )r  r  )r/   r  r3  r  varr  rw  r  r   r  r/  LEFT)r`   r  r  r  r  br  s          r(   r  zNavigationToolbar2Tk._Button  s    		$(A ))4(C$U8A
 AE"! 66tQ?KKT--K.	BGGr9   c                     t        j                  | dt         j                  d      }|j                  t         j                  d       |S )Nr  DarkGray)r   rP   r   bg3p)r#  r  )r/   r  RIDGEr/  r  r  s     r(   r  zNavigationToolbar2Tk._Spacer   s3    HHDrxxJO	BGG$'r9   c                    | j                   j                         j                         }| j                   j                         }|j	                  |      }||fgt        |j                               z   }|D cg c]  \  }}|d|z  f }}}d}	t        j                  j                  t        j                  d         }
| j                   j                         }t        j                  j                  | j                   j!                         j"                  d||	|
|      }|dv ry |
dk7  r9t        j                  j%                  t'        |            t        j                  d<   	 | j                   j(                  j+                  |       y c c}}w # t,        $ r3}t        j.                  j1                  dt'        |             Y d }~y d }~ww xY w)Nz*.%sr*  zsavefig.directoryzSave the figure)r   ro  	filetypesdefaultextension
initialdirinitialfile)r*  r  zError saving file)r.  get_supported_filetypesr  get_default_filetyper-   sorteditemsospath
expanduserr$   r%   get_default_filenamer  
filedialogasksaveasfilenamer   r   dirnamer1   r   savefigrF  
messagebox	showerror)r`   rV   r  default_filetypedefault_filetype_namesorted_filetypesextr   tk_filetypesr  r  r  fnamerW   s                 r(   save_figurez NavigationToolbar2Tk.save_figure&  s   KK779>>@	;;;;= !*.> ?.0EFG$Y__%678>NOdv|,OO WW''5H(IJ
kk668""44;;,,.55#"-!# 5  HE
+ LL,-	FKK&&u-7 P8  	F(()<c!fEE	Fs   8F	#%F 	G)GGc                 x   t         j                  t         j                  d}| j                  j                  dkD  }| j                  j                  t        | j                  j                        dz
  k  }d| j                  v r||   | j                  d   d<   d| j                  v r||   | j                  d   d<   y y )N)TFr   r   Backr   Forward)r/   NORMALDISABLED
_nav_stack_poslen	_elementsr  )r`   	state_mapcan_backcan_forwards       r(   set_history_buttonsz(NavigationToolbar2Tk.set_history_buttonsN  s    99R[[9	??''!+oo**S1J1J-Ka-OOT]]"-6x-@DMM&!'*%09+0FDMM)$W- &r9   r[   )rq   rr   rs   r   
deprecatedpropertyr,  r^   rU  r  r  r  r  r  r  lastrectr  r  r  r&  r3  ru   rv   s   @r(   rw  rw  0  s    >_T__U>)*,F51D 51n,63''? 6 &tu%@ACHMD^8&FP	Gr9   rw  c                   2    e Zd ZdZed        Zd Zd Zd Zy)r  zi
    Tooltip recipe from
    http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml#e387
    c                 |    t        |       fd}fd}| j                  d|       | j                  d|       y )Nc                 (    j                         y r[   )showtip)r   r  toolTips    r(   enterz$ToolTip.createToolTip.<locals>.enterb  s    OOD!r9   c                 &    j                          y r[   )hidetip)r   r;  s    r(   leavez$ToolTip.createToolTip.<locals>.leaved  s    OOr9   r   r   )r  r   )r   r  r<  r?  r;  s    `  @r(   r  zToolTip.createToolTip_  s2    &/	"	Iu%Iu%r9   c                 J    || _         d | _        d | _        dx| _        | _        y )Nr   )r   	tipwindowrI   r   r   r  s     r(   r^   zToolTip.__init__i  s%    r9   c                    || _         | j                  s| j                   sy| j                  j                  d      \  }}}}|| j                  j	                         z   | j                  j                         z   }|| j                  j                         z   }t        j                  | j                        x| _        }|j                  d       |j                  d||fz         	 |j                  j                  dd|j                  dd       t        j                  || j                   t        j                  t        j                   d	      }|j#                  d
       y# t        j                  $ r Y hw xY w)zDisplay text in tooltip window.Ninsertr   z+%d+%dz!::tk::unsupported::MacWindowStylestylehelpnoActivates)r  r  r   r   )ipadx)r  rA  r   rO   r   winfo_widthr   r/   Toplevelwm_overrideredirectwm_geometryrJ   _wrL   r  r  SOLIDr/  )r`   r  r   r   _twr  s          r(   r:  zToolTip.showtipo  s$   	>>[[%%h/
1a''))DKK,C,C,EE'')) kk$++66
q!
x1a&()	EEJJ:}.
 $))RWW "a9


	 {{ 		s   $)E   E65E6c                 P    | j                   }d | _         |r|j                          y y r[   )rA  r_  )r`   rO  s     r(   r>  zToolTip.hidetip  s#    ^^JJL r9   N)	rq   rr   rs   rt   staticmethodr  r^   r:  r>  r  r9   r(   r  r  Z  s*     & &,r9   r  c                   V    e Zd Zd Zd Z  ej                  d       ed             Zy)RubberbandTkc                 T    t         j                  | j                         d ||||       y r[   )rw  r  "_make_classic_style_pseudo_toolbar)r`   r  r  rR   rS   s        r(   r  zRubberbandTk.draw_rubberband  s'    ,,335tRR	Mr9   c                 J    t         j                  | j                                y r[   )rw  r  rU  rh   s    r(   r  zRubberbandTk.remove_rubberband  s    ..335	7r9   rx  c                 B    | j                   j                  j                  S r[   )r   r.  r   rh   s    r(   rn   zRubberbandTk.<lambda>  s    dkk00GG r9   N)	rq   rr   rs   r  r  r   r4  r5  r6  r  r9   r(   rS  rS    s0    M7 &tu%GHJHr9   rS  z3.5ToolSetCursorry  c                       e Zd Zd Zy)SetCursorTkc                 L    t         j                  | j                         |       y r[   )rw  r  rU  r  s     r(   r  zSetCursorTk.set_cursor  s    ''335v	?r9   N)rq   rr   rs   r  r  r9   r(   rZ  rZ    s    ?r9   rZ  c                   D    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zy)	ToolbarTkNc                 (   t        j                  | |       |.| j                  j                  j	                         j
                  }| j                  j                  j                  j                  j                  \  }}d||z
  }}t        j                  j                  | |t        |      t        |      d       t        j                  j                  d      | _        t        j                   |       | _        t        j$                  | | j                  | j"                        | _        | j&                  j)                  t        j*                         i | _        | j)                  t        j.                  t        j0                  	       i | _        y )
Nr~  r;   )r   rQ   rP   r   r  r  r?  )r   r  r  r  r  )r   r^   toolmanagerr.  r   r   r   rO   	intervalxr/   r  r   r  r  r  r  r  _messager  r  r/  r  
_toolitemsr0  r  _groups)r`   r_  r,  xminxmaxrP   rQ   s          r(   r^   zToolbarTk.__init__  s&   ""45>%%,,::<CCF%%,,3388BB
dD4K
$v #E
3v;&' 	 	) #<<,,",5D1 hhd9I9I48MMC  bhh /		rvvBDD	)r9   c                 ,    t         j                  |       S r[   )rw  rU  rh   s    r(   rU  zToolbarTk._rescale  s    #,,T22r9   c                      j                  |      }|j                         }|t        |      k\  s|dk  rd }	n||   }	t        j	                  ||| fd      }
|
j                  |	       |t        j                  |
|        j                  j                  g         j                     j                  |
       y )Nr   c                  &    j                         S r[   )_button_click)r   r`   s   r(   rn   z(ToolbarTk.add_toolitem.<locals>.<lambda>  s    d6H6H6N r9   )before)_get_groupframepack_slavesr.  rw  r  r  r  r  rb  
setdefaultappend)r`   r   grouppositionr  descriptionr  framebuttonsrj  r  s   ``         r(   add_toolitemzToolbarTk.add_toolitem  s    $$U+##%s7|#x!|FX&F%--eT:v.NPV,"!!&+6""4,$$V,r9   c                 @   || j                   vr| j                   r| j                          t        j                  | d      }|j	                  t        j
                  t        j                         | j                  |_        || j                   |<   | j                   |   S )Nr   )r   r   r  )rc  _add_separatorr/   r  r/  r  Yr  )r`   ro  rr  s      r(   rk  zToolbarTk._get_groupframe  st    $||##%HHDa8EJJBGG"$$J/ $ 0 0E"'DLL||E""r9   c                 ,    t         j                  |       S r[   )rw  r  rh   s    r(   rv  zToolbarTk._add_separator  s    #++D11r9   c                 &    | j                  |       y r[   )trigger_tool)r`   r   s     r(   ri  zToolbarTk._button_click  s    $r9   c                     || j                   vry | j                   |   D ]%  }|r|j                          |j                          ' y r[   )rb  r  r  )r`   r   toggledtoolitems       r(   toggle_toolitemzToolbarTk.toggle_toolitem  sB    t&- 	$H!!!#		$r9   c                 f    | j                   |   D ]  }|j                           | j                   |= y r[   )rb  pack_forget)r`   r   r}  s      r(   remove_toolitemzToolbarTk.remove_toolitem  s2    - 	#H  "	#OOD!r9   c                 :    | j                   j                  |       y r[   )ra  r  r  s     r(   r  zToolbarTk.set_message  s    !r9   r[   )rq   rr   rs   r^   rU  rt  rk  rv  ri  r~  r  r  r  r9   r(   r]  r]    s/    $3- #2 $"
r9   r]  c                       e Zd Zd Zy)SaveFigureTkc                 J    t         j                  | j                                y r[   )rw  r&  rU  r`   rV   s     r(   triggerzSaveFigureTk.trigger  s    ((335	7r9   Nrq   rr   rs   r  r  r9   r(   r  r    s    7r9   r  c                       e Zd Zd Zy)ConfigureSubplotsTkc                 .    t         j                  |        y r[   )rw  configure_subplotsr  s     r(   r  zConfigureSubplotsTk.trigger  s    //5r9   Nr  r  r9   r(   r  r    s    6r9   r  c                       e Zd Zd Zy)HelpTkc                     t        | j                  j                  j                  | j	                         dg      fd_        y )NOKc                 L    j                   j                  j                         S r[   )rr  r   r-  )r   dialogs    r(   rn   z HelpTk.trigger.<locals>.<lambda>  s    &,,"5"5">">"@ r9   )r   r   r.  r   _get_help_textdone)r`   rV   r  s     @r(   r  zHelpTk.trigger  s7    KK(($*=*=*?$I@r9   Nr  r  r9   r(   r  r    s    Ar9   r  c                   8    e Zd Zej                  ZeZed        Z	y)
_BackendTkc                      t        j                         } | rG| d   }t        |      }|j                  ry d|_        	 |j                  j                          d|_        y y # d|_        w xY w)Nr   TF)r   get_all_fig_managerstyperf  r,  r  )managersfirst_managerr   s      r(   r  z_BackendTk.mainloop  sj    ++-$QKM /M+++/M(5$$--//4,  05,s   A 	A(N)
rq   rr   rs   r/   	TkVersionbackend_versionrz   FigureManagerrQ  r  r  r9   r(   r  r    s"    llO#M5 5r9   r  r[   )Xuuid
contextlibr   loggingrC   os.pathr  r   r  r/   tkinter.filedialogtkinter.fonttkinter.messageboxtkinter.simpledialogr   numpyr<   PILr   r   r<  r$   r   r   r	   r
   matplotlib.backend_basesr   r   r   r   r   r   r   r   r   r   r   r   r   matplotlib._pylab_helpersr   r*  r   	getLoggerrq   rG  MOVEHANDPOINTERSELECT_REGIONWAITRESIZE_HORIZONTALRESIZE_VERTICALr  r)   r,   uuid4hexrK   rG   rH   r8   r.   rY   rx   rz   r  rw  r  _register_tool_classRubberbandBaserS  r4  SetCursorBaserZ  r]  SaveFigureBaser  ConfigureSubplotsBaser  ToolHelpBaser  Toolbar_toolbar2_class_toolmanager_toolbar_classexportr  r  r9   r(   <module>r     s    %    
     -    D DB B B B *  w"LL'LL'OOW8LL'20 D D 
ztzz|///  	-43n#i #Ly% yxPA' PAfgG-rxx gGT	/ /d $##N3
J=// 
J 4
J O4?--- ? 5?E!288 EP $##N37=// 7 47 $##N36-== 6 46
 $##N3A]'' A 4A "6 -6 * 
5 5 5r9   