o
    :aI                     @   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 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!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-d9ddZ.G dd deZ/G dd deZ0G dd deZ1G dd dee'j2Z3G dd de3Z4G dd de'j5Z6G dd deZ7dd Z8d d! Z9G d"d# d#ee'j:Z;G d$d% d%ee'j:Z<G d&d' d'ej=Z>G d(d) d)ej?Z@ejAd*d+d,G d-d. d.ejBZCG d/d0 d0ejDZEG d1d2 d2e'jFZGG d3d4 d4ejHZIG d5d6 d6ejJZKe@e_Le>e_MeEe_NeIe_OeKe_PejQG d7d8 d8eZRdS ):z
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_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseGraphicsContextBaseMouseButtonNavigationToolbar2RendererBase	TimerBaseToolContainerBasecursors)_apicbookbackend_tools)Gcf)ToolManager)Figure)Path)Affine2D)SubplotToolK   c                   @   sB   e Zd Zejddddedd Zejddded	d Zd
S )__getattr__z3.1 z3.6)obj_typeremovalc                 C      dS )N    selfr   r   @/usr/lib/python3/dist-packages/matplotlib/backends/backend_wx.py<lambda>/   s    z__getattr__.<lambda>3.5)r   c                 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_SIZENSr   r   r   r    r!   0   s   N)__name__
__module____qualname__r   
deprecatedpropertyZ
IDLE_DELAYZcursordr   r   r   r    r   ,   s
    r   c                 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messageZcaptionstyleN)r%   ZMessageDialogOKZCENTRE	ShowModalDestroy)msgr7   Zdialogr   r   r    error_msg_wx;   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 r#   )r%   Timer_timerZ	_on_timerZNotifysuper__init__r   argskwargs	__class__r   r    rC   I   s   

zTimerWx.__init__c                 C   s   | j | j| j d S r#   )rA   StartZ	_intervalZ_singler   r   r   r    _timer_startN   s   zTimerWx._timer_startc                 C   s   | j   d S r#   )rA   Stopr   r   r   r    _timer_stopQ      zTimerWx._timer_stopc                 C   s   | j  r|   d S d S r#   )rA   	IsRunningrJ   r   r   r   r    _timer_set_intervalT   s   
zTimerWx._timer_set_interval)	r2   r3   r4   __doc__rC   rJ   rL   rO   __classcell__r   r   rG   r    r?   F   s    r?   c                       sR  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d d! Zed"d# Zd2d%d&Zd'd( Zd3d*d+Zd,d- Zd.d/ Zd0d1 Z   Z!S )4
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	ultraboldZblack)ZitalicrV   Zoblique)ZSansZRomanZScriptZ
DecorativeZModernZCourierZcourierc                    s`   t jddddddd t   tdt|  | | _|	 | _
|| _i | _|| _d	| _d	S )
z)Initialise a wxWindows renderer instance.z2.0r%   Zbackendz
the futureZwxaggz7See the Matplotlib usage FAQ for more info on backends.)namer   r   alternativeZaddendum%s - __init__()N)r   Zwarn_deprecatedrB   rC   _logdebugtypeZGetWidthwidthZ	GetHeightheightbitmapfontddpigc)r   r`   rb   rG   r   r    rC      s   



zRendererWx.__init__c                 C   r   NTr   r   r   r   r    flipy   s   zRendererWx.flipyc                 C   r   rd   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_mathrc   new_gcgfx_ctxget_wx_fontSetFontr%   BLACKZGetFullTextExtent)r   spropismathrc   ri   fontwhZdescentZleadingr   r   r    get_text_width_height_descent   s   



