o
    i                     @   sx  d 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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mZmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&Z&e'e(Z)dZ*e+d	d
d Z,G dd deZ-ej.dddddddG dd deZ/G dd deZ0G dd dee&j1Z2G dd de2Z3G dd de&j4Z5G dd  d eZ6d!d" Z7d#d$ Z8G d%d& d&ee&j9Z:G d'd( d(ee&j9Z;e<e2G d)d* d*ej=Z>e<e2G d+d, d,ej?Z@e<e2G d-d. d.ejAZBG d/d0 d0e&jCZDe<e2G d1d2 d2ejEZFe<e2G d3d4 d4ejGZHe:e6_Ie;e6_JejKG d5d6 d6eZLdS )7z
A wxPython backend for matplotlib.

Originally contributed by Jeremy O'Donoghue (jeremy@o-donoghue.com) and John
Hunter (jdhunter@ace.bsd.uchicago.edu).

Copyright (C) Jeremy O'Donoghue & John Hunter, 2003-4.
    N)_BackendFigureCanvasBaseFigureManagerBaseGraphicsContextBaseMouseButtonNavigationToolbar2RendererBase	TimerBaseToolContainerBasecursors
CloseEventKeyEventLocationEvent
MouseEventResizeEvent)_apicbookbackend_tools)Gcf)Path)Affine2DK      c                  C   s    t d} | d t  | S )NFT)wxAppZSetExitOnFrameDeleter   Z_setup_new_guiapp)wxapp r   m/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/matplotlib/backends/backend_wx.py_create_wxapp+   s   

r   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
TimerWxz/Subclass of `.TimerBase` using wx.Timer events.c                    s*   t  | _| j| j_t j|i | d S N)r   Timer_timerZ	_on_timerZNotifysuper__init__selfargskwargs	__class__r   r   r$   6   s   

zTimerWx.__init__c                 C   s   | j | j| j d S r    )r"   StartZ	_intervalZ_singler&   r   r   r   _timer_start;   s   zTimerWx._timer_startc                 C   s   | j   d S r    )r"   Stopr,   r   r   r   _timer_stop>      zTimerWx._timer_stopc                 C   s   | j  r|   d S d S r    )r"   	IsRunningr-   r,   r   r   r   _timer_set_intervalA   s   
zTimerWx._timer_set_interval)	__name__
__module____qualname____doc__r$   r-   r/   r2   __classcell__r   r   r)   r   r   3   s    r   z2.0r   backendz
the futureZwxaggz7See the Matplotlib usage FAQ for more info on backends.)nameobj_typeZremovalalternativeZaddendumc                       sJ  e Zd ZdZi dejdejdejdejdejdejdejd	ejd
ejdejdejdejdejdejdejdejdejdejiZej	ej
ejdZejejejejejejejdZ fddZdd Zdd Zdd Zdd Zed d! Zd0d#d$Zd%d& Zd1d(d)Zd*d+ Zd,d- Zd.d/ Z  Z S )2
RendererWxz
    The renderer handles all the drawing primitives using a graphics
    context instance that controls the colors/styles. It acts as the
    'renderer' instance used by many classes in the hierarchy.
    d      ,  i  i  iX  i  i   i  Z
ultralightZlightnormalZmediumZsemiboldboldZheavyZ	ultraboldblack)italicr@   Zoblique)ZSansZRomanZScriptZ
DecorativeZModernZCourierZcourierc                    sJ   t    tdt|  | | _| | _|| _	i | _
|| _d| _dS )z)Initialise a wxWindows renderer instance.%s - __init__()N)r#   r$   _logdebugtypeZGetWidthwidthZ	GetHeightheightbitmapfontddpigc)r&   rJ   rL   r)   r   r   r$   ~   s   



zRendererWx.__init__c                 C   s   dS )NTr   r,   r   r   r   flipy   s   zRendererWx.flipyc                 C   sd   |rt |}| jd u r|  }n| j}|j}| ||}||tj |	|\}}}	}
|||	fS r    )
r   
strip_mathrM   new_gcgfx_ctxget_wx_fontSetFontr   BLACKZGetFullTextExtent)r&   spropismathrM   rQ   fontwhZdescentleadingr   r   r   get_text_width_height_descent   s   



z(RendererWx.get_text_width_height_descentc                 C   s   | j | jfS r    )rH   rI   r,   r   r   r   get_canvas_width_height      z"RendererWx.get_canvas_width_heightc                 C   sv   |  }|d ur|j}|j}|j|kr9||_|d u r |  d S ||d | j|d  |d  |d |d  d S d S )Nr   r         )get_clip_rectangleboundsrQ   _lastcliprectZ	ResetClipZCliprI   )r&   rM   Z
new_boundsrQ   r   r   r   handle_clip_rectangle   s   

z RendererWx.handle_clip_rectanglec                 C   s   |   }||D ]9\}}|tjkr|j|  q	|tjkr#|j|  q	|tjkr.|j|  q	|tj	kr9|j
|  q	|tjkrB|  q	|S r    )Z
CreatePathiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)rQ   path	transformwxpathpointscoder   r   r   convert_path   s   




zRendererWx.convert_pathNc                 C   s   |   | | |j}|t ddd| j }| |||}|d ur6|t	
|| || n|| |  d S )Ng      ?g              )selectrd   rQ   r   scale	translaterI   rk   ZSetBrushr   ZBrushget_wxcolourZDrawPathZ
StrokePathunselect)r&   rM   rf   rg   ZrgbFacerQ   rh   r   r   r   	draw_path   s   

