U
    FvfÿÈ  ã                   @   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 *d	¡d:d
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 d0d1„ d1ejAƒƒZBG d2d3„ d3e%jCƒZDe <e2¡G d4d5„ d5ejEƒƒZFe <e2¡G d6d7„ d7ejGƒƒZHe:e6_Ie;e6_JejKG d8d9„ d9eƒƒZLd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ÚFigureCanvasBaseÚFigureManagerBaseÚGraphicsContextBaseÚMouseButtonÚNavigationToolbar2ÚRendererBaseÚ	TimerBaseÚToolContainerBaseÚcursorsÚ
CloseEventÚKeyEventÚLocationEventÚ
MouseEventÚResizeEvent)Ú_apiÚcbookÚbackend_tools)ÚGcf)ÚPath)ÚAffine2DéK   ú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)ÚwxÚMessageDialogÚOKZCENTREÚ	ShowModalÚDestroy)Úmsgr   Údialog© r$   úB/tmp/pip-unpacked-wheel-7vhvci0g/matplotlib/backends/backend_wx.pyÚerror_msg_wx*   s    
ýr&   é   c                  C   s    t  d¡} |  d¡ t ¡  | S )NFT)r   ÚAppZSetExitOnFrameDeleter   Z_setup_new_guiapp)Úwxappr$   r$   r%   Ú_create_wxapp7   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||Ž d S ©N)r   ÚTimerÚ_timerZ	_on_timerZNotifyÚsuperÚ__init__©ÚselfÚargsÚkwargs©Ú	__class__r$   r%   r0   B   s    

zTimerWx.__init__c                 C   s   | j  | j| j¡ d S r,   )r.   ÚStartZ	_intervalZ_single©r2   r$   r$   r%   Ú_timer_startG   s    zTimerWx._timer_startc                 C   s   | j  ¡  d S r,   )r.   ÚStopr8   r$   r$   r%   Ú_timer_stopJ   s    zTimerWx._timer_stopc                 C   s   | j  ¡ r|  ¡  d S r,   )r.   Ú	IsRunningr9   r8   r$   r$   r%   Ú_timer_set_intervalM   s    
zTimerWx._timer_set_interval)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r9   r;   r=   Ú__classcell__r$   r$   r5   r%   r+   ?   s
   r+   z2.0r   Úbackendz
the futureZwxaggz7See the Matplotlib usage FAQ for more info on backends.)ÚnameZobj_typeZ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	ultraboldZblack)ZitalicrK   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/   r0   Ú_logÚdebugÚtypeZGetWidthÚwidthZ	GetHeightÚheightÚbitmapÚfontdÚdpiÚgc)r2   rS   rU   r5   r$   r%   r0   Š   s    


zRendererWx.__init__c                 C   s   dS ©NTr$   r8   r$   r$   r%   Úflipy•   s    zRendererWx.flipyr   c                 C   s   dS rW   r$   r8   r$   r$   r%   Úoffset_text_height™   s    zRendererWx.offset_text_heightc                 C   sd   |rt  |¡}| jd kr"|  ¡ }n| j}|j}|  ||¡}| |tj¡ | 	|¡\}}}	}
|||	fS r,   )
r   Ú
strip_mathrV   Únew_gcÚgfx_ctxÚget_wx_fontÚSetFontr   ÚBLACKZGetFullTextExtent)r2   ÚsÚpropÚismathrV   r\   Ú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,   )rQ   rR   r8   r$   r$   r%   Úget_canvas_width_height®   s    z"RendererWx.get_canvas_width_heightc                 C   sp   |  ¡ }|d k	r|j}|j}|j|krl||_|d kr>| ¡  n.| |d | j|d  |d  |d |d ¡ d S )Nr   r'   é   é   )Úget_clip_rectangleÚboundsr\   Ú_lastcliprectZ	ResetClipZCliprR   )r2   rV   Z
new_boundsr\   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
CreatePathZiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)r\   ÚpathÚ	transformÚwxpathÚpointsÚcoder$   r$   r%   Úconvert_pathÀ   s    





