a
    fø1b­–  ã                &   @   sö  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
 d dlmZ d dlmZmZmZmZmZmZmZmZ d dlm  m  mZ ddlm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& eZ'dd	„ d
dddddddddddddddddddej(dkrdnd fd!ej(dkr0d"ndfd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2f%D ƒZ)d3d4„ d5D ƒZ*d6d	„ ej+d7fej,d8fej-d9fej.d:fej/d;fej0d<fej1d=ffD ƒZ2da3d>d?„ Z4d@dA„ Z5G dBdC„ dCeƒZ6G dDdE„ dEej7eƒZ8G dFdG„ dGej9ƒZ:G dHdI„ dIeƒZ;G dJdK„ dKeej<ƒZ=G dLdM„ dMej>ƒZ?G dNdO„ dOeej<ƒZ@G dPdQ„ dQe	jAƒZBG dRdS„ dSe	jCƒZDejEdTdUdVG dWdX„ dXe	jFƒƒZGG dYdZ„ dZe	jHƒZIG d[d\„ d\e	jJƒZKG d]d^„ d^e	jLƒZMeDe	_NeBe	_OeIe	_PeKe	_QeMe	_RejSG d_d`„ d`eƒƒZTdS )aé    N)Ú_apiÚbackend_toolsÚcbook)ÚGcf)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚNavigationToolbar2Ú	TimerBaseÚcursorsÚToolContainerBaseÚMouseButtoné   )Ú	qt_compat)ÚQtCoreÚQtGuiÚ	QtWidgetsÚ__version__ÚQT_APIÚ_enumÚ_to_intÚ_devicePixelRatioFÚ
_isdeletedÚ_setDevicePixelRatioÚ_maybe_allow_interruptc                 C   s$   i | ]\}}t ttd ƒ|ƒƒ|“qS )úQtCore.Qt.Key©r   Úgetattrr   ©Ú.0ÚkÚv© r"   ú=lib/python3.9/site-packages/matplotlib/backends/backend_qt.pyÚ
<dictcomp>   s   r$   )Z
Key_EscapeÚescape)ZKey_TabZtab)ZKey_BackspaceZ	backspace)Z
Key_ReturnÚenter)Z	Key_Enterr&   )Z
Key_InsertÚinsert)Z
Key_DeleteÚdelete)Z	Key_PauseÚpause)Z
Key_SysReqZsysreq)Z	Key_ClearÚclear)ZKey_HomeÚhome)ZKey_EndÚend)ZKey_LeftÚleft)ZKey_UpZup)Z	Key_RightÚright)ZKey_DownZdown)Z
Key_PageUpZpageup)ZKey_PageDownZpagedown)Ú	Key_ShiftÚshiftÚKey_ControlÚdarwinÚcontrolÚcmdÚKey_MetaÚmeta)ÚKey_AltZalt)ZKey_CapsLockZ	caps_lock)ZKey_F1Úf1)ZKey_F2Úf2)ZKey_F3Zf3)ZKey_F4Zf4)ZKey_F5Zf5)ZKey_F6Zf6)ZKey_F7Zf7)ZKey_F8Zf8)ZKey_F9Zf9)ÚKey_F10Zf10)r:   Zf11)ZKey_F12Zf12)ZKey_Super_LÚsuper)ZKey_Super_Rr;   c                 C   s4   g | ],\}}t ttd ƒ|ƒƒt ttdƒ|ƒƒf‘qS )zQtCore.Qt.KeyboardModifierr   r   ©r   ÚmodÚkeyr"   r"   r#   Ú
<listcomp>I   s   þÿr?   ))ZControlModifierr1   )ZAltModifierr7   )ZShiftModifierr/   )ZMetaModifierr5   c                 C   s    i | ]\}}|t td ƒ|ƒ“qS )zQtCore.Qt.CursorShape©r   r   r   r"   r"   r#   r$   S   s   ZSizeAllCursorZPointingHandCursorZArrowCursorZCrossCursorZ
WaitCursorZSizeHorCursorZSizeVerCursorc                  C   sÐ   t du r¦tj ¡ } | du r¢tj ¡ s,tdƒ‚ztj t	j
j¡ W n tyR   Y n0 ztj t	j
jj¡ W n ty|   Y n0 t dg¡a t j t j¡ t ¡  n| a zt  t	j
j¡ W n tyÊ   Y n0 dS )zJ
    Only one qApp can exist at a time, so check before creating one.
    NzInvalid DISPLAY variableÚ
matplotlib)ÚqAppr   ÚQApplicationÚinstanceÚmplZ_c_internal_utilsZdisplay_is_validÚRuntimeErrorÚsetAttributer   ÚQtZAA_EnableHighDpiScalingÚAttributeErrorZ#setHighDpiScaleFactorRoundingPolicyZ HighDpiScaleFactorRoundingPolicyZPassThroughZlastWindowClosedÚconnectÚquitr   Z_setup_new_guiappZAA_UseHighDpiPixmaps)Zappr"   r"   r#   Ú_create_qAppd   s2    

ÿÿ
rL   c                    s@   t dv rˆ S tjj‰‡fdd„‰t ˆ ¡‡ ‡fdd„ƒ}|S dS )zN
    Decorator for ``__init__`` to allow ``super().__init__`` on PySide2.
    )ZPyQt5ÚPyQt6c                    sT   ˆ | ƒ t | ƒj}tdd„ || tj¡d d … D ƒƒ}|j| g|¢R i |¤Ž d S )Nc                 s   s&   | ]}|j  d ¡d dvr|V  qdS )Ú.r   )ZPySide2ÚPySide6ZShibokenN)Ú
