o
    h`                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z
ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'Z'ddl(Z'e)e*Z+dZ,e-d	d
d Z.G dd deZ/ej0dddddddG dd deZ1G dd deZ2G dd dee'j3Z4G dd de4Z5G dd de'j6Z7G dd  d eZ8d!d" Z9d#d$ Z:G d%d& d&ee'j;Z<G d'd( d(ee'j;Z=e>e4G d)d* d*ej?Z@e>e4G d+d, d,ejAZBe>e4G d-d. d.ejCZDG d/d0 d0e'jEZFe>e4G d1d2 d2ejGZHe>e4G d3d4 d4ejIZJe<e8_Ke=e8_LejMG d5d6 d6eZNdS )7z
A wxPython backend for matplotlib.

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

Copyright (C) Jeremy O'Donoghue & John Hunter, 2003-4.
    N)_BackendFigureCanvasBaseFigureManagerBaseGraphicsContextBaseMouseButtonNavigationToolbar2RendererBase	TimerBaseToolContainerBasecursors
CloseEventKeyEventLocationEvent
MouseEventResizeEvent)_apicbookbackend_tools_c_internal_utils)Gcf)Path)Affine2DK      c                  C   s(   t d} | d t  t  | S )NFT)wxAppSetExitOnFrameDeleter   _setup_new_guiappr    Win32_SetProcessDpiAwareness_max)wxapp r    r/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/backends/backend_wx.py_create_wxapp,   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 N)r   Timer_timer	_on_timerNotifysuper__init__selfargskwargs	__class__r    r!   r*   9   s   

zTimerWx.__init__c                 C   s   | j | j| j d S r$   )r&   Start	_interval_singler,   r    r    r!   _timer_start>   s   zTimerWx._timer_startc                 C   s   | j   d S r$   )r&   Stopr4   r    r    r!   _timer_stopA      zTimerWx._timer_stopc                 C   s   | j  r|   d S d S r$   )r&   	IsRunningr5   r4   r    r    r!   _timer_set_intervalD   s   
zTimerWx._timer_set_interval)	__name__
__module____qualname____doc__r*   r5   r7   r:   __classcell__r    r    r/   r!   r#   6   s    r#   z2.0r   backendz
the futurewxaggz7See the Matplotlib usage FAQ for more info on backends.)nameobj_typeremovalalternativeaddendumc                       sJ  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ed d! Zd0d#d$Zd%d& Zd1d(d)Zd*d+ Zd,d- Zd.d/ Z  Z S )2
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)italicrM   oblique)SansRomanScript
DecorativeModernCouriercourierc                    sJ   t    tdt|  | | _| | _|| _	i | _
|| _d| _dS )z)Initialise a wxWindows renderer instance.%s - __init__()N)r)   r*   _logdebugtypeGetWidthwidth	GetHeightheightbitmapfontddpigc)r,   re   rg   r/   r    r!   r*      s   



zRendererWx.__init__c                 C   s   dS )NTr    r4   r    r    r!   flipy   s   zRendererWx.flipyc                 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   BLACKGetFullTextExtent)r,   spropismathrh   rl   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$   )rb   rd   r4   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   r         )get_clip_rectangleboundsrl   _lastcliprect	ResetClipCliprd   )r,   rh   
new_boundsrl   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)rl   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   rl   r   scale	translaterd   r   SetBrushr   Brushget_wxcolourDrawPath
StrokePathunselect)r,   rh   r   r   rgbFacerl   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   rb   rd   shaper   BitmapFromBufferRGBAtobytesr   rl   
DrawBitmapintr   )r,   rh   xyimbboxlbru   rv   rowscolsre   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   rj   r^   r_   r`   r   r   rl   rm   r   get_rgbrn   ry   r   DrawTextmathradianssincosDrawRotatedTextr   )r,   rh   r   r   rq   rr   anglers   mtextrl   rt   colorru   rv   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())r^   r_   r`   GraphicsContextWxre   rh   r   r   r4   r    r    r!   rk      s
   

zRendererWx.new_gcc                 C   s   t dt|  t|}| j|}|dur|S | | }tj	t
|| j| tj| j|  | j|  d | j|< }|S )z7Return a wx font.  Cache font instances for efficiency.z%s - get_wx_font()N)	pointSizefamilystyleweight)r^   r_   r`   hashrf   getpoints_to_pixelsget_size_in_pointsr   Fontround	fontnamesget_nameROMAN
fontangles	get_stylefontweights
get_weight)r,   rq   rr   keyrt   sizer    r    r!   rm     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_pixelsr$   )FN)!r;   r<   r=   r>   r   FONTWEIGHT_LIGHTFONTWEIGHT_NORMALFONTWEIGHT_BOLDr   FONTSTYLE_ITALICFONTSTYLE_NORMALFONTSTYLE_SLANTr   FONTFAMILY_SWISSFONTFAMILY_ROMANFONTFAMILY_SCRIPTFONTFAMILY_DECORATIVEFONTFAMILY_MODERNr   r*   ri   ry   rz   r   staticmethodr   r   r   r   rk   rm   r   r?   r    r    r/   r!   rG   I   s    	





