o
    tBh<                     @   sr  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" d dl#m$Z$ d dl%m&Z& d d	l'm(Z( d
dl)m*Z* e+e,Z-e	j.Z/e!j0de!j1de!j2de!j3de!j4de!j5de!j6diZ7edd Z8i Z9de : j; Z<d Z=d
Z>dd Z?d5ddZ@G dd deZAG dd deZBG dd deZCG d d! d!ee	jDZEG d"d# d#ZFG d$d% d%ejGZHejId&d'd(G d)d* d*ejJZKG d+d, d,e e	jDZLG d-d. d.ejMZNG d/d0 d0ejOZPG d1d2 d2ejQZReNe_SePe_TeHe_UeRe_VejWe_XeLZYejZG d3d4 d4eZ[dS )6    N)contextmanager)SimpleDialog)ImageImageTk)_apibackend_toolscbook_c_internal_utils)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2	TimerBaseToolContainerBasecursors_Mode)Gcf)Figure)SubplotTool   )_tkaggfleurhand2arrowtcrosswatchsb_h_double_arrowsb_v_double_arrowc               	   c   sH    t  } zd V  W tjd rt |  d S d S tjd r#t |  w w )Nztk.window_focus)r	   Win32_GetForegroundWindowmplrcParamsWin32_SetForegroundWindow)
foreground r#   v/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/matplotlib/backends/_backend_tk.py!_restore_foreground_window_at_end*   s   
r%   	mpl_blit_c                 C   s6   t | \}}}}}t|j t||||| dS )z
    Thin wrapper to blit called via tkapp.call.

    *argsid* is a unique string identifier to fetch the correct arguments from
    the ``_blit_args`` dict, since arguments cannot be passed directly.
    N)
_blit_argspopr   blittk
interpaddrstr)argsid
photoimagedataptroffsetsbboxptr	comp_ruler#   r#   r$   _blit<   s   r3   c              
   C   s2  t |}|jdd \}}|||jjf}|durL| \\}}	\}
}tt|d}t	t
|
|}
tt|	d}	t	t
||}||
|	|f}t}nd|d|f}t}| ||||f}tt|}|t|< z
| jt| W dS  tjy } zdt|vr | jtt | jt| W Y d}~dS d}~w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.

    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_SETr,   idr'   r*   call_blit_tcl_nameTclErrorcreatecommandr3   )r.   aggimager0   bboxr9   heightwidthr/   x1y1x2y2r1   r2   argsr-   er#   r#   r$   r)   H   s2   
	r)   c                       s<   e Zd ZdZ fddZdd Zdd Z fdd	Z  ZS )
TimerTkz<Subclass of `backend_bases.TimerBase` using Tk timer events.c                    s"   d | _ t j|i | || _d S N)_timersuper__init__parent)selfrV   rO   kwargs	__class__r#   r$   rU   ~   s   
zTimerTk.__init__c                 C   s    |    | j| j| j| _d S rR   )_timer_stoprV   after	_interval	_on_timerrS   rW   r#   r#   r$   _timer_start   s   zTimerTk._timer_startc                 C   s"   | j d ur| j| j  d | _ d S rR   )rS   rV   after_cancelr_   r#   r#   r$   r[      s   

zTimerTk._timer_stopc                    s\   t     js) jr) jdkr j j j _d S  j fdd _d S d  _d S )Nr   c                      s    j  j jS rR   )rV   r\   r]   r^   r#   r_   r#   r$   <lambda>   s    z#TimerTk._on_timer.<locals>.<lambda>)rT   r^   _singlerS   r]   rV   r\   
after_idler_   rY   r_   r$   r^      s   