__module__Úsplit)r   Úclsr"   r"   r#   Ú	<genexpr>Ÿ   s   ÿzF_allow_super_init.<locals>.cooperative_qwidget_init.<locals>.<genexpr>r   )ÚtypeÚ__mro__ÚnextÚindexr   ÚQWidgetÚ__init__)ÚselfÚargsÚkwargsÚmroZnext_coop_init)Úqwidget_initr"   r#   Úcooperative_qwidget_initœ   s    
ÿz3_allow_super_init.<locals>.cooperative_qwidget_initc                    sJ   t jtjˆd& ˆ | g|¢R i |¤Ž W d   ƒ n1 s<0    Y  d S )N)rY   )r   Ú_setattr_cmr   rX   ©rZ   r[   r\   )rY   r_   r"   r#   Úwrapper¦   s    ÿz"_allow_super_init.<locals>.wrapperN)r   r   rX   rY   Ú	functoolsÚwraps)rY   rb   r"   )rY   r_   r^   r#   Ú_allow_super_init‡   s    
re   c                       sH   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	‡  Z
S )ÚTimerQTz-Subclass of `.TimerBase` using QTimer events.c                    s0   t  ¡ | _| jj | j¡ tƒ j|i |¤Ž d S ©N)r   ÚQTimerÚ_timerÚtimeoutrJ   Z	_on_timerr;   rY   ra   ©Ú	__class__r"   r#   rY   ²   s    
zTimerQT.__init__c                 C   s   t | jƒs|  ¡  d S rg   )r   ri   Ú_timer_stop©rZ   r"   r"   r#   Ú__del__¹   s    
zTimerQT.__del__c                 C   s   | j  | j¡ d S rg   )ri   ZsetSingleShotZ_singlern   r"   r"   r#   Ú_timer_set_single_shot¿   s    zTimerQT._timer_set_single_shotc                 C   s   | j  | j¡ d S rg   )ri   ZsetIntervalZ	_intervalrn   r"   r"   r#   Ú_timer_set_intervalÂ   s    zTimerQT._timer_set_intervalc                 C   s   | j  ¡  d S rg   )ri   Ústartrn   r"   r"   r#   Ú_timer_startÅ   s    zTimerQT._timer_startc                 C   s   | j  ¡  d S rg   )ri   Ústoprn   r"   r"   r#   rm   È   s    zTimerQT._timer_stop)Ú__name__rP   Ú__qualname__Ú__doc__rY   ro   rp   rq   rs   rm   Ú__classcell__r"   r"   rk   r#   rf   ¯   s   rf   c                       sP  e Zd ZdZeZdd„ dejfdejfdej	fdej
fdejffD ƒZedD‡ fd
d„	ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze edv r˜dnd¡Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"d/d0„ Z#d1d2„ Z$d3d4„ Z%dEd6d7„Z&dFd8d9„Z'‡ fd:d;„Z(d<d=„ Z)dGd>d?„Z*d@dA„ Z+dBdC„ Z,‡  Z-S )HÚFigureCanvasQTZqtc                 C   s    i | ]\}}t td ƒ|ƒ|“qS )zQtCore.Qt.MouseButtonr@   r   r"   r"   r#   r$   Ð   s   zFigureCanvasQT.<dictcomp>Z
LeftButtonZRightButtonZMiddleButtonZXButton1ZXButton2Nc                    sp   t ƒ  tƒ j|d d| _d| _dd„ | _|  tdƒj¡ |  	d¡ | j
|  ¡ Ž  t t d¡¡}|  |¡ d S )N)ÚfigureFc                 S   s   d S rg   r"   ©Úpainterr"   r"   r#   Ú<lambda>á   ó    z)FigureCanvasQT.__init__.<locals>.<lambda>zQtCore.Qt.WidgetAttributeTÚwhite)rL   r;   rY   Ú_draw_pendingÚ_is_drawingÚ_draw_rect_callbackrG   r   ZWA_OpaquePaintEventZsetMouseTrackingÚresizeÚget_width_heightr   ZQPaletteÚQColorZ
setPalette)rZ   rz   Úpaletterk   r"   r#   rY   Ú   s    
ÿ
zFigureCanvasQT.__init__c                 C   s0   |   t| ƒ¡r,t |  ¡ |  ¡ ¡}|  |¡ d S rg   )Z_set_device_pixel_ratior   r   ZQResizeEventÚsizeÚresizeEvent©rZ   Úeventr"   r"   r#   Ú_update_pixel_ratioë   s    z"FigureCanvasQT._update_pixel_ratioc                 C   s0   |   ¡  |d ur,|j | j ¡ |j | j ¡ d S rg   )r‹   ZphysicalDotsPerInchChangedrJ   ZlogicalDotsPerInchChanged)rZ   Úscreenr"   r"   r#   Ú_update_screenó   s    zFigureCanvasQT._update_screenc                 C   s,   |   ¡  ¡ }|j | j¡ |  | ¡ ¡ d S rg   )ÚwindowZwindowHandleZscreenChangedrJ   r   rŒ   )rZ   rŠ   rŽ   r"   r"   r#   Ú	showEventú   s    zFigureCanvasQT.showEventc                 C   s   |   tjt|d¡ d S )N)Úcursor)Z	setCursorr   Zcheck_getitemÚcursord©rZ   r   r"   r"   r#   Ú
set_cursor  s    zFigureCanvasQT.set_cursorc                 C   s,   |   |  |¡¡\}}tj| |||fd d S )N)ÚguiEventZxy)ÚmouseEventCoordsÚ_get_positionr   Zenter_notify_event©rZ   rŠ   ÚxÚyr"   r"   r#   Ú
enterEvent  s    zFigureCanvasQT.enterEventc                 C   s   t j ¡  tj| |d d S ©N©r”   )r   rC   ZrestoreOverrideCursorr   Zleave_notify_eventr‰   r"   r"   r#   Ú
leaveEvent	  s    
zFigureCanvasQT.leaveEvent)rM   rO   ÚpositionÚposc                 C   s4   |  ¡ }| jjj| j | ¡  }|| j || j fS )aI  
        Calculate mouse coordinates in physical pixels.

        Qt uses logical pixels, but the figure is scaled to physical
        pixels for rendering.  Transform to physical pixels so that
        all of the down-stream transforms work as expected.

        Also, the origin is different and needs to be corrected.
        )r˜   rz   ÚbboxÚheightÚdevice_pixel_ratior™   )rZ   rŸ   r˜   r™   r"   r"   r#   r•     s    