zRendererWx.draw_pathc                 C   s   |  }|d ur|j\}}}}	n
d}d}| j}| j}	|jd d \}
}tj||
| }|	  |j
|t|t| j| t|t|	  |  d S )Nr   r`   )ra   rb   rH   rI   shaper   BitmapFromBufferRGBAtobytesrm   rQ   
DrawBitmapintrq   )r&   rM   xyZimbboxlbrY   rZ   rowscolsrJ   r   r   r   
draw_image   s   zRendererWx.draw_imageFc	                 C   s   |rt |}tdt|  |  | | |j}	| ||}
|	|
 }|	|
| | |||\}}}t|}t|| }|dkrN|	||| nt|}|t| }|t| }|	||| || | |  d S )Nz%s - draw_text()rl   )r   rO   rE   rF   rG   rm   rd   rQ   rR   rp   get_rgbrS   r\   rx   ZDrawTextmathradianssincosZDrawRotatedTextrq   )r&   rM   ry   rz   rU   rV   ZanglerW   ZmtextrQ   rX   colorrY   rZ   dZradsZxoZyor   r   r   	draw_text   s&   


zRendererWx.draw_textc                 C   s8   t dt|  t| j| | _| j  | j  | jS )Nz%s - new_gc())rE   rF   rG   GraphicsContextWxrJ   rM   rm   rq   r,   r   r   r   rP      s
   

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur|S | | }tj	t
|| j| tj| j|  | j|  d | j|< }|S )z7Return a wx font.  Cache font instances for efficiency.z%s - get_wx_font()N)Z	pointSizefamilystyleweight)rE   rF   rG   hashrK   getpoints_to_pixelsZget_size_in_pointsr   ZFontround	fontnamesget_nameZROMAN
fontangles	get_stylefontweightsZ
get_weight)r&   rU   rV   keyrX   sizer   r   r   rR     s   zRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)PIXELS_PER_INCHrL   )r&   ri   r   r   r   r     s   zRendererWx.points_to_pixelsr    )FN)!r3   r4   r5   r6   r   ZFONTWEIGHT_LIGHTZFONTWEIGHT_NORMALZFONTWEIGHT_BOLDr   ZFONTSTYLE_ITALICZFONTSTYLE_NORMALZFONTSTYLE_SLANTr   ZFONTFAMILY_SWISSZFONTFAMILY_ROMANZFONTFAMILY_SCRIPTZFONTFAMILY_DECORATIVEZFONTFAMILY_MODERNr   r$   rN   r\   r]   rd   staticmethodrk   rr   r   r   rP   rR   r   r7   r   r   r)   r   r<   F   s    	





r<   c                       s   e Zd ZdZejejejdZej	ej
ejdZe Z fddZdd Zdd	 Zd fdd	Z fddZ fddZ fddZdd Z  ZS )r   a<  
    The graphics context provides the color, line styles, etc.

    This class stores a reference to a wxMemoryDC, and a
    wxGraphicsContext that draws to it.  Creating a wxGraphicsContext
    seems to be fairly heavy, so these objects are cached based on the
    bitmap object that is passed in.

    The base GraphicsContext stores colors as an RGB tuple on the unit
    interval, e.g., (0.5, 0.0, 1.0).  wxPython uses an int interval, but
    since wxPython colour management is rather simple, I have not chosen
    to implement a separate colour manager class.
    )ZbuttZ
projectingr   )ZbevelZmiterr   c                    s   t    tdt| | | j|d\}}|d u r0t|}tj	
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNrT   r   )r#   r$   rE   rF   rG   _cacher   r   ZMemoryDCZGraphicsContextZCreaterc   rJ   dcrQ   PenZSOLID_penSetPenrenderer)r&   rJ   r   r   rQ   r)   r   r   r$   1  s   


zGraphicsContextWx.__init__c                 C   s&   t jdkr| j| j d| _dS dS )z2Select the current bitmap into this wxDC instance.win32TN)sysplatformr   SelectObjectrJ   
IsSelectedr,   r   r   r   rm   D     

zGraphicsContextWx.selectc                 C   s&   t jdkr| jtj d| _dS dS )z-Select a Null bitmap into this wxDC instance.r   FN)r   r   r   r   r   
NullBitmapr   r,   r   r   r   rq   J  r   zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())rE   rF   rG   rm   r#   set_foregroundr   Z	SetColourrp   r   rQ   r   rq   )r&   fgZisRGBAr)   r   r   r   P  s   z GraphicsContextWx.set_foregroundc                    s   t |}tdt|  |   d|  k rdk rn nd}t | t| j	| j
}|dkr3d}| j| | j| j |   d S )Nz%s - set_linewidth()r   r   )floatrE   rF   rG   rm   r#   set_linewidthrx   r   r   Z
_linewidthr   ZSetWidthrQ   r   rq   )r&   rY   Zlwr)   r   r   r   _  s   zGraphicsContextWx.set_linewidthc                    R   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())rE   rF   rG   rm   r#   set_capstyler   ZSetCapr   _capdZ	_capstylerQ   r   rq   )r&   csr)   r   r   r   n     zGraphicsContextWx.set_capstylec                    r   )Nz%s - set_joinstyle())rE   rF   rG   rm   r#   set_joinstyler   ZSetJoinr   _joindZ
_joinstylerQ   r   rq   )r&   jsr)   r   r   r   w  r   zGraphicsContextWx.set_joinstylec                 C   s$   t dt|  tjdd |D  S )z'Convert an RGB(A) color to a wx.Colour.z%s - get_wx_color()c                 S   s   g | ]}t d | qS )   )rx   ).0ry   r   r   r   
<listcomp>  s    z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)rE   rF   rG   r   ZColour)r&   r   r   r   r   rp     s   zGraphicsContextWx.get_wxcolourr    )r3   r4   r5   r6   r   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr   weakrefWeakKeyDictionaryr   r$   rm   rq   r   r   r   r   rp   r7   r   r   r)   r   r     s&    		r   c                   @   s  e Zd ZdZdZeZedd Z	i e
jde
jde
jde
jde
jd	e
jd
e
jde
jde
jde
jde
jde
jde
jde
jde
jde
jde
jdi e
jde
jde
jde
jde
j de
j!de
j"de
j#de
j$de
j%de
j&d e
j'd!e
j(d"e
j)d#e
j*d$e
j+d%e
j,d&i e
j-d'e
j.d(e
j/d)e
j0d*e
j1d+e
j2d,e
j3d-e
j4d.e
j5d/e
j6d0e
j7d1e
j8d2e
j9de
j:d
e
j;de
j<de
j=d	e
j>d"e
j?d#e
j@d e
jAd!e
jBde
jCdiZDdld4d5ZEdld6d7ZFd8d9 ZGd:d; ZHdmd=d>ZIdld?d@ZJdAdB ZKdldCdDZLi eMjNdEdFdFdGdHdIdIdJdKZNdLdM ZOdNdO ZPeQdld3dPdQdRZRdSdT ZSdldUdVZTdWdX ZUdYdZ ZVd[d\ ZWdnd^d_ZXd`da ZYdbdc ZZddde Z[dfdg Z\dhdi Z]djdk Z^d3S )o_FigureCanvasWxBaseaa  
    The FigureCanvas contains the figure and does event handling.

    In the wxPython backend, it is derived from wxPanel, and (usually) lives
    inside a frame instantiated by a FigureManagerWx. The parent window
    probably implements a wx.Sizer to control the displayed control size - but
    we give a hint as to our preferred minimum size.
    r   c                 C   s   t S r    )FigureManagerWx)clsr   r   r   <lambda>  s    z_FigureCanvasWxBase.<lambda>controlshiftaltZ	caps_lockleftuprightZdownescapef1f2Zf3Zf4Zf5Zf6Zf7Zf8Zf9Zf10Zf11Zf12Zscroll_lockbreakZ	backspaceZenterinsertdeletehomeendZpageupZpagedown0123456789+-*/decNc                 C   s<  t | | ttj| jjj\}}tj	j| ||t
