U
    \	¸azÖ  ã                
   @   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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!m"Z" dd	l#m$Z$ dd
l%m&Z& ddl'Z'e (e)¡Z*dZ+dddddœZ,e -d¡dBdd„ƒZ.dZ/dZ0dCdd„Z1G dd„ deƒZ2G dd„ deƒZ3G dd„ deƒZ4G dd„ dee'j5ƒZ6G d d!„ d!e6ƒZ7G d"d#„ d#e'j8ƒZ9G d$d%„ d%eƒZ:d&d'„ Z;d(d)„ Z<ej=e'j>ej?e'j>ej@e'jAejBe'jCejDe'jEiZFG d*d+„ d+ee'jGƒZHe -d¡G d,d-„ d-e'jIƒƒZJG d.d/„ d/ee'jGƒZKe -d¡G d0d1„ d1ee'jIƒƒZLG d2d3„ d3ejMƒZNG d4d5„ d5ejOƒZPG d6d7„ d7ejQƒZRG d8d9„ d9ejSƒZTG d:d;„ d;e'jUƒZVG d<d=„ d=ejWƒZXG d>d?„ d?ejYƒZZePe_[eNe_\eRe_]eTe_^eXe__eZe_`ejaG d@dA„ dAeƒƒZbdS )DzÒ
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ÚStatusbarBaseÚ	TimerBaseÚToolContainerBaseÚcursors)Ú_apiÚcbookÚbackend_tools)ÚGcf)ÚToolManager)ÚFigure)ÚPath)ÚAffine2D)ÚSubplotToolé   zLow zMed ZHighÚError)é   é   é   é   ú3.3r   c                 C   s,   |t kr(tt| › d| › dt|ƒ› ƒ d S )Nz- z in )Ú_DEBUGÚprintÚ_DEBUG_lvlsÚtype)ÚstringZlvlÚo© r$   úB/tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/backends/backend_wx.pyÚ	DEBUG_MSG.   s    r&   éK   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ÚmessageÚcaptionÚstyleN)ÚwxZMessageDialogÚOKZCENTREÚ	ShowModalÚDestroy)Úmsgr(   Údialogr$   r$   r%   Úerror_msg_wx=   s    
ýr2   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%   r8   K   s    

zTimerWx.__init__c                 C   s   | j  | j| j¡ d S r4   )r6   ÚStartZ	_intervalZ_single©r:   r$   r$   r%   Ú_timer_startP   s    zTimerWx._timer_startc                 C   s   | j  ¡  d S r4   )r6   ÚStopr@   r$   r$   r%   Ú_timer_stopS   s    zTimerWx._timer_stopc                 C   s   | j  ¡ r|  ¡  d S r4   )r6   Ú	IsRunningrA   r@   r$   r$   r%   Ú_timer_set_intervalV   s    
zTimerWx._timer_set_interval)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   rA   rC   rE   Ú__classcell__r$   r$   r=   r%   r3   H   s
   r3   c                       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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ej ddd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italicrP   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,   Úbackendz
the futureZwxaggz7See the Matplotlib usage FAQ for more info on backends.)ÚnameZobj_typeZremovalÚalternativeZaddendumú%s - __init__()N)r   Zwarn_deprecatedr7   r8   Ú_logÚdebugr!   ZGetWidthÚwidthZ	GetHeightÚheightÚbitmapÚfontdÚdpiÚgc)r:   rZ   r\   r=   r$   r%   r8      s         þ