rG   c                       s   e Zd ZdZejejejdZej	ej
ejdZe Z fddZdd Zdd	 Zd fdd	Z fddZ fddZ fddZdd Z  ZS )r   a<  
    The graphics context provides the color, line styles, etc.

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

    The base GraphicsContext stores colors as an RGB tuple on the unit
    interval, e.g., (0.5, 0.0, 1.0).  wxPython uses an int interval, but
    since wxPython colour management is rather simple, I have not chosen
    to implement a separate colour manager class.
    )butt
projectingr   )bevelmiterr   c                    s   t    tdt| | | j|d\}}|d u r0t|}tj	
|}d |_||f| j|< || _|| _|| _tddtj| _|| j || _d S )Nz%s - __init__(): %s)NNro   r   )r)   r*   r^   r_   r`   _cacher   r   MemoryDCGraphicsContextCreater   re   dcrl   PenSOLID_penSetPenrenderer)r,   re   r   r   rl   r/   r    r!   r*   4  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   SelectObjectre   
IsSelectedr4   r    r    r!   r   G     

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   r4   r    r    r!   r   M  r   zGraphicsContextWx.unselectNc                    sV   t dt|  |   t || | j| | 	  | j
| j |   d S )Nz%s - set_foreground())r^   r_   r`   r   r)   set_foregroundr   	SetColourr   r   rl   r   r   )r,   fgisRGBAr/   r    r!   r   S  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   )floatr^   r_   r`   r   r)   set_linewidthr   r   r   
_linewidthr   SetWidthrl   r   r   )r,   ru   lwr/   r    r!   r   b  s   zGraphicsContextWx.set_linewidthc                    R   t dt|  |   t | | jtj	| j
  | j| j |   d S )Nz%s - set_capstyle())r^   r_   r`   r   r)   set_capstyler   SetCapr   _capd	_capstylerl   r   r   )r,   csr/   r    r!   r  q     zGraphicsContextWx.set_capstylec                    r   )Nz%s - set_joinstyle())r^   r_   r`   r   r)   set_joinstyler   SetJoinr   _joind
_joinstylerl   r   r   )r,   jsr/   r    r!   r  z  r  zGraphicsContextWx.set_joinstylec                 C   s$   t dt|  tjdd |D  S )z'Convert an RGB(A) color to a wx.Colour.z%s - get_wx_color()c                 S   s   g | ]}t d | qS )   )r   ).0r   r    r    r!   
<listcomp>      z2GraphicsContextWx.get_wxcolour.<locals>.<listcomp>)r^   r_   r`   r   Colour)r,   r   r    r    r!   r     s   zGraphicsContextWx.get_wxcolourr$   )r;   r<   r=   r>   r   CAP_BUTTCAP_PROJECTING	CAP_ROUNDr  
JOIN_BEVEL
JOIN_MITER
JOIN_ROUNDr	  weakrefWeakKeyDictionaryr   r*   r   r   r   r   r  r  r   r?   r    r    r/   r!   r     s&    		r   c                   @   s  e Zd ZdZdZeZedd 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
j0d*e
j1d+e
j2d,e
j3d-e
j4d.e
j5d/e
j6d0e
j7d1e
j8d2e
j9de
j:d
e
j;de
j<de
j=d	e
j>d"e
j?d#e
j@d e
jAd!e
jBde
jCdiZDdpd4d5ZEdpd6d7ZFd8d9 ZGd:d; ZHd<d= ZIdqd?d@ZJdpdAdBZKdCdD ZLdpdEdFZMi eNjOdGdHdHdIdJdKdKdLdMZOdNdO ZPdPdQ ZQeRdRdS ZSeRdpd3dTdUdVZTdWdX ZUdpdYdZZVd[d\ ZWd]d^ ZXd_d` ZYdrdbdcZZddde Z[dfdg Z\dhdi Z]djdk Z^dldm Z_dndo Z`d3S )s_FigureCanvasWxBaseaa  
    The FigureCanvas contains the figure and does event handling.

    In the wxPython backend, it is derived from wxPanel, and (usually) lives
    inside a frame instantiated by a FigureManagerWx. The parent window
    probably implements a wx.Sizer to control the displayed control size - but
    we give a hint as to our preferred minimum size.
    r   c                 C   s   t S r$   )FigureManagerWx)clsr    r    r!   <lambda>  s    z_FigureCanvasWxBase.<lambda>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   sf  t | | tjttj| jjj	 }tj