zRendererWx.convert_pathNc                 C   s‚   |  ¡  |  |¡ |j}|tƒ  dd¡ d| j¡ }|  |||¡}|d k	rl| t	 
| |¡¡¡ | |¡ n
| |¡ | ¡  d S )Ng      ð?g      ð¿ç        )Úselectrn   r\   r   ZscaleÚ	translaterR   rt   ZSetBrushr   ZBrushÚget_wxcolourZDrawPathZ
StrokePathÚunselect)r2   rV   ro   rp   ZrgbFacer\   rq   r$   r$   r%   Ú	draw_pathÐ   s    
ÿ
zRendererWx.draw_pathc                 C   sš   |  ¡ }|d k	r |j\}}}}	nd}d}| j}| j}	|jd d… \}
}tj ||
| ¡ ¡}| 	¡  |j
 |t|ƒt| j| ƒt|ƒt|	 ƒ¡ | ¡  d S )Nr   rj   )rk   rl   rQ   rR   Úshaper   ÚBitmapÚFromBufferRGBAÚtobytesrv   r\   Ú
DrawBitmapÚintry   )r2   rV   ÚxÚyZimÚbboxÚlÚbrd   re   ZrowsÚcolsrS   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()ru   )r   rZ   rN   rO   rP   rv   rn   r\   r]   rx   Úget_rgbr^   rg   r€   ZDrawTextÚmathÚradiansÚsinÚcosZDrawRotatedTextry   )r2   rV   r   r‚   r`   ra   Zanglerb   Úmtextr\   rc   Úcolorrd   re   Ú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())rN   rO   rP   ÚGraphicsContextWxrS   rV   rv   ry   r8   r$   r$   r%   r[     s
    

zRendererWx.new_gcc                 C   s†   t  dt| ƒ¡ t|ƒ}| j |¡}|dk	r0|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Úfamilyr   Zweight)rN   rO   rP   ÚhashrT   ÚgetÚpoints_to_pixelsZget_size_in_pointsr   ZFontÚroundÚ	fontnamesÚget_nameZROMANÚ
fontanglesZ	get_styleÚfontweightsZ
get_weight)r2   r`   ra   Úkeyrc   Úsizer$   r$   r%   r]     s    üzRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)ÚPIXELS_PER_INCHrU   )r2   rr   r$   r$   r%   r•   $  s    zRendererWx.points_to_pixels)N)FN)$r>   r?   r@   rA   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—   r0   rX   r   Ú
deprecatedrY   rg   rh   rn   Ústaticmethodrt   rz   r‡   r   r[   r]   r•   rB   r$   r$   r5   r%   rF   R   s^   îý
ù




rF   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 kr`t |¡}tj	 
|¡}d |_||f| j|< || _|| _|| _t ddtj¡| _| | j¡ || _d S )Nz%s - __init__(): %s)NNr_   r'   )r/   r0   rN   rO   rP   Ú_cacher”   r   ZMemoryDCZGraphicsContextZCreaterm   rS   Údcr\   ÚPenZSOLIDÚ_penÚSetPenÚrenderer)r2   rS   r¥   r¡   r\   r5   r$   r%   r0   A  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¡   ÚSelectObjectrS   Ú
IsSelectedr8   r$   r$   r%   rv   T  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ª   r8   r$   r$   r%   ry   Z  s    
zGraphicsContextWx.unselectNc                    sV   t  dt| ƒ¡ |  ¡  tƒ  ||¡ | j |  |  	¡ ¡¡ | j
 | j¡ |  ¡  d S )Nz%s - set_foreground())rN   rO   rP   rv   r/   Úset_foregroundr£   Z	SetColourrx   rˆ   r\   r¤   ry   )r2   ÚfgZisRGBAr5   r$   r%   r¬   `  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   r'   )ÚfloatrN   rO   rP   rv   r/   Úset_linewidthr€   r¥   r•   Z
_linewidthr£   ZSetWidthr\   r¤   ry   )r2   rd   Zlwr5   r$   r%   r¯   o  s    zGraphicsContextWx.set_linewidthc                    sR   t  dt| ƒ¡ |  ¡  tƒ  |¡ | j tj	| j
 ¡ | j | j¡ |  ¡  d S )Nz%s - set_capstyle())rN   rO   rP   rv   r/   Úset_capstyler£   ZSetCapr‘   Ú_capdZ	_capstyler\   r¤   ry   )r2   Úcsr5   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())rN   rO   rP   rv   r/   Úset_joinstyler£   ZSetJoinr‘   Ú_joindZ
