B
    ]”t\¢  ã            D   @   sF  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 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 d dlmZ dd	lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% e$Z&ej'j(d
ej'j)dej'j*dej'j+dej'j,dej'j-dej'j.dej'j/dej'j0dej'j1dej'j2dej'j3dej'j4dej'j5dej'j6dej'j7dej'j8dej'j9dej'j:dej'j;dej'j<dej'j=dej'j>d ej'j?d!ej'j@d"ej'jAd#ej'jBd$ej'jCd%ej'jDdej'jEd&ej'jFd'ej'jGd(ej'jHd)ej'jId*i"ZJd ZKdZLd+ZMd,ZNdej'jOej'j+fdej'jPej'j*fd-ej'jQej'j(fdej'jRej'j)fgZSejTd.kršeJ Uej'j(d/ej'j+d
i¡ d/ej'jQej'j(feSd < d-ej'jOej'j+feSd+< ejVej'jWejXej'jYejZej'j[ej\ej'j]ej^ej'j_iZ`daad0d1„ Zbd2d3„ ZcG d4d5„ d5eƒZdG d6d7„ d7e!jeeƒZfG d8d9„ d9e!jgƒZhG d:d;„ d;eƒZiG d<d=„ d=ee!jjƒZkG d>d?„ d?eƒZlG d@dA„ dAee!jjƒZmG dBdC„ dCee!jnƒZoG dDdE„ dEejpƒZqG dFdG„ dGejrƒZsG dHdI„ dIejtƒZuG dJdK„ dKejvƒZwG dLdM„ dMejxƒZyG dNdO„ dOejzƒZ{ese_|eqe_}eue_~ewe_eye_€e{e_e ‚dP¡dWdQdR„ƒZƒe ‚dP¡dSdT„ ƒZ„ej…G dUdV„ dVeƒƒZ†dS )Xé    N)Úbackend_toolsÚcbook)ÚGcf)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚNavigationToolbar2Ú	TimerBaseÚcursorsÚToolContainerBaseÚStatusbarBase)ÚUiSubplotTool)ÚFigure)ÚToolManageré   )ÚQtCoreÚQtGuiÚ	QtWidgetsÚ_getSaveFileNameÚis_pyqt5Ú__version__ÚQT_APIZcontrolÚshiftZaltÚsuperZenterÚleftZupÚrightZdownÚescapeÚf1Úf2Zf3Zf4Zf5Zf6Zf7Zf8Zf9Zf10Zf11Zf12ÚhomeÚendZpageupZpagedownZtabZ	backspaceÚinsertÚdeleteÚpauseZsysreqÚclearé   é   ZctrlÚdarwinÚcmdc              C   sæ   t dkr¦tj ¡ } | dkr¢tƒ rPyddlm} d}W qZ tk
rL   d}Y qZX n
tt	dƒ}|r†t
j d¡}|dks~t d|¡s†td	ƒ‚t d
g¡a t j t j¡ n| a tƒ rây t  tjj¡ t  tjj¡ W n tk
rà   Y nX dS )zJ
    Only one qApp can exist at a time, so check before creating one.
    Nr   )ÚQtX11ExtrasTFZQX11InfoZDISPLAYz:\dzInvalid DISPLAY variables
   matplotlib)ÚqAppr   ÚQApplicationÚinstancer   ÚPyQt5r)   ÚImportErrorÚhasattrr   ÚosÚenvironÚgetÚreÚsearchÚRuntimeErrorZlastWindowClosedÚconnectÚquitÚsetAttributer   ÚQtZAA_UseHighDpiPixmapsZAA_EnableHighDpiScalingÚAttributeError)Zappr)   Zis_x11_buildZdisplay© r;   ú>lib/python3.7/site-packages/matplotlib/backends/backend_qt5.pyÚ_create_qAppc   s.    

r=   c                s@   t dkrˆ S tjj‰‡fdd„‰t ˆ ¡‡ ‡fdd„ƒ}|S dS )zT
    Decorator for ``__init__`` to allow ``super().__init__`` on PyQt4/PySide2.
    r-   c                sN   ˆ | ƒ t | ƒj}tdd„ || tj¡d d … D ƒƒ}|j| f|ž|Ž d S )Nc             s   s&   | ]}|j  d ¡d dkr|V  qdS )Ú.r   )ZPyQt4ZsipZPySideZPySide2ZShibokenN)Ú
__module__Úsplit)Ú.0Ú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          	      s0   t jtjˆd ˆ | f|ž|Ž W d Q R X d S )N)rI   )r   Ú_setattr_cmr   rH   )rJ   rK   rL   )rI   rO   r;   r<   Úwrapper¥   s    
z"_allow_super_init.<locals>.wrapperN)r   r   rH   rI   Ú	functoolsÚwraps)rI   rQ   r;   )rI   rO   rN   r<   Ú_allow_super_init‡   s    	rT   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTimerQTaM  
    Subclass of :class:`backend_bases.TimerBase` that uses Qt timer events.

    Attributes
    ----------
    interval : int
        The time between timer events in milliseconds. Default is 1000 ms.
    single_shot : bool
        Boolean flag indicating whether this timer should
        operate as single shot (run once and then stop). Defaults to False.
    callbacks : list
        Stores list of (func, args) tuples that will be called upon timer
        events. This list can be manipulated directly, or the functions
        `add_callback` and `remove_callback` can be used.

    c             O   s8   t j| f|ž|Ž t ¡ | _| jj | j¡ |  ¡  d S )N)	r	   rI   r   ÚQTimerÚ_timerÚtimeoutr6   Z	_on_timerÚ_timer_set_interval)rJ   rK   rL   r;   r;   r<   rI   À   s    