dkr||}tjj| |||d d| _d| _d| _tddtj| _tddtj| _| tj| j | tj| j | tj| j | tj| j | tj| j | tj | j | tj!| j | tj"| j | tj#| j | tj$| j | tj%| j | tj&| j | tj'| j | tj(| j | tj)| j | tj*| j | tj+| j | tj,| j | tj-| j | tj.| j/ | tj0| j1 | tj2| j3 | tj4| j5 | tj6| j7 | tj8| j7 | 9tj: | ;tj< tj
dkr1| = }| >| ? d|   | @| dS dS )	z
        Initialize a FigureWx instance.

        - Initialize the FigureCanvasBase and wxPanel parents.
        - Set event handlers for resize, paint, and keyboard and mouse
          interaction.
        	__WXMSW__r   NFro   r   WHITE	__WXMAC__)Ar   r*   r   Sizemapr   ceilfigurer   r   PlatformFromDIPPanelre   _isDrawn_rubberband_rectr   PENSTYLE_SHORT_DASH_rubberband_pen_blackPENSTYLE_SOLID_rubberband_pen_whiteBindEVT_SIZE_on_size	EVT_PAINT	_on_paintEVT_CHAR_HOOK_on_key_down
EVT_KEY_UP
_on_key_upEVT_LEFT_DOWN_on_mouse_button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_on_mouse_wheel
EVT_MOTION
_on_motionEVT_ENTER_WINDOW	_on_enterEVT_LEAVE_WINDOW	_on_leaveEVT_MOUSE_CAPTURE_CHANGED_on_capture_lostEVT_MOUSE_CAPTURE_LOSTSetBackgroundStyleBG_STYLE_PAINTSetBackgroundColourrM  GetDPIScaleFactorSetInitialSizeGetSize_set_device_pixel_ratio)r,   parentidrR  r   dpiScaler    r    r!   r*     sT   	

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	SetBitmapre   TheClipboardIsOpenedOpenSetDataFlushClose)r,   eventbmp_objopen_successr    r    r!   Copy_to_Clipboard  s   


z%_FigureCanvasWxBase.Copy_to_Clipboardc                 O   s   |  |  r|   d S d S r$   )r  r  drawr+   r    r    r!   _update_device_pixel_ratio  s   z._FigureCanvasWxBase._update_device_pixel_ratioc                 C   s&   t dt|  d| _| jdd d S )Nz%s - draw_idle()FeraseBackground)r^   r_   r`   rV  Refreshr4   r    r    r!   	draw_idle  s   z_FigureCanvasWxBase.draw_idlec                 C   s   t   d S r$   )r   Yieldr4   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   r%   ID_ANYr1   r   r\  	EVT_TIMERstop_event_loopGetIdGUIEventLoopr  Runr6   )r,   timeouttimerr    r    r!   start_event_loop+  s   


z$_FigureCanvasWxBase.start_event_loopc                 C   s*   t | dr| j r| j  | `d S d S )Nr  )r  r  r9   Exitr,   r  r    r    r!   r  8  s
   


z#_FigureCanvasWxBase.stop_event_loopc                 C   s   |   }|  }t| }g }g }d}t|D ],\}\}}	ddd |	D }
||	d  | d|
 d|
 }||	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  H  s    z@_FigureCanvasWxBase._get_imagesave_wildcards.<locals>.<listcomp>z (z)||)get_default_filetypeget_supported_filetypes_groupedsorteditems	enumeratejoinappend)r,   default_filetype	filetypessorted_filetypes	wildcards
