B
    ]”t\?# ã            
   @   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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 ddlmZ ddl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#m$Z$m%Z% ddl&Z&dZ'e'dk rddl(Z(ddl)Z)dddddœZ*dUdd„Z+dd„ Z,G dd„ de-ƒZ.dZ/dZ0dVdd„Z1dd„ Z2G dd „ d eƒZ3G d!d"„ d"eƒZ4G d#d$„ d$eƒZ5G d%d&„ d&e
e&j6ƒZ7G d'd(„ d(e7ƒZ8G d)d*„ d*e&j9ƒZ:G d+d,„ d,eƒZ;e& <¡ Z=e& <¡ Z>e& <¡ Z?e& <¡ Z@e& <¡ ZAe& <¡ ZBe& <¡ ZCe& <¡ ZDe& <¡ ZEe& <¡ ZFe& <¡ ZGe& <¡ ZHd-d.„ ZId/d0„ ZJG d1d2„ d2e&jKƒZLejMe&jNejOe&jNejPe&jQejRe&jSejTe&jUiZVe# Wd3¡G d4d5„ d5e&j9ƒƒZXG d6d7„ d7ee&jYƒZZe#jWd3d7d8G d9d:„ d:eZƒƒZ[G d;d<„ d<e&j\ƒZ]G d=d>„ d>ee&jYƒZ^G d?d@„ d@ee&j\ƒZ_G dAdB„ dBe%j`ƒZaG dCdD„ dDe%jbƒZcG dEdF„ dFe%jdƒZedGe&jfkrNG dHdI„ dIe%jgƒZhnG dJdI„ dIe%jgƒZhG dKdL„ dLe&jiƒZjG dMdN„ dNe%jkƒZlG dOdP„ dPe%jmƒZnece%_oeae%_peee%_qehe%_rele%_sene%_tG dQdR„ dRe&juƒZve	jwG dSdT„ dTe	ƒƒZxdS )WzÒ
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ÚNavigationToolbar2ÚRendererBaseÚ	TimerBaseÚcursorsÚToolContainerBaseÚStatusbarBase)Ú_has_pil)ÚGcf)Úis_writable_file_likeÚwarn_deprecated)ÚFigure)ÚPath)ÚAffine2D)ÚSubplotTool)ÚToolManager)ÚcbookÚrcParamsÚbackend_toolsé   zLow zMed ZHighÚError)é   é   é   é   r   c             C   s(   |t kr$|j}tdt| | |f ƒ d S )Nz%s- %s in %s)Ú_DEBUGÚ	__class__ÚprintÚ_DEBUG_lvls)ÚstringZlvlÚoÚcls© r%   ú=lib/python3.7/site-packages/matplotlib/backends/backend_wx.pyÚ	DEBUG_MSG.   s    r'   c             C   s    t  | ||¡ tƒ  t ¡  dS )zDCode due to Thomas Heller - published in Python Cookbook (O'Reilley)N)Ú	tracebackÚprint_exceptionr    ÚpdbZpm)ÚtypeÚvalueÚtbr%   r%   r&   Údebug_on_error9   s    r.   c               @   s   e Zd ZdZdd„ ZdS )Úfake_stderrzº
    Wx does strange things with stderr, as it makes the assumption that
    there is probably no console. This redirects stderr to the console, since
    we know that there is one!
    c             C   s   t d| ƒ d S )NzStderr: %s
)r    )ÚselfÚmsgr%   r%   r&   ÚwriteG   s    zfake_stderr.writeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r%   r%   r%   r&   r/   @   s   r/   éK   c             C   s.   t j|| dt jt jB d}| ¡  | ¡  dS )zE
    Signal an error condition -- in a GUI, popup a error dialog
    zMatplotlib backend_wx error)ÚparentÚmessageZcaptionÚstyleN)ÚwxZMessageDialogÚOKZCENTREÚ	ShowModalÚDestroy)r1   r8   Zdialogr%   r%   r&   Úerror_msg_wxU   s    r?   c             C   s   t | tƒsd tt| ƒ¡} | S )z7msg is a return arg from a raise.  Join with new lines.Ú
)Ú
isinstanceÚstrÚjoinÚmap)r1   r%   r%   r&   Úraise_msg_to_strb   s    
rE   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTimerWxaL  
    Subclass of :class:`backend_bases.TimerBase` that uses WxTimer events.

    Attributes
    ----------
    interval : int
        The time between timer events in milliseconds. Default is 1000 ms.
    single_shot : bool
        Boolean flag indicating whether this timer should operate as single
        shot (run once and then stop). Defaults to False.
    callbacks : list
        Stores list of (func, args) tuples that will be called upon timer
        events. This list can be manipulated directly, or the functions
        `add_callback` and `remove_callback` can be used.

    c             O   sV   |r,t |d tjƒr,t dd¡ |dd … }tj| f|ž|Ž t ¡ | _| j	| j_
d S )Nr   z3.0zePassing a wx.EvtHandler as first argument to the TimerWx constructor is deprecated since %(version)s.r   )rA   r;   Z
EvtHandlerr   r   r   Ú__init__ÚTimerÚ_timerZ	_on_timerZNotify)r0   ÚargsÚkwargsr%   r%   r&   rG   {   s    
zTimerWx.__init__c             C   s   | j  | j| j¡ d S )N)rI   ÚStartZ	_intervalZ_single)r0   r%   r%   r&   Ú_timer_start…   s    zTimerWx._timer_startc             C   s   | j  ¡  d S )N)rI   ÚStop)r0   r%   r%   r&   Ú_timer_stopˆ   s    zTimerWx._timer_stopc             C   s   |   ¡  d S )N)rM   )r0   r%   r%   r&   Ú_timer_set_interval‹   s    zTimerWx._timer_set_intervalc             C   s   | j  ¡  d S )N)rI   rL   )r0   r%   r%   r&   Ú_timer_set_single_shotŽ   s    zTimerWx._timer_set_single_shotN)	r3   r4   r5   r6   rG   rM   rO   rP   rQ   r%   r%   r%   r&   rF   i   s   
rF   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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dd„ Zdd „ Z d!d"„ Z!d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  iô  iX  i¼  i   i„  Z
ultralightZlightÚnormalZmediumZsemiboldÚboldZheavyZ	ultraboldZblack)ZitalicrU   Zoblique)ZSansZRomanZScriptZ
DecorativeZModernZCourierZcourierc             C   sT   t dddd t | ¡ tdd| ƒ | ¡ | _| ¡ | _|| _i | _	|| _
d| _dS )z;
        Initialise a wxWindows renderer instance.
        z2.0z¥The WX backend is deprecated. It's untested and will be removed in Matplotlib 3.0. Use the WXAgg backend instead. See Matplotlib usage FAQ for more info on backends.ZWXAgg)r9   Úalternativez
__init__()r   N)r   r   rG   r'   ÚGetWidthÚwidthÚ	GetHeightÚheightÚbitmapÚfontdÚdpiÚgc)r0   r\   r^   r%   r%   r&   rG   Æ   s    


zRendererWx.__init__c             C   s   dS )NTr%   )r0   r%   r%   r&   ÚflipyÙ   s    zRendererWx.flipyc             C   s   dS )NTr%   )r0   r%   r%   r&   Úoffset_text_heightÜ   s    zRendererWx.offset_text_heightc             C   sd   |r|   |¡}| jdkr"|  ¡ }n| j}|j}|  ||¡}| |tj¡ | |¡\}}}	}
|||	fS )zl
        get the width and height in display coords of the string s
        with FontPropertry prop
        N)	Ú
strip_mathr_   Únew_gcÚgfx_ctxÚget_wx_fontÚSetFontr;   ÚBLACKZGetFullTextExtent)r0   ÚsÚpropÚismathr_   rd   ÚfontÚwÚhZdescentZleadingr%   r%   r&   Úget_text_width_height_descentß   s    


z(RendererWx.get_text_width_height_descentc             C   s   | j | jfS )z4return the canvas width and height in display coords)rY   r[   )r0   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Úboundsrd   Ú_lastcliprectZ	ResetClipZClipr[   )r0   r_   Z
new_boundsrd   r%   r%   r&   Úhandle_clip_rectangle÷   s    


