rL indZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddl mZmZmZm Z ddl!m"Z"ddl#m$Z$ddl%m&Z&ddl'Z'ddl(Z'ejRe*Z+dZ,ejZd d Z.Gd d eZ/ej`d dddddGddeZ1GddeZ2Gddee'jfZ4Gdde4Z5Gdde'jlZ7GddeZ8d Z9d!Z:Gd"d#ee'jvZ<Gd$d%ee'jvZ=ej|e4Gd&d'ej~Z@ej|e4Gd(d)ejZBej|e4Gd*d+ejZDGd,d-e'jZFej|e4Gd.d/ejZHej|e4Gd0d1ejZJes $..$,,7r$c8|jjyr()r*Stopr7s r" _timer_stopzTimerWx._timer_stopAs r$cZ|jjr|jyyr()r* IsRunningr8r7s r"_timer_set_intervalzTimerWx._timer_set_intervalDs# ;; "     #r$) __name__ __module__ __qualname____doc__r.r8r;r> __classcell__r2s@r"r&r&6s9* 8 r$r&z2.0rbackendz the futurewxaggz7See the Matplotlib usage FAQ for more info on backends.)nameobj_typeremoval alternativeaddendumc4eZdZdZidej dej dej dej dej dej dejd ejd ejd ej d ej d ej dej dej dejdejdejdejiZejejejdZ ejejejej ej"ej"ej"dZfdZdZdZdZdZedZd"dZdZd#dZdZd Zd!ZxZ 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,iiiXii i ultralightlightnormalmediumsemiboldboldheavy ultraboldblack)italicrSoblique)SansRomanScript DecorativeModernCouriercourierct|tjdt ||j |_|j|_||_ i|_ ||_ d|_ y)z)Initialise a wxWindows renderer instance.%s - __init__()N) r-r._logdebugtypeGetWidthwidth GetHeightheightbitmapfontddpigc)r/rlrnr2s r"r.zRendererWx.__init__s[  $d4j1__& &&(   r$cy)NTr7s r"flipyzRendererWx.flipysr$c4|rtj|}|j|j}n |j}|j}|j ||}|j |tj|j|\}}} } ||| fSr() r strip_mathronew_gcgfx_ctx get_wx_fontSetFontrBLACKGetFullTextExtent) r/spropismathrorvfontwhdescentleadings r"get_text_width_height_descentz(RendererWx.get_text_width_height_descents   #A 77?BB**4(bhh'!(!:!:1!=1gw!W}r$c2|j|jfSr()rirkr7s r"get_canvas_width_heightz"RendererWx.get_canvas_width_heightszz4;;&&r$c|j}| |j}|j}|j|k7rN||_||j y|j |d|j |dz |dz |d|dyy)Nrr)get_clip_rectangleboundsrv _lastcliprect ResetClipCliprk)r/ro new_boundsrvs r"handle_clip_rectanglez RendererWx.handle_clip_rectangles**,  !#**J**  J .$.G !!!!# Z]![[:a=8:a=H']JqM; /r$c|j}|j|D]\}}|tjk(r|j|)|tj k(r|j |L|tjk(r|j|o|tjk(r|j||tjk(s|j|Sr() CreatePath iter_segmentsrMOVETO MoveToPointLINETOAddLineToPointCURVE3AddQuadCurveToPointCURVE4AddCurveToPoint CLOSEPOLY CloseSubpath)rvpath transformwxpathpointscodes r" convert_pathzRendererWx.convert_paths##% ..y9 &LFDt{{""""F+$%%%v.$***F3$&&&/'##% & r$c|j|j||j}|tj ddj d|j z}|j|||}|E|jtj|j||j|n|j||jy)Ng?g)selectrrvrscale translaterkrSetBrushrBrush get_wxcolourDrawPath StrokePathunselect)r/rorrrgbFacervrs r" draw_pathzRendererWx.draw_paths  ""2&** J  S$ ' 1 1#t{{ CD ""7D)<     RXXboog&>? @   V $   v & r$c |j}||j\}}}} nd}d}|j}|j} |jdd\} } t j j| | |j} |j|jj| t|t|j|z t|t| |jy)Nrr)rrrirkshaperBitmapFromBufferRGBAtobytesrrv DrawBitmapintr) r/roxyimbboxlbrrrowscolsrls r" draw_imagezRendererWx.draw_images$$&  JAq!QAA A AXXbq\ d))$bjjlC  fc!fc$++/.B!!fc1"g / r$c |rtj|}tjdt ||j |j ||j} |j||} |j|j} | j| | |j|||\} } }t|}t|| z }|dk(r| j|||n_tj |}| tj"|z}| tj$|z}| j'|||z ||z ||j)y)Nz%s - draw_text()r)rrtrerfrgrrrvrwrget_rgbrxrrDrawTextmathradianssincosDrawRotatedTextr)r/rorrr{r|angler}mtextrvr~colorrrdradsxoyos r" draw_textzRendererWx.draw_texts   #A %tDz2  ""2&**4( -e$44QfE1a F AJ C<   Q1 %<<&DTXXd^#BTXXd^#B  # #Aq2vq2vt < r$ctjdt|t|j||_|j j |j j|j S)Nz %s - new_gc())rerfrgGraphicsContextWxrlrorrr7s r"ruzRendererWx.new_gcsM ?DJ/#DKK6  wwr$ctjdt|t|}|jj |}||S|j |j}tjt||jj |jtj|j|j|j |j#x|j|<}|S)z7Return a wx font. Cache font instances for efficiency.z%s - get_wx_font()) pointSizefamilystyleweight)rerfrghashrmgetpoints_to_pixelsget_size_in_pointsrFontround fontnamesget_nameROMAN fontangles get_style fontweights get_weight)r/r{r|keyr~sizes r"rwzRendererWx.get_wx_fonts 'd44jzz~~c"  K$$T%<%<%>?"$Dk>>%%dmmorxx@//$.."23##DOO$56 "8 8 3$  r$c:|tdz |jzdz zS)NgR@)PIXELS_PER_INCHrn)r/rs r"rzRendererWx.points_to_pixelss 4/$((:TABBr$r()FN)!r?r@rArBrFONTWEIGHT_LIGHTFONTWEIGHT_NORMALFONTWEIGHT_BOLDrFONTSTYLE_ITALICFONTSTYLE_NORMALFONTSTYLE_SLANTrFONTFAMILY_SWISSFONTFAMILY_ROMANFONTFAMILY_SCRIPTFONTFAMILY_DECORATIVEFONTFAMILY_MODERNrr.rrrrr staticmethodrrrrrurwrrCrDs@r"rMrMIs  R  R  R  R ! !  R ! !  R ! !  R   R   R   b)) $$ "&& "&& B(( "" ##!" R''#$ ##%K*%%%%%%J##$$&&..&&''''I "' ;    8"Cr$rMceZdZdZej ej ejdZejejejdZ e jZfdZdZdZd fd ZfdZfd Zfd Zd ZxZS) ra< 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)bevelmiterrct|tjdt |||j j |d\}}|Ltj|}tjj|}d|_ ||f|j |<||_ ||_ ||_tjddtj |_|j%|j"||_y)Nz%s - __init__(): %s)NNryr)r-r.rerfrg_cacherrMemoryDCGraphicsContextCreaterrldcrvPenSOLID_penSetPenrenderer)r/rlrrrvr2s r"r.zGraphicsContextWx.__init__4s  ($t*f=kkoofl; G :V$B((//3G$(G !"$g+DKK   FF7Arxx0 tyy!  r$ctjdk(r-|jj|jd|_yy)z2Select the current bitmap into this wxDC instance.win32TN)sysplatformr SelectObjectrl IsSelectedr7s r"rzGraphicsContextWx.selectGs0 <<7 " GG  -"DO #r$ctjdk(r1|jjtj d|_yy)z-Select a Null bitmap into this wxDC instance.rFN)rrrrr NullBitmapr r7s r"rzGraphicsContextWx.unselectMs0 <<7 " GG  /#DO #r$c^tjdt||jt||||j j|j|j|jj|j |jy)Nz%s - set_foreground()) rerfrgrr-set_foregroundr SetColourrrrvrr)r/fgisRGBAr2s r"r z GraphicsContextWx.set_foregroundSsr *DJ7  r6* D--dlln=> DII& r$ct|}tjdt||j d|cxkrdkrnnd}t ||t|jj|j}|dk(rd}|jj||jj|j|jy)Nz%s - set_linewidth()rr)floatrerfrgrr- set_linewidthrrr _linewidthrSetWidthrvrr)r/rlwr2s r"rzGraphicsContextWx.set_linewidthbs !H )4:6 q919A a //@ A 7B 2 DII& r$cXtjdt||jt|||j jtj|j|jj|j |jy)Nz%s - set_capstyle())rerfrgrr- set_capstylerSetCapr_capd _capstylervrr)r/csr2s r"rzGraphicsContextWx.set_capstyleqsm ($t*5  R  *00@A DII& r$cXtjdt||jt|||j jtj|j|jj|j |jy)Nz%s - set_joinstyle())rerfrgrr- set_joinstylerSetJoinr_joind _joinstylervrr)r/jsr2s r"rzGraphicsContextWx.set_joinstylezsm )4:6  b! +224??CD DII& r$c tjdt|tj|Dcgc]}t d|zc}Scc}w)z'Convert an RGB(A) color to a wx.Colour.z%s - get_wx_color())rerfrgrColourr)r/rrs r"rzGraphicsContextWx.get_wxcolours: ($t*5yy7A3sQw<7887sA r()r?r@rArBrCAP_BUTTCAP_PROJECTING CAP_ROUNDr JOIN_BEVEL JOIN_MITER JOIN_ROUNDr weakrefWeakKeyDictionaryrr.rrr rrrrrCrDs@r"rrs [[,,ll $E}}}}}}&F'W & & (F!&# $  9r$rc eZdZdZdZeZejdZ ie jde jde jde jde jde j d e j"d e j$d e j&d e j(d e j*de j,de j.de j0de j2de j4de j6die j8de j:de j<de j>de j@de jBde jDde jFde jHde jJde jLde jNd e jPd!e jRd"e jTd#e jVd$e jXd%ie jZd&e j\d'e j^d(e j`d)e jbd*e jdd+e jfd,e jhd-e jjd.e jld/e jnd0e jpd1e jrde jtd e jvd e jxd e jzde j|d!e j~d"e jde jd e jde jdiZDdTd3ZEdTd4ZFd5ZGd6ZHd7ZIdUd8ZJdTd9ZKd:ZLdTd;ZMieNjdd?d@d@dAdBZOdCZPdDZQeRdEZSeRdTd2dFdGZTdHZUdTdIZVdJZWdKZXdLZYdVdMZZdNZ[dOZ\dPZ]dQZ^dRZ_dSZ`y2)W_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. rctSr()FigureManagerWx)clss r"z_FigureCanvasWxBase.s?r$controlshiftalt caps_lockleftuprightdownescapef1f2f3f4f5f6f7f8f9f10f11f12 scroll_lockbreak backspaceenterinsertdeletehomeendpageuppagedown0123456789+-*/decNc tj||tjt t j |jjj}tjdk7r|j|}tjj||||d|_ d|_d|_tj ddtj"|_tj ddtj&|_|j+tj,|j.|j+tj0|j2|j+tj4|j6|j+tj8|j:|j+tj<|j>|j+tj@|j>|j+tjB|j>|j+tjD|j>|j+tjF|j>|j+tjH|j>|j+tjJ|j>|j+tjL|j>|j+tjN|j>|j+tjP|j>|j+tjR|j>|j+tjT|j>|j+tjV|j>|j+tjX|j>|j+tjZ|j>|j+tj\|j^|j+tj`|jb|j+tjd|jf|j+tjh|jj|j+tjl|jn|j+tjp|jn|jstjt|jwtjxtjdk(rG|j{}|j}|jd|z z|j|yy) z Initialize a FigureWx instance. - Initialize the FigureCanvasBase and wxPanel parents. - Set event handlers for resize, paint, and keyboard and mouse interaction. __WXMSW__rNFryrWHITE __WXMAC__)Arr.rSizemaprceilfigurerrPlatformFromDIPPanelrl_isDrawn_rubberband_rectrPENSTYLE_SHORT_DASH_rubberband_pen_blackPENSTYLE_SOLID_rubberband_pen_whiteBindEVT_SIZE_on_size EVT_PAINT _on_paint EVT_CHAR_HOOK _on_key_down EVT_KEY_UP _on_key_up EVT_LEFT_DOWN_on_mouse_buttonEVT_LEFT_DCLICK EVT_LEFT_UPEVT_MIDDLE_DOWNEVT_MIDDLE_DCLICK EVT_MIDDLE_UPEVT_RIGHT_DOWNEVT_RIGHT_DCLICK EVT_RIGHT_UPEVT_MOUSE_AUX1_DOWNEVT_MOUSE_AUX1_UPEVT_MOUSE_AUX2_DOWNEVT_MOUSE_AUX2_UPEVT_MOUSE_AUX1_DCLICKEVT_MOUSE_AUX2_DCLICKEVT_MOUSEWHEEL_on_mouse_wheel EVT_MOTION _on_motionEVT_ENTER_WINDOW _on_enterEVT_LEAVE_WINDOW _on_leaveEVT_MOUSE_CAPTURE_CHANGED_on_capture_lostEVT_MOUSE_CAPTURE_LOSTSetBackgroundStyleBG_STYLE_PAINTSetBackgroundColourreGetDPIScaleFactorSetInitialSizeGetSize_set_device_pixel_ratio)r/parentidrjrdpiScales r"r.z_FigureCanvasWxBase.__init__s !!$/wwDIIt{{'7'7'<'<=> ;;+ %>>$'D $6  $%'VVGQ8N8N%O"%'VVGQ8I8I%J" "++t}}- ",,/ """D$5$56 "--1 """D$9$9: "$$d&;&;< "..$"7"78 "$$d&;&;< "&&(=(=> """D$9$9: "##T%:%:; "%%t'<'<= "//4#8#89 "(($*?*?@ "&&(=(=> "(($*?*?@ "&&(=(=> "**D,A,AB "**D,A,AB "##T%9%9: "--1 "%%t~~6 "%%t~~6 "..0E0EF "++T-B-BC  1 12   * ;;+ %--/H    ( ; <  ( ( 2 &r$ctj}|j|jtjj s}tjj }|r\tjj|tjjtjjyyy)z*Copy bitmap of canvas to system clipboard.N) rBitmapDataObject SetBitmaprl TheClipboardIsOpenedOpenSetDataFlushClose)r/eventbmp_obj open_successs r"Copy_to_Clipboardz%_FigureCanvasWxBase.Copy_to_Clipboard s%%'$++&'')??//1L''0%%'%%'*r$cd|j|jr|jyyr()rrdrawr/r0r1s r"_update_device_pixel_ratioz._FigureCanvasWxBase._update_device_pixel_ratios*  ' '(>(>(@ A IIK Br$cttjdt|d|_|j dy)Nz%s - draw_idle()FeraseBackground)rerfrgrnRefreshr7s r" draw_idlez_FigureCanvasWxBase.draw_idles, %tDz2  U +r$c,tjyr()rYieldr7s r" flush_eventsz _FigureCanvasWxBase.flush_events's   r$ct|dr tdtj|tj}|dkDrY|j t |dzd|jtj|j|jtj|_ |jj|jy)N _event_loopzEvent loop already runningrriT)oneShot)hasattr RuntimeErrorrr)ID_ANYr4rrt EVT_TIMERstop_event_loopGetId GUIEventLooprRunr:)r/timeouttimers r"start_event_loopz$_FigureCanvasWxBase.start_event_loop+s 4 ';< <")), Q; KKGdN+TK : IIbllD$8$8U[[]I K??,  r$ct|dr7|jjr|jj|`yy)Nr)rrr=Exitr/rs r"rz#_FigureCanvasWxBase.stop_event_loop8s; 4 '))+  %%'  (r$c|j}|j}t|j}g}g}d}t |D]_\}\}} dj | D cgc]} d| z c} } |j | d|d| d| } || vr|}|j | adj |}|||fScc} w)z3Return the wildcard string for the filesave dialog.r;z*.%sz (z)||)get_default_filetypeget_supported_filetypes_groupedsorteditems enumeratejoinappend) r/default_filetype filetypessorted_filetypes wildcards extensions filter_indexirGextsextext_listwildcards r"_get_imagesave_wildcardsz,_FigureCanvasWxBase._get_imagesave_wildcards?s44688: !)//"34   ()9: 'OA|dxx >## >?H   d1g &r(2hZ8H4'   X &  'HHY' *l22!?s# C ctjdt||r|jsy|st j |}tj dk(rZt|jjjtr(|jjjn |j}|j|dd|j nt#t$|j \}}}}||||f||||f||||f||||fg}|j'||j(|j'||j*yy)zu Update the displayed image on the GUI canvas, using the supplied wx.PaintDC device context. z%s - gui_repaint()Nrcr)rerfrgIsShownOnScreenrClientDCrk isinstancerjcanvas get_rendererrMrlConvertToImageConvertToBitmaprrorhr DrawLineListrsrq)r/drawDCbmpx0y0x1y1rects r" gui_repaintz_FigureCanvasWxBase.gui_repaintQs/ 'd4--/ [[&F++, !3!3!@!@!BJO{{))+;;=KK  #q!$  , (=(=>NBBR$r2r2&6R$r2r2&68D   d&@&@ A   d&@&@ A -r$zWindows bitmapJPEGPCXzPortable Network GraphicszTagged Image Format FilezX pixmap)rjpegjpgpcxpngtiftiffxpmctjdt|tj|}|j s|j |n|j||jy)z$Called when wxPaintEvt is generated.z%s - _on_paint()rN) rerfrgrPaintDCrnrrDestroy)r/rrs r"rxz_FigureCanvasWxBase._on_paintxsS %tDz2D!}} IIVI $   F  +r$c|jtjdt||j j }|r|j |}|r<r:|js.|jtjzs|j}n/|j}|j|jt|ddr||j|j fk(ry|\|_|_d|_|jdks|j dkry|j$j&}tj(dk(s|j+}||z}|j|z }|j |z }|j$j-||d|j/dt1d |j3|j5y) 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()_widthNFrrc)forwardr resize_event)rrerfrg GetParentGetSizerGetItem ProportionFlagrEXPAND GetMinSize GetClientSizeIncTogetattrr_heightrnrjrnrkrset_size_inchesrr_processr) r/rszsirdpivalrwinchhinchs r"rvz_FigureCanvasWxBase._on_sizesy '') $d4j1 ^^  & & ( D!B "R]]277RYY3F??$D%%'D JJt( ) 44 ( T\\22$(! T\ ;;! t||q0 {{k)**,E eOF f$ v% ##E5%#@ U +ND)224 r$ctj}tj|j ftj |j ftj|jftj|jftj|jfg}|Dchc] \}}|s | c}}Scc}}wr() r GetMouseStaterLEFT LeftIsDownRIGHT RightIsDownMIDDLE MiddleIsDownBACK Aux1IsDownFORWARD Aux2IsDown)state mod_tablebuttonflags r" _mpl_buttonsz _FigureCanvasWxBase._mpl_buttonss  "   u//1 2    1 1 3 4   !3!3!5 6   u//1 2  %"2"2"4 5  ,5=<64===s 7 C C excludecdtjtjfdtjtjfdtj tj fg}|2|j}|Dcgc]\}}}||zr||k7r|c}}}S|Dcgc]\}}}tj|r|c}}}Scc}}}wcc}}}w)Nctrlr6r5) r MOD_CONTROL WXK_CONTROLMOD_ALTWXK_ALT MOD_SHIFT WXK_SHIFT GetModifiers GetKeyState)rr)r$ modifiersrGmodrs r"_mpl_modifiersz"_FigureCanvasWxBase._mpl_modifierssR^^R^^ 4 BJJ + bllBLL 1  **,I/8;;^T3 37c>; ;09,,^T3~~c*, ,;,s ;C"C cT|j}||jvr|j|}n2|dkr,t|}|js|j }ny|j ||}d|vr!|j r|jddjg||S)Nr(r5r]) KeyCodekeyvaldchr ShiftDownlowerr6isupperremover)r/rkeyvalrmodss r"_get_keyz_FigureCanvasWxBase._get_keys T\\ !,,v&C c\f+C??$iik""5&"9 d?s{{} KK xx $  %%r$c|>tj}|j|j|j\}}n|j|j}}tj dk(s;|j }||z|jjj||zz fS||jjj|z fS)zv Convert a wx position, defaulting to the current cursor position, to Matplotlib coordinates. rc) rrScreenToClientXYrkrrjrrk)r/posrrrs r" _mpl_coordsz_FigureCanvasWxBase._mpl_coordss ;""$C&&suucee4DAq55#%%qA{{k)**,EU7DKK,,33ag== =dkk&&--11 1r$ctd||j|g|jd|ij|r|j yy)zCapture key press.key_press_eventguiEventNrrBrHrSkiprs r"rzz _FigureCanvasWxBase._on_key_downsL"Du% !(,(8(8(: ! !!)  JJL r$ctd||j|g|jd|ij|r|j yy)z Release key.key_release_eventrKNrLrs r"r|z_FigureCanvasWxBase._on_key_upsL$du% !(,(8(8(: ! !!)  JJL r$c>tjtjtj tj tjtj tjtjtjtjtjtjtjtjtj tj"i|}|j%||j'y)N)cursor)rCursorr check_getitemr MOVE CURSOR_HANDHANDPOINTER CURSOR_ARROW SELECT_REGION CURSOR_CROSSWAIT CURSOR_WAITRESIZE_HORIZONTAL CURSOR_SIZEWERESIZE_VERTICAL CURSOR_SIZENS SetCursorr)r/rQs r" set_cursorz_FigureCanvasWxBase.set_cursors4-- LL".. LL".. OOR__  ! !2?? LL"..  % %r'7'7  # #R%5%5/  v r$cj|jr|j|r|jyy)zControl wx mouse capture.N) HasCapture ReleaseMouse CaptureMouse)r/captures r" _set_capturez _FigureCanvasWxBase._set_captures, ??           r$c&|jdy)zCapture changed or lostFN)rhrs r"rz$_FigureCanvasWxBase._on_capture_losts % r$c l|j|j|jxs|j|j |\}}t j tjt jtjt jtjt jtjt jtj i}|j#}|j%||}|j'|}|jr!t)d||||||j+y|jr"t)d||||d||j+y|j-r!t)d||||||j+yy)Start measuring on an axis.button_press_eventr4rKT)dblclickr4rKbutton_release_eventN)rMrh ButtonDown ButtonDClickrHrMOUSE_BTN_LEFTrrMOUSE_BTN_MIDDLErMOUSE_BTN_RIGHTrMOUSE_BTN_AUX1rMOUSE_BTN_AUX2r! GetButtonrr6rrButtonUp)r/rrr button_mapr%r4s r"r~z$_FigureCanvasWxBase._on_mouse_buttonsT  %**,D0B0B0DE&1   {//   !3!3    1 1   {//   {22  "/''.     +T1a!*U <4AD!007! ##+8:r$c|jtd|g|j||j|j ||dj y)rkmotion_notify_event)buttonsr4rKN)rMrrHr'r6rrs r"rz_FigureCanvasWxBase._on_motionGsV ($ #$$U+ #,,.!007!  #$,8:r$c|jtd|g|j||j|dj y)zMouse has entered the window.figure_enter_eventrmNrMrrHr6rrs r"rz_FigureCanvasWxBase._on_enterPH *D &''. & $ 3 3 5$ &'/hjr$c|jtd|g|j||j|dj y)zMouse has left the window.figure_leave_eventrmNrrs r"rz_FigureCanvasWxBase._on_leaveXrr$r()rT)ar?r@rArBrequired_interactive_frameworkr& _timer_clsr classproperty manager_classrr-r1r/ WXK_CAPITALWXK_LEFTWXK_UP WXK_RIGHTWXK_DOWN WXK_ESCAPEWXK_F1WXK_F2WXK_F3WXK_F4WXK_F5WXK_F6WXK_F7WXK_F8WXK_F9WXK_F10WXK_F11WXK_F12 WXK_SCROLL WXK_PAUSEWXK_BACK WXK_RETURN WXK_INSERT WXK_DELETEWXK_HOMEWXK_END WXK_PAGEUP WXK_PAGEDOWN WXK_NUMPAD0 WXK_NUMPAD1 WXK_NUMPAD2 WXK_NUMPAD3 WXK_NUMPAD4 WXK_NUMPAD5 WXK_NUMPAD6 WXK_NUMPAD7 WXK_NUMPAD8 WXK_NUMPAD9WXK_NUMPAD_ADDWXK_NUMPAD_SUBTRACTWXK_NUMPAD_MULTIPLYWXK_NUMPAD_DIVIDEWXK_NUMPAD_DECIMALWXK_NUMPAD_ENTER WXK_NUMPAD_UPWXK_NUMPAD_RIGHTWXK_NUMPAD_DOWNWXK_NUMPAD_LEFTWXK_NUMPAD_PAGEUPWXK_NUMPAD_PAGEDOWNWXK_NUMPAD_HOMEWXK_NUMPAD_ENDWXK_NUMPAD_INSERTWXK_NUMPAD_DELETEr:r.rrrrrrrrrrrxrvrr'r6rBrHrzr|rbrhrr~rrrrrqr$r"r/r/s&*"J&D&&'BCM:  : g: E:  : V : 4 : g: V: x: 4: 4: 4: 4: 4: 4: 4!:" 4#:$ 4%:& E':( E):* E+:, }-:. g/:0 [1:2 w3:4 x5:6 x7:8 V9:: E;:< x=:> ?:@ A:B C:D E:F G:H I:J K:L M:N O:P Q:R S:T 3U:V W:X Y:Z c[:\ u]:^ W_:` $a:b Wc:d Fe:f Fg:h h   F 5 h hs:Gx73r ( , !3$B6   $ $ *)* I,\ > > ,d , ,&"2"  !G2.(.11r$r/c~eZdZddZdZej eejZ ej eejxZ Z ej eejZej eejZej eej"xZZej eej(Zy)FigureCanvasWxNctjdt|t|j|j j |_|j j|jd|_ |j|y)z Render the figure using RendererWx instance renderer, or using a previously defined renderer if none is specified. z %s - draw()TrN) rerfrgrMrlrjrnrrrnr)r/rs r"rzFigureCanvasWx.drawds^ =$t*-"4;; @  '  'r$cRtjtj|jj j tj|jj j}|jjt||jjtj|r|jn|}|j||std||j r|j|r|j#yy)NzCould not save figure to )rrrrirjrrirkrrMrnris_writable_file_likerSaveFilerrnr)r/filetypefilenamerl saved_objs r" _print_imagezFigureCanvasWx._print_imageos499T[[%5%5%;%;<99T[[%5%5%<%<=? FDKKOO<=33H=**,  !!(H5!:8*EF F == IIK  LLN r$r()r?r@rArr functools partialmethodrBITMAP_TYPE_BMP print_bmpBITMAP_TYPE_JPEG print_jpeg print_jpgBITMAP_TYPE_PCX print_pcxBITMAP_TYPE_PNG print_pngBITMAP_TYPE_TIF print_tiff print_tifBITMAP_TYPE_XPM print_xpmrqr$r"rras ((( ''b((*I4Y44b))++J' ''b((*I' ''b((*I4Y44b((**J' ''b((*Ir$rc$eZdZfdZdZxZS) FigureFrameWxctjdk(rtj}ntjdd}t |dd|t jdt|t|||d||_ t|j||}|jjj}||j|tt j"|j$j&\}}|jj)|j+tj,|||jj/|j+tj,dd|jj1|j3|j5tj6|j8y)Nrc)rrrGrdr)rrkDefaultPositionPointr-r.rerfrg_set_frame_iconrr1managertoolbar SetToolBarrhrrirrrrlrg SetMinSizeSetFocusFitrt EVT_CLOSE _on_close) r/numfig canvas_classrGrrrrr2s r"r.zFigureFrameWx.__init__s; ;;+ %$$C((2r"C 5 $d4j1"4S1 !$++sD9++%%--   OOG $499chhmm,1 ""4<<1 #>? t||BGGAqM:;    ",,/r$ctjdt|td|jj |jj d|jj_tj|jj |jj|jjj|jy#t$rYwxYw)Nz%s - on_close() close_event)rerfrgr rrrrframerdestroympl_disconnectr_id_dragAttributeErrorrMrs r"rzFigureFrameWx._on_closes $d4j1=$++.779 ##%%) ! DKK''(  KK & &t{{':':'C'C D     s#9C-- C98C9)r?r@rAr.rrCrDs@r"rrs 0>r$rcfeZdZdZfdZedZedZdZdZ dZ dZ d Z d Z xZS) r1a 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 ctjdt||x|_|_t |||y)Nrd)rerfrgrwindowr-r.)r/rrrr2s r"r.zFigureManagerWx.__init__s3 $d4j1#(( T[ %r$ctjxs t}t|||}|jj }t jr4|jj|jj|S)N)r) rGetAppr#rrrmplis_interactiverShowr)r2rrjrr!rrs r"create_with_canvasz"FigureManagerWx.create_with_canvassd .}c6 E--''     MM   MM # # %r$ctjjs(tj}||j yyyr()rrIsMainLoopRunningrMainLoop)r2r!s r"start_main_loopzFigureManagerWx.start_main_loops7vv'')IIKE  !*r$c|jj|jjtj dr|jj yy)Nzfigure.raise_window)rrrrrrcParamsRaiser7s r"showzFigureManagerWx.showsB   <<- . JJ    /r$ctjdt||j}|r t j |j yy)Nz%s - destroy())rerfrgrr CallAfterr)r/r0rs r"rzFigureManagerWx.destroys8 #T$Z0   LL % r$cl|jj|jj yr()rShowFullScreen IsFullScreenr7s r"full_screen_togglez"FigureManagerWx.full_screen_toggles$ !!djj&=&=&?"?@r$c6|jjSr()rGetTitler7s r"get_window_titlez FigureManagerWx.get_window_titles{{##%%r$c:|jj|yr()rSetTitle)r/titles r"set_window_titlez FigureManagerWx.set_window_titles U#r$c |jj|jjtjt j |t j |yr()rSetSizeClientToWindowSizerrgrri)r/rirks r"resizezFigureManagerWx.resizesI DKK::277 IIe dii/<12 3r$)r?r@rArBr. classmethodrrr rrrrrrCrDs@r"r1r1sT & !! &A&$3r$r1cftjttjd|S)z\ Load a wx.Bitmap from a file in the "images" directory of the Matplotlib data. images)rrstrr_get_data_path)rs r" _load_bitmapr  s% 99S--hAB CCr$ctj}dD]C}tjt|}|j sy|j |E|j |y)N)zmatplotlib.pngzmatplotlib_large.png)r IconBundleIconr IsOkAddIconSetIcons)rbundleimageicons r"rrsU ]]_F;ww|E*+yy{ t   NN6r$c~eZdZd ejddZedZdZfdZ fdZ dZ dZ d Z d Zd ZxZS) NavigationToolbar2Wxrc tjj||jd|tjdk(r0|j |j |jzi|_|jD]\}}}}||j|jd|j|dtj|||dvrtjntjj |j|<|j#tj$t'|||j|||_|j(rU|j+tj,|tj.|_|j3|j0|j5t7j||y)Nrr,rf.svg)PanZoom)rl bmpDisabledlabel shortHelpkindr)rToolBarr.rrkSetToolBitmapSizeGetToolBitmapSizerwx_ids toolitems AddSeparatorAddTool_iconr  ITEM_CHECK ITEM_NORMALIdrtEVT_TOOLr _coordinatesAddStretchableSpace StaticText ALIGN_RIGHT _label_text AddControlRealizer)r/r coordinatesrtext tooltip_text image_filecallbacks r"r.zNavigationToolbar2Wx.__init__sz D&"2"2"4bF ;;+ %  " "4#9#9#;DjA| jBd| jBd| jES#t$rtjj tj }tjj tj}d|jzd|jzzd|jzzdz }d|jzd|jzzd|jzzdz }||z dkD}YywxYw)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`"?gbX9?gv/?r$g?rr.s fill:black;s fill:white;RGBA.Nrrr)axisr)#rSystemSettings GetAppearanceIsDarkr GetColourSYS_COLOUR_WINDOWSYS_COLOUR_WINDOWTEXTredgreenbluerrsuffix read_bytesreplace ArtProviderGetDIPSizeHint ART_TOOLBAR BitmapBundleFromSVGPILImageopennparrayconvertallRedGreenBluerrrr) rGdarkbgrbg_lumfg_lumrsvgtoolbarIconSizepilimgr( black_masks r"r<zNavigationToolbar2Wx._icon>s ($$224;;=D##Hd3 ;;& //#Ckk..A nn.==bnnMO??**3@ @YY^^D)FHHV^^F34E&&001I1IJ#C!Gn166B6? )+288:rwwy(Ij"1"n%99++ A A A A1 ("",,R-A-ABB"",,R-E-EFBRVVmdRXXo5rwwF#MFRVVmdRXXo5rwwF#MFF?R'D (s,GCJ('J(cd|jvr6|j|jd|jjdk(d|jvr7|j|jd|jjdk(yy)Nr/PANr0ZOOM)r8 ToggleToolmoderGr7s r"_update_buttons_checkedz,NavigationToolbar2Wx._update_buttons_checkedbsg DKK  OODKK. %0G H T[[ OODKK/61I J !r$c>t|||jyr()r-zoomrxr/r0r2s r"rzzNavigationToolbar2Wx.zoomhs  d $$&r$c>t|||jyr()r-panrxr{s r"r}zNavigationToolbar2Wx.panls  T $$&r$c |jj\}}}|jj}tj|jj dt jd||tjtjz}|j||jtjk(rtj|j}t j#dt%||||j'}|j(dd} | |jj+vr|| k7rt j-d| || | }t jdr&t/|j0t jd< |jj2j5|||Sy#t6$rc} tj8|jj t/| d}|j|j;Yd} ~ yd} ~ wwxYw) Nz Save to filezsavefig.directoryz%s - Save file path: %srzDextension %s did not match the selected image type %s; going with %s)formatzMatplotlib error)rmessagecaption)rrget_default_filenamer FileDialogrrrFD_SAVEFD_OVERWRITE_PROMPTSetFilterIndex ShowModalID_OKpathlibrGetPathrerfrgGetFilterIndexrYget_supported_filetypeswarningrrrjsavefig Exception MessageDialogr) r/r0rrr default_filedialogrfmtres r" save_figurez NavigationToolbar2Wx.save_figureps(, (L(L(N% 4{{779  KK ! ! #^ LL, -|Y JJ// /1 l+     )<< 01D JJ0$t*d Cv,,./C++ab/Cdkk99;;s  < #s,||/047 4D 01 ! ""**4*< # *$ !));;002CF.0  "   !s((G H>AH99H>c8|jjjj}tj dk(rdn|jj }||z ||z |z ||z ||z |z f|j_|jjy)Nrcr) rrjrrkrrkrror)r/rrrrrrksfs r"draw_rubberbandz$NavigationToolbar2Wx.draw_rubberbands##((//++,Q$++2O2O2Q(*2 R/?(*2 R/?(A $ r$cZd|j_|jjyr()rrorr7s r"remove_rubberbandz&NavigationToolbar2Wx.remove_rubberbands'+ $ r$cT|jr|jj|yyr()rArESetLabelr/r{s r" set_messagez NavigationToolbar2Wx.set_messages$       % %a ( r$cJ|jjdkD}|jjt|jdz k}d|jvr|j |jd|d|jvr |j |jd|yy)NrrBackForward) _nav_stack_poslenr8 EnableTool)r/ can_backward can_forwards r"set_history_buttonsz(NavigationToolbar2Wx.set_history_buttonss++a/ oo**S-AA-EE T[[ OODKK/ >  # OODKK 2K @ $r$r)r?r@rAr TB_BOTTOMr.rr<rxrzr}rrrrrrCrDs@r"r+r+sV2",,2@!A!AFK '' !D)Ar$r+cNeZdZdZdej fdZdZdZdZ dZ dZ y) ToolbarWxr.Nc~||jj}tj||tj j||d||j |_t j|tj|_ |j|ji|_ i|_ y)Nrr,)rrr r.rr5rB_spacerCrDrErF _toolitems_groups)r/ toolmanagerrrs r"r.zToolbarWx.__init__s > ''113F""45 D&"E:..0 ==R^^D (() r$cLfdtjD\}|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. c3JK|]}j|k(r|ywr() GetToolByPos).0rGr/tools r" z*ToolbarWx._get_tool_pos..s+3$$S)T13s #)range ToolsCount)r/rrGs`` r" _get_tool_poszToolbarWx._get_tool_poss!3uT__53 r$c |jvr7jjjj|<j|}t j t jDcgc]$}|jr|js|&} }|dk\r4|| dk(rdn(j| | j|dz dz} nj|dz} | |z} |ratj|} |stjntj} j!| d| tj"| |xsd}nbj%ddzdf}|rtj&d|}ntj(d|}j+| |}j-fd}|r"j/tj0||n j/tj2|j4j7gj4j9||fycc}w) Nrrr rdr2c(jyr() trigger_tool)rrGr/s r"handlerz'ToolbarWx.add_toolitem..handlers   d #r$)rInsertSeparatorrrrhrrr IsSeparatorIsStretchableSpaceindexr+r<rr>r= InsertToolr  GetTextExtent ToggleButtonButton InsertControlrGrtr@r}r setdefaultr)r/rGgrouppositionrK descriptiontoggleseptsepsstartidxrr4rrr4rs`` r" add_toolitemzToolbarWx.add_toolitems  $"&"6"6""4;;/#1DLL ll5!t00%2HICa==?1+?+?+ACC q=a.Q,,T$**S/A2E-FG!K &&s+a/Eh &,,Z8C)/2>>R]]D??3D#r}}d#.#4"6D&&t,Q/"4b9D//$DtD))D"d>%%c7$%?D  $  IIbkk7D 1 LL))7 3 ""4, $$dG_5GCs)Ic||jvry|j|D]Q\}}|js|j|j|3|j j |S|j yr()r IsControlrvr? GetControlSetValuer)r/rGtoggledrrs r"toggle_toolitemzToolbarWx.toggle_toolitemsi t & !__T2 4MD'>>#1!**73  4 r$c|jj|gD] \}}|j|j"yr()rpop DeleteToolr?)r/rGrrs r"remove_toolitemzToolbarWx.remove_toolitems6!__00r: %MD' OODGG $ %r$c:|jj|yr()rErrs r"rzToolbarWx.set_messages !!!$r$) r?r@rA_icon_extensionrrr.rrrrrrqr$r"rrs/O+/r||  +6Z%%r$rceZdZdZy)ConfigureSubplotsWxc.tj|yr()r+configure_subplotsr/r0s r"triggerzConfigureSubplotsWx.triggers//5r$Nr?r@rArrqr$r"rrs6r$rceZdZdZy) SaveFigureWxcJtj|jyr()r+r"_make_classic_style_pseudo_toolbarrs r"rzSaveFigureWx.trigger s((  3 3 5 7r$Nrrqr$r"rr s7r$rceZdZdZdZy) RubberbandWxcTtj|jd||||yr()r+rr)r/rrrrs r"rzRubberbandWx.draw_rubberbands',,  3 3 5tRR Mr$cJtj|jyr()r+rrr7s r"rzRubberbandWx.remove_rubberbands..  3 3 5 7r$N)r?r@rArrrqr$r"rrs M7r$rcFeZdZdZdgZgdZfdZdZedZ xZ S) _HelpDialogN)Action Shortcuts Description)rNrPc8t ||dtjtjztj tj }tjdddd}|jj}t|j|zD]u\}}t||jD]W\}} tj||} |dk(r| j|| j!| |j#| dddYw|j#|dtj$dtj&|tj(} |j#| dtj*tj$zd|j-||j/||j1|j3tj4|j6| j3tj8|j6y)NHelp)rrrrr)r-r.rDEFAULT_DIALOG_STYLE RESIZE_BORDERBoxSizerVERTICAL FlexGridSizerGetFontMakeBoldrheaderszipwidthsrCrxWrapAddALLrrALIGN_CENTER_HORIZONTALSetSizerrLayoutrtrr EVT_BUTTON) r/r help_entriessizer grid_sizerrVrrowcolrir2okr2s r"r.z_HelpDialog.__init__!s v!669I9II  K BKK(%%aAq1 ||~&&( | ;< /FAs #C 5 / e d#66MM$' 5!uaA.  / /  *a+ YYtRXX & "a33bffr:s  BBBBB ED) * w" Q i & y, FHLCLC HLC^j9+j9ZU1*BHHU1p-*(-*`.BHH.bF3'F3RDJA-rzzJA^U%!2::U%p$##$786-==696 $##$787=//797 $##$787=//797*"))*Z$##$783] ' '393 $##$78 $MAA $9 $#7-6* ///r$