a
    s=ic                     @   s  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j*G d	d
 d
Z+e,ddAddZ-e.ddd Z/G dd deZ0ej,dddddddG dd deZ1G dd deZ2G dd dee%j3Z4G d d! d!e4Z5G d"d# d#e%j6Z7G d$d% d%eZ8d&d' Z9d(d) Z:G d*d+ d+ee%j;Z<G d,d- d-ee%j;Z=e>e4G d.d/ d/ej?Z@e>e4G d0d1 d1ejAZBej,d2d3d4G d5d6 d6ejCZDe>e4G d7d8 d8ejEZFG d9d: d:e%jGZHe>e4G d;d< d<ejIZJe>e4G d=d> d>ejKZLe<e8_Me=e8_NejOG d?d@ d@eZPdS )Bz
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                   @   s&   e Zd Zejdddedd ZdS )__getattr__3.5 )obj_typec                 C   s<   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S N)r   MOVEwxCURSOR_HANDHANDPOINTERCURSOR_ARROWSELECT_REGIONCURSOR_CROSSWAITCURSOR_WAITRESIZE_HORIZONTALCURSOR_SIZEWERESIZE_VERTICALCURSOR_SIZENSself r-   o/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/matplotlib/backends/backend_wx.py<lambda>,   s    z__getattr__.<lambda>N)__name__
__module____qualname__r   
deprecatedpropertyZcursordr-   r-   r-   r.   r   *   s   r   3.6c                 C   s.   t j|| dt jt jB d}|  |  dS )z4Signal an error condition with a popup error dialog.zMatplotlib backend_wx error)parentmessagecaptionstyleN)r   MessageDialogOKZCENTRE	ShowModalDestroy)msgr6   dialogr-   r-   r.   error_msg_wx7   s    
r@      c                  C   s    t d} | d t  | S )NFT)r   AppZSetExitOnFrameDeleter   Z_setup_new_guiappwxappr-   r-   r.   _create_wxappD   s    

rE   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 r   )r   Timer_timerZ	_on_timerZNotifysuper__init__r,   argskwargs	__class__r-   r.   rJ   O   s    

zTimerWx.__init__c                 C   s   | j | j| j d S r   )rH   Start	_intervalZ_singler+   r-   r-   r.   _timer_startT   s    zTimerWx._timer_startc                 C   s   | j   d S r   )rH   Stopr+   r-   r-   r.   _timer_stopW   s    zTimerWx._timer_stopc                 C   s   | j  r|   d S r   )rH   	IsRunningrR   r+   r-   r-   r.   _timer_set_intervalZ   s    
zTimerWx._timer_set_interval)	r0   r1   r2   __doc__rJ   rR   rT   rV   __classcell__r-   r-   rN   r.   rF   L   s
   rF   z2.0r   backendz
the futureZwxaggz7See the Matplotlib usage FAQ for more info on backends.)namer   ZremovalalternativeZaddendumc                       s  e Zd ZdZejejejejejejejejejejejejejejejejejejd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ed	d
d Zdd Zdd Zdd Zedd Zd"ddZdd Zd#ddZdd Z dd Z!d d! Z"  Z#S )$
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
ultralightlightnormalZmediumZsemiboldboldZheavyZ	ultraboldblack)italicra   Zoblique)ZSansZRomanScriptZ
DecorativeZModernZCourierZcourierc                    sJ   t    tdt|  | | _| | _|| _	i | _
|| _d| _dS )z)Initialise a wxWindows renderer instance.%s - __init__()N)rI   rJ   _logdebugtypeZGetWidthwidthZ	GetHeightheightbitmapfontddpigc)r,   rl   rn   rN   r-   r.   rJ      s    