z(RendererWx.get_text_width_height_descentc                 C   s   | j | jfS r#   )r^   r_   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            )get_clip_rectangleboundsri   _lastcliprectZ	ResetClipZClipr_   )r   rc   Z
new_boundsri   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
CreatePathZiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)ri   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              )selectr|   ri   r   Zscale	translater_   r   ZSetBrushr%   ZBrushget_wxcolourZDrawPathZ
StrokePathunselect)r   rc   r}   r~   ZrgbFaceri   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   rx   )ry   rz   r^   r_   shaper%   BitmapFromBufferRGBAtobytesr   ri   
DrawBitmapintr   )r   rc   xyZimbboxlbrq   rr   ZrowsZcolsr`   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()r   )r   rg   r[   r\   r]   r   r|   ri   rj   r   get_rgbrk   rs   r   ZDrawTextmathZradiansZsinZcosZDrawRotatedTextr   )r   rc   r   r   rm   rn   Zanglero   Zmtextri   rp   colorrq   rr   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())r[   r\   r]   GraphicsContextWxr`   rc   r   r   r   r   r   r    rh     s
   

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur|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	pointSizeZfamilyr9   Zweight)r[   r\   r]   hashra   getpoints_to_pixelsZget_size_in_pointsr%   ZFontr   	fontnamesZget_nameZROMAN
fontanglesZ	get_stylefontweightsZ
get_weight)r   rm   rn   keyrp   sizer   r   r    rj     s   
zRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)PIXELS_PER_INCHrb   )r   r   r   r   r    r   *  s   zRendererWx.points_to_pixelsr#   )FN)"r2   r3   r4   rP   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   rC   re   rf   rs   rt   r|   staticmethodr   r   r   r   rh   rj   r   rQ   r   r   rG   r    rR   Y   s    	





rR   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 r4t }|	| tj
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNrl   rv   )rB   rC   r[   r\   r]   _cacher   r%   ZMemoryDCSelectObjectZGraphicsContextZCreater{   r`   dcri   PenZSOLID_penSetPenrenderer)r   r`   r   r   ri   rG   r   r    rC   G  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   r   r`   
IsSelectedr   r   r   r    r   [     

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    r   a  r   zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())r[   r\   r]   r   rB   set_foregroundr   Z	SetColourr   r   ri   r   r   )r   fgZisRGBArG   r   r    r   g  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   rv   )floatr[   r\   r]   r   rB   set_linewidthr   r   r   Z
_linewidthr   ZSetWidthri   r   r   )r   rq   ZlwrG   r   r    r   v  s   zGraphicsContextWx.set_linewidthc                    R   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())r[   r\   r]   r   rB   set_capstyler   ZSetCapr   _capdZ	_capstyleri   r   r   )r   csrG   r   r    r        zGraphicsContextWx.set_capstylec                    r   )Nz%s - set_joinstyle())r[   r\   r]   r   rB   set_joinstyler   ZSetJoinr   _joindZ
_joinstyleri   r   r   )r   ZjsrG   r   r    r     r   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>  s    z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)r[   r\   r]   r%   ZColour)r   r   r   r   r    r     s   zGraphicsContextWx.get_wxcolourr#   )r2   r3   r4   rP   r%   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr   weakrefWeakKeyDictionaryr   rC   r   r   r   r   r   r   r   rQ   r   r   rG   r    r   /  s&    		r   c                       s  e Zd ZdZdZe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j-d(ej.d)ej/d*ej0d+ej1d,ej2d-ej3d.ej4d/ej5d0ej6dej7dej8d	ej9d
ej:dej;d ej<d!ej=dej>dej?dej@diZAdjd2d3ZBdjd4d5ZCd6d7 ZDd8d9 ZEdkd;d<ZFdjd=d>ZGd?d@ ZHeIJdAdBdldDdEZKi eLjMdFdGdGdHdIdJdJdKdLZM fdMdNZNdOdP ZOdQdR ZPdSdT ZQdUdV ZRdWdX ZSdYdZ ZTdmd\d]ZUd^d_ ZVd`da ZWdbdc ZXddde ZYdfdg ZZdhdi Z[  Z\S )n_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%   controlshiftaltZ	caps_lockleftZ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+-*/Z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   rC   mapr   ceilfigurer   r   r%   PanelSizer   r`   r[   r\   r]   _isDrawn_rubberband_rectBindZEVT_SIZE_onSizeZ	EVT_PAINT_onPaintZEVT_CHAR_HOOK
_onKeyDownZ
EVT_KEY_UP_onKeyUpEVT_LEFT_DOWN_onMouseButtonZ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_onMouseWheelZ
EVT_MOTION	_onMotionZEVT_LEAVE_WINDOW_onLeaveZEVT_ENTER_WINDOW_onEnterZEVT_MOUSE_CAPTURE_CHANGED_onCaptureLostZEVT_MOUSE_CAPTURE_LOSTZSetBackgroundStyleZBG_STYLE_PAINTZSetBackgroundColourZWHITE)r   r7   idr   rq   rr   r   r   r    rC     sD   	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	SetBitmapr`   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)r[   r\   r]   r   Refreshr   r   r   r    	draw_idle#  s   z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r#   )r%   ZYieldr   r   r   r    flush_events,  ru   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_ANYrI   r   r   Z	EVT_TIMERstop_event_loopZGetIdZGUIEventLoopr   ZRunrK   )r   ZtimeoutZtimerr   r   r    start_event_loop0  s   


