a
    ضaI                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
ZddlmZmZmZmZmZmZmZmZmZmZmZ ddl
mZmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" dd	l#m$Z$ dd
l%m&Z& ddl'Z'e(e)Z*dZ+ej,G dd dZ-d9ddZ.G dd deZ/G dd deZ0G dd deZ1G dd dee'j2Z3G dd de3Z4G dd de'j5Z6G dd deZ7dd Z8d d! Z9G d"d# d#ee'j:Z;G d$d% d%ee'j:Z<G d&d' d'ej=Z>G d(d) d)ej?Z@ejAd*d+d,G d-d. d.ejBZCG d/d0 d0ejDZEG d1d2 d2e'jFZGG d3d4 d4ejHZIG d5d6 d6ejJZKe@e_Le>e_MeEe_NeIe_OeKe_PejQG d7d8 d8eZRdS ):z
A wxPython backend for matplotlib.

Originally contributed by Jeremy O'Donoghue (jeremy@o-donoghue.com) and John
Hunter (jdhunter@ace.bsd.uchicago.edu).

Copyright (C) Jeremy O'Donoghue & John Hunter, 2003-4.
    N)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseGraphicsContextBaseMouseButtonNavigationToolbar2RendererBase	TimerBaseToolContainerBasecursors)_apicbookbackend_tools)Gcf)ToolManager)Figure)Path)Affine2D)SubplotToolK   c                   @   sB   e Zd Zejddddedd Zejddded	d Zd
S )__getattr__z3.1 z3.6)obj_typeremovalc                 C   s   dS )N    selfr   r   n/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/matplotlib/backends/backend_wx.py<lambda>/       z__getattr__.<lambda>3.5)r   c                 C   s<   t jtjt jtjt jtjt jtjt j	tj
t jtjt jtjiS N)r   MOVEwxCURSOR_HANDHANDPOINTERCURSOR_ARROWSELECT_REGIONCURSOR_CROSSWAITCURSOR_WAITRESIZE_HORIZONTALCURSOR_SIZEWERESIZE_VERTICALCURSOR_SIZENSr   r   r   r   r    0   s    N)__name__
__module____qualname__r   
deprecatedpropertyZ
IDLE_DELAYZcursordr   r   r   r   r   ,   s   r   c                 C   s.   t j|| dt jt jB d}|  |  dS )z4Signal an error condition with a popup error dialog.zMatplotlib backend_wx error)parentmessagecaptionstyleN)r%   ZMessageDialogOKZCENTRE	ShowModalDestroy)msgr7   dialogr   r   r   error_msg_wx;   s    
r@   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
TimerWxz/Subclass of `.TimerBase` using wx.Timer events.c                    s*   t  | _| j| j_t j|i | d S r#   )r%   Timer_timerZ	_on_timerZNotifysuper__init__r   argskwargs	__class__r   r   rE   I   s    

zTimerWx.__init__c                 C   s   | j | j| j d S r#   )rC   StartZ	_intervalZ_singler   r   r   r   _timer_startN   s    zTimerWx._timer_startc                 C   s   | j   d S r#   )rC   Stopr   r   r   r   _timer_stopQ   s    zTimerWx._timer_stopc                 C   s   | j  r|   d S r#   )rC   	IsRunningrL   r   r   r   r   _timer_set_intervalT   s    
zTimerWx._timer_set_interval)	r2   r3   r4   __doc__rE   rL   rN   rP   __classcell__r   r   rI   r   rA   F   s
   rA   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dd Zdd  Z   Z!S )#
RendererWxz
    The renderer handles all the drawing primitives using a graphics
    context instance that controls the colors/styles. It acts as the
    'renderer' instance used by many classes in the hierarchy.
    )d      ,  i  i  iX  i  i   i  Z
ultralightlightnormalZmediumZsemiboldboldZheavyZ	ultraboldblack)italicrX   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.)namer   r   alternativeZaddendum%s - __init__()N)r   Zwarn_deprecatedrD   rE   _logdebugtypeZGetWidthwidthZ	GetHeightheightbitmapfontddpigc)r   re   rg   rI   r   r   rE      s    


zRendererWx.__init__c                 C   s   dS NTr   r   r   r   r   flipy   s    zRendererWx.flipyc                 C   s   dS ri   r   r   r   r   r   offset_text_height   s    zRendererWx.offset_text_heightc                 C   sd   |rt |}| jd u r"|  }n| j}|j}| ||}||tj |	|\}}}	}
|||	fS r#   )
r   
strip_mathrh   new_gcgfx_ctxget_wx_fontSetFontr%   BLACKZGetFullTextExtent)r   spropismathrh   rn   fontwhZdescentleadingr   r   r   get_text_width_height_descent   s    


z(RendererWx.get_text_width_height_descentc                 C   s   | j | jfS r#   )rc   rd   r   r   r   r   get_canvas_width_height   s    z"RendererWx.get_canvas_width_heightc                 C   sp   |  }|d ur|j}|j}|j|krl||_|d u r>|  n.||d | j|d  |d  |d |d  d S )Nr            )get_clip_rectangleboundsrn   _lastcliprectZ	ResetClipZCliprd   )r   rh   Z
new_boundsrn   r   r   r   handle_clip_rectangle   s    


z RendererWx.handle_clip_rectanglec                 C   s   |   }||D ]r\}}|tjkr0|j|  q|tjkrF|j|  q|tjkr\|j|  q|tj	krr|j
|  q|tjkr|  q|S r#   )Z
CreatePathZiter_segmentsr   ZMOVETOZMoveToPointZLINETOZAddLineToPointZCURVE3ZAddQuadCurveToPointZCURVE4ZAddCurveToPointZ	CLOSEPOLYZCloseSubpath)rn   path	transformwxpathpointscoder   r   r   convert_path   s    





zRendererWx.convert_pathNc                 C   s   |   | | |j}|t ddd| j }| |||}|d url|t	
|| || n
|| |  d S )Ng      ?g              )selectr   rn   r   Zscale	translaterd   r   ZSetBrushr%   ZBrushget_wxcolourZDrawPathZ
StrokePathunselect)r   rh   r   r   ZrgbFacern   r   r   r   r   	draw_path   s    

zRendererWx.draw_pathc                 C   s   |  }|d ur |j\}}}}	nd}d}| j}| j}	|jd d \}
}tj||
| }|	  |j
|t|t| j| t|t|	  |  d S )Nr   r}   )r~   r   rc   rd   shaper%   BitmapFromBufferRGBAtobytesr   rn   
DrawBitmapintr   )r   rh   xyZimbboxlbrv   rw   rowscolsre   r   r   r   
draw_image   s    zRendererWx.draw_imageFc	                 C   s   |rt |}tdt|  |  | | |j}	| ||}
|	|
 }|	|
| | |||\}}}t|}t|| }|dkr|	||| n>t|}|t| }|t| }|	||| || | |  d S )Nz%s - draw_text()r   )r   rl   r`   ra   rb   r   r   rn   ro   r   get_rgbrp   ry   r   ZDrawTextmathradianssincosZDrawRotatedTextr   )r   rh   r   r   rr   rs   Zanglert   mtextrn   ru   colorrv   rw   dZradsZxoZyor   r   r   	draw_text   s&    


zRendererWx.draw_textc                 C   s8   t dt|  t| j| | _| j  | j  | jS )Nz%s - new_gc())r`   ra   rb   GraphicsContextWxre   rh   r   r   r   r   r   r   rm     s
    

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur0|S | | }tj	t
|d | j| tj| j|  | j|  d | j|< }|S )z7Return a wx font.  Cache font instances for efficiency.z%s - get_wx_font()Ng      ?)Z	pointSizefamilyr:   Zweight)r`   ra   rb   hashrf   getpoints_to_pixelsZget_size_in_pointsr%   ZFontr   	fontnamesget_nameZROMAN
fontanglesZ	get_stylefontweightsZ
get_weight)r   rr   rs   keyru   sizer   r   r   ro     s    
zRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)PIXELS_PER_INCHrg   )r   r   r   r   r   r   *  s    zRendererWx.points_to_pixels)N)FN)"r2   r3   r4   rQ   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   rE   rj   rk   ry   rz   r   staticmethodr   r   r   r   rm   ro   r   rR   r   r   rI   r   rS   Y   s\   




rS   c                       s   e Zd ZdZejejejdZej	ej
ejdZe Z fddZdd Zdd	 Zd fdd	Z fddZ fddZ fddZdd Z  ZS )r   a=  
    The graphics context provides the color, line styles, etc...

    This class stores a reference to a wxMemoryDC, and a
    wxGraphicsContext that draws to it.  Creating a wxGraphicsContext
    seems to be fairly heavy, so these objects are cached based on the
    bitmap object that is passed in.

    The base GraphicsContext stores colors as a RGB tuple on the unit
    interval, e.g., (0.5, 0.0, 1.0).  wxPython uses an int interval, but
    since wxPython colour management is rather simple, I have not chosen
    to implement a separate colour manager class.
    )ZbuttZ
projectinground)ZbevelZmiterr   c                    s   t    tdt| | | j|d\}}|d u rht }|	| tj
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNrq   r{   )rD   rE   r`   ra   rb   _cacher   r%   ZMemoryDCSelectObjectZGraphicsContextZCreater   re   dcrn   PenZSOLID_penSetPenrenderer)r   re   r   r   rn   rI   r   r   rE   G  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   re   
IsSelectedr   r   r   r   r   [  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   a  s    
zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())r`   ra   rb   r   rD   set_foregroundr   Z	SetColourr   r   rn   r   r   )r   fgZisRGBArI   r   r   r   g  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{   )floatr`   ra   rb   r   rD   set_linewidthr   r   r   Z
_linewidthr   ZSetWidthrn   r   r   )r   rv   ZlwrI   r   r   r   v  s    zGraphicsContextWx.set_linewidthc                    sR   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())r`   ra   rb   r   rD   set_capstyler   ZSetCapr   _capdZ	_capstylern   r   r   )r   csrI   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())r`   ra   rb   r   rD   set_joinstyler   ZSetJoinr   _joindZ
_joinstylern   r   r   )r   ZjsrI   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>  r!   z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)r`   ra   rb   r%   ZColour)r   r   r   r   r   r     s    zGraphicsContextWx.get_wxcolour)N)r2   r3   r4   rQ   r%   ZCAP_BUTTZCAP_PROJECTINGZ	CAP_ROUNDr   Z
JOIN_BEVELZ
JOIN_MITERZ
JOIN_ROUNDr   weakrefWeakKeyDictionaryr   rE   r   r   r   r   r   r   r   rR   r   r   rI   r   r   /  s$   		r   c                r       sb  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i9ZAdjd2d3ZBdkd4d5ZCd6d7 ZDd8d9 ZEdld;d<ZFdmd=d>ZGd?d@ ZHeIJdAdBdndDdEZKi eLjMdFdGdGdHdIdJdJdKdLZM fdMdNZNdOdP ZOdQdR ZPdSdT ZQdUdV ZRdWdX ZSdYdZ ZTdod\d]ZUd^d_ ZVd`da ZWdbdc ZXddde ZYdfdg ZZdhdi Z[  Z\S )p_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 | tj+| j, | tj-| j. | tj/| j0 | tj1| j2 | tj3| j4 | tj5| j4 | 6tj7 | 8tj9 dS )z
        Initialize a FigureWx instance.

        - Initialize the FigureCanvasBase and wxPanel parents.
        - Set event handlers for resize, paint, and keyboard and mouse
          interaction.
        r   z"%s - __init__() - bitmap w:%d h:%dFN):r   rE   mapr   ceilfigurer   r   r%   PanelSizer   re   r`   ra   rb   _isDrawn_rubberband_rectBindZEVT_SIZE_onSizeZ	EVT_PAINT_onPaintZEVT_CHAR_HOOK
_onKeyDownZ
EVT_KEY_UP_onKeyUpEVT_LEFT_DOWN_onMouseButtonZEVT_LEFT_DCLICKZEVT_LEFT_UPZEVT_MIDDLE_DOWNZEVT_MIDDLE_DCLICKZEVT_MIDDLE_UPZEVT_RIGHT_DOWNZEVT_RIGHT_DCLICKZEVT_RIGHT_UPZEVT_MOUSE_AUX1_DOWNZEVT_MOUSE_AUX1_UPZEVT_MOUSE_AUX2_DOWNZEVT_MOUSE_AUX2_UPZEVT_MOUSE_AUX1_DCLICKZEVT_MOUSE_AUX2_DCLICKZEVT_MOUSEWHEEL_onMouseWheelZ
EVT_MOTION	_onMotionZEVT_LEAVE_WINDOW_onLeaveZEVT_ENTER_WINDOW_onEnterZEVT_MOUSE_CAPTURE_CHANGED_onCaptureLostZEVT_MOUSE_CAPTURE_LOSTZSetBackgroundStyleZBG_STYLE_PAINTZSetBackgroundColourWHITE)r   r7   idr   rv   rw   r   r   r   rE     sD    	z_FigureCanvasWxBase.__init__c                 C   sP   t  }|| j t j sLt j }|rLt j| t j  t j	  dS )z*Copy bitmap of canvas to system clipboard.N)
r%   BitmapDataObjectZ	SetBitmapre   TheClipboardZIsOpenedOpenSetDataCloseZFlush)r   eventZbmp_objZopen_successr   r   r   Copy_to_Clipboard  s    


z%_FigureCanvasWxBase.Copy_to_Clipboardc                 C   s&   t dt|  d| _| jdd d S )Nz%s - draw_idle()FZeraseBackground)r`   ra   rb   r   Refreshr   r   r   r   	draw_idle#  s    z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r#   )r%   Yieldr   r   r   r   flush_events,  s    z _FigureCanvasWxBase.flush_eventsr   c                 C   sx   t | drtdtj| tjd}|dkrX|jt|d dd | jtj| j	|
 d t | _| j  |  d S )N_event_loopzEvent loop already runningr   r   i  T)ZoneShot)hasattrRuntimeErrorr%   rB   ZID_ANYrK   r   r   Z	EVT_TIMERstop_event_loopZGetIdZGUIEventLoopr  ZRunrM   )r   timeouttimerr   r   r   start_event_loop0  s    


z$_FigureCanvasWxBase.start_event_loopc                 C   s&   t | dr"| j r| j  | `d S )Nr  )r  r  rO   ZExitr   r  r   r   r   r  =  s    


z#_FigureCanvasWxBase.stop_event_loopc                 C   s   |   }|  }t| }g }g }d}t|D ]R\}\}}	ddd |	D }
||	d  d||
|
f }||	v rx|}|| q0d|}|||fS )z3Return the wildcard string for the filesave dialog.r   ;c                 S   s   g | ]}d | qS )z*.%sr   )r   extr   r   r   r   M  r!   z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z
%s (%s)|%s|)Zget_default_filetypeZget_supported_filetypes_groupedsorteditems	enumeratejoinappend)r   Zdefault_filetype	filetypesZsorted_filetypes	wildcards
extensionsfilter_indexir]   extsZext_listZwildcardr   r   r   _get_imagesave_wildcardsD  s    
z,_FigureCanvasWxBase._get_imagesave_wildcards3.4originWXc              	   C   s   t dt|  | r|  s dS |s.t| }tjdkrTt| jj	t
rT| j  n| j}||dd | jdur| j\}}}}|||||f||||f||||f||||fgtddtj dS )z
        Update the displayed image on the GUI canvas, using the supplied
        wx.PaintDC device context.

        The 'WXAgg' backend sets origin accordingly.
        z%s - gui_repaint()N	__WXMSW__r   rq   r{   )r`   ra   rb   ZIsShownOnScreenr%   ZClientDCPlatform
isinstancer   Z_cachedRendererrS   re   ConvertToImageZConvertToBitmapr   r   ZDrawLineListr   ZPENSTYLE_SHORT_DASH)r   drawDCr%  bmpx0y0x1y1r   r   r   gui_repaintV  s(    

z_FigureCanvasWxBase.gui_repaintzWindows bitmapZJPEGZPCXzPortable Network GraphicszTagged Image Format FilezX pixmap)r,  ZjpegZjpgZpcxZpngZtifZtiffZxpmc                    s,   t  j|g|R i | | jr(|   d S r#   )rD   print_figurer   draw)r   filenamerG   rH   rI   r   r   r2    s    z _FigureCanvasWxBase.print_figurec                 C   sF   t dt|  t| }| js.| j|d n| j|d |  dS )z$Called when wxPaintEvt is generated.z%s - _onPaint()r+  N)	r`   ra   rb   r%   ZPaintDCr   r3  r1  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rdS |\| _| _d| _| jdks| jdkrdS t| j| j| _| jj}| j| }| j| }| jj||dd | jdd t|  d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  )r`   ra   rb   	GetParentGetSizerZGetItemZ
ProportionFlagr%   EXPANDZ
GetMinSizeZGetClientSizeZIncTogetattrr6  Z_heightr   r   re   r   rg   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v 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)rG  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.rH  N)rG  r   Zkey_release_eventrJ  rK  r   r   r   r     s    
z_FigureCanvasWxBase._onKeyUpc                 C   sb   t tjtjt jtjt jtjt j	tj
t jtjt jtjt jtjt ji|d}| | |   d S )N)cursor)r%   Cursorr   Zcheck_getitemr   r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Z	SetCursorZUpdater   rL  r   r   r   
set_cursor  s    	
z_FigureCanvasWxBase.set_cursorTc                 C   s    |   r|   |r|   dS )zControl wx mouse capture.N)Z
HasCaptureZReleaseMouseZCaptureMouse)r   capturer   r   r   _set_capture  s    z _FigureCanvasWxBase._set_capturec                 C   s   |  d dS )zCapture changed or lostFN)rQ  r  r   r   r   r     s    z"_FigureCanvasWxBase._onCaptureLostc              
   C   s   |   | | p|  |j}| jjj|j }t	j
tjt	jtjt	jtjt	jtjt	jtji}| }|||}| r| j||||d n8| r| j|||d|d n| r| j||||d dS )Start measuring on an axis.rH  T)ZdblclickrI  N)rJ  rQ  Z
ButtonDownZButtonDClickXr   r   rd   Yr%   ZMOUSE_BTN_LEFTr   LEFTZMOUSE_BTN_MIDDLEZMIDDLEZMOUSE_BTN_RIGHTRIGHTZMOUSE_BTN_AUX1BACKZMOUSE_BTN_AUX2FORWARDZ	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___skipwheeleventTFNrH  )GetXr   r   rd   GetYZLinesPerActionZWheelRotationZ
WheelDeltarJ  r%   r(  r  rZ  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 )rR  rH  N)r[  r   r   rd   r\  rJ  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.rH  N)rJ  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.)rI  ZxyN)r[  r   r   rd   r\  rJ  r   Zenter_notify_eventr^  r   r   r   r   4  s    z_FigureCanvasWxBase._onEnter)N)N)r   )N)Nr&  )T)]r2   r3   r4   rQ   Zrequired_interactive_frameworkrA   Z
_timer_clsr%   ZWXK_CONTROLZ	WXK_SHIFTZWXK_ALTZWXK_CAPITALZWXK_LEFTZWXK_UPZ	WXK_RIGHTZWXK_DOWNZ
WXK_ESCAPEZWXK_F1ZWXK_F2ZWXK_F3ZWXK_F4ZWXK_F5ZWXK_F6ZWXK_F7ZWXK_F8ZWXK_F9ZWXK_F10ZWXK_F11ZWXK_F12Z
WXK_SCROLLZ	WXK_PAUSEZWXK_BACKZ
WXK_RETURNZ
WXK_INSERTZ
WXK_DELETEZWXK_HOMEZWXK_ENDZ
WXK_PAGEUPZWXK_PAGEDOWNZWXK_NUMPAD0ZWXK_NUMPAD1ZWXK_NUMPAD2ZWXK_NUMPAD3ZWXK_NUMPAD4ZWXK_NUMPAD5ZWXK_NUMPAD6ZWXK_NUMPAD7ZWXK_NUMPAD8ZWXK_NUMPAD9ZWXK_NUMPAD_ADDZWXK_NUMPAD_SUBTRACTZWXK_NUMPAD_MULTIPLYZWXK_NUMPAD_DIVIDEZWXK_NUMPAD_DECIMALZWXK_NUMPAD_ENTERZWXK_NUMPAD_UPZWXK_NUMPAD_RIGHTZWXK_NUMPAD_DOWNZWXK_NUMPAD_LEFTZWXK_NUMPAD_PAGEUPZWXK_NUMPAD_PAGEDOWNZWXK_NUMPAD_HOMEZWXK_NUMPAD_ENDZWXK_NUMPAD_INSERTZWXK_NUMPAD_DELETEr?  rE   r  r	  r  r  r  r#  r   Zdelete_parameterr1  r   r  r2  r   r   rG  r   r   rO  rQ  r   r   r   r   r   r   rR   r   r   rI   r   r     s   	<
1
	


	
,
r   c                   @   s~   e Zd ZdddZedd Zeeej	Z
eeej ZZeeejZeeejZeeej ZZeeejZdS )FigureCanvasWxNc                 C   sF   t dt|  t| j| jj| _| j| j d| _	| j
|d dS )z
        Render the figure using RendererWx instance renderer, or using a
        previously defined renderer if none is specified.
        z%s - draw()Tr5  N)r`   ra   rb   rS   re   r   rg   r   r3  r   r1  )r   r+  r   r   r   r3  ?  s
    zFigureCanvasWx.drawc                 C   s   | j }tt| jjjt| jjj| _ t	| j | jj
}| }| j| | j }t|rtt|tjst| }|||std| || _ | jr|   | r|   d S )NzCould not save figure to )re   r%   r   r   r   r   r   rc   rd   rS   rg   rm   r3  r   Zis_writable_file_liker)  Imager*  ZSaveFiler  r   r  )r   Zfiletyper4  Z
origBitmapr   rh   imager   r   r   _print_imageJ  s&    

zFigureCanvasWx._print_image)N)r2   r3   r4   r3  r   rb  	functoolspartialmethodr%   ZBITMAP_TYPE_BMPZ	print_bmpZBITMAP_TYPE_JPEGZ
print_jpegZ	print_jpgZBITMAP_TYPE_PCXZ	print_pcxZBITMAP_TYPE_PNGZ	print_pngZBITMAP_TYPE_TIFZ
print_tiffZ	print_tifZBITMAP_TYPE_XPMZ	print_xpmr   r   r   r   r_  <  s*   

$r_  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 rt!"| jj  | jrt!#| j | jd ur\| j$  | j% \}}| j% \}}	| j&t || | j| jdt jt jB  | '| j | (  | j)d | *t j+| j, d S )	Nr'     )r7   r   posr_   r{   r   )r}   r}   )-r%   r(  ZDefaultPositionZPointrD   rE   r`   ra   rb   num_set_frame_icon
get_canvascanvasr   r   r   r   r   SetInitialSizer   ZSetFocusBoxSizerVERTICALsizerAddZTOPrU  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   ri  figrh  rv   rw   ZtwthfwfhrI   r   r   rE   ~  s:    

 

zFigureFrameWx.__init__c                 C   s   | j jS r#   )rs  rv  r   r   r   r   rv    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 )Nru  Ztoolbar2rv  )mplrcParamsNavigationToolbar2Wxrl  	ToolbarWxrv  )r   ru  r   r   r   rt    s    zFigureFrameWx._get_toolbarc                 C   s   t | d|S Nrg  )r_  )r   r|  r   r   r   rk    s    zFigureFrameWx.get_canvasc                 C   s   t dt|  | jS )Nz%s - get_figure_manager())r`   ra   rb   rs  r   r   r   r   get_figure_manager  s    z FigureFrameWx.get_figure_managerc                 C   sD   t dt|  | j  | j  d | j_t	| j |
  d S )Nz%s - onClose())r`   ra   rb   rl  Zclose_eventr  rs  framer   destroyrJ  r  r   r   r   r{    s    

zFigureFrameWx._onClosec                 C   s   | j S )z=Override wxFrame::GetToolBar as we don't have managed toolbar)ru  r   r   r   r   
GetToolBar  s    zFigureFrameWx.GetToolBarc                    sJ   z| j | jj W n ty&   Y n0 | rF|  sFt j|i | dS ri   )rl  Zmpl_disconnectru  Z_id_dragAttributeErrorZIsBeingDeletedrD   r=   rF   rI   r   r   r=     s    zFigureFrameWx.Destroy)r2   r3   r4   rE   r6   rv  rt  rk  r  r{  r  r=   rR   r   r   rI   r   re  }  s   0
	re  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 )rr  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 )Nr_   TF)r`   ra   rb   r  window_initializingrD   rE   )r   rl  ri  r  rI   r   r   rE     s
    zFigureManagerWx.__init__c                 C   s
   | j  S r#   )r  r  r   r   r   r   ru    s    zFigureManagerWx.toolbarc                 C   s   | j stdd S )Nzcan't set attribute)r  r  )r   valuer   r   r   ru    s    c                 C   s,   | j   | j  tjd r(| j   d S )Nzfigure.raise_window)r  Showrl  r3  r  r  Raiser   r   r   r   show  s    


zFigureManagerWx.showc                 G   s*   t dt|  | j}|r&t|j d S )Nz%s - destroy())r`   ra   rb   r  r%   Z	CallAfterr  )r   rG   r  r   r   r   r  
  s    zFigureManagerWx.destroyc                 C   s   | j | j    d S r#   )r  ZShowFullScreenZIsFullScreenr   r   r   r   full_screen_toggle  s    z"FigureManagerWx.full_screen_togglec                 C   s
   | j  S r#   )r  ZGetTitler   r   r   r   get_window_title  s    z FigureManagerWx.get_window_titlec                 C   s   | j | d S r#   )r  ZSetTitle)r   titler   r   r   set_window_title  s    z FigureManagerWx.set_window_titlec                 C   s6   | j tt|t| | j | j d S r#   )	rl  rm  r%   r   r   r   r  r8  ry  )r   rc   rd   r   r   r   resize  s    zFigureManagerWx.resize)r2   r3   r4   rQ   rE   r6   ru  setterr  r  r  r  r  r  rR   r   r   rI   r   rr    s   

	rr  c                 C   s   t ttd| S )z\
    Load a wx.Bitmap from a file in the "images" directory of the Matplotlib
    data.
    images)r%   r   strr   _get_data_path)r4  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bundlera  Ziconr   r   r   rj  .  s    rj  c                       sx   e Zd ZdddZedd Zeddd Z fd	d
Z	 fddZ
dd Zdd Zdd Zdd Zdd Z  ZS )r  Tc              	   C   s   t j| | d dt jv r(| d i | _| jD ]x\}}}}|d u rR|   q4| j	d| 
| dt j|||dv r|t jnt jdj| j|< | jt jt| || j| d q4|| _| jr|   t | | _| | j |   t| | d S )Nrg  ZwxMac)   r  z.png)PanZoom)re   ZbmpDisabledlabelZ	shortHelpkindr  )r%   ToolBarrE   r7  ZPlatformInfoZSetToolBitmapSizewx_idsZ	toolitemsZAddSeparatorZAddTool_iconr   
ITEM_CHECKITEM_NORMALIdr   EVT_TOOLr;  _coordinatesAddStretchableSpace
StaticText_label_text
AddControlrw  r   )r   rl  ZcoordinatestextZtooltip_text
image_filecallbackr   r   r   rE   9  s6    

	zNavigationToolbar2Wx.__init__c                 C   s  t tjtd| }ztj	 
 }W n~ ty   tjtj}tjtj}d|j d|j  d|j  d }d|j d|j  d|j  d }|| dk}Y n0 |rtjtj}|ddd	f d
kjdd}| | | f||dd	f< tj|jd |jd
 | S )z
        Construct a `wx.Bitmap` suitable for use as icon from an image file
        *name*, including the extension and relative to Matplotlib's "images"
        data directory.
        r  gA`"?gbX9?gv/?r   g?.Nr|   r   rg  )Zaxisr{   )nparrayPILr`  openr   r  r%   ZSystemSettingsZGetAppearanceZIsDarkr  Z	GetColourZSYS_COLOUR_WINDOWZSYS_COLOUR_WINDOWTEXTredgreenblueallZRedZGreenZBluer   r   r   r   )r]   ra  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 r  )rb   rl  )r   r  r|  r   r   r   rk  r  s    zNavigationToolbar2Wx.get_canvasc                    s.   | j d }| || |  t j|  d S )Nr  )r  
ToggleToolGetToolStaterD   zoomr   rG   toolrI   r   r   r  v  s    
zNavigationToolbar2Wx.zoomc                    s.   | j d }| || |  t j|  d S )Nr  )r  r  r  rD   panr  rI   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  v r||	krtd|	||	 |	}tjd rt|jtjd< z| j jjt||d W n2 ty& }
 ztt|
 W Y d }
~
n
d }
~
0 0 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)rC  )rl  r#  Zget_default_filenamer%   
FileDialogr7  r  r  ZFD_SAVEZFD_OVERWRITE_PROMPTZSetFilterIndexr<   ID_OKpathlibr   ZGetPathr`   ra   rb   ZGetFilterIndexsuffixZget_supported_filetypeswarningr  r7   r   Zsavefig	Exceptionr@   )r   rG   r  r"  r   Zdefault_fileZdlgr   fmtr  er   r   r   save_figure  s0    




z NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j   d S r#   )rl  r   r   rd   r   r  )r   r  r-  r.  r/  r0  rd   r   r   r   draw_rubberband  s    z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r#   )rl  r   r  r   r   r   r   remove_rubberband  s    z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S r#   )r  r  SetLabelr   rr   r   r   r   set_message  s    z NavigationToolbar2Wx.set_messagec                 C   s`   | j jdk}| j jt| j jd k }d| jv r@| | jd | d| jv r\| | jd | d S )Nr   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)r2   r3   r4   rE   r   r  r   r5   rk  r  r  r  r  r  r  r  rR   r   r   rI   r   r  8  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 )r  c                 C   sR   t | | tjj| |d|d |  | _t| | _| | j i | _	i | _
d S )Nrg  )r:   )r   rE   r%   r  r  _spacer  r  r  
_toolitems_groups)r   rv  r7   r:   r   r   r   rE     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   rh  r   r  r   r   r     s   z+ToolbarWx._get_tool_pos.<locals>.<listcomp>)range
ToolsCount)r   r  rh  r   r  r   _get_tool_pos  s    zToolbarWx._get_tool_posc              	      s  |j vr"jj |< j | }dd tjtjD }|dkr~||d kr`dn|||d  d }	n|d }	|	| }
|rt	
|}|stjntj}|
d |tj||pd}nP d d df}|rtjd |d}ntjd |d}j|
| d	}   fd
d}|rNtj|| n|tj| j g  j  ||f d S )Nc                 S   s    g | ]}|  r| s|qS r   )ZIsSeparatorZIsStretchableSpace)r   tr   r   r   r     s   z*ToolbarWx.add_toolitem.<locals>.<listcomp>r   r{   rg  r   
   r   r  c                    s      d S r#   )Ztrigger_tool)r  r]   r   r   r   handler  s    z'ToolbarWx.add_toolitem.<locals>.handler)r  ZInsertSeparatorr  r  r   r  r  r  indexr  r  r%   r  r  Z
InsertToolr   ZGetTextExtentZToggleButtonButtonZInsertControlrw  r   r  r   r  
setdefaultr  )r   r]   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 vrd S | j | D ].\}}| s8| |j| q| | q|   d S r#   )r  Z	IsControlr  r  Z
GetControlZSetValuer  )r   r]   Ztoggledr  r  r   r   r   toggle_toolitem  s    
zToolbarWx.toggle_toolitemc                 C   s,   | j | D ]\}}| |j q
| j |= d S r#   )r  Z
DeleteToolr  )r   r]   r  r  r   r   r   remove_toolitem  s    zToolbarWx.remove_toolitemc                 C   s   | j | d S r#   )r  r  r  r   r   r   r    s    zToolbarWx.set_messageN)r2   r3   r4   r%   ZTB_HORIZONTALrE   r  r  r  r  r  r   r   r   r   r    s   	-
r  c                   @   s   e Zd Zdd ZdS )ConfigureSubplotsWxc                 G   s   t |   d S r#   )r  Zconfigure_subplots"_make_classic_style_pseudo_toolbarr   rG   r   r   r   trigger  s    zConfigureSubplotsWx.triggerNr2   r3   r4   r  r   r   r   r   r  
  s   r  c                   @   s   e Zd Zdd ZdS )SaveFigureWxc                 G   s   t |   d S r#   )r  r  r  r  r   r   r   r    s    zSaveFigureWx.triggerNr  r   r   r   r   r    s   r  r"   ZToolSetCursor)r^   c                   @   s   e Zd Zdd ZdS )SetCursorWxc                 C   s   t |  | d S r#   )r  rO  r  rN  r   r   r   rO    s    zSetCursorWx.set_cursorN)r2   r3   r4   rO  r   r   r   r   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandWxc                 C   s   t |  d |||| d S r#   )r  r  r  )r   r-  r.  r/  r0  r   r   r   r    s    zRubberbandWx.draw_rubberbandc                 C   s   t |   d S r#   )r  r  r  r   r   r   r   r  "  s    zRubberbandWx.remove_rubberbandN)r2   r3   r4   r  r  r   r   r   r   r    s   r  c                       sB   e Zd ZdZdgZg dZ fddZdd Zedd	 Z	  Z
S )
_HelpDialogN)ZActionZ	ShortcutsDescription)rT      rV   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  )rD   rE   r%   ZDEFAULT_DIALOG_STYLEZRESIZE_BORDERrn  ro  ZFlexGridSizerZGetFontZMakeBoldr  headerszipwidthsr  rp   ZWraprq  ALLr  r  ZALIGN_CENTER_HORIZONTALrx  ry  ZLayoutr   rz  OnCloseZ
EVT_BUTTON)r   r7   help_entriesrp  Z
grid_sizerrY   rrowcolrc   r  r;   rI   r   r   rE   ,  s*    





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r#   )r  	_instanceZDestroyLaterrJ  r  r   r   r   r  E  s    z_HelpDialog.OnClosec                 C   s.   | j r| j   d S | ||| _ | j   d S r#   )r  r  r  )clsr7   r  r   r   r   r  J  s
    
z_HelpDialog.show)r2   r3   r4   r  r  r  rE   r  classmethodr  rR   r   r   rI   r   r  '  s   r  c                   @   s   e Zd Zdd ZdS )HelpWxc                 G   s   t | jj |   d S r#   )r  r  r   rl  ZGetTopLevelParentZ_get_help_entriesr  r   r   r   r  U  s    zHelpWx.triggerNr  r   r   r   r   r  T  s   r  c                   @   s   e Zd Zdd ZdS )ToolCopyToClipboardWxc                 O   sb   | j js| j   | j j r(tj s,d S z$tjt	| j j W tj
  ntj
  0 d S r#   )rl  r   r3  re   r  r%   r  r  r  r   r  rF   r   r   r   r  [  s    
zToolCopyToClipboardWx.triggerNr  r   r   r   r   r  Z  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                    sL   t  }|d u r2t d}|d t  |t_t j	|g|R i |S )NFT)
r%   GetAppAppZSetExitOnFrameDeleter   Z_setup_new_guiappr  Z	_theWxApprD   new_figure_manager)r  ri  rG   rH   wxapprI   r   r   r	  s  s    

z_BackendWx.new_figure_managerc                 C   s4   |  ||}| }t r0|j  |j  |S r#   )_frame_classr  r  Zis_interactiver  r  rl  r	  )r  ri  r   r  rs  r   r   r   new_figure_manager_given_figure  s    

z*_BackendWx.new_figure_manager_given_figurec                  C   s&   t j s"t  } | d ur"|   d S r#   )r%   r  ZIsMainLoopRunningr  ZMainLoop)r
  r   r   r   mainloop  s    
z_BackendWx.mainloop)r2   r3   r4   r_  ZFigureCanvasrr  ZFigureManagerre  r  r  r	  r  r   r  rR   r   r   rI   r   r  m  s   
r  )N)SrQ   rc  loggingr   r  r   r   Znumpyr  r  Z
matplotlibr  Zmatplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.backend_managersr   Zmatplotlib.figurer   Zmatplotlib.pathr   Zmatplotlib.transformsr   Zmatplotlib.widgetsr   r%   	getLoggerr2   r`   r   Zcaching_module_getattrr   r@   rA   rS   r   r   r   r_  ZFramere  rr  r  rj  r  r  r  ZConfigureSubplotsBaser  ZSaveFigureBaser  r5   ZSetCursorBaser  ZRubberbandBaser  Dialogr  ZToolHelpBaser  ZToolCopyToClipboardBaser  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZexportr  r   r   r   r   <module>   sj   	4

 Wn   "AeD
}U
-