
    g                        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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)m*Z* d dl+m,Z, dd	l-m.Z. dd
l.m/Z/m0Z0  ejb                  e2      Z3e#jh                  de#jj                  de#jl                  de#jn                  de#jp                  de#jr                  de#jt                  diZ;ed        Z<i Z=d e j|                         j~                  z   Z@d ZAd+dZB G d de!      ZC G d de      ZD G d de      ZE G d de ej                        ZGd ZH ej                  eD       G d d ej                               ZK G d! d"e"ej                        ZL ej                  eD       G d# d$ej                               ZN ej                  eD       G d% d&ej                               ZP ej                  eD       G d' d(ej                               ZReLZSeGeE_T        eLeE_U        ej                   G d) d*e             ZWy),    N)contextmanager)SimpleDialog)ImageImageTk)_apibackend_toolscbook_c_internal_utils)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2	TimerBaseToolContainerBasecursors_ModeMouseButton
CloseEventKeyEventLocationEvent
MouseEventResizeEvent)Gcf   )_tkagg)TK_PHOTO_COMPOSITE_OVERLAYTK_PHOTO_COMPOSITE_SETfleurhand2arrow	crosshairwatchsb_h_double_arrowsb_v_double_arrowc               #      K   t        j                         } 	 d  | r*t        j                  d   rt        j                  |        y y y # | r*t        j                  d   rt        j                  |        w w w xY ww)Nztk.window_focus)r
   Win32_GetForegroundWindowmplrcParamsWin32_SetForegroundWindow)
foregrounds    \/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/matplotlib/backends/_backend_tk.py!_restore_foreground_window_at_endr,   )   se     "<<>JD#,,'8977
C :::#,,'8977
C ::s   A:A	 -A:	.A77A:	mpl_blit_c                     t         j                  |       \  }}}}}|j                  j                  dd|      sy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.
    infocommandsN)
_blit_argspoptkcallr   blit
interpaddrstr)argsid
photoimagedataoffsetsbbox	comp_rules         r+   _blitr>   8   s`     2<1G.JgtY==fj*=
KK
((*C
OT9g    c                 6   t        j                  |      }|j                  dd \  }}||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	__array__maxmathfloorminceilr   r   r7   idr1   r3   r4   _blit_tcl_nameTclErrorcreatecommandr>   )r9   aggimager;   r<   r:   heightwidthx1y1x2y2bboxptrr=   argsr8   es                   r+   r5   r5   F   s\     ::hDJJrNMFE!^^-R(2rB#2&B#2'Gbr2r".	eQ'*	 tWgy8D D]FJv3>62;; 3!Q/##NE:>622	3s    D) )F<AFF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`   rW   kwargs	__class__s       r+   r_   zTimerTk.__init__   s#    $)&)r?   c                     | j                          | j                  j                  | j                  | j                        | _        y r\   )_timer_stopr`   after	_interval	_on_timerr]   ra   s    r+   _timer_startzTimerTk._timer_start   s.    kk''Gr?   c                 t    | j                   %| j                  j                  | j                          d | _         y r\   )r]   r`   after_cancelri   s    r+   re   zTimerTk._timer_stop   s)    ;;"KK$$T[[1r?   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`   rf   rg   rh   ri   s   r+   <lambda>z#TimerTk._on_timer.<locals>.<lambda>   s     DKK--dnndnnM r?   )r^   rh   _singler]   rg   r`   rf   
after_idle)ra   rc   s   `r+   rh   zTimerTk._on_timer   sm    
 ||~~!"kk//O #kk44M DKr?   )	__name__
__module____qualname____doc__r_   rj   re   rh   __classcell__rc   s   @r+   rZ   rZ   |   s     F
H
 r?   rZ   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ed        Zeddd       Zd Zd Zd Zd Zd Zd dZd Zd Z xZ S )!FigureCanvasTkr3   c                     t         S r\   )FigureManagerTk)clss    r+   ro   zFigureCanvasTk.<lambda>   s    ? r?   Nc                 "  	
 t         |   |       d | _        d | _        | j	                  d      \  }}t        j                  |d||dd      | _        t        j                  | j                  ||      | _	        | j                  j                  |dz  |dz  | j                        | _        | j                  j                  d	| j                         | 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                  || j.                         * | j                  j1                         }t3        j4                  |       t3        j4                  |      
fd}|j                  d|d      
	fd}|j                  d|d      	| j                  j7                          d | _        d | _        y )NTphysicalwhiter   )master
backgroundrQ   rP   borderwidthhighlightthickness)r   rQ   rP   rA   imagez<Configure>z<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                 p            }|        }||j                  d       y |j                  |       S )N<MouseWheel>)unbindscroll_event_windows)eventra   rootscroll_event_windows_idweakrootweakselfs      r+   r   z5FigureCanvasTk.__init__.<locals>.scroll_event_windows   s?    :D|z#KK0GH,,U33r?   r   +c                             }|        }||j                  d       y | j                  |j                  u rt        d|      j	                          y y )N	<Destroy>close_event)r   widget	_tkcanvasr   _process)r   ra   r   filter_destroy_idr   r   s      r+   filter_destroyz/FigureCanvasTk.__init__.<locals>.filter_destroy   sV    :D|z#KK->?||t~~-=$/88: .r?   r   )r^   r_   _idle_draw_id_event_loop_idget_width_heightr3   Canvasr   
PhotoImage_tkphotocreate_image_tkcanvas_image_regionbindresize_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weakrefref	focus_set_rubberband_rect_black_rubberband_rect_white)ra   figurer   whnamer   r   r   r   r   r   r   rc   s            @@@@r+   r_   zFigureCanvasTk.__init__   s    !"$$d$31gA1D >>16&*nn&A&AqD!Q$dmm 'B '-#M4;;7GT%D%DE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 ~~,,. ;;t$;;t$	4 #'))N<PRU"V	; !IIk>3G  "&*#&*#r?   c                    d }t         j                  dk(  r4t        | j                  j                  j                  dd      dz  d      }n1t         j                  dk(  r| j                  j                  d      dz  }|E| j                  |      r3| j                  d	
      \  }}| j                  j                  ||       y y y )Nwin32r3   scalinggUUUUUU?rA   linux1i`   Tr~   rQ   rP   )