||d t||| _tdt| || d| _d| _tddtj| _tddtj| _| tj| j | tj| j | tj| j | tj| j | tj | j! | tj"| j! | tj#| j! | tj$| j! | tj%| j! | tj&| j! | tj'| j! | tj(| j! | tj)| j! | tj*| j! | tj+| j! | tj,| j! | tj-| j! | tj.| j! | tj/| j! | tj0| j1 | tj2| j3 | tj4| j5 | tj6| j7 | tj8| j9 | tj:| j9 | ;tj< | =tj> dS )z
        Initialize a FigureWx instance.

        - Initialize the FigureCanvasBase and wxPanel parents.
        - Set event handlers for resize, paint, and keyboard and mouse
          interaction.
        r   z"%s - __init__() - bitmap w:%d h:%dFNrT   r   WHITE)?r   r$   mapr   ceilfigurer{   r   r   PanelSizert   rJ   rE   rF   rG   _isDrawn_rubberband_rectr   ZPENSTYLE_SHORT_DASH_rubberband_pen_blackZPENSTYLE_SOLID_rubberband_pen_whiteBindZEVT_SIZE_on_sizeZ	EVT_PAINT	_on_paintZEVT_CHAR_HOOK_on_key_downZ
EVT_KEY_UP
_on_key_upEVT_LEFT_DOWN_on_mouse_buttonZEVT_LEFT_DCLICKZEVT_LEFT_UPZEVT_MIDDLE_DOWNZEVT_MIDDLE_DCLICKZEVT_MIDDLE_UPZEVT_RIGHT_DOWNZEVT_RIGHT_DCLICKZEVT_RIGHT_UPZEVT_MOUSE_AUX1_DOWNZEVT_MOUSE_AUX1_UPZEVT_MOUSE_AUX2_DOWNZEVT_MOUSE_AUX2_UPZEVT_MOUSE_AUX1_DCLICKZEVT_MOUSE_AUX2_DCLICKZEVT_MOUSEWHEEL_on_mouse_wheelZ
EVT_MOTION
_on_motionZEVT_ENTER_WINDOW	_on_enterZEVT_LEAVE_WINDOW	_on_leaveZEVT_MOUSE_CAPTURE_CHANGED_on_capture_lostZEVT_MOUSE_CAPTURE_LOSTZSetBackgroundStyleZBG_STYLE_PAINTZSetBackgroundColourr   )r&   parentidr   rY   rZ   r   r   r   r$     sH   	z_FigureCanvasWxBase.__init__c                 C   sX   t  }|| j t j s(t j }|r*t j| t j  t j	  dS dS dS )z*Copy bitmap of canvas to system clipboard.N)
r   BitmapDataObjectZ	SetBitmaprJ   TheClipboardZIsOpenedOpenSetDataZFlushClose)r&   eventZbmp_objZopen_successr   r   r   Copy_to_Clipboard  s   