zRendererWx.__init__c                 C   s   dS NTr-   r+   r-   r-   r.   flipy   s    zRendererWx.flipyr5   c                 C   s   dS rp   r-   r+   r-   r-   r.   offset_text_height   s    zRendererWx.offset_text_heightc                 C   sd   |rt |}| jd u r"|  }n| j}|j}| ||}||tj |	|\}}}	}
|||	fS r   )
r   
strip_mathro   new_gcgfx_ctxget_wx_fontSetFontr   BLACKZGetFullTextExtent)r,   spropismathro   ru   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   )rj   rk   r+   r-   r-   r.   get_canvas_width_height   s    z"RendererWx.get_canvas_width_heightc                 C   sp   |  }|d ur|j}|j}|j|krl||_|d u r>|  n.||d | j|d  |d  |d |d  d S )Nr   rA         )get_clip_rectangleboundsru   _lastcliprectZ	ResetClipZCliprk   )r,   ro   Z
new_boundsru   r-   r-   r.   handle_clip_rectangle   s    


z RendererWx.handle_clip_rectanglec                 C   s   |   }||D ]r\}}|tjkr0|j|  q|tjkrF|j|  q|tjkr\|j|  q|tj	krr|j
|  q|tjkr|  q|S r   )Z
CreatePathiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)ru   path	transformwxpathpointscoder-   r-   r.   convert_path   s    





zRendererWx.convert_pathNc                 C   s   |   | | |j}|t ddd| j }| |||}|d url|t	
|| || n
|| |  d S )Ng      ?g              )selectr   ru   r   scale	translaterk   r   ZSetBrushr   ZBrushget_wxcolourZDrawPathZ
StrokePathunselect)r,   ro   r   r   ZrgbFaceru   r   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   )r   r   rj   rk   shaper   BitmapFromBufferRGBAtobytesr   ru   
DrawBitmapintr   )r,   ro   xyZimbboxlbr}   r~   rowscolsrl   r-   r-   r.   
draw_image   s    zRendererWx.draw_imageFc	                 C   s   |rt |}tdt|  |  | | |j}	| ||}
|	|
 }|	|