sysplatformroundr   r3   r4   winfo_fpixels_set_device_pixel_ratior   	configure)ra   r   ratior   r   s        r+   r   z)FigureCanvasTk._update_device_pixel_ratio   s    <<7" $..++00yAWMqQE\\W$NN006;E!=!=e!D (($(7DAqNN$$1Q$7 "Er?   c                 6   |j                   |j                  }}| j                  j                  }||z  }||z  }| j                  j	                  ||d       | j
                  j                  | j                         | j                  j                  t        |      t        |             | j
                  j                  t        |dz        t        |dz        | j                        | _        t        d|       j                          | j                          y )NF)forwardr   rA   r   resize_event)rQ   rP   r   dpiset_size_inchesr   deleter   r   r   intr   r   r   	draw_idle)ra   r   rQ   rP   dpivalwinchhinchs          r+   r   zFigureCanvasTk.resize   s    U\\v ##E5%#@d99:c%jVE&*nn&A&A	NC
O4== 'B 'B#ND)224r?   c                 j      j                   ry  fd} j                  j                  |       _         y )Nc                  N    	 j                          d _        y # d _        w xY wr\   )drawr   rW   ra   s    r+   	idle_drawz+FigureCanvasTk.draw_idle.<locals>.idle_draw  s"    *		%)"T"s    	$)r   r   rq   )ra   r   s   ` r+   r   zFigureCanvasTk.draw_idle  s-    	* "^^66yAr?   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   ri   s    r+   get_tk_widgetzFigureCanvasTk.get_tk_widget  s     ~~r?   c                     | j                   j                  |j                        | j                  j                  j
                  | j                   j                  |j                        z
  fS r\   )r   canvasxxr   r<   rP   canvasyyra   r   s     r+   _event_mpl_coordsz FigureCanvasTk._event_mpl_coords!  sQ     &&uww/  ''$..*@*@*IIK 	Kr?   c                     t        d| g| j                  |      | j                  |      | j                  |      |dj	                          y )Nr   )buttons	modifiersguiEvent)r   r   _mpl_buttons_mpl_modifiersr   r   s     r+   r   z"FigureCanvasTk.motion_notify_event(  sO    ($ 	#**51	#,,U3!007!		# $,8:r?   c                 ~    t        d| g| j                  |      | j                  |      |dj                          y )Nfigure_enter_eventr   r   r   r   r   r   r   s     r+   r   z!FigureCanvasTk.enter_notify_event/  A    *D 	&--e4	& $ 3 3E :$	& '/hjr?   c                 ~    t        d| g| j                  |      | j                  |      |dj                          y )Nfigure_leave_eventr   r   r   s     r+   r   z!FigureCanvasTk.leave_notify_event5  r   r?   c                 "   | j                   j                          t        |dd       }t        j                  dk(  rdddj                  ||      }t        d| g| j                  |      ||| j                  |      |dj                          y )Nnumdarwin   rA   rA   r   r   )dblclickr   r   )