zRendererWx.__init__c                 C   s   dS ©NTr$   r@   r$   r$   r%   Úflipyž   s    zRendererWx.flipyc                 C   s   dS r^   r$   r@   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 r4   )
r   Ú
strip_mathr]   Únew_gcÚgfx_ctxÚget_wx_fontÚSetFontr,   ÚBLACKZGetFullTextExtent)r:   ÚsÚpropÚismathr]   rc   Ú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 r4   )rX   rY   r@   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   r   r   )Úget_clip_rectangleÚboundsrc   Ú_lastcliprectZ	ResetClipZCliprY   )r:   r]   Z
new_boundsrc   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 r4   )Z
CreatePathZiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)rc   Ú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      ð¿ç        )Úselectrs   rc   r   ZscaleÚ	translaterY   ry   ZSetBrushr,   ZBrushÚget_wxcolourZDrawPathZ
StrokePathÚunselect)r:   r]   rt   ru   ZrgbFacerc   rv   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   r   )rp   rq   rX   rY   Úshaper,   ÚBitmapÚFromBufferRGBAÚtobytesr{   rc   Ú
DrawBitmapÚintr~   )r:   r]   ÚxÚyZimÚbboxÚlÚbrk   rl   ZrowsÚcolsrZ   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()rz   )r   ra   rV   rW   r!   r{   rs   rc   rd   r}   Úget_rgbre   rn   r…   ZDrawTextÚmathÚradiansÚsinÚcosZDrawRotatedTextr~   )r:   r]   r†   r‡   rg   rh   Zangleri   Úmtextrc   rj   Úcolorrk   rl   Ú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())rV   rW   r!   ÚGraphicsContextWxrZ   r]   r{   r~   r@   r$   r$   r%   rb     s
    

zRendererWx.new_gcr   z.gc)rT   c                 C   s   | j dk	stdƒ‚| j S )z.
        Fetch the locally cached gc.
        Nzgc must be defined)r]   ÚAssertionErrorr@   r$   r$   r%   Úget_gc  s    zRendererWx.get_gcc                 C   sŠ   t  dt| ƒ¡ t|ƒ}| j |¡}|dk	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Úfamilyr+   Zweight)rV   rW   r!   Úhashr[   ÚgetÚpoints_to_pixelsZget_size_in_pointsr,   ZFontr…   Ú	fontnamesÚget_nameZROMANÚ
fontanglesZ	get_styleÚfontweightsZ
get_weight)r:   rg   rh   Úkeyrj   Úsizer$   r$   r%   rd   %  s    
üzRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)ÚPIXELS_PER_INCHr\   )r:   rw   r$   r$   r%   rœ   6  s    zRendererWx.points_to_pixels)N)FN)%rF   rG   rH   rI   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   r8   r_   r`   rn   ro   rs   Ústaticmethodry   r   rŒ   r•   rb   r   Ú
deprecatedr˜   rd   rœ   rJ   r$   r$   r=   r%   rK   [   s`   îý
ù




	rK   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 krht ¡ }| 	|¡ tj
 |¡}d |_||f| j|< || _|| _|| _t ddtj¡| _| | j¡ || _d S )Nz%s - __init__(): %s)NNrf   r   )r7   r8   rV   rW   r!   Ú_cacher›   r,   ZMemoryDCÚSelectObjectZGraphicsContextZCreaterr   rZ   Údcrc   ÚPenZSOLIDÚ_penÚSetPenÚrenderer)r:   rZ   r­   r©   rc   r=   r$   r%   r8   S  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©   r¨   rZ   Ú
IsSelectedr@   r$   r$   r%   r{   g  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~   m  s    
zGraphicsContextWx.unselectNc                    sV   t  dt| ƒ¡ |  ¡  tƒ  ||¡ | j |  |  	¡ ¡¡ | j
 | j¡ |  ¡  d S )Nz%s - set_foreground())rV   rW   r!   r{   r7   Úset_foregroundr«   Z	SetColourr}   r   rc   r¬   r~   )r:   ÚfgZisRGBAr=   r$   r%   r³   s  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   )ÚfloatrV   rW   r!   r{   r7   Úset_linewidthr…   r­   rœ   Z
_linewidthr«   ZSetWidthrc   r¬   r~   )r:   rk   Zlwr=   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())rV   rW   r!   r{   r7   Úset_capstyler«   ZSetCapr–   Ú_capdZ	_capstylerc   r¬   r~   )r:   Úcsr=   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())rV   rW   r!   r{   r7   Úset_joinstyler«   ZSetJoinr–   Ú_joindZ
_joinstylerc   r¬   r~   )r:   Zjsr=   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>¦  s     z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)rV   rW   r!   r,   ZColour)r:   r“   r$   r$   r%   r}   £  s    zGraphicsContextWx.get_wxcolour)N)rF   rG   rH   rI   r,   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr¸   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr»   ÚweakrefÚWeakKeyDictionaryr§   r8   r{   r~   r³   r¶   r·   rº   r}   rJ   r$   r$   r=   r%   r–   ;  s$   þþ		r–   c                r       sV  e Zd ZdZdZe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j-d(ej.d)ej/d*ej0d+ej1d,ej2d-ej3d.ej4d/ej5d0e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i9ZAdhd2d3„ZBdid4d5„ZCd6d7„ ZDd8d9„ ZEdjd;d<„ZFdkd=d>„ZGd?d@„ ZHeI JdAdB¡dldDdE„ƒZKeLjMdFdGdGdHdIdJdJdKdLœ–ZM‡ fdMdN„ZNdOdP„ ZOdQdR„ ZPdSdT„ ZQdUdV„ ZRdWdX„ ZSdmdZd[„ZTd\d]„ ZUd^d_„ ZVd`da„ ZWdbdc„ ZXddde„ ZYdfdg„ ZZ‡  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ú+ú-Ú*ú/Ú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.¡ |  0tj1¡ |  2tj3¡ 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)4r   r8   ÚmaprŽ   ÚceilÚfigurerˆ   r¢   r,   ÚPanelÚSizer   rZ   rV   rW   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_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SetBackgroundColourÚWHITE)r:   r(   Úidrá   rk   rl   r$   r$   r%   r8   ò  s8    	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	SetBitmaprZ   Ú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)rV   rW   r!   rä   ÚRefreshr@   r$   r$   r%   Ú	draw_idle)  s    z_FigureCanvasWxBase.draw_idlec                 C   s   t  ¡  d S r4   )r,   ZYieldr@   r$   r$   r%   Úflush_events2  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,   r5   ZID_ANYr?   r…   ræ   Z	EVT_TIMERÚstop_event_loopZGetIdZGUIEventLooprÿ   ZRunrB   )r:   ÚtimeoutZtimerr$   r$   r%   Ústart_event_loop6  s    


z$_FigureCanvasWxBase.start_event_loopc                 C   s&   t | dƒr"| j ¡ r| j ¡  | `d S )Nrÿ   )r  rÿ   rD   ZExit©r:   rù   r$   r$   r%   r  C  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¾   S  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_filetypesÚ	wildcardsÚ
extensionsÚfilter_indexÚirS   ÚextsZext_listZwildcardr$   r$   r%   Ú_get_imagesave_wildcardsJ  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rTt| jj	t
ƒrT| j ¡  ¡ n| j}| |dd¡ | jdk	rÀ| j\}}}}| ||||f||||f||||f||||fgt ddtj¡¡ dS )z·
        Performs update of 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   rf   r   )rV   rW   r!   ZIsShownOnScreenr,   ZClientDCÚPlatformÚ