| | |||\}}}t|}t|| }|dkr|	||| n>t|}|t| }|t| }|	||| || | |  d S )Nz%s - draw_text()r   )r   rs   rg   rh   ri   r   r   ru   rv   r   get_rgbrw   r   r   ZDrawTextmathradianssincosZDrawRotatedTextr   )r,   ro   r   r   ry   rz   Zangler{   Zmtextru   r|   colorr}   r~   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())rg   rh   ri   GraphicsContextWxrl   ro   r   r   r+   r-   r-   r.   rt     s
    

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur0|S | | }tj	t
|d | j| tj| j|  | j|  d | j|< }|S )z7Return a wx font.  Cache font instances for efficiency.z%s - get_wx_font()Ng      ?)Z	pointSizefamilyr9   weight)rg   rh   ri   hashrm   getpoints_to_pixelsZget_size_in_pointsr   ZFontr   	fontnamesget_nameZROMAN
fontangles	get_stylefontweightsZ
get_weight)r,   ry   rz   keyr|   sizer-   r-   r.   rv      s    
zRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)PIXELS_PER_INCHrn   )r,   r   r-   r-   r.   r   1  s    zRendererWx.points_to_pixels)N)FN)$r0   r1   r2   rW   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   rJ   rq   r   r3   rr   r   r   r   staticmethodr   r   r   r   rt   rv   r   rX   r-   r-   rN   r.   r\   _   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 a 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
projectinground)ZbevelZmiterr   c                    s   t    tdt| | | j|d\}}|d u r`t|}tj	
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNrx   rA   )rI   rJ   rg   rh   ri   _cacher   r   ZMemoryDCZGraphicsContextZCreater   rl   dcru   PenZSOLID_penSetPenrenderer)r,   rl   r   r   ru   rN   r-   r.   rJ   N  s    

zGraphicsContextWx.__init__c                 C   s"   t jdkr| j| j d| _dS )z2Select the current bitmap into this wxDC instance.win32TN)sysplatformr   SelectObjectrl   
IsSelectedr+   r-   r-   r.   r   a  s    
zGraphicsContextWx.selectc                 C   s"   t jdkr| jtj d| _dS )z-Select a Null bitmap into this wxDC instance.r   FN)r   r   r   r   r   
NullBitmapr   r+   r-   r-   r.   r   g  s    
zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())rg   rh   ri   r   rI   set_foregroundr   Z	SetColourr   r   ru   r   r   )r,   fgZisRGBArN   r-   r.   r   m  s    z GraphicsContextWx.set_foregroundc                    s   t |}tdt|  |   d|  k r4dk r<n nd}t | t| j	| j
}|dkrfd}| j| | j| j |   d S )Nz%s - set_linewidth()r   rA   )floatrg   rh   ri   r   rI   set_linewidthr   r   r   Z
_linewidthr   ZSetWidthru   r   r   )r,   r}   ZlwrN   r-   r.   r   |  s    zGraphicsContextWx.set_linewidthc                    sR   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())rg   rh   ri   r   rI   set_capstyler   ZSetCapr   _capdZ	_capstyleru   r   r   )r,   csrN   r-   r.   r     s    zGraphicsContextWx.set_capstylec                    sR   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_joinstyle())rg   rh   ri   r   rI   set_joinstyler   ZSetJoinr   _joindZ
_joinstyleru   r   r   )r,   jsrN   r-   r.   r     s    zGraphicsContextWx.set_joinstylec                 C   s$   t dt|  tjdd |D  S )z&Convert a RGB(A) color to a wx.Colour.z%s - get_wx_color()c                 S   s   g | ]}t d | qS )   )r   ).0r   r-   r-   r.   
<listcomp>      z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)rg   rh   ri   r   ZColour)r,   r   r-   r-   r.   r     s    zGraphicsContextWx.get_wxcolour)N)r0   r1   r2   rW   r   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr   weakrefWeakKeyDictionaryr   rJ   r   r   r   r   r   r   r   rX   r-   r-   rN   r.   r   6  s$   		r   c                r       sn  e Zd ZdZdZeZedd Z	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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.d(e
j/d)e
j0d*e
j1d+e
j2d,e
j3d-e
j4d.e
j5d/e
j6d0e
j7d1e
j8d2e
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i9ZDdkd4d5ZEdld6d7ZFd8d9 ZGd:d; ZHdmd=d>ZIdnd?d@ZJdAdB ZKdodCdDZLi eMjNdEdFdFdGdHdIdIdJdKZN fdLdMZOdNdO ZPdPdQ ZQdRdS ZRdpdTdUZSdVdW ZTdXdY ZUdZd[ ZVdqd]d^ZWd_d` ZXdadb ZYdcdd ZZdedf Z[dgdh Z\didj Z]  Z^S )r_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.   r/     r   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	backspace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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j+| j, | tj-| j. | tj/| j0 | tj1| j2 | tj3| j4 | tj5| j4 | 6tj7 | 8tj9 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:%dFN):r   rJ   mapr   ceilfigurer   r   r   PanelSizer   rl   rg   rh   ri   _isDrawn_rubberband_rect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SetBackgroundColourWHITE)r,   r6   idr   r}   r~   r-   r-   r.   rJ     sD    	z_FigureCanvasWxBase.__init__c                 C   sP   t  }|| j t j sLt j }|rLt j| t j  t j	  dS )z*Copy bitmap of canvas to system clipboard.N)
r   BitmapDataObjectZ	SetBitmaprl   TheClipboardZIsOpenedOpenSetDataCloseZFlush)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)rg   rh   ri   r   Refreshr+   r-   r-   r.   	draw_idle*  s    z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r   )r   Yieldr+   r-   r-   r.   flush_events3  s    z _FigureCanvasWxBase.flush_eventsr   c                 C   sx   t | drtdtj| tjd}|dkrX|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   rG   ZID_ANYrP   r   r  Z	EVT_TIMERstop_event_loopZGetIdZGUIEventLoopr  ZRunrS   )r,   timeouttimerr-   r-   r.   start_event_loop7  s    


z$_FigureCanvasWxBase.start_event_loopc                 C   s&   t | dr"| j r| j  | `d S )Nr  )r  r  rU   Exitr,   r  r-   r-   r.   r  D  s    