zFigureCanvasQT.mouseEventCoordsc                 C   sD   |   |  |¡¡\}}| j | ¡ ¡}|d ur@tj| ||||d d S r›   ©r•   r–   ÚbuttondÚgetÚbuttonr   Zbutton_press_event©rZ   rŠ   r˜   r™   r¦   r"   r"   r#   ÚmousePressEvent  s    ÿzFigureCanvasQT.mousePressEventc                 C   sF   |   |  |¡¡\}}| j | ¡ ¡}|d urBtj| |||d|d d S )NT)Zdblclickr”   r£   r§   r"   r"   r#   ÚmouseDoubleClickEvent&  s    
þz$FigureCanvasQT.mouseDoubleClickEventc                 C   s*   |   |  |¡¡\}}tj| |||d d S r›   )r•   r–   r   Zmotion_notify_eventr—   r"   r"   r#   ÚmouseMoveEvent.  s    zFigureCanvasQT.mouseMoveEventc                 C   sD   |   |  |¡¡\}}| j | ¡ ¡}|d ur@tj| ||||d d S r›   )r•   r–   r¤   r¥   r¦   r   Zbutton_release_eventr§   r"   r"   r#   ÚmouseReleaseEvent2  s    ÿz FigureCanvasQT.mouseReleaseEventc                 C   sl   |   |  |¡¡\}}| ¡  ¡ s2tj ¡  ¡ dkrD| ¡  	¡ d }n| ¡  	¡ }|rht
j| ||||d d S )NZxcbéx   rœ   )r•   r–   Z
pixelDeltaZisNullr   rC   rD   ZplatformNameZ
angleDeltar™   r   Zscroll_event)rZ   rŠ   r˜   r™   Zstepsr"   r"   r#   Ú
wheelEvent9  s    ÿ
ÿzFigureCanvasQT.wheelEventc                 C   s&   |   |¡}|d ur"tj| ||d d S r›   )Ú_get_keyr   Zkey_press_event©rZ   rŠ   r>   r"   r"   r#   ÚkeyPressEventF  s    
zFigureCanvasQT.keyPressEventc                 C   s&   |   |¡}|d ur"tj| ||d d S r›   )r®   r   Zkey_release_eventr¯   r"   r"   r#   ÚkeyReleaseEventK  s    
zFigureCanvasQT.keyReleaseEventc                 C   sŠ   t  ¡ }|jt|jdd ƒu r d S | ¡  ¡ | j }| ¡  ¡ | j }| j	j
}|| }|| }| j	j||dd tj | |¡ t | ¡ d S )NÚf_codeF)Úforward)ÚsysÚ	_getframer²   r   Úf_backr‡   Úwidthr¢   r¡   rz   ZdpiZset_size_inchesr   rX   rˆ   r   Zresize_event)rZ   rŠ   ÚframeÚwÚhZdpivalZwinchZhinchr"   r"   r#   rˆ   P  s    zFigureCanvasQT.resizeEventc                 C   s   |   ¡ \}}t ||¡S rg   )r„   r   ÚQSize)rZ   r¹   rº   r"   r"   r#   ÚsizeHinta  s    zFigureCanvasQT.sizeHintc                 C   s   t  dd¡S )Né
   )r   r»   rn   r"   r"   r#   ÚminumumSizeHinte  s    zFigureCanvasQT.minumumSizeHintc                    sŒ   |  ¡ ‰ t| ¡ ƒ‰‡ ‡fdd„tD ƒ}ztˆ  }W nF tyz   ˆ tjkrRY d S tˆ ƒ}d|v rn| 	d¡ n| 