r   r   getattrr   r   getr   r   r   r   )ra   r   r   r   s       r+   r   z!FigureCanvasTk.button_press_event;  s      "eUD)<<8#A,""3,C' 	#**51	#36	#AI!007!	# $,8:r?   c                 *    | j                  |d       y )NT)r   )r   r   s     r+   r   z$FigureCanvasTk.button_dblclick_eventG  s    5r?   c                     t        |dd       }t        j                  dk(  rdddj                  ||      }t	        d| g| j                  |      || j                  |      |dj                          y )Nr   r   r   rA   r   r   r   )r   r   r   r   r   r   r   r   )ra   r   r   s      r+   r   z#FigureCanvasTk.button_release_eventJ  sy    eUD)<<8#A,""3,C)4 	#**51	#36	#!007!	# $,8:r?   c                     t        |dd       }|dk(  rdn|dk(  rdnd}t        d| g| j                  |      || j                  |      |dj	                          y )	Nr      r      r   r   stepr   r   )r   r   r   r   r   )ra   r   r   r   s       r+   r   zFigureCanvasTk.scroll_eventS  sf    eUD)1Hqq"a>4 	#**51	#8<!007!	# $,8:r?   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                  |      |      j                          y)zMouseWheel event processorNx   r   r   )r   winfo_containingx_rooty_rootr   r   winfo_rootxr   r<   rP   r   winfo_rootydeltar   r   r   )ra   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add.A.A%.H!	##+8:r?   c                    t         j                  dk(  rWt        j                  dft        j                  dft        j
                  dft        j                  dft        j                  dfgnVt        j                  dft        j
                  dft        j                  dft        j                  dft        j                  dfg}|D cg c]  \  }}| j                  |z  s| c}}S c c}}w )Nr      i   i   i   i   )	r   r   r   LEFTRIGHTMIDDLEBACKFORWARDstate)r   r   r   masks       r+   r   zFigureCanvasTk._mpl_buttonsi  s     \\X% v&')w'  '*
 v&((w'  '*,
 	  (1GtEKK$4FGGGs   C'C'excludec                    t         j                  dk(  rg dnt         j                  dk(  rg dng d}|D cg c]  \  }}}| j                  |z  r||k7  r| c}}}S c c}}}w )Nr   )ctrlr   control)alti   r  shiftr   r  r   )r  )r     r  r  )cmd   r  )r  )r  r  r  r  )r^   @   r^   )r   r   r  )r   r  r   r   r  keys         r+   r   zFigureCanvasTk._mpl_modifiers  sp     \\W$	
 \\X%+