_joinstyler\   r¤   ry   )r2   Zjsr5   r$   r%   r³   ‡  s    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 )éÿ   )r€   )Ú.0r   r$   r$   r%   Ú
<listcomp>“  s     z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)rN   rO   rP   r   ZColour)r2   rŽ   r$   r$   r%   rx     s    zGraphicsContextWx.get_wxcolour)N)r>   r?   r@   rA   r   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr±   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr´   ÚweakrefÚWeakKeyDictionaryr    r0   rv   ry   r¬   r¯   r°   r³   rx   rB   r$   r$   r5   r%   r‘   )  s$   þþ		r‘   c                r       s~  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i9ZDdnd4d5„ZEdod6d7„ZFd8d9„ ZGd:d;„ ZHdpd=d>„ZIdqd?d@„ZJdAdB„ ZKdrdCdD„ZLeMjNdEdFdFdGdHdIdIdJdKœ–ZN‡ fdLdM„ZOdNdO„ ZPdPdQ„ ZQeRdsd3dRœdSdT„ƒZSdUdV„ ZTdtdWdX„ZUdYdZ„ ZVd[d\„ ZWd]d^„ ZXdud`da„ZYdbdc„ ZZddde„ Z[dfdg„ Z\dhdi„ Z]djdk„ Z^dldm„ Z_‡  Z`S )vÚ_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>¢  ó    z_FigureCanvasWxBase.<lambda>Ú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ú+ú-Ú*ú/Ú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:%dFNr_   r'   ÚWHITE)?r   r0   Úmapr‰   ÚceilÚfigurerƒ   rœ   r   ÚPanelÚSizer|   rS   rN   rO   rP   Ú_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Ü   )r2   r   Úidrß   rd   re   r$   r$   r%   r0   à  sH    	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	SetBitmaprS   ÚTheClipboardZIsOpenedÚOpenÚSetDataÚCloseZFlush)r2   Ú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)rN   rO   rP   râ   ÚRefreshr8   r$   r$   r%   Ú	draw_idle  s    z_FigureCanvasWxBase.draw_idlec                 C   s   t  ¡  d S r,   )r   ZYieldr8   r$   r$   r%   Úflush_events(  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   r-   ZID_ANYr7   r€   ræ   Z	EVT_TIMERÚstop_event_loopZGetIdZGUIEventLooprþ   ZRunr:   )r2   ÚtimeoutZtimerr$   r$   r%   Ústart_event_loop,  s    


z$_FigureCanvasWxBase.start_event_loopc                 C   s&   t | dƒr"| j ¡ r| j ¡  | `d S )Nrþ   )r   rþ   r<   ZExit©r2   rø   r$   r$   r%   r  9  s    


z#_FigureCanvasWxBase.stop_event_loopc                 C   s˜   |   ¡ }|  ¡ }t| ¡ ƒ}g }g }d}t|ƒD ]R\}\}}	d dd„ |	D ƒ¡}
| |	d ¡ d||
|
f }||	k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·   I  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)r2   Zdefault_filetypeÚ	filetypesZsorted_filetypesÚ	wildcardsÚ
extensionsÚfilter_indexÚirD   ÚextsZext_listZwildcardr$   r$   r%   Ú_get_imagesave_wildcards@  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k	rÒtt| jƒ\}}}}||||f||||f||||f||||fg}| || j¡ | || 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   )rN   rO   rP   ZIsShownOnScreenr   ZClientDCÚPlatformÚ
isinstancerß   ÚcanvasZget_rendererrF   rS   ÚConvertToImageZConvertToBitmapr   rã   rÝ   r–   ZDrawLineListrå   rä   )r2   ÚdrawDCÚbmpÚx0Úy0Úx1Úy1Zrectr$   r$   r%   Úgui_repaintR  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|f|ž|Ž | jr"|  ¡  d S r,   )r/   Úprint_figurerâ   Údraw)r2   Úfilenamer3   r4   r5   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()©r  N)	rN   rO   rP   r   ZPaintDCrâ   r"  r   r!   )r2   rø   r  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r„dS |\| _| _d| _| jdksª| jdkr®d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'   )Zforwardrú   Zresize_event)rN   rO   rP   Ú	GetParentÚGetSizerZGetItemZ
ProportionÚFlagr   ZEXPANDZ
GetMinSizeZGetClientSizeZIncToÚgetattrr%  Z_heightrâ   r|   rS   rß   rU   Zset_size_inchesrû   r   Ú_processrü   )r2   rø   ÚszÚsirœ   ZdpivalZwinchZhinchr$   r$   r%   rç   Ž  s.    