z$_FigureCanvasWxBase.start_event_loopc                 C   s*   t | dr| j r| j  | `d S d S )Nr   )r  r   rN   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||
|
f }||	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   M  s    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_filetypesZ	wildcards
extensionsfilter_indexirX   extsZext_listZwildcardr   r   r    _get_imagesave_wildcardsD  s   

z,_FigureCanvasWxBase._get_imagesave_wildcards3.4originWXc              	   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rb| j\}}}}|||||f||||f||||f||||fgtddtj dS 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   rl   rv   )r[   r\   r]   ZIsShownOnScreenr%   ZClientDCPlatform
isinstancer   Z_cachedRendererrR   r`   ConvertToImageZConvertToBitmapr   r   ZDrawLineListr   ZPENSTYLE_SHORT_DASH)r   drawDCr  bmpx0y0x1y1r   r   r    gui_repaintV  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                    s0   t  j|g|R i | | jr|   d S d S r#   )rB   print_figurer   draw)r   filenamerE   rF   rG   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 - _onPaint()r  N)	r[   r\   r]   r%   ZPaintDCr   r#  r!  r<   )r   r   r  r   r   r    r     s   
z_FigureCanvasWxBase._onPaintc                 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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 - _onSize()_widthNFrv   )Zforwardr   )r[   r\   r]   	GetParentGetSizerZGetItemZ
ProportionFlagr%   EXPANDZ
GetMinSizeZGetClientSizeZIncTogetattrr&  Z_heightr   r   r`   r   rb   Zset_size_inchesr   r   Zresize_event)r   r   Zszsir   ZdpivalZwinchZhinchr   r   r    r     s,   



z_FigureCanvasWxBase._onSizec                 C   s   |j }|| jv r| j| }n|dk rt|}| s| }nd }|jddg|jddg|jddgfD ]\}}}| rL||krL|dkrF| sLd||}q2|S )N   Zctrlr   r   r   z{0}+{1})	ZKeyCodekeyvaldchrZ	ShiftDownlowerZControlDownZAltDownisupperformat)r   r   Zkeyvalr   ZmethprefixZkey_namer   r   r    _get_key  s$   



z_FigureCanvasWxBase._get_keyc                 C   .   |  |}tj| ||d | r|  dS dS )zCapture key press.guiEventN)r4  r   Zkey_press_eventSkipr   r   r   r   r   r    r     
   
z_FigureCanvasWxBase._onKeyDownc                 C   r5  )zRelease key.r6  N)r4  r   Zkey_release_eventr8  r9  r   r   r    r     r:  z_FigureCanvasWxBase._onKeyUpc                 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   r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Z	SetCursorZUpdater   r;  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   Zcapturer   r   r    _set_capture  s
   z _FigureCanvasWxBase._set_capturec                 C   s   |  d dS )zCapture changed or lostFN)r>  r  r   r   r    r     s   z"_FigureCanvasWxBase._onCaptureLostc              
   C   s   |   | | p|  |j}| jjj|j }t	j
tjt	jtjt	jtjt	jtjt	jtji}| }|||}| rI| j||||d dS | rY| j|||d|d dS | rh| j||||d dS dS )Start measuring on an axis.r6  T)Zdblclickr7  N)r8  r>  Z
ButtonDownZButtonDClickXr   r   r_   Yr%   ZMOUSE_BTN_LEFTr   LEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTZRIGHTZMOUSE_BTN_AUX1ZBACKZMOUSE_BTN_AUX2ZFORWARDZ	GetButtonr   Zbutton_press_eventZButtonUpZbutton_release_event)r   r   r   r   Z
button_mapZbuttonr   r   r    r     s*   
z"_FigureCanvasWxBase._onMouseButtonc                 C   s~   |  }| jjj|  }|j|j |j }|  t	j
dkr3t| ds(d| _n| jr0d| _dS d| _tj| ||||d dS )z3Translate mouse wheel events into matplotlib eventsZ	__WXMAC___skipwheeleventTFNr6  )GetXr   r   r_   GetYZLinesPerActionZWheelRotationZ
WheelDeltar8  r%   r  r  rC  r   Zscroll_event)r   r   r   r   stepr   r   r    r     s   

z!_FigureCanvasWxBase._onMouseWheelc                 C   s8   |  }| jjj|  }|  tj| |||d dS )r?  r6  N)rD  r   r   r_   rE  r8  r   Zmotion_notify_eventr   r   r   r   r   r   r    r   (  s   z_FigureCanvasWxBase._onMotionc                 C   s   |   tj| |d dS )zMouse has left the window.r6  N)r8  r   Zleave_notify_eventr  r   r   r    r   /  s   z_FigureCanvasWxBase._onLeavec                 C   s:   |  }| jjj|  }|  tj| |||fd dS )zMouse has entered the window.)r7  ZxyN)rD  r   r   r_   rE  r8  r   Zenter_notify_eventrG  r   r   r    r   4  s   z_FigureCanvasWxBase._onEnterr#   )r   )Nr  T)]r2   r3   r4   rP   Zrequired_interactive_frameworkr?   Z
_timer_clsr%   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_DELETEr.  rC   r   r   r   r  r  r  r   Zdelete_parameterr!  r   r  r"  r   r   r4  r   r   r=  r>  r   r   r   r   r   r   rQ   r   r   rG   r    r     s*   		
 !"#$%&'()*+,-./01234
<
1	


	
,
r   c                   @   s~   e Zd ZdddZe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)r[   r\   r]   rR   r`   r   rb   r   r#  r   r!  )r   r  r   r   r    r#  ?  s
   zFigureCanvasWx.drawc                 C   s   | j }tt| jjjt| jjj| _ t	| j | jj
}| }| j| | j }t|r:t|tjs:| }|||sGtd| || _ | jrQ|   | rY|   d S d S )NzCould not save figure to )r`   r%   r   r   r   r   r   r^   r_   rR   rb   rh   r#  r   Zis_writable_file_liker  Imager  ZSaveFiler  r   r   )r   Zfiletyper$  Z
origBitmapr   rc   imager   r   r    _print_imageJ  s(   

zFigureCanvasWx._print_imager#   )r2   r3   r4   r#  r   rL  	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    rI  <  s,    

$rI  c                       s\   e 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
 f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
|  | || _ttj|jj\}}| jt || | j  t t j| _| j| jdt jt jB t jB  t| j|| | _|  | _| jj r~t!"| jj  | jr~t!#| j | jd ur| j$  | j% \}}| j% \}}	| j&t || | j| jdt jt jB  | '| j | (  | j)d | *t j+| j, d S )	Nr     )r7   r   posrZ   rv   r   )rx   rx   )-r%   r  ZDefaultPositionZPointrB   rC   r[   r\   r]   num_set_frame_icon
get_canvascanvasr   r   r   r   r   SetInitialSizer   ZSetFocusBoxSizerVERTICALsizerAddZTOPrB  r*  FigureManagerWxfigmgr_get_toolbartoolbartoolmanagerr   Zadd_tools_to_managerZadd_tools_to_containerRealizeZGetSizeZSetSizeSetSizerFitZ
SetMinSizer   	EVT_CLOSE_onClose)
r   rS  figrR  rq   rr   ZtwthfwZfhrG   r   r    rC   ~  s:   

 


zFigureFrameWx.__init__c                 C   s   | j jS r#   )r]  r`  r   r   r   r    r`    s   zFigureFrameWx.toolmanagerc                 C   sB   t jd dkrt| j}|S t jd dkrt| j| }|S d }|S )Nr_  Ztoolbar2r`  )mplrcParamsNavigationToolbar2WxrV  	ToolbarWxr`  )r   r_  r   r   r    r^    s   
zFigureFrameWx._get_toolbarc                 C   s   t | d|S NrQ  )rI  )r   rf  r   r   r    rU    s   zFigureFrameWx.get_canvasc                 C   s   t dt|  | jS )Nz%s - get_figure_manager())r[   r\   r]   r]  r   r   r   r    get_figure_manager  s   z FigureFrameWx.get_figure_managerc                 C   sD   t dt|  | j  | j  d | j_t	| j |
  d S )Nz%s - onClose())r[   r\   r]   rV  Zclose_eventr  r]  framer   destroyr8  r  r   r   r    re    s   

zFigureFrameWx._onClosec                 C   s   | j S )z=Override wxFrame::GetToolBar as we don't have managed toolbar)r_  r   r   r   r    
GetToolBar  s   zFigureFrameWx.GetToolBarc                    sJ   z
| j | jj W n	 ty   Y nw | r#|  s#t j|i | dS rd   )rV  Zmpl_disconnectr_  Z_id_dragAttributeErrorZIsBeingDeletedrB   r<   rD   rG   r   r    r<     s   zFigureFrameWx.Destroy)r2   r3   r4   rC   r6   r`  r^  rU  rn  re  rq  r<   rQ   r   r   rG   r    rO  }  s    0
	rO  c                       sj   e Zd ZdZ fddZedd Zej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|  | | _| _d| _t || d| _d S )NrZ   TF)r[   r\   r]   ro  window_initializingrB   rC   )r   rV  rS  ro  rG   r   r    rC     s
   