z#_FigureCanvasWxBase.stop_event_loopc                 C   s   |   }|  }t| }g }g }d}t|D ]R\}\}}	ddd |	D }
||	d  d||
|
f }||	v rx|}|| q0d|}|||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   T  r   z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z
%s (%s)|%s|)Zget_default_filetypeZget_supported_filetypes_groupedsorteditems	enumeratejoinappend)r,   Zdefault_filetype	filetypesZsorted_filetypes	wildcards
extensionsfilter_indexirZ   extsZext_listZwildcardr-   r-   r.   _get_imagesave_wildcardsK  s    
z,_FigureCanvasWxBase._get_imagesave_wildcardsc              	   C   s   t dt|  | r|  s dS |s.t| }tjdkrXt| jj	
 trX| j  n| j}||dd | jdurtt| j\}}}}|||||f||||f||||f||||fgtddtj dS )z
        Update the displayed image on the GUI canvas, using the supplied
        wx.PaintDC device context.

        The 'WXAgg' backend sets origin accordingly.
        z%s - gui_repaint()N	__WXMSW__r   rx   rA   )rg   rh   ri   ZIsShownOnScreenr   ZClientDCPlatform
isinstancer   canvasZget_rendererr\   rl   ConvertToImageZConvertToBitmapr   r   r   r   ZDrawLineListr   ZPENSTYLE_SHORT_DASH)r,   drawDCbmpx0y0x1y1r-   r-   r.   gui_repaint]  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                    s,   t  j|g|R i | | jr(|   d S r   )rI   print_figurer   draw)r,   filenamerL   rM   rN   r-   r.   r@    s    z _FigureCanvasWxBase.print_figurec                 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()r9  N)	rg   rh   ri   r   ZPaintDCr   rA  r?  r=   )r,   r  r9  r-   r-   r.   r    s    
z_FigureCanvasWxBase._on_paintc                 C   s  t dt|  |   }|r*|| }|rN|rN|jsN|jtj	@ sN| 
 }n|  }|| 
  t| ddr|| j| jfkrdS |\| _| _d| _| jdks| jdkrd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()_widthNFrA   )forwardr  Zresize_event)rg   rh   ri   	GetParentGetSizerZGetItemZ
ProportionFlagr   ZEXPANDZ
GetMinSizeZGetClientSizeZIncTogetattrrD  _heightr   r   rl   r   rn   Zset_size_inchesr  r   _processr  )r,   r  szsir   ZdpivalZwinchZhinchr-   r-   r.   r    s.    



z_FigureCanvasWxBase._on_sizec                 C   s   |j }|| jv r| j| }n&|dk r>t|}| sB| }nd }|jddf|jddf|jddffD ]4\}}}| rd||krd|dkr| sdd||}qd|S )N   Zctrlr   r   r   z{0}+{1})	ZKeyCodekeyvaldchrZ	ShiftDownlowerZControlDownZAltDownisupperformat)r,   r  keyvalr   methprefixZkey_namer-   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   rk   )r,   posr   r   r-   r-   r.   _mpl_coords  s
    z_FigureCanvasWxBase._mpl_coordsc                 C   s8   t d| | |g|  R d|i  | r4|  dS )zCapture key press.Zkey_press_eventguiEventNr   rW  r[  rK  Skipr$  r-   r-   r.   r    s    
z _FigureCanvasWxBase._on_key_downc                 C   s8   t d| | |g|  R d|i  | r4|  dS )zRelease key.Zkey_release_eventr\  Nr]  r$  r-   r-   r.   r    s    
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   Cursorr   Zcheck_getitemr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Z	SetCursorr  r,   r_  r-   r-   r.   
set_cursor  s    	
z_FigureCanvasWxBase.set_cursorTc                 C   s    |   r|   |r|   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)rd  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}| }|||}| rtd| ||||d  nD| rtd| |||d|d  n | rtd| ||||d  dS )Start measuring on an axis.Zbutton_press_event)r\  T)Zdblclickr\  Zbutton_release_eventN)r^  rd  Z
ButtonDownZButtonDClickr[  r   ZMOUSE_BTN_LEFTr   LEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTRIGHTZMOUSE_BTN_AUX1BACKZMOUSE_BTN_AUX2FORWARDZ	GetButtonr   r   rK  ZButtonUp)r,   r  r   r   Z
button_mapZbuttonr-   r-   r.   r    s.    
z$_FigureCanvasWxBase._on_mouse_buttonc                 C   sv   |  |\}}|j|j |j }|  tjdkrZt| dsDd| _n| jrTd| _dS d| _t	d| ||||d
  dS )z3Translate mouse wheel events into matplotlib eventsZ	__WXMAC___skipwheeleventTFNZscroll_event)stepr\  )r[  ZLinesPerActionZWheelRotationZ
WheelDeltar^  r   r5  r  rj  r   rK  )r,   r  r   r   rk  r-   r-   r.   r  -  s    