zTimerTk._on_timer)	__name__
__module____qualname____doc__rU   r`   r[   r^   __classcell__r#   r#   rY   r$   rQ   {   s    rQ   c                       s   e Zd ZdZejddddd3 fdd	Zd4d	d
Zdd Zdd Z	dd Z
dd Z fddZ fddZd5 fdd	Zdd Z fddZ fddZd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd6d-d.Zd/d0 Zd1d2 Z  ZS )7FigureCanvasTkr*   z3.4resize_callbackz.get_tk_widget().bind('<Configure>', ..., True)alternativeNc           	         s  t  | d  _d  _ jdd\}}tj|d||ddd _tj j||d _	 jj
|d |d  j	d | _ jd	 j tjd
krP jd j  jd j  jd j  jd j  jd j  jd j dD ]
} j| j qzdD ]
} j| j qdD ]
} j| j qdD ]
} j| j q j }|d jd  fdd}|d|d  j  d S )NTphysicalwhiter   )master
backgroundrJ   rI   borderwidthhighlightthicknessrq   rJ   rI   r4   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                    s   | j  ju r   d S d S rR   )widget	_tkcanvasclose_eventeventr_   r#   r$   filter_destroy   s   z/FigureCanvasTk.__init__.<locals>.filter_destroyz	<Destroy>)rT   rU   _idle_draw_id_event_loop_idget_width_heightr*   Canvasr}   
PhotoImage_tkphotocreate_image_resize_callback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)	rW   figurerq   rk   whnamerootr   rY   r_   r$   rU      sD   

zFigureCanvasTk.__init__c                 C   sL   t | jjddd d}| |r$| jdd\}}| jj||d d S d S )Nr*   scalinggUUUUUU?r4   Trn   rJ   rI   )roundr}   r*   rC   _set_device_pixel_ratior   	configure)rW   r   ratior   r   r#   r#   r$   r      s
   
z)FigureCanvasTk._update_device_pixel_ratioc                 C   s   |j |j}}| jd ur| | | jj}|| }|| }| jj||dd | j| j t	j
| jt|t|d| _| jjt|d t|d | jd |   d S )NF)forwardru   r4   rv   )rJ   rI   r   r   dpiset_size_inchesr}   deleter   r*   r   intr   resize_event)rW   r   rJ   rI   dpivalwinchhinchr#   r#   r$   r      s   

zFigureCanvasTk.resizec                    s(    j rd S  fdd} j| _ d S )Nc                     s   z
    W d  _d S d  _w rR   )drawr   rO   r_   r#   r$   	idle_draw   s   
z+FigureCanvasTk.draw_idle.<locals>.idle_draw)r   r}   rd   )rW   r   r#   r_   r$   	draw_idle   s   zFigureCanvasTk.draw_idlec                 C   s   | j S )z
        Return the Tk widget used to implement FigureCanvasTkAgg.

        Although the initial implementation uses a Tk canvas,  this routine
        is intended to hide that fact.
        )r}   r_   r#   r#   r$   get_tk_widget  s   zFigureCanvasTk.get_tk_widgetc                 C   s&   | j |j| jjj| j |j fS rR   )r}   canvasxxr   rH   rI   canvasyyrW   r   r#   r#   r$   _event_mpl_coords  s   z FigureCanvasTk._event_mpl_coordsc                    s   t  j| |d|i d S )NguiEvent)rT   r   r   r   rY   r#   r$   r     s
   
z"FigureCanvasTk.motion_notify_eventc                    s   t  j|| |d d S )N)r   xy)rT   r   r   r   rY   r#   r$   r     s   

z!FigureCanvasTk.enter_notify_eventFc                    sZ   | j   t|dd }tjdkrddd||}t jg | ||R ||d d S )Nnumdarwin   r4   r4   r   )dblclickr   )	r}   r   getattrr   r   getrT   r   r   )rW   r   r   r   rY   r#   r$   r     s   

z!FigureCanvasTk.button_press_eventc                 C   s   | j |dd d S )NT)r   )r   r   r#   r#   r$   r   %  s   z$FigureCanvasTk.button_dblclick_eventc                    sN   t |dd }tjdkrddd||}t jg | ||R d|i d S )Nr   r   r   r4   r   r   )r   r   r   r   rT   r   r   )rW   r   r   rY   r#   r$   r   (  s   

z#FigureCanvasTk.button_release_eventc                    sN   t |dd }|dkrdn|dkrdnd}t jg | ||R d|i d S )Nr      r      r   r   )r   rT   r   r   )rW   r   r   steprY   r#   r$   r   /  s   
zFigureCanvasTk.scroll_eventc                 C   sx   |j |j|j}|| jkr:| j|j|  }| jjj	| j
|j|   }|jd }tj| ||||d dS dS )zMouseWheel event processorg      ^@r   N)r|   winfo_containingx_rooty_rootr}   r   winfo_rootxr   rH   rI   r   winfo_rootydeltar   r   )rW   r   r   r   r   r   r#   r#   r$   r   5  s   

z#FigureCanvasTk.scroll_event_windowsc                 C   s   |j }t||j}tjdkrg d}ntjdkrg d}ng d}|d urE|D ]\}}}|jd|> @ rD||vrD|dkr>|sDd||}q(|S )	Nrx   )r4   ctrlcontrol)   altr   r   shiftr   r   )r   )r   r   r   r   )r   rT   rT   )r   )r   r   r   r   )   rT   rT   r   r   z{0}+{1})charr   _unikey_or_keysym_to_mplkeykeysymr   r   stateformat)rW   r   unikeykey	modifiersbitmaskprefixkey_namer#   r#   r$   _get_key@  s   




zFigureCanvasTk._get_keyc                 C      |  |}tj| ||d d S Nr   )r   r   key_press_eventrW   r   r   r#   r#   r$   r   g     
zFigureCanvasTk.key_pressc                 C   r   r   )r   r   key_release_eventr   r#   r#   r$   r   k  r   zFigureCanvasTk.key_releasec                 O   s   t | jg|R i |S rR   )rQ   r}   rW   rO   rX   r#   r#   r$   	new_timero  s   zFigureCanvasTk.new_timerc                 C   s   | j   d S rR   )r}   updater_   r#   r#   r$   flush_eventss  s   zFigureCanvasTk.flush_eventsr   c                 C   sN   |dkr t d| }|dkr| j|| j| _n| j| j| _| j  d S )Nr   i  )r   r}   r\   stop_event_loopr   rd   mainloop)rW   timeoutmillisecondsr#   r#   r$   start_event_loopw  s   zFigureCanvasTk.start_event_loopc                 C   s(   | j r| j| j  d | _ | j  d S rR   )r   r}   ra   quitr_   r#   r#   r$   r     s   zFigureCanvasTk.stop_event_loopc                 C   s0   z| j jt| d W d S  tjy   Y d S w )N)cursor)r}   r   cursordtkinterrE   rW   r   r#   r#   r$   
set_cursor  s
   zFigureCanvasTk.set_cursor)NNNrR   )F)r   )re   rf   rg   required_interactive_frameworkr   delete_parameterrU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ri   r#   r#   rY   r$   rj      s6    
0	'
rj   c                       sd   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Z  ZS )FigureManagerTkz
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : tk.Toolbar
        The tk.Toolbar
    window : tk.Window
        The tk.Window
    Fc                    s   || _ t || | j   |  | _| jjjt	j
t	jdd | jr2t| j | jr2t| j t| d}t	j|dd| d| _d| _t||j	 rZ| jd| j| _d	| _d S )
Nr   sidefillexpand   `   
window_dpi)rq   valuer    writeF)windowrT   rU   withdraw_get_toolbartoolbarcanvasr}   packr*   TOPBOTHtoolmanagerr   add_tools_to_manageradd_tools_to_containerr   wm_frameIntVar_window_dpi_window_dpi_cbnamer   enable_dpi_awarenessr+   	trace_add_update_window_dpi_shown)rW   r  r   r  window_framerY   r#   r$   rU     s&   