zFigureManagerWx.__init__c                 C   
   | j  S r#   )ro  rq  r   r   r   r    r_       
zFigureManagerWx.toolbarc                 C   s   | j stdd S )Nzcan't set attribute)rt  rr  )r   valuer   r   r    r_    s   c                 C   s0   | j   | j  tjd r| j   d S d S )Nzfigure.raise_window)ro  ShowrV  r#  ri  rj  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())r[   r\   r]   ro  r%   Z	CallAfterr   )r   rE   ro  r   r   r    rp  
  s
   zFigureManagerWx.destroyc                 C   s   | j | j    d S r#   )ro  ZShowFullScreenZIsFullScreenr   r   r   r    full_screen_toggle  s   z"FigureManagerWx.full_screen_togglec                 C   ru  r#   )rs  ZGetTitler   r   r   r    get_window_title  rv  z FigureManagerWx.get_window_titlec                 C      | j | d S r#   )rs  ZSetTitle)r   titler   r   r    set_window_title  s   z FigureManagerWx.set_window_titlec                 C   s6   | j tt|t| | j | j d S r#   )	rV  rW  r%   r   r   r   rs  r(  rc  )r   r^   r_   r   r   r    resize  s   zFigureManagerWx.resize)r2   r3   r4   rP   rC   r6   r_  setterrz  rp  r{  r|  r  r  rQ   r   r   rG   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)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