z RendererWx.handle_clip_rectanglec             C   sŽ   |   ¡ }x€| |¡D ]r\}}|tjkr2|j|Ž  q|tjkrH|j|Ž  q|tjkr^|j|Ž  q|tj	krt|j
|Ž  q|tjkr| ¡  qW |S )N)Z
CreatePathZiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)rd   Ú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      ð¿g        )Úselectrs   rd   r   ZscaleÚ	translater[   ry   ÚSetBrushr;   ÚBrushÚget_wxcolourZDrawPathZ
StrokePathÚunselect)r0   r_   rt   ru   ZrgbFacerd   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   rY   r[   Úshaper;   ÚBitmapZFromBufferRGBAZtostringÚget_gcrz   rd   Ú
DrawBitmapÚintr   )r0   r_   ÚxÚyZimÚbboxÚlÚbrl   rm   ZrowsZcolsr\   r%   r%   r&   Ú
draw_image#  s    zRendererWx.draw_imageFc	             C   sâ   |r|   |¡}tdd| ƒ | ¡  |  |¡ |j}	|  ||¡}
| | ¡ ¡}|	 |
|¡ |  	|||¡\}}}t
|ƒ}t
|| ƒ}|dkr˜|	 |||¡ n>t |¡}|t |¡ }|t |¡ }|	 ||| || |¡ | ¡  d S )Nzdraw_text()r   g        )rb   r'   rz   rs   rd   re   r~   Úget_rgbrf   rn   r…   ZDrawTextÚmathZradiansZsinZcosZDrawRotatedTextr   )r0   r_   r†   r‡   rh   ri   Zanglerj   Zmtextrd   rk   Úcolorrl   rm   ÚdZradsZxoZyor%   r%   r&   Ú	draw_text4  s&    


zRendererWx.draw_textc             C   s4   t dd| ƒ t| j| ƒ| _| j ¡  | j ¡  | jS )zY
        Return an instance of a GraphicsContextWx, and sets the current gc copy
        znew_gc()r   )r'   ÚGraphicsContextWxr\   r_   rz   r   )r0   r%   r%   r&   rc   N  s
    

zRendererWx.new_gcc             C   s   | j dk	stdƒ‚| j S )z.
        Fetch the locally cached gc.
        Nzgc must be defined)r_   ÚAssertionError)r0   r%   r%   r&   rƒ   X  s    zRendererWx.get_gcc       
      C   s˜   t dd| ƒ t|ƒ}|}| ¡ }| j |¡}|dk	r8|S | j |tj¡}d}|  | 	¡ ¡}	t 
t|	d ƒ|| j| ¡  | j| ¡  d|¡}|| j|< |S )z`
        Return a wx font.  Cache instances in a font dictionary for
        efficiency
        zget_wx_font()r   NÚ g      à?F)r'   ÚhashZget_namer]   ÚgetÚ	fontnamesr;   ZROMANÚpoints_to_pixelsZget_size_in_pointsZFontr…   Ú
fontanglesZ	get_styleÚfontweightsZ
get_weight)
r0   rh   ri   ÚkeyZfontpropZfontnamerk   Z
wxFontnameZ
wxFacenameÚsizer%   r%   r&   re   a  s$    
zRendererWx.get_wx_fontc             C   s   |t d | j d  S )zj
        convert point measures to pixes using dpi and the pixels per
        inch of the display
        g      R@)ÚPIXELS_PER_INCHr^   )r0   rw   r%   r%   r&   r—   „  s    zRendererWx.points_to_pixels)N)FN)"r3   r4   r5   r6   r;   ZFONTWEIGHT_LIGHTZFONTWEIGHT_NORMALZFONTWEIGHT_BOLDr™   ZFONTSTYLE_ITALICZFONTSTYLE_NORMALZFONTSTYLE_SLANTr˜   ZFONTFAMILY_SWISSZFONTFAMILY_ROMANZFONTFAMILY_SCRIPTZFONTFAMILY_DECORATIVEZFONTFAMILY_MODERNr–   rG   r`   ra   rn   ro   rs   Ústaticmethodry   r€   r‹   r   rc   rƒ   re   r—   r%   r%   r%   r&   rR   ’   sV   	





	#rR   c               @   s~   e Zd ZdZejejejdœZej	ej
ejdœZe ¡ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zd
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             C   s´   t  | ¡ tdd| ƒ td| d| ƒ | j |d¡\}}|d krrt ¡ }| |¡ tj 	|¡}d |_
||f| j|< || _|| _|| _t ddtj¡| _| | j¡ tj| _|| _d S )Nz
__init__()r   z__init__() 2: %s)NNrg   )r   rG   r'   Ú_cacher•   r;   ZMemoryDCÚSelectObjectZGraphicsContextZCreaterr   r\   Údcrd   ÚPenÚSOLIDÚ_penÚSetPenZ_styleÚrenderer)r0   r\   r¦   r¡   rd   r%   r%   r&   rG   ¤  s"    

zGraphicsContextWx.__init__c             C   s"   t jdkr| j | j¡ d| _dS )zC
        Select the current bitmap into this wxDC instance
        Úwin32TN)ÚsysÚplatformr¡   r    r\   Ú
IsSelected)r0   r%   r%   r&   rz   º  s    
zGraphicsContextWx.selectc             C   s"   t jdkr| j tj¡ d| _dS )z?
        Select a Null bitmasp into this wxDC instance
        r§   FN)r¨   r©   r¡   r    r;   Ú
NullBitmaprª   )r0   r%   r%   r&   r   Ã  s    
zGraphicsContextWx.unselectNc             C   sR   t dd| ƒ |  ¡  t | ||¡ | j |  |  ¡ ¡¡ | j 	| j¡ |  
¡  dS )zÎ
        Set the foreground color.  fg can be a matlab format string, a
        html hex color string, an rgb unit tuple, or a float between 0
        and 1.  In the latter case, grayscale is used.
        zset_foreground()r   N)r'   rz   r   Úset_foregroundr¤   Z	SetColourr~   rŒ   rd   r¥   r   )r0   ZfgZisRGBAr%   r%   r&   r¬   Ë  s    z GraphicsContextWx.set_foregroundc             C   sˆ   t |ƒ}tdd| ƒ |  ¡  d|  k r0dk r8n nd}t | |¡ t| j | j¡ƒ}|dkrbd}| j	 
|¡ | j | j	¡ |  ¡  dS )z%
        Set the line width.
        zset_linewidth()r   r   N)Úfloatr'   rz   r   Úset_linewidthr…   r¦   r—   Z
_linewidthr¤   ÚSetWidthrd   r¥   r   )r0   rl   Zlwr%   r%   r&   r®   Þ  s    zGraphicsContextWx.set_linewidthc             C   sN   t dd| ƒ |  ¡  t | |¡ | j tj| j ¡ | j	 
| j¡ |  ¡  dS )zQ
        Set the capstyle as a string in ('butt', 'round', 'projecting')
        zset_capstyle()r   N)r'   rz   r   Úset_capstyler¤   ZSetCapr‘   Ú_capdZ	_capstylerd   r¥   r   )r0   Zcsr%   r%   r&   r°   ï  s    zGraphicsContextWx.set_capstylec             C   sN   t dd| ƒ |  ¡  t | |¡ | j tj| j ¡ | j	 
| j¡ |  ¡  dS )zM
        Set the join style to be one of ('miter', 'round', 'bevel')
        zset_joinstyle()r   N)r'   rz   r   Úset_joinstyler¤   ZSetJoinr‘   Ú_joindZ
_joinstylerd   r¥   r   )r0   Zjsr%   r%   r&   r²   ú  s    zGraphicsContextWx.set_joinstylec             C   s¨   t dd| ƒ t|ƒdkrV|\}}}|d9 }|d9 }|d9 }tjt|ƒt|ƒt|ƒdS |\}}}}|d9 }|d9 }|d9 }|d9 }tjt|ƒt|ƒt|ƒt|ƒdS dS )z"return a wx.Colour from RGB formatzget_wx_color()r   r   éÿ   )ÚredÚgreenÚblue)rµ   r¶   r·   ZalphaN)r'   Úlenr;   ÚColourr…   )r0   rŽ   ÚrÚgrŠ   Úar%   r%   r&   r~     s"    
zGraphicsContextWx.get_wxcolour)N)r3   r4   r5   r6   r;   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr±   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr³   ÚweakrefÚWeakKeyDictionaryrŸ   rG   rz   r   r¬   r®   r°   r²   r~   r%   r%   r%   r&   r‘   Œ  s    

	
r‘   c            p       s˜  e Zd Z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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j6dej7dej8dej9dej:dej;dej<di8Z=d/d0„ Z>e?e@ Ad1¡d2d3„ ƒƒZBdyd5d6„ZCd7d8„ ZDd9d:„ ZEd;d<„ ZFdzd>d?„ZGd{d@dA„ZHdBdC„ ZId|dEdF„ZJeKjLdGdHdHdIdJdKdKdLdMœ–ZL‡ fdNdO„ZMdPdQ„ ZNdRdS„ ZOdTdU„ ZPdVdW„ ZQdXdY„ ZRd}d[d\„ZSd]d^„ ZTd_d`„ ZUdadb„ ZVdcdd„ ZWdedf„ ZXdgdh„ ZYdidj„ ZZdkdl„ Z[dmdn„ Z\dodp„ Z]dqdr„ Z^dsdt„ Z_dudv„ Z`dwdx„ Za‡  ZbS )~Ú_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.
    ÚcontrolÚshiftÚaltÚleftZupÚrightZdownÚescapeÚf1Úf2Zf3Zf4Zf5Zf6Zf7Zf8Zf9Zf10Zf11Zf12Zscroll_lockÚbreakZ	backspaceZenterÚinsertÚdeleteÚhomeÚendZpageupZpagedownÚ0Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9ú+ú-Ú*ú/Zdecc             C   sÀ  t  | |¡ |jj\}}}}t |¡}t |¡}tjj| ||t ||¡d t 	||¡| _