zFigureManagerTk.__init__c                 C   sH   t jd dkrt| j| j}|S t jd dkr t| j| j}|S d }|S )Nr  toolbar2r  )r   r    NavigationToolbar2Tkr  r  	ToolbarTkr  )rW   r  r#   r#   r$   r    s   zFigureManagerTk._get_toolbarc                 G   sH   | j  }| jdd|d  | jrt| jdr| j  | j  d S )Nr*   r   H   _rescale)	r  r   r  rC   r  hasattrr  r  r   )rW   rO   newdpir#   r#   r$   r    s
   

z"FigureManagerTk._update_window_dpic                 C   sP   d}||ks
||krt jdkrtd| d| d| d| jjj||d d S )Ni\ linuxz/You have requested to resize the Tk window to (z, z), one of which is bigger than z.  At larger sizes xorg will either exit with an error on newer versions (~1.20) or cause corruption on older version (~1.19).  We do not expect a window over a million pixel wide or tall to be intended behavior.r   )r   r   
ValueErrorr  r}   r   )rW   rJ   rI   max_sizer#   r#   r$   r     s   zFigureManagerTk.resizec                    s   t  D  js  fdd} jd|  j   jj  n j  t	j
d r< jjjdd  jjjdd d _W d    d S 1 sJw   Y  d S )	Nc                     s   t   d S rR   )r   destroyr   r_   r#   r$   r"       z%FigureManagerTk.show.<locals>.destroyWM_DELETE_WINDOWzfigure.raise_windowz-topmostr   r   T)r%   r  r  protocol	deiconifyr  r}   r   r   r   r    manager
attributes)rW   r"  r#   r_   r$   show  s   