isinstancerá   Z_cachedRendererrK   rZ   ÚConvertToImageZConvertToBitmapr„   rå   ZDrawLineListrª   ZPENSTYLE_SHORT_DASH)r:   ÚdrawDCr  Ú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|f|ž|Ž | jr"|  ¡  d S r4   )r7   Úprint_figurerä   Údraw©r:   Úfilenamer;   r<   r=   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)	rV   rW   r!   r,   ZPaintDCrä   r%  r#  r/   )r:   rù   r  r$   r$   r%   rè   Ž  s    
z_FigureCanvasWxBase._onPaintc                 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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()Ú_widthNFr   )Zforwardrû   )rV   rW   r!   Ú	GetParentÚGetSizerZGetItemZ
ProportionÚFlagr,   ÚEXPANDZ
GetMinSizeZGetClientSizeZIncToÚgetattrr)  Z_heighträ   r   rZ   rá   r\   Zset_size_inchesrü   r   Zresize_event)r:   rù   ÚszÚsir¢   ZdpivalZwinchZhinchr$   r$   r%   rç   ˜  s,    



z_FigureCanvasWxBase._onSizec                 C   sž   |j }|| jkr| j| }n&|dk r>t|ƒ}| ¡ sB| ¡ }nd }|jddg|jddg|jddg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   s*   |   |¡}tj| ||d | r&| ¡  dS )zCapture key press.©ÚguiEventN)r:  r   Zkey_press_eventÚSkip©r:   rù   r¡   r$   r$   r%   ré   Ü  s    
z_FigureCanvasWxBase._onKeyDownc                 C   s*   |   |¡}tj| ||d | r&| ¡  dS )zRelease key.r;  N)r:  r   Zkey_release_eventr=  r>  r$   r$   r%   rê   ã  s    
z_FigureCanvasWxBase._onKeyUpTc                 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)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i}| ¡ }| ||¡}| ¡ r€| j||||d n8| ¡ rž| j|||d|d n| ¡ r¸| j||||d dS )úStart measuring on an axis.r;  T)Zdblclickr<  N)r=  r@  Z
ButtonDownZButtonDClickÚXrá   rˆ   rY   ÚYr,   ZMOUSE_BTN_LEFTr   ÚLEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTÚRIGHTZ	GetButtonr›   Zbutton_press_eventZButtonUpZbutton_release_event)r:   rù   r†   r‡   Z
button_mapÚbuttonr$   r$   r%   rì   õ  s*       ýÿz"_FigureCanvasWxBase._onMouseButtonc                 C   s~   |  ¡ }| jjj| ¡  }|j|j |j }| ¡  t	j
dkrft| dƒsPd| _n| jr`d| _dS d| _tj| ||||d dS )z3Translate mouse wheel events into matplotlib eventsZ	__WXMAC__Ú_skipwheeleventTFNr;  )ÚGetXrá   rˆ   rY   ÚGetYZLinesPerActionZWheelRotationZ
WheelDeltar=  r,   r  r  rG  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 )rA  r;  N)rH  rá   rˆ   rY   rI  r=  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.r;  N)r=  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.)r<  ZxyN)rH  rá   rˆ   rY   rI  r=  r   Zenter_notify_eventrK  r$   r$   r%   rð   *  s    z_FigureCanvasWxBase._onEnter)N)N)r   )N)Nr  )T)\rF   rG   rH   rI   Zrequired_interactive_frameworkr3   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_DELETEr2  r8   rú   rý   rþ   r  r  r  r   Zdelete_parameterr#  r   r  r$  rè   rç   r:  ré   rê   r@  rñ   rì   rí   rî   rï   rð   rJ   r$   r$   r=   r%   rÁ   ©  s,  	                                                         Ç<
+
	


÷	
,
rÁ   c                   @   s`   e Zd Zddd„Zdd„ Zdd„ ZeZdd	„ Zd
d„ Zdd„ Z	e	Z
dd„ Zeddœdd„ƒ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)rV   rW   r!   rK   rZ   rá   r\   r­   r%  rä   r#  )r:   r  r$   r$   r%   r%  5  s
    zFigureCanvasWx.drawc                 O   s   | j |tjf|ž|ŽS r4   )Ú_print_imager,   ZBITMAP_TYPE_BMPr&  r$   r$   r%   Ú	print_bmp@  s    zFigureCanvasWx.print_bmpc                 O   s   | j |tjf|ž|ŽS r4   )rM  r,   ÚBITMAP_TYPE_JPEGr&  r$   r$   r%   Ú