z#_FigureCanvasWxBase._on_mouse_wheelc                 C   s.   |   td| g| |R d|i  dS )re  Zmotion_notify_eventr\  N)r^  r   r[  rK  r$  r-   r-   r.   r	  @  s    z_FigureCanvasWxBase._on_motionc                 C   s.   |   td| g| |R d|i  dS )zMouse has entered the window.Zfigure_enter_eventr\  Nr^  r   r[  rK  r$  r-   r-   r.   r
  G  s    z_FigureCanvasWxBase._on_enterc                 C   s.   |   td| g| |R d|i  dS )zMouse has left the window.Zfigure_leave_eventr\  Nrl  r$  r-   r-   r.   r  N  s    z_FigureCanvasWxBase._on_leave)N)N)r   )N)N)N)T)_r0   r1   r2   rW   Zrequired_interactive_frameworkrF   Z
_timer_clsr   ZclasspropertyZmanager_classr   ZWXK_CONTROLZ	WXK_SHIFTZWXK_ALTZ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_DELETErO  rJ   r  r  r  r"  r  r3  r?  r   r-  r@  r  r  rW  r[  r  r  rb  rd  r  r  r  r	  r
  r  rX   r-   r-   rN   r.   r     s   	<
1
	


	
-

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()TrC  N)rg   rh   ri   r\   rl   r   rn   r   rA  r   r?  )r,   r9  r-   r-   r.   rA  Y  s
    zFigureCanvasWx.drawc                 C   s   t t| jjjt| jjj}| jt	|| jj
 t|rL| n|}|||sjtd| | jrx|   | r|   d S )NzCould not save figure to )r   r   r   r   r   r   rj   rk   rA  r\   rn   r   Zis_writable_file_liker8  ZSaveFiler  r   r  )r,   ZfiletyperB  rl   Z	saved_objr-   r-   r.   _print_imaged  s    