"zFigureManagerTk.showc                    s    j jr j j j j  j jr j j j j  jr% jd j  fdd}t	 dkr= j
 j
jd| d S  j
  |  d S )Nr  c                      s.    j    jrt s j   d S d S d S rR   )r  r"  _owns_mainloopr   get_num_fig_managersr   r#   r_   r#   r$   delayed_destroy  s   
z0FigureManagerTk.destroy.<locals>.delayed_destroyr*   r   )r  r   r}   ra   r   r  r  trace_remover   "_get_running_interactive_frameworkr  rd   r\   r   )rW   rO   r,  r#   r_   r$   r"    s   

zFigureManagerTk.destroyc                 C   s
   | j  S rR   r  wm_titler_   r#   r#   r$   get_window_title     
z FigureManagerTk.get_window_titlec                 C      | j | d S rR   r/  )rW   titler#   r#   r$   set_window_title     z FigureManagerTk.set_window_titlec                 C   s$   t | jd}| jd|  d S )Nz-fullscreen)boolr  r(  )rW   is_fullscreenr#   r#   r$   full_screen_toggle	  s   z"FigureManagerTk.full_screen_toggle)re   rf   rg   rh   r*  rU   r  r  r   r)  r"  r1  r5  r9  ri   r#   r#   rY   r$   r     s    	r   c                       s   e Zd ZdZddddZdd Zdd	 Z fd
dZ fddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z  ZS )r  a  
    Attributes
    ----------
    canvas : `FigureCanvas`
        The figure canvas on which to operate.
    win : 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``.
    T)pack_toolbarc          
   	   C   s.  || _ tjj| |dt|jjjdd i | _| j	D ]5\}}}}|d u r(| 
  q| j|ttd| d|dv t| |d | j|< }|d urNt|| qtjj|dd	| _tj| | jd
d}	|	jtjd tj| d| _tj| | j| jd| _| jjtjd t| | |r| jtjtjd d S d S )Nr4   2   )rq   rs   rJ   rI   zimages/.png)zoompan)togglecommand
   )r   sizeu    
 )rq   fonttextr   rq   rq   rC  textvariabler   r   )r  r*   FramerU   r   r   rH   rJ   _buttons	toolitems_Spacer_Buttonr,   r   _get_data_pathr   ToolTipcreateToolTipr   rC  Font_label_fontLabelr	  RIGHT	StringVarmessage_message_labelr   BOTTOMX)
rW   r  r  r:  rD  tooltip_text
image_filecallbackbuttonlabelr#   r#   r$   rU     s>   


zNavigationToolbar2Tk.__init__c                 C   s   |   D ];}t|tjtjfrt|drt| | q	 qt|tjr1|j	ddd |j
dd qt|tjr8qtd|j q| jj	dd	 d
S )a  
        Scale all children of the toolbar to current DPI setting.

        Before this is called, the Tk scaling setting will have been updated to
        match the new DPI. Tk widgets do not update for changes to scaling, but
        all measurements made after the change will match the new scaling. Thus
        this function re-applies all the same sizes in points, which Tk will
        scale correctly to pixels.
        _image_file22p1p)rI   pady4p)padxzUnknown child class %srA  rB  N)winfo_children
isinstancer*   ButtonCheckbuttonr  r  _set_image_for_buttonrJ  r   pack_configurerT  _logwarningwinfo_classrS  rW   r|   r#   r#   r$   r  F  s   

zNavigationToolbar2Tk._rescalec                 C   sT   dt jfdt jffD ]\}}|| jv r'| j|kr | j|   q
| j|   q
d S )NZoomPan)r   ZOOMPANrK  modeselectdeselect)rW   rD  ru  r#   r#   r$   _update_buttons_checkeda  s   