z_FigureCanvasWxBase._on_size©Úexcludec                   s^   dt jt jfdt jt jfdt jt jfg}| d k	rL|  ¡ ‰‡ ‡fdd„|D ƒS dd„ |D ƒS d S )NZctrlrÁ   rÀ   c                    s&   g | ]\}}}ˆ|@ rˆ |kr|‘qS r$   r$   ©r¶   rD   Úmodr›   ©r.  Ú	modifiersr$   r%   r·   Ä  s     ÿz6_FigureCanvasWxBase._mpl_modifiers.<locals>.<listcomp>c                 S   s    g | ]\}}}t  |¡r|‘qS r$   )r   ZGetKeyStater/  r$   r$   r%   r·   Ç  s    
ÿ)r   ZMOD_CONTROLÚWXK_CONTROLZMOD_ALTÚWXK_ALTZ	MOD_SHIFTÚ	WXK_SHIFTZGetModifiers)rø   r.  Z	mod_tabler$   r1  r%   Ú_mpl_modifiers»  s    ýz"_FigureCanvasWxBase._mpl_modifiersc                 C   sz   |j }|| jkr| j| }n&|dk r>t|ƒ}| ¡ sB| ¡ }nd S | j||d}d|krj| ¡ rj| d¡ d ||f•¡S )Né   r-  rÀ   rÖ   )	ZKeyCodeÚkeyvaldÚchrZ	ShiftDownÚlowerr6  ÚisupperÚremover  )r2   rø   Úkeyvalr›   Zmodsr$   r$   r%   Ú_get_keyÊ  s    


z_FigureCanvasWxBase._get_keyc                 C   sF   |dk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ƒ   rR   )r2   Úposr   r‚   r$   r$   r%   Ú_mpl_coordsÛ  s
    z_FigureCanvasWxBase._mpl_coordsc                 C   s6   t d| |  |¡f|  ¡ žd|iŽ ¡  | r2| ¡  dS )zCapture key press.Zkey_press_eventÚguiEventN©r   r>  rB  r*  ÚSkipr  r$   r$   r%   ré   è  s    ÿÿþ
z _FigureCanvasWxBase._on_key_downc                 C   s6   t d| |  |¡f|  ¡ žd|iŽ ¡  | r2| ¡  dS )zRelease key.Zkey_release_eventrC  NrD  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   ZMOVEZCURSOR_HANDZHANDÚPOINTERZCURSOR_ARROWZSELECT_REGIONZCURSOR_CROSSZWAITZCURSOR_WAITZRESIZE_HORIZONTALZCURSOR_SIZEWEZRESIZE_VERTICALZCURSOR_SIZENSZ	SetCursorrû   )r2   rF  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)r2   Úcapturer$   r$   r%   Ú_set_capture  s    z _FigureCanvasWxBase._set_capturec                 C   s   |   d¡ dS )zCapture changed or lostFN)rK  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}| ¡ }| ||¡}|  |¡}| ¡ rštd| |||||d ¡  nH| ¡ rÀtd| |||d||d ¡  n"| ¡ râtd| |||||d ¡  dS )úStart measuring on an axis.Zbutton_press_event©r2  rC  T)Zdblclickr2  rC  Zbutton_release_eventN)rE  rK  Z
ButtonDownZButtonDClickrB  r   ZMOUSE_BTN_LEFTr   ÚLEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTÚRIGHTZMOUSE_BTN_AUX1ÚBACKZMOUSE_BTN_AUX2ÚFORWARDZ	GetButtonr”   r6  r   r*  ZButtonUp)r2   rø   r   r‚   Z
button_mapÚbuttonr2  r$   r$   r%   rì     sB         û
 ÿ þ ÿz$_FigureCanvasWxBase._on_mouse_buttonc              	   C   s~   |   |¡\}}|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)Ústepr2  rC  )rB  ZLinesPerActionZWheelRotationZ
WheelDeltarE  r   r  r   rS  r   r6  r*  )r2   rø   r   r‚   rT  r$   r$   r%   rí   +  s    