td||f 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j0| j1¡ |  tj2| j1¡ |  3tj4¡ |  5tj6¡ dS )zØ
        Initialise a FigureWx instance.

        - Initialise the FigureCanvasBase and wxPanel parents.
        - Set event handlers for:
          EVT_SIZE  (Resize event)
          EVT_PAINT (Paint event)
        )r›   z__init__() - bitmap w:%d h:%dr   FN)7r   rG   rˆ   rq   r   Úceilr;   ÚPanelÚSizer‚   r\   r'   Ú_isDrawnÚBindZEVT_SIZEÚ_onSizeZ	EVT_PAINTÚ_onPaintZEVT_KEY_DOWNÚ
_onKeyDownZ
EVT_KEY_UPÚ_onKeyUpZEVT_RIGHT_DOWNÚ_onRightButtonDownZEVT_RIGHT_DCLICKÚ_onRightButtonDClickZEVT_RIGHT_UPÚ_onRightButtonUpZEVT_MOUSEWHEELÚ_onMouseWheelÚEVT_LEFT_DOWNÚ_onLeftButtonDownZEVT_LEFT_DCLICKÚ_onLeftButtonDClickZEVT_LEFT_UPÚ_onLeftButtonUpZ
EVT_MOTIONÚ	_onMotionZEVT_LEAVE_WINDOWÚ_onLeaveZEVT_ENTER_WINDOWÚ_onEnterZEVT_MIDDLE_DOWNÚ_onMiddleButtonDownZEVT_MIDDLE_DCLICKÚ_onMiddleButtonDClickZEVT_MIDDLE_UPÚ_onMiddleButtonUpZEVT_MOUSE_CAPTURE_CHANGEDÚ_onCaptureLostZEVT_MOUSE_CAPTURE_LOSTZSetBackgroundStyleZBG_STYLE_PAINTZSetBackgroundColourZWHITE)r0   r8   ÚidÚfigurer‰   rŠ   rl   rm   r%   r%   r&   rG   `  s:    


z_FigureCanvasWxBase.__init__z3.0c             C   s   i S )Nr%   )r0   r%   r%   r&   Úmacros’  s    z_FigureCanvasWxBase.macrosNc             C   sP   t  ¡ }| | j¡ t j ¡ sLt j ¡ }|rLt j |¡ t j ¡  t j 	¡  dS )z)copy bitmap of canvas to system clipboardN)
r;   ÚBitmapDataObjectZ	SetBitmapr\   ÚTheClipboardZIsOpenedÚOpenÚSetDataÚCloseZFlush)r0   ÚeventZbmp_objZopen_successr%   r%   r&   ÚCopy_to_Clipboard—  s    


z%_FigureCanvasWxBase.Copy_to_Clipboardc             C   s"   t dd| ƒ d| _| jdd dS )z8
        Delay rendering until the GUI is idle.
        zdraw_idle()r   F)ÚeraseBackgroundN)r'   rÞ   ÚRefresh)r0   r%   r%   r&   Ú	draw_idle£  s    z_FigureCanvasWxBase.draw_idlec             O   s
   t ||ŽS )a
  
        Creates a new backend-specific subclass of
        :class:`backend_bases.Timer`. This is useful for getting periodic
        events through the backend's native event loop. Implemented only
        for backends with GUIs.

        Other Parameters
        ----------------
        interval : scalar
            Timer interval in milliseconds
        callbacks : list
            Sequence of (func, args, kwargs) where ``func(*args, **kwargs)``
            will be executed by the timer every *interval*.

        )rF   )r0   rJ   rK   r%   r%   r&   Ú	new_timer®  s    z_FigureCanvasWxBase.new_timerc             C   s   t  ¡  d S )N)r;   ÚYield)r0   r%   r%   r&   Úflush_eventsÀ  s    z _FigureCanvasWxBase.flush_eventsr   c             C   sv   t | dƒrtdƒ‚t ¡ }tj| |d}|dkrV|j|d dd | jtj| j|d t 	¡ | _
| j
 ¡  | ¡  dS )	a  
        Start an event loop.  This is used to start a blocking event
        loop so that interactive functions, such as ginput and
        waitforbuttonpress, can wait for events.  This should not be
        confused with the main GUI event loop, which is always running
        and has nothing to do with this.

        This call blocks until a callback function triggers
        stop_event_loop() or *timeout* is reached.  If *timeout* is
        <=0, never timeout.

        Raises RuntimeError if event loop is already running.
        Ú_event_loopzEvent loop already running)ró   r   iè  T)ZoneShotN)ÚhasattrÚRuntimeErrorr;   ÚNewIdrH   rL   rß   Z	EVT_TIMERÚstop_event_loopZGUIEventLoopr  ZRunrN   )r0   Ztimeoutró   Ztimerr%   r%   r&   Ústart_event_loopÃ  s    


z$_FigureCanvasWxBase.start_event_loopc             C   s&   t | dƒr"| j ¡ r| j ¡  | `dS )z½
        Stop an event loop.  This is used to stop a blocking event
        loop so that interactive functions, such as ginput and
        waitforbuttonpress, can wait for events.

        r  N)r  r  Z	IsRunningZExit)r0   rû   r%   r%   r&   r  Þ  s    


z#_FigureCanvasWxBase.stop_event_loopc             C   sœ   |   ¡ }|  ¡ }t| ¡ ƒ}g }g }d}x^t|ƒD ]R\}\}}	d dd„ |	D ƒ¡}
| |	d ¡ d||
|
f }||	krz|}| |¡ q2W d |¡}|||fS )z2return the wildcard string for the filesave dialogr   ú;c             S   s   g | ]}d | ‘qS )z*.%sr%   )Ú.0Úextr%   r%   r&   ú
<listcomp>ó  s    z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z
%s (%s)|%sú|)Zget_default_filetypeZget_supported_filetypes_groupedÚsortedÚitemsÚ	enumeraterC   Úappend)r0   Zdefault_filetypeÚ	filetypesZsorted_filetypesZ	wildcardsÚ
extensionsÚfilter_indexÚiÚnameÚextsZext_listZwildcardr%   r%   r&   Ú_get_imagesave_wildcardsê  s    
z,_FigureCanvasWxBase._get_imagesave_wildcardsÚWXc             C   sj   t dd| ƒ |  ¡ rf|s"t | ¡}tjdkrV|dkrV| j ¡ }| ¡ }| |dd¡ n| | jdd¡ 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gui_repaint()r   Ú	__WXMSW__r  r   N)	r'   ZIsShownOnScreenr;   ÚClientDCÚPlatformr\   ÚConvertToImageZConvertToBitmapr„   )r0   ÚdrawDCÚoriginZimgÚbmpr%   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pcxÚpngZtifZtiffZxpmc                s&   t ƒ j|f|ž|Ž | jr"|  ¡  d S )N)ÚsuperÚprint_figurerÞ   Údraw)r0   ÚfilenamerJ   rK   )r   r%   r&   r$    s    z _FigureCanvasWxBase.print_figurec             C   sB   t dd| ƒ t | ¡}| js*| j|d n| j|d | ¡  dS )z5
        Called when wxPaintEvt is generated
        z
_onPaint()r   )r  N)r'   r;   ZPaintDCrÞ   r%  r!  r>   )r0   Úevtr  r%   r%   r&   rá   '  s    
z_FigureCanvasWxBase._onPaintc             C   sö   t dd| ƒ |  ¡  ¡ }|r&| | ¡}|rJ|rJ|jsJ|jtj@ sJ|  ¡ }n|  	¡ }t
| ddƒrr|| j| jfkrrdS |\| _| _t | j| j¡| _d| _| jdksª| jdkr®dS | 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	_onSize()r   Ú_widthNFr   )Zforward)rý   )r'   Ú	GetParentÚGetSizerZGetItemZ
ProportionÚFlagr;   ÚEXPANDZ
GetMinSizeZGetClientSizeÚgetattrr(  Ú_heightr‚   r\   rÞ   rô   r^   Zset_size_inchesrþ   r   Zresize_event)r0   r'  ZszZsir›   ZdpivalZwinchZhinchr%   r%   r&   rà   4  s*    



z_FigureCanvasWxBase._onSizec             C   sz   |j }|| jkr| j| }n&|dk r>t|ƒ}| ¡ sB| ¡ }nd }x2|jdg|jdgfD ]\}}|ƒ rXd ||¡}qXW |S )Né   rÂ   Zctrlz{0}+{1})ZKeyCodeÚkeyvaldÚchrZ	ShiftDownÚlowerZAltDownZControlDownÚformat)r0   r'  Zkeyvalrš   ÚmethÚprefixr%   r%   r&   Ú_get_key^  s    