¡ }Y n0 d ||g ¡S )Nc                    s0   g | ](\}}ˆ |krˆ|@ rt |  d d¡‘qS )r3   Zctrl)ÚSPECIAL_KEYSÚreplacer<   ©Z	event_keyZ
event_modsr"   r#   r?   q  s   þz+FigureCanvasQT._get_key.<locals>.<listcomp>r0   ú+)r>   r   Z	modifiersÚ_MODIFIER_KEYSr¿   ÚKeyErrorr´   Ú
maxunicodeÚchrÚremoveÚlowerÚjoin)rZ   rŠ   Zmodsr>   r"   rÁ   r#   r®   h  s    ÿ
zFigureCanvasQT._get_keyc                 C   s   t  ¡  d S rg   )rB   ZprocessEventsrn   r"   r"   r#   Úflush_events‹  s    zFigureCanvasQT.flush_eventsr   c                 C   s€   t | dƒr| j ¡ rtdƒ‚t ¡  | _}|dkrJtj t|d ƒ|j	¡}t
|ƒ t |¡ W d   ƒ n1 sr0    Y  d S )NÚ_event_loopzEvent loop already runningr   iè  )ÚhasattrrË   Z	isRunningrF   r   Z
QEventLooprh   Ú
singleShotÚintrK   r   r   Ú_exec)rZ   rj   Z
event_loopZtimerr"   r"   r#   Ústart_event_loop  s    ÿ
zFigureCanvasQT.start_event_loopc                 C   s   t | dƒr| j ¡  d S )NrË   )rÌ   rË   rK   r‰   r"   r"   r#   Ústop_event_loop›  s    
zFigureCanvasQT.stop_event_loopc                    sN   | j r
dS tj| dd tƒ  ¡  W d  ƒ n1 s80    Y  |  ¡  dS )z5Render the figure, and queue a request for a Qt draw.NT)r   )r   r   r`   r;   ÚdrawÚupdatern   rk   r"   r#   rÒ      s
    (zFigureCanvasQT.drawc                 C   s2   t | ddƒs.t | ddƒs.d| _tj d| j¡ dS )z9Queue redraw of the Agg buffer and request Qt paintEvent.r€   Fr   Tr   N)r   r€   r   rh   rÍ   Ú
_draw_idlern   r"   r"   r#   Ú	draw_idleª  s
    
ÿzFigureCanvasQT.draw_idlec                    sZ   |d u rˆ j rˆ j j}‡ fdd„|jD ƒ\}}}}|| }ˆ  |ˆ  ¡  ¡ | ||¡ d S )Nc                    s   g | ]}t |ˆ j ƒ‘qS r"   ©rÎ   r¢   ©r   Zptrn   r"   r#   r?   »  r~   z'FigureCanvasQT.blit.<locals>.<listcomp>)rz   r    ZboundsZrepaintÚrectr¡   )rZ   r    ÚlÚbr¹   rº   Útr"   rn   r#   Úblit¶  s
    zFigureCanvasQT.blitc              	   C   s˜   |   ¡ | | js W d   ƒ d S d| _|  ¡ dk s>|  ¡ dk rNW d   ƒ d S z|  ¡  W n tyt   t ¡  Y n0 W d   ƒ n1 sŠ0    Y  d S )NFr   )Z_idle_draw_cntxr€   r¡   r·   rÒ   Ú	ExceptionÚ	tracebackÚ	print_excrn   r"   r"   r#   rÔ   ¿  s    
zFigureCanvasQT._draw_idlec                    sb   |d urH‡ fdd„|D ƒ\‰‰}}ˆ| ‰ˆ| ‰‡ ‡‡‡‡fdd„}ndd„ }|ˆ _ ˆ  ¡  d S )Nc                    s   g | ]}t |ˆ j ƒ‘qS r"   rÖ   r×   rn   r"   r#   r?   Ð  r~   z0FigureCanvasQT.drawRectangle.<locals>.<listcomp>c                    s®   t  t  d¡dˆ j ¡}| ddg¡ t  d¡dft  d¡dffD ]f\}}| |¡ | |¡ |  |¡ |  ˆˆˆˆ¡ |  ˆˆˆˆ¡ |  ˆˆˆˆ¡ |  ˆˆˆˆ¡ qBd S )NÚblackr   é   r   r   )	r   ZQPenr…   r¢   ZsetDashPatternZsetDashOffsetZsetColorZsetPenZdrawLine)r|   ZpenÚcolorÚoffset©rZ   Úx0Úx1Úy0Úy1r"   r#   r‚   Ó  s    þþ


z9FigureCanvasQT.drawRectangle.<locals>._draw_rect_callbackc                 S   s   d S rg   r"   r{   r"   r"   r#   r‚   è  s    )r‚   rÓ   )rZ   rØ   r¹   rº   r‚   r"   rä   r#   ÚdrawRectangleÌ  s    zFigureCanvasQT.drawRectangle)N)r   )N)N).ru   rP   rv   Zrequired_interactive_frameworkrf   Z
_timer_clsr   ZLEFTZRIGHTZMIDDLEZBACKZFORWARDr¤   re   rY   r‹   r   r   r“   rš   r   ÚoperatorÚmethodcallerr   r–   r•   r¨   r©   rª   r«   r­   r°   r±   rˆ   r¼   r¾   r®   rÊ   rÐ   rÑ   rÒ   rÕ   rÜ   rÔ   ré   rx   r"   r"   rk   r#   ry   Ì   sR   ûÿ
ÿ#



	ry   c                       s$   e Zd Ze ¡ Z‡ fdd„Z‡  ZS )Ú
MainWindowc                    s   | j  ¡  tƒ  |¡ d S rg   )ÚclosingÚemitr;   Ú
closeEventr‰   rk   r"   r#   rï   ñ  s    
zMainWindow.closeEvent)ru   rP   rv   r   ÚSignalrí   rï   rx   r"   r"   rk   r#   rì   î  s   rì   c                       s`   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚFigureManagerQTzù
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : qt.QToolBar
        The qt.QToolBar
    window : qt.QMainWindow
        The qt.QMainWindow
    c                    s<  t ƒ | _tƒ  ||¡ | jj |j¡ | jj | j¡ tt	 
d¡ƒ}| j t |¡¡ d| j_|  | j| j¡| _| jr”t | j¡ | jr”t | j¡ | jr¸| j | j¡ | j ¡  ¡ }nd}| ¡ }| ¡ }|| }| j | ¡ |¡ | j | j¡ t ¡ r| j ¡  | j ¡  | j  t!dƒj"¡ | j #¡  | j $¡  d S )Nzimages/matplotlib.svgFr   zQtCore.Qt.FocusPolicy)%rì   rŽ   r;   rY   rí   rJ   Úclose_eventÚ_widgetclosedÚstrr   Ú_get_data_pathÚsetWindowIconr   ÚQIconÚ_destroyingÚ_get_toolbarÚcanvasÚtoolbarÚtoolmanagerr   Zadd_tools_to_managerZadd_tools_to_containerZ
addToolBarr¼   r¡   rƒ   r·   ZsetCentralWidgetrE   Zis_interactiveÚshowrÕ   ZsetFocusPolicyr   ZStrongFocusÚsetFocusÚraise_)rZ   rú   ZnumZimageZ
tbs_heightZcsZ	cs_heightr¡   rk   r"   r#   rY     s6    