zTimerQT.__init__c             C   s   | j  | j¡ d S )N)rW   ZsetSingleShotZ_single)rJ   r;   r;   r<   Ú_timer_set_single_shotÉ   s    zTimerQT._timer_set_single_shotc             C   s   | j  | j¡ d S )N)rW   ZsetIntervalZ	_interval)rJ   r;   r;   r<   rY   Ì   s    zTimerQT._timer_set_intervalc             C   s   | j  ¡  d S )N)rW   Ústart)rJ   r;   r;   r<   Ú_timer_startÏ   s    zTimerQT._timer_startc             C   s   | j  ¡  d S )N)rW   Ústop)rJ   r;   r;   r<   Ú_timer_stopÒ   s    zTimerQT._timer_stopN)	Ú__name__r?   Ú__qualname__Ú__doc__rI   rZ   rY   r\   r^   r;   r;   r;   r<   rU   ®   s   	rU   c                   sZ  e Zd ZejjdejjdejjdiZe	‡ fdd„ƒZ
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dd„ Zdd„ Zdd„ Zeƒ r dd„ Zndd„ Zdd „ Zd!d"„ Zee d#d$¡d%d&„ ƒƒZeje d#d$¡d'd&„ ƒƒZd(d)„ Zd*d+„ Z d,d-„ Z!d.d/„ Z"d0d1„ Z#d2d3„ Z$dBd5d6„Z%dCd8d9„Z&‡ fd:d;„Z'd<d=„ Z(d>d?„ Z)d@dA„ Z*‡  Z+S )DÚFigureCanvasQTr   r%   r&   c                s”   t ƒ  tƒ j|d || _|j|_|  ¡  d | _d| _d| _	d| _
dd„ | _|  tjj¡ |  d¡ | j|  ¡ Ž  d| _t tjj¡}|  |¡ d S )N)ÚfigureFc             S   s   d S )Nr;   )Úpainterr;   r;   r<   Ú<lambda>ö   s    z)FigureCanvasQT.__init__.<locals>.<lambda>T)r=   r   rI   rc   ÚdpiÚ_original_dpiÚ_update_figure_dpiÚ_dpi_ratio_prevÚ_draw_pendingÚ_erase_before_paintÚ_is_drawingÚ_draw_rect_callbackr8   r   r9   ZWA_OpaquePaintEventZsetMouseTrackingÚresizeÚget_width_heightÚ_keyautorepeatr   ZQPaletteZwhiteZ
setPalette)rJ   rc   Zpalette)Ú	__class__r;   r<   rI   à   s     

zFigureCanvasQT.__init__c             C   s"   | j | jj }| jj|dd d S )NF)Úforward)Ú
_dpi_ratiorc   rg   Z_set_dpi)rJ   rf   r;   r;   r<   rh     s    z!FigureCanvasQT._update_figure_dpic             C   s&   y|   ¡ pdS  tk
r    dS X d S )Nr   )ZdevicePixelRatior:   )rJ   r;   r;   r<   rs     s    zFigureCanvasQT._dpi_ratioc             C   sB   | j | jkr>|  ¡  | j | _t |  ¡ |  ¡ ¡}|  |¡ dS dS )NTF)rs   ri   rh   r   ZQResizeEventÚsizeÚresizeEvent)rJ   Úeventr;   r;   r<   Ú_update_dpi  s    
zFigureCanvasQT._update_dpic             C   s*   t  | ¡\}}t|| j ƒt|| j ƒfS )N)r   ro   Úintrs   )rJ   ÚwÚhr;   r;   r<   ro   "  s    zFigureCanvasQT.get_width_heightc             C   sL   y|   | ¡ ¡\}}W n tk
r2   d  }}Y nX tj| |||fd d S )N)ÚguiEventZxy)ÚmouseEventCoordsÚposr:   r   Zenter_notify_event)rJ   rv   ÚxÚyr;   r;   r<   Ú
enterEvent&  s
    zFigureCanvasQT.enterEventc             C   s   t j ¡  tj| |d d S )N)r{   )r   r+   ZrestoreOverrideCursorr   Zleave_notify_event)rJ   rv   r;   r;   r<   Ú
leaveEvent.  s    
zFigureCanvasQT.leaveEventc             C   s4   | j }| ¡ }| jjj| | ¡  }|| || fS )aA  Calculate mouse coordinates in physical pixels

        Qt5 use 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.

        )rs   r~   rc   ÚbboxÚheightr   )rJ   r}   Z	dpi_ratior~   r   r;   r;   r<   r|   2  s    
zFigureCanvasQT.mouseEventCoordsc             C   sB   |   | ¡ ¡\}}| j | ¡ ¡}|d k	r>tj| ||||d d S )N)r{   )r|   r}   Úbuttondr2   Úbuttonr   Úbutton_press_event)rJ   rv   r~   r   r…   r;   r;   r<   ÚmousePressEventB  s
    zFigureCanvasQT.mousePressEventc             C   sD   |   | ¡ ¡\}}| j | ¡ ¡}|d k	r@tj| |||d|d d S )NT)Zdblclickr{   )r|   r}   r„   r2   r…   r   r†   )rJ   rv   r~   r   r…   r;   r;   r<   ÚmouseDoubleClickEventI  s    
z$FigureCanvasQT.mouseDoubleClickEventc             C   s$   |   |¡\}}tj| |||d d S )N)r{   )r|   r   Zmotion_notify_event)rJ   rv   r~   r   r;   r;   r<   ÚmouseMoveEventQ  s    zFigureCanvasQT.mouseMoveEventc             C   s>   |   |¡\}}| j | ¡ ¡}|d k	r:tj| ||||d d S )N)r{   )r|   r„   r2   r…   r   Zbutton_release_event)rJ   rv   r~   r   r…   r;   r;   r<   ÚmouseReleaseEventU  s
    z FigureCanvasQT.mouseReleaseEventc             C   sh   |   |¡\}}| ¡  ¡ dkr@| ¡  ¡ dkr@| ¡  ¡ d }n| ¡  ¡ }|rdtj| ||||d d S )Nr   éx   )r{   )r|   Z