extensionsfilter_indexirB   extsext_listwildcardr    r    r!   _get_imagesave_wildcards?  s   

z,_FigureCanvasWxBase._get_imagesave_wildcardsc                 C   s   t dt|  | r|  sdS |st| }tjdkr,t| jj	
 tr,| j  n| j}||dd | jdurktt| j\}}}}||||f||||f||||f||||fg}||| j ||| j dS dS )zu
        Update the displayed image on the GUI canvas, using the supplied
        wx.PaintDC device context.
        z%s - gui_repaint()NrK  r   )r^   r_   r`   IsShownOnScreenr   ClientDCrS  
isinstancerR  canvasget_rendererrG   re   ConvertToImageConvertToBitmapr   rW  rP  r   DrawLineListr[  rY  )r,   drawDCbmpx0y0x1y1rectr    r    r!   gui_repaintQ  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                 C   sF   t dt|  t| }| js| j|d n| j|d |  dS )z$Called when wxPaintEvt is generated.z%s - _on_paint()r  N)	r^   r_   r`   r   PaintDCrV  r  r  Destroy)r,   r  r  r    r    r!   r`  x  s   
z_FigureCanvasWxBase._on_paintc           	      C   s$  |    tdt|  |   }|r|| }|r+|r+|js+|jt	j
@ s+|  }n|  }||   t| ddrF|| j| jfkrFdS |\| _| _d| _| jdksY| jdkr[dS | jj}t	jdksl|  }|| }| j| }| j| }| jj||dd | jdd td	|   |   dS )
z
        Called when wxEventSize is generated.

        In this application we attempt to resize to fit the window, so it
        is better to take the performance hit and redraw the whole window.
        z%s - _on_size()_widthNFr   rK  )forwardr  resize_event)r  r^   r_   r`   	GetParentGetSizerGetItem
ProportionFlagr   EXPAND
GetMinSizeGetClientSizeIncTogetattrr  _heightrV  rR  rg   rS  r  set_size_inchesr  r   _processr  )	r,   r  szsir   dpivalr   winchhinchr    r    r!   r^    s4   




z_FigureCanvasWxBase._on_sizec                  C   sV   t  } tj|  ftj|  ftj|  ftj	| 
 ftj|  fg}dd |D S )Nc                 S   s   h | ]\}}|r|qS r    r    )r  buttonflagr    r    r!   	<setcomp>  r  z3_FigureCanvasWxBase._mpl_buttons.<locals>.<setcomp>)r   GetMouseStater   LEFT
LeftIsDownRIGHTRightIsDownMIDDLEMiddleIsDownBACK
Aux1IsDownFORWARD
Aux2IsDown)state	mod_tabler    r    r!   _mpl_buttons  s   z _FigureCanvasWxBase._mpl_buttonsexcludec                   sZ   dt jt jfdt jt jfdt jt jfg}| d ur&|   fdd|D S dd |D S )Nctrlr  r  c                    s&   g | ]\}}}|@ r |kr|qS r    r    r  rB   modr   r  	modifiersr    r!   r    s    z6_FigureCanvasWxBase._mpl_modifiers.<locals>.<listcomp>c                 S   s    g | ]\}}}t |r|qS r    )r   GetKeyStater  r    r    r!   r    s    
)r   MOD_CONTROLWXK_CONTROLMOD_ALTWXK_ALT	MOD_SHIFT	WXK_SHIFTGetModifiers)r  r  r  r    r
  r!   _mpl_modifiers  s   z"_FigureCanvasWxBase._mpl_modifiersc                 C   s|   |j }|| jv r| j| }n|dk rt|}| s| }nd S | j||d}d|v r5| r5|d dg ||S )N   r  r  rF  )	KeyCodekeyvaldchr	ShiftDownlowerr  isupperremover  )r,   r  keyvalr   modsr    r    r!   _get_key  s   

z_FigureCanvasWxBase._get_keyc                 C   sr   |du rt  }| |j|j\}}n|j|j}}t jdks0|  }|| | jjj	||  fS || jjj	| fS )zv
        Convert a wx position, defaulting to the current cursor position, to
        Matplotlib coordinates.
        NrK  )