z%_FigureCanvasWxBase.Copy_to_Clipboardc                 C   s&   t dt|  d| _| jdd d S )Nz%s - draw_idle()FZeraseBackground)rE   rF   rG   r   Refreshr,   r   r   r   	draw_idle  s   z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r    )r   Yieldr,   r   r   r   flush_events  r^   z _FigureCanvasWxBase.flush_eventsr   c                 C   sx   t | dr	tdtj| tjd}|dkr,|jt|d dd | jtj| j	|
 d t | _| j  |  d S )N_event_loopzEvent loop already runningr   r   i  T)ZoneShot)hasattrRuntimeErrorr   r!   ZID_ANYr+   rx   r   Z	EVT_TIMERstop_event_loopZGetIdZGUIEventLoopr   ZRunr.   )r&   timeouttimerr   r   r   start_event_loop  s   


z$_FigureCanvasWxBase.start_event_loopc                 C   s*   t | dr| j r| j  | `d S d S )Nr   )r   r   r1   ZExitr&   r   r   r   r   r  )  s
   


z#_FigureCanvasWxBase.stop_event_loopc                 C   s   |   }|  }t| }g }g }d}t|D ],\}\}}	ddd |	D }
||	d  | d|
 d|
 }||	v r?|}|| qd|}|||fS )z3Return the wildcard string for the filesave dialog.r   ;c                 S   s   g | ]}d | qS )z*.%sr   )r   extr   r   r   r   9  s    z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z (z)||)Zget_default_filetypeZget_supported_filetypes_groupedsorteditems	enumeratejoinappend)r&   Zdefault_filetype	filetypesZsorted_filetypes	wildcards
extensionsfilter_indexir9   extsZext_listZwildcardr   r   r   _get_imagesave_wildcards0  s   

z,_FigureCanvasWxBase._get_imagesave_wildcardsc                 C   s   t dt|  | r|  sdS |st| }tjdkr,t| jj	
 tr,| j  n| j}||dd | jdurktt| j\}}}}||||f||||f||||f||||fg}||| j ||| j dS dS )zu
        Update the displayed image on the GUI canvas, using the supplied
        wx.PaintDC device context.
        z%s - gui_repaint()N	__WXMSW__r   )rE   rF   rG   ZIsShownOnScreenr   ZClientDCPlatform
isinstancer   canvasZget_rendererr<   rJ   ConvertToImageZConvertToBitmaprw   r   r   r   ZDrawLineListr   r   )r&   drawDCbmpx0y0x1y1rectr   r   r   gui_repaintB  s(   


z_FigureCanvasWxBase.gui_repaintzWindows bitmapZJPEGZPCXzPortable Network GraphicszTagged Image Format FilezX pixmap)r  ZjpegZjpgZpcxZpngZtifZtiffZxpmc                 C   sF   t dt|  t| }| js| j|d n| j|d |  dS )z$Called when wxPaintEvt is generated.z%s - _on_paint()r  N)	rE   rF   rG   r   ZPaintDCr   drawr"  Destroy)r&   r   r  r   r   r   r   i  s   
z_FigureCanvasWxBase._on_paintc                 C   s  t dt|  |   }|r|| }|r'|r'|js'|jtj	@ s'| 
 }n|  }|| 
  t| ddrB|| j| jfkrBdS |\| _| _d| _| jdksU| jdkrWdS t| j| j| _| jj}| j| }| j| }| jj||dd | jdd td|   |   dS )	z
        Called when wxEventSize is generated.

        In this application we attempt to resize to fit the window, so it
        is better to take the performance hit and redraw the whole window.
        z%s - _on_size()_widthNFr   )forwardr   Zresize_event)rE   rF   rG   	GetParentZGetSizerZGetItemZ
ProportionFlagr   ZEXPANDZ
GetMinSizeZGetClientSizeZIncTogetattrr&  _heightr   rt   rJ   r   rL   Zset_size_inchesr   r   _processr   )r&   r   szsir   ZdpivalZwinchZhinchr   r   r   r   s  s.   



z_FigureCanvasWxBase._on_sizeexcludec                   sZ   dt jt jfdt jt jfdt jt jfg}| d ur&|   fdd|D S dd |D S )NZctrlr   r   c                    s&   g | ]\}}}|@ r |kr|qS r   r   r   r9   modr   r0  	modifiersr   r   r     s    z6_FigureCanvasWxBase._mpl_modifiers.<locals>.<listcomp>c                 S   s    g | ]\}}}t |r|qS r   )r   ZGetKeyStater1  r   r   r   r     s    
)r   ZMOD_CONTROLWXK_CONTROLZMOD_ALTWXK_ALTZ	MOD_SHIFT	WXK_SHIFTZGetModifiers)r   r0  Z	mod_tabler   r3  r   _mpl_modifiers  s   z"_FigureCanvasWxBase._mpl_modifiersc                 C   s|   |j }|| jv r| j| }n|dk rt|}| s| }nd S | j||d}d|v r5| r5|d dg ||S )N   r/  r   r   )	ZKeyCodekeyvaldchrZ	ShiftDownlowerr8  isupperremover  )r&   r   keyvalr   modsr   r   r   _get_key  s   

z_FigureCanvasWxBase._get_keyc                 C   sF   |du rt  }| |j|j\}}n|j|j}}|| jjj| fS )zv
        Convert a wx position, defaulting to the current cursor position, to
        Matplotlib coordinates.
        N)r   ZGetMouseStateZScreenToClientXYr   r{   rI   )r&   posry   rz   r   r   r   _mpl_coords  s
   z_FigureCanvasWxBase._mpl_coordsc                 C   <   t d| | |g|  R d|i  | r|  dS dS )zCapture key press.Zkey_press_eventguiEventNr   rA  rE  r,  Skipr  r   r   r   r        z _FigureCanvasWxBase._on_key_downc                 C   rF  )zRelease key.Zkey_release_eventrG  NrH  r  r   r   r   r     rJ  z_FigureCanvasWxBase._on_key_upc                 C   sb   t tjtjt jtjt jtjt j	tj
t jtjt jtjt jtjt ji|d}| | |   d S )N)cursor)r   ZCursorr   Zcheck_getitemr   ZMOVEZCURSOR_HANDZHANDZPOINTERZCURSOR_ARROWZSELECT_REGIONZCURSOR_CROSSZWAITZCURSOR_WAITZRESIZE_HORIZONTALZCURSOR_SIZEWEZRESIZE_VERTICALZCURSOR_SIZENSZ	SetCursorr   )r&   rK  r   r   r   
set_cursor  s   
	z_FigureCanvasWxBase.set_cursorTc                 C   s$   |   r|   |r|   dS dS )zControl wx mouse capture.N)Z
HasCaptureZReleaseMouseZCaptureMouse)r&   capturer   r   r   _set_capture  s
   z _FigureCanvasWxBase._set_capturec                 C   s   |  d dS )zCapture changed or lostFN)rN  r  r   r   r   r     s   z$_FigureCanvasWxBase._on_capture_lostc              
   C   s   |   | | p|  | |\}}tjtjtj	tj
tjtjtjtjtjtji}| }|||}| |}| rNtd| |||||d  dS | rbtd| |||d||d  dS | rutd| |||||d  dS dS )Start measuring on an axis.Zbutton_press_eventr4  rG  T)Zdblclickr4  rG  Zbutton_release_eventN)rI  rN  Z
ButtonDownZButtonDClickrE  r   ZMOUSE_BTN_LEFTr   LEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTRIGHTZMOUSE_BTN_AUX1ZBACKZMOUSE_BTN_AUX2ZFORWARDZ	GetButtonr   r8  r   r,  ZButtonUp)r&   r   ry   rz   Z
button_mapZbuttonr4  r   r   r   r     s:   



z$_FigureCanvasWxBase._on_mouse_buttonc              	   C   s~   |  |\}}|j|j |j }|  tjdkr-t| ds"d| _n| jr*d| _dS d| _t	d| |||| 
||d  dS )z3Translate mouse wheel events into matplotlib eventsZ	__WXMAC___skipwheeleventTFNZscroll_event)stepr4  rG  )rE  ZLinesPerActionZWheelRotationZ
WheelDeltarI  r   r  r   rS  r   r8  r,  )r&   r   ry   rz   rT  r   r   r   r     s   


z#_FigureCanvasWxBase._on_mouse_wheelc                 C   s6   |   td| g| |R | ||d  dS )rO  Zmotion_notify_eventrP  N)rI  r   rE  r8  r,  r  r   r   r   r   $  s   
z_FigureCanvasWxBase._on_motionc                 C   4   |   td| g| |R |  |d  dS )zMouse has entered the window.Zfigure_enter_eventrP  NrI  r   rE  r8  r,  r  r   r   r   r   ,     
z_FigureCanvasWxBase._on_enterc                 C   rU  )zMouse has left the window.Zfigure_leave_eventrP  NrV  r  r   r   r   r   4  rW  z_FigureCanvasWxBase._on_leaver    )r   T)_r3   r4   r5   r6   Zrequired_interactive_frameworkr   Z
_timer_clsr   ZclasspropertyZmanager_classr   r5  r7  r6  ZWXK_CAPITALZWXK_LEFTZWXK_UPZ	WXK_RIGHTZWXK_DOWNZ
WXK_ESCAPEZWXK_F1ZWXK_F2ZWXK_F3ZWXK_F4ZWXK_F5ZWXK_F6ZWXK_F7ZWXK_F8ZWXK_F9ZWXK_F10ZWXK_F11ZWXK_F12Z
WXK_SCROLLZ	WXK_PAUSEZWXK_BACKZ
WXK_RETURNZ
WXK_INSERTZ
WXK_DELETEZWXK_HOMEZWXK_ENDZ
WXK_PAGEUPZWXK_PAGEDOWNZWXK_NUMPAD0ZWXK_NUMPAD1ZWXK_NUMPAD2ZWXK_NUMPAD3ZWXK_NUMPAD4ZWXK_NUMPAD5ZWXK_NUMPAD6ZWXK_NUMPAD7ZWXK_NUMPAD8ZWXK_NUMPAD9ZWXK_NUMPAD_ADDZWXK_NUMPAD_SUBTRACTZWXK_NUMPAD_MULTIPLYZWXK_NUMPAD_DIVIDEZWXK_NUMPAD_DECIMALZWXK_NUMPAD_ENTERZWXK_NUMPAD_UPZWXK_NUMPAD_RIGHTZWXK_NUMPAD_DOWNZWXK_NUMPAD_LEFTZWXK_NUMPAD_PAGEUPZWXK_NUMPAD_PAGEDOWNZWXK_NUMPAD_HOMEZWXK_NUMPAD_ENDZWXK_NUMPAD_INSERTZWXK_NUMPAD_DELETEr:  r$   r   r   r   r  r  r  r"  r   r  r   r   r   r8  rA  rE  r   r   rL  rN  r   r   r   r   r   r   r   r   r   r   r     s.   		
 !"#$%&'()*+,-./01234
<
3	



-

r   c                   @   sz   e Zd ZdddZdd ZeeejZ	eeej
 ZZeeejZeeejZeeej ZZeeejZdS )FigureCanvasWxNc                 C   sF   t dt|  t| j| jj| _| j| j d| _	| j
|d dS )z
        Render the figure using RendererWx instance renderer, or using a
        previously defined renderer if none is specified.
        z%s - draw()Tr#  N)rE   rF   rG   r<   rJ   r   rL   r   r$  r   r"  )r&   r  r   r   r   r$  @  s
   zFigureCanvasWx.drawc                 C   s   t t| jjjt| jjj}| jt	|| jj
 t|r&| n|}|||s5td| | jr<|   | rD|   d S d S )NzCould not save figure to )r   rt   r   r   r   r{   rH   rI   r$  r<   rL   r   Zis_writable_file_liker  ZSaveFiler  r   r   )r&   filetypefilenamerJ   Z	saved_objr   r   r   _print_imageK  s   
zFigureCanvasWx._print_imager    )r3   r4   r5   r$  r\  	functoolspartialmethodr   ZBITMAP_TYPE_BMPZ	print_bmpZBITMAP_TYPE_JPEGZ
print_jpegZ	print_jpgZBITMAP_TYPE_PCXZ	print_pcxZBITMAP_TYPE_PNGZ	print_pngZBITMAP_TYPE_TIFZ
print_tiffZ	print_tifZBITMAP_TYPE_XPMZ	print_xpmr   r   r   r   rY  =  s*    
rY  c                       s$   e Zd Z fddZdd Z  ZS )FigureFrameWxc          	         s   t jdkr	t j}nt dd}t jd d|d tdt|  t	|  || d|| _
t| j
|| }| j
jj}|d ur@| | ttj|jj\}}| j
t || | j
d | j
  |   | t j| j d S )Nr     )r   r   rD  rD   )r`   r`   )r   r  ZDefaultPositionZPointr#   r$   rE   rF   rG   _set_frame_iconr  r   managertoolbarZ
SetToolBarr   r   r   r{   r   ZSetInitialSizer   Z
SetMinSizeZSetFocusFitr   	EVT_CLOSE	_on_close)	r&   numZfigcanvas_classrD  rc  rd  rY   rZ   r)   r   r   r$   n  s"   



zFigureFrameWx.__init__c                 C   sx   t dt|  td| j  | j  d | jj_t	
| jj z| j| jjj W n	 ty5   Y nw |  d S )Nz%s - on_close()Zclose_event)rE   rF   rG   r   r  r,  r  rc  framer   destroyZmpl_disconnectrd  Z_id_dragAttributeErrorrI  r  r   r   r   rg    s   

zFigureFrameWx._on_close)r3   r4   r5   r$   rg  r7   r   r   r)   r   r_  m  s    r_  c                       sh   e Zd ZdZ fddZedd Zedd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Z  ZS )r   a  
    Container/controller for the FigureCanvas and GUI frame.

    It is instantiated by Gcf whenever a new figure is created.  Gcf is
    responsible for managing multiple instances of FigureManagerWx.

    Attributes
    ----------
    canvas : `FigureCanvas`
        a FigureCanvasWx(wx.Panel) instance
    window : wxFrame
        a wxFrame instance - wxpython.org/Phoenix/docs/html/Frame.html
    c                    s.   t dt|  | | _| _t || d S )NrD   )rE   rF   rG   rj  windowr#   r$   )r&   r  rh  rj  r)   r   r   r$     s   zFigureManagerWx.__init__c                 C   sD   t  pt }t|||d}|jj}t r |j	  |j
  |S )N)ri  )r   GetAppr   r_  r  rc  mplis_interactiverj  Showr   )r   ri  r   rh  r   rj  rc  r   r   r   create_with_canvas  s   

z"FigureManagerWx.create_with_canvasc                 C   s.   t j st  }|d ur|  d S d S d S r    )r   r   ZIsMainLoopRunningrn  ZMainLoop)r   r   r   r   r   start_main_loop  s   
zFigureManagerWx.start_main_loopc                 C   s0   | j   | j  tjd r| j   d S d S )Nzfigure.raise_window)rj  rq  r  r$  ro  rcParamsRaiser,   r   r   r   show  s
   


zFigureManagerWx.showc                 G   s.   t dt|  | j}|rt|j d S d S )Nz%s - destroy())rE   rF   rG   rj  r   Z	CallAfterr   )r&   r'   rj  r   r   r   rk    s
   zFigureManagerWx.destroyc                 C   s   | j | j    d S r    )rj  ZShowFullScreenZIsFullScreenr,   r   r   r   full_screen_toggle  s   z"FigureManagerWx.full_screen_togglec                 C   s
   | j  S r    )rm  ZGetTitler,   r   r   r   get_window_title  s   
z FigureManagerWx.get_window_titlec                 C      | j | d S r    )rm  ZSetTitle)r&   titler   r   r   set_window_title  s   z FigureManagerWx.set_window_titlec              
   C   s,   | j | j tt|t| d S r    )rm  ZSetSizeZClientToWindowSizer   r   r   r   )r&   rH   rI   r   r   r   resize  s   zFigureManagerWx.resize)r3   r4   r5   r6   r$   classmethodrr  rs  rv  rk  rw  rx  r{  r|  r7   r   r   r)   r   r     s    


	r   c                 C   s   t ttd| S )z\
    Load a wx.Bitmap from a file in the "images" directory of the Matplotlib
    data.
    images)r   rt   strr   _get_data_path)r[  r   r   r   _load_bitmap  s   r  c                 C   sF   t  }dD ]}t t|}| s d S || q| | d S )N)zmatplotlib.pngzmatplotlib_large.png)r   Z
IconBundleIconr  IsOkZAddIconZSetIcons)rj  Zbundleimageiconr   r   r   rb    s   rb  c                       sv   e Zd ZdejdddZe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  ZS )NavigationToolbar2WxTr   c             	   C   s   t jj| | d|d dt jv r| d i | _| jD ]<\}}}}|d u r+|   q| j	d| 
| dt j|||dv r@t jnt jdj| j|< | jt jt| || j| d q|| _| jrr|   t j| t jd| _| | j |   t| | d S )	Nra  r  ZwxMac)   r  z.png)PanZoom)rJ   ZbmpDisabledlabelZ	shortHelpkindr   )r   ToolBarr$   r(  ZPlatformInfoZSetToolBitmapSizewx_idsZ	toolitemsZAddSeparatorZAddTool_iconr   
ITEM_CHECKITEM_NORMALIdr   EVT_TOOLr*  _coordinatesAddStretchableSpace
StaticTextALIGN_RIGHT_label_text
AddControlRealizer   )r&   r  Zcoordinatesr   textZtooltip_text
image_filecallbackr   r   r   r$     s8   

	zNavigationToolbar2Wx.__init__c           	      C   s&  t jtd| }t|d}z	tj	
  }W n? tyZ   tj	tj}tj	tj}d|j d|j  d|j  d }d|j d|j  d|j  d }|| dk}Y nw |rtj	tj}|dd	d
f dkjdd}| | | f||d	d
f< tj|jd |jd | S )z
        Construct a `wx.Bitmap` suitable for use as icon from an image file
        *name*, including the extension and relative to Matplotlib's "images"
        data directory.
        r~  ZRGBAgA`"?gbX9?gv/?r   g?.Nr_   r   ra  )Zaxisr   )PILZImageopenr   r  nparrayconvertr   ZSystemSettingsZGetAppearanceZIsDarkrl  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTredgreenblueallRedZGreenZBluert   ru   rs   rv   )	r9   Zpilimgr  Zdarkbgr   Zbg_lumZfg_lumZ