z_FigureCanvasWxBase._get_keyc             C   s*   |   |¡}tj| ||d | r&| ¡  dS )zCapture key press.)ÚguiEventN)r6  r   Zkey_press_eventÚSkip)r0   r'  rš   r%   r%   r&   râ   t  s    
z_FigureCanvasWxBase._onKeyDownc             C   s*   |   |¡}tj| ||d | r&| ¡  dS )zRelease key.)r7  N)r6  r   Zkey_release_eventr8  )r0   r'  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)r0   Zcapturer%   r%   r&   Ú_set_capture‚  s    z _FigureCanvasWxBase._set_capturec             C   s   |   d¡ dS )zCapture changed or lostFN)r9  )r0   r'  r%   r%   r&   rò   ‰  s    z"_FigureCanvasWxBase._onCaptureLostc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zStart measuring on an axis.Tr   )r7  N)	ÚGetXrô   rˆ   r[   ÚGetYr8  r9  r   Úbutton_press_event)r0   r'  r†   r‡   r%   r%   r&   rä     s
    
z&_FigureCanvasWxBase._onRightButtonDownc             C   sF   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||dd|d dS )zStart measuring on an axis.Tr   )Údblclickr7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r<  )r0   r'  r†   r‡   r%   r%   r&   rå   •  s    
z(_FigureCanvasWxBase._onRightButtonDClickc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zEnd measuring on an axis.Fr   )r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   Úbutton_release_event)r0   r'  r†   r‡   r%   r%   r&   ræ   ž  s
    
z$_FigureCanvasWxBase._onRightButtonUpc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zStart measuring on an axis.Tr   )r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r<  )r0   r'  r†   r‡   r%   r%   r&   ré   ¦  s
    
z%_FigureCanvasWxBase._onLeftButtonDownc             C   sF   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||dd|d dS )zStart measuring on an axis.Tr   )r=  r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r<  )r0   r'  r†   r‡   r%   r%   r&   rê   ®  s    
z'_FigureCanvasWxBase._onLeftButtonDClickc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zEnd measuring on an axis.Fr   )r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r>  )r0   r'  r†   r‡   r%   r%   r&   rë   ·  s
    
z#_FigureCanvasWxBase._onLeftButtonUpc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zStart measuring on an axis.Tr   )r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r<  )r0   r'  r†   r‡   r%   r%   r&   rï   À  s
    
z'_FigureCanvasWxBase._onMiddleButtonDownc             C   sF   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||dd|d dS )zStart measuring on an axis.Tr   )r=  r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r<  )r0   r'  r†   r‡   r%   r%   r&   rð   È  s    
z)_FigureCanvasWxBase._onMiddleButtonDClickc             C   sD   |  ¡ }| jjj| ¡  }| ¡  |  d¡ tj| ||d|d dS )zEnd measuring on an axis.Fr   )r7  N)	r:  rô   rˆ   r[   r;  r8  r9  r   r>  )r0   r'  r†   r‡   r%   r%   r&   rñ   Ñ  s
    
z%_FigureCanvasWxBase._onMiddleButtonUpc             C   s   |  ¡ }| jjj| ¡  }| ¡ }| ¡ }| ¡ }|| | }| ¡  t	j
dkrxt| dƒsbd| _n| jrrd| _dS d| _tj| ||||d dS )z3Translate mouse wheel events into matplotlib eventsZ	__WXMAC__Ú_skipwheeleventTFN)r7  )r:  rô   rˆ   r[   r;  ZGetWheelDeltaZGetWheelRotationZGetLinesPerActionr8  r;   r  r  r?  r   Zscroll_event)r0   r'  r†   r‡   ZdeltaZrotationZrateÚstepr%   r%   r&   rç   Ù  s    

z!_FigureCanvasWxBase._onMouseWheelc             C   s8   |  ¡ }| jjj| ¡  }| ¡  tj| |||d dS )zStart measuring on an axis.)r7  N)r:  rô   rˆ   r[   r;  r8  r   Zmotion_notify_event)r0   r'  r†   r‡   r%   r%   r&   rì   ÷  s    z_FigureCanvasWxBase._onMotionc             C   s   |  ¡  tj| |d dS )zMouse has left the window.)r7  N)r8  r   Zleave_notify_event)r0   r'  r%   r%   r&   rí   ÿ  s    z_FigureCanvasWxBase._onLeavec             C   s:   |  ¡ }| jjj| ¡  }| ¡  tj| |||fd dS )zMouse has entered the window.)r7  ZxyN)r:  rô   rˆ   r[   r;  r8  r   Zenter_notify_event)r0   r'  r†   r‡   r%   r%   r&   rî     s    z_FigureCanvasWxBase._onEnter)N)r   )N)Nr  )T)cr3   r4   r5   r6   r;   ZWXK_CONTROLZ	WXK_SHIFTZWXK_ALTZ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_DELETEr0  rG   Úpropertyr   Ú
deprecatedrõ   rü   rÿ   r   r  r  r  r  r!  r   r  r$  rá   rà   r6  râ   rã   r9  rò   rä   rå   ræ   ré   rê   rë   rï   rð   rñ   rç   rì   rí   rî   Ú__classcell__r%   r%   )r   r&   r¿     sÄ   
2




*
				r¿   c               @   s^   e Zd Zddd„Zdd„ Zes*dd„ ZeZdd	„ Zd
d„ Z	esJdd„ Z
e
Zdd„ Zdd„ ZdS )ÚFigureCanvasWxNc             C   sB   t dd| ƒ 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draw()r   T)r  N)	r'   rR   r\   rô   r^   r¦   r%  rÞ   r!  )r0   r  r%   r%   r&   r%    s
    zFigureCanvasWx.drawc             O   s   | j |tjf|ž|ŽS )N)Ú_print_imager;   ZBITMAP_TYPE_BMP)r0   r&  rJ   rK   r%   r%   r&   Ú	print_bmp  s    zFigureCanvasWx.print_bmpc             O   s   | j |tjf|ž|ŽS )N)rE  r;   ÚBITMAP_TYPE_JPEG)r0   r&  rJ   rK   r%   r%   r&   Ú
print_jpeg  s    zFigureCanvasWx.print_jpegc             O   s   | j |tjf|ž|ŽS )N)rE  r;   ZBITMAP_TYPE_PCX)r0   r&  rJ   rK   r%   r%   r&   Ú	print_pcx$  s    zFigureCanvasWx.print_pcxc             O   s   | j |tjf|ž|ŽS )N)rE  r;   ZBITMAP_TYPE_PNG)r0   r&  rJ   rK   r%   r%   r&   Ú	print_png'  s    zFigureCanvasWx.print_pngc             O   s   | j |tjf|ž|ŽS )N)rE  r;   ZBITMAP_TYPE_TIF)r0   r&  rJ   rK   r%   r%   r&   Ú
print_tiff+  s    zFigureCanvasWx.print_tiffc             O   s   | j |tjf|ž|ŽS )N)rE  r;   ZBITMAP_TYPE_XPM)r0   r&  rJ   rK   r%   r%   r&   Ú	print_xpm0  s    zFigureCanvasWx.print_xpmc             O   s0  | j }| jjj\}}}}	t |¡}t |	¡}	t ||	¡| _ t| j | jj	ƒ}
|
 
¡ }| j |
¡ | j }|tjkrš| dtd ¡}| j  ¡ }| tjt|ƒ¡ t|tƒrÊ| ||¡sÈtdd| ƒ td| ƒ‚nDt|ƒrt|tjƒsè| ¡ }| ||¡stdd| ƒ td| ƒ‚|| _ | jr$|  ¡  |  ¡  d S )NZqualityzsavefig.jpeg_qualityzprint_figure() file save errorr   zCould not save figure to %s
)r\   rô   rˆ   rq   r   rÛ   r;   r‚   rR   r^   rc   r%  rG  r•   r   r  Z	SetOptionZIMAGE_OPTION_QUALITYrB   rA   ZSaveFiler'   r  r   ZImageZ
SaveStreamrÞ   rþ   )r0   r&  ZfiletyperJ   rK   Z
origBitmapr‰   rŠ   rY   r[   r¦   r_   ÚimageZjpeg_qualityr%   r%   r&   rE  3  s@    







zFigureCanvasWx._print_image)N)r3   r4   r5   r%  rF  r   rH  Z	print_jpgrI  rJ  rK  Z	print_tifrL  rE  r%   r%   r%   r&   rD    s   
rD  c               @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚFigureFrameWxc             C   sÒ  t jdkrt j}nt  dd¡}|jj\}}}}t jj| d d|d| d tdd| ƒ || _	t
| ƒ |  |¡| _| j t  |jj|jj¡¡ | j ¡  t  t j¡| _| j | jdt jt jB t jB ¡ |  ¡ | _| jrât| | jƒ| _n
t| ƒ| _|  | j¡ |  | j¡| _ | jr.t! "| 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|| ƒ| _+|  ,t j-| j.¡ d S )
Nr  é   éÿÿÿÿz	Figure %d)r8   ró   ÚposÚtitlez
__init__()r   r   )r   r   )/r;   r  ZDefaultPositionZPointrˆ   rq   ÚFramerG   r'   ÚnumÚ_set_frame_iconÚ
get_canvasÚcanvasÚSetInitialSizerÝ   rY   r[   ZSetFocusÚBoxSizerÚVERTICALÚsizerÚAddÚTOPÚLEFTr,  Ú_get_toolmanagerÚtoolmanagerÚStatusbarWxZ	statusbarÚStatusBarWxZSetStatusBarÚ_get_toolbarÚtoolbarr   Zadd_tools_to_managerZadd_tools_to_containerÚRealizeÚGetSizeZSetSizeÚSetSizerÚFitZ
SetMinSizeÚFigureManagerWxÚfigmgrrß   Ú	EVT_CLOSEÚ_onClose)r0   rT  ÚfigrQ  r‰   rŠ   rl   rm   ZtwZthÚfwZfhr%   r%   r&   rG   u  sF    

 