print_jpegC  s
    ÿÿzFigureCanvasWx.print_jpegc                 O   s   | j |tjf|ž|ŽS r4   )rM  r,   ZBITMAP_TYPE_PCXr&  r$   r$   r%   Ú	print_pcxH  s    zFigureCanvasWx.print_pcxc                 O   s   | j |tjf|ž|ŽS r4   )rM  r,   ZBITMAP_TYPE_PNGr&  r$   r$   r%   Ú	print_pngK  s    zFigureCanvasWx.print_pngc                 O   s   | j |tjf|ž|ŽS r4   )rM  r,   ZBITMAP_TYPE_TIFr&  r$   r$   r%   Ú
print_tiffN  s    zFigureCanvasWx.print_tiffc                 O   s   | j |tjf|ž|ŽS r4   )rM  r,   ZBITMAP_TYPE_XPMr&  r$   r$   r%   Ú	print_xpmR  s    zFigureCanvasWx.print_xpm)Úqualityc                C   sî   | j }t t | jjj¡t | jjj¡¡| _ t	| j | jj
ƒ}| ¡ }| j |¡ | j }|tjkr’|d krvt tjd¡}| j  ¡ }| tjt|ƒ¡ t |¡r°t|tjƒs°| ¡ }| ||¡sÊtd|› ƒ‚|| _ | jrÞ|  ¡  | rê|  ¡  d S )Nzsavefig.jpeg_qualityzCould not save figure to )rZ   r,   r   rŽ   rà   rá   rˆ   rX   rY   rK   r\   rb   r%  rO  ÚdictÚ__getitem__ÚmplÚrcParamsr  Z	SetOptionZIMAGE_OPTION_QUALITYÚstrr   Zis_writable_file_liker  ÚImageZSaveFiler  rä   rü   )r:   r'  ZfiletyperU  Z
origBitmapr­   r]   Úimager$   r$   r%   rM  U  s4    ÿ
ÿ