þz#_FigureCanvasWxBase._on_mouse_wheelc                 C   s4   |  ¡  td| f|  |¡ž|  |¡|dœŽ ¡  dS )rL  Zmotion_notify_eventrM  N)rE  r   rB  r6  r*  r  r$   r$   r%   rî   ?  s    ÿýz_FigureCanvasWxBase._on_motionc                 C   s2   |  ¡  td| f|  |¡ž|  ¡ |dœŽ ¡  dS )zMouse has entered the window.Zfigure_enter_eventrM  N©rE  r   rB  r6  r*  r  r$   r$   r%   rï   G  s    ÿýz_FigureCanvasWxBase._on_enterc                 C   s2   |  ¡  td| f|  |¡ž|  ¡ |dœŽ ¡  dS )zMouse has left the window.Zfigure_leave_eventrM  NrU  r  r$   r$   r%   rð   O  s    ÿýz_FigureCanvasWxBase._on_leave)N)N)r   )N)N)N)N)T)ar>   r?   r@   rA   Zrequired_interactive_frameworkr+   Z
_timer_clsr   ZclasspropertyZmanager_classr   r3  r5  r4  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_DELETEr8  r0   rù   rü   rý   r  r  r  r   r   r  r!  rè   rç   rŸ   r6  r>  rB  ré   rê   rI  rK  rñ   rì   rí   rî   rï   rð   rB   r$   r$   r5   r%   rº   –  s4  	                                                         Ç<
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)rN   rO   rP   rF   rS   rß   rU   r¥   r"  râ   r   )r2   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 |¡rL| ¡ n|}| ||¡sjtd|› ƒ‚| jrx|  ¡  | r„|  ¡  d S )NzCould not save figure to )r   r|   r‰   rÞ   rß   rƒ   rQ   rR   r"  rF   rU   r   Zis_writable_file_liker  ZSaveFiler  râ   rû   )r2   Zfiletyper#  rS   Z	saved_objr$   r$   r%   Ú_print_imagef  s    ÿÿ
þzFigureCanvasWx._print_image)N)r>   r?   r@   r"  rW  Ú	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%   rV  X  s4   
 ÿ ÿ ÿ ÿ ÿ ÿrV  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 k	r`|| d|ƒ| _
ntjddd |  |¡| _
t| j
|| ƒ}| j
jj}|d k	r¤|  |¡ ttj|jjƒ\}}| j
 t  ||¡¡ | j
 d	¡ | j
 ¡  |  ¡  |  t j| j¡ d S )
Nr  é   éÿÿÿÿ)r   rò   rA  rM   r   zvThe canvas_class parameter will become required after the deprecation period starting in Matplotlib %(since)s elapses.)r   )rj   rj   )r   r  ZDefaultPositionZPointr/   r0   rN   rO   rP   Ú_set_frame_iconr  r   Zwarn_deprecatedÚ
get_canvasr»   ÚmanagerÚtoolbarZ
SetToolBarrÝ   r‰   rÞ   rƒ   rœ   ZSetInitialSizerá   Z
SetMinSizeZSetFocusÚFitræ   Ú	EVT_CLOSEÚ	_on_close)	r2   ÚnumÚfigr\  rA  ra  rb  rd   re   r5   r$   r%   r0   ‰  s.    
 ÿ


zFigureFrameWx.__init__r   zframe.GetSizer())rE   c                 C   s   |   ¡ S r,   )r'  r8   r$   r$   r%   r½   ²  r¾   zFigureFrameWx.<lambda>zframe.canvas.managerc                 C   s   | j jS r,   )r  ra  r8   r$   r$   r%   r½   ´  r¾   zframe.canvas.manager.numc                 C   s
   | j jjS r,   )r  ra  rf  r8   r$   r$   r%   r½   ¶  r¾   zframe.GetToolBar()c                 C   s   |   ¡ S r,   )Z
GetToolBarr8   r$   r$   r%   r½   ¸  r¾   z frame.canvas.manager.toolmanagerc                 C   s
   | j jjS r,   )r  ra  Útoolmanagerr8   r$   r$   r%   r½   »  r¾   z&the canvas_class constructor parameterc                 C   s   t | d|ƒS )Nr^  )rV  )r2   rg  r$   r$   r%   r`  ½  s    zFigureFrameWx.get_canvasc                 C   s   t  dt| ƒ¡ | jjS )Nz%s - get_figure_manager())rN   rO   rP   r  ra  r8   r$   r$   r%   Úget_figure_managerÂ  s    z FigureFrameWx.get_figure_managerc                 C   sz   t  dt| ƒ¡ td| jƒ ¡  | j ¡  d | jj_t	 