zFigureCanvasWx._print_image)N)r0   r1   r2   rA  rn  	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.   rm  V  s(   
rm  c                       s   e Zd Zdd fdd
Zejdddedd	 Zejdd
dedd	 Zejdddedd	 Z	ejdddedd	 Z
ejdddedd	 Zejddddd Zejdd
ddd Zdd Z  ZS )FigureFrameWxNcanvas_classc          	         s   t jdkrt j}nt dd}t jd d|d tdt|  t	|  |d ur`|| d|| _
ntjddd | || _
t| j
|| }| j
jj}|d ur| | ttj|jj\}}| j
t || | j
d	 | j
  |   | t j| j d S )
Nr4     )r6   r  rZ  rf   r5   zvThe canvas_class parameter will become required after the deprecation period starting in Matplotlib %(since)s elapses.)r7   )r   r   )r   r5  ZDefaultPositionZPointrI   rJ   rg   rh   ri   _set_frame_iconr7  r   Zwarn_deprecated
get_canvasr   managertoolbarZ
SetToolBarr   r   r   r   r   ZSetInitialSizer   Z
SetMinSizeZSetFocusFitr  	EVT_CLOSE	_on_close)	r,   numfigrs  rZ  rx  ry  r}   r~   rN   r-   r.   rJ     s,    



zFigureFrameWx.__init__r5   zframe.GetSizer()r[   c                 C   s   |   S r   )rG  r+   r-   r-   r.   r/     r   zFigureFrameWx.<lambda>zframe.canvas.managerc                 C   s   | j jS r   )r7  rx  r+   r-   r-   r.   r/     r   zframe.canvas.manager.numc                 C   s
   | j jjS r   )r7  rx  r}  r+   r-   r-   r.   r/     r   zframe.GetToolBar()c                 C   s   |   S r   )Z
GetToolBarr+   r-   r-   r.   r/     r   z frame.canvas.manager.toolmanagerc                 C   s
   | j jjS r   )r7  rx  toolmanagerr+   r-   r-   r.   r/     r   z&the canvas_class constructor parameterc                 C   s   t | d|S )Nru  )rm  )r,   r~  r-   r-   r.   rw    s    zFigureFrameWx.get_canvasc                 C   s   t dt|  | jjS )Nz%s - get_figure_manager())rg   rh   ri   r7  rx  r+   r-   r-   r.   get_figure_manager  s    z FigureFrameWx.get_figure_managerc                 C   sx   t dt|  td| j  | j  d | jj_t	
| jj z| j| jjj W n tyj   Y n0 |  d S )Nz%s - on_close()Zclose_event)rg   rh   ri   r   r7  rK  r  rx  framer   destroyZmpl_disconnectry  Z_id_dragAttributeErrorr^  r$  r-   r-   r.   r|    s    

zFigureFrameWx._on_close)r0   r1   r2   rJ   r   r3   r4   sizerZfigmgrr}  ry  r  rw  r  r|  rX   r-   r-   rN   r.   rq    s2   (






rq  c                       s\   e Zd ZdZ f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 )Nrf   )rg   rh   ri   r  windowrI   rJ   )r,   r7  r}  r  rN   r-   r.   rJ     s    zFigureManagerWx.__init__c                 C   sD   t  pt }t|||d}|jj}t r@|j	  |j
  |S )Nrr  )r   GetApprE   rq  r7  rx  mplis_interactiver  Showr  )r   rs  r   r}  rD   r  rx  r-   r-   r.   create_with_canvas  s    

z"FigureManagerWx.create_with_canvasc                 C   s,   | j   | j  tjd r(| j   d S )Nzfigure.raise_window)r  r  r7  rA  r  rcParamsRaiser+   r-   r-   r.   show  s    


zFigureManagerWx.showc                 G   s*   t dt|  | j}|r&t|j d S )Nz%s - destroy())rg   rh   ri   r  r   Z	CallAfterr  )r,   rL   r  r-   r-   r.   r    s    zFigureManagerWx.destroyc                 C   s   | j | j    d S r   )r  ZShowFullScreenZIsFullScreenr+   r-   r-   r.   full_screen_toggle  s    z"FigureManagerWx.full_screen_togglec                 C   s
   | j  S r   )r  ZGetTitler+   r-   r-   r.   get_window_title	  s    z FigureManagerWx.get_window_titlec                 C   s   | j | d S r   )r  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   )r  ZSetSizeZClientToWindowSizer   r   r   r   )r,   rj   rk   r-   r-   r.   resize  s    zFigureManagerWx.resize)r0   r1   r2   rW   rJ   classmethodr  r  r  r  r  r  r  rX   r-   r-   rN   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   r   strr   _get_data_path)rB  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)r  Zbundleimageiconr-   r-   r.   rv     s    rv  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r9   c             	   C   s   t jj| | d|d dt jv r,| d i | _| jD ]x\}}}}|d u rV|   q8| j	d| 
| dt j|||dv rt jnt jdj| j|< | jt jt| || j| d q8|| _| jr|   t j| t jd| _| | j |   t| | d S )	Nru  r  ZwxMac)   r  z.png)PanZoom)rl   ZbmpDisabledlabelZ	shortHelpkindr  )r   ToolBarrJ   rF  ZPlatformInfoZSetToolBitmapSizewx_idsZ	toolitemsZAddSeparatorZAddTool_iconr   
ITEM_CHECKITEM_NORMALIdr  EVT_TOOLrI  _coordinatesAddStretchableSpace
StaticTextALIGN_RIGHT_label_text
AddControlRealizer   )r,   r7  Zcoordinatesr9   textZtooltip_text
image_filecallbackr-   r-   r.   rJ   +  s6    

	zNavigationToolbar2Wx.__init__c                 C   s  t tjtd| }ztj	 
 }W n~ ty   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0 |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  gA`"?gbX9?gv/?r   g?.Nr   r   ru  )ZaxisrA   )nparrayPILZImageopenr   r  r   ZSystemSettingsZGetAppearanceZIsDarkr  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTredgreenblueallRedZGreenZBluer   r   r   r   )rZ   r  darkbgr   Zbg_lumZfg_lumZ