ÿzFigureCanvasWx._print_image)N)rF   rG   rH   r%  rN  rP  Z	print_jpgrQ  rR  rS  Z	print_tifrT  r   rM  r$   r$   r$   r%   rL  2  s   
rL  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 k	r\| j $¡  | j %¡ \}}| j %¡ \}}	| j &t  ||¡¡ | j | jdt jt jB ¡ |  '| j¡ |  (¡  | j )d¡ |  *t j+| j,¡ d S )	Nr  é   éÿÿÿÿ)r(   ró   ÚposrU   r   r   )r   r   )-r,   r  ZDefaultPositionZPointr7   r8   rV   rW   r!   ÚnumÚ_set_frame_iconÚ
get_canvasÚcanvasrß   rŽ   rà   rˆ   r¢   ÚSetInitialSizerã   ZSetFocusÚBoxSizerÚVERTICALÚsizerÚAddZTOPrD  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:   ra  Úfigr`  rk   rl   ZtwÚthÚfwÚfhr=   r$   r%   r8   †  s:    

 

zFigureFrameWx.__init__c                 C   s   | j jS r4   )rk  rn  r@   r$   r$   r%   rn  ¶  s    zFigureFrameWx.toolmanagerc                 C   s>   t jd dkrt| jƒ}n t jd dkr6t| j| ƒ}nd }|S )Nrm  Ztoolbar2rn  )rX  rY  ÚNavigationToolbar2Wxrd  Ú	ToolbarWxrn  )r:   rm  r$   r$   r%   rl  º  s    zFigureFrameWx._get_toolbarc                 C   s   t | d|ƒS ©Nr_  )rL  )r:   rt  r$   r$   r%   rc  Ã  s    zFigureFrameWx.get_canvasc                 C   s   t  dt| ƒ¡ | jS )Nz%s - get_figure_manager())rV   rW   r!   rk  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())rV   rW   r!   rd  Zclose_eventr  rk  Úframer   Údestroyr=  r  r$   r$   r%   rs  Ê  s    

zFigureFrameWx._onClosec                 C   s   | j S )z=Override wxFrame::GetToolBar as we don't have managed toolbar)rm  r@   r$   r$   r%   Ú
GetToolBarÖ  s    zFigureFrameWx.GetToolBarc                    sH   z| j  | jj¡ W n tk
r(   Y nX | rD|  ¡ sDtƒ j||Ž dS r^   )rd  Zmpl_disconnectrm  Z_id_dragÚAttributeErrorZIsBeingDeletedr7   r/   r9   r=   r$   r%   r/   Ú  s    zFigureFrameWx.Destroy)rF   rG   rH   r8   Úpropertyrn  rl  rc  r{  rs  r~  r/   rJ   r$   r$   r=   r%   r]  …  s   0
	r]  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 )rj  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 )NrU   TF)rV   rW   r!   r|  ÚwindowÚ_initializingr7   r8   )r:   rd  ra  r|  r=   r$   r%   r8   ù  s
    zFigureManagerWx.__init__c                 C   s
   | j  ¡ S r4   )r|  r~  r@   r$   r$   r%   rm     s    zFigureManagerWx.toolbarc                 C   s   | j stdƒ‚d S )Nzcan't set attribute)r‚  r  )r:   Úvaluer$   r$   r%   rm    s    c                 C   s,   | j  ¡  | j ¡  tjd r(| j  ¡  d S )Nzfigure.raise_window)r|  ÚShowrd  r%  rX  rY  ÚRaiser@   r$   r$   r%   Úshow  s    


zFigureManagerWx.showc                 G   s*   t  dt| ƒ¡ | j}|r&t |j¡ d S )Nz%s - destroy())rV   rW   r!   r|  r,   Z	CallAfterrø   )r:   r;   r|  r$   r$   r%   r}    s    zFigureManagerWx.destroyc                 C   s   | j  | j  ¡  ¡ d S r4   )r|  ZShowFullScreenZIsFullScreenr@   r$   r$   r%   Úfull_screen_toggle  s    z"FigureManagerWx.full_screen_togglec                 C   s
   | j  ¡ S r4   )r  ZGetTitler@   r$   r$   r%   Úget_window_title  s    z FigureManagerWx.get_window_titlec                 C   s   | j  |¡ d S r4   )r  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 r4   )	rd  re  r,   rã   rŽ   rà   r  r+  rq  )r:   rX   rY   r$   r$   r%   Úresize'  s    ÿzFigureManagerWx.resize)rF   rG   rH   rI   r8   r€  rm  Úsetterr†  r}  r‡  rˆ  rŠ  r‹  rJ   r$   r$   r=   r%   rj  ê  s   

	rj  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   rZ  r   Ú_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)r|  Zbundler\  Ziconr$   r$   r%   rb  6  s    rb  c                       sÞ   e Zd Zddd„Ze d¡Ze d¡Ze d¡Ze d¡Z	e d¡Z
e d¡Ze 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‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )rx  Tc              	   C   s  t j | | ¡ d¡ dt jkr(|  d¡ i | _| jD ]x\}}}}|d krR|  ¡  q4| j	d|  
|› d¡t j|||dkr|t jnt jdj| j|< | jt jt| |ƒ| j| d q4|| _| jrÚ|  ¡  t  | ¡| _|  | j¡ |  ¡  t | |¡ d | _dt jk| _d S )Nr_  ZwxMac)é   r‘  z.png)ÚPanÚZoom)rZ   ZbmpDisabledÚlabelZ	shortHelpÚkindr   )r,   ÚToolBarr8   r*  ZPlatformInfoZSetToolBitmapSizeÚwx_idsZ	toolitemsZAddSeparatorZAddToolÚ_iconr²   Ú
ITEM_CHECKÚITEM_NORMALÚIdræ   ÚEVT_TOOLr.  Ú_coordinatesÚAddStretchableSpaceÚ
StaticTextÚ_label_textÚ
AddControlro  r   Ú_prevZoomRectÚ
_retinaFix)r:   rd  ZcoordinatesÚtextZtooltip_textÚ
image_fileÚcallbackr$   r$   r%   r8   J  s<    

 úÿ	ÿzNavigationToolbar2Wx.__init__r   c                 C   s  t  tj 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  g‰A`åÐ"Ó?gbX9´Èâ?gÉv¾Ÿ/½?r¼   gš™™™™™É?.Nr   r   r_  )Zaxisr   )ÚnpÚarrayÚPILr[  Úopenr   rŽ  r,   ZSystemSettingsZGetAppearanceZIsDarkr  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTZredZgreenZblueÚallZRedZGreenZBluer   r‚   r€   rƒ   )rS   r\  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 rz  )r!   rd  )r:   r|  rt  r$   r$   r%   rc  ’  s    zNavigationToolbar2Wx.get_canvasc                    s.   | j d }|  ||  |¡ ¡ tƒ j|Ž  d S )Nr“  )r—  Ú