pixelDeltar~   r   Z
angleDeltar   Úscroll_event)rJ   rv   r~   r   Ústepsr;   r;   r<   Ú
wheelEvent]  s     zFigureCanvasQT.wheelEventc             C   sN   |  ¡ }| jjj| ¡  }| ¡ d }| ¡ tjj	krJt
j| ||||d d S )Nr‹   )r{   )r~   rc   r‚   rƒ   r   ZdeltaZorientationr   r9   ZVerticalr   rŒ   )rJ   rv   r~   r   r   r;   r;   r<   rŽ   h  s    c             C   s&   |   |¡}|d k	r"tj| ||d d S )N)r{   )Ú_get_keyr   Zkey_press_event)rJ   rv   Úkeyr;   r;   r<   ÚkeyPressEventr  s    
zFigureCanvasQT.keyPressEventc             C   s&   |   |¡}|d k	r"tj| ||d d S )N)r{   )r   r   Zkey_release_event)rJ   rv   r   r;   r;   r<   ÚkeyReleaseEventw  s    
zFigureCanvasQT.keyReleaseEventz3.0zDManually check `event.guiEvent.isAutoRepeat()` in the event handler.c             C   s   | j S )z=
        If True, enable auto-repeat for key events.
        )rp   )rJ   r;   r;   r<   ÚkeyAutoRepeat|  s    zFigureCanvasQT.keyAutoRepeatc             C   s   t |ƒ| _d S )N)Úboolrp   )rJ   Úvalr;   r;   r<   r“   …  s    c             C   sx   | j d krd S | ¡  ¡ | j }| ¡  ¡ | j }| jj}|| }|| }| jj||dd tj	 
| |¡ t | ¡ d S )NF)rr   )ri   rt   Úwidthrs   rƒ   rc   rf   Zset_size_inchesr   rH   ru   r   Zresize_event)rJ   rv   ry   rz   ZdpivalZwinchZhinchr;   r;   r<   ru   ‹  s    
zFigureCanvasQT.resizeEventc             C   s   |   ¡ \}}t ||¡S )N)ro   r   ÚQSize)rJ   ry   rz   r;   r;   r<   ÚsizeHint›  s    zFigureCanvasQT.sizeHintc             C   s   t  dd¡S )Né
   )r   r—   )rJ   r;   r;   r<   ÚminumumSizeHintŸ  s    zFigureCanvasQT.minumumSizeHintc                s¨   | j s| ¡ rd S | ¡ ‰ t| ¡ ƒ‰‡ ‡fdd„tD ƒ}ytˆ  }W nH tk
rŽ   d}ˆ |krfd S tˆ ƒ}d|kr‚| 	d¡ n| 
¡ }Y nX | ¡  d ||g ¡S )Nc                s*   g | ]"\}}}ˆ |krˆ|@ |kr|‘qS r;   r;   )rA   ÚnameZmod_keyZqt_key)Ú	event_keyÚ
event_modsr;   r<   ú
<listcomp>¬  s    z+FigureCanvasQT._get_key.<locals>.<listcomp>iÿÿ r   ú+)rp   ZisAutoRepeatr   rx   Z	modifiersÚMODIFIER_KEYSÚSPECIAL_KEYSÚKeyErrorÚchrÚremoveÚlowerÚreverseÚjoin)rJ   rv   Zmodsr   ZMAX_UNICODEr;   )rœ   r   r<   r   ¢  s"    zFigureCanvasQT._get_keyc             O   s
   t ||ŽS )a  
        Creates a new backend-specific subclass of
        :class:`backend_bases.Timer`.  This is useful for getting
        periodic events through the backend's native event
        loop. Implemented only for backends with GUIs.

        Other Parameters
        ----------------
        interval : scalar
            Timer interval in milliseconds

        callbacks : list
            Sequence of (func, args, kwargs) where ``func(*args, **kwargs)``
            will be executed by the timer every *interval*.

        )rU   )rJ   rK   rL   r;   r;   r<   Ú	new_timerÇ  s    zFigureCanvasQT.new_timerc             C   s   t  ¡  d S )N)r*   ZprocessEvents)rJ   r;   r;   r<   Úflush_eventsÚ  s    zFigureCanvasQT.flush_eventsr   c             C   sN   t | dƒr| j ¡ rtdƒ‚t ¡  | _}|rBtj |d |j¡}| 	¡  d S )NÚ_event_loopzEvent loop already runningiè  )
r/   rª   Z	isRunningr5   r   Z
QEventLooprV   Ú
singleShotr7   Úexec_)rJ   rX   Z
event_loopZtimerr;   r;   r<   Ústart_event_loopÝ  s    zFigureCanvasQT.start_event_loopNc             C   s   t | dƒr| j ¡  d S )Nrª   )r/   rª   r7   )rJ   rv   r;   r;   r<   Ústop_event_loopå  s    
zFigureCanvasQT.stop_event_loopc          	      s@   | j r
dS tj| dd tƒ  ¡  W dQ R X d| _|  ¡  dS )z>Render the figure, and queue a request for a Qt draw.
        NT)rl   )rl   r   rP   r   Údrawrk   Úupdate)rJ   )rq   r;   r<   r¯   é  s    zFigureCanvasQT.drawc             C   s&   | j s"| js"d| _ tj d| j¡ dS )zBQueue redraw of the Agg buffer and request Qt paintEvent.
        Tr   N)rj   rl   r   rV   r«   Ú