black_maskr-   r-   r.   r  K  s     """zNavigationToolbar2Wx._iconc                 C   sL   d| j v r$| | j d | jjdk d| j v rH| | j d | jjdk d S )Nr  ZPANr  ZZOOM)r  
ToggleToolmoderZ   r+   r-   r-   r.   _update_buttons_checkedd  s    

z,NavigationToolbar2Wx._update_buttons_checkedc                    s   t  j|  |   d S r   )rI   zoomr  r,   rL   rN   r-   r.   r  j  s    zNavigationToolbar2Wx.zoomc                    s   t  j|  |   d S r   )rI   panr  r  rN   r-   r.   r  n  s    zNavigationToolbar2Wx.panc              
   G   sJ  | j  \}}}| j  }t| j  dtjd ||tjtj	B }|
| | tjkrFt| }tdt| | ||  }|jdd  }	|	| j  v r||	krtd|	||	 |	}tjd rt|jtjd< z| j jjt||d W nP tyD }
 z6tj| j  t|
dd}|  |  W Y d }
~
n
d }
~
0 0 d S )	NzSave to filezsavefig.directoryz%s - Save file path: %srA   zDextension %s did not match the selected image type %s; going with %s)rS  zMatplotlib error)r6   r7   r8   )r7  r3  Zget_default_filenamer   
FileDialogrF  r  r  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexr<   ID_OKpathlibr   ZGetPathrg   rh   ri   ZGetFilterIndexsuffixZget_supported_filetypeswarningr  r6   r   Zsavefig	Exceptionr:   r=   )r,   rL   r-  r2  r0  Zdefault_filer?   r   fmtr&  er-   r-   r.   save_figurer  s:    




z NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j   d S r   )r7  r   r   rk   r   r  )r,   r  r;  r<  r=  r>  rk   r-   r-   r.   draw_rubberband  s    z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r   )r7  r   r  r+   r-   r-   r.   remove_rubberband  s    z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S r   )r  r  SetLabelr,   ry   r-   r-   r.   set_message  s    z NavigationToolbar2Wx.set_messagec                 C   s`   | j jdk}| j jt| j jd k }d| jv r@| | jd | d| jv r\| | jd | d S )Nr   rA   BackForward)Z
_nav_stack_poslenZ	_elementsr  Z
EnableTool)r,   Zcan_backwardZcan_forwardr-   r-   r.   set_history_buttons  s    

z(NavigationToolbar2Wx.set_history_buttons)T)r0   r1   r2   r   	TB_BOTTOMrJ   r   r  r  r  r  r  r  r  r  r  rX   r-   r-   rN   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 )Nru  r  )r7  rF  r
   rJ   r   r  r  _spacer  r  r  r  
_toolitems_groups)r,   r  r6   r9   r-   r-   r.   rJ     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   rZ  r,   toolr-   r.   r     s   z+ToolbarWx._get_tool_pos.<locals>.<listcomp>)range
ToolsCount)r,   r  rZ  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r`dn|||d  d }	n|d }	|	| }
|rt	
|}|stjntj}|
d |tj||pd}nP d d df}|rtjd |d}ntjd |d}j|
| d	}   fd
d}|rN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   rA   ru  r   
   r   r  c                    s      d S r   )Ztrigger_tool)r  rZ   r,   r-   r.   handler  s    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,   rZ   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 ].\}}| s8| |j| q| | q|   d S r   )r  Z	IsControlr  r  Z
GetControlZSetValuer  )r,   rZ   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,   rZ   r  r  r-   r-   r.   remove_toolitem  s    zToolbarWx.remove_toolitemc                 C   s   | j | d S r   )r  r  r  r-   r-   r.   r    s    zToolbarWx.set_message)r0   r1   r2   r   r  rJ   r  r  r  r  r  r-   r-   r-   r.   r    s   -
r  c                   @   s   e Zd Zdd ZdS )ConfigureSubplotsWxc                 G   s   t |  d S r   )r  Zconfigure_subplotsr  r-   r-   r.   trigger  s    zConfigureSubplotsWx.triggerNr0   r1   r2   r  r-   r-   r-   r.   r    s   r  c                   @   s   e Zd Zdd ZdS )SaveFigureWxc                 G   s   t |   d S r   )r  r  "_make_classic_style_pseudo_toolbarr  r-   r-   r.   r  
  s    zSaveFigureWx.triggerNr  r-   r-   r-   r.   r    s   r  r   ZToolSetCursorr  c                   @   s   e Zd Zdd ZdS )SetCursorWxc                 C   s   t |  | d S r   )r  rb  r  ra  r-   r-   r.   rb    s    zSetCursorWx.set_cursorN)r0   r1   r2   rb  r-   r-   r-   r.   r    s   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   s   t |   d S r   )r  r  r  r+   r-   r-   r.   r    s    zRubberbandWx.remove_rubberbandN)r0   r1   r2   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 ]X\}}t|| jD ]B\}}	tj| |d}
|dkr|
| |
|	 ||
ddd qdqP||dtjd t| tj}||dtjtjB d | | ||  |   | tj| j |tj| j d S )NZHelp)r  r9   r   r         r  )rI   rJ   r   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERZBoxSizerZVERTICALZFlexGridSizerZGetFontZMakeBoldr*  headerszipwidthsr  rw   ZWrapAddALLr  r  ZALIGN_CENTER_HORIZONTALZSetSizerrz  ZLayoutr  r{  r|  Z
EVT_BUTTON)r,   r6   help_entriesr  Z
grid_sizerrb   rrowcolrj   r  okrN   r-   r.   rJ   &  s*    





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r   )r  	_instanceZDestroyLaterr^  r$  r-   r-   r.   r|  ?  s    z_HelpDialog._on_closec                 C   s.   | j r| j   d S | ||| _ | j   d S r   )r  r  r  )r   r6   r	  r-   r-   r.   r  D  s
    
z_HelpDialog.show)r0   r1   r2   r  r  r  rJ   r|  r  r  rX   r-   r-   rN   r.   r  !  s   r  c                   @   s   e Zd Zdd ZdS )HelpWxc                 G   s   t | jj |   d S r   )r  r  r   r7  ZGetTopLevelParentZ_get_help_entriesr  r-   r-   r.   r  P  s    zHelpWx.triggerNr  r-   r-   r-   r.   r  N  s   r  c                   @   s   e Zd Zdd ZdS )ToolCopyToClipboardWxc                 O   sb   | j js| j   | j j r(tj s,d S z$tjt	| j j W tj
  ntj
  0 d S r   )r7  r   rA  rl   r  r   r  r  r  r  r  rK   r-   r-   r.   r  W  s    
zToolCopyToClipboardWx.triggerNr  r-   r-   r-   r.   r  U  s   r  c                   @   s    e Zd ZeZeZedd ZdS )
_BackendWxc                  C   s&   t j s"t  } | d ur"|   d S r   )r   rB   ZIsMainLoopRunningr  ZMainLooprC   r-   r-   r.   mainloopk  s    
z_BackendWx.mainloopN)	r0   r1   r2   rm  ZFigureCanvasr   ZFigureManagerr   r  r-   r-   r-   r.   r  f  s   r  )N)QrW   ro  loggingr   r  r   r   numpyr  r  Z
matplotlibr  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   	getLoggerr0   rg   r   Zcaching_module_getattrr   r3   r@   	lru_cacherE   rF   r\   r   r   r   rm  Framerq  r   r  rv  r  r  r  Z_register_tool_classZConfigureSubplotsBaser  ZSaveFigureBaser  ZSetCursorBaser  ZRubberbandBaser  Dialogr  ZToolHelpBaser  ZToolCopyToClipboardBaser  Z_toolbar2_classZ_toolmanager_toolbar_classexportr  r-   r-   r-   r.   <module>   sz   	D

 Tm   60PB
 W
-