zFigureFrameWx.__init__c             C   sF   t d dkr"t| jƒ}| |¡ n tj d dkr>t| j| ƒ}nd }|S )Nrd  Ztoolbar2r`  )r   ÚNavigationToolbar2WxrW  Úset_status_barÚ
matplotlibÚ	ToolbarWxr`  )r0   Ústatbarrd  r%   r%   r&   rc  µ  s    
zFigureFrameWx._get_toolbarc             C   s$   t jd dkrt| jjƒ}nd }|S )Nrd  r`  )rq  r   r   rW  rô   )r0   r`  r%   r%   r&   r_  ¿  s    zFigureFrameWx._get_toolmanagerc             C   s   t | d|ƒS )NrP  )rD  )r0   rm  r%   r%   r&   rV  Æ  s    zFigureFrameWx.get_canvasc             C   s   t dd| ƒ | jS )Nzget_figure_manager()r   )r'   rj  )r0   r%   r%   r&   Úget_figure_managerÉ  s    z FigureFrameWx.get_figure_managerc             C   s0   t dd| ƒ | j ¡  | j ¡  t | j¡ d S )Nz	onClose()r   )r'   rW  Zclose_eventr  r   ÚdestroyrT  )r0   r'  r%   r%   r&   rl  Í  s    

zFigureFrameWx._onClosec             C   s   | j S )z=Override wxFrame::GetToolBar as we don't have managed toolbar)rd  )r0   r%   r%   r&   Ú
GetToolBarÔ  s    zFigureFrameWx.GetToolBarc             O   sr   y| j  | jj¡ W n tk
r(   Y nX |  ¡ sntjj| f|ž|Ž | jd k	rZ| j ¡  t 	¡ }|rn| 
¡  dS )NT)rW  Zmpl_disconnectrd  Z_idDragÚAttributeErrorZIsBeingDeletedr;   rS  r>   ÚGetAppr  )r0   rJ   rK   Úwxappr%   r%   r&   r>   Ø  s    

zFigureFrameWx.DestroyN)r3   r4   r5   rG   rc  r_  rV  rt  rl  rv  r>   r%   r%   r%   r&   rN  t  s   @
rN  c               @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ri  a  
    This class contains the FigureCanvas and GUI frame

    It is instantiated by GcfWx whenever a new figure is created. GcfWx 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             C   sB   t dd| ƒ t | ||¡ || _|| _t|dd ƒ| _| ¡ | _d S )Nz
__init__()r   r`  )	r'   r   rG   ÚframeÚwindowr-  r`  rv  rd  )r0   rW  rT  rz  r%   r%   r&   rG   ø  s    zFigureManagerWx.__init__c             C   s   | j  ¡  | j ¡  d S )N)rz  ÚShowrW  r%  )r0   r%   r%   r&   Úshow  s    
zFigureManagerWx.showc             G   s.   t dd| ƒ | j ¡  t ¡ }|r*| ¡  d S )Nz	destroy()r   )r'   rz  r>   r;   rx  r  )r0   rJ   ry  r%   r%   r&   ru    s
    
zFigureManagerWx.destroyc             C   s
   | j  ¡ S )N)r{  ZGetTitle)r0   r%   r%   r&   Úget_window_title  s    z FigureManagerWx.get_window_titlec             C   s   | j  |¡ d S )N)r{  ZSetTitle)r0   rR  r%   r%   r&   Úset_window_title  s    z FigureManagerWx.set_window_titlec             C   s*   | j  t ||¡¡ | j ¡  | j¡ dS )zSet the canvas size in pixelsN)rW  rX  r;   rÝ   r{  r*  rh  )r0   rY   r[   r%   r%   r&   Úresize  s    zFigureManagerWx.resizeN)
r3   r4   r5   r6   rG   r}  ru  r~  r  r€  r%   r%   r%   r&   ri  è  s   	ri  c             C   sN   t j td d¡}t j t j || ¡¡}t j |¡s@td| ƒ‚t |¡}|S )zü
    Load a bitmap file from the backends/images subdirectory in which the
    matplotlib library is installed. The filename parameter should not
    contain any path information as this is determined automatically.

    Returns a wx.Bitmap object
    ÚdatapathÚimagesz&Could not find bitmap file "%s"; dying)	Úosrt   rC   r   ÚnormpathÚexistsÚIOErrorr;   r‚   )r&  ZbasedirZbmpFilenamer   r%   r%   r&   Ú_load_bitmap,  s    	
r‡  c             C   sl   t  ¡ }xTdD ]L}tj tjd d|¡}tj |¡s6qt  t	|ƒ¡}| 
¡ sPd S | |¡ qW |  |¡ d S )N)zmatplotlib.pngzmatplotlib_large.pngr  r‚  )r;   Z
IconBundlerƒ  rt   rC   rq  r   r…  ZIconr‡  ÚIsOkZAddIconZSetIcons)rz  ZbundlerM  Ziconr%   r%   r&   rU  ?  s    
rU  c               @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚMenuButtonWxzä
    wxPython does not permit a menu to be incorporated directly into a toolbar.
    This class simulates the effect by associating a pop-up menu with a button
    in the toolbar, and managing this as though it were a menu.
    c             C   s¸   t jj| |tdt jd || _t  ¡ | _g | _t  	¡ | _
t  	¡ | _| j | j
ddd¡ | j | jddd¡ | j ¡  | jt j| jtd | jt j| j| j
d | jt j| j| jd d S )	NzAxes:        )r:   ZAllzSelect all axesFZInvertzInvert axes selected)ró   )r;   ÚButtonrG   Ú_NTB_AXISMENU_BUTTONZBU_EXACTFITÚ_toolbarZMenuÚ_menuÚ_axisIdr  Z_allIdZ	_invertIdÚAppendZAppendSeparatorrß   Ú
EVT_BUTTONÚ_onMenuButtonÚEVT_MENUÚ_handleSelectAllAxesÚ_handleInvertAxesSelected)r0   r8   r%   r%   r&   rG   T  s    




zMenuButtonWx.__init__c             C   s   | j  ¡  |  ¡  d S )N)r  r>   )r0   r%   r%   r&   r>   h  s    
zMenuButtonWx.Destroyc             C   s<   |   ¡ \}}|  ¡ \}}|  | j||| d ¡ | ¡  dS )zHandle menu button pressed.r   N)ZGetPositionrf  ZPopupMenuXYr  r8  )r0   r'  r†   r‡   rl   rm   r%   r%   r&   r‘  l  s    zMenuButtonWx._onMenuButtonc             C   sZ   t | jƒdkrdS x*tt | jƒƒD ]}| j | j| d¡ q"W | j |  ¡ ¡ | ¡  dS )z8Called when the 'select all axes' menu item is selected.r   NT)	r¸   rŽ  Úranger  ÚCheckrŒ  Ú
set_activeÚgetActiveAxesr8  )r0   r'  r  r%   r%   r&   r“  t  s    z!MenuButtonWx._handleSelectAllAxesc             C   s‚   t | jƒdkrdS xRtt | jƒƒD ]@}| j | j| ¡rN| j | j| d¡ q"| j | j| d¡ q"W | j |  ¡ ¡ | 	¡  dS )z0Called when the invert all menu item is selectedr   NFT)
r¸   rŽ  r•  r  Ú	IsCheckedr–  rŒ  r—  r˜  r8  )r0   r'  r  r%   r%   r&   r”  }  s    z&MenuButtonWx._handleInvertAxesSelectedc             C   sL   | j  | ¡ ¡}|rd}nd}| j  | ¡ |¡ | j |  ¡ ¡ | ¡  dS )z?Called whenever one of the specific axis menu items is selectedFTN)r  r™  ZGetIdr–  rŒ  r—  r˜  r8  )r0   r'  ZcurrentÚnewr%   r%   r&   Ú_onMenuItemSelected‰  s    z MenuButtonWx._onMenuItemSelectedc             C   sÞ   |t | jƒkr„x¶tt | jƒd |d dƒD ]T}t ¡ }| j |¡ | j |d| d| d¡ | j |d¡ | j	tj
| j|d q*W nB|t | jƒk rÆx"| j|d… D ]}| j |¡ q¢W | jd|… | _| j tt|ƒƒ¡ dS )z[Ensures that there are entries for max_axis axes in the menu
        (selected by default).r   zAxis %dzSelect axis %dT)ró   N)r¸   rŽ  r•  r;   r  r  r  r  r–  rß   r’  r›  ZDeleterŒ  r—  Úlist)r0   ZmaxAxisr  ZmenuIdr%   r%   r&   Ú
updateAxes–  s     zMenuButtonWx.updateAxesc             C   s<   g }x2t t| jƒƒD ] }| j | j| ¡r| |¡ qW |S )z#Return a list of the selected axes.)r•  r¸   rŽ  r  r™  r  )r0   Zactiver  r%   r%   r&   r˜  ¨  s
    zMenuButtonWx.getActiveAxesc             C   s"   |   dd dd„ |D ƒ¡ ¡ dS )z4Update the list of selected axes in the menu button.zAxes: ú,c             s   s   | ]}d |d  V  qdS )z%dr   Nr%   )r
  Úer%   r%   r&   ú	<genexpr>³  s    z0MenuButtonWx.updateButtonText.<locals>.<genexpr>N)ZSetLabelrC   )r0   Zlstr%   r%   r&   ÚupdateButtonText°  s    zMenuButtonWx.updateButtonTextN)r3   r4   r5   r6   rG   r>   r‘  r“  r”  r›  r  r˜  r¡  r%   r%   r%   r&   r‰  M  s   	r‰  z2.2c               @   s   e Zd Zdd„ ZdS )ÚSubplotToolWXc             C   sz   t j | d dd¡ tdƒ}t| d|ƒ}t|d| ƒ}t  t j¡}| |dt j	t j
B t jB ¡ |  |¡ |  ¡  t||ƒ}d S )NrP  zConfigure subplots)é   r   r   )r;   rS  rG   r   rD  ÚFigureManagerrY  rZ  r\  r^  r]  ÚGROWrg  rh  r   )r0   Z	targetfigÚtoolfigrW  rj  r[  Útoolr%   r%   r&   rG   Á  s    
zSubplotToolWX.__init__N)r3   r4   r5   rG   r%   r%   r%   r&   r¢  ¿  s   r¢  c               @   s|   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ro  c             C   sH   t j | | ¡ d¡ t | |¡ || _d| _d | _d | _dt j	k| _
d S )NrP  TÚwxMac)r;   ÚToolBarrG   r)  r   rW  Z_idlers  ÚprevZoomRectÚPlatformInfoÚ	retinaFix)r0   rW  r%   r%   r&   rG   Õ  s    zNavigationToolbar2Wx.__init__c             C   s   t | jƒ|d|ƒS )NrP  )r+   rW  )r0   rz  rm  r%   r%   r&   rV  â  s    zNavigationToolbar2Wx.get_canvasc          
   C   s¬   t dd| ƒ | j ¡ | _i | _x€| jD ]v\}}}}|d krD|  ¡  q&| jdt|d ƒt	j
||||dkrlt	jnt	jdj| j|< | jt	jt| |ƒ| j| d q&W |  ¡  d S )NÚ_init_toolbarr   rP  z.png)ÚPanÚZoom)r\   ZbmpDisabledÚlabelZ	shortHelpZlongHelpÚkind)ró   )r'   rW  r)  Ú_parentÚwx_idsZ	toolitemsÚAddSeparatorZAddToolr‡  r;   r«   Ú
ITEM_CHECKÚITEM_NORMALÚIdrß   ÚEVT_TOOLr-  re  )r0   ÚtextZtooltip_textÚ
image_fileÚcallbackr%   r%   r&   r­  å  s"    
z"NavigationToolbar2Wx._init_toolbarc             G   s&   |   | jd d¡ tj| f|žŽ  d S )Nr®  F)Ú
ToggleToolr³  r   Úzoom)r0   rJ   r%   r%   r&   r½  ý  s    zNavigationToolbar2Wx.zoomc             G   s&   |   | jd d¡ tj| f|žŽ  d S )Nr¯  F)r¼  r³  r   Úpan)r0   rJ   r%   r%   r&   r¾    s    zNavigationToolbar2Wx.panc             C   sŠ   t  d dd¡}t|ƒ tdƒ}|  ||¡}t|d|ƒ}t  t j¡}| |dt j	t j
B t jB ¡ | |¡ | ¡  t| jj|ƒ}| ¡  d S )NrP  zConfigure subplots)r£  r   r   )r;   rS  rU  r   rV  r¤  rY  rZ  r\  r^  r]  r¥  rg  rh  r   rW  rô   r|  )r0   r'  rz  r¦  rW  rj  r[  r§  r%   r%   r&   Úconfigure_subplots  s    
z'NavigationToolbar2Wx.configure_subplotsc          
   G   s*  | j  ¡ \}}}| j  ¡ }t | jdd||tjtjB ¡}| |¡ | 	¡ tj
kr&| ¡ }| ¡ }td||f d| ƒ || ¡  }	tj |¡\}
}| d¡r¨|dd … }|dkrÔ|	|krÔtjd||	|f d	d
 |}	y | j jjtj ||¡|	d W n0 tk
r$ } ztt|ƒƒ W d d }~X Y nX d S )NzSave to filer“   zSave file dir:%s name:%sr   Ú.r   )ÚsvgÚpdfÚpsÚepsr"  zDextension %s did not match the selected image type %s; going with %sr   )Ú
stacklevel)r3  )rW  r  Úget_default_filenamer;   Ú
FileDialogr²  ÚFD_SAVEÚFD_OVERWRITE_PROMPTÚSetFilterIndexr=   ÚID_OKÚGetDirectoryÚGetFilenamer'   ÚGetFilterIndexrƒ  rt   ÚsplitextÚ
startswithÚwarningsÚwarnrô   ÚsavefigrC   Ú	Exceptionr?   rB   )r0   rJ   r  r  r  Údefault_fileÚdlgÚdirnamer&  r3  Úbasenamer  rŸ  r%   r%   r&   Úsave_figure  s4    


z NavigationToolbar2Wx.save_figurec             C   s(   t  t| ¡}| j |¡ | j ¡  d S )N)r;   ÚCursorÚcursordrW  Ú	SetCursorÚUpdate)r0   Úcursorr%   r%   r&   Ú
set_cursor9  s    zNavigationToolbar2Wx.set_cursorc             C   sT   | j dkrP| jst ¡ | _n4|jd k	rP| j |jj¡| _	|j
| _|j| _|j| _d S )NÚZOOM)Ú_activer¬  r;   ÚOverlayÚ	wxoverlayZinaxesrW  Zcopy_from_bboxrˆ   ÚsavedRetinaImageÚxdataÚ
zoomStartXÚydataÚ
zoomStartYÚzoomAxes)r0   rû   r%   r%   r&   Úpress>  s    

zNavigationToolbar2Wx.pressc             C   sP   | j dkrL| js | j ¡  | `n,| `| jr@| j d¡ ¡  d | _| jrLd | _d S )Nrà  r   )	rá  r¬  rã  ÚReseträ  rª  ÚpopÚremoveré  )r0   rû   r%   r%   r&   ÚreleaseJ  s    

zNavigationToolbar2Wx.releasec             C   sœ  | j r¢d}| jr | j d¡ ¡  | j | j¡ | j|j }}| j	|j
 }	}
|||||f}|	|
|
|	|	f}| jj||d|d| _| j | jd ¡ | j | jj¡ d S t | j¡}t | j|¡}| ¡  dtjkrØt |¡}| jjjj}|| }|| }||k r|| }}||k r|| }}|| }|| }t ||||¡}d}t |¡}| t |d¡¡ | d¡\}}}}| |||d¡ | t  |¡¡ | !|¡ d S )	Nz#C0C0FFr   rØ   )rŽ   r¨  r   Té`   )"r¬  rª  rì  rí  rW  Zrestore_regionrä  ræ  rå  rè  rç  ré  ZplotZdraw_artistZblitrˆ   r;   r  Ú	DCOverlayrã  ÚClearr«  ÚGCDCrô   r[   ÚRectr¹   r¥   r¢   ÚGetÚSetr|   r}   ÚDrawRectangle)r0   rû   Úx0Úy0Úx1Úy1ÚrubberBandColorZX0ZX1ZY0ZY1ZlineXZlineYr¡   Úodcr[   rl   rm   ÚrectrŽ   rº   r»   rŠ   r¼   r%   r%   r&   Údraw_rubberbandY  sH    






z$NavigationToolbar2Wx.draw_rubberbandc             C   s
   || _ d S )N)rs  )r0   rs  r%   r%   r&   rp    s    z#NavigationToolbar2Wx.set_status_barc             C   s   | j d k	r| j  |¡ d S )N)rs  Úset_function)r0   rh   r%   r%   r&   Úset_message’  s    
z NavigationToolbar2Wx.set_messagec             C   sL   | j jdk}| j jt| j jƒd k }|  | jd |¡ |  | jd |¡ d S )Nr   r   ZBackZForward)Z
_nav_stackZ_posr¸   Z	_elementsZ
EnableToolr³  )r0   Zcan_backwardZcan_forwardr%   r%   r&   Úset_history_buttons–  s    z(NavigationToolbar2Wx.set_history_buttonsN)r3   r4   r5   rG   rV  r­  r½  r¾  r¿  rÙ  rß  rê  rî  rþ  rp  r   r  r%   r%   r%   r&   ro  Ô  s    6ro  )rW   c               @   s   e Zd ZdS )ÚToolbarN)r3   r4   r5   r%   r%   r%   r&   r    s   r  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )rb  z 
    A status bar is added to _FigureFrame to allow measurements and the
    previously selected scroll function to be displayed as a user
    convenience.
    c             O   s*   t j | |d¡ |  d¡ |  dd¡ d S )NrP  r   ÚNoner   )r;   Ú	StatusBarrG   ÚSetFieldsCountÚSetStatusText)r0   r8   rJ   rK   r%   r%   r&   rG   ©  s    
zStatusBarWx.__init__c             C   s   |   d| d¡ d S )Nz%sr   )r  )r0   r"   r%   r%   r&   rÿ  °  s    zStatusBarWx.set_functionN)r3   r4   r5   r6   rG   rÿ  r%   r%   r%   r&   rb  ¢  s   rb  c               @   s:   e Zd Zejfdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Z	dS )rr  c             C   s6   t  | |¡ tjj| |d|d i | _i | _d | _d S )NrP  )r:   )r
   rG   r;   r©  Ú
_toolitemsÚ_groupsÚ_last)r0   r`  r8   r:   r%   r%   r&   rG   º  s
    zToolbarWx.__init__c          	      s  ˆ  |ˆ |¡\}}ˆ |j¡}|rXt|ƒ}	|s4tjntj}
ˆ |dˆ |	tj|
|pRd¡}nPˆ 	ˆ ¡d d df}|r†tj
ˆdˆ |d}ntjˆdˆ |d}ˆj||ˆ d}ˆ ¡  ‡ ‡fdd„}|rÔˆ tj||¡ n| tj|¡ |ˆ_ˆj ˆ g ¡ | ||¡ ˆjˆ   ||f¡ d S )	NrP  r“   r   é
   )r›   )r°  c                s   ˆ  ˆ ¡ d S )N)Ztrigger_tool)rû   )r  r0   r%   r&   ÚhandlerÔ  s    z'ToolbarWx.add_toolitem.<locals>.handler)Ú_add_to_groupZ
GetToolPosr·  r‡  r;   r¶  rµ  Z
InsertToolr«   ZGetTextExtentZToggleButtonrŠ  ZInsertControlre  rß   r¸  rè   r	  r  Ú
setdefaultrÉ   r  )r0   r  ÚgroupÚpositionrº  ZdescriptionZtoggleÚbeforeÚidxr   r±  r§  r›   rÀ   r  r%   )r  r0   r&   Úadd_toolitemÁ  s*    zToolbarWx.add_toolitemc             C   s>   | j  |g ¡}|s$|  ¡ }| |¡ || }|| j |< ||fS )N)r  r•   r´  r  )r0   r  r  r  ZgrÚsepr  r%   r%   r&   r  á  s    

zToolbarWx._add_to_groupc             C   sX   || j krd S x<| j | D ].\}}| ¡ s:|  |j|¡ q| ¡  |¡ qW |  ¡  d S )N)r  Z	IsControlr¼  r·  Z
GetControlZSetValuerþ   )r0   r  Ztoggledr§  r  r%   r%   r&   Útoggle_toolitemê  s    
zToolbarWx.toggle_toolitemc             C   s0   x"| j | D ]\}}|  |j¡ qW | j |= d S )N)r  Z
DeleteToolr·  )r0   r  r§  r  r%   r%   r&   Úremove_toolitemô  s    zToolbarWx.remove_toolitemN)
r3   r4   r5   r;   ZTB_HORIZONTALrG   r  r  r  r  r%   r%   r%   r&   rr  ¹  s
    	
rr  c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ra  zfor use with ToolManagerc             O   s:   t j| f|ž|Ž tj | |d¡ |  d¡ |  d¡ d S )NrP  r   r“   )r   rG   r;   r  r  r  )r0   r8   rJ   rK   r%   r%   r&   rG   ü  s    
zStatusbarWx.__init__c             C   s   |   |¡ d S )N)r  )r0   rh   r%   r%   r&   r     s    zStatusbarWx.set_messageN)r3   r4   r5   r6   rG   r   r%   r%   r%   r&   ra  ú  s   ra  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConfigureSubplotsWxc             G   s   |   ¡  d S )N)r¿  )r0   rJ   r%   r%   r&   Útrigger  s    zConfigureSubplotsWx.triggerc             C   s~   t  d dd¡}t|ƒ tdƒ}|  ||¡}t  t j¡}| |dt jt j	B t j
B ¡ | |¡ | ¡  t| jj|ƒ}| ¡  d S )NrP  zConfigure subplots)r£  r   r   )r;   rS  rU  r   rV  rY  rZ  r\  r^  r]  r¥  rg  rh  r   rW  rô   r|  )r0   rz  r¦  rW  r[  r§  r%   r%   r&   r¿  
  s    
z&ConfigureSubplotsWx.configure_subplotsc             C   s   t | jƒ|d|ƒS )NrP  )r+   rW  )r0   rz  rm  r%   r%   r&   rV    s    zConfigureSubplotsWx.get_canvasN)r3   r4   r5   r  r¿  rV  r%   r%   r%   r&   r    s   r  c               @   s   e Zd Zdd„ ZdS )ÚSaveFigureWxc          
   G   sT  | j  ¡ \}}}tj tjd ¡}| j  ¡ }t 	| j  
¡ d|||tjtjB ¡}| |¡ | ¡ tjkrjd S | ¡ }| ¡ }	td||	f d| ƒ || ¡  }
tj |	¡\}}| d¡rÀ|dd … }|dkrì|
|krìtjd||
|f d	d
 |}
|dkrþ|tjd< y | j jjtj ||	¡|
d W n0 tk
rN } ztt|ƒƒ W d d }~X Y nX d S )Nzsavefig.directoryzSave to filezSave file dir:%s name:%sr   rÀ  r   )rÁ  rÂ  rÃ  rÄ  r"  zDextension %s did not match the selected image type %s; going with %sr   )rÅ  r“   )r3  )rW  r  rƒ  rt   Ú
expanduserrq  r   rÆ  r;   rÇ  ÚGetTopLevelParentrÈ  rÉ  rÊ  r=   rË  rÌ  rÍ  r'   rÎ  rÏ  rÐ  rÑ  rÒ  rô   rÓ  rC   rÔ  r?   rB   )r0   rJ   r  r  r  Zdefault_dirrÕ  rÖ  r×  r&  r3  rØ  r  rŸ  r%   r%   r&   r    s:    



zSaveFigureWx.triggerN)r3   r4   r5   r  r%   r%   r%   r&   r    s   r  c               @   s   e Zd Zdd„ ZdS )ÚSetCursorWxc             C   s(   t  t| ¡}| j |¡ | j ¡  d S )N)r;   rÚ  rÛ  rW  rÜ  rÝ  )r0   rÞ  r%   r%   r&   rß  E  s    zSetCursorWx.set_cursorN)r3   r4   r5   rß  r%   r%   r%   r&   r  D  s   r  r¨  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚRubberbandWxc             O   s   t jj| f|ž|Ž d | _d S )N)r   ÚRubberbandBaserG   rã  )r0   rJ   rK   r%   r%   r&   rG   N  s    zRubberbandWx.__init__c             C   s   | j d krt ¡ | _ t | j¡}t | j |¡}| ¡  t |¡}| jjj	j
}|| }|| }||k rn|| }}||k r€|| }}|| }|| }	t ||||	¡}
d}t |¡}| t |d¡¡ | d¡\}}}}| |||d¡ | t |¡¡ | |
¡ d S )Nz#C0C0FFr   Trï  )rã  r;   râ  r  rW  rð  rñ  rò  rô   rˆ   r[   ró  r¹   r¥   r¢   rô  rõ  r|   r}   rö  )r0   r÷  rø  rù  rú  r¡   rü  r[   rl   rm   rý  rû  rŽ   rº   r»   rŠ   r¼   r%   r%   r&   rþ  R  s.    





zRubberbandWx.draw_rubberbandc             C   s"   | j d krd S | j  ¡  d | _ d S )N)rã  rë  )r0   r%   r%   r&   Úremove_rubberbandu  s    

zRubberbandWx.remove_rubberbandN)r3   r4   r5   rG   rþ  r  r%   r%   r%   r&   r  M  s   #r  c               @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	r  c             O   s   t jj| f|ž|Ž d | _d S )N)r   r  rG   Ú_rect)r0   rJ   rK   r%   r%   r&   rG   €  s    zRubberbandWx.__init__c             C   sp   t  | j¡}| jr|  |¡ | t  t jdt j¡¡ | 	t j
¡ || jj| || | | f| _| | j¡ d S )Nr   )r;   r  rW  r  r  r¥   r¢   rg   r£   r|   ZTRANSPARENT_BRUSHr.  rö  )r0   r÷  rø  rù  rú  r¡   r%   r%   r&   rþ  „  s    
 zRubberbandWx.draw_rubberbandNc             C   sB   | j s
d S | jjr8|d kr&t | j¡}| | jjdd¡ d | _ d S )Nr   )r  rW  r\   r;   r  r„   )r0   r¡   r%   r%   r&   r  ”  s    zRubberbandWx.remove_rubberband)N)r3   r4   r5   rG   rþ  r  r%   r%   r%   r&   r    s   c               @   s<   e Zd ZdZdgZdddgZdd„ Zdd	„ Zed
d„ ƒZ	dS )Ú_HelpDialogN)ZActionZ	ShortcutsZDescriptionrS   éŒ   i,  c             C   s,  t jj| |dt jt jB d t  t j¡}t  dddd¡}|  ¡  	¡ }xnt
| j| ƒD ]\\}}xRt|| jƒD ]B\}}	t j| |d}
|dkr’|
 |¡ |
 |	¡ | |
ddd¡ qjW qTW | |dt jd¡ t  | t j¡}| |dt jt jB d¡ |  |¡ | | ¡ |  ¡  |  t j| j¡ | t j| j¡ d S )NZHelp)rR  r:   r   r   é   r£  )r°  )r;   ÚDialogrG   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERrY  rZ  ZFlexGridSizerZGetFontZMakeBoldr  ÚheadersÚzipÚwidthsZ
StaticTextrf   ZWrapr\  ZALLrŠ  rË  ZALIGN_CENTER_HORIZONTALrg  rh  ZLayoutrß   rk  ÚOnCloser  )r0   r8   Úhelp_entriesr[  Z
grid_sizerrV   rº   ÚrowÚcolrY   r°  r<   r%   r%   r&   rG   §  s(    



z_HelpDialog.__init__c             C   s   d t _|  ¡  | ¡  d S )N)r   Ú	_instanceZDestroyLaterr8  )r0   r'  r%   r%   r&   r'  À  s    z_HelpDialog.OnClosec             C   s.   | j r| j  ¡  d S | ||ƒ| _ | j  ¡  d S )N)r+  ZRaiser|  )r$   r8   r(  r%   r%   r&   r}  Å  s
    
z_HelpDialog.show)
r3   r4   r5   r+  r$  r&  rG   r'  Úclassmethodr}  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 )N)r   r}  rô   rW  r  Z_get_help_entries)r0   rJ   r%   r%   r&   r  Ð  s    zHelpWx.triggerN)r3   r4   r5   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 d tj 
¡  X d S )N)rW  rÞ   r%  r\   rˆ  r;   r÷   rø   rù   rö   rú   )r0   rJ   rK   r%   r%   r&   r  Ö  s    
zToolCopyToClipboardWx.triggerN)r3   r4   r5   r  r%   r%   r%   r&   r.  Õ  s   r.  c               @   s2   e Zd ZdZddd„Zdd„ Zd	d
„ Zdd„ ZdS )Ú
PrintoutWxz 
    Simple wrapper around wx Printout class -- all the real work
    here is scaling the matplotlib canvas bitmap to the current
    printer's definition.
    ç      @ç      à?rq  c             C   s&   t jj| |d || _|| _|| _d S )N)rR  )r;   ÚPrintoutrG   rW  rY   Úmargin)r0   rW  rY   r3  rR  r%   r%   r&   rG   ò  s    zPrintoutWx.__init__c             C   s   |dkS )Nr   r%   )r0   Úpager%   r%   r&   ÚHasPageù  s    zPrintoutWx.HasPagec             C   s   dS )N)r   r   r   r   r%   )r0   r%   r%   r&   ÚGetPageInfoý  s    zPrintoutWx.GetPageInfoc             C   sÐ  | j  ¡  |  ¡ }|  ¡ \}}|  ¡ \}}| ¡ \}}| j  ¡ \}	}
| j j ¡ }| j jj}t	|ƒ| }|| j j_| j j 
d¡ t| j j| j jjƒ}| j j |¡ | j j t| j j ¡ | ƒ¡ | j j t| j j ¡ | ƒ¡ | j  ¡  d}|  ¡ rþt	|ƒ| }t| j| | ƒ}t| j| | ƒ}| j| | t	|	ƒ }| ||¡ | ||¡ y| | j jdd¡ W nB tk
r¨   y| | j jd¡ W n tk
r¢   Y nX Y nX | j j 
|¡ || j j_| j  ¡  dS )Nz#FFFFFFg      ð?r   )r   r   T)rW  r%  ZGetDCZGetPPIPrinterZGetPageSizePixelsrf  rô   Zget_facecolorr^   r­   Zset_facecolorrR   r\   r¯   r…   rX   Z	SetHeightrZ   Z	IsPreviewr3  rY   ZSetDeviceOriginZSetUserScaler„   rÔ  )r0   r4  r¡   ZppwZpphZpgwZpghZdcwZdchZgrwZgrhZbgcolorZfig_dpiZvscaler¦   Z
page_scaleZ
top_marginZleft_marginZ
user_scaler%   r%   r&   ÚOnPrintPage   sJ    





zPrintoutWx.OnPrintPageN)r0  r1  rq  )r3   r4   r5   r6   rG   r5  r6  r7  r%   r%   r%   r&   r/  ë  s
   
r/  c                   sT   e Zd ZdZeZeZeZ	e
dd„ ƒZe‡ fdd„ƒZedd„ ƒZe
dd	„ ƒZ‡  ZS )
Ú
_BackendWxr;   c             C   s   | j  ¡  d S )N)rW  rÿ   )Zmanagerr%   r%   r&   Útrigger_manager_drawF  s    z_BackendWx.trigger_manager_drawc                s>   t  ¡ }|d kr*t  d¡}| d¡ |t_tƒ j|f|ž|ŽS )NFT)r;   rx  ÚAppZSetExitOnFrameDeleter8  Z	_theWxAppr#  Únew_figure_manager)r$   rT  rJ   rK   ry  )r   r%   r&   r;  J  s    

z_BackendWx.new_figure_managerc             C   s4   |   ||¡}| ¡ }t ¡ r0|j ¡  |j ¡  |S )N)Ú_frame_classrt  rq  Zis_interactiverz  r|  rW  rÿ   )r$   rT  rô   rz  rj  r%   r%   r&   Únew_figure_manager_given_figureV  s    

z*_BackendWx.new_figure_manager_given_figurec              C   s&   t j ¡ s"t  ¡ } | d k	r"|  ¡  d S )N)r;   r:  ZIsMainLoopRunningrx  ZMainLoop)ry  r%   r%   r&   Úmainloop_  s    
z_BackendWx.mainloop)r3   r4   r5   Zrequired_interactive_frameworkrD  ZFigureCanvasri  r¤  rN  r<  r   r9  r,  r;  r=  r>  rC  r%   r%   )r   r&   r8  ?  s   	r8  )r   N)N)yr6   Úos.pathrƒ  r   r¨   rÑ  r½   rq  Zmatplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.cbookr   r   Zmatplotlib.figurer   Zmatplotlib.pathr   Zmatplotlib.transformsr   Zmatplotlib.widgetsr   Zmatplotlib.backend_managersr   r   r   r   r;   r   r(   r*   r!   r'   r.   Úobjectr/   rœ   Z
IDLE_DELAYr?   rE   rF   rR   r‘   rÜ   r¿   rD  rS  rN  ri  r  Z_NTB_AXISMENUr‹  Z_NTB_X_PAN_LEFTZ_NTB_X_PAN_RIGHTZ_NTB_X_ZOOMINZ_NTB_X_ZOOMOUTZ_NTB_Y_PAN_UPZ_NTB_Y_PAN_DOWNZ_NTB_Y_ZOOMINZ_NTB_Y_ZOOMOUTZ	_NTB_SAVEZ
_NTB_CLOSEr‡  rU  rŠ  r‰  ZMOVEZCURSOR_HANDZHANDZPOINTERZCURSOR_ARROWZSELECT_REGIONZCURSOR_CROSSZWAITZCURSOR_WAITrÛ  rB  r¢  r©  ro  r  r  rb  rr  ra  ZConfigureSubplotsBaser  ZSaveFigureBaser  ZSetCursorBaser  r«  r  r  r#  r   ZToolHelpBaser-  ZToolCopyToClipboardBaser.  ZToolSaveFigureZToolConfigureSubplotsZToolSetCursorZToolRubberbandZToolHelpZToolCopyToClipboardr2  r/  Zexportr8  r%   r%   r%   r&   Ú<module>   s°   0


) {    ugt5j
 JA&2#-T