_draw_idle)rJ   r;   r;   r<   Ú	draw_idleõ  s    zFigureCanvasQT.draw_idlec             C   sd   |   ¡ dk s|  ¡ dk rd| _| js(d S z.y|  ¡  W n tk
rR   t ¡  Y nX W d d| _X d S )Nr   F)rƒ   r–   rj   r¯   Ú	ExceptionÚ	tracebackÚ	print_exc)rJ   r;   r;   r<   r±     s    zFigureCanvasQT._draw_idlec                s2   ˆ d k	r‡ ‡fdd„}ndd„ }|ˆ_ ˆ ¡  d S )Nc                sB   t  tjjdˆj tjj¡}|  |¡ | j‡fdd„ˆ D ƒŽ  d S )Nr   c             3   s   | ]}|ˆ j  V  qd S )N)rs   )rA   Zpt)rJ   r;   r<   rC     s    zLFigureCanvasQT.drawRectangle.<locals>._draw_rect_callback.<locals>.<genexpr>)	r   ZQPenr   r9   Zblackrs   ZDotLineZsetPenZdrawRect)rd   Zpen)ÚrectrJ   r;   r<   rm     s    

z9FigureCanvasQT.drawRectangle.<locals>._draw_rect_callbackc             S   s   d S )Nr;   )rd   r;   r;   r<   rm     s    )rm   r°   )rJ   r¶   rm   r;   )r¶   rJ   r<   ÚdrawRectangle  s
    zFigureCanvasQT.drawRectangle)r   )N),r_   r?   r`   r   r9   Z
LeftButtonZ	MidButtonZRightButtonr„   rT   rI   rh   Úpropertyrs   rw   ro   r€   r   r|   r‡   rˆ   r‰   rŠ   r   rŽ   r‘   r’   r   Ú
deprecatedr“   Úsetterru   r˜   rš   r   r¨   r©   r­   r®   r¯   r²   r±   r·   Ú__classcell__r;   r;   )rq   r<   rb   Ö   sH   !	

%

rb   c               @   s   e Zd Ze ¡ Zdd„ ZdS )Ú
MainWindowc             C   s   | j  ¡  tj | |¡ d S )N)ÚclosingÚemitr   ÚQMainWindowÚ
closeEvent)rJ   rv   r;   r;   r<   rÀ   !  s    
zMainWindow.closeEventN)r_   r?   r`   r   ÚSignalr½   rÀ   r;   r;   r;   r<   r¼     s   r¼   c               @   s`   e Zd Z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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       	      C   sÀ  t  | ||¡ || _tƒ | _| jj |j¡ | jj | j¡ | j 	d| ¡ t
j tjd dd¡}| j t |¡¡ | j tjj¡ | j ¡  d| j_|  ¡ | _|  | j| j¡| _d | _| jrìt | j¡ | jrìt | j¡ t | j| jƒ| _| jd k	rF| j !| j¡ | js6t" #¡ }| j $¡  %|¡ | jj& |j'¡ | j (¡  )¡ }nd}| (¡ }| j $¡  (¡ }| )¡ | | )¡  }| j *| +¡ |¡ | j ,| j¡ t -¡ r²| j .¡  | j /¡  | j 0¡  d S )Nz	Figure %dÚdatapathÚimageszmatplotlib.svgFr   )1r   rI   Úcanvasr¼   Úwindowr½   r6   Zclose_eventÚ_widgetclosedÚsetWindowTitler0   Úpathr§   Ú
matplotlibÚrcParamsÚsetWindowIconr   ÚQIconZsetFocusPolicyr   r9   ZStrongFocusZsetFocusÚ_destroyingÚ_get_toolmanagerÚtoolmanagerÚ_get_toolbarÚtoolbarZ	statusbarr   Zadd_tools_to_managerZadd_tools_to_containerÚStatusbarQtZ
addToolBarr   ÚQLabelÚ	statusBarÚ	addWidgetÚmessageÚsetTextr˜   rƒ   rn   r–   ZsetCentralWidgetZis_interactiveÚshowr²   Úraise_)	rJ   rÅ   ÚnumÚimageZstatusbar_labelZ
tbs_heightZcsZsbsrƒ   r;   r;   r<   rI   5  sJ    	




zFigureManagerQT.__init__c             C   s$   | j  ¡ r| j  ¡  n
| j  ¡  d S )N)rÆ   ZisFullScreenZ
showNormalZshowFullScreen)rJ   r;   r;   r<   Úfull_screen_toggleq  s    
z"FigureManagerQT.full_screen_togglec             C   s>   | j jrd S d| j _yt | j¡ W n tk
r8   Y nX d S )NT)rÆ   rÎ   r   ÚdestroyrÛ   r:   )rJ   r;   r;   r<   rÇ   w  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toolbar2FrÐ   )rÊ   rË   ÚNavigationToolbar2QTÚ	ToolbarQtrÐ   rÆ   )rJ   rÅ   ÚparentrÒ   r;   r;   r<   rÑ   ƒ  s    zFigureManagerQT._get_toolbarc             C   s$   t jd dkrt| jjƒ}nd }|S )NrÒ   rÐ   )rÊ   rË   r   rÅ   rc   )rJ   rÐ   r;   r;   r<   rÏ   Ž  s    z FigureManagerQT._get_toolmanagerc             C   sB   | j  ¡ | j ¡  }| j  ¡ | j ¡  }| j  || || ¡ d S )N)rÆ   r–   rÅ   rƒ   rn   )rJ   r–   rƒ   Zextra_widthZextra_heightr;   r;   r<   rn   •  s    zFigureManagerQT.resizec             C   s"   | j  ¡  | j  ¡  | j  ¡  d S )N)rÆ   rÙ   ZactivateWindowrÚ   )rJ   r;   r;   r<   rÙ   œ  s    

zFigureManagerQT.showc             G   sD   t j ¡ d krd S | jjrd S d| j_| jr6| j ¡  | j ¡  d S )NT)r   r+   r,   rÆ   rÎ   rÒ   rÞ   Úclose)rJ   rK   r;   r;   r<   rÞ   ¡  s    
zFigureManagerQT.destroyc             C   s
   | j  ¡ S )N)rÆ   ZwindowTitle)rJ   r;   r;   r<   Úget_window_title¬  s    z FigureManagerQT.get_window_titlec             C   s   | j  |¡ d S )N)rÆ   rÈ   )rJ   Útitler;   r;   r<   Úset_window_title¯  s    z FigureManagerQT.set_window_titleN)r_   r?   r`   ra   rI   rÝ   rÇ   rÑ   rÏ   rn   rÙ   rÞ   rã   rå   r;   r;   r;   r<   rÂ   &  s   <rÂ   c                   sž   e Zd Ze e¡Zddd„Zdd„ Zdd„ Z	e