r   r  ScreenToClientXYrS  r  rR  r   rd   )r,   posr   r   r   r    r    r!   _mpl_coords  s   
z_FigureCanvasWxBase._mpl_coordsc                 C   <   t d| | |g|  R d|i  | r|  dS dS )zCapture key press.key_press_eventguiEventNr   r  r$  r  Skipr  r    r    r!   rb       z _FigureCanvasWxBase._on_key_downc                 C   r%  )zRelease key.key_release_eventr'  Nr(  r  r    r    r!   rd    r*  z_FigureCanvasWxBase._on_key_upc                 C   sb   t tjtjt jtjt jtjt j	tj
t jtjt jtjt jtjt ji|d}| | |   d S )N)cursor)r   Cursorr   check_getitemr   MOVECURSOR_HANDHANDPOINTERCURSOR_ARROWSELECT_REGIONCURSOR_CROSSWAITCURSOR_WAITRESIZE_HORIZONTALCURSOR_SIZEWERESIZE_VERTICALCURSOR_SIZENS	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)rB  r  r    r    r!   r~    s   z$_FigureCanvasWxBase._on_capture_lostc              
   C   s   |   | | p|  | |\}}tjtjtj	tj
tjtjtjtjtjtji}| }|||}| |}| rNtd| |||||d  dS | rbtd| |||d||d  dS | rutd| |||||d  dS dS )Start measuring on an axis.button_press_eventr  r'  T)dblclickr  r'  button_release_eventN)r)  rB  
ButtonDownButtonDClickr$  r   MOUSE_BTN_LEFTr   r  MOUSE_BTN_MIDDLEr  MOUSE_BTN_RIGHTr  MOUSE_BTN_AUX1r  MOUSE_BTN_AUX2r   	GetButtonr   r  r   r  ButtonUp)r,   r  r   r   
button_mapr  r  r    r    r!   rf    s8   



z$_FigureCanvasWxBase._on_mouse_buttonc              	   C   s~   |  |\}}|j|j |j }|  tjdkr-t| ds"d| _n| jr*d| _dS d| _t	d| |||| 
||d  dS )z3Translate mouse wheel events into matplotlib eventsrN  _skipwheeleventTFNscroll_event)stepr  r'  )r$  LinesPerActionWheelRotation
WheelDeltar)  r   rS  r  rR  r   r  r  )r,   r  r   r   rT  r    r    r!   rv  3  s   


z#_FigureCanvasWxBase._on_mouse_wheelc                 C   s<   |   td| g| |R |  | ||d  dS )rC  motion_notify_event)buttonsr  r'  N)r)  r   r$  r  r  r  r  r    r    r!   rx  G  s   
z_FigureCanvasWxBase._on_motionc                 C   4   |   td| g| |R |  |d  dS )zMouse has entered the window.figure_enter_eventrE  Nr)  r   r$  r  r  r  r    r    r!   rz  P     
z_FigureCanvasWxBase._on_enterc                 C   rZ  )zMouse has left the window.figure_leave_eventrE  Nr\  r  r    r    r!   r|  X  r]  z_FigureCanvasWxBase._on_leaver$   )r   T)ar;   r<   r=   r>   required_interactive_frameworkr#   
_timer_clsr   classpropertymanager_classr   r  r  r  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  r*   r  r  r  r  r  r  r  r  r   r  r`  r^  r   r  r  r  r$  rb  rd  r=  rB  r~  rf  rv  rx  rz  r|  r    r    r    r!   r    s4   		
 !"#$%&'()*+,-./01234
<
9	



.


	r  c                   @   sz   e Zd ZdddZdd ZeeejZ	eeej
 ZZeeejZeeejZeeej ZZeeejZdS )FigureCanvasWxNc                 C   sF   t dt|  t| j| jj| _| j| j d| _	| j
|d dS )z
        Render the figure using RendererWx instance renderer, or using a
        previously defined renderer if none is specified.
        z%s - draw()Tr  N)r^   r_   r`   rG   re   rR  rg   r   r  rV  r  )r,   r  r    r    r!   r  d  s
   zFigureCanvasWx.drawc                 C   s   t t| jjjt| jjj}| jt	|| jj
 t|r&| n|}|||s5td| | jr<|   | rD|   d S d S )NzCould not save figure to )r   r   r   rQ  rR  r   rb   rd   r  rG   rg   r   is_writable_file_liker  SaveFiler  rV  r  )r,   filetypefilenamere   	saved_objr    r    r!   _print_imageo  s   