zFigureManagerQT.__init__c                 C   s$   | j  ¡ r| j  ¡  n
| j  ¡  d S rg   )rŽ   ZisFullScreenZ
showNormalZshowFullScreenrn   r"   r"   r#   Úfull_screen_toggle2  s    
z"FigureManagerQT.full_screen_togglec                 C   s:   | j jrd S d| j _zt | ¡ W n ty4   Y n0 d S ©NT)rŽ   rø   r   ÚdestroyrI   rn   r"   r"   r#   ró   8  s    zFigureManagerQT._widgetclosedc                 C   sB   t jd dkrt||dƒ}n"t jd dkr:t| j| jƒ}nd }|S )Nrû   Ztoolbar2Trü   )rE   ÚrcParamsÚNavigationToolbar2QTÚ	ToolbarQtrü   rŽ   )rZ   rú   Úparentrû   r"   r"   r#   rù   D  s    zFigureManagerQT._get_toolbarc                 C   sp   t || jj ƒ}t || jj ƒ}| j ¡ | j ¡  }| j ¡ | j ¡  }| j ||¡ | j || || ¡ d S rg   )rÎ   rú   r¢   rŽ   r·   r¡   rƒ   )rZ   r·   r¡   Zextra_widthZextra_heightr"   r"   r#   rƒ   O  s    zFigureManagerQT.resizec                 C   s,   | j  ¡  tjd r(| j  ¡  | j  ¡  d S )Nzfigure.raise_window)rŽ   rý   rE   r  ZactivateWindowrÿ   rn   r"   r"   r#   rý   Y  s    


zFigureManagerQT.showc                 G   sD   t j ¡ d u rd S | jjrd S d| j_| jr6| j ¡  | j ¡  d S r  )r   rC   rD   rŽ   rø   rû   r  Úclose©rZ   r[   r"   r"   r#   r  _  s    
zFigureManagerQT.destroyc                 C   s
   | j  ¡ S rg   )rŽ   ZwindowTitlern   r"   r"   r#   Úget_window_titlej  s    z FigureManagerQT.get_window_titlec                 C   s   | j  |¡ d S rg   )rŽ   ZsetWindowTitle)rZ   Útitler"   r"   r#   Úset_window_titlem  s    z FigureManagerQT.set_window_title)ru   rP   rv   rw   rY   r   ró   rù   rƒ   rý   r  r	  r  rx   r"   r"   rk   r#   rñ   ö  s   .
rñ   c                       s®   e Zd Ze e¡Zg ej¢Ze 	dd„ eD ƒ 
d¡d d¡ ddd„Zd	d
„ Z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dd„ Z‡  ZS ) r  c                 C   s   g | ]^}}|‘qS r"   r"   )r   ÚnameÚ_r"   r"   r#   r?   w  r~   zNavigationToolbar2QT.<listcomp>ZSubplotsr   )Ú	Customizez%Edit axis, curve and image parametersZqt4_editor_optionsÚedit_parametersTc           
      C   sD  t j | |¡ |  tj ttdƒj	ƒttdƒj
ƒB ¡¡ || _i | _d| _| jD ]j\}}}}|du rn|  ¡  qP|  |  |d ¡|t| |ƒ¡}|| j|< |dv r¨| d¡ |durP| |¡ qP| jr4t  d| ¡| _| j tj ttdƒjƒttdƒjƒB ¡¡ | j t  tdƒjtdƒj¡¡ |  | j¡}	|	  d¡ t! | |¡ dS )	z9coordinates: should we show the coordinates on the right?úQtCore.Qt.ToolBarAreaNú.png)ÚzoomÚpanTÚ úQtCore.Qt.AlignmentFlagúQtWidgets.QSizePolicy.Policy)"r   ÚQToolBarrY   ÚsetAllowedAreasr   rH   ÚToolBarArear   r   ÚTopToolBarAreaÚBottomToolBarAreaÚcoordinatesÚ_actionsÚ_subplot_dialogÚ	toolitemsZaddSeparatorZ	addActionÚ_iconr   ÚsetCheckableÚ
setToolTipÚQLabelÚlocLabelÚsetAlignmentÚAlignmentFlagÚ
AlignRightÚAlignVCenterÚsetSizePolicyÚQSizePolicyÚ	ExpandingÚIgnoredÚ	addWidgetZ
setVisibler	   )
rZ   rú   r  r  ÚtextZtooltip_textÚ
image_fileÚcallbackÚaZlabelActionr"   r"   r#   rY   {  sD    
ÿÿ

ÿ

ÿÿ
þ
zNavigationToolbar2QT.__init__c                 C   s’   |  dd¡}t tt d|¡ƒ¡}t|t| ƒƒ |  ¡  	|  
¡ ¡ ¡ dk rˆ|  ¡  	|  ¡ ¡}| t d¡tdƒj¡}| |¡ | |¡ t |¡S )z—
        Construct a `.QIcon` from an image file *name*, including the extension
        and relative to Matplotlib's "images" data directory.
        r  z
_large.pngZimagesé€   rà   zQtCore.Qt.MaskMode)rÀ   r   ZQPixmaprô   r   rõ   r   r   r†   râ   ZbackgroundRoleÚvalueZforegroundRoleZcreateMaskFromColorr…   r   ZMaskOutColorZfillZsetMaskr÷   )rZ   r  ZpmZ
icon_colorÚmaskr"   r"   r#   r   £  s    þ

zNavigationToolbar2QT._iconc                    sà   | j j ¡ }|s*tj | j  ¡ dd¡ d S t|ƒdkr>|\}n’dd„ |D ƒ‰ ‡ fdd„ˆ D ƒ}t|ƒD ]2\}}ˆ | |v rfˆ |  dt	|ƒd›d	7  < qftj
 | j  ¡ d