ToggleToolÚGetToolStater7   Úzoom©r:   r;   Útoolr=   r$   r%   r¯  –  s    
zNavigationToolbar2Wx.zoomc                    s.   | j d }|  ||  |¡ ¡ tƒ j|Ž  d S )Nr’  )r—  r­  r®  r7   Úpanr°  r=   r$   r%   r²  ›  s    
zNavigationToolbar2Wx.panc              
   G   s*  | 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t|ƒ|d W n0 tk
r$ }
 ztt|
ƒƒ 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)r6  )rd  r  Zget_default_filenamer,   Ú
FileDialogr*  rX  rY  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexr.   ÚID_OKÚpathlibr   ZGetPathrV   rW   r!   ZGetFilterIndexÚsuffixZget_supported_filetypesÚwarningrZ  r(   rá   ZsavefigÚ	Exceptionr2   )r:   r;   r  r  r  Zdefault_fileZdlgrt   Úfmtr  Úer$   r$   r%   Úsave_figure   s:    
   
ý
  þ
z NavigationToolbar2Wx.save_figurec                 C   s(   t  t| ¡}| j |¡ | j ¡  d S r4   )r,   ÚCursorÚcursordrd  Z	SetCursorZUpdate©r:   Úcursorr$   r$   r%   Ú
set_cursor½  s    zNavigationToolbar2Wx.set_cursorc                    sb   t ƒ  |¡ | jjdkr^| js*t ¡ | _n4|jd k	r^| j	 
|jj¡| _|j| _|j| _|j| _d S )NÚZOOM)r7   Ú
press_zoomÚmoderS   r£  r,   ZOverlayÚ
_wxoverlayZinaxesrd  Zcopy_from_bboxrˆ   Ú_savedRetinaImageZxdataZ_zoomStartXZydataZ_zoomStartYÚ	_zoomAxesr  r=   r$   r%   rÂ  Â  s    
ÿzNavigationToolbar2Wx.press_zoomc                    s^   t ƒ  |¡ | jjdkrZ| js.| j ¡  | `n,| `| jrN| j 	d¡ 
¡  d | _| jrZd | _d S )NrÁ  r   )r7   Úrelease_zoomrÃ  rS   r£  rÄ  ZResetrÅ  r¢  ÚpopÚremoverÆ  r  r=   r$   r%   rÇ  Ï  s    
z!NavigationToolbar2Wx.release_zoomc                 C   s2   | j jjj}||| ||| f| j _| j  ¡  d S r4   )rd  rá   rˆ   rY   rå   rü   )r:   rù   r  r   r!  r"  rY   r$   r$   r%   Údraw_rubberbandß  s    z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j  ¡  d S r4   )rd  rå   rü   r@   r$   r$   r%   Úremove_rubberbandä  s    z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j |¡ d S r4   )r  r   ÚSetLabel©r:   rg   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)r:   Zcan_backwardZcan_forwardr$   r$   r%   Úset_history_buttonsì  s    