zFigureCanvasWx._print_imager$   )r;   r<   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  a  s*    
r  c                       s$   e Zd Z fddZ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	|  || d|| _
t| j
|| }| j
jj}|d ur@| | ttj|jj\}}| j
| t || | j
| t dd | j
  |   | t j| j d S )NrK     )r  r  r#  r]   r}   )r   rS  DefaultPositionPointr)   r*   r^   r_   r`   _set_frame_iconr  r  managertoolbar
SetToolBarrP  r   rQ  r   r   r  rT  rO  
SetMinSizeSetFocusFitr\  	EVT_CLOSE	_on_close)	r,   numfigcanvas_classr#  r  r  ru   rv   r/   r    r!   r*     s"   



zFigureFrameWx.__init__c                 C   sx   t dt|  td| j  | j  d | jj_t	
| jj z| j| jjj W n	 ty5   Y nw |  d S )Nz%s - on_close()close_event)r^   r_   r`   r   r  r  r  r  framer   destroympl_disconnectr  _id_dragAttributeErrorr)  r  r    r    r!   r    s   

zFigureFrameWx._on_close)r;   r<   r=   r*   r  r?   r    r    r/   r!   r    s    r  c                       sh   e Zd ZdZ fddZedd Zedd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Z  ZS )r  a  
    Container/controller for the FigureCanvas and GUI frame.

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

    Attributes
    ----------
    canvas : `FigureCanvas`
        a FigureCanvasWx(wx.Panel) instance
    window : wxFrame
        a wxFrame instance - wxpython.org/Phoenix/docs/html/Frame.html
    c                    s.   t dt|  | | _| _t || d S )Nr]   )r^   r_   r`   r  windowr)   r*   )r,   r  r  r  r/   r    r!   r*     s   zFigureManagerWx.__init__c                 C   sD   t  pt }t|||d}|jj}t r |j	  |j
  |S )N)r  )r   GetAppr"   r  r  r  mplis_interactiver  Showr  )r  r  rR  r  r   r  r  r    r    r!   create_with_canvas  s   

z"FigureManagerWx.create_with_canvasc                 C   s.   t j st  }|d ur|  d S d S d S r$   )r   r   IsMainLoopRunningr  MainLoop)r  r   r    r    r!   start_main_loop  s   
zFigureManagerWx.start_main_loopc                 C   s0   | j   | j  tjd r| j   d S d S )Nzfigure.raise_window)r  r  r  r  r  rcParamsRaiser4   r    r    r!   show  s
   