,
 	 -6 : :tS;;%'S.  : 	: :s   !Ac                     |j                   }t        j                  ||j                        }|?| j	                  ||      }d|v r|r|j                  d       dj                  g ||      S y )Nr  r  r   )charr	   _unikey_or_keysym_to_mplkeykeysymr   removejoin)ra   r   unikeyr  modss        r+   _get_keyzFigureCanvasTk._get_key  sl    //E?&&uc&:D$6G$88LdLCL)) r?   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_press  s=    "Du%	!(,(>(>u(E	!	!!)r?   c                 ~    t        d| | j                  |      g| j                  |      d|ij                          y )Nkey_release_eventr   r'  r   s     r+   r   zFigureCanvasTk.key_release  s=    $du%	!(,(>(>u(E	!	!!)r?   c                 4    t        | j                  g|i |S r\   )rZ   r   )ra   rW   rb   s      r+   	new_timerzFigureCanvasTk.new_timer  s    t~~7777r?   c                 8    | j                   j                          y r\   )r   updateri   s    r+   flush_eventszFigureCanvasTk.flush_events  s    r?   c                    |dkD  rit        d|z        }|dkD  r,| j                  j                  || j                        | _        n*| j                  j                  | j                        | _        | j                  j                          y )Nr   i  )r   r   rf   stop_event_loopr   rq   mainloop)ra   timeoutmillisecondss      r+   start_event_loopzFigureCanvasTk.start_event_loop  ss    Q;tg~.La&*nn&:&: $"6"6'8# '+nn&?&?(('*#!r?   c                     | j                   r,| j                  j                  | j                          d | _         | j                  j                          y r\   )r   r   rl   quitri   s    r+   r0  zFigureCanvasTk.stop_event_loop  s;    NN''(;(;<"&Dr?   c                 ~    	 | j                   j                  t        |          y # t        j                  $ r Y y w xY w)N)cursor)r   r   cursordtkinterrM   )ra   r8  s     r+   
set_cursorzFigureCanvasTk.set_cursor  s8    	NN$$GFO$< 		s   #& <<)NNr\   )F)r   )!rr   rs   rt   required_interactive_frameworkr   classpropertymanager_classr_   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r$  r   r   r+  r.  r4  r0  r;  rv   rw   s   @r+   ry   ry      s    %)"&D&&'BCMC+J8  BK.11
.6... H H* )- : :2*,
,
8 
"r?   ry   c                   p     e Zd ZdZdZ fdZed        Zed        Zd Z	d Z
d Zd	 Zd
 Zd Zd Z xZS )r{   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expandr  r   
window_dpi)r   valuer    writeF)windowr^   r_   withdrawcanvasr   packr3   TOPBOTHr   wm_frameIntVar_window_dpi_window_dpi_cbnamer   enable_dpi_awarenessr6   	trace_add_update_window_dpi_shown)ra   rK  r   rI  window_framerc   s        r+   r_   zFigureManagerTk.__init__  s    % 	""RWWQ"G
 6??,b199F",6|n*EG"$&&|VYY5I5I5KL&*&6&6&@&@00'2D# r?   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 # 1 sw Y   y xY w)N
matplotlib)	classNamezimages/matplotlib.png)filer   zimages/matplotlib_large.pngFr   )r,   r	   "_get_running_interactive_framework_setup_new_guiappr
    Win32_SetProcessDpiAwareness_maxr3   TkrJ  r7   _get_data_pathr   r   	iconphotor'   is_interactiveshowr   )r|   canvas_classr   r   rI  