ƒ r>‡ f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ß   Tc             C   s6   || _ || _|| _i | _tj | |¡ t | |¡ dS )z; coordinates: should we show the coordinates on the right? N)rÅ   rá   ÚcoordinatesÚ_actionsr   ÚQToolBarrI   r   )rJ   rÅ   rá   ræ   r;   r;   r<   rI   ¶  s    zNavigationToolbar2QT.__init__c             C   sJ   t ƒ r| dd¡}t tj | j|¡¡}t|dƒr@| 	| j
j¡ t |¡S )Nz.pngz
_large.pngÚsetDevicePixelRatio)r   Úreplacer   ÚQPixmapr0   rÉ   r§   Úbasedirr/   ré   rÅ   rs   rÍ   )rJ   r›   Úpmr;   r;   r<   Ú_iconÁ  s    
zNavigationToolbar2QT._iconc             C   sL  t j tjd d¡| _xœ| jD ]’\}}}}|d kr<|  ¡  q|  |  	|d ¡|t
| |ƒ¡}|| j|< |dkrv| d¡ |d k	rˆ| |¡ |dkr|  |  	d¡d| j¡}| d	¡ qW i | _| jrt d
| ¡| _| j tjjtjjB ¡ | j t tjjtjj¡¡ |  | j¡}| d¡ d | _t ƒ rH|  !t "dd¡¡ |  #¡  $d¡ d S )NrÃ   rÄ   z.png)ÚzoomÚpanTZSubplotszqt4_editor_options.pngÚ	Customizez%Edit axis, curve and image parametersÚ é   é   )%r0   rÉ   r§   rÊ   rË   rì   Z	toolitemsÚaddSeparatorZ	addActionrî   Úgetattrrç   ÚsetCheckableÚ
setToolTipÚedit_parametersZbuttonsræ   r   rÔ   ÚlocLabelZsetAlignmentr   r9   Z
AlignRightZAlignTopZsetSizePolicyZQSizePolicyZ	ExpandingZIgnoredrÖ   Z
setVisibleZ
adj_windowr   ZsetIconSizer—   ÚlayoutZ
setSpacing)rJ   ÚtextZtooltip_textÚ
image_fileÚcallbackÚaZlabelActionr;   r;   r<   Ú_init_toolbarÉ  s:    






z"NavigationToolbar2QT._init_toolbarc                s"   t ƒ  ¡ }| td| ¡ ƒ¡ |S )Né0   )r   r˜   Ú	setHeightÚmaxrƒ   )rJ   rt   )rq   r;   r<   r˜   ù  s    
zNavigationToolbar2QT.sizeHintc             C   sÔ   | j j ¡ }|s&tj | jdd¡ d S t|ƒdkr:|\}nŠg }xP|D ]H}| ¡ p€d 	t
d | ¡ | ¡ gƒ¡p€d t|ƒjt|ƒ¡}| |¡ qDW tj | jdd|dd	¡\}}|rÀ|| |¡ }nd S t || ¡ d S )
NÚErrorzThere are no axes to edit.r   z - z<anonymous {} (id: {:#x})>rñ   zSelect axes:r   F)rÅ   rc   Zget_axesr   ÚQMessageBoxÚwarningrá   ÚlenZ	get_titler§   ÚfilterZ
get_xlabelZ
get_ylabelÚformatrD   r_   ÚidÚappendZQInputDialogZgetItemrG   ÚfigureoptionsZfigure_edit)rJ   ZallaxesZaxesZtitlesr›   ÚitemÚokr;   r;   r<   rù   þ  s*    
z$NavigationToolbar2QT.edit_parametersc             C   s0   | j d  | jdk¡ | j d  | jdk¡ d S )Nrð   ZPANrï   ZZOOM)rç   Ú
setCheckedZ_active)rJ   r;   r;   r<   Ú_update_buttons_checked  s    z,NavigationToolbar2QT._update_buttons_checkedc                s   t ƒ j|Ž  |  ¡  d S )N)r   rð   r  )rJ   rK   )rq   r;   r<   rð     s    zNavigationToolbar2QT.panc                s   t ƒ j|Ž  |  ¡  d S )N)r   rï   r  )rJ   rK   )rq   r;   r<   rï   !  s    zNavigationToolbar2QT.zoomc             C   s"   | j  |¡ | jr| j |¡ d S )N)r×   r¾   ræ   rú   rØ   )rJ   Úsr;   r;   r<   Úset_message%  s    z NavigationToolbar2QT.set_messagec             C   s   | j  t| ¡ d S )N)rÅ   Ú	setCursorÚcursord)rJ   Úcursorr;   r;   r<   Ú
set_cursor*  s    zNavigationToolbar2QT.set_cursorc             C   sJ   | j jjj}|| }|| }dd„ |||| || fD ƒ}| j  |¡ d S )Nc             S   s   g | ]}t |ƒ‘qS r;   )rx   )rA   r•   r;   r;   r<   rž   1  s    z8NavigationToolbar2QT.draw_rubberband.<locals>.<listcomp>)rÅ   rc   r‚   rƒ   r·   )rJ   rv   Úx0Úy0Úx1Úy1rƒ   r¶   r;   r;   r<   Údraw_rubberband-  s
    z$NavigationToolbar2QT.draw_rubberbandc             C   s   | j  d ¡ d S )N)rÅ   r·   )rJ   r;   r;   r<   Úremove_rubberband4  s    z&NavigationToolbar2QT.remove_rubberbandc             C   sB   t j tjd dd¡}t| jj| jƒ}| 	t
 |¡¡ | ¡  d S )NrÃ   rÄ   zmatplotlib.png)r0   rÉ   r§   rÊ   rË   ÚSubplotToolQtrÅ   rc   rá   rÌ   r   rÍ   r¬   )rJ   rÜ   Údiar;   r;   r<   Úconfigure_subplots7  s
    z'NavigationToolbar2QT.configure_subplotsc          
   G   s2  | j  ¡ }t| ¡ ƒ}| j  ¡ }tj tj	d ¡}tj 