zFigureManagerWx.showc                 G   s.   t dt|  | j}|rt|j d S d S )Nz%s - destroy())r^   r_   r`   r  r   	CallAfterr  )r,   r-   r  r    r    r!   r    s
   zFigureManagerWx.destroyc                 C   s   | j | j    d S r$   )r  ShowFullScreenIsFullScreenr4   r    r    r!   full_screen_toggle  s   z"FigureManagerWx.full_screen_togglec                 C   s
   | j  S r$   )r  GetTitler4   r    r    r!   get_window_title  s   
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   s,   | j | j tt|t| d S r$   )r  SetSizeClientToWindowSizer   rO  r   rQ  )r,   rb   rd   r    r    r!   resize  s   zFigureManagerWx.resize)r;   r<   r=   r>   r*   classmethodr  r  r  r  r  r  r  r  r?   r    r    r/   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  bundleimageiconr    r    r!   r    s   r  c                       sv   e Zd ZdejdddZedd Zdd Z fd	d
Z	 fddZ
dd Zdd Zdd Zdd Zdd Z  ZS )NavigationToolbar2WxTr   c             	   C   s  t jj| | d|d t jdkr| |  |    i | _| j	D ]<\}}}}|d u r1| 
  q"| jd| | dt j|||dv rFt jnt jdj| j|< | jt jt| || j| d q"|| _| jrx|   t j| t jd| _| | j |   t| | d S )Nr  r  rN  .svg)PanZoom)re   bmpDisabledlabel	shortHelpkindr  )r   ToolBarr*   r  rS  SetToolBitmapSizeGetToolBitmapSizer  wx_ids	toolitemsAddSeparatorAddTool_iconr   
ITEM_CHECKITEM_NORMALIdr\  EVT_TOOLr  _coordinatesAddStretchableSpace
StaticTextALIGN_RIGHT_label_text
AddControlRealizer   )r,   r  coordinatesr   texttooltip_text
image_filecallbackr    r    r!   r*     s8   
	zNavigationToolbar2Wx.__init__c                 C   sj  z	t j  }W n? tyH   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 td| }|jdkro| }|r`|dd	}t  t j}t j||S tj|}	t|	d
}
|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.
        gA`"?gbX9?gv/?r  g?r  r  s   fill:black;s   fill:white;RGBA.Nr|   r   r  )axisr   )#r   SystemSettingsGetAppearanceIsDarkr  	GetColourSYS_COLOUR_WINDOWSYS_COLOUR_WINDOWTEXTredgreenbluer   r  suffix
read_bytesreplaceArtProviderGetDIPSizeHintART_TOOLBARBitmapBundleFromSVGPILImageopennparrayconvertallRedGreenBluer   r   r   r   )rB   darkbgr   bg_lumfg_lumr   svgtoolbarIconSizepilimgr  
black_maskr    r    r!   r  >  s2   ""	
"zNavigationToolbar2Wx._iconc                 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moderB   r4   r    r    r!   _update_buttons_checkedb  s
   

z,NavigationToolbar2Wx._update_buttons_checkedc                       t  j|  |   d S r$   )r)   zoomr8  r,   r-   r/   r    r!   r:  h     zNavigationToolbar2Wx.zoomc                    r9  r$   )r)   panr8  r;  r/   r    r!   r=  l  r<  zNavigationToolbar2Wx.panc              
   G   sF  | 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||d |W S  ty }
 ztj| j  t|
dd}|  |  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)formatzMatplotlib error)r  messagecaption)r  r  get_default_filenamer   
FileDialogr  r  r  FD_SAVEFD_OVERWRITE_PROMPTSetFilterIndex	ShowModalID_OKpathlibr   GetPathr^   r_   r`   GetFilterIndexr  get_supported_filetypeswarningr  r  rR  savefig	ExceptionMessageDialogr  )r,   r-   r  r  r  default_filedialogr   fmtr  er    r    r!   save_figurep  sB   




z NavigationToolbar2Wx.save_figurec                 C   sZ   | j jjj}tjdkrdn| j  }|| || | || || | f| j _| j   d S )NrK  r   )	r  rR  r   rd   r   rS  r  rW  r  )r,   r  r  r  r  r  rd   sfr    r    r!   draw_rubberband  s   z$NavigationToolbar2Wx.draw_rubberbandc                 C   s   d | j _| j   d S r$   )r  rW  r  r4   r    r    r!   remove_rubberband  s   z&NavigationToolbar2Wx.remove_rubberbandc                 C   s   | j r| j| d S d S r$   )r  r  SetLabelr,   rq   r    r    r!   set_message  s   z NavigationToolbar2Wx.set_messagec                 C   sb   | j jdk}| j jt| j d k }d| jv r| | jd | d| jv r/| | jd | d S d S )Nr   r   BackForward)
_nav_stack_poslenr  
EnableTool)r,   can_backwardcan_forwardr    r    r!   set_history_buttons  s   

z(NavigationToolbar2Wx.set_history_buttonsr_  )r;   r<   r=   r   	TB_BOTTOMr*   r   r  r8  r:  r=  rT  rV  rW  rZ  rc  r?   r    r    r/   r!   r    s     
#"r  c                   @   sH   e Zd ZdZdejfddZdd Zdd Zd	d
 Z	dd Z
dd ZdS )	ToolbarWxr  Nc                 C   sj   |d u r	|j  }t| | tjj| |d|d |  | _tj| tj	d| _
| | j
 i | _i | _d S )Nr  r  )r  r  r
   r*   r   r  r  _spacer  r  r  r  
_toolitems_groups)r,   toolmanagerr  r   r    r    r!   r*     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                 3   s"    | ]}  |kr|V  qd S r$   )GetToolByPos)r  r#  r,   toolr    r!   	<genexpr>  s    z*ToolbarWx._get_tool_pos.<locals>.<genexpr>)range
ToolsCount)r,   rl  r#  r    rk  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   
   rL  r  c                    s      d S r$   )trigger_tool)r  rB   r,   r    r!   handler  r8   z'ToolbarWx.add_toolitem.<locals>.handler)rh  InsertSeparatorrp  rf  rP  rj  rn  ro  indexr  r  r   r   r  