icon_fnameicon_imgicon_fname_largeicon_img_largerK  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 UNH=!&8F&#v.G!!#  ";	 	 	s   D)D>>Ec                     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type_owns_mainlooprI  r1  )r|   managersfirst_managerr>  s       r+   start_main_loopzFigureManagerTk.start_main_loop  sj    ++-$QKM /M+++/M(5$$--//4,  05,s   A 	A(c                 $   | j                   j                         }| j                  j                  dd|dz         | j                  r0t        | j                  d      r| j                  j                          | j                  j                          y )Nr3   r   H   _rescale)	rQ  r   rI  r4   toolbarhasattrru  rK  r   )ra   rW   newdpis      r+   rU  z"FigureManagerTk._update_window_dpi$  sd    !!%%'y&2+6<<GDLL*=LL!!#..0r?   c           	          d}||kD  s||kD  r(t         j                  dk(  rt        d| d| d| d      | j                  j                  j                  ||       y )Ni\ r   z/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   
ValueErrorrK  r   r   )ra   rQ   rP   max_sizes       r+   r   zFigureManagerTk.resize+  sq    H 1s||w7N!!&r& 2""* ,++, , 	''eF'Cr?   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%r?   WM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r,   rV  rI  protocol	deiconifyrK  r   r   r   r'   r(   rj  
attributes)ra   r~  s   ` r+   rd  zFigureManagerTk.show9  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 )NrH  c                       j                   j                           j                  r0t        j                         s j                   j                          y y y r\   )rI  r~  ro  r   get_num_fig_managersr6  ri   s   r+   delayed_destroyz0FigureManagerTk.destroy.<locals>.delayed_destroyU  s@    KK!""3+C+C+E  " ,F"r?   r3   r   )rK  r   r   rl   r   rR  rQ  trace_remover	   r]  rI  rq   rf   r-  )ra   rW   r  s   `  r+   r~  zFigureManagerTk.destroyH  s    ;;$$KK!!..t{{/H/HI;;%%KK!!..t{{/I/IJ""))'43J3JK	# 335=KK""4;;#4#4aIKK r?   c                 6    | j                   j                         S r\   rI  wm_titleri   s    r+   get_window_titlez FigureManagerTk.get_window_titleb  s    {{##%%r?   c                 :    | j                   j                  |       y r\   r  )ra   titles     r+   set_window_titlez FigureManagerTk.set_window_titlee  s    U#r?   c                     t        | j                  j                  d            }| j                  j                  d|        y )Nz-fullscreen)boolrI  r  )ra   is_fullscreens     r+   full_screen_togglez"FigureManagerTk.full_screen_toggleh  s2    T[[33MBC}-.?@r?   )rr   rs   rt   ru   ro  r_   classmethodrk  rr  rU  r   rd  r~  r  r  r  rv   rw   s   @r+   r{   r{     sb     N*  B 5 51D4&$Ar?   r{   c                   r     e Zd ZddddZd Zd Z fdZ fdZd Zd	 Z	d
 Z
d Zd Zd Zd Zd Z xZS )NavigationToolbar2TkT)pack_toolbarc                Z   ||j                         j                  }t        j                  j	                  | |dt        |j                  j                  j                        d       i | _	        | j                  D ]y  \  }}}}|| j                          | j                  |t        t        j                  d| d            |dv t!        | |            x| j                  |<   }|nt#        ||       { t$        j&                  j)                  |d	
      | _        t        j,                  | | j*                  d      }	|	j/                  t        j0                         t        j2                  |       | _        t        j,                  | | j*                  | j4                  t        j0                        | _        | j6                  j/                  t        j0                         t9        j                  | |       |r0| j/                  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``.
        NrA   2   )r   r   rQ   rP   zimages/.png)zoompan)togglecommand
   )r   size    
 r   fonttextrB  r\  )r   r  textvariablejustifyrB  rC  )r   r   r3   Framer_   r   r   r<   rQ   _buttons	toolitems_Spacer_Buttonr7   r	   ra  r   add_tooltipr:  r  Font_label_fontLabelrL  r  	StringVarmessage_message_labelr   BOTTOMX)
ra   rK  rI  r  r  tooltip_text
image_filecallbackbuttonlabels
             r+   r_   zNavigationToolbar2Tk.__init__n  s    >))+22F
$v1 #FMM$6$6$<$< =b 	 	J 8< 	64D,
H|/3||,,wzl$-GHI#6#D(3	 0< 0 d#f  +5	6 #<<,,&r,B 4+;+;FH