z(NavigationToolbar2Wx.set_history_buttons)T)rF   rG   rH   r8   r   Zdeprecate_privatize_attributeZprevZoomRectZ	retinaFixZsavedRetinaImageZ	wxoverlayZzoomAxesZ
zoomStartXZ
zoomStartYr¤   r˜  r¥   rc  r¯  r²  r»  rÀ  rÂ  rÇ  rÊ  rË  rÎ  rÓ  rJ   r$   r$   r=   r%   rx  I  s,   
'








rx  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚStatusBarWxzœ
    A status bar is added to _FigureFrame to allow measurements and the
    previously selected scroll function to be displayed as a user convenience.
    c                    s   t ƒ  |d¡ |  d¡ d S )Nr_  r   )r7   r8   ÚSetFieldsCount©r:   r(   r;   r<   r=   r$   r%   r8   ü  s    zStatusBarWx.__init__c                 C   s   |   d| d¡ d S )Nz%sr   ©ÚSetStatusText)r:   r"   r$   r$   r%   Úset_function   s    zStatusBarWx.set_function)rF   rG   rH   rI   r8   rÙ  rJ   r$   r$   r=   r%   rÔ  õ  s   rÔ  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 )ry  c                 C   sR   t  | |¡ tjj| |d|d |  ¡ | _t | ¡| _|  | j¡ i | _	i | _
d S )Nr_  )r+   )r   r8   r,   r–  rž  Ú_spacerŸ  r   r¡  Ú
_toolitemsÚ_groups)r:   rn  r(   r+   r$   r$   r%   r8     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½   r`  ©r:   r±  r$   r%   r¾     s    ÿz+ToolbarWx._get_tool_pos.<locals>.<listcomp>)ÚrangeÚ
ToolsCount)r:   r±  r`  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 r4   )Ztrigger_tool)rù   ©rS   r:   r$   r%   Úhandler=  s    z'ToolbarWx.add_toolitem.<locals>.handler)rÜ  ZInsertSeparatorrá  rÚ  rß   rÝ  rß  rà  Úindexrx  r˜  r,   rš  r™  Z
InsertToolr²   ZGetTextExtentZToggleButtonÚButtonZInsertControlro  ræ   rœ  rë   rÛ  Ú
setdefaultr  )r:   rS   Ú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 r4   )rÛ  Z	IsControlr­  r›  Z
GetControlZSetValuerü   )r:   rS   Ztoggledr±  rç  r$   r$   r%   Útoggle_toolitemH  s    
zToolbarWx.toggle_toolitemc                 C   s,   | j | D ]\}}|  |j¡ q
| j |= d S r4   )rÛ  Z
DeleteToolr›  )r:   rS   r±  rç  r$   r$   r%   Úremove_toolitemR  s    zToolbarWx.remove_toolitemc                 C   s   | j  |¡ d S r4   )r   rÌ  rÍ  r$   r$   r%   rÎ  W  s    zToolbarWx.set_messageN)rF   rG   rH   r,   ZTB_HORIZONTALr8   rá  rò  ró  rô  rÎ  r$   r$   r$   r%   ry    s   	-
ry  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚStatusbarWxzFor use with ToolManager.c                 O   s:   t j| f|ž|Ž tj | |d¡ |  d¡ |  d¡ d S )Nr_  r   rã  )r
   r8   r,   Ú	StatusBarrÕ  rØ  rÖ  r$   r$   r%   r8   ^  s    