black_maskr   r   r   r    s$   """zNavigationToolbar2Wx._iconc                 C   sP   d| j v r| | j d | jjdk d| j v r&| | j d | jjdk d S d S )Nr  ZPANr  ZZOOM)r  
ToggleToolmoder9   r,   r   r   r   _update_buttons_checked5  s
   

z,NavigationToolbar2Wx._update_buttons_checkedc                       t  j|  |   d S r    )r#   zoomr  r&   r'   r)   r   r   r  ;     zNavigationToolbar2Wx.zoomc                    r  r    )r#   panr  r  r)   r   r   r  ?  r  zNavigationToolbar2Wx.panc              
   G   sF  | j  \}}}| j  }t| j  dtjd ||tjtj	B }|
| | tjkrt| }tdt| | ||  }|jdd  }	|	| j  v r_||	kr_td|	||	 |	}tjd rlt|jtjd< z| j jj||d W d S  ty }
 ztj| j  t|
dd}|  |  W Y d }
~
d S d }
~
ww d S )	NzSave to filezsavefig.directoryz%s - Save file path: %sr   zDextension %s did not match the selected image type %s; going with %s)formatzMatplotlib error)r   messagecaption)r  r  Zget_default_filenamer   
FileDialogr(  ro  rt  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexZ	ShowModalID_OKpathlibr   ZGetPathrE   rF   rG   ZGetFilterIndexsuffixZget_supported_filetypeswarningr  r   r   Zsavefig	ExceptionZMessageDialogr%  )r&   r'   r  r  r  Zdefault_fileZdialogrf   fmtr  er   r   r   save_figureC  s@   




z NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j   d S r    )r  r   r{   rI   r   r   )r&   r   r  r  r  r   rI   r   r   r   draw_rubberbandd  s   z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r    )r  r   r   r,   r   r   r   remove_rubberbandi  s   z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S d S r    )r  r  SetLabelr&   rU   r   r   r   set_messagem  s   z NavigationToolbar2Wx.set_messagec                 C   sb   | j jdk}| j jt| j d k }d| jv r| | jd | d| jv r/| | jd | d S d S )Nr   r   ZBackForward)Z
_nav_stack_poslenr  Z
EnableTool)r&   Zcan_backwardZcan_forwardr   r   r   set_history_buttonsq  s   

z(NavigationToolbar2Wx.set_history_buttonsrX  )r3   r4   r5   r   	TB_BOTTOMr$   r   r  r  r  r  r  r  r  r  r  r7   r   r   r)   r   r    s     
!r  c                   @   sD   e Zd ZdejfddZdd Zdd Zdd	 Zd
d Z	dd Z
dS )	ToolbarWxNc                 C   sj   |d u r	|j  }t| | tjj| |d|d |  | _tj| tj	d| _
| | j
 i | _i | _d S )Nra  r  )r  r(  r
   r$   r   r  r  _spacer  r  r  r  
_toolitems_groups)r&   Ztoolmanagerr   r   r   r   r   r$   }  s   


zToolbarWx.__init__c                    s     fddt  jD \}|S )z
        Find the position (index) of a wx.ToolBarToolBase in a ToolBar.

        ``ToolBar.GetToolPos`` is not useful because wx assigns the same Id to
        all Separators and StretchableSpaces.
        c                    s   g | ]}  |kr|qS r   )GetToolByPos)r   rD  r&   toolr   r   r     s    z+ToolbarWx._get_tool_pos.<locals>.<listcomp>)range
ToolsCount)r&   r  rD  r   r  r   _get_tool_pos  s   zToolbarWx._get_tool_posc              	      s  |j vrjj |< j | }dd tjtjD }|dkr?||d kr0dn|||d  d }	n|d }	|	| }
|rht	
|}|sVtjntj}|
d |tj||ped}n( d d df}|rtjd |d}n	tjd |d}j|
| d	}   fd
d}|rtj|| n|tj| j g  j  ||f d S )Nc                 S   s    g | ]}|  r| s|qS r   )ZIsSeparatorZIsStretchableSpace)r   tr   r   r   r     s
    
z*ToolbarWx.add_toolitem.<locals>.<listcomp>r   r   ra   
   r   r  c                    s      d S r    )Ztrigger_tool)r   r9   r&   r   r   handler  r0   z'ToolbarWx.add_toolitem.<locals>.handler)r  ZInsertSeparatorr  r  r   r  r  r  indexr  r  r   r  r  Z
InsertToolr   ZGetTextExtentZToggleButtonButtonZInsertControlr  r   r  r   r  
setdefaultr  )r&   r9   grouppositionr  descriptiontogglesepsepsstartidxr  r  r  r   r   r  r   r  r   add_toolitem  s<   




zToolbarWx.add_toolitemc                 C   sT   || j vrd S | j | D ]\}}| s| |j| q| | q|   d S r    )r  Z	IsControlr  r  Z
GetControlZSetValuer   )r&   r9   Ztoggledr  r  r   r   r   toggle_toolitem  s   
zToolbarWx.toggle_toolitemc                 C   s,   | j | D ]
\}}| |j q| j |= d S r    )r  Z
DeleteToolr  )r&   r9   r  r  r   r   r   remove_toolitem  s   zToolbarWx.remove_toolitemc                 C   ry  r    )r  r  r  r   r   r   r    s   zToolbarWx.set_message)r3   r4   r5   r   r  r$   r  r  r  r  r  r   r   r   r   r  |  s    -
r  c                   @      e Zd Zdd ZdS )ConfigureSubplotsWxc                 G   s   t |  d S r    )r  Zconfigure_subplotsr  r   r   r   trigger  r0   zConfigureSubplotsWx.triggerNr3   r4   r5   r  r   r   r   r   r        r  c                   @   r  )SaveFigureWxc                 G      t |   d S r    )r  r  "_make_classic_style_pseudo_toolbarr  r   r   r   r       zSaveFigureWx.triggerNr  r   r   r   r   r    r  r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandWxc                 C   s   t |  d |||| d S r    )r  r  r  )r&   r  r  r  r   r   r   r   r    s   zRubberbandWx.draw_rubberbandc                 C   r  r    )r  r  r  r,   r   r   r   r    r  zRubberbandWx.remove_rubberbandN)r3   r4   r5   r  r  r   r   r   r   r    s    r  c                       sB   e Zd ZdZdgZg dZ fddZdd Zedd	 Z	  Z
S )
_HelpDialogN)ActionZ	ShortcutsDescription)r=      r?   c                    s"  t  j|dtjtjB d ttj}tdddd}|  	 }t
| j| D ],\}}t|| jD ]!\}}	tj| |d}
|dkrF|
| |
|	 ||
ddd q2q(||dtjd t| tj}||dtjtjB d | | ||  |   | tj| j |tj| j d S )NZHelp)rz  r   r   r_         r  )r#   r$   r   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERZBoxSizerZVERTICALZFlexGridSizerZGetFontZMakeBoldr  headerszipwidthsr  rS   ZWrapAddALLr  r  ZALIGN_CENTER_HORIZONTALZSetSizerre  ZLayoutr   rf  rg  Z
EVT_BUTTON)r&   r   help_entriesZsizerZ
grid_sizerrA   rrowcolrH   r  okr)   r   r   r$     s,   





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r    )r  	_instanceZDestroyLaterrI  r  r   r   r   rg  	  s   z_HelpDialog._on_closec                 C   s.   | j r
| j   d S | ||| _ | j   d S r    )r  ru  rq  )r   r   r  r   r   r   rv    s
   
z_HelpDialog.show)r3   r4   r5   r  r  r  r$   rg  r}  rv  r7   r   r   r)   r   r    s    r  c                   @   r  )HelpWxc                 G   s   t | jj |   d S r    )r  rv  r   r  ZGetTopLevelParentZ_get_help_entriesr  r   r   r   r    s   zHelpWx.triggerNr  r   r   r   r   r     r  r   c                   @   r  )ToolCopyToClipboardWxc                 O   s`   | j js	| j   | j j rtj sd S ztjt	| j j W tj
  d S tj
  w r    )r  r   r$  rJ   r  r   r   r   r   r   r   r%   r   r   r   r  !  s   
zToolCopyToClipboardWx.triggerNr  r   r   r   r   r    r  r  c                   @   s   e Zd ZeZeZejZdS )
_BackendWxN)	r3   r4   r5   rY  ZFigureCanvasr   ZFigureManagerrs  Zmainloopr   r   r   r   r  0  s    
r  )Mr6   r]  loggingr   r  r   r   numpyr  Z	PIL.Imager  Z
matplotlibro  Zmatplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.pathr   Zmatplotlib.transformsr   r   	getLoggerr3   rE   r   	lru_cacher   r   
deprecatedr<   r   r   r   rY  Framer_  r   r  rb  r  r  r  Z_register_tool_classZConfigureSubplotsBaser  ZSaveFigureBaser  ZRubberbandBaser  Dialogr  ZToolHelpBaser   ZToolCopyToClipboardBaser  Z_toolbar2_classZ_toolmanager_toolbar_classZexportr  r   r   r   r   <module>   sp    	D

 Pm   :01I
 W
-