z,NavigationToolbar2Tk._update_buttons_checkedc                       t  j|  |   d S rR   )rT   r>  rx  rW   rO   rY   r#   r$   r>  j     zNavigationToolbar2Tk.panc                    ry  rR   )rT   r=  rx  rz  rY   r#   r$   r=  n  r{  zNavigationToolbar2Tk.zoomc                 C   r3  rR   )rW  setrW   sr#   r#   r$   set_messager  r6  z NavigationToolbar2Tk.set_messagec                 C   s>   |    | jjjj}|| }|| }| jj||||| _d S rR   )remove_rubberbandr  r   rH   rI   r}   create_rectanglelastrect)rW   r   x0y0rK   rL   rI   r#   r#   r$   draw_rubberbandu  s
   z$NavigationToolbar2Tk.draw_rubberbandc                 C   s&   t | dr| jj| j | `d S d S Nr  )r  r  r}   r   r  r_   r#   r#   r$   r  |  s   
z&NavigationToolbar2Tk.remove_rubberbandc                 C   s   |j du rdS td|j }||jdd}|d}t|dkr)|	 r)|n|}t
j|||f| d}W d   n1 sCw   Y  |j|ddd ||_dS )	z
        Set the image for a button based on its pixel size.

        The pixel size is determined by the DPI scaling of the window.
        Nimagesr<  z
_large.png18p   rF  )rw   rI   rJ   )r`  r   rO  	with_namer   replacewinfo_pixelsr   openexistsr   r   r   r   _ntimage)rW   r^  path_regular
path_largerB  imrw   r#   r#   r$   rk    s   


z*NavigationToolbar2Tk._set_image_for_buttonc                 C   sx   |st j| ||d}nt j| d}t j| ||d|d}||_||_|d ur,t| | n|j| j	d |j
t jd |S )N)rq   rD  r@  rF  F)rq   rD  r@  indicatoronvariable)rC  rE  )r*   ri  r  rj  varr`  r  rk  r   rS  r	  LEFT)rW   rD  r\  r?  r@  br  r#   r#   r$   rN    s   zNavigationToolbar2Tk._Buttonc                 C   s(   t j| dt jdd}|jt jdd |S )Nr  DarkGray)rq   rI   reliefbg3p)r   re  )r*   rJ  RIDGEr	  r  r}  r#   r#   r$   rM    s   zNavigationToolbar2Tk._Spacerc              
   G   s   | j   }| j  }||}||fgt|  }dd |D }d}tj	t
jd }| j  }	tjj| j  jd||||	d}
|
dv rId S |dkrXtjt|
t
jd< z
| j j|
 W d S  ty~ } ztjdt| W Y d }~d S d }~ww )	Nc                 S   s   g | ]
\}}|d | fqS )z*.%sr#   ).0extr   r#   r#   r$   
<listcomp>  s    z4NavigationToolbar2Tk.save_figure.<locals>.<listcomp>r  zsavefig.directoryzSave the figure)rq   r4  	filetypesdefaultextension
initialdirinitialfile)r  r#   zError saving file)r  get_supported_filetypescopyget_default_filetyper(   sorteditemsospath
expanduserr   r    get_default_filenamer   
filedialogasksaveasfilenamer   rq   dirnamer,   r   savefig	Exception
messagebox	showerror)rW   rO   r  default_filetypedefault_filetype_namesorted_filetypestk_filetypesr  r  r  fnamerP   r#   r#   r$   save_figure  s:   




	 z NavigationToolbar2Tk.save_figurec                 C   sr   t jt jd}| jjdk}| jjt| jjd k }d| jv r'|| | jd d< d| jv r7|| | jd d< d S d S )N)TFr   r   Backr   Forward)r*   NORMALDISABLED
_nav_stack_poslen	_elementsrK  )rW   	state_mapcan_backcan_forwardr#   r#   r$   set_history_buttons  s   

z(NavigationToolbar2Tk.set_history_buttons)re   rf   rg   rh   rU   r  rx  r>  r=  r  r  r  rk  rN  rM  r  r  ri   r#   r#   rY   r$   r    s    *	(r  c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )rP  zi
    Tooltip recipe from
    http://www.voidspace.org.uk/python/weblog/arch_d7_2006_07_01.shtml#e387
    c                    s>   t |  fdd}fdd}| d| | d| d S )Nc                    s      d S rR   )showtipr   rD  toolTipr#   r$   enter  r#  z$ToolTip.createToolTip.<locals>.enterc                    s       d S rR   )hidetipr   )r  r#   r$   leave  s   z$ToolTip.createToolTip.<locals>.leavery   rz   )rP  r   )r|   rD  r  r  r#   r  r$   rQ    s
   zToolTip.createToolTipc                 C   s"   || _ d | _d | _d | _| _d S )Nr   )r|   	tipwindowrB   r   r   rp  r#   r#   r$   rU     s   zToolTip.__init__c                 C   s   || _ | js	| j sdS | jd\}}}}|| j  | j  }|| j  }t| j | _}|	d |
d||f  z|jdd|jdd W n
 tjyV   Y nw tj|| j tjtjdd	}|jdd
 dS )zDisplay text in tooltip window.Ninsertr   z+%d+%dz!::tk::unsupported::MacWindowStylestylehelpnoActivates)rD  justifyr  rs   )ipadx)rD  r  r|   rH   r   winfo_widthr   r*   Toplevelwm_overrideredirectwm_geometryrC   _wrE   rT  r  SOLIDr	  )rW   rD  r   r   _twr_  r#   r#   r$   r    s*   
zToolTip.showtipc                 C   s    | j }d | _ |r|  d S d S rR   )r  r"  )rW   r  r#   r#   r$   r    s
   zToolTip.hidetipN)	re   rf   rg   rh   staticmethodrQ  rU   r  r  r#   r#   r#   r$   rP    s    
	rP  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandTkc                 C   sB   |    | jjjjj}|| }|| }| jjj||||| _d S rR   )r  r   r  rH   rI   r}   r  r  )rW   r  r  rK   rL   rI   r#   r#   r$   r    s   

zRubberbandTk.draw_rubberbandc                 C   s(   t | dr| jjj| j | `d S d S r  )r  r   r  r}   r   r  r_   r#   r#   r$   r  #  s   
zRubberbandTk.remove_rubberbandN)re   rf   rg   r  r  r#   r#   r#   r$   r    s    r  z3.5ToolSetCursorrl   c                   @      e Zd Zdd ZdS )SetCursorTkc                 C   s   t |  | d S rR   )r  r   "_make_classic_style_pseudo_toolbarr   r#   r#   r$   r   +  s   zSetCursorTk.set_cursorN)re   rf   rg   r   r#   r#   r#   r$   r  )  s    r  c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )r  c                 C   s   t | | | jjjjj\}}d|| }}tjj| |t	|t	|dd t
jjdd| _tj| d| _tj| | j| jd| _| jjtjd i | _| jtjtjd	 i | _d S )
Nr;  r4   )rq   rJ   rI   rs   rA  rf  rF  rG  rE  rI  )r   rU   r  r  r   rH   	intervalxr*   rJ  r   r   rC  rR  rS  rV  _messagerT  rX  r	  rU  
_toolitemsr
  rZ  _groups)rW   r  r  xminxmaxrI   rJ   r#   r#   r$   rU   1  s    