dˆ dd¡\}}|sÂd S |ˆ  |¡ }t || ¡ d S )NÚErrorzThere are no axes to edit.r   c              	   S   s^   g | ]V}|  ¡ pX| ¡ pX| d ¡pX| d¡pXd td| ¡ | ¡ gƒ¡pXdt|ƒj› d‘qS )r-   r.   z - Nz<anonymous ú>)Z	get_labelZ	get_titlerÉ   ÚfilterZ
get_xlabelZ
get_ylabelrT   ru   )r   Úaxr"   r"   r#   r?   ½  s   úÿþýüz8NavigationToolbar2QT.edit_parameters.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡d kr|‘qS )r   )Úcount)r   r
  ©Ztitlesr"   r#   r?   Å  s   z (id: z#xú)r  zSelect axes:r   F)rú   rz   Zget_axesr   ÚQMessageBoxZwarningr  ÚlenÚ	enumerateÚidZQInputDialogZgetItemrW   ÚfigureoptionsZfigure_edit)rZ   Zaxesr8  Zduplicate_titlesÚiÚitemÚokr"   r:  r#   r  ´  s2    ÿù
ÿ 
þz$NavigationToolbar2QT.edit_parametersc                 C   sH   d| j v r"| j d  | jjdk¡ d| j v rD| j d  | jjdk¡ d S )Nr  ZPANr  ZZOOM)r  Ú
setCheckedÚmoder  rn   r"   r"   r#   Ú_update_buttons_checkedÒ  s    

z,NavigationToolbar2QT._update_buttons_checkedc                    s   t ƒ j|Ž  |  ¡  d S rg   )r;   r  rF  r  rk   r"   r#   r  Ù  s    zNavigationToolbar2QT.panc                    s   t ƒ j|Ž  |  ¡  d S rg   )r;   r  rF  r  rk   r"   r#   r  Ý  s    zNavigationToolbar2QT.zoomc                 C   s"   | j  |¡ | jr| j |¡ d S rg   )Úmessagerî   r  r$  ÚsetText©rZ   Úsr"   r"   r#   Úset_messageá  s    z NavigationToolbar2QT.set_messagec                 C   sJ   | j jjj}|| }|| }dd„ |||| || fD ƒ}| j  |¡ d S )Nc                 S   s   g | ]}t |ƒ‘qS r"   )rÎ   )r   Úvalr"   r"   r#   r?   ê  r~   z8NavigationToolbar2QT.draw_rubberband.<locals>.<listcomp>)rú   rz   r    r¡   ré   )rZ   rŠ   rå   rç   ræ   rè   r¡   rØ   r"   r"   r#   Údraw_rubberbandæ  s
    z$NavigationToolbar2QT.draw_rubberbandc                 C   s   | j  d ¡ d S rg   )rú   ré   rn   r"   r"   r#   Úremove_rubberbandí  s    z&NavigationToolbar2QT.remove_rubberbandc                    sP   ˆ j d u r6tˆ jjˆ j ¡ ƒˆ _ ˆ j d‡ fdd„¡ ˆ j  ¡  ˆ j  ¡  ˆ j S )Nrò   c                    s
   ˆ j  ¡ S rg   )r  Zreject)Úern   r"   r#   r}   õ  r~   z9NavigationToolbar2QT.configure_subplots.<locals>.<lambda>)r  ÚSubplotToolQtrú   rz   r  Zmpl_connectÚupdate_from_current_subplotparsrý   rn   r"   rn   r#   Úconfigure_subplotsð  s    
ÿÿ

z'NavigationToolbar2QT.configure_subplotsc              
   G   s6  | j  ¡ }t| ¡ ƒ}| j  ¡ }tj tj	d ¡}tj 
|| j  ¡ ¡}g }d }|D ]>\}	}
d 
dd„ |
D ƒ¡}d|	|f }||
v r†|}| |¡ qRd 
|¡}t | j  ¡ d|||¡\}}|r2|dkrØtj |¡tj	d< z| j j |¡ W nF ty0 } z,tj | d	t|ƒtjjtjj¡ W Y d }~n
d }~0 0 d S )
Nzsavefig.directoryú c                 S   s   g | ]}d | ‘qS )z*.%sr"   )r   Zextr"   r"   r#   r?     r~   z4NavigationToolbar2QT.save_figure.<locals>.<listcomp>z%s (%s)z;;zChoose a filename to save tor  zError saving file)rú   Zget_supported_filetypes_groupedÚsortedÚitemsZget_default_filetypeÚosÚpathÚ
expanduserrE   r  rÉ   Zget_default_filenameÚappendr   Z_getSaveFileNamer  Údirnamerz   ZsavefigrÝ   r   r<  Zcriticalrô   ZOkZNoButton)rZ   r[   Z	filetypesZsorted_filetypesZdefault_filetypeZ	startpathrr   ÚfiltersZselectedFilterr  ZextsZ	exts_listr7  ÚfnamerO  r"   r"   r#   Úsave_figureú  s8    


þ
þz NavigationToolbar2QT.save_figurec                 C   s\   | j jdk}| j jt| j jƒd k }d| jv r>| jd  |¡ d| jv rX| jd  |¡ d S )Nr   r   Zbackr³   )Z
_nav_stackZ_posr=  Z	_elementsr  Z
setEnabled)rZ   Zcan_backwardZcan_forwardr"   r"   r#   Úset_history_buttons  s    

z(NavigationToolbar2QT.set_history_buttons)T)ru   rP   rv   r   rð   rô   rG  r	   r  r'   rW   rY   r   r  rF  r  r  rK  rM  rN  rR  r]  r^  rx   r"   r"   rk   r#   r  q  s$   

ý
(
r  c                       sD   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z‡  Z	S )rP  c                    s’  t ƒ  ¡  |  t tt d¡ƒ¡¡ |  d¡ i | _	t
 ¡ }|  |¡ dg d¢d| jfgfdddgd	| jfd