|| j  ¡ ¡}g }d }xF|D ]>\}	}
d 
dd„ |
D ƒ¡}d|	|f }||
krˆ|}| |¡ qTW d 
|¡}t| jd|||ƒ\}}|r.|dkrÖtj |¡tj	d< y| j j |¡ W nD tk
r, } z$tj | d	t|ƒtjjtjj¡ W d d }~X Y nX d S )
Nzsavefig.directoryú c             S   s   g | ]}d | ‘qS )z*.%sr;   )rA   Úextr;   r;   r<   rž   I  s    z4NavigationToolbar2QT.save_figure.<locals>.<listcomp>z%s (%s)z;;zChoose a filename to save torò   zError saving file)rÅ   Úget_supported_filetypes_groupedÚsortedÚitemsÚget_default_filetyper0   rÉ   Ú
expanduserrÊ   rË   r§   Úget_default_filenamer  r   rá   Údirnamerc   Úsavefigr³   r   r  ÚcriticalÚstrÚOkÚNoButton)rJ   rK   Ú	filetypesÚsorted_filetypesÚdefault_filetypeÚ	startpathr[   ÚfiltersÚselectedFilterr›   ÚextsÚ	exts_listr  ÚfnameÚer;   r;   r<   Úsave_figure>  s6    



z NavigationToolbar2QT.save_figure)T)r_   r?   r`   r   rÁ   r+  r×   rI   rî   r   r   r˜   rù   r  rð   rï   r  r  r  r  r  r8  r»   r;   r;   )rq   r<   rß   ³  s    

,rß   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r  c                sø   t  ˆd ¡ |ˆ_xHdD ]@\‰‰ ˆjˆ j ‡ ‡fdd„¡ ˆjˆ  j ‡‡fdd„¡ qW ddddd	d
gˆ_‡fdd„ˆjD ƒˆ_ˆ ¡  x"ˆjD ]}ˆj| j ˆj	¡ q”W xBdˆj
fdˆjfdˆjfdˆjfgD ]\}}ˆj| j |¡ qÖW d S )N))ÚbottomÚtop)r   r   c                s   ˆj ˆ   | d ¡S )Ngü©ñÒMbP?)Ú_widgetsZ
setMinimum)r•   )ÚhigherrJ   r;   r<   re   h  s    z(SubplotToolQt.__init__.<locals>.<lambda>c                s   ˆj ˆ   | d ¡S )Ngü©ñÒMbP?)r;  Z
setMaximum)r•   )r¥   rJ   r;   r<   re   j  s    r:  r9  r   r   ZhspaceZwspacec                s   i | ]}t ˆ jjƒ| |“qS r;   )ÚvarsÚ_figureÚsubplotpars)rA   Úattr)rJ   r;   r<   ú
<dictcomp>m  s   z*SubplotToolQt.__init__.<locals>.<dictcomp>zExport valueszTight layoutZResetZClose)r   rI   r>  r;  ZvalueChangedr6   Ú_attrsÚ	_defaultsÚ_resetÚ_on_value_changedÚ_export_valuesÚ_tight_layoutrâ   Úclicked)rJ   Z	targetfigrá   r@  ÚactionÚmethodr;   )r<  r¥   rJ   r<   rI   a  s$    

zSubplotToolQt.__init__c                s    t  ¡ }t  ¡ }| |¡ t  ¡ }| d¡ | |¡ | d ‡ fdd„ˆ j	D ƒ¡¡ | 
¡ }| t | ¡  ¡ ¡ d| ¡ ¡ ¡ d ¡ | |¡ | ¡  d S )NTz,
c             3   s$   | ]}d   |ˆ j|  ¡ ¡V  qdS )z{}={:.3}N)r	  r;  Úvalue)rA   r@  )rJ   r;   r<   rC   †  s   z/SubplotToolQt._export_values.<locals>.<genexpr>r   é   )r   ZQDialogZQVBoxLayoutZ	setLayoutZQPlainTextEditZsetReadOnlyrÖ   ZsetPlainTextr§   rB  ZmaximumSizer  r   ZQFontMetricsZdocumentZdefaultFontrt   ZtoPlainTextrƒ   ZsetMaximumSizer¬   )rJ   Zdialogrû   rü   rt   r;   )rJ   r<   rF  |  s    



zSubplotToolQt._export_valuesc                s.   ˆ j jf ‡ fdd„ˆ jD ƒŽ ˆ j j ¡  d S )Nc                s   i | ]}ˆ j |  ¡ |“qS r;   )r;  rK  )rA   r@  )rJ   r;   r<   rA  ’  s   z3SubplotToolQt._on_value_changed.<locals>.<dictcomp>)r>  Zsubplots_adjustrB  rÅ   r²   )rJ   r;   )rJ   r<   rE  ‘  s    zSubplotToolQt._on_value_changedc             C   s^   | j  ¡  xB| jD ]8}| j| }| d¡ | t| j jƒ| ¡ | d¡ qW | j j 	¡  d S )NTF)
r>  Ztight_layoutrB  r;  ZblockSignalsÚsetValuer=  r?  rÅ   r²   )rJ   r@  Úwidgetr;   r;   r<   rG  –  s    


zSubplotToolQt._tight_layoutc             C   s,   x&| j  ¡ D ]\}}| j|  |¡ qW d S )N)rC  r$  r;  rM  )rJ   r@  rK  r;   r;   r<   rD  Ÿ  s    zSubplotToolQt._resetN)r_   r?   r`   rI   rF  rE  rG  rD  r;   r;   r;   r<   r  `  s
   	r  c               @   sH   e Zd Zdd„ Ze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 | |¡ i | _i | _d S )N)r   rI   r   rè   Ú
_toolitemsÚ_groups)rJ   rÐ   rá   r;   r;   r<   rI   ¥  s    zToolbarQt.__init__c             C   s   t ƒ r
dS dS )Nz
_large.pngz.png)r   )rJ   r;   r;   r<   Ú_icon_extension«  s    zToolbarQt._icon_extensionc       	         sž   t  ˆ¡}| ˆ |¡¡ | ˆ ¡ |r2| |¡ ‡ ‡fdd„}|r\| d¡ |j |¡ n|j	 |¡ ˆj
 ˆ g ¡ ˆ |ˆ ||¡ ˆj
ˆ   ||f¡ d S )Nc                  s   ˆ  ˆ ¡ d S )N)Ztrigger_toolr;   )r›   rJ   r;   r<   Úhandlerº  s    z'ToolbarQt.add_toolitem.<locals>.handlerT)r   ZQToolButtonZsetIconrî   rØ   rø   r÷   Útoggledr6   rH  rO  Ú
setdefaultÚ_add_to_groupr  )	rJ   r›   ÚgroupÚpositionrý   ZdescriptionZtoggler…   rR  r;   )r›   rJ   r<   Úadd_toolitem±  s    



zToolbarQt.add_toolitemc       	      C   sR   | j  |g ¡}|s$|  ¡ }| |¡ || }|  ||¡}| ||¡ || j |< d S )N)rP  r2   rõ   r  ZinsertWidgetr!   )	rJ   rV  r›   r…   rW  ZgrÚsepZbeforerN  r;   r;   r<   rU  Æ  s    
zToolbarQt._add_to_groupc             C   s.   t  |¡}t|dƒr$| | jjj¡ t  |¡S )Nré   )r   rë   r/   ré   rÐ   rÅ   rs   rÍ   )rJ   r›   rí   r;   r;   r<   rî   Ð  s    

zToolbarQt._iconc             C   sL   || j krd S x8| j | D ]*\}}|j |¡ | |¡ |j |¡ qW d S )N)rO  rS  Z
disconnectr  r6   )rJ   r›   rS  r…   rR  r;   r;   r<   Útoggle_toolitemÖ  s    

zToolbarQt.toggle_toolitemc             C   s.   x | j | D ]\}}| d ¡ qW | j |= d S )N)rO  Z	setParent)rJ   r›   r…   rR  r;   r;   r<   Úremove_toolitemÞ  s    zToolbarQt.remove_toolitemN)r_   r?   r`   rI   r¸   rQ  rX  rU  rî   rZ  r[  r;   r;   r;   r<   rà   ¤  s   
rà   c               @   s   e Zd Zdd„ Zdd„ ZdS )rÓ   c             O   s0   t j| f|ž|Ž tj | ¡ | ¡  | ¡ d S )N)r   rI   r   rÔ   rÕ   rÖ   )rJ   rÆ   rK   rL   r;   r;   r<   rI   å  s    zStatusbarQt.__init__c             C   s   |   |¡ d S )N)rØ   )rJ   r  r;   r;   r<   r  ê  s    zStatusbarQt.set_messageN)r_   r?   r`   rI   r  r;   r;   r;   r<   rÓ   ä  s   rÓ   c               @   s   e Zd Zdd„ ZdS )ÚConfigureSubplotsQtc             G   sH   t j tjd dd¡}| jjj}t| j	|ƒ}| 
t |¡¡ | ¡  d S )NrÃ   rÄ   zmatplotlib.png)r0   rÉ   r§   rÊ   rË   rÅ   ÚmanagerrÆ   r  rc   rÌ   r   rÍ   r¬   )rJ   rK   rÜ   rá   r  r;   r;   r<   Útriggerï  s    
zConfigureSubplotsQt.triggerN)r_   r?   r`   r^  r;   r;   r;   r<   r\  î  s   r\  c               @   s   e Zd Zdd„ ZdS )ÚSaveFigureQtc          
   G   s:  | j  ¡ }t| ¡ ƒ}| j  ¡ }tj tj	d ¡}tj 