IconBundleZIconr  IsOkZAddIconZSetIcons)ro  ZbundlerK  Ziconr   r   r    rT  .  s   rT  c                       sx   e Zd ZdddZedd Zed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 )rk  Tc              	   C   s   t j| | 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rm|   t | | _| | j |   t| | d S )NrQ  ZwxMac)   r  z.png)PanZoom)r`   ZbmpDisabledlabelZ	shortHelpkindr   )r%   ToolBarrC   r'  ZPlatformInfoZSetToolBitmapSizewx_idsZ	toolitemsZAddSeparatorZAddTool_iconr   
ITEM_CHECKITEM_NORMALIdr   EVT_TOOLr+  _coordinatesAddStretchableSpace
StaticText_label_text
AddControlra  r   )r   rV  ZcoordinatestextZtooltip_text
image_filecallbackr   r   r    rC   9  s8   

	zNavigationToolbar2Wx.__init__c                 C   s  t tjtd| }z	tj	 
 }W n? tyU   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 |r~t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?.Nrw   r   rQ  )Zaxisrv   )npZarrayPILrJ  openr   r  r%   ZSystemSettingsZGetAppearanceZIsDarkrr  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTZredZgreenZblueallZRedZGreenZBluer   r   r   r   )rX   rK  Zdarkbgr   Zbg_lumZfg_lumZ
black_maskr   r   r    r  Y  s"   """zNavigationToolbar2Wx._iconr  c                 C   s   t | j|d|S rm  )r]   rV  )r   ro  rf  r   r   r    rU  r  s   zNavigationToolbar2Wx.get_canvasc                    .   | j d }| || |  t j|  d S )Nr  )r  
ToggleToolGetToolStaterB   zoomr   rE   toolrG   r   r    r  v     
zNavigationToolbar2Wx.zoomc                    r  )Nr  )r  r  r  rB   panr  rG   r   r    r  {  r  zNavigationToolbar2Wx.panc              
   G   s,  | 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t||d W d S  ty }
 ztt|
 W Y d }
~
d S d }
~
ww d S )NzSave to filezsavefig.directoryz%s - Save file path: %srv   zDextension %s did not match the selected image type %s; going with %s)r2  )rV  r  Zget_default_filenamer%   Z
FileDialogr'  ri  rj  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexr;   ID_OKpathlibr   ZGetPathr[   r\   r]   ZGetFilterIndexsuffixZget_supported_filetypesZwarningr  r7   r   Zsavefig	Exceptionr>   )r   rE   r  r  r  Zdefault_fileZdlgr}   Zfmtr  er   r   r    save_figure  s6   




z NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j   d S r#   )rV  r   r   r_   r   r   )r   r   r  r  r  r   r_   r   r   r    draw_rubberband  s   z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r#   )rV  r   r   r   r   r   r    remove_rubberband  s   z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S d S r#   )r  r  SetLabelr   rm   r   r   r    set_message  s   z NavigationToolbar2Wx.set_messagec                 C   sd   | j jdk}| j jt| j jd k }d| jv r | | jd | d| jv r0| | jd | d S d S )Nr   rv   ZBackZ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_buttonsrH  )r2   r3   r4   rC   r   r  r   r5   rU  r  r  r  r  r  r  r  rQ   r   r   rG   r    rk  8  s    
 

rk  c                   @   sB   e Zd ZejfddZdd Zdd Zdd Zd	d
 Z	dd Z
dS )rl  c                 C   sR   t | | tjj| |d|d |  | _t| | _| | j i | _	i | _
d S )NrQ  )r9   )r   rC   r%   r  r  _spacer  r  r  
_toolitems_groups)r   r`  r7   r9   r   r   r    rC     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   rR  r   r  r   r    r     s    
z+ToolbarWx._get_tool_pos.<locals>.<listcomp>)range
ToolsCount)r   r  rR  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   rv   rQ  r   
   r   r  c                    s      d S r#   )Ztrigger_tool)r   rX   r   r   r    handler  rM   z'ToolbarWx.add_toolitem.<locals>.handler)r  ZInsertSeparatorr  r  r   r  r  r  indexrk  r  r%   r  r  Z