zToolbarTk.__init__c                 C   
   t | S rR   )r  r  r_   r#   r#   r$   r  A  r2  zToolbarTk._rescalec              	      s    |}| }|t|ks|dk rd }	n|| }	t| || fdd}
|
j|	d |d ur8t|
| j	 g  j  
|
 d S )Nr   c                      s
     S rR   )_button_clickr#   r   rW   r#   r$   rb   M  s   
 z(ToolbarTk.add_toolitem.<locals>.<lambda>)before)_get_groupframepack_slavesr  r  rN  rl  rP  rQ  r  
setdefaultappend)rW   r   grouppositionr\  descriptionr?  framebuttonsr  r^  r#   r  r$   add_toolitemD  s   
zToolbarTk.add_toolitemc                 C   sT   || j vr%| j r|   tj| dd}|jtjtjd | j|_|| j |< | j | S )Nr   )rq   rs   rI  )r  _add_separatorr*   rJ  r	  r  YrS  )rW   r  r  r#   r#   r$   r  T  s   


zToolbarTk._get_groupframec                 C   r  rR   )r  rM  r_   r#   r#   r$   r  ^  r2  zToolbarTk._add_separatorc                 C   s   |  | d S rR   )trigger_tool)rW   r   r#   r#   r$   r  a  r#  zToolbarTk._button_clickc                 C   s8   || j vrd S | j | D ]}|r|  q|  qd S rR   )r  rv  rw  )rW   r   toggledtoolitemr#   r#   r$   toggle_toolitemd  s   