|| j  ¡ ¡}g }d }xF|D ]>\}	}
d 
dd„ |
D ƒ¡}d|	|f }||
krˆ|}| |¡ qTW d 
|¡}| j jj}t|d|||ƒ\}}|r6|dkrÞtj |¡tj	d< y| j j |¡ W nD tk
r4 } z$tj | d	t|ƒtjjtjj¡ W d d }~X Y nX d S )
Nzsavefig.directoryr   c             S   s   g | ]}d | ‘qS )z*.%sr;   )rA   r!  r;   r;   r<   rž     s    z(SaveFigureQt.trigger.<locals>.<listcomp>z%s (%s)z;;zChoose a filename to save torò   zError saving file)rÅ   r"  r#  r$  r%  r0   rÉ   r&  rÊ   rË   r§   r'  r  r]  rÆ   r   r(  rc   r)  r³   r   r  r*  r+  r,  r-  )rJ   rK   r.  r/  r0  r1  r[   r2  r3  r›   r4  r5  r  rá   r6  r7  r;   r;   r<   r^  ù  s8    




zSaveFigureQt.triggerN)r_   r?   r`   r^  r;   r;   r;   r<   r_  ø  s   r_  c               @   s   e Zd Zdd„ ZdS )ÚSetCursorQtc             C   s   | j  t| ¡ d S )N)rÅ   r  r  )rJ   r  r;   r;   r<   r    s    zSetCursorQt.set_cursorN)r_   r?   r`   r  r;   r;   r;   r<   r`    s   r`  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚRubberbandQtc             C   sJ   | j jjj}|| }|| }dd„ |||| || fD ƒ}| j  |¡ d S )Nc             S   s   g | ]}t |ƒ‘qS r;   )rx   )rA   r•   r;   r;   r<   rž   &  s    z0RubberbandQt.draw_rubberband.<locals>.<listcomp>)rÅ   rc   r‚   rƒ   r·   )rJ   r  r  r  r  rƒ   r¶   r;   r;   r<   r  "  s
    zRubberbandQt.draw_rubberbandc             C   s   | j  d ¡ d S )N)rÅ   r·   )rJ   r;   r;   r<   r  )  s    zRubberbandQt.remove_rubberbandN)r_   r?   r`   r  r  r;   r;   r;   r<   ra  !  s   ra  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_html)rJ   rK   r;   r;   r<   r^  .  s    zHelpQt.triggerN)r_   r?   r`   r^  r;   r;   r;   r<   rb  -  s   rb  c               @   s   e Zd Zdd„ ZdS )ÚToolCopyToClipboardQTc             O   s   | j  ¡ }t ¡  |¡ d S )N)rÅ   Zgrabr*   Z	clipboardZ	setPixmap)rJ   rK   rL   Zpixmapr;   r;   r<   r^  3  s    