InsertToolr   ZGetTextExtentZToggleButtonButtonZInsertControlra  r   r  r   r  
setdefaultr  )r   rX   groupZpositionr  descriptionZ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   rX   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   rX   r  r  r   r   r    remove_toolitem  s   zToolbarWx.remove_toolitemc                 C   r}  r#   )r  r  r  r   r   r    r    s   zToolbarWx.set_messageN)r2   r3   r4   r%   ZTB_HORIZONTALrC   r  r  r  r  r  r   r   r   r    rl    s    	-
rl  c                   @      e Zd Zdd ZdS )ConfigureSubplotsWxc                 G      t |   d S r#   )rk  Zconfigure_subplots"_make_classic_style_pseudo_toolbarr   rE   r   r   r    trigger     zConfigureSubplotsWx.triggerNr2   r3   r4   r  r   r   r   r    r  
      r  c                   @   r  )SaveFigureWxc                 G   r  r#   )rk  r  r  r  r   r   r    r    r  zSaveFigureWx.triggerNr  r   r   r   r    r    r  r  r"   ZToolSetCursor)rY   c                   @   r  )SetCursorWxc                 C   s   t |  | d S r#   )rk  r=  r  r<  r   r   r    r=    s   zSetCursorWx.set_cursorN)r2   r3   r4   r=  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#   )rk  r  r  )r   r  r  r  r   r   r   r    r    s   zRubberbandWx.draw_rubberbandc                 C   r  r#   )rk  r  r  r   r   r   r    r  "  r  zRubberbandWx.remove_rubberbandN)r2   r3   r4   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	ShortcutsZDescription)rS      rU   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)r~  r9   r   rw         r  )rB   rC   r%   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERrX  rY  ZFlexGridSizerZGetFontZMakeBoldr  headerszipwidthsr  rk   ZWrapr[  ZALLr  r  ZALIGN_CENTER_HORIZONTALrb  rc  ZLayoutr   rd  OnCloseZ