InsertToolr   GetTextExtentToggleButtonButtonInsertControlr	  r\  r  re  rg  
setdefaultr  )r,   rB   grouppositionr  descriptiontogglesepsepsstartidxr  r  rl  r   r  ry  r    rx  r!   add_toolitem  s<   




zToolbarWx.add_toolitemc                 C   sT   || j vrd S | j | D ]\}}| s| |j| q| | q|   d S r$   )rg  	IsControlr6  r  
GetControlSetValuer  )r,   rB   toggledrl  ry  r    r    r!   toggle_toolitem  s   
zToolbarWx.toggle_toolitemc                 C   s(   | j |g D ]
\}}| |j qd S r$   )rg  pop
DeleteToolr  )r,   rB   rl  ry  r    r    r!   remove_toolitem  s   zToolbarWx.remove_toolitemc                 C   r  r$   )r  rX  rY  r    r    r!   rZ     s   zToolbarWx.set_message)r;   r<   r=   _icon_extensionr   rd  r*   rp  r  r  r  rZ  r    r    r    r!   re    s    -
re  c                   @      e Zd Zdd ZdS )ConfigureSubplotsWxc                 G   s   t |  d S r$   )r  configure_subplotsr;  r    r    r!   trigger  r8   zConfigureSubplotsWx.triggerNr;   r<   r=   r  r    r    r    r!   r        r  c                   @   r  )SaveFigureWxc                 G      t |   d S r$   )r  rT  "_make_classic_style_pseudo_toolbarr;  r    r    r!   r       zSaveFigureWx.triggerNr  r    r    r    r!   r  
  r  r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandWxc                 C   s   t |  d |||| d S r$   )r  rV  r  )r,   r  r  r  r  r    r    r!   rV    s   zRubberbandWx.draw_rubberbandc                 C   r  r$   )r  rW  r  r4   r    r    r!   rW    r  zRubberbandWx.remove_rubberbandN)r;   r<   r=   rV  rW  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)rH      rJ   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|         rv  )r)   r*   r   DEFAULT_DIALOG_STYLERESIZE_BORDERBoxSizerVERTICALFlexGridSizerGetFontMakeBoldr  headerszipwidthsr  rn   WrapAddALLr  rG  ALIGN_CENTER_HORIZONTALSetSizerr  Layoutr\  r  r  
EVT_BUTTON)r,   r  help_entriessizer
grid_sizerrP   rrowcolrb   r  okr/   r    r!   r*   !  s,   





z_HelpDialog.__init__c                 C   s   d t _|   |  d S r$   )r  	_instanceDestroyLaterr)  r  r    r    r!   r  :  s   z_HelpDialog._on_closec                 C   s.   | j r
| j   d S | ||| _ | j   d S r$   )r  r  r  )r  r  r  r    r    r!   r  ?  s
   
z_HelpDialog.show)r;   r<   r=   r  r  r  r*   r  r  r  r?   r    r    r/   r!   r    s    r  c                   @   r  )HelpWxc                 G   s   t | jj |   d S r$   )r  r  rR  r  GetTopLevelParent_get_help_entriesr;  r    r    r!   r  K  s   zHelpWx.triggerNr  r    r    r    r!   r  I  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  rV  r  re   r  r   r  r  r  r  r  r+   r    r    r!   r  R  s   
zToolCopyToClipboardWx.triggerNr  r    r    r    r!   r  P  r  r  c                   @   s   e Zd ZeZeZejZdS )
_BackendWxN)	r;   r<   r=   r  FigureCanvasr  FigureManagerr  mainloopr    r    r    r!   r  a  s    
r  )Or>   r  loggingr   rH  r   r  numpyr%  	PIL.Imager"  
matplotlibr  matplotlib.backend_basesr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   matplotlib._pylab_helpersr   matplotlib.pathr   matplotlib.transformsr   r   wx.svg	getLoggerr;   r^   r   	lru_cacher"   r#   
deprecatedrG   r   rU  r  r  Framer  r  r  r  r  r  re  _register_tool_classConfigureSubplotsBaser  SaveFigureBaser  RubberbandBaser  Dialogr  ToolHelpBaser  ToolCopyToClipboardBaser  _toolbar2_class_toolmanager_toolbar_classexportr  r    r    r    r!   <module>   sr    	D

	 Pm   [01I
 X
-