zToolbarTk.toggle_toolitemc                 C   s$   | j | D ]}|  q| j |= d S rR   )r  pack_forget)rW   r   r  r#   r#   r$   remove_toolitemm  s   
zToolbarTk.remove_toolitemc                 C   r3  rR   )r  r|  r}  r#   r#   r$   r  r  r6  zToolbarTk.set_messageN)re   rf   rg   rU   r  r  r  r  r  r  r  r  r#   r#   r#   r$   r  0  s    
	r  c                   @   r  )SaveFigureTkc                 G   s   t |   d S rR   )r  r  r  rz  r#   r#   r$   triggerw  s   zSaveFigureTk.triggerNre   rf   rg   r  r#   r#   r#   r$   r  v      r  c                       s4   e Zd Z fddZdd Zdd Zdd Z  ZS )	ConfigureSubplotsTkc                    s   t  j|i | d | _d S rR   )rT   rU   r  r   rY   r#   r$   rU   }  s   
zConfigureSubplotsTk.__init__c                 G   s   |    | j  d S rR   )init_windowr  liftrz  r#   r#   r$   r    s   zConfigureSubplotsTk.triggerc                 C   s~   | j rd S tdd}t | _ t| j|| j d}|jdd t| j| |	  |
 jtjtjdd | j d| j d S )	N)r   r   )figsizerF  g?)topr   r   r$  )r  r   r*   Tktyper  subplots_adjustr   r   r   r   r	  r
  r  r%  r"  )rW   toolfigr  r#   r#   r$   r    s   

zConfigureSubplotsTk.init_windowc                 O   s"   | j d ur| j   d | _ d S d S rR   )r  r"  r   r#   r#   r$   r"    s   


zConfigureSubplotsTk.destroy)re   rf   rg   rU   r  r  r"  ri   r#   r#   rY   r$   r  |  s
    r  c                   @   r  )HelpTkc                    s*   t | jjj|  dg  fdd _d S )NOKc                    s    j j S rR   )r  rq   r  )r   dialogr#   r$   rb     s    z HelpTk.trigger.<locals>.<lambda>)r   r   r  r}   _get_help_textdonerz  r#   r  r$   r    s   zHelpTk.triggerNr  r#   r#   r#   r$   r
    r   r
  c                   @   s(   e Zd ZeZedd Zedd ZdS )
_BackendTkc           	      C   s   t  k t du rt  t  tjdd}|  t	t
d}tj||d}z|d| W n tyJ } ztd| W Y d}~nd}~ww | j||d}| |||}t re|  |  |W  d   S 1 sqw   Y  dS )	zL
        Create a new figure manager instance for the given figure.
        N
matplotlib)	classNamezimages/matplotlib_128.ppm)filerq   Fz"Could not load matplotlib icon: %srF  )r%   r   r.  _setup_new_guiappr	    Win32_SetProcessDpiAwareness_maxr*   r  r  r,   rO  r   	iconphotor  rm  infoFigureCanvasFigureManagerr   is_interactiver)  r   )	clsr   r   r  
icon_fnameicon_imgexcr  r'  r#   r#   r$   new_figure_manager_given_figure  s.   $z*_BackendTk.new_figure_manager_given_figurec                  C   sP   t  } | r&| d }t|}|jrd S d|_z|j  W d|_d S d|_w d S )Nr   TF)r   get_all_fig_managersr  r*  r  r   )managersfirst_managermanager_classr#   r#   r$   r     s   z_BackendTk.mainloopN)	re   rf   rg   r   r  classmethodr  r  r   r#   r#   r#   r$   r    s    
r  rR   )\uuid
contextlibr   loggingr<   os.pathr  r   r   r*   tkinter.filedialogtkinter.fonttkinter.messageboxtkinter.simpledialogr   numpyr5   PILr   r   r  r   r   r   r   r	   matplotlib.backend_basesr
   r   r   r   r   r   r   r   matplotlib._pylab_helpersr   matplotlib.figurer   matplotlib.widgetsr   r  r   	getLoggerre   rm  	TkVersionbackend_versionMOVEHANDPOINTERSELECT_REGIONWAITRESIZE_HORIZONTALRESIZE_VERTICALr   r%   r'   uuid4hexrD   r@   rA   r3   r)   rQ   rj   r   rJ  r  rP  RubberbandBaser  
deprecatedSetCursorBaser  r  SaveFigureBaser  ConfigureSubplotsBaser  ToolHelpBaser
  ToolSaveFigureToolConfigureSubplotsToolRubberbandToolHelpToolCopyToClipboardBaseToolCopyToClipboardToolbarexportr  r#   r#   r#   r$   <module>   sx    (

	
3& q} [2F