!||40 hhd9I9I48LL/1xx9 	  bhh /##D&1II299244I0 r?   c                    | j                         D ]  }t        |t        j                  t        j                  f      r$t        |d      rt        j                  | |       PQt        |t        j                        r%|j                  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18p)rP   3p)padxzUnknown child class %sr  r  N)winfo_children
isinstancer3   ButtonCheckbuttonrw  r  _set_image_for_buttonr  r   pack_configurer  _logwarningwinfo_classr  )ra   r   s     r+   ru  zNavigationToolbar2Tk._rescale  s     ))+ 	KF&299bnn"=>6=1(>>tVL FBHH-   .%%4%0FBHH-5v7I7IJ	K 	"""+r?   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)ra   r  r  s      r+   _update_buttons_checkedz,NavigationToolbar2Tk._update_buttons_checked  sn    "EJJ/%1CD 	3JD$t}}$99$MM$'..0MM$'002	3r?   c                 >    t        |   |  | j                          y r\   )r^   r  r  ra   rW   rc   s     r+   r  zNavigationToolbar2Tk.pan  s    T$$&r?   c                 >    t        |   |  | j                          y r\   )r^   r  r  r  s     r+   r  zNavigationToolbar2Tk.zoom  s    d$$&r?   c                 :    | j                   j                  |       y r\   )r  setra   ss     r+   set_messagez NavigationToolbar2Tk.set_message  s    r?   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)	rK  r   r   r   r   r   r<   rP   create_rectangle)ra   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 > 	*r?   c                    | j                   j                  rJ| j                   j                  j                  | j                   j                         d | j                   _        | j                   j                  rK| j                   j                  j                  | j                   j                         d | j                   _        y y r\   )rK  r   r   r   r   ri   s    r+   remove_rubberbandz&NavigationToolbar2Tk.remove_rubberband  s}    ;;--KK!!(()K)KL15DKK.;;--KK!!(()K)KL15DKK. .r?   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.pngr  c                 D    j                  j                  |             S r\   )	winfo_rgbcget)
color_namer  s    r+   
_get_colorz>NavigationToolbar2Tk._set_image_for_button.<locals>._get_color  s    ##FKK
$;<<r?   c                 P    t        | t              r |       } t        |       dk  S )Ng    @)r  r7   rF   )colorr  s    r+   _is_darkz<NavigationToolbar2Tk._set_image_for_button.<locals>._is_dark  s&    %%"5)u:	))r?   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  )rB   rC   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;;r?      r  r\  g o?r*   r   r   selectcolorrG  x11activebackgroundrA   selectimage)rP   rQ    )r  r	   ra  	with_namer   replacewinfo_pixelsr   openexistsconvertr   r   r   _ntimagerB   arrayr  r  _ntimage_altr  r3   r  _windowingsystemr   )ra   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  )r3   r  rP  r  varr  r  r  r   r  rL  r  )ra   r  r  r  r  br  s          r+   r  zNavigationToolbar2Tk._Button;  s    		$(A ))4(C$U8A
 AE"! 66tQ?KKT--K.	BGGr?   c                     t        j                  | dt         j                  d      }|j                  t         j                  d       |S )Nr  DarkGray)r   rP   r  bgr  )rB  r  )r3   r  RIDGErL  r  r  s     r+   r  zNavigationToolbar2Tk._SpacerW  s3    HHDrxxJO	BGG$'r?   c           	         | j                   j                         }t        |j                               D cg c]  \  }}|dj	                  d |D              f! }}}| j                   j                         }| j                   j                         |   }t        j                  | j                   j                         |      }d}	t        j                  j                  t        j                  d         }
t        j                   | j                   j#                               j$                  }t&        j(                  j+                  | j                   j                         j,                  d||	|
||      }|dv ry |
dk7  r9t        j                  j/                  t1        |            t        j                  d<   t        j                   |      j2                  dd  dk7  rd }n||j5                            d	   }	 | j                   j6                  j9                  ||
       |S c c}}w # t:        $ r3}t&        j<                  j?                  dt1        |             Y d }~y d }~ww xY w)N c              3   &   K   | ]	  }d |   yw)z*.Nr  ).0exts     r+   	<genexpr>z3NavigationToolbar2Tk.save_figure.<locals>.<genexpr>`  s     73bJ7s   rG  zsavefig.directoryzSave the figure)r   r  	filetypesdefaultextension
initialdirinitialfiletypevariable)rG  r  r   r   )formatzError saving file) rK  get_supported_filetypes_groupedsorteditemsr!  get_default_filetypeget_supported_filetypesr3   r  r   ospath
expanduserr'   r(   pathlibPathget_default_filenamestemr:  
filedialogasksaveasfilenamer   dirnamer7   suffixr   r   savefig	Exception
messagebox	showerror)ra   rW   r'  r   extstk_filetypesdefault_extensiondefault_filetypefiletype_variabler(  r)  r*  fname	extensionrX   s                  r+   save_figurez NavigationToolbar2Tk.save_figure]  s   KK??A	 %Y__%67
d 3887$778
 

 !KK<<>;;>>@ARSLL)B)B)DFVW WW''5H(IJ
 ll4;;#C#C#EFKK""44;;,,.55#"-!#* 5  HE
+ LL,-
 <<%%ab)R/I!"3"7"7"9:1=I	FKK&&uY&?L]