| jj¡ z| j | jjj¡ W n tk
rl   Y nX | ¡  d S )Nz%s - on_close()Zclose_event)rN   rO   rP   r   r  r*  r  ra  Úframer   ÚdestroyZmpl_disconnectrb  Z_id_dragÚAttributeErrorrE  r  r$   r$   r%   re  Ç  s    

zFigureFrameWx._on_close)r>   r?   r@   r0   r   rž   ÚpropertyÚsizerZfigmgrrf  rb  rh  r`  ri  re  rB   r$   r$   r5   r%   rZ  ˆ  s6   (
ÿ
ÿ
ÿ
ÿ ÿ
þ ÿ

rZ  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 )NrM   )rN   rO   rP   rj  Úwindowr/   r0   )r2   r  rf  rj  r5   r$   r%   r0   ç  s    zFigureManagerWx.__init__c                 C   sD   t  ¡ ptƒ }t|||d}|jj}t ¡ r@|j 	¡  |j 
¡  |S )Nr[  )r   ÚGetAppr*   rZ  r  ra  ÚmplZis_interactiverj  ÚShowrü   )r¼   r\  rß   rf  r)   rj  ra  r$   r$   r%   Úcreate_with_canvasì  s    

z"FigureManagerWx.create_with_canvasc                 C   s&   t j ¡ s"t  ¡ }|d k	r"| ¡  d S r,   )r   r(   ZIsMainLoopRunningrp  ZMainLoop)r¼   r)   r$   r$   r%   Ústart_main_loop÷  s    
zFigureManagerWx.start_main_loopc                 C   s,   | j  ¡  | j ¡  tjd r(| j  ¡  d S )Nzfigure.raise_window)rj  rr  r  r"  rq  ÚrcParamsÚRaiser8   r$   r$   r%   Úshowþ  s    


zFigureManagerWx.showc                 G   s*   t  dt| ƒ¡ | j}|r&t |j¡ d S )Nz%s - destroy())rN   rO   rP   rj  r   Z	CallAfterr÷   )r2   r3   rj  r$   r$   r%   rk    s    zFigureManagerWx.destroyc                 C   s   | j  | j  ¡  ¡ d S r,   )rj  ZShowFullScreenZIsFullScreenr8   r$   r$   r%   Úfull_screen_toggle  s    z"FigureManagerWx.full_screen_togglec                 C   s
   | j  ¡ S r,   )ro  ZGetTitler8   r$   r$   r%   Úget_window_title  s    z FigureManagerWx.get_window_titlec                 C   s   | j  |¡ d S r,   )ro  ZSetTitle)r2   Útitler$   r$   r%   Úset_window_title  s    z FigureManagerWx.set_window_titlec              
   C   s,   | j  | j  t t |¡t |¡¡¡¡ d S r,   )ro  ZSetSizeZClientToWindowSizer   rá   r‰   rÞ   )r2   rQ   rR   r$   r$   r%   Úresize  s     ÿzFigureManagerWx.resize)r>   r?   r@   rA   r0   Úclassmethodrs  rt  rw  rk  rx  ry  r{  r|  rB   r$   r$   r5   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)rj  ZbundleÚimageZiconr$   r$   r%   r_  )  s    r_  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kr,|  d¡ i | _| jD ]x\}}}}|d krV|  ¡  q8| j	d|  
|› d¡t j|||dkr€t 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 )	Nr^  r…  ZwxMac)é   r†  z.png)ÚPanÚZoom)rS   ZbmpDisabledÚlabelZ	shortHelpÚkindrÿ   )r   ÚToolBarr0   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   )r2   r  Zcoordinatesr   ÚtextZtooltip_textÚ
image_fileÚcallbackr$   r$   r%   r0   4  s8    

 úÿ	ÿzNavigationToolbar2Wx.__init__c           	      C   s*  t j t d| ¡¡}t | d¡¡}ztj	 
¡  ¡ }W n€ tk
r¶   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X |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~  ZRGBAg‰A`åÐ"Ó?gbX9´Èâ?gÉv¾Ÿ/½?rµ   gš™™™™™É?.Nri   r   r^  )Zaxisr'   )ÚPILZImageÚopenr   r€  ÚnpÚarrayÚconvertr   ZSystemSettingsZGetAppearanceZIsDarkrl  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTZredZgreenZblueÚallZRedZGreenZBluer|   r}   r{   r~   )	rD   Zpilimgrƒ  ZdarkÚbgr­   Zbg_lumZfg_lumZ
black_maskr$   r$   r%   r  T  s&    """  ÿzNavigationToolbar2Wx._iconc                 C   sL   d| j kr$|  | j d | jjdk¡ d| j krH|  | j d | jjdk¡ d S )Nr‡  ZPANrˆ  ZZOOM)rŒ  Ú
ToggleToolÚmoderD   r8   r$   r$   r%   Ú_update_buttons_checkedo  s    

z,NavigationToolbar2Wx._update_buttons_checkedc                    s   t ƒ j|Ž  |  ¡  d S r,   )r/   Úzoomr¥  ©r2   r3   r5   r$   r%   r¦  u  s    zNavigationToolbar2Wx.zoomc                    s   t ƒ j|Ž  |  ¡  d S r,   )r/   Úpanr¥  r§  r5   r$   r%   r¨  y  s    zNavigationToolbar2Wx.panc              
   G   sD  | j  ¡ \}}}| j  ¡ }t | j  ¡ dtjd ||tjtj	B ¡}| 
|¡ | ¡ tjkr@t | ¡ ¡}t dt| ƒ|¡ || ¡  }|jdd … }	|	| j  ¡ krÀ||	krÀt d|	||	¡ |	}tjd rÚt|jƒtjd< z| j jj||d W nN tk
r> }
 z.tj| j  ¡ t|
ƒdd}| ¡  | ¡  W 5 d }
~
X Y nX 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   r   r   )r  r  Zget_default_filenamer   Ú
FileDialogr&  rq  ru  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexr    ÚID_OKÚpathlibr   ZGetPathrN   rO   rP   ZGetFilterIndexÚsuffixZget_supported_filetypesÚwarningr  r   rß   ZsavefigÚ	Exceptionr   r!   )r2   r3   r  r  r  Zdefault_filer#   ro   Úfmtr  Úer$   r$   r%   Úsave_figure}  sF    
   
ý
  þ
 þz NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j  ¡  d S r,   )r  rß   rƒ   rR   rã   rû   )r2   rø   r  r  r  r  rR   r$   r$   r%   Údraw_rubberbandž  s    z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j  ¡  d S r,   )r  rã   rû   r8   r$   r$   r%   Úremove_rubberband£  s    z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j |¡ d S r,   )r’  r–  ÚSetLabel©r2   r`   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kr@|  | jd |¡ d| jkr\|  | jd |¡ d S )Nr   r'   ÚBackÚForward)Z
_nav_stackÚ_posÚlenZ	_elementsrŒ  Z
EnableTool)r2   Zcan_backwardZcan_forwardr$   r$   r%   Úset_history_buttons«  s    

z(NavigationToolbar2Wx.set_history_buttons)T)r>   r?   r@   r   Ú	TB_BOTTOMr0   rŸ   r  r¥  r¦  r¨  r²  r³  r´  r·  r¼  rB   r$   r$   r5   r%   r„  3  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 kr|j  ¡ }t | |¡ tjj| |d|d |  ¡ | _tj| tj	d| _
|  | j
¡ i | _i | _d S )Nr^  r…  )r  r&  r
   r0   r   r‹  r“  Ú_spacer”  r•  r–  r—  Ú
_toolitemsÚ_groups)r2   rh  r   r   r$   r$   r%   r0   ·  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¶   rA  ©r2   Útoolr$   r%   r·   É  s    ÿz+ToolbarWx._get_tool_pos.<locals>.<listcomp>)ÚrangeÚ
ToolsCount)r2   rÄ  rA  r$   rÃ  r%   Ú_get_tool_posÂ  s    zToolbarWx._get_tool_posc              	      s‚  |ˆj kr"ˆ ˆ ˆj¡¡ˆj |< ˆj | }dd„ tˆjtˆjƒƒD ƒ}|dkr~||d kr`dnˆ || |¡d  ¡d }	nˆ |¡d }	|	| }
|rÐt	 
|¡}|s¬tjntj}ˆ |
dˆ |tj||pÊd¡}nPˆ ˆ ¡d d df}|rþt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   r'   r^  Ú é
   rÛ   ©r‰  c                    s   ˆ  ˆ ¡ d S r,   )Ztrigger_tool)rø   ©rD   r2   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  )r2   rD   ÚgroupÚ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 krd S | j | D ].\}}| ¡ s8|  |j|¡ q| ¡  |¡ q|  ¡  d S r,   )rÀ  Z	IsControlr£  r  Z
GetControlZSetValuerû   )r2   rD   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  )r2   rD   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)r>   r?   r@   r   r½  r0   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©r>   r?   r@   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Þ  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ß  )r2   r  r  r  r  r$   r$   r%   r³    s         ÿzRubberbandWx.draw_rubberbandc                 C   s   t  |  ¡ ¡ d S r,   )r„  r´  rß  r8   r$   r$   r%   r´     s    ÿzRubberbandWx.remove_rubberbandN)r>   r?   r@   r³  r´  r$   r$   r$   r%   rà    s   rà  c                       sD   e Zd ZdZdgZdddgZ‡ fdd„Zdd	„ Zed
d„ ƒZ	‡  Z
S )Ú_HelpDialogN)ÚActionZ	ShortcutsÚDescriptionrG   éŒ   rI   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)rz  r   r   ri   é   é   rË  )r/   r0   r   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERZBoxSizerZVERTICALZFlexGridSizerZGetFontZMakeBoldr  ÚheadersÚzipÚwidthsr”  r^   ZWrapZAddÚALLrÏ  r«  ZALIGN_CENTER_HORIZONTALZSetSizerrc  ZLayoutræ   rd  re  Z
EVT_BUTTON)r2   r   Úhelp_entriesrn  Z
grid_sizerrL   ÚrÚrowÚcolrQ   r‰  Úokr5   r$   r%   r0   *  s*    

ÿ



z_HelpDialog.__init__c                 C   s   d t _|  ¡  | ¡  d S r,   )rá  Ú	_instanceZDestroyLaterrE  r  r$   r$   r%   re  C  s    z_HelpDialog._on_closec                 C   s.   | j r| j  ¡  d S | ||ƒ| _ | j  ¡  d S r,   )rð  rv  rr  )r¼   r   rë  r$   r$   r%   rw  H  s
    
z_HelpDialog.show)r>   r?   r@   rð  rç  ré  r0   re  r}  rw  rB   r$   r$   r5   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á  rw  rß   r  ZGetTopLevelParentZ_get_help_entriesr§  r$   r$   r%   rÜ  T  s    ÿzHelpWx.triggerNrÝ  r$   r$   r$   r%   rñ  R  s   rñ  c                   @   s   e Zd Zdd„ ZdS )ÚToolCopyToClipboardWxc                 O   sX   | j js| j  ¡  | j j ¡ r(tj ¡ s,d S ztj 	t 
| j j¡¡ W 5 tj ¡  X d S r,   )r  râ   r"  rS   r‚  r   rô   rõ   r÷   rö   ró   r1   r$   r$   r%   rÜ  [  s    
zToolCopyToClipboardWx.triggerNrÝ  r$   r$   r$   r%   rò  Y  s   rò  c                   @   s   e Zd ZeZeZejZdS )Ú
_BackendWxN)	r>   r?   r@   rV  ZFigureCanvasr»   ZFigureManagerrt  Zmainloopr$   r$   r$   r%   ró  j  s   ró  )N)MrA   rX  Úloggingr‰   r¬  r§   r¸   Znumpyrž  rœ  Z
matplotlibrq  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   Ú	getLoggerr>   rN   r   rž   r&   Ú	lru_cacher*   r+   rF   r‘   rà   rº   rV  ZFramerZ  r»   r  r_  r‹  r„  r¾  Z_register_tool_classZConfigureSubplotsBaserÛ  ZSaveFigureBaserÞ  ZRubberbandBaserà  ÚDialográ  ZToolHelpBaserñ  ZToolCopyToClipboardBaserò  Z_toolbar2_classZ_toolmanager_toolbar_classÚexportró  r$   r$   r$   r%   Ú<module>   sx   	D

   ý Tm   E0PI
 W
-