| jfd| jfgffD ]ð\}}}t
 ¡ }| |¡ t
 |¡}| |¡ t
 |¡}	|D ]Z}
t
 ¡  | j	|
< }| dd¡ | d¡ | d¡ | d¡ |j | j¡ |	 |
|¡ qÀ| d¡ |D ]F\}
}t
  |
¡}| !d¡ |j" |¡ | |¡ |
dkr*| #¡  q*q‚|| _$i | _%d | _&|  '¡  d S )Nzimages/matplotlib.pngZSubplotToolZBorders)ÚtopÚbottomr-   r.   zExport valuesZSpacingsZhspaceZwspacezTight layoutZResetZCloser   r   rá   g{®Gázt?F)(r;   rY   rö   r   r÷   rô   r   rõ   ZsetObjectNameÚ
_spinboxesr   ZQHBoxLayoutÚ	setLayoutÚ_export_valuesÚ_tight_layoutÚ_resetr  ÚQVBoxLayoutZ	addLayoutZ	QGroupBoxr-  ZQFormLayoutZQDoubleSpinBoxÚsetRangeZsetDecimalsZsetSingleStepZsetKeyboardTrackingZvalueChangedrJ   Ú_on_value_changedZaddRowZ
addStretchZQPushButtonZsetAutoDefaultÚclickedrþ   Ú_figureÚ	_defaultsÚ_export_values_dialogrQ  )rZ   Z	targetfigr  Zmain_layoutÚgroupÚ	spinboxesZbuttonsÚlayoutZboxÚinnerr  ÚspinboxÚmethodr¦   rk   r"   r#   rY   #  sZ    
ÿ


þþþü	











zSubplotToolQt.__init__c                    s&   ‡ fdd„ˆ j  ¡ D ƒˆ _ˆ  ¡  d S )Nc                    s    i | ]\}}|t ˆ jj|ƒ“qS r"   )r   rj  Úsubplotpars)r   r  rq  rn   r"   r#   r$   P  s   ÿzASubplotToolQt.update_from_current_subplotpars.<locals>.<dictcomp>)ra  rU  rk  re  rn   r"   rn   r#   rQ  O  s    
ÿz-SubplotToolQt.update_from_current_subplotparsc                 C   s¦   t  ¡ | _t  ¡ }| j |¡ t  ¡ }| d¡ | |¡ | d 	dd„ | j
 ¡ D ƒ¡¡ | ¡ }| t | ¡  ¡ ¡ d| ¡ ¡ ¡ d ¡ | |¡ | j ¡  d S )NTz,
c                 s   s&   | ]\}}|› d |  ¡ d›V  qdS )ú=z.3N©r3  ©r   Úattrrq  r"   r"   r#   rS   ^  s   ÿz/SubplotToolQt._export_values.<locals>.<genexpr>r   é   )r   ÚQDialogrl  rf  rb  ZQPlainTextEditZsetReadOnlyr-  ZsetPlainTextrÉ   ra  rU  ZmaximumSizeZ	setHeightr   ZQFontMetricsZdocumentZdefaultFontr‡   ZtoPlainTextr¡   ZsetMaximumSizerý   )rZ   ro  r.  r‡   r"   r"   r#   rc  T  s*    