EVT_BUTTON)r   r7   help_entriesrZ  Z
grid_sizerrW   rrowcolr^   r  r:   rG   r   r    rC   ,  s,   





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r#   )r  	_instanceZDestroyLaterr8  r  r   r   r    r  E  s   z_HelpDialog.OnClosec                 C   s.   | j r
| j   d S | ||| _ | j   d S r#   )r  ry  rx  )clsr7   r  r   r   r    rz  J  s
   
z_HelpDialog.show)r2   r3   r4   r  r  r  rC   r  classmethodrz  rQ   r   r   rG   r    r  '  s    r  c                   @   r  )HelpWxc                 G   s   t | jj |   d S r#   )r  rz  r   rV  ZGetTopLevelParentZ_get_help_entriesr  r   r   r    r  U  s   zHelpWx.triggerNr  r   r   r   r    r  T  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#   )rV  r   r#  r`   r  r%   r   r   r   r   r   rD   r   r   r    r  [  s   
zToolCopyToClipboardWx.triggerNr  r   r   r   r    r  Z  r  r  c                       sD   e Zd ZeZeZeZe	 fddZ
e	dd Zedd Z  ZS )
_BackendWxc                    sL   t  }|d u rt d}|d t  |t_t j	|g|R i |S )NFT)
r%   GetAppAppZSetExitOnFrameDeleter   Z_setup_new_guiappr  Z	_theWxApprB   new_figure_manager)r  rS  rE   rF   wxapprG   r   r    r  s  s   

z_BackendWx.new_figure_managerc                 C   s4   |  ||}| }t r|j  |j  |S r#   )_frame_classrn  ri  Zis_interactivero  rx  rV  r   )r  rS  r   ro  r]  r   r   r    new_figure_manager_given_figure  s   

z*_BackendWx.new_figure_manager_given_figurec                  C   s.   t j st  } | d ur|   d S d S d S r#   )r%   r  ZIsMainLoopRunningr  ZMainLoop)r  r   r   r    mainloop  s   
z_BackendWx.mainloop)r2   r3   r4   rI  ZFigureCanvasr\  ZFigureManagerrO  r  r  r  r  r   r  rQ   r   r   rG   r    r  m  s    
r  r#   )SrP   rM  Zloggingr   r  r   r   Znumpyr  r  Z
matplotlibri  Zmatplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.backend_managersr   Zmatplotlib.figurer   Zmatplotlib.pathr   Zmatplotlib.transformsr   Zmatplotlib.widgetsr   r%   Z	getLoggerr2   r[   r   Zcaching_module_getattrr   r>   r?   rR   r   r   r   rI  ZFramerO  r\  r  rT  r  rk  rl  ZConfigureSubplotsBaser  ZSaveFigureBaser  r5   ZSetCursorBaser  ZRubberbandBaser  ZDialogr  ZToolHelpBaser  ZToolCopyToClipboardBaser  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZexportr  r   r   r   r    <module>   sl    	4

 Wn   "AeD
}U
-