zStatusbarWx.__init__c                 C   s   |   |¡ d S r4   r×  rÍ  r$   r$   r%   rÎ  d  s    zStatusbarWx.set_messageN)rF   rG   rH   rI   r8   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 r4   )rx  Zconfigure_subplotsÚ"_make_classic_style_pseudo_toolbar©r:   r;   r$   r$   r%   Útriggeri  s    ÿzConfigureSubplotsWx.triggerN©rF   rG   rH   rú  r$   r$   r$   r%   r÷  h  s   r÷  c                   @   s   e Zd Zdd„ ZdS )ÚSaveFigureWxc                 G   s   t  |  ¡ ¡ d S r4   )rx  r»  rø  rù  r$   r$   r%   rú  o  s    ÿzSaveFigureWx.triggerNrû  r$   r$   r$   r%   rü  n  s   rü  c                   @   s   e Zd Zdd„ ZdS )ÚSetCursorWxc                 C   s   t  |  ¡ |¡ d S r4   )rx  rÀ  rø  r¾  r$   r$   r%   rÀ  u  s     ÿzSetCursorWx.set_cursorN)rF   rG   rH   rÀ  r$   r$   r$   r%   rý  t  s   rý  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRubberbandWxc                 C   s   t  |  ¡ d ||||¡ d S r4   )rx  rÊ  rø  )r:   r  r   r!  r"  r$   r$   r%   rÊ  {  s         ÿzRubberbandWx.draw_rubberbandc                 C   s   t  |  ¡ ¡ d S r4   )rx  rË  rø  r@   r$   r$   r%   rË    s    ÿzRubberbandWx.remove_rubberbandN)rF   rG   rH   rÊ  rË  r$   r$   r$   r%   rþ  z  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ÚDescriptionrL   éŒ   rN   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‰  r+   r   r   é   é   rå  )r7   r8   r,   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERrf  rg  ZFlexGridSizerZGetFontZMakeBoldr  ÚheadersÚzipÚwidthsrŸ  re   ZWrapri  ÚALLré  r´  ZALIGN_CENTER_HORIZONTALrp  rq  ZLayoutræ   rr  ÚOnCloseZ
EVT_BUTTON)r:   r(   Úhelp_entriesrh  Z
grid_sizerrQ   ÚrÚrowÚcolrX   r”  r-   r=   r$   r%   r8   ‰  s*    

ÿ



z_HelpDialog.__init__c                 C   s   d t _|  ¡  | ¡  d S r4   )rÿ  Ú	_instanceZDestroyLaterr=  r  r$   r$   r%   r	  ¢  s    z_HelpDialog.OnClosec                 C   s.   | j r| j  ¡  d S | ||ƒ| _ | j  ¡  d S r4   )r  r…  r„  )Úclsr(   r
  r$   r$   r%   r†  §  s
    
z_HelpDialog.show)rF   rG   rH   r  r  r  r8   r	  Úclassmethodr†  rJ   r$   r$   r=   r%   rÿ  „  s   
rÿ  c                   @   s   e Zd Zdd„ ZdS )ÚHelpWxc                 G   s   t  | jj ¡ |  ¡ ¡ d S r4   )rÿ  r†  rá   rd  ZGetTopLevelParentZ_get_help_entriesrù  r$   r$   r%   rú  ²  s    ÿzHelpWx.triggerNrû  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 r4   )rd  rä   r%  rZ   r  r,   rõ   rö   rø   r÷   rô   r9   r$   r$   r%   rú  ¸  s    
zToolCopyToClipboardWx.triggerNrû  r$   r$   r$   r%   r  ·  s   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                    sF   t  ¡ }|d kr2t  d¡}| d¡ t ¡  |t_tƒ j	|f|ž|ŽS )NFT)
r,   ÚGetAppÚAppZSetExitOnFrameDeleter   Z_setup_new_guiappr  Z	_theWxAppr7   Únew_figure_manager)r  ra  r;   r<   Úwxappr=   r$   r%   r  Ñ  s    

z_BackendWx.new_figure_managerc                 C   s4   |   ||¡}| ¡ }t ¡ r0|j ¡  |j ¡  |S r4   )Ú_frame_classr{  rX  Zis_interactiver|  r„  rd  rý   )r  ra  rá   r|  rk  r$   r$   r%   Únew_figure_manager_given_figureÞ  s    

z*_BackendWx.new_figure_manager_given_figurec                  C   s&   t j ¡ s"t  ¡ } | d k	r"|  ¡  d S r4   )r,   r  ZIsMainLoopRunningr  ZMainLoop)r  r$   r$   r%   Úmainloopç  s    
z_BackendWx.mainloop)rF   rG   rH   rL  ZFigureCanvasrj  ZFigureManagerr]  r  r  r  r  r¤   r  rJ   r$   r$   r=   r%   r  Ë  s   
r  )r   N)N)crI   ÚloggingrŽ   rµ  r¯   r¿   Znumpyr§  r©  Z
matplotlibrX  Zmatplotlib.backend_basesr   r   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,   Ú	getLoggerrF   rV   r   r    r¥   r&   r£   Z
IDLE_DELAYr2   r3   rK   r–   râ   rÁ   rL  ZFramer]  rj  r  rb  ZMOVEZCURSOR_HANDZHANDÚPOINTERZCURSOR_ARROWZSELECT_REGIONZCURSOR_CROSSZWAITZCURSOR_WAITr½  r–  rx  rö  rÔ  ry  rõ  ZConfigureSubplotsBaser÷  ZSaveFigureBaserü  ZSetCursorBaserý  ZRubberbandBaserþ  ÚDialogrÿ  ZToolHelpBaser  ZToolCopyToClipboardBaser  ZToolSaveFigureZToolConfigureSubplotsZToolSetCursorZToolRubberbandZToolHelpZToolCopyToClipboardÚexportr  r$   r$   r$   r%   Ú<module>   sŽ   	8

 an   SeD     û	 -U
-