zToolCopyToClipboardQT.triggerN)r_   r?   r`   r^  r;   r;   r;   r<   rc  2  s   rc  z3.0c             C   s4   t | tƒsd tt| ƒ¡} tj d d| tjj¡ d S )Nú,Z
Matplotlib)	Ú
isinstancer+  r§   Úmapr   r  r  r   r,  )Úmsgrá   r;   r;   r<   Úerror_msg_qt@  s    

rh  c             C   sb   d}t |dƒr"|jdk	r"|jd }t |dƒrB|jdk	rB||j7 }n|t|ƒ7 }t|ƒr^t|ƒ dS )z@Handle uncaught exceptions
    It does not catch SystemExit
    rò   ÚfilenameNz: Ústrerror)r/   ri  rj  r+  r  rh  )rD   rK  Útbrg  r;   r;   r<   Úexception_handlerI  s    
rl  c               @   s0   e Zd ZdZeZeZedd„ ƒZ	edd„ ƒZ
dS )Ú_BackendQT5Zqt5c             C   s   | j  ¡  d S )N)rÅ   r²   )r]  r;   r;   r<   Útrigger_manager_drawa  s    z _BackendQT5.trigger_manager_drawc               C   s   t   t jt j¡ t ¡  d S )N)ÚsignalÚSIGINTÚSIG_DFLr*   r¬   r;   r;   r;   r<   Úmainloope  s    z_BackendQT5.mainloopN)r_   r?   r`   Zrequired_interactive_frameworkrb   ZFigureCanvasrÂ   ZFigureManagerÚstaticmethodrn  rr  r;   r;   r;   r<   rm  [  s
   rm  )N)‡rR   r0   r3   ro  Úsysr´   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  Z-matplotlib.backends.qt_editor.formsubplottoolr   Zmatplotlib.figurer   Zmatplotlib.backend_managersr   Z	qt_compatr   r   r   r   r   r   r   Zbackend_versionr9   ZKey_ControlZ	Key_ShiftZKey_AltZKey_MetaZ
Key_ReturnZKey_LeftZKey_UpZ	Key_RightZKey_DownZ
Key_EscapeZKey_F1ZKey_F2ZKey_F3ZKey_F4ZKey_F5ZKey_F6ZKey_F7ZKey_F8ZKey_F9ZKey_F10ZKey_F11ZKey_F12ZKey_HomeZKey_EndZ
Key_PageUpZKey_PageDownZKey_TabZKey_BackspaceZ	Key_EnterZ
Key_InsertZ
Key_DeleteZ	Key_PauseZ
Key_SysReqZ	Key_Clearr¡   ZSUPERZALTZCTRLZSHIFTZMetaModifierZAltModifierZControlModifierZShiftModifierr    Úplatformr°   ZMOVEZSizeAllCursorZHANDZPointingHandCursorZPOINTERZArrowCursorZSELECT_REGIONZCrossCursorZWAITZ
WaitCursorr  r*   r=   rT   rU   rH   rb   r¿   r¼   rÂ   rè   rß   r  rà   rÔ   rÓ   ZConfigureSubplotsBaser\  ZSaveFigureBaser_  ZSetCursorBaser`  ZRubberbandBasera  ZToolHelpBaserb  ZToolCopyToClipboardBaserc  ZToolSaveFigureZToolConfigureSubplotsZToolSetCursorZToolRubberbandZToolHelpZToolCopyToClipboardr¹   rh  rl  Zexportrm  r;   r;   r;   r<   Ú<module>   sÊ   ($



$'(  J  .D@

$