ÿÿÿÿÿ
zSubplotToolQt._export_valuesc                 C   sx   | j }dD ]<\}}||  ||  ¡ d ¡ ||  ||  ¡ d ¡ q
| jjf i dd„ | ¡ D ƒ¤Ž | jj ¡  d S )N))r`  r_  )r-   r.   gü©ñÒMbP?c                 S   s   i | ]\}}||  ¡ “qS r"   ru  rv  r"   r"   r#   r$   p  r~   z3SubplotToolQt._on_value_changed.<locals>.<dictcomp>)	ra  Z
setMinimumr3  Z
setMaximumrj  Zsubplots_adjustrU  rú   rÕ   )rZ   rn  rÈ   Zhigherr"   r"   r#   rh  i  s    
ÿzSubplotToolQt._on_value_changedc                 C   sX   | j  ¡  | j ¡ D ]2\}}| d¡ | t| j jƒ| ¡ | d¡ q| j j 	¡  d S )NTF)
rj  Ztight_layoutra  rU  ÚblockSignalsÚsetValueÚvarsrs  rú   rÕ   )rZ   rw  rq  r"   r"   r#   rd  s  s    

zSubplotToolQt._tight_layoutc                 C   sJ   | j  ¡ D ]2\}}| dd¡ | d¡ | |¡ | d¡ q
|  ¡  d S )Nr   r   TF)rk  rU  rg  rz  r{  rh  )rZ   rq  r3  r"   r"   r#   re  {  s    

zSubplotToolQt._reset)
ru   rP   rv   rY   rQ  rc  rh  rd  re  rx   r"   r"   rk   r#   rP  "  s   ,
rP  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )r  c                 C   s²   t  | |¡ tj | |¡ |  tj tt	dƒj
ƒtt	dƒjƒB ¡¡ t d¡}| tj tt	dƒjƒtt	dƒjƒB ¡¡ | t t	dƒjt	dƒj¡¡ |  |¡| _i | _i | _d S )Nr  r  r  r  )r   rY   r   r  r  r   rH   r  r   r   r  r  r#  r%  r&  r'  r(  r)  r*  r+  r,  r-  Ú_message_actionÚ
_toolitemsÚ_groups)rZ   rü   r  Zmessage_labelr"   r"   r#   rY   …  s(    
ÿÿ

ÿÿþzToolbarQt.__init__c           	         s¤   t  ˆ¡}|r | t ˆ|¡¡ | ˆ ¡ |r8| |¡ ‡ ‡fdd„}|rb| d¡ |j 	|¡ n|j
 	|¡ ˆj ˆ g ¡ ˆ |ˆ ||¡ ˆjˆ   ||f¡ d S )Nc                      s   ˆ  ˆ ¡ d S rg   )Ztrigger_toolr"   ©r  rZ   r"   r#   Úhandler¡  s    z'ToolbarQt.add_toolitem.<locals>.handlerT)r   ZQToolButtonZsetIconr  r   rH  r"  r!  ÚtoggledrJ   ri  r~  Ú
setdefaultÚ_add_to_grouprY  )	rZ   r  rm  rž   r/  ZdescriptionZtoggler¦   r  r"   r€  r#   Úadd_toolitem—  s    



zToolbarQt.add_toolitemc           	      C   sV   | j  |g ¡}|s(|  | j¡}| |¡ || }|  ||¡}| ||¡ || j |< d S rg   )r  r¥   ZinsertSeparatorr}  rY  ZinsertWidgetr'   )	rZ   rm  r  r¦   rž   ZgrÚsepZbeforeZwidgetr"   r"   r#   r„  ­  s    
zToolbarQt._add_to_groupc                 C   sH   || j vrd S | j | D ]*\}}|j |¡ | |¡ |j |¡ qd S rg   )r~  r‚  Z
disconnectrD  rJ   )rZ   r  r‚  r¦   r  r"   r"   r#   Útoggle_toolitem·  s    

zToolbarQt.toggle_toolitemc                 C   s*   | j | D ]\}}| d ¡ q
| j |= d S rg   )r~  Z	setParent)rZ   r  r¦   r  r"   r"   r#   Úremove_toolitem¿  s    zToolbarQt.remove_toolitemc                 C   s   |   | j¡ |¡ d S rg   )ZwidgetForActionr}  rH  rI  r"   r"   r#   rK  Ä  s    zToolbarQt.set_messageN)	ru   rP   rv   rY   r…  r„  r‡  rˆ  rK  r"   r"   r"   r#   r  „  s   
r  c                   @   s   e Zd Zdd„ ZdS )ÚConfigureSubplotsQtc                 G   s   t  |  ¡ ¡ d S rg   )r  rR  Ú"_make_classic_style_pseudo_toolbarr  r"   r"   r#   ÚtriggerÉ  s    ÿzConfigureSubplotsQt.triggerN©ru   rP   rv   r‹  r"   r"   r"   r#   r‰  È  s   r‰  c                   @   s   e Zd Zdd„ ZdS )ÚSaveFigureQtc                 G   s   t  |  ¡ ¡ d S rg   )r  r]  rŠ  r  r"   r"   r#   r‹  Ï  s    ÿzSaveFigureQt.triggerNrŒ  r"   r"   r"   r#   r  Î  s   r  z3.5ZToolSetCursor)Zalternativec                   @   s   e Zd Zdd„ ZdS )ÚSetCursorQtc                 C   s   t  |  ¡ |¡ d S rg   )r  r“   rŠ  r’   r"   r"   r#   r“   Ö  s    ÿzSetCursorQt.set_cursorN)ru   rP   rv   r“   r"   r"   r"   r#   rŽ  Ô  s   rŽ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRubberbandQtc                 C   s   t  |  ¡ d ||||¡ d S rg   )r  rM  rŠ  )rZ   rå   rç   ræ   rè   r"   r"   r#   rM  Ü  s    ÿzRubberbandQt.draw_rubberbandc                 C   s   t  |  ¡ ¡ d S rg   )r  rN  rŠ  rn   r"   r"   r#   rN  à  s    ÿzRubberbandQt.remove_rubberbandN)ru   rP   rv   rM  rN  r"   r"   r"   r#   r  Û  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚHelpQtc                 G   s   t j d d|  ¡ ¡ d S )NZHelp)r   r<  ZinformationZ_get_help_htmlr  r"   r"   r#   r‹  æ  s    zHelpQt.triggerNrŒ  r"   r"   r"   r#   r  å  s   r  c                   @   s   e Zd Zdd„ ZdS )ÚToolCopyToClipboardQTc                 O   s   | j  ¡ }t ¡  |¡ d S rg   )rú   ZgrabrB   Z	clipboardZ	setPixmap)rZ   r[   r\   Zpixmapr"   r"   r#   r‹  ë  s    
zToolCopyToClipboardQT.triggerNrŒ  r"   r"   r"   r#   r‘  ê  s   r‘  c                   @   s    e Zd ZeZeZedd„ ƒZdS )Ú
_BackendQTc                   C   s6   t tƒ t t¡ W d   ƒ n1 s(0    Y  d S rg   )r   rB   r   rÏ   r"   r"   r"   r#   Úmainloopü  s    
z_BackendQT.mainloopN)	ru   rP   rv   ry   ZFigureCanvasrñ   ZFigureManagerÚstaticmethodr“  r"   r"   r"   r#   r’  ÷  s   r’  )Urc   rê   rV  Úsignalr´   rÞ   rA   rE   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.backend_basesr   r   r   r	   r
   r   r   r   Z+matplotlib.backends.qt_editor.figureoptionsZbackendsZ	qt_editorr@  r  r   r   r   r   r   r   r   r   r   r   r   r   Zbackend_versionÚplatformr¿   rÃ   ZMOVEZHANDZPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICALr‘   rB   rL   re   rf   rX   ry   ZQMainWindowrì   rñ   r  r  ry  rP  r  ZConfigureSubplotsBaser‰  ZSaveFigureBaser  Z
deprecatedZSetCursorBaserŽ  ZRubberbandBaser  ZToolHelpBaser  ZToolCopyToClipboardBaser‘  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZexportr’  r"   r"   r"   r#   Ú<module>   sº   (4Úÿ-ý
ùÿ#(  ${ 2bD