^  	F(()<c!fEE	Fs   $H6(H% %	I!.)II!c                 d   t         j                  t         j                  d}| j                  j                  dkD  }| j                  j                  t        | 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)r3   NORMALDISABLED
_nav_stack_poslenr  )ra   	state_mapcan_backcan_forwards       r+   set_history_buttonsz(NavigationToolbar2Tk.set_history_buttons  s    99R[[9	??''!+oo**S-AA-EET]]"-6x-@DMM&!'*%09+0FDMM)$W- &r?   r\   )rr   rs   rt   r_   ru  r  r  r  r  r  r  r  r  r  rH  rT  rv   rw   s   @r+   r  r  m  sR    51D 51n,63''? 6MD^82FhGr?   r  c                 n     d  fd}fd} j                  d|        j                  d|       y )Nc                 :   ssyj                  d      \  }}}}|j                         z   j                         z   }|j                         z   }t	        j
                        j                  d       j                  d| d|        	 j                  j                  ddj                  dd       t	        j                  t        j                  t        j                  d	      }|j                  d
       y# t        j                  $ r Y ^w xY w)zDisplay text in tooltip window.Ninsertr   r   z!::tk::unsupported::MacWindowStylestylehelpnoActivates)r  r  r  r   )ipadx)r<   r  winfo_widthr  r3   Topleveloverrideredirectgeometryr4   _wrM   r  r  SOLIDrL  )r   r   r   _r  r  	tipwindowr   s        r+   showtipzadd_tooltip.<locals>.showtip  s     D[[*
1a""$$v'9'9';;""$$KK'	""1%Qqc1#;'	LLA%y||$m5
 rww "a9


	 {{ 		s   )D DDc                 .    rj                          d y r\   )r~  )r   rc  s    r+   hidetipzadd_tooltip.<locals>.hidetip  s    	r?   r   r   )r   )r   r  rd  rf  rc  s   ``  @r+   r  r    s0    I* KK	7#
KK	7#r?   c                       e Zd Zd Zd Zy)RubberbandTkc                 T    t         j                  | j                         d ||||       y r\   )r  r  "_make_classic_style_pseudo_toolbar)ra   r  r  rR   rS   s        r+   r  zRubberbandTk.draw_rubberband  s'    ,,335tRR	Mr?   c                 J    t         j                  | j                                y r\   )r  r  rj  ri   s    r+   r  zRubberbandTk.remove_rubberband  s    ..335	7r?   N)rr   rs   rt   r  r  r  r?   r+   rh  rh    s    M7r?   rh  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                   | | j                  d      }|j#                  t        j$                         t        j&                  | 	      | _        t        j                   | | j                  | j(                  
      | _        | j*                  j#                  t        j$                         i | _        | j#                  t        j.                  t        j0                         i | _        y )Nr  rA   )r   rQ   rP   r   r  r  r  r  r  r\  )r   r  r  r  )r   r_   toolmanagerrK  r   r   r   r<   	intervalxr3   r  r   r:  r  r  r  r  rL  r  r  _messager  
_toolitemsrM  r  _groups)ra   ro  rI  xminxmaxrP   rQ   r  s           r+   r_   zToolbarTk.__init__  sV   ""45>%%,,::<CCF%%,,3388BB
dD4K
$v #E
3v;&' 	 	) #<<,,",5
 4+;+;FH


!D1 hhd9I9I48MMC  bhh /		rvvBDD	)r?   c                 ,    t         j                  |       S r\   )r  ru  ri   s    r+   ru  zToolbarTk._rescale  s    #,,T22r?   c                 n     j                  |      }|j                         }|t        |      k\  s|dk  rd }	n||   }	t        j	                  ||| fd      }
|
j                  |	       |t        |
|        j                  j                  g         j                     j                  |
       y )Nr   c                  &    j                         S r\   )_button_click)r   ra   s   r+   ro   z(ToolbarTk.add_toolitem.<locals>.<lambda>  s    d6H6H6N r?   )before)
_get_groupframepack_slavesrP  r  r  r  r  rr  
setdefaultappend)ra   r   grouppositionr  descriptionr  framer   rz  r  s   ``         r+   add_toolitemzToolbarTk.add_toolitem  s    $$U+##%s7|#x!|FX&F%--eT:v.NPV,",""4,$$V,r?   c                 @   || j                   vr| j                   r| j                          t        j                  | d      }|j	                  t        j
                  t        j                         | j                  |_        || j                   |<   | j                   |   S )Nr   )r   r   r  )rs  _add_separatorr3   r  rL  r  Yr  )ra   r  r  s      r+   r{  zToolbarTk._get_groupframe  st    $||##%HHDa8EJJBGG"$$J/ $ 0 0E"'DLL||E""r?   c                 ,    t         j                  |       S r\   )r  r  ri   s    r+   r  zToolbarTk._add_separator  s    #++D11r?   c                 &    | j                  |       y r\   )trigger_tool)ra   r   s     r+   ry  zToolbarTk._button_click  s    $r?   c                     || j                   vry | j                   |   D ]%  }|r|j                          |j                          ' y r\   )rr  r  r  )ra   r   toggledtoolitems       r+   toggle_toolitemzToolbarTk.toggle_toolitem  sB    t&- 	$H!!!#		$r?   c                 f    | j                   j                  |g       D ]  }|j                           y r\   )rr  r2   pack_forget)ra   r   r  s      r+   remove_toolitemzToolbarTk.remove_toolitem  s.    ++D"5 	#H  "	#r?   c                 :    | j                   j                  |       y r\   )rq  r  r  s     r+   r  zToolbarTk.set_message  s    !r?   r\   )rr   rs   rt   r_   ru  r  r{  r  ry  r  r  r  r  r?   r+   rm  rm    s/    23- #2 $#r?   rm  c                       e Zd Zd Zy)SaveFigureTkc                 J    t         j                  | j                                y r\   )r  rH  rj  ra   rW   s     r+   triggerzSaveFigureTk.trigger  s    ((335	7r?   Nrr   rs   rt   r  r  r?   r+   r  r    s    7r?   r  c                       e Zd Zd Zy)ConfigureSubplotsTkc                 .    t         j                  |        y r\   )r  configure_subplotsr  s     r+   r  zConfigureSubplotsTk.trigger  s    //5r?   Nr  r  r?   r+   r  r    s    6r?   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\   )r  r   rJ  )r   dialogs    r+   ro   z HelpTk.trigger.<locals>.<lambda>(  s    &,,"5"5">">"@ r?   )r   r   rK  r   _get_help_textdone)ra   rW   r  s     @r+   r  zHelpTk.trigger%  s7    KK(($*=*=*?$I@r?   Nr  r  r?   r+   r  r  #  s    Ar?   r  c                   D    e Zd Zej                  ZeZeZ	ej                  Zy)
_BackendTkN)rr   rs   rt   r3   	TkVersionbackend_versionry   FigureCanvasr{   FigureManagerrr  r1  r  r?   r+   r  r  0  s     llO!L#M..Hr?   r  r\   )Xuuidr   
contextlibr   loggingrG   os.pathr2  r5  r   r:  r3   tkinter.filedialogtkinter.fonttkinter.messageboxtkinter.simpledialogr   numpyrB   PILr   r   rY  r'   r   r   r	   r
   matplotlib.backend_basesr   r   r   r   r   r   r   r   r   r   r   r   r   r   matplotlib._pylab_helpersr   rG  r   r   r   	getLoggerrr   r  MOVEHANDPOINTERSELECT_REGIONWAITRESIZE_HORIZONTALRESIZE_VERTICALr9  r,   r1   uuid4hexrL   r>   r5   rZ   ry   r{   r  r  r  _register_tool_classRubberbandBaserh  rm  SaveFigureBaser  ConfigureSubplotsBaser  ToolHelpBaser  Toolbar_toolbar2_class_toolmanager_toolbar_classexportr  r  r?   r+   <module>r     sT     %     
     -    D DB B B B *  F w"LL'LL'OOW;LL'20 D D 
ztzz|///33l#i #Lj% jZ	[A' [A|kG-rxx kG\	$D $##N37=// 7 47K!288 K\ $##N37=// 7 47 $##N36-== 6 46
 $##N3A]'' A 4A "6 -6 * 
/ / /r?   