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

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

Copyright (C) Jeremy O'Donoghue & John Hunter, 2003-4.
    N)_Backend_check_savefig_extra_argsFigureCanvasBaseFigureManagerBaseGraphicsContextBaseMouseButtonNavigationToolbar2RendererBase	TimerBaseToolContainerBasecursors)_apicbookbackend_tools)Gcf)ToolManager)Figure)Path)Affine2D)SubplotToolK   c                   @   sB   e Zd Zejddddedd Zejddded	d Zd
S )__getattr__z3.1 z3.6)obj_typeremovalc                 C      dS )N    selfr   r   u/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/matplotlib/backends/backend_wx.py<lambda>/   s    z__getattr__.<lambda>3.5)r   c                 C   s<   t jtjt jtjt jtjt jtjt j	tj
t jtjt jtjiS N)r   MOVEwxCURSOR_HANDHANDPOINTERCURSOR_ARROWSELECT_REGIONCURSOR_CROSSWAITCURSOR_WAITRESIZE_HORIZONTALCURSOR_SIZEWERESIZE_VERTICALCURSOR_SIZENSr   r   r   r    r!   0   s   N)__name__
__module____qualname__r   
deprecatedproperty
IDLE_DELAY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%   MessageDialogOKCENTRE	ShowModalDestroy)msgr9   dialogr   r   r    error_msg_wx;   s   
rD   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_timer	_on_timerNotifysuper__init__r   argskwargs	__class__r   r    rK   I   s   

zTimerWx.__init__c                 C   s   | j | j| j d S r#   )rG   Start	_interval_singler   r   r   r    _timer_startN   s   zTimerWx._timer_startc                 C   s   | j   d S r#   )rG   Stopr   r   r   r    _timer_stopQ      zTimerWx._timer_stopc                 C   s   | j  r|   d S d S r#   )rG   	IsRunningrT   r   r   r   r    _timer_set_intervalT   s   
zTimerWx._timer_set_interval)	r2   r3   r4   __doc__rK   rT   rV   rY   __classcell__r   r   rO   r    rE   F   s    rE   c                       sR  e Zd ZdZi dejdejdejdejdejdejdejd	ejd
ejdejdejdejdejdejdejdejdejdejiZej	ej
ejdZejejejejejejejdZ fddZdd Zdd Zdd Zdd Zd d! Zed"d# Zd2d%d&Zd'd( Zd3d*d+Zd,d- Zd.d/ Zd0d1 Z   Z!S )4
RendererWxz
    The renderer handles all the drawing primitives using a graphics
    context instance that controls the colors/styles. It acts as the
    'renderer' instance used by many classes in the hierarchy.
    d      ,  i  i  iX  i  i   i  
ultralightlightnormalmediumsemiboldboldheavy	ultraboldblack)italicrb   oblique)SansRomanScript
DecorativeModernCourier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 futurewxaggz7See the Matplotlib usage FAQ for more info on backends.)namer   r   alternativeaddendum%s - __init__()N)r   warn_deprecatedrJ   rK   _logdebugtypeGetWidthwidth	GetHeightheightbitmapfontddpigc)r   r   r   rO   r   r    rK      s   



zRendererWx.__init__c                 C   r   NTr   r   r   r   r    flipy   s   zRendererWx.flipyc                 C   r   r   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_mathr   new_gcgfx_ctxget_wx_fontSetFontr%   BLACKGetFullTextExtent)r   spropismathr   r   fontwhdescentleadingr   r   r    get_text_width_height_descent   s   



z(RendererWx.get_text_width_height_descentc                 C   s   | j | jfS r#   )r}   r   r   r   r   r    get_canvas_width_height      z"RendererWx.get_canvas_width_heightc                 C   sv   |  }|d ur|j}|j}|j|kr9||_|d u r |  d S ||d | j|d  |d  |d |d  d S d S )Nr            )get_clip_rectangleboundsr   _lastcliprect	ResetClipClipr   )r   r   
new_boundsr   r   r   r    handle_clip_rectangle   s   

z RendererWx.handle_clip_rectanglec                 C   s   |   }||D ]9\}}|tjkr|j|  q	|tjkr#|j|  q	|tjkr.|j|  q	|tj	kr9|j
|  q	|tjkrB|  q	|S r#   )
CreatePathiter_segmentsr   MOVETOMoveToPointLINETOAddLineToPointCURVE3AddQuadCurveToPointCURVE4AddCurveToPoint	CLOSEPOLYCloseSubpath)r   path	transformwxpathpointscoder   r   r    convert_path   s   




zRendererWx.convert_pathNc                 C   s   |   | | |j}|t ddd| j }| |||}|d ur6|t	
|| || n|| |  d S )Ng      ?g              )selectr   r   r   scale	translater   r   SetBrushr%   Brushget_wxcolourDrawPath
StrokePathunselect)r   r   r   r   rgbFacer   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   r}   r   shaper%   BitmapFromBufferRGBAtobytesr   r   
DrawBitmapintr   )r   r   xyimbboxlbr   r   rowscolsr   r   r   r    
draw_image   s   zRendererWx.draw_imageFc	                 C   s   |rt |}tdt|  |  | | |j}	| ||}
|	|
 }|	|
| | |||\}}}t|}t|| }|dkrN|	||| nt|}|t| }|t| }|	||| || | |  d S )Nz%s - draw_text()r   )r   r   ry   rz   r{   r   r   r   r   r   get_rgbr   r   r   DrawTextmathradianssincosDrawRotatedTextr   )r   r   r   r   r   r   angler   mtextr   r   colorr   r   dradsxo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())ry   rz   r{   GraphicsContextWxr   r   r   r   r   r   r   r    r     s
   

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur|S | | }tj	t
|d | j| tj| j|  | j|  d | j|< }|S )z7Return a wx font.  Cache font instances for efficiency.z%s - get_wx_font()Ng      ?)	pointSizefamilyr<   weight)ry   rz   r{   hashr   getpoints_to_pixelsget_size_in_pointsr%   Fontr   	fontnamesget_nameROMAN
fontangles	get_stylefontweights
get_weight)r   r   r   keyr   sizer   r   r    r     s   
zRendererWx.get_wx_fontc                 C   s   |t d | j d  S )Ng      R@)PIXELS_PER_INCHr   )r   r   r   r   r    r   *  s   zRendererWx.points_to_pixelsr#   )FN)"r2   r3   r4   rZ   r%   FONTWEIGHT_LIGHTFONTWEIGHT_NORMALFONTWEIGHT_BOLDr   FONTSTYLE_ITALICFONTSTYLE_NORMALFONTSTYLE_SLANTr   FONTFAMILY_SWISSFONTFAMILY_ROMANFONTFAMILY_SCRIPTFONTFAMILY_DECORATIVEFONTFAMILY_MODERNr   rK   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r[   r   r   rO   r    r\   Y   s    	





r\   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.
    )butt
projectinground)bevelmiterr   c                    s   t    tdt| | | j|d\}}|d u r4t }|	| tj
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNr   r   )rJ   rK   ry   rz   r{   _cacher   r%   MemoryDCSelectObjectGraphicsContextCreater   r   dcr   PenSOLID_penSetPenrenderer)r   r   r  r  r   rO   r   r    rK   G  s   


zGraphicsContextWx.__init__c                 C   s&   t jdkr| j| j d| _dS dS )z2Select the current bitmap into this wxDC instance.win32TN)sysplatformr  r  r   
IsSelectedr   r   r   r    r   [     

zGraphicsContextWx.selectc                 C   s&   t jdkr| jtj d| _dS dS )z-Select a Null bitmap into this wxDC instance.r  FN)r  r  r  r  r%   
NullBitmapr  r   r   r   r    r   a  r  zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())ry   rz   r{   r   rJ   set_foregroundr  	SetColourr   r   r   r  r   )r   fgisRGBArO   r   r    r  g  s   z GraphicsContextWx.set_foregroundc                    s   t |}tdt|  |   d|  k rdk rn nd}t | t| j	| j
}|dkr3d}| j| | j| j |   d S )Nz%s - set_linewidth()r   r   )floatry   rz   r{   r   rJ   set_linewidthr   r  r   
_linewidthr  SetWidthr   r  r   )r   r   lwrO   r   r    r  v  s   zGraphicsContextWx.set_linewidthc                    R   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())ry   rz   r{   r   rJ   set_capstyler  SetCapr   _capd	_capstyler   r  r   )r   csrO   r   r    r       zGraphicsContextWx.set_capstylec                    r  )Nz%s - set_joinstyle())ry   rz   r{   r   rJ   set_joinstyler  SetJoinr   _joind
_joinstyler   r  r   )r   jsrO   r   r    r$    r#  zGraphicsContextWx.set_joinstylec                 C   s$   t dt|  tjdd |D  S )z&Convert a RGB(A) color to a wx.Colour.z%s - get_wx_color()c                 S   s   g | ]}t d | qS )   )r   ).0r   r   r   r    
<listcomp>  s    z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)ry   rz   r{   r%   Colour)r   r   r   r   r    r     s   zGraphicsContextWx.get_wxcolourr#   )r2   r3   r4   rZ   r%   CAP_BUTTCAP_PROJECTING	CAP_ROUNDr   
JOIN_BEVEL
JOIN_MITER
JOIN_ROUNDr&  weakrefWeakKeyDictionaryr  rK   r   r   r  r  r  r$  r   r[   r   r   rO   r    r   /  s&    		r   c                       s  e Zd ZdZdZeZi ejdej	dej
dejdejdejdejd	ejd
ejdejdejdejdejdejdejdejdejdi ejdejdejdejdejdejdejdej dej!dej"dej#dej$dej%d ej&d!ej'd"ej(d#ej)d$i ej*d%ej+d&ej,d'ej-d(ej.d)ej/d*ej0d+ej1d,ej2d-ej3d.ej4d/ej5d0ej6dej7dej8d	ej9d
ej:dej;d ej<d!ej=dej>dej?dej@diZAdjd2d3ZBdjd4d5ZCd6d7 ZDd8d9 ZEdkd;d<ZFdjd=d>ZGd?d@ ZHeIJdAdBdldDdEZKi eLjMdFdGdGdHdIdJdJdKdLZM fdMdNZNdOdP ZOdQdR ZPdSdT ZQdUdV ZRdWdX ZSdYdZ ZTdmd\d]ZUd^d_ ZVd`da ZWdbdc ZXddde ZYdfdg ZZdhdi Z[  Z\S )n_FigureCanvasWxBaseaa  
    The FigureCanvas contains the figure and does event handling.

    In the wxPython backend, it is derived from wxPanel, and (usually) lives
    inside a frame instantiated by a FigureManagerWx. The parent window
    probably implements a wx.Sizer to control the displayed control size - but
    we give a hint as to our preferred minimum size.
    r%   controlshiftalt	caps_lockleftuprightdownescapef1f2f3f4f5f6f7f8f9f10f11f12scroll_lockbreak	backspaceenterinsertdeletehomeendpageup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   rK   mapr   ceilfigurer   r   r%   PanelSizer   r   ry   rz   r{   _isDrawn_rubberband_rectBindEVT_SIZE_onSize	EVT_PAINT_onPaintEVT_CHAR_HOOK
_onKeyDown
EVT_KEY_UP_onKeyUpEVT_LEFT_DOWN_onMouseButtonEVT_LEFT_DCLICKEVT_LEFT_UPEVT_MIDDLE_DOWNEVT_MIDDLE_DCLICKEVT_MIDDLE_UPEVT_RIGHT_DOWNEVT_RIGHT_DCLICKEVT_RIGHT_UPEVT_MOUSE_AUX1_DOWNEVT_MOUSE_AUX1_UPEVT_MOUSE_AUX2_DOWNEVT_MOUSE_AUX2_UPEVT_MOUSE_AUX1_DCLICKEVT_MOUSE_AUX2_DCLICKEVT_MOUSEWHEEL_onMouseWheel
EVT_MOTION	_onMotionEVT_LEAVE_WINDOW_onLeaveEVT_ENTER_WINDOW_onEnterEVT_MOUSE_CAPTURE_CHANGED_onCaptureLostEVT_MOUSE_CAPTURE_LOSTSetBackgroundStyleBG_STYLE_PAINTSetBackgroundColourWHITE)r   r9   idrg  r   r   r   r   r    rK     sD   	z_FigureCanvasWxBase.__init__c                 C   sX   t  }|| j t j s(t j }|r*t j| t j  t j	  dS dS dS )z*Copy bitmap of canvas to system clipboard.N)
r%   BitmapDataObject	SetBitmapr   TheClipboardIsOpenedOpenSetDataCloseFlush)r   eventbmp_obj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eraseBackground)ry   rz   r{   rj  Refreshr   r   r   r    	draw_idle#  s   z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r#   )r%   Yieldr   r   r   r    flush_events,  r   z _FigureCanvasWxBase.flush_eventsr   c                 C   sx   t | dr	tdtj| tjd}|dkr,|jt|d dd | jtj| j	|
 d t | _| j  |  d S )N_event_loopzEvent loop already runningr  r   i  T)oneShot)hasattrRuntimeErrorr%   rF   ID_ANYrQ   r   rl  	EVT_TIMERstop_event_loopGetIdGUIEventLoopr  RunrU   )r   timeouttimerr   r   r    start_event_loop0  s   


z$_FigureCanvasWxBase.start_event_loopc                 C   s*   t | dr| j r| j  | `d S d S )Nr  )r  r  rX   Exitr   r  r   r   r    r  =  s
   


z#_FigureCanvasWxBase.stop_event_loopc                 C   s   |   }|  }t| }g }g }d}t|D ])\}\}}	ddd |	D }
||	d  d||
|
f }||	v r<|}|| qd|}|||fS )z3Return the wildcard string for the filesave dialog.r   ;c                 S   s   g | ]}d | qS )z*.%sr   )r*  extr   r   r    r+  M  s    z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z
%s (%s)|%s|)get_default_filetypeget_supported_filetypes_groupedsorteditems	enumeratejoinappend)r   default_filetype	filetypessorted_filetypes	wildcards
extensionsfilter_indexirt   extsext_listwildcardr   r   r    _get_imagesave_wildcardsD  s   

z,_FigureCanvasWxBase._get_imagesave_wildcards3.4originWXc              	   C   s   t dt|  | r|  sdS |st| }tjdkr*t| jj	t
r*| j  n| j}||dd | jdurett| j\}}}}|||||f||||f||||f||||fgtddtj dS dS )z
        Update the displayed image on the GUI canvas, using the supplied
        wx.PaintDC device context.

        The 'WXAgg' backend sets origin accordingly.
        z%s - gui_repaint()N	__WXMSW__r   r   r   )ry   rz   r{   IsShownOnScreenr%   ClientDCPlatform
isinstancerg  _cachedRendererr\   r   ConvertToImageConvertToBitmapr   rk  re  r   DrawLineListr	  PENSTYLE_SHORT_DASH)r   drawDCr  bmpx0y0x1y1r   r   r    gui_repaintV  s*   


z_FigureCanvasWxBase.gui_repaintzWindows bitmapJPEGPCXzPortable Network GraphicszTagged Image Format FilezX pixmap)r  jpegjpgpcxpngtiftiffxpmc                    s0   t  j|g|R i | | jr|   d S d S r#   )rJ   print_figurerj  draw)r   filenamerM   rN   rO   r   r    r    s   z _FigureCanvasWxBase.print_figurec                 C   sF   t dt|  t| }| js| j|d n| j|d |  dS )z$Called when wxPaintEvt is generated.z%s - _onPaint()r  N)	ry   rz   r{   r%   PaintDCrj  r  r  rA   )r   r  r  r   r   r    rp    s   
z_FigureCanvasWxBase._onPaintc                 C   s  t dt|  |   }|r|| }|r'|r'|js'|jtj	@ s'| 
 }n|  }|| 
  t| ddrB|| j| jfkrBdS |\| _| _d| _| jdksU| jdkrWdS t| j| j| _| jj}| j| }| j| }| jj||dd | jdd t|  dS )z
        Called when wxEventSize is generated.

        In this application we attempt to resize to fit the window, so it
        is better to take the performance hit and redraw the whole window.
        z%s - _onSize()_widthNFr   )forwardr  )ry   rz   r{   	GetParentGetSizerGetItem
ProportionFlagr%   EXPAND
GetMinSizeGetClientSizeIncTogetattrr  _heightrj  r   r   rg  r   set_size_inchesr  r   resize_event)r   r  szsir   dpivalwinchhinchr   r   r    rn    s,   



z_FigureCanvasWxBase._onSizec                 C   s   |j }|| jv r| j| }n|dk rt|}| s| }nd }|jddg|jddg|jddgfD ]\}}}| rL||krL|dkrF| sLd||}q2|S )N   ctrlr6  r8  r7  z{0}+{1})	KeyCodekeyvaldchr	ShiftDownlowerControlDownAltDownisupperformat)r   r  keyvalr   methprefixkey_namer   r   r    _get_key  s$   



z_FigureCanvasWxBase._get_keyc                 C   .   |  |}tj| ||d | r|  dS dS )zCapture key press.guiEventN)r  r   key_press_eventSkipr   r  r   r   r   r    rr    
   
z_FigureCanvasWxBase._onKeyDownc                 C   r  )zRelease key.r  N)r  r   key_release_eventr  r  r   r   r    rt    r  z_FigureCanvasWxBase._onKeyUpc                 C   sb   t tjtjt jtjt jtjt j	tj
t jtjt jtjt jtjt ji|d}| | |   d S )N)cursor)r%   Cursorr   check_getitemr   r$   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   	SetCursorr  r   r  r   r   r    
set_cursor  s   
	z_FigureCanvasWxBase.set_cursorTc                 C   s$   |   r|   |r|   dS dS )zControl wx mouse capture.N)
HasCaptureReleaseMouseCaptureMouse)r   capturer   r   r    _set_capture  s
   z _FigureCanvasWxBase._set_capturec                 C   s   |  d dS )zCapture changed or lostFN)r$  r  r   r   r    r    s   z"_FigureCanvasWxBase._onCaptureLostc              
   C   s   |   | | p|  |j}| jjj|j }t	j
tjt	jtjt	jtjt	jtjt	jtji}| }|||}| rI| j||||d dS | rY| j|||d|d dS | rh| j||||d dS dS )Start measuring on an axis.r  T)dblclickr  N)r  r$  
ButtonDownButtonDClickXrg  r   r   Yr%   MOUSE_BTN_LEFTr   LEFTMOUSE_BTN_MIDDLEMIDDLEMOUSE_BTN_RIGHTRIGHTMOUSE_BTN_AUX1BACKMOUSE_BTN_AUX2FORWARD	GetButtonr   button_press_eventButtonUpbutton_release_event)r   r  r   r   
button_mapbuttonr   r   r    rv    s*   
z"_FigureCanvasWxBase._onMouseButtonc                 C   s~   |  }| jjj|  }|j|j |j }|  t	j
dkr3t| ds(d| _n| jr0d| _dS d| _tj| ||||d dS )z3Translate mouse wheel events into matplotlib events	__WXMAC___skipwheeleventTFNr  )GetXrg  r   r   GetYLinesPerActionWheelRotation
WheelDeltar  r%   r  r  r<  r   scroll_event)r   r  r   r   stepr   r   r    r    s   

z!_FigureCanvasWxBase._onMouseWheelc                 C   s8   |  }| jjj|  }|  tj| |||d dS )r%  r  N)r=  rg  r   r   r>  r  r   motion_notify_eventr   r  r   r   r   r   r    r  )  s   z_FigureCanvasWxBase._onMotionc                 C   s   |   tj| |d dS )zMouse has left the window.r  N)r  r   leave_notify_eventr  r   r   r    r  0  s   z_FigureCanvasWxBase._onLeavec                 C   s:   |  }| jjj|  }|  tj| |||fd dS )zMouse has entered the window.)r  xyN)r=  rg  r   r   r>  r  r   enter_notify_eventrE  r   r   r    r  5  s   z_FigureCanvasWxBase._onEnterr#   )r   )Nr  T)]r2   r3   r4   rZ   required_interactive_frameworkrE   
_timer_clsr%   WXK_CONTROL	WXK_SHIFTWXK_ALTWXK_CAPITALWXK_LEFTWXK_UP	WXK_RIGHTWXK_DOWN
WXK_ESCAPEWXK_F1WXK_F2WXK_F3WXK_F4WXK_F5WXK_F6WXK_F7WXK_F8WXK_F9WXK_F10WXK_F11WXK_F12
WXK_SCROLL	WXK_PAUSEWXK_BACK
WXK_RETURN
WXK_INSERT
WXK_DELETEWXK_HOMEWXK_END
WXK_PAGEUPWXK_PAGEDOWNWXK_NUMPAD0WXK_NUMPAD1WXK_NUMPAD2WXK_NUMPAD3WXK_NUMPAD4WXK_NUMPAD5WXK_NUMPAD6WXK_NUMPAD7WXK_NUMPAD8WXK_NUMPAD9WXK_NUMPAD_ADDWXK_NUMPAD_SUBTRACTWXK_NUMPAD_MULTIPLYWXK_NUMPAD_DIVIDEWXK_NUMPAD_DECIMALWXK_NUMPAD_ENTERWXK_NUMPAD_UPWXK_NUMPAD_RIGHTWXK_NUMPAD_DOWNWXK_NUMPAD_LEFTWXK_NUMPAD_PAGEUPWXK_NUMPAD_PAGEDOWNWXK_NUMPAD_HOMEWXK_NUMPAD_ENDWXK_NUMPAD_INSERTWXK_NUMPAD_DELETEr  rK   r  r  r  r  r  r  r   delete_parameterr  r   r  r  rp  rn  r  rr  rt  r  r$  r  rv  r  r  r  r  r[   r   r   rO   r    r5    s*   		
 !"#$%&'()*+,-./01234
<
1	


	
,
r5  c                   @   s~   e Zd ZdddZedd Zeeej	Z
eeej ZZeeejZeeejZeeej ZZeeejZdS )FigureCanvasWxNc                 C   sF   t dt|  t| j| jj| _| j| j d| _	| j
|d dS )z
        Render the figure using RendererWx instance renderer, or using a
        previously defined renderer if none is specified.
        z%s - draw()Tr  N)ry   rz   r{   r\   r   rg  r   r  r  rj  r  )r   r  r   r   r    r  @  s
   zFigureCanvasWx.drawc                 C   s   | j }tt| jjjt| jjj| _ t	| j | jj
}| }| j| | j }t|r:t|tjs:| }|||sGtd| || _ | jrQ|   | rY|   d S d S )NzCould not save figure to )r   r%   r   r   rf  rg  r   r}   r   r\   r   r   r  r   is_writable_file_liker  Imager  SaveFiler  rj  r  )r   filetyper  
origBitmapr  r   imager   r   r    _print_imageK  s(   

zFigureCanvasWx._print_imager#   )r2   r3   r4   r  r   r  	functoolspartialmethodr%   BITMAP_TYPE_BMP	print_bmpBITMAP_TYPE_JPEG
print_jpeg	print_jpgBITMAP_TYPE_PCX	print_pcxBITMAP_TYPE_PNG	print_pngBITMAP_TYPE_TIF
print_tiff	print_tifBITMAP_TYPE_XPM	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 r~t!"| jj  | jr~t!#| j | jd ur| j$  | j% \}}| j% \}}	| j&t || | j| jdt jt jB  | '| j | (  | j)d | *t j+| j, d S )	Nr     )r9   r  posrw   r   r   )r   r   )-r%   r  DefaultPositionPointrJ   rK   ry   rz   r{   num_set_frame_icon
get_canvascanvasre  r   rf  r   r   SetInitialSizeri  SetFocusBoxSizerVERTICALsizerAddTOPr,  r  FigureManagerWxfigmgr_get_toolbartoolbartoolmanagerr   add_tools_to_manageradd_tools_to_containerRealizeGetSizeSetSizeSetSizerFit
SetMinSizerl  	EVT_CLOSE_onClose)
r   r  figr  r   r   twthfwfhrO   r   r    rK     s:   

 


zFigureFrameWx.__init__c                 C   s   | j jS r#   )r  r  r   r   r   r    r    s   zFigureFrameWx.toolmanagerc                 C   sB   t jd dkrt| j}|S t jd dkrt| j| }|S d }|S )Nr  toolbar2r  )mplrcParamsNavigationToolbar2Wxr  	ToolbarWxr  )r   r  r   r   r    r    s   
zFigureFrameWx._get_toolbarc                 C   s   t | d|S Nr  )r  )r   r  r   r   r    r    s   zFigureFrameWx.get_canvasc                 C   s   t dt|  | jS )Nz%s - get_figure_manager())ry   rz   r{   r  r   r   r   r    get_figure_manager  s   z FigureFrameWx.get_figure_managerc                 C   sD   t dt|  | j  | j  d | j_t	| j |
  d S )Nz%s - onClose())ry   rz   r{   r  close_eventr  r  framer   destroyr  r  r   r   r    r    s   

zFigureFrameWx._onClosec                 C   s   | j S )z=Override wxFrame::GetToolBar as we don't have managed toolbar)r  r   r   r   r    
GetToolBar  s   zFigureFrameWx.GetToolBarc                    sJ   z
| j | jj W n	 ty   Y nw | r#|  s#t j|i | dS r   )r  mpl_disconnectr  _id_dragAttributeErrorIsBeingDeletedrJ   rA   rL   rO   r   r    rA     s   zFigureFrameWx.Destroy)r2   r3   r4   rK   r6   r  r  r  r  r  r  rA   r[   r   r   rO   r    r  ~  s    0
	r  c                       sj   e Zd ZdZ fddZedd Zejdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Z  ZS )r  a  
    Container/controller for the FigureCanvas and GUI frame.

    It is instantiated by Gcf whenever a new figure is created.  Gcf is
    responsible for managing multiple instances of FigureManagerWx.

    Attributes
    ----------
    canvas : `FigureCanvas`
        a FigureCanvasWx(wx.Panel) instance
    window : wxFrame
        a wxFrame instance - wxpython.org/Phoenix/docs/html/Frame.html
    c                    s:   t dt|  | | _| _d| _t || d| _d S )Nrw   TF)ry   rz   r{   r  window_initializingrJ   rK   )r   r  r  r  rO   r   r    rK     s
   
zFigureManagerWx.__init__c                 C   
   | j  S r#   )r  r  r   r   r   r    r       
zFigureManagerWx.toolbarc                 C   s   | j stdd S )Nzcan't set attribute)r  r  )r   valuer   r   r    r    s   c                 C   s0   | j   | j  tjd r| j   d S d S )Nzfigure.raise_window)r  Showr  r  r  r  Raiser   r   r   r    show  s
   


zFigureManagerWx.showc                 G   s.   t dt|  | j}|rt|j d S d S )Nz%s - destroy())ry   rz   r{   r  r%   	CallAfterr  )r   rM   r  r   r   r    r    s
   zFigureManagerWx.destroyc                 C   s   | j | j    d S r#   )r  ShowFullScreenIsFullScreenr   r   r   r    full_screen_toggle  s   z"FigureManagerWx.full_screen_togglec                 C   r  r#   )r  GetTitler   r   r   r    get_window_title  r  z FigureManagerWx.get_window_titlec                 C      | j | d S r#   )r  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#   )	r  r  r%   ri  r   rf  r  r  r  )r   r}   r   r   r   r    resize   s   zFigureManagerWx.resize)r2   r3   r4   rZ   rK   r6   r  setterr  r  r  r  r  r  r[   r   r   rO   r    r    s    

	r  c                 C   s   t ttd| S )z\
    Load a wx.Bitmap from a file in the "images" directory of the Matplotlib
    data.
    images)r%   r   strr   _get_data_path)r  r   r   r    _load_bitmap'  s   r  c                 C   sF   t  }dD ]}t t|}| s d S || q| | d S )N)zmatplotlib.pngzmatplotlib_large.png)r%   
IconBundleIconr  IsOkAddIconSetIcons)r  bundler  iconr   r   r    r  /  s   r  c                       s   e Zd ZdddZedd Zeddd Zd	d
 Z	 fddZ
 fddZdd Zdd Zdd Zdd Zdd Z  ZS )r  Tc              	   C   s   t j| | d dt jv r| d i | _| jD ]<\}}}}|d u r)|   q| j	d| 
| dt j|||dv r>t jnt jdj| j|< | jt jt| || j| d q|| _| jrm|   t | | _| | j |   t| | d S )Nr  wxMac)   r  z.png)PanZoom)r   bmpDisabledlabel	shortHelpkindr  )r%   ToolBarrK   r  PlatformInfoSetToolBitmapSizewx_ids	toolitemsAddSeparatorAddTool_iconr  
ITEM_CHECKITEM_NORMALIdrl  EVT_TOOLr  _coordinatesAddStretchableSpace
StaticText_label_text
AddControlr  r   )r   r  coordinatestexttooltip_text
image_filecallbackr   r   r    rK   :  s8   

	zNavigationToolbar2Wx.__init__c                 C   s  t tjtd| }z	tj	 
 }W n? tyU   tjtj}tjtj}d|j d|j  d|j  d }d|j d|j  d|j  d }|| dk}Y nw |r~tjtj}|ddd	f d
kjdd}| | | f||dd	f< tj|jd |jd
 | S )z
        Construct a `wx.Bitmap` suitable for use as icon from an image file
        *name*, including the extension and relative to Matplotlib's "images"
        data directory.
        r  gA`"?gbX9?gv/?r)  g?.Nr   r   r  )axisr   )nparrayPILr  openr   r  r%   SystemSettingsGetAppearanceIsDarkr  	GetColourSYS_COLOUR_WINDOWSYS_COLOUR_WINDOWTEXTredgreenblueallRedGreenBluer   r   r   r   )rt   r  darkbgr  bg_lumfg_lum
black_maskr   r   r    r   Z  s"   """zNavigationToolbar2Wx._iconr  c                 C   s   t | j|d|S r  )r{   r  )r   r  r  r   r   r    r  s  s   zNavigationToolbar2Wx.get_canvasc                 C   sP   d| j v r| | j d | jjdk d| j v r&| | j d | jjdk d S d S )Nr  PANr  ZOOM)r  
ToggleToolmodert   r   r   r   r    _update_buttons_checkedw  s
   

z,NavigationToolbar2Wx._update_buttons_checkedc                       t  j|  |   d S r#   )rJ   zoomr*  r   rM   rO   r   r    r,  }     zNavigationToolbar2Wx.zoomc                    r+  r#   )rJ   panr*  r-  rO   r   r    r/    r.  zNavigationToolbar2Wx.panc              
   G   s,  | j  \}}}| j  }t| j  dtjd ||tjtj	B }|
| | tjkrt| }tdt| | ||  }|jdd  }	|	| j  v r_||	kr_td|	||	 |	}tjd rlt|jtjd< z| j jjt||d W d S  ty }
 ztt|
 W Y d }
~
d S d }
~
ww d S )NzSave to filezsavefig.directoryz%s - Save file path: %sr   zDextension %s did not match the selected image type %s; going with %s)r  )r  r  get_default_filenamer%   
FileDialogr  r  r  FD_SAVEFD_OVERWRITE_PROMPTSetFilterIndexr@   ID_OKpathlibr   GetPathry   rz   r{   GetFilterIndexsuffixget_supported_filetypeswarningr  r9   rg  savefig	ExceptionrD   )r   rM   r  r  r  default_filedlgr   fmtr  er   r   r    save_figure  s6   




z NavigationToolbar2Wx.save_figurec                 C   s2   | j jjj}||| ||| f| j _| j   d S r#   )r  rg  r   r   rk  r  )r   r  r  r  r  r  r   r   r   r    draw_rubberband  s   z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r#   )r  rk  r  r   r   r   r    remove_rubberband  s   z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S d S r#   )r  r  SetLabelr   r   r   r   r    set_message  s   z NavigationToolbar2Wx.set_messagec                 C   sd   | j jdk}| j jt| j jd k }d| jv r | | jd | d| jv r0| | jd | d S d S )Nr   r   BackForward)
_nav_stack_poslen	_elementsr  
EnableTool)r   can_backwardcan_forwardr   r   r    set_history_buttons  s   

z(NavigationToolbar2Wx.set_history_buttonsrI  )r2   r3   r4   rK   r   r   r   r5   r  r*  r,  r/  rB  rC  rD  rG  rQ  r[   r   r   rO   r    r  9  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 )Nr  )r<   )r   rK   r%   r  r  _spacer  r  r	  
_toolitems_groups)r   r  r9   r<   r   r   r    rK     s   

zToolbarWx.__init__c                    s     fddt  jD \}|S )z
        Find the position (index) of a wx.ToolBarToolBase in a ToolBar.

        ``ToolBar.GetToolPos`` is not useful because wx assigns the same Id to
        all Separators and StretchableSpaces.
        c                    s   g | ]}  |kr|qS r   )GetToolByPos)r*  r  r   toolr   r    r+    s    z+ToolbarWx._get_tool_pos.<locals>.<listcomp>)range
ToolsCount)r   rW  r  r   rV  r    _get_tool_pos  s   zToolbarWx._get_tool_posc              	      s  |j vrjj |< j | }dd tjtjD }|dkr?||d kr0dn|||d  d }	n|d }	|	| }
|rht	
|}|sVtjntj}|
d |tj||ped}n( d d df}|rtjd |d}n	tjd |d}j|
| d	}   fd
d}|rtj|| n|tj| j g  j  ||f d S )Nc                 S   s    g | ]}|  r| s|qS r   )IsSeparatorIsStretchableSpace)r*  tr   r   r    r+    s
    
z*ToolbarWx.add_toolitem.<locals>.<listcomp>r   r   r  r   
   rd  r  c                    s      d S r#   )trigger_tool)r  rt   r   r   r    handler  rW   z'ToolbarWx.add_toolitem.<locals>.handler)rT  InsertSeparatorrZ  rR  re  rU  rX  rY  indexr  r   r%   r  r  
InsertToolr  GetTextExtentToggleButtonButtonInsertControlr  rl  r  ru  rS  
setdefaultr  )r   rt   grouppositionr  descriptiontogglesepsepsstartidxr  r  rW  r   r6  rb  r   ra  r    add_toolitem  s<   




zToolbarWx.add_toolitemc                 C   sT   || j vrd S | j | D ]\}}| s| |j| q| | q|   d S r#   )rS  	IsControlr(  r  
GetControlSetValuer  )r   rt   toggledrW  rb  r   r   r    toggle_toolitem  s   
zToolbarWx.toggle_toolitemc                 C   s,   | j | D ]
\}}| |j q| j |= d S r#   )rS  
DeleteToolr  )r   rt   rW  rb  r   r   r    remove_toolitem  s   zToolbarWx.remove_toolitemc                 C   r  r#   )r  rE  rF  r   r   r    rG    s   zToolbarWx.set_messageN)r2   r3   r4   r%   TB_HORIZONTALrK   rZ  rs  rx  rz  rG  r   r   r   r    r    s    	-
r  c                   @      e Zd Zdd ZdS )ConfigureSubplotsWxc                 G   s   t |  d S r#   )r  configure_subplotsr-  r   r   r    trigger  rW   zConfigureSubplotsWx.triggerNr2   r3   r4   r  r   r   r   r    r}        r}  c                   @   r|  )SaveFigureWxc                 G      t |   d S r#   )r  rB  "_make_classic_style_pseudo_toolbarr-  r   r   r    r       zSaveFigureWx.triggerNr  r   r   r   r    r    r  r  r"   ToolSetCursor)ru   c                   @   r|  )SetCursorWxc                 C   s   t |  | d S r#   )r  r  r  r  r   r   r    r    s   zSetCursorWx.set_cursorN)r2   r3   r4   r  r   r   r   r    r    s    r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandWxc                 C   s   t |  d |||| d S r#   )r  rC  r  )r   r  r  r  r  r   r   r    rC  "  s   zRubberbandWx.draw_rubberbandc                 C   r  r#   )r  rD  r  r   r   r   r    rD  &  r  zRubberbandWx.remove_rubberbandN)r2   r3   r4   rC  rD  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)Action	ShortcutsDescription)r]      r_   c                    s"  t  j|dtjtjB d ttj}tdddd}|  	 }t
| j| D ],\}}t|| jD ]!\}}	tj| |d}
|dkrF|
| |
|	 ||
ddd q2q(||dtjd t| tj}||dtjtjB d | | ||  |   | tj| j |tj| j d S )NHelp)r  r<   r   r         r_  )rJ   rK   r%   DEFAULT_DIALOG_STYLERESIZE_BORDERr  r  FlexGridSizerGetFontMakeBoldr  headerszipwidthsr  r   Wrapr  ALLrh  r5  ALIGN_CENTER_HORIZONTALr  r  Layoutrl  r  OnClose
EVT_BUTTON)r   r9   help_entriesr  
grid_sizerre   rrowcolr}   r  r>   rO   r   r    rK   0  s,   





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r#   )r  	_instanceDestroyLaterr  r  r   r   r    r  I  s   z_HelpDialog.OnClosec                 C   s.   | j r
| j   d S | ||| _ | j   d S r#   )r  r  r  )clsr9   r  r   r   r    r  N  s
   
z_HelpDialog.show)r2   r3   r4   r  r  r  rK   r  classmethodr  r[   r   r   rO   r    r  +  s    r  c                   @   r|  )HelpWxc                 G   s   t | jj |   d S r#   )r  r  rg  r  GetTopLevelParent_get_help_entriesr-  r   r   r    r  Y  s   zHelpWx.triggerNr  r   r   r   r    r  X  r  r  c                   @   r|  )ToolCopyToClipboardWxc                 O   s`   | j js	| j   | j j rtj sd S ztjt	| j j W tj
  d S tj
  w r#   )r  rj  r  r   r  r%   r  r  r  r  r  rL   r   r   r    r  _  s   
zToolCopyToClipboardWx.triggerNr  r   r   r   r    r  ^  r  r  c                       sD   e Zd ZeZeZeZe	 fddZ
e	dd Zedd Z  ZS )
_BackendWxc                    sL   t  }|d u rt d}|d t  |t_t j	|g|R i |S )NFT)
r%   GetAppAppSetExitOnFrameDeleter   _setup_new_guiappr  	_theWxApprJ   new_figure_manager)r  r  rM   rN   wxapprO   r   r    r  w  s   

z_BackendWx.new_figure_managerc                 C   s4   |  ||}| }t r|j  |j  |S r#   )_frame_classr  r  is_interactiver  r  r  r  )r  r  rg  r  r  r   r   r    new_figure_manager_given_figure  s   

z*_BackendWx.new_figure_manager_given_figurec                  C   s.   t j st  } | d ur|   d S d S d S r#   )r%   r  IsMainLoopRunningr  MainLoop)r  r   r   r    mainloop  s   
z_BackendWx.mainloop)r2   r3   r4   r  FigureCanvasr  FigureManagerr  r  r  r  r  r   r  r[   r   r   rO   r    r  q  s    
r  r#   )SrZ   r  loggingr   r6  r  r3  numpyr  r  
matplotlibr  matplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   matplotlib._pylab_helpersr   matplotlib.backend_managersr   matplotlib.figurer   matplotlib.pathr   matplotlib.transformsr   matplotlib.widgetsr   r%   	getLoggerr2   ry   r   caching_module_getattrr   rD   rE   r\   r   rh  r5  r  Framer  r  r  r  r  r  r  ConfigureSubplotsBaser}  SaveFigureBaser  r5   SetCursorBaser  RubberbandBaser  Dialogr  ToolHelpBaser  ToolCopyToClipboardBaser  ToolSaveFigureToolConfigureSubplotsToolRubberbandToolHelpToolCopyToClipboardexportr  r   r   r   r    <module>   sn    	4

 Wn   